/ Hex Artifact Content
Login

Artifact 423d8f815067f4980cb84abab501374afc9bd039:


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 2f 2a 0a 2a 2a 20 49 6e 63 6c 75   */../*.** Inclu
0220: 64 65 20 63 6f 64 65 20 74 68 61 74 20 69 73 20  de code that is 
0230: 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6f 73  common to all os
0240: 5f 2a 2e 63 20 66 69 6c 65 73 0a 2a 2f 0a 23 69  _*.c files.*/.#i
0250: 6e 63 6c 75 64 65 20 22 6f 73 5f 63 6f 6d 6d 6f  nclude "os_commo
0260: 6e 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 6c  n.h"../*.** Incl
0270: 75 64 65 20 74 68 65 20 68 65 61 64 65 72 20 66  ude the header f
0280: 69 6c 65 20 66 6f 72 20 74 68 65 20 57 69 6e 64  ile for the Wind
0290: 6f 77 73 20 56 46 53 2e 0a 2a 2f 0a 23 69 6e 63  ows VFS..*/.#inc
02a0: 6c 75 64 65 20 22 6f 73 5f 77 69 6e 2e 68 22 0a  lude "os_win.h".
02b0: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 69 6e 67  ./*.** Compiling
02c0: 20 61 6e 64 20 75 73 69 6e 67 20 57 41 4c 20 6d   and using WAL m
02d0: 6f 64 65 20 72 65 71 75 69 72 65 73 20 73 65 76  ode requires sev
02e0: 65 72 61 6c 20 41 50 49 73 20 74 68 61 74 20 61  eral APIs that a
02f0: 72 65 20 6f 6e 6c 79 0a 2a 2a 20 61 76 61 69 6c  re only.** avail
0300: 61 62 6c 65 20 69 6e 20 57 69 6e 64 6f 77 73 20  able in Windows 
0310: 70 6c 61 74 66 6f 72 6d 73 20 62 61 73 65 64 20  platforms based 
0320: 6f 6e 20 74 68 65 20 4e 54 20 6b 65 72 6e 65 6c  on the NT kernel
0330: 2e 0a 2a 2f 0a 23 69 66 20 21 53 51 4c 49 54 45  ..*/.#if !SQLITE
0340: 5f 4f 53 5f 57 49 4e 4e 54 20 26 26 20 21 64 65  _OS_WINNT && !de
0350: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
0360: 54 5f 57 41 4c 29 0a 23 20 20 65 72 72 6f 72 20  T_WAL).#  error 
0370: 22 57 41 4c 20 6d 6f 64 65 20 72 65 71 75 69 72  "WAL mode requir
0380: 65 73 20 73 75 70 70 6f 72 74 20 66 72 6f 6d 20  es support from 
0390: 74 68 65 20 57 69 6e 64 6f 77 73 20 4e 54 20 6b  the Windows NT k
03a0: 65 72 6e 65 6c 2c 20 63 6f 6d 70 69 6c 65 5c 0a  ernel, compile\.
03b0: 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4f 4d 49   with SQLITE_OMI
03c0: 54 5f 57 41 4c 2e 22 0a 23 65 6e 64 69 66 0a 0a  T_WAL.".#endif..
03d0: 2f 2a 0a 2a 2a 20 41 72 65 20 6d 6f 73 74 20 6f  /*.** Are most o
03e0: 66 20 74 68 65 20 57 69 6e 33 32 20 41 4e 53 49  f the Win32 ANSI
03f0: 20 41 50 49 73 20 61 76 61 69 6c 61 62 6c 65 20   APIs available 
0400: 28 69 2e 65 2e 20 77 69 74 68 20 63 65 72 74 61  (i.e. with certa
0410: 69 6e 20 65 78 63 65 70 74 69 6f 6e 73 0a 2a 2a  in exceptions.**
0420: 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 73 75   based on the su
0430: 62 2d 70 6c 61 74 66 6f 72 6d 29 3f 0a 2a 2f 0a  b-platform)?.*/.
0440: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
0450: 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f  INCE && !SQLITE_
0460: 4f 53 5f 57 49 4e 52 54 20 26 26 20 21 64 65 66  OS_WINRT && !def
0470: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
0480: 32 5f 4e 4f 5f 41 4e 53 49 29 0a 23 20 20 64 65  2_NO_ANSI).#  de
0490: 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33  fine SQLITE_WIN3
04a0: 32 5f 48 41 53 5f 41 4e 53 49 0a 23 65 6e 64 69  2_HAS_ANSI.#endi
04b0: 66 0a 0a 2f 2a 0a 2a 2a 20 41 72 65 20 6d 6f 73  f../*.** Are mos
04c0: 74 20 6f 66 20 74 68 65 20 57 69 6e 33 32 20 55  t of the Win32 U
04d0: 6e 69 63 6f 64 65 20 41 50 49 73 20 61 76 61 69  nicode APIs avai
04e0: 6c 61 62 6c 65 20 28 69 2e 65 2e 20 77 69 74 68  lable (i.e. with
04f0: 20 63 65 72 74 61 69 6e 20 65 78 63 65 70 74 69   certain excepti
0500: 6f 6e 73 0a 2a 2a 20 62 61 73 65 64 20 6f 6e 20  ons.** based on 
0510: 74 68 65 20 73 75 62 2d 70 6c 61 74 66 6f 72 6d  the sub-platform
0520: 29 3f 0a 2a 2f 0a 23 69 66 20 28 53 51 4c 49 54  )?.*/.#if (SQLIT
0530: 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 53 51  E_OS_WINCE || SQ
0540: 4c 49 54 45 5f 4f 53 5f 57 49 4e 4e 54 20 7c 7c  LITE_OS_WINNT ||
0550: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
0560: 29 20 26 26 20 5c 0a 20 20 20 20 21 64 65 66 69  ) && \.    !defi
0570: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
0580: 5f 4e 4f 5f 57 49 44 45 29 0a 23 20 20 64 65 66  _NO_WIDE).#  def
0590: 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ine SQLITE_WIN32
05a0: 5f 48 41 53 5f 57 49 44 45 0a 23 65 6e 64 69 66  _HAS_WIDE.#endif
05b0: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
05c0: 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 73  e at least one s
05d0: 65 74 20 6f 66 20 57 69 6e 33 32 20 41 50 49 73  et of Win32 APIs
05e0: 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a   is available..*
05f0: 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  /.#if !defined(S
0600: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
0610: 41 4e 53 49 29 20 26 26 20 21 64 65 66 69 6e 65  ANSI) && !define
0620: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
0630: 41 53 5f 57 49 44 45 29 0a 23 20 20 65 72 72 6f  AS_WIDE).#  erro
0640: 72 20 22 41 74 20 6c 65 61 73 74 20 6f 6e 65 20  r "At least one 
0650: 6f 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  of SQLITE_WIN32_
0660: 48 41 53 5f 41 4e 53 49 20 61 6e 64 20 53 51 4c  HAS_ANSI and SQL
0670: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
0680: 44 45 5c 0a 20 6d 75 73 74 20 62 65 20 64 65 66  DE\. must be def
0690: 69 6e 65 64 2e 22 0a 23 65 6e 64 69 66 0a 0a 2f  ined.".#endif../
06a0: 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 6e 73 74 61  *.** This consta
06b0: 6e 74 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64  nt should alread
06c0: 79 20 62 65 20 64 65 66 69 6e 65 64 20 28 69 6e  y be defined (in
06d0: 20 74 68 65 20 22 57 69 6e 44 65 66 2e 68 22 20   the "WinDef.h" 
06e0: 53 44 4b 20 66 69 6c 65 29 2e 0a 2a 2f 0a 23 69  SDK file)..*/.#i
06f0: 66 6e 64 65 66 20 4d 41 58 5f 50 41 54 48 0a 23  fndef MAX_PATH.#
0700: 20 20 64 65 66 69 6e 65 20 4d 41 58 5f 50 41 54    define MAX_PAT
0710: 48 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  H               
0720: 20 20 20 20 20 20 20 28 32 36 30 29 0a 23 65 6e         (260).#en
0730: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d  dif../*.** Maxim
0740: 75 6d 20 70 61 74 68 6e 61 6d 65 20 6c 65 6e 67  um pathname leng
0750: 74 68 20 28 69 6e 20 63 68 61 72 73 29 20 66 6f  th (in chars) fo
0760: 72 20 57 69 6e 33 32 2e 20 20 54 68 69 73 20 73  r Win32.  This s
0770: 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20 62  hould normally b
0780: 65 0a 2a 2a 20 4d 41 58 5f 50 41 54 48 2e 0a 2a  e.** MAX_PATH..*
0790: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
07a0: 5f 57 49 4e 33 32 5f 4d 41 58 5f 50 41 54 48 5f  _WIN32_MAX_PATH_
07b0: 43 48 41 52 53 0a 23 20 20 64 65 66 69 6e 65 20  CHARS.#  define 
07c0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 58  SQLITE_WIN32_MAX
07d0: 5f 50 41 54 48 5f 43 48 41 52 53 20 20 20 28 4d  _PATH_CHARS   (M
07e0: 41 58 5f 50 41 54 48 29 0a 23 65 6e 64 69 66 0a  AX_PATH).#endif.
07f0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 6e 73  ./*.** This cons
0800: 74 61 6e 74 20 73 68 6f 75 6c 64 20 61 6c 72 65  tant should alre
0810: 61 64 79 20 62 65 20 64 65 66 69 6e 65 64 20 28  ady be defined (
0820: 69 6e 20 74 68 65 20 22 57 69 6e 4e 54 2e 68 22  in the "WinNT.h"
0830: 20 53 44 4b 20 66 69 6c 65 29 2e 0a 2a 2f 0a 23   SDK file)..*/.#
0840: 69 66 6e 64 65 66 20 55 4e 49 43 4f 44 45 5f 53  ifndef UNICODE_S
0850: 54 52 49 4e 47 5f 4d 41 58 5f 43 48 41 52 53 0a  TRING_MAX_CHARS.
0860: 23 20 20 64 65 66 69 6e 65 20 55 4e 49 43 4f 44  #  define UNICOD
0870: 45 5f 53 54 52 49 4e 47 5f 4d 41 58 5f 43 48 41  E_STRING_MAX_CHA
0880: 52 53 20 20 20 20 20 20 28 33 32 37 36 37 29 0a  RS      (32767).
0890: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61  #endif../*.** Ma
08a0: 78 69 6d 75 6d 20 70 61 74 68 6e 61 6d 65 20 6c  ximum pathname l
08b0: 65 6e 67 74 68 20 28 69 6e 20 63 68 61 72 73 29  ength (in chars)
08c0: 20 66 6f 72 20 57 69 6e 4e 54 2e 20 20 54 68 69   for WinNT.  Thi
08d0: 73 20 73 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c  s should normall
08e0: 79 20 62 65 0a 2a 2a 20 55 4e 49 43 4f 44 45 5f  y be.** UNICODE_
08f0: 53 54 52 49 4e 47 5f 4d 41 58 5f 43 48 41 52 53  STRING_MAX_CHARS
0900: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
0910: 49 54 45 5f 57 49 4e 4e 54 5f 4d 41 58 5f 50 41  ITE_WINNT_MAX_PA
0920: 54 48 5f 43 48 41 52 53 0a 23 20 20 64 65 66 69  TH_CHARS.#  defi
0930: 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 4e 54 5f  ne SQLITE_WINNT_
0940: 4d 41 58 5f 50 41 54 48 5f 43 48 41 52 53 20 20  MAX_PATH_CHARS  
0950: 20 28 55 4e 49 43 4f 44 45 5f 53 54 52 49 4e 47   (UNICODE_STRING
0960: 5f 4d 41 58 5f 43 48 41 52 53 29 0a 23 65 6e 64  _MAX_CHARS).#end
0970: 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75  if../*.** Maximu
0980: 6d 20 70 61 74 68 6e 61 6d 65 20 6c 65 6e 67 74  m pathname lengt
0990: 68 20 28 69 6e 20 62 79 74 65 73 29 20 66 6f 72  h (in bytes) for
09a0: 20 57 69 6e 33 32 2e 20 20 54 68 65 20 4d 41 58   Win32.  The MAX
09b0: 5f 50 41 54 48 20 6d 61 63 72 6f 20 69 73 20 69  _PATH macro is i
09c0: 6e 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 73 2c  n.** characters,
09d0: 20 73 6f 20 77 65 20 61 6c 6c 6f 63 61 74 65 20   so we allocate 
09e0: 34 20 62 79 74 65 73 20 70 65 72 20 63 68 61 72  4 bytes per char
09f0: 61 63 74 65 72 20 61 73 73 75 6d 69 6e 67 20 77  acter assuming w
0a00: 6f 72 73 74 2d 63 61 73 65 20 6f 66 0a 2a 2a 20  orst-case of.** 
0a10: 34 2d 62 79 74 65 73 2d 70 65 72 2d 63 68 61 72  4-bytes-per-char
0a20: 61 63 74 65 72 20 66 6f 72 20 55 54 46 38 2e 0a  acter for UTF8..
0a30: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
0a40: 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 50 41 54 48  E_WIN32_MAX_PATH
0a50: 5f 42 59 54 45 53 0a 23 20 20 64 65 66 69 6e 65  _BYTES.#  define
0a60: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41   SQLITE_WIN32_MA
0a70: 58 5f 50 41 54 48 5f 42 59 54 45 53 20 20 20 28  X_PATH_BYTES   (
0a80: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 58  SQLITE_WIN32_MAX
0a90: 5f 50 41 54 48 5f 43 48 41 52 53 2a 34 29 0a 23  _PATH_CHARS*4).#
0aa0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78  endif../*.** Max
0ab0: 69 6d 75 6d 20 70 61 74 68 6e 61 6d 65 20 6c 65  imum pathname le
0ac0: 6e 67 74 68 20 28 69 6e 20 62 79 74 65 73 29 20  ngth (in bytes) 
0ad0: 66 6f 72 20 57 69 6e 4e 54 2e 20 20 54 68 69 73  for WinNT.  This
0ae0: 20 73 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79   should normally
0af0: 20 62 65 0a 2a 2a 20 55 4e 49 43 4f 44 45 5f 53   be.** UNICODE_S
0b00: 54 52 49 4e 47 5f 4d 41 58 5f 43 48 41 52 53 20  TRING_MAX_CHARS 
0b10: 2a 20 73 69 7a 65 6f 66 28 57 43 48 41 52 29 2e  * sizeof(WCHAR).
0b20: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
0b30: 54 45 5f 57 49 4e 4e 54 5f 4d 41 58 5f 50 41 54  TE_WINNT_MAX_PAT
0b40: 48 5f 42 59 54 45 53 0a 23 20 20 64 65 66 69 6e  H_BYTES.#  defin
0b50: 65 20 53 51 4c 49 54 45 5f 57 49 4e 4e 54 5f 4d  e SQLITE_WINNT_M
0b60: 41 58 5f 50 41 54 48 5f 42 59 54 45 53 20 20 20  AX_PATH_BYTES   
0b70: 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  \.              
0b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73                (s
0b90: 69 7a 65 6f 66 28 57 43 48 41 52 29 20 2a 20 53  izeof(WCHAR) * S
0ba0: 51 4c 49 54 45 5f 57 49 4e 4e 54 5f 4d 41 58 5f  QLITE_WINNT_MAX_
0bb0: 50 41 54 48 5f 43 48 41 52 53 29 0a 23 65 6e 64  PATH_CHARS).#end
0bc0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75  if../*.** Maximu
0bd0: 6d 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  m error message 
0be0: 6c 65 6e 67 74 68 20 28 69 6e 20 63 68 61 72 73  length (in chars
0bf0: 29 20 66 6f 72 20 57 69 6e 52 54 2e 0a 2a 2f 0a  ) for WinRT..*/.
0c00: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57  #ifndef SQLITE_W
0c10: 49 4e 33 32 5f 4d 41 58 5f 45 52 52 4d 53 47 5f  IN32_MAX_ERRMSG_
0c20: 43 48 41 52 53 0a 23 20 20 64 65 66 69 6e 65 20  CHARS.#  define 
0c30: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 58  SQLITE_WIN32_MAX
0c40: 5f 45 52 52 4d 53 47 5f 43 48 41 52 53 20 28 31  _ERRMSG_CHARS (1
0c50: 30 32 34 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  024).#endif../*.
0c60: 2a 2a 20 52 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a  ** Returns non-z
0c70: 65 72 6f 20 69 66 20 74 68 65 20 63 68 61 72 61  ero if the chara
0c80: 63 74 65 72 20 73 68 6f 75 6c 64 20 62 65 20 74  cter should be t
0c90: 72 65 61 74 65 64 20 61 73 20 61 20 64 69 72 65  reated as a dire
0ca0: 63 74 6f 72 79 0a 2a 2a 20 73 65 70 61 72 61 74  ctory.** separat
0cb0: 6f 72 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 77  or..*/.#ifndef w
0cc0: 69 6e 49 73 44 69 72 53 65 70 0a 23 20 20 64 65  inIsDirSep.#  de
0cd0: 66 69 6e 65 20 77 69 6e 49 73 44 69 72 53 65 70  fine winIsDirSep
0ce0: 28 61 29 20 20 20 20 20 20 20 20 20 20 20 20 20  (a)             
0cf0: 20 20 20 28 28 28 61 29 20 3d 3d 20 27 2f 27 29     (((a) == '/')
0d00: 20 7c 7c 20 28 28 61 29 20 3d 3d 20 27 5c 5c 27   || ((a) == '\\'
0d10: 29 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  )).#endif../*.**
0d20: 20 54 68 69 73 20 6d 61 63 72 6f 20 69 73 20 75   This macro is u
0d30: 73 65 64 20 77 68 65 6e 20 61 20 6c 6f 63 61 6c  sed when a local
0d40: 20 76 61 72 69 61 62 6c 65 20 69 73 20 73 65 74   variable is set
0d50: 20 74 6f 20 61 20 76 61 6c 75 65 20 74 68 61 74   to a value that
0d60: 20 69 73 0a 2a 2a 20 5b 73 6f 6d 65 74 69 6d 65   is.** [sometime
0d70: 73 5d 20 6e 6f 74 20 75 73 65 64 20 62 79 20 74  s] not used by t
0d80: 68 65 20 63 6f 64 65 20 28 65 2e 67 2e 20 76 69  he code (e.g. vi
0d90: 61 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 63 6f  a conditional co
0da0: 6d 70 69 6c 61 74 69 6f 6e 29 2e 0a 2a 2f 0a 23  mpilation)..*/.#
0db0: 69 66 6e 64 65 66 20 55 4e 55 53 45 44 5f 56 41  ifndef UNUSED_VA
0dc0: 52 49 41 42 4c 45 5f 56 41 4c 55 45 0a 23 20 20  RIABLE_VALUE.#  
0dd0: 64 65 66 69 6e 65 20 55 4e 55 53 45 44 5f 56 41  define UNUSED_VA
0de0: 52 49 41 42 4c 45 5f 56 41 4c 55 45 28 78 29 20  RIABLE_VALUE(x) 
0df0: 28 76 6f 69 64 29 28 78 29 0a 23 65 6e 64 69 66  (void)(x).#endif
0e00: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20  ../*.** Returns 
0e10: 74 68 65 20 63 68 61 72 61 63 74 65 72 20 74 68  the character th
0e20: 61 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65  at should be use
0e30: 64 20 61 73 20 74 68 65 20 64 69 72 65 63 74 6f  d as the directo
0e40: 72 79 20 73 65 70 61 72 61 74 6f 72 2e 0a 2a 2f  ry separator..*/
0e50: 0a 23 69 66 6e 64 65 66 20 77 69 6e 47 65 74 44  .#ifndef winGetD
0e60: 69 72 53 65 70 0a 23 20 20 64 65 66 69 6e 65 20  irSep.#  define 
0e70: 77 69 6e 47 65 74 44 69 72 53 65 70 28 29 20 20  winGetDirSep()  
0e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 27 5c                '\
0e90: 5c 27 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  \'.#endif../*.**
0ea0: 20 44 6f 20 77 65 20 6e 65 65 64 20 74 6f 20 6d   Do we need to m
0eb0: 61 6e 75 61 6c 6c 79 20 64 65 66 69 6e 65 20 74  anually define t
0ec0: 68 65 20 57 69 6e 33 32 20 66 69 6c 65 20 6d 61  he Win32 file ma
0ed0: 70 70 69 6e 67 20 41 50 49 73 20 66 6f 72 20 75  pping APIs for u
0ee0: 73 65 20 77 69 74 68 20 57 41 4c 0a 2a 2a 20 6d  se with WAL.** m
0ef0: 6f 64 65 20 28 65 2e 67 2e 20 74 68 65 73 65 20  ode (e.g. these 
0f00: 41 50 49 73 20 61 72 65 20 61 76 61 69 6c 61 62  APIs are availab
0f10: 6c 65 20 69 6e 20 74 68 65 20 57 69 6e 64 6f 77  le in the Window
0f20: 73 20 43 45 20 53 44 4b 3b 20 68 6f 77 65 76 65  s CE SDK; howeve
0f30: 72 2c 20 74 68 65 79 0a 2a 2a 20 61 72 65 20 6e  r, they.** are n
0f40: 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68  ot present in th
0f50: 65 20 68 65 61 64 65 72 20 66 69 6c 65 29 3f 0a  e header file)?.
0f60: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 57 49  */.#if SQLITE_WI
0f70: 4e 33 32 5f 46 49 4c 45 4d 41 50 50 49 4e 47 5f  N32_FILEMAPPING_
0f80: 41 50 49 20 26 26 20 21 64 65 66 69 6e 65 64 28  API && !defined(
0f90: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29  SQLITE_OMIT_WAL)
0fa0: 0a 2f 2a 0a 2a 2a 20 54 77 6f 20 6f 66 20 74 68  ./*.** Two of th
0fb0: 65 20 66 69 6c 65 20 6d 61 70 70 69 6e 67 20 41  e file mapping A
0fc0: 50 49 73 20 61 72 65 20 64 69 66 66 65 72 65 6e  PIs are differen
0fd0: 74 20 75 6e 64 65 72 20 57 69 6e 52 54 2e 20 20  t under WinRT.  
0fe0: 46 69 67 75 72 65 20 6f 75 74 20 77 68 69 63 68  Figure out which
0ff0: 0a 2a 2a 20 73 65 74 20 77 65 20 6e 65 65 64 2e  .** set we need.
1000: 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  .*/.#if SQLITE_O
1010: 53 5f 57 49 4e 52 54 0a 57 49 4e 42 41 53 45 41  S_WINRT.WINBASEA
1020: 50 49 20 48 41 4e 44 4c 45 20 57 49 4e 41 50 49  PI HANDLE WINAPI
1030: 20 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69   CreateFileMappi
1040: 6e 67 46 72 6f 6d 41 70 70 28 48 41 4e 44 4c 45  ngFromApp(HANDLE
1050: 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 53 45  , \.        LPSE
1060: 43 55 52 49 54 59 5f 41 54 54 52 49 42 55 54 45  CURITY_ATTRIBUTE
1070: 53 2c 20 55 4c 4f 4e 47 2c 20 55 4c 4f 4e 47 36  S, ULONG, ULONG6
1080: 34 2c 20 4c 50 43 57 53 54 52 29 3b 0a 0a 57 49  4, LPCWSTR);..WI
1090: 4e 42 41 53 45 41 50 49 20 4c 50 56 4f 49 44 20  NBASEAPI LPVOID 
10a0: 57 49 4e 41 50 49 20 4d 61 70 56 69 65 77 4f 66  WINAPI MapViewOf
10b0: 46 69 6c 65 46 72 6f 6d 41 70 70 28 48 41 4e 44  FileFromApp(HAND
10c0: 4c 45 2c 20 55 4c 4f 4e 47 2c 20 55 4c 4f 4e 47  LE, ULONG, ULONG
10d0: 36 34 2c 20 53 49 5a 45 5f 54 29 3b 0a 23 65 6c  64, SIZE_T);.#el
10e0: 73 65 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  se.#if defined(S
10f0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
1100: 41 4e 53 49 29 0a 57 49 4e 42 41 53 45 41 50 49  ANSI).WINBASEAPI
1110: 20 48 41 4e 44 4c 45 20 57 49 4e 41 50 49 20 43   HANDLE WINAPI C
1120: 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67  reateFileMapping
1130: 41 28 48 41 4e 44 4c 45 2c 20 4c 50 53 45 43 55  A(HANDLE, LPSECU
1140: 52 49 54 59 5f 41 54 54 52 49 42 55 54 45 53 2c  RITY_ATTRIBUTES,
1150: 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44   \.        DWORD
1160: 2c 20 44 57 4f 52 44 2c 20 44 57 4f 52 44 2c 20  , DWORD, DWORD, 
1170: 4c 50 43 53 54 52 29 3b 0a 23 65 6e 64 69 66 20  LPCSTR);.#endif 
1180: 2f 2a 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  /* defined(SQLIT
1190: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
11a0: 29 20 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65  ) */..#if define
11b0: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
11c0: 41 53 5f 57 49 44 45 29 0a 57 49 4e 42 41 53 45  AS_WIDE).WINBASE
11d0: 41 50 49 20 48 41 4e 44 4c 45 20 57 49 4e 41 50  API HANDLE WINAP
11e0: 49 20 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70  I CreateFileMapp
11f0: 69 6e 67 57 28 48 41 4e 44 4c 45 2c 20 4c 50 53  ingW(HANDLE, LPS
1200: 45 43 55 52 49 54 59 5f 41 54 54 52 49 42 55 54  ECURITY_ATTRIBUT
1210: 45 53 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57  ES, \.        DW
1220: 4f 52 44 2c 20 44 57 4f 52 44 2c 20 44 57 4f 52  ORD, DWORD, DWOR
1230: 44 2c 20 4c 50 43 57 53 54 52 29 3b 0a 23 65 6e  D, LPCWSTR);.#en
1240: 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53  dif /* defined(S
1250: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
1260: 57 49 44 45 29 20 2a 2f 0a 0a 57 49 4e 42 41 53  WIDE) */..WINBAS
1270: 45 41 50 49 20 4c 50 56 4f 49 44 20 57 49 4e 41  EAPI LPVOID WINA
1280: 50 49 20 4d 61 70 56 69 65 77 4f 66 46 69 6c 65  PI MapViewOfFile
1290: 28 48 41 4e 44 4c 45 2c 20 44 57 4f 52 44 2c 20  (HANDLE, DWORD, 
12a0: 44 57 4f 52 44 2c 20 44 57 4f 52 44 2c 20 53 49  DWORD, DWORD, SI
12b0: 5a 45 5f 54 29 3b 0a 23 65 6e 64 69 66 20 2f 2a  ZE_T);.#endif /*
12c0: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
12d0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20   */../*.** This 
12e0: 66 69 6c 65 20 6d 61 70 70 69 6e 67 20 41 50 49  file mapping API
12f0: 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20 62 6f   is common to bo
1300: 74 68 20 57 69 6e 33 32 20 61 6e 64 20 57 69 6e  th Win32 and Win
1310: 52 54 2e 0a 2a 2f 0a 57 49 4e 42 41 53 45 41 50  RT..*/.WINBASEAP
1320: 49 20 42 4f 4f 4c 20 57 49 4e 41 50 49 20 55 6e  I BOOL WINAPI Un
1330: 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 28 4c 50  mapViewOfFile(LP
1340: 43 56 4f 49 44 29 3b 0a 23 65 6e 64 69 66 20 2f  CVOID);.#endif /
1350: 2a 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 46  * SQLITE_WIN32_F
1360: 49 4c 45 4d 41 50 50 49 4e 47 5f 41 50 49 20 26  ILEMAPPING_API &
1370: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
1380: 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 2a 2f 0a 0a  E_OMIT_WAL) */..
1390: 2f 2a 0a 2a 2a 20 53 6f 6d 65 20 4d 69 63 72 6f  /*.** Some Micro
13a0: 73 6f 66 74 20 63 6f 6d 70 69 6c 65 72 73 20 6c  soft compilers l
13b0: 61 63 6b 20 74 68 69 73 20 64 65 66 69 6e 69 74  ack this definit
13c0: 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ion..*/.#ifndef 
13d0: 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54  INVALID_FILE_ATT
13e0: 52 49 42 55 54 45 53 0a 23 20 64 65 66 69 6e 65  RIBUTES.# define
13f0: 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54   INVALID_FILE_AT
1400: 54 52 49 42 55 54 45 53 20 28 28 44 57 4f 52 44  TRIBUTES ((DWORD
1410: 29 2d 31 29 20 0a 23 65 6e 64 69 66 0a 0a 23 69  )-1) .#endif..#i
1420: 66 6e 64 65 66 20 46 49 4c 45 5f 46 4c 41 47 5f  fndef FILE_FLAG_
1430: 4d 41 53 4b 0a 23 20 64 65 66 69 6e 65 20 46 49  MASK.# define FI
1440: 4c 45 5f 46 4c 41 47 5f 4d 41 53 4b 20 20 20 20  LE_FLAG_MASK    
1450: 20 20 20 20 20 20 28 30 78 46 46 33 43 30 30 30        (0xFF3C000
1460: 30 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  0).#endif..#ifnd
1470: 65 66 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54  ef FILE_ATTRIBUT
1480: 45 5f 4d 41 53 4b 0a 23 20 64 65 66 69 6e 65 20  E_MASK.# define 
1490: 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 4d  FILE_ATTRIBUTE_M
14a0: 41 53 4b 20 20 20 20 20 28 30 78 30 30 30 33 46  ASK     (0x0003F
14b0: 46 46 37 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66  FF7).#endif..#if
14c0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
14d0: 5f 57 41 4c 0a 2f 2a 20 46 6f 72 77 61 72 64 20  _WAL./* Forward 
14e0: 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 73 74  references to st
14f0: 72 75 63 74 75 72 65 73 20 75 73 65 64 20 66 6f  ructures used fo
1500: 72 20 57 41 4c 20 2a 2f 0a 74 79 70 65 64 65 66  r WAL */.typedef
1510: 20 73 74 72 75 63 74 20 77 69 6e 53 68 6d 20 77   struct winShm w
1520: 69 6e 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20  inShm;          
1530: 20 2f 2a 20 41 20 63 6f 6e 6e 65 63 74 69 6f 6e   /* A connection
1540: 20 74 6f 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72   to shared-memor
1550: 79 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  y */.typedef str
1560: 75 63 74 20 77 69 6e 53 68 6d 4e 6f 64 65 20 77  uct winShmNode w
1570: 69 6e 53 68 6d 4e 6f 64 65 3b 20 20 20 2f 2a 20  inShmNode;   /* 
1580: 41 20 72 65 67 69 6f 6e 20 6f 66 20 73 68 61 72  A region of shar
1590: 65 64 2d 6d 65 6d 6f 72 79 20 2a 2f 0a 23 65 6e  ed-memory */.#en
15a0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 69 6e 43 45  dif../*.** WinCE
15b0: 20 6c 61 63 6b 73 20 6e 61 74 69 76 65 20 73 75   lacks native su
15c0: 70 70 6f 72 74 20 66 6f 72 20 66 69 6c 65 20 6c  pport for file l
15d0: 6f 63 6b 69 6e 67 20 73 6f 20 77 65 20 68 61 76  ocking so we hav
15e0: 65 20 74 6f 20 66 61 6b 65 20 69 74 0a 2a 2a 20  e to fake it.** 
15f0: 77 69 74 68 20 73 6f 6d 65 20 63 6f 64 65 20 6f  with some code o
1600: 66 20 6f 75 72 20 6f 77 6e 2e 0a 2a 2f 0a 23 69  f our own..*/.#i
1610: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
1620: 45 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  E.typedef struct
1630: 20 77 69 6e 63 65 4c 6f 63 6b 20 7b 0a 20 20 69   winceLock {.  i
1640: 6e 74 20 6e 52 65 61 64 65 72 73 3b 20 20 20 20  nt nReaders;    
1650: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1660: 72 65 61 64 65 72 20 6c 6f 63 6b 73 20 6f 62 74  reader locks obt
1670: 61 69 6e 65 64 20 2a 2f 0a 20 20 42 4f 4f 4c 20  ained */.  BOOL 
1680: 62 50 65 6e 64 69 6e 67 3b 20 20 20 20 20 20 2f  bPending;      /
1690: 2a 20 49 6e 64 69 63 61 74 65 73 20 61 20 70 65  * Indicates a pe
16a0: 6e 64 69 6e 67 20 6c 6f 63 6b 20 68 61 73 20 62  nding lock has b
16b0: 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 2a 2f 0a  een obtained */.
16c0: 20 20 42 4f 4f 4c 20 62 52 65 73 65 72 76 65 64    BOOL bReserved
16d0: 3b 20 20 20 20 20 2f 2a 20 49 6e 64 69 63 61 74  ;     /* Indicat
16e0: 65 73 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f  es a reserved lo
16f0: 63 6b 20 68 61 73 20 62 65 65 6e 20 6f 62 74 61  ck has been obta
1700: 69 6e 65 64 20 2a 2f 0a 20 20 42 4f 4f 4c 20 62  ined */.  BOOL b
1710: 45 78 63 6c 75 73 69 76 65 3b 20 20 20 20 2f 2a  Exclusive;    /*
1720: 20 49 6e 64 69 63 61 74 65 73 20 61 6e 20 65 78   Indicates an ex
1730: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 68 61 73  clusive lock has
1740: 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 2a   been obtained *
1750: 2f 0a 7d 20 77 69 6e 63 65 4c 6f 63 6b 3b 0a 23  /.} winceLock;.#
1760: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
1770: 20 77 69 6e 46 69 6c 65 20 73 74 72 75 63 74 75   winFile structu
1780: 72 65 20 69 73 20 61 20 73 75 62 63 6c 61 73 73  re is a subclass
1790: 20 6f 66 20 73 71 6c 69 74 65 33 5f 66 69 6c 65   of sqlite3_file
17a0: 2a 20 73 70 65 63 69 66 69 63 20 74 6f 20 74 68  * specific to th
17b0: 65 20 77 69 6e 33 32 0a 2a 2a 20 70 6f 72 74 61  e win32.** porta
17c0: 62 69 6c 69 74 79 20 6c 61 79 65 72 2e 0a 2a 2f  bility layer..*/
17d0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
17e0: 77 69 6e 46 69 6c 65 20 77 69 6e 46 69 6c 65 3b  winFile winFile;
17f0: 0a 73 74 72 75 63 74 20 77 69 6e 46 69 6c 65 20  .struct winFile 
1800: 7b 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  {.  const sqlite
1810: 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 70 4d  3_io_methods *pM
1820: 65 74 68 6f 64 3b 20 2f 2a 2a 2a 20 4d 75 73 74  ethod; /*** Must
1830: 20 62 65 20 66 69 72 73 74 20 2a 2a 2a 2f 0a 20   be first ***/. 
1840: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
1850: 66 73 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20  fs;      /* The 
1860: 56 46 53 20 75 73 65 64 20 74 6f 20 6f 70 65 6e  VFS used to open
1870: 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20   this file */.  
1880: 48 41 4e 44 4c 45 20 68 3b 20 20 20 20 20 20 20  HANDLE h;       
1890: 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c          /* Handl
18a0: 65 20 66 6f 72 20 61 63 63 65 73 73 69 6e 67 20  e for accessing 
18b0: 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38  the file */.  u8
18c0: 20 6c 6f 63 6b 74 79 70 65 3b 20 20 20 20 20 20   locktype;      
18d0: 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66        /* Type of
18e0: 20 6c 6f 63 6b 20 63 75 72 72 65 6e 74 6c 79 20   lock currently 
18f0: 68 65 6c 64 20 6f 6e 20 74 68 69 73 20 66 69 6c  held on this fil
1900: 65 20 2a 2f 0a 20 20 73 68 6f 72 74 20 73 68 61  e */.  short sha
1910: 72 65 64 4c 6f 63 6b 42 79 74 65 3b 20 20 20 2f  redLockByte;   /
1920: 2a 20 52 61 6e 64 6f 6d 6c 79 20 63 68 6f 73 65  * Randomly chose
1930: 6e 20 62 79 74 65 20 75 73 65 64 20 61 73 20 61  n byte used as a
1940: 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 2a 2f 0a   shared lock */.
1950: 20 20 75 38 20 63 74 72 6c 46 6c 61 67 73 3b 20    u8 ctrlFlags; 
1960: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
1970: 67 73 2e 20 20 53 65 65 20 57 49 4e 46 49 4c 45  gs.  See WINFILE
1980: 5f 2a 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 44 57  _* below */.  DW
1990: 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 20 20  ORD lastErrno;  
19a0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 69 6e        /* The Win
19b0: 64 6f 77 73 20 65 72 72 6e 6f 20 66 72 6f 6d 20  dows errno from 
19c0: 74 68 65 20 6c 61 73 74 20 49 2f 4f 20 65 72 72  the last I/O err
19d0: 6f 72 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  or */.#ifndef SQ
19e0: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
19f0: 77 69 6e 53 68 6d 20 2a 70 53 68 6d 3b 20 20 20  winShm *pShm;   
1a00: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73 74 61          /* Insta
1a10: 6e 63 65 20 6f 66 20 73 68 61 72 65 64 20 6d 65  nce of shared me
1a20: 6d 6f 72 79 20 6f 6e 20 74 68 69 73 20 66 69 6c  mory on this fil
1a30: 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 63 6f  e */.#endif.  co
1a40: 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 3b  nst char *zPath;
1a50: 20 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20 70 61        /* Full pa
1a60: 74 68 6e 61 6d 65 20 6f 66 20 74 68 69 73 20 66  thname of this f
1a70: 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 43  ile */.  int szC
1a80: 68 75 6e 6b 3b 20 20 20 20 20 20 20 20 20 20 20  hunk;           
1a90: 20 2f 2a 20 43 68 75 6e 6b 20 73 69 7a 65 20 63   /* Chunk size c
1aa0: 6f 6e 66 69 67 75 72 65 64 20 62 79 20 46 43 4e  onfigured by FCN
1ab0: 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 20 2a 2f  TL_CHUNK_SIZE */
1ac0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
1ad0: 49 4e 43 45 0a 20 20 4c 50 57 53 54 52 20 7a 44  INCE.  LPWSTR zD
1ae0: 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 3b 20 20 2f  eleteOnClose;  /
1af0: 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74  * Name of file t
1b00: 6f 20 64 65 6c 65 74 65 20 77 68 65 6e 20 63 6c  o delete when cl
1b10: 6f 73 69 6e 67 20 2a 2f 0a 20 20 48 41 4e 44 4c  osing */.  HANDL
1b20: 45 20 68 4d 75 74 65 78 3b 20 20 20 20 20 20 20  E hMutex;       
1b30: 20 20 20 2f 2a 20 4d 75 74 65 78 20 75 73 65 64     /* Mutex used
1b40: 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 61 63 63 65   to control acce
1b50: 73 73 20 74 6f 20 73 68 61 72 65 64 20 6c 6f 63  ss to shared loc
1b60: 6b 20 2a 2f 20 20 0a 20 20 48 41 4e 44 4c 45 20  k */  .  HANDLE 
1b70: 68 53 68 61 72 65 64 3b 20 20 20 20 20 20 20 20  hShared;        
1b80: 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f 72   /* Shared memor
1b90: 79 20 73 65 67 6d 65 6e 74 20 75 73 65 64 20 66  y segment used f
1ba0: 6f 72 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20  or locking */.  
1bb0: 77 69 6e 63 65 4c 6f 63 6b 20 6c 6f 63 61 6c 3b  winceLock local;
1bc0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 6b 73          /* Locks
1bd0: 20 6f 62 74 61 69 6e 65 64 20 62 79 20 74 68 69   obtained by thi
1be0: 73 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 77 69  s instance of wi
1bf0: 6e 46 69 6c 65 20 2a 2f 0a 20 20 77 69 6e 63 65  nFile */.  wince
1c00: 4c 6f 63 6b 20 2a 73 68 61 72 65 64 3b 20 20 20  Lock *shared;   
1c10: 20 20 20 2f 2a 20 47 6c 6f 62 61 6c 20 73 68 61     /* Global sha
1c20: 72 65 64 20 6c 6f 63 6b 20 6d 65 6d 6f 72 79 20  red lock memory 
1c30: 66 6f 72 20 74 68 65 20 66 69 6c 65 20 20 2a 2f  for the file  */
1c40: 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
1c50: 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
1c60: 3e 30 0a 20 20 69 6e 74 20 6e 46 65 74 63 68 4f  >0.  int nFetchO
1c70: 75 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ut;             
1c80: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1c90: 6f 75 74 73 74 61 6e 64 69 6e 67 20 78 46 65 74  outstanding xFet
1ca0: 63 68 20 72 65 66 65 72 65 6e 63 65 73 20 2a 2f  ch references */
1cb0: 0a 20 20 48 41 4e 44 4c 45 20 68 4d 61 70 3b 20  .  HANDLE hMap; 
1cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd0: 20 2f 2a 20 48 61 6e 64 6c 65 20 66 6f 72 20 61   /* Handle for a
1ce0: 63 63 65 73 73 69 6e 67 20 6d 65 6d 6f 72 79 20  ccessing memory 
1cf0: 6d 61 70 70 69 6e 67 20 2a 2f 0a 20 20 76 6f 69  mapping */.  voi
1d00: 64 20 2a 70 4d 61 70 52 65 67 69 6f 6e 3b 20 20  d *pMapRegion;  
1d10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
1d20: 65 61 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64  ea memory mapped
1d30: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
1d40: 74 36 34 20 6d 6d 61 70 53 69 7a 65 3b 20 20 20  t64 mmapSize;   
1d50: 20 20 20 20 2f 2a 20 55 73 61 62 6c 65 20 73 69      /* Usable si
1d60: 7a 65 20 6f 66 20 6d 61 70 70 65 64 20 72 65 67  ze of mapped reg
1d70: 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ion */.  sqlite3
1d80: 5f 69 6e 74 36 34 20 6d 6d 61 70 53 69 7a 65 41  _int64 mmapSizeA
1d90: 63 74 75 61 6c 3b 20 2f 2a 20 41 63 74 75 61 6c  ctual; /* Actual
1da0: 20 73 69 7a 65 20 6f 66 20 6d 61 70 70 65 64 20   size of mapped 
1db0: 72 65 67 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69  region */.  sqli
1dc0: 74 65 33 5f 69 6e 74 36 34 20 6d 6d 61 70 53 69  te3_int64 mmapSi
1dd0: 7a 65 4d 61 78 3b 20 20 20 20 2f 2a 20 43 6f 6e  zeMax;    /* Con
1de0: 66 69 67 75 72 65 64 20 46 43 4e 54 4c 5f 4d 4d  figured FCNTL_MM
1df0: 41 50 5f 53 49 5a 45 20 76 61 6c 75 65 20 2a 2f  AP_SIZE value */
1e00: 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a  .#endif.};../*.*
1e10: 2a 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73  * Allowed values
1e20: 20 66 6f 72 20 77 69 6e 46 69 6c 65 2e 63 74 72   for winFile.ctr
1e30: 6c 46 6c 61 67 73 0a 2a 2f 0a 23 64 65 66 69 6e  lFlags.*/.#defin
1e40: 65 20 57 49 4e 46 49 4c 45 5f 52 44 4f 4e 4c 59  e WINFILE_RDONLY
1e50: 20 20 20 20 20 20 20 20 20 20 30 78 30 32 20 20            0x02  
1e60: 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 69   /* Connection i
1e70: 73 20 72 65 61 64 20 6f 6e 6c 79 20 2a 2f 0a 23  s read only */.#
1e80: 64 65 66 69 6e 65 20 57 49 4e 46 49 4c 45 5f 50  define WINFILE_P
1e90: 45 52 53 49 53 54 5f 57 41 4c 20 20 20 20 20 30  ERSIST_WAL     0
1ea0: 78 30 34 20 20 20 2f 2a 20 50 65 72 73 69 73 74  x04   /* Persist
1eb0: 65 6e 74 20 57 41 4c 20 6d 6f 64 65 20 2a 2f 0a  ent WAL mode */.
1ec0: 23 64 65 66 69 6e 65 20 57 49 4e 46 49 4c 45 5f  #define WINFILE_
1ed0: 50 53 4f 57 20 20 20 20 20 20 20 20 20 20 20 20  PSOW            
1ee0: 30 78 31 30 20 20 20 2f 2a 20 53 51 4c 49 54 45  0x10   /* SQLITE
1ef0: 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53 41 46 45  _IOCAP_POWERSAFE
1f00: 5f 4f 56 45 52 57 52 49 54 45 20 2a 2f 0a 0a 2f  _OVERWRITE */../
1f10: 2a 0a 20 2a 20 54 68 65 20 73 69 7a 65 20 6f 66  *. * The size of
1f20: 20 74 68 65 20 62 75 66 66 65 72 20 75 73 65 64   the buffer used
1f30: 20 62 79 20 73 71 6c 69 74 65 33 5f 77 69 6e 33   by sqlite3_win3
1f40: 32 5f 77 72 69 74 65 5f 64 65 62 75 67 28 29 2e  2_write_debug().
1f50: 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  . */.#ifndef SQL
1f60: 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55  ITE_WIN32_DBG_BU
1f70: 46 5f 53 49 5a 45 0a 23 20 20 64 65 66 69 6e 65  F_SIZE.#  define
1f80: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42   SQLITE_WIN32_DB
1f90: 47 5f 42 55 46 5f 53 49 5a 45 20 20 20 28 28 69  G_BUF_SIZE   ((i
1fa0: 6e 74 29 28 34 30 39 36 2d 73 69 7a 65 6f 66 28  nt)(4096-sizeof(
1fb0: 44 57 4f 52 44 29 29 29 0a 23 65 6e 64 69 66 0a  DWORD))).#endif.
1fc0: 0a 2f 2a 0a 20 2a 20 54 68 65 20 76 61 6c 75 65  ./*. * The value
1fd0: 20 75 73 65 64 20 77 69 74 68 20 73 71 6c 69 74   used with sqlit
1fe0: 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72  e3_win32_set_dir
1ff0: 65 63 74 6f 72 79 28 29 20 74 6f 20 73 70 65 63  ectory() to spec
2000: 69 66 79 20 74 68 61 74 0a 20 2a 20 74 68 65 20  ify that. * the 
2010: 64 61 74 61 20 64 69 72 65 63 74 6f 72 79 20 73  data directory s
2020: 68 6f 75 6c 64 20 62 65 20 63 68 61 6e 67 65 64  hould be changed
2030: 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  .. */.#ifndef SQ
2040: 4c 49 54 45 5f 57 49 4e 33 32 5f 44 41 54 41 5f  LITE_WIN32_DATA_
2050: 44 49 52 45 43 54 4f 52 59 5f 54 59 50 45 0a 23  DIRECTORY_TYPE.#
2060: 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f    define SQLITE_
2070: 57 49 4e 33 32 5f 44 41 54 41 5f 44 49 52 45 43  WIN32_DATA_DIREC
2080: 54 4f 52 59 5f 54 59 50 45 20 28 31 29 0a 23 65  TORY_TYPE (1).#e
2090: 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20  ndif../*. * The 
20a0: 76 61 6c 75 65 20 75 73 65 64 20 77 69 74 68 20  value used with 
20b0: 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65  sqlite3_win32_se
20c0: 74 5f 64 69 72 65 63 74 6f 72 79 28 29 20 74 6f  t_directory() to
20d0: 20 73 70 65 63 69 66 79 20 74 68 61 74 0a 20 2a   specify that. *
20e0: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 64   the temporary d
20f0: 69 72 65 63 74 6f 72 79 20 73 68 6f 75 6c 64 20  irectory should 
2100: 62 65 20 63 68 61 6e 67 65 64 2e 0a 20 2a 2f 0a  be changed.. */.
2110: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57  #ifndef SQLITE_W
2120: 49 4e 33 32 5f 54 45 4d 50 5f 44 49 52 45 43 54  IN32_TEMP_DIRECT
2130: 4f 52 59 5f 54 59 50 45 0a 23 20 20 64 65 66 69  ORY_TYPE.#  defi
2140: 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ne SQLITE_WIN32_
2150: 54 45 4d 50 5f 44 49 52 45 43 54 4f 52 59 5f 54  TEMP_DIRECTORY_T
2160: 59 50 45 20 28 32 29 0a 23 65 6e 64 69 66 0a 0a  YPE (2).#endif..
2170: 2f 2a 0a 20 2a 20 49 66 20 63 6f 6d 70 69 6c 65  /*. * If compile
2180: 64 20 77 69 74 68 20 53 51 4c 49 54 45 5f 57 49  d with SQLITE_WI
2190: 4e 33 32 5f 4d 41 4c 4c 4f 43 20 6f 6e 20 57 69  N32_MALLOC on Wi
21a0: 6e 64 6f 77 73 2c 20 77 65 20 77 69 6c 6c 20 75  ndows, we will u
21b0: 73 65 20 74 68 65 0a 20 2a 20 76 61 72 69 6f 75  se the. * variou
21c0: 73 20 57 69 6e 33 32 20 41 50 49 20 68 65 61 70  s Win32 API heap
21d0: 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 73 74 65   functions inste
21e0: 61 64 20 6f 66 20 6f 75 72 20 6f 77 6e 2e 0a 20  ad of our own.. 
21f0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
2200: 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 0a 0a 2f  _WIN32_MALLOC../
2210: 2a 0a 20 2a 20 49 66 20 74 68 69 73 20 69 73 20  *. * If this is 
2220: 6e 6f 6e 2d 7a 65 72 6f 2c 20 61 6e 20 69 73 6f  non-zero, an iso
2230: 6c 61 74 65 64 20 68 65 61 70 20 77 69 6c 6c 20  lated heap will 
2240: 62 65 20 63 72 65 61 74 65 64 20 62 79 20 74 68  be created by th
2250: 65 20 6e 61 74 69 76 65 20 57 69 6e 33 32 0a 20  e native Win32. 
2260: 2a 20 61 6c 6c 6f 63 61 74 6f 72 20 73 75 62 73  * allocator subs
2270: 79 73 74 65 6d 3b 20 6f 74 68 65 72 77 69 73 65  ystem; otherwise
2280: 2c 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 72  , the default pr
2290: 6f 63 65 73 73 20 68 65 61 70 20 77 69 6c 6c 20  ocess heap will 
22a0: 62 65 20 75 73 65 64 2e 20 20 54 68 69 73 0a 20  be used.  This. 
22b0: 2a 20 73 65 74 74 69 6e 67 20 68 61 73 20 6e 6f  * setting has no
22c0: 20 65 66 66 65 63 74 20 77 68 65 6e 20 63 6f 6d   effect when com
22d0: 70 69 6c 69 6e 67 20 66 6f 72 20 57 69 6e 52 54  piling for WinRT
22e0: 2e 20 20 42 79 20 64 65 66 61 75 6c 74 2c 20 74  .  By default, t
22f0: 68 69 73 20 69 73 20 65 6e 61 62 6c 65 64 0a 20  his is enabled. 
2300: 2a 20 61 6e 64 20 61 6e 20 69 73 6f 6c 61 74 65  * and an isolate
2310: 64 20 68 65 61 70 20 77 69 6c 6c 20 62 65 20 63  d heap will be c
2320: 72 65 61 74 65 64 20 74 6f 20 73 74 6f 72 65 20  reated to store 
2330: 61 6c 6c 20 61 6c 6c 6f 63 61 74 65 64 20 64 61  all allocated da
2340: 74 61 2e 0a 20 2a 0a 20 2a 2a 2a 2a 2a 2a 2a 2a  ta.. *. ********
2350: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2360: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2370: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2390: 2a 2a 2a 2a 2a 2a 0a 20 2a 20 57 41 52 4e 49 4e  ******. * WARNIN
23a0: 47 3a 20 49 74 20 69 73 20 69 6d 70 6f 72 74 61  G: It is importa
23b0: 6e 74 20 74 6f 20 6e 6f 74 65 20 74 68 61 74 20  nt to note that 
23c0: 77 68 65 6e 20 74 68 69 73 20 73 65 74 74 69 6e  when this settin
23d0: 67 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e  g is non-zero an
23e0: 64 20 74 68 65 0a 20 2a 20 20 20 20 20 20 20 20  d the. *        
23f0: 20 20 77 69 6e 4d 65 6d 53 68 75 74 64 6f 77 6e    winMemShutdown
2400: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
2410: 6c 65 64 20 28 65 2e 67 2e 20 62 79 20 74 68 65  led (e.g. by the
2420: 20 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77   sqlite3_shutdow
2430: 6e 0a 20 2a 20 20 20 20 20 20 20 20 20 20 66 75  n. *          fu
2440: 6e 63 74 69 6f 6e 29 2c 20 61 6c 6c 20 64 61 74  nction), all dat
2450: 61 20 74 68 61 74 20 77 61 73 20 61 6c 6c 6f 63  a that was alloc
2460: 61 74 65 64 20 75 73 69 6e 67 20 74 68 65 20 69  ated using the i
2470: 73 6f 6c 61 74 65 64 20 68 65 61 70 20 77 69 6c  solated heap wil
2480: 6c 0a 20 2a 20 20 20 20 20 20 20 20 20 20 62 65  l. *          be
2490: 20 66 72 65 65 64 20 69 6d 6d 65 64 69 61 74 65   freed immediate
24a0: 6c 79 20 61 6e 64 20 61 6e 79 20 61 74 74 65 6d  ly and any attem
24b0: 70 74 20 74 6f 20 61 63 63 65 73 73 20 61 6e 79  pt to access any
24c0: 20 6f 66 20 74 68 61 74 20 66 72 65 65 64 0a 20   of that freed. 
24d0: 2a 20 20 20 20 20 20 20 20 20 20 64 61 74 61 20  *          data 
24e0: 77 69 6c 6c 20 61 6c 6d 6f 73 74 20 63 65 72 74  will almost cert
24f0: 61 69 6e 6c 79 20 72 65 73 75 6c 74 20 69 6e 20  ainly result in 
2500: 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 61 63 63  an immediate acc
2510: 65 73 73 20 76 69 6f 6c 61 74 69 6f 6e 2e 0a 20  ess violation.. 
2520: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2530: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2540: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2550: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2560: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20  **************. 
2570: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
2580: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 43 52 45  E_WIN32_HEAP_CRE
2590: 41 54 45 0a 23 20 20 64 65 66 69 6e 65 20 53 51  ATE.#  define SQ
25a0: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
25b0: 43 52 45 41 54 45 20 20 20 20 28 54 52 55 45 29  CREATE    (TRUE)
25c0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54  .#endif../*. * T
25d0: 68 65 20 69 6e 69 74 69 61 6c 20 73 69 7a 65 20  he initial size 
25e0: 6f 66 20 74 68 65 20 57 69 6e 33 32 2d 73 70 65  of the Win32-spe
25f0: 63 69 66 69 63 20 68 65 61 70 2e 20 20 54 68 69  cific heap.  Thi
2600: 73 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20 7a  s value may be z
2610: 65 72 6f 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66  ero.. */.#ifndef
2620: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
2630: 41 50 5f 49 4e 49 54 5f 53 49 5a 45 0a 23 20 20  AP_INIT_SIZE.#  
2640: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49  define SQLITE_WI
2650: 4e 33 32 5f 48 45 41 50 5f 49 4e 49 54 5f 53 49  N32_HEAP_INIT_SI
2660: 5a 45 20 28 28 53 51 4c 49 54 45 5f 44 45 46 41  ZE ((SQLITE_DEFA
2670: 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45 29 20  ULT_CACHE_SIZE) 
2680: 2a 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20  * \.            
2690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a0: 20 20 20 20 20 20 20 20 20 20 20 28 53 51 4c 49             (SQLI
26b0: 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  TE_DEFAULT_PAGE_
26c0: 53 49 5a 45 29 20 2b 20 34 31 39 34 33 30 34 29  SIZE) + 4194304)
26d0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54  .#endif../*. * T
26e0: 68 65 20 6d 61 78 69 6d 75 6d 20 73 69 7a 65 20  he maximum size 
26f0: 6f 66 20 74 68 65 20 57 69 6e 33 32 2d 73 70 65  of the Win32-spe
2700: 63 69 66 69 63 20 68 65 61 70 2e 20 20 54 68 69  cific heap.  Thi
2710: 73 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20 7a  s value may be z
2720: 65 72 6f 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66  ero.. */.#ifndef
2730: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
2740: 41 50 5f 4d 41 58 5f 53 49 5a 45 0a 23 20 20 64  AP_MAX_SIZE.#  d
2750: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e  efine SQLITE_WIN
2760: 33 32 5f 48 45 41 50 5f 4d 41 58 5f 53 49 5a 45  32_HEAP_MAX_SIZE
2770: 20 20 28 30 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a    (0).#endif../*
2780: 0a 20 2a 20 54 68 65 20 65 78 74 72 61 20 66 6c  . * The extra fl
2790: 61 67 73 20 74 6f 20 75 73 65 20 69 6e 20 63 61  ags to use in ca
27a0: 6c 6c 73 20 74 6f 20 74 68 65 20 57 69 6e 33 32  lls to the Win32
27b0: 20 68 65 61 70 20 41 50 49 73 2e 20 20 54 68 69   heap APIs.  Thi
27c0: 73 20 76 61 6c 75 65 20 6d 61 79 20 62 65 0a 20  s value may be. 
27d0: 2a 20 7a 65 72 6f 20 66 6f 72 20 74 68 65 20 64  * zero for the d
27e0: 65 66 61 75 6c 74 20 62 65 68 61 76 69 6f 72 2e  efault behavior.
27f0: 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  . */.#ifndef SQL
2800: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46  ITE_WIN32_HEAP_F
2810: 4c 41 47 53 0a 23 20 20 64 65 66 69 6e 65 20 53  LAGS.#  define S
2820: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
2830: 5f 46 4c 41 47 53 20 20 20 20 20 28 30 29 0a 23  _FLAGS     (0).#
2840: 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  endif.../*.** Th
2850: 65 20 77 69 6e 4d 65 6d 44 61 74 61 20 73 74 72  e winMemData str
2860: 75 63 74 75 72 65 20 73 74 6f 72 65 73 20 69 6e  ucture stores in
2870: 66 6f 72 6d 61 74 69 6f 6e 20 72 65 71 75 69 72  formation requir
2880: 65 64 20 62 79 20 74 68 65 20 57 69 6e 33 32 2d  ed by the Win32-
2890: 73 70 65 63 69 66 69 63 0a 2a 2a 20 73 71 6c 69  specific.** sqli
28a0: 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20  te3_mem_methods 
28b0: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 0a  implementation..
28c0: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
28d0: 74 20 77 69 6e 4d 65 6d 44 61 74 61 20 77 69 6e  t winMemData win
28e0: 4d 65 6d 44 61 74 61 3b 0a 73 74 72 75 63 74 20  MemData;.struct 
28f0: 77 69 6e 4d 65 6d 44 61 74 61 20 7b 0a 23 69 66  winMemData {.#if
2900: 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 75 33  ndef NDEBUG.  u3
2910: 32 20 6d 61 67 69 63 31 3b 20 20 20 2f 2a 20 4d  2 magic1;   /* M
2920: 61 67 69 63 20 6e 75 6d 62 65 72 20 74 6f 20 64  agic number to d
2930: 65 74 65 63 74 20 73 74 72 75 63 74 75 72 65 20  etect structure 
2940: 63 6f 72 72 75 70 74 69 6f 6e 2e 20 2a 2f 0a 23  corruption. */.#
2950: 65 6e 64 69 66 0a 20 20 48 41 4e 44 4c 45 20 68  endif.  HANDLE h
2960: 48 65 61 70 3b 20 2f 2a 20 54 68 65 20 68 61 6e  Heap; /* The han
2970: 64 6c 65 20 74 6f 20 6f 75 72 20 68 65 61 70 2e  dle to our heap.
2980: 20 2a 2f 0a 20 20 42 4f 4f 4c 20 62 4f 77 6e 65   */.  BOOL bOwne
2990: 64 3b 20 20 2f 2a 20 44 6f 20 77 65 20 6f 77 6e  d;  /* Do we own
29a0: 20 74 68 65 20 68 65 61 70 20 28 69 2e 65 2e 20   the heap (i.e. 
29b0: 64 65 73 74 72 6f 79 20 69 74 20 6f 6e 20 73 68  destroy it on sh
29c0: 75 74 64 6f 77 6e 29 3f 20 2a 2f 0a 23 69 66 6e  utdown)? */.#ifn
29d0: 64 65 66 20 4e 44 45 42 55 47 0a 20 20 75 33 32  def NDEBUG.  u32
29e0: 20 6d 61 67 69 63 32 3b 20 20 20 2f 2a 20 4d 61   magic2;   /* Ma
29f0: 67 69 63 20 6e 75 6d 62 65 72 20 74 6f 20 64 65  gic number to de
2a00: 74 65 63 74 20 73 74 72 75 63 74 75 72 65 20 63  tect structure c
2a10: 6f 72 72 75 70 74 69 6f 6e 2e 20 2a 2f 0a 23 65  orruption. */.#e
2a20: 6e 64 69 66 0a 7d 3b 0a 0a 23 69 66 6e 64 65 66  ndif.};..#ifndef
2a30: 20 4e 44 45 42 55 47 0a 23 64 65 66 69 6e 65 20   NDEBUG.#define 
2a40: 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 31 20 20 20  WINMEM_MAGIC1   
2a50: 20 20 30 78 34 32 62 32 38 33 30 62 0a 23 64 65    0x42b2830b.#de
2a60: 66 69 6e 65 20 57 49 4e 4d 45 4d 5f 4d 41 47 49  fine WINMEM_MAGI
2a70: 43 32 20 20 20 20 20 30 78 62 64 34 64 37 63 66  C2     0xbd4d7cf
2a80: 34 0a 23 65 6e 64 69 66 0a 0a 73 74 61 74 69 63  4.#endif..static
2a90: 20 73 74 72 75 63 74 20 77 69 6e 4d 65 6d 44 61   struct winMemDa
2aa0: 74 61 20 77 69 6e 5f 6d 65 6d 5f 64 61 74 61 20  ta win_mem_data 
2ab0: 3d 20 7b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  = {.#ifndef NDEB
2ac0: 55 47 0a 20 20 57 49 4e 4d 45 4d 5f 4d 41 47 49  UG.  WINMEM_MAGI
2ad0: 43 31 2c 0a 23 65 6e 64 69 66 0a 20 20 4e 55 4c  C1,.#endif.  NUL
2ae0: 4c 2c 20 46 41 4c 53 45 0a 23 69 66 6e 64 65 66  L, FALSE.#ifndef
2af0: 20 4e 44 45 42 55 47 0a 20 20 2c 57 49 4e 4d 45   NDEBUG.  ,WINME
2b00: 4d 5f 4d 41 47 49 43 32 0a 23 65 6e 64 69 66 0a  M_MAGIC2.#endif.
2b10: 7d 3b 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  };..#ifndef NDEB
2b20: 55 47 0a 23 64 65 66 69 6e 65 20 77 69 6e 4d 65  UG.#define winMe
2b30: 6d 41 73 73 65 72 74 4d 61 67 69 63 31 28 29 20  mAssertMagic1() 
2b40: 61 73 73 65 72 74 28 20 77 69 6e 5f 6d 65 6d 5f  assert( win_mem_
2b50: 64 61 74 61 2e 6d 61 67 69 63 31 3d 3d 57 49 4e  data.magic1==WIN
2b60: 4d 45 4d 5f 4d 41 47 49 43 31 20 29 0a 23 64 65  MEM_MAGIC1 ).#de
2b70: 66 69 6e 65 20 77 69 6e 4d 65 6d 41 73 73 65 72  fine winMemAsser
2b80: 74 4d 61 67 69 63 32 28 29 20 61 73 73 65 72 74  tMagic2() assert
2b90: 28 20 77 69 6e 5f 6d 65 6d 5f 64 61 74 61 2e 6d  ( win_mem_data.m
2ba0: 61 67 69 63 32 3d 3d 57 49 4e 4d 45 4d 5f 4d 41  agic2==WINMEM_MA
2bb0: 47 49 43 32 20 29 0a 23 64 65 66 69 6e 65 20 77  GIC2 ).#define w
2bc0: 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63  inMemAssertMagic
2bd0: 28 29 20 20 77 69 6e 4d 65 6d 41 73 73 65 72 74  ()  winMemAssert
2be0: 4d 61 67 69 63 31 28 29 3b 20 77 69 6e 4d 65 6d  Magic1(); winMem
2bf0: 41 73 73 65 72 74 4d 61 67 69 63 32 28 29 3b 0a  AssertMagic2();.
2c00: 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 77 69  #else.#define wi
2c10: 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63 28  nMemAssertMagic(
2c20: 29 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ).#endif..#defin
2c30: 65 20 77 69 6e 4d 65 6d 47 65 74 44 61 74 61 50  e winMemGetDataP
2c40: 74 72 28 29 20 20 26 77 69 6e 5f 6d 65 6d 5f 64  tr()  &win_mem_d
2c50: 61 74 61 0a 23 64 65 66 69 6e 65 20 77 69 6e 4d  ata.#define winM
2c60: 65 6d 47 65 74 48 65 61 70 28 29 20 20 20 20 20  emGetHeap()     
2c70: 77 69 6e 5f 6d 65 6d 5f 64 61 74 61 2e 68 48 65  win_mem_data.hHe
2c80: 61 70 0a 23 64 65 66 69 6e 65 20 77 69 6e 4d 65  ap.#define winMe
2c90: 6d 47 65 74 4f 77 6e 65 64 28 29 20 20 20 20 77  mGetOwned()    w
2ca0: 69 6e 5f 6d 65 6d 5f 64 61 74 61 2e 62 4f 77 6e  in_mem_data.bOwn
2cb0: 65 64 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ed..static void 
2cc0: 2a 77 69 6e 4d 65 6d 4d 61 6c 6c 6f 63 28 69 6e  *winMemMalloc(in
2cd0: 74 20 6e 42 79 74 65 73 29 3b 0a 73 74 61 74 69  t nBytes);.stati
2ce0: 63 20 76 6f 69 64 20 77 69 6e 4d 65 6d 46 72 65  c void winMemFre
2cf0: 65 28 76 6f 69 64 20 2a 70 50 72 69 6f 72 29 3b  e(void *pPrior);
2d00: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 77 69  .static void *wi
2d10: 6e 4d 65 6d 52 65 61 6c 6c 6f 63 28 76 6f 69 64  nMemRealloc(void
2d20: 20 2a 70 50 72 69 6f 72 2c 20 69 6e 74 20 6e 42   *pPrior, int nB
2d30: 79 74 65 73 29 3b 0a 73 74 61 74 69 63 20 69 6e  ytes);.static in
2d40: 74 20 77 69 6e 4d 65 6d 53 69 7a 65 28 76 6f 69  t winMemSize(voi
2d50: 64 20 2a 70 29 3b 0a 73 74 61 74 69 63 20 69 6e  d *p);.static in
2d60: 74 20 77 69 6e 4d 65 6d 52 6f 75 6e 64 75 70 28  t winMemRoundup(
2d70: 69 6e 74 20 6e 29 3b 0a 73 74 61 74 69 63 20 69  int n);.static i
2d80: 6e 74 20 77 69 6e 4d 65 6d 49 6e 69 74 28 76 6f  nt winMemInit(vo
2d90: 69 64 20 2a 70 41 70 70 44 61 74 61 29 3b 0a 73  id *pAppData);.s
2da0: 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 4d 65  tatic void winMe
2db0: 6d 53 68 75 74 64 6f 77 6e 28 76 6f 69 64 20 2a  mShutdown(void *
2dc0: 70 41 70 70 44 61 74 61 29 3b 0a 0a 63 6f 6e 73  pAppData);..cons
2dd0: 74 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65  t sqlite3_mem_me
2de0: 74 68 6f 64 73 20 2a 73 71 6c 69 74 65 33 4d 65  thods *sqlite3Me
2df0: 6d 47 65 74 57 69 6e 33 32 28 76 6f 69 64 29 3b  mGetWin32(void);
2e00: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
2e10: 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 20 2a  E_WIN32_MALLOC *
2e20: 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  /../*.** The fol
2e30: 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 20  lowing variable 
2e40: 69 73 20 28 6e 6f 72 6d 61 6c 6c 79 29 20 73 65  is (normally) se
2e50: 74 20 6f 6e 63 65 20 61 6e 64 20 6e 65 76 65 72  t once and never
2e60: 20 63 68 61 6e 67 65 73 0a 2a 2a 20 74 68 65 72   changes.** ther
2e70: 65 61 66 74 65 72 2e 20 20 49 74 20 72 65 63 6f  eafter.  It reco
2e80: 72 64 73 20 77 68 65 74 68 65 72 20 74 68 65 20  rds whether the 
2e90: 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
2ea0: 20 69 73 20 57 69 6e 39 78 0a 2a 2a 20 6f 72 20   is Win9x.** or 
2eb0: 57 69 6e 4e 54 2e 0a 2a 2a 0a 2a 2a 20 30 3a 20  WinNT..**.** 0: 
2ec0: 20 20 4f 70 65 72 61 74 69 6e 67 20 73 79 73 74    Operating syst
2ed0: 65 6d 20 75 6e 6b 6e 6f 77 6e 2e 0a 2a 2a 20 31  em unknown..** 1
2ee0: 3a 20 20 20 4f 70 65 72 61 74 69 6e 67 20 73 79  :   Operating sy
2ef0: 73 74 65 6d 20 69 73 20 57 69 6e 39 78 2e 0a 2a  stem is Win9x..*
2f00: 2a 20 32 3a 20 20 20 4f 70 65 72 61 74 69 6e 67  * 2:   Operating
2f10: 20 73 79 73 74 65 6d 20 69 73 20 57 69 6e 4e 54   system is WinNT
2f20: 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65 72  ..**.** In order
2f30: 20 74 6f 20 66 61 63 69 6c 69 74 61 74 65 20 74   to facilitate t
2f40: 65 73 74 69 6e 67 20 6f 6e 20 61 20 57 69 6e 4e  esting on a WinN
2f50: 54 20 73 79 73 74 65 6d 2c 20 74 68 65 20 74 65  T system, the te
2f60: 73 74 20 66 69 78 74 75 72 65 0a 2a 2a 20 63 61  st fixture.** ca
2f70: 6e 20 6d 61 6e 75 61 6c 6c 79 20 73 65 74 20 74  n manually set t
2f80: 68 69 73 20 76 61 6c 75 65 20 74 6f 20 31 20 74  his value to 1 t
2f90: 6f 20 65 6d 75 6c 61 74 65 20 57 69 6e 39 38 20  o emulate Win98 
2fa0: 62 65 68 61 76 69 6f 72 2e 0a 2a 2f 0a 23 69 66  behavior..*/.#if
2fb0: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
2fc0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74  int sqlite3_os_t
2fd0: 79 70 65 20 3d 20 30 3b 0a 23 65 6c 69 66 20 21  ype = 0;.#elif !
2fe0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
2ff0: 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  && !SQLITE_OS_WI
3000: 4e 52 54 20 26 26 20 5c 0a 20 20 20 20 20 20 64  NRT && \.      d
3010: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
3020: 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 20 26 26  N32_HAS_ANSI) &&
3030: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
3040: 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a  WIN32_HAS_WIDE).
3050: 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
3060: 65 33 5f 6f 73 5f 74 79 70 65 20 3d 20 30 3b 0a  e3_os_type = 0;.
3070: 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
3080: 53 59 53 43 41 4c 4c 0a 23 20 20 64 65 66 69 6e  SYSCALL.#  defin
3090: 65 20 53 59 53 43 41 4c 4c 20 73 71 6c 69 74 65  e SYSCALL sqlite
30a0: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 0a 23 65  3_syscall_ptr.#e
30b0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
30c0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 74   function is not
30d0: 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 57 69   available on Wi
30e0: 6e 64 6f 77 73 20 43 45 20 6f 72 20 57 69 6e 52  ndows CE or WinR
30f0: 54 2e 0a 20 2a 2f 0a 0a 23 69 66 20 53 51 4c 49  T.. */..#if SQLI
3100: 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 53  TE_OS_WINCE || S
3110: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 23  QLITE_OS_WINRT.#
3120: 20 20 64 65 66 69 6e 65 20 6f 73 41 72 65 46 69    define osAreFi
3130: 6c 65 41 70 69 73 41 4e 53 49 28 29 20 20 20 20  leApisANSI()    
3140: 20 20 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a     1.#endif../*.
3150: 2a 2a 20 4d 61 6e 79 20 73 79 73 74 65 6d 20 63  ** Many system c
3160: 61 6c 6c 73 20 61 72 65 20 61 63 63 65 73 73 65  alls are accesse
3170: 64 20 74 68 72 6f 75 67 68 20 70 6f 69 6e 74 65  d through pointe
3180: 72 2d 74 6f 2d 66 75 6e 63 74 69 6f 6e 73 20 73  r-to-functions s
3190: 6f 20 74 68 61 74 0a 2a 2a 20 74 68 65 79 20 6d  o that.** they m
31a0: 61 79 20 62 65 20 6f 76 65 72 72 69 64 64 65 6e  ay be overridden
31b0: 20 61 74 20 72 75 6e 74 69 6d 65 20 74 6f 20 66   at runtime to f
31c0: 61 63 69 6c 69 74 61 74 65 20 66 61 75 6c 74 20  acilitate fault 
31d0: 69 6e 6a 65 63 74 69 6f 6e 20 64 75 72 69 6e 67  injection during
31e0: 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20  .** testing and 
31f0: 73 61 6e 64 62 6f 78 69 6e 67 2e 20 20 54 68 65  sandboxing.  The
3200: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 72 61 79   following array
3210: 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 73   holds the names
3220: 20 61 6e 64 20 70 6f 69 6e 74 65 72 73 0a 2a 2a   and pointers.**
3230: 20 74 6f 20 61 6c 6c 20 6f 76 65 72 72 69 64 65   to all override
3240: 61 62 6c 65 20 73 79 73 74 65 6d 20 63 61 6c 6c  able system call
3250: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72  s..*/.static str
3260: 75 63 74 20 77 69 6e 5f 73 79 73 63 61 6c 6c 20  uct win_syscall 
3270: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
3280: 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  zName;          
3290: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
32a0: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a   system call */.
32b0: 20 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c    sqlite3_syscal
32c0: 6c 5f 70 74 72 20 70 43 75 72 72 65 6e 74 3b 20  l_ptr pCurrent; 
32d0: 2f 2a 20 43 75 72 72 65 6e 74 20 76 61 6c 75 65  /* Current value
32e0: 20 6f 66 20 74 68 65 20 73 79 73 74 65 6d 20 63   of the system c
32f0: 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  all */.  sqlite3
3300: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 70 44 65  _syscall_ptr pDe
3310: 66 61 75 6c 74 3b 20 2f 2a 20 44 65 66 61 75 6c  fault; /* Defaul
3320: 74 20 76 61 6c 75 65 20 2a 2f 0a 7d 20 61 53 79  t value */.} aSy
3330: 73 63 61 6c 6c 5b 5d 20 3d 20 7b 0a 23 69 66 20  scall[] = {.#if 
3340: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45  !SQLITE_OS_WINCE
3350: 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57   && !SQLITE_OS_W
3360: 49 4e 52 54 0a 20 20 7b 20 22 41 72 65 46 69 6c  INRT.  { "AreFil
3370: 65 41 70 69 73 41 4e 53 49 22 2c 20 20 20 20 20  eApisANSI",     
3380: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 41 72 65      (SYSCALL)Are
3390: 46 69 6c 65 41 70 69 73 41 4e 53 49 2c 20 20 20  FileApisANSI,   
33a0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
33b0: 0a 20 20 7b 20 22 41 72 65 46 69 6c 65 41 70 69  .  { "AreFileApi
33c0: 73 41 4e 53 49 22 2c 20 20 20 20 20 20 20 20 20  sANSI",         
33d0: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
33e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33f0: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
3400: 69 66 6e 64 65 66 20 6f 73 41 72 65 46 69 6c 65  ifndef osAreFile
3410: 41 70 69 73 41 4e 53 49 0a 23 64 65 66 69 6e 65  ApisANSI.#define
3420: 20 6f 73 41 72 65 46 69 6c 65 41 70 69 73 41 4e   osAreFileApisAN
3430: 53 49 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  SI ((BOOL(WINAPI
3440: 2a 29 28 56 4f 49 44 29 29 61 53 79 73 63 61 6c  *)(VOID))aSyscal
3450: 6c 5b 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 23  l[0].pCurrent).#
3460: 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54  endif..#if SQLIT
3470: 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 64 65  E_OS_WINCE && de
3480: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
3490: 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b  32_HAS_WIDE).  {
34a0: 20 22 43 68 61 72 4c 6f 77 65 72 57 22 2c 20 20   "CharLowerW",  
34b0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
34c0: 43 41 4c 4c 29 43 68 61 72 4c 6f 77 65 72 57 2c  CALL)CharLowerW,
34d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
34e0: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 68  },.#else.  { "Ch
34f0: 61 72 4c 6f 77 65 72 57 22 2c 20 20 20 20 20 20  arLowerW",      
3500: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
3510: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
3520: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
3530: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
3540: 73 43 68 61 72 4c 6f 77 65 72 57 20 28 28 4c 50  sCharLowerW ((LP
3550: 57 53 54 52 28 57 49 4e 41 50 49 2a 29 28 4c 50  WSTR(WINAPI*)(LP
3560: 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 31  WSTR))aSyscall[1
3570: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
3580: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
3590: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
35a0: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
35b0: 45 29 0a 20 20 7b 20 22 43 68 61 72 55 70 70 65  E).  { "CharUppe
35c0: 72 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  rW",            
35d0: 20 20 28 53 59 53 43 41 4c 4c 29 43 68 61 72 55    (SYSCALL)CharU
35e0: 70 70 65 72 57 2c 20 20 20 20 20 20 20 20 20 20  pperW,          
35f0: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
3600: 20 7b 20 22 43 68 61 72 55 70 70 65 72 57 22 2c   { "CharUpperW",
3610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
3620: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
3630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3640: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
3650: 66 69 6e 65 20 6f 73 43 68 61 72 55 70 70 65 72  fine osCharUpper
3660: 57 20 28 28 4c 50 57 53 54 52 28 57 49 4e 41 50  W ((LPWSTR(WINAP
3670: 49 2a 29 28 4c 50 57 53 54 52 29 29 61 53 79 73  I*)(LPWSTR))aSys
3680: 63 61 6c 6c 5b 32 5d 2e 70 43 75 72 72 65 6e 74  call[2].pCurrent
3690: 29 0a 0a 20 20 7b 20 22 43 6c 6f 73 65 48 61 6e  )..  { "CloseHan
36a0: 64 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  dle",           
36b0: 20 20 28 53 59 53 43 41 4c 4c 29 43 6c 6f 73 65    (SYSCALL)Close
36c0: 48 61 6e 64 6c 65 2c 20 20 20 20 20 20 20 20 20  Handle,         
36d0: 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e      0 },..#defin
36e0: 65 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 20  e osCloseHandle 
36f0: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
3700: 48 41 4e 44 4c 45 29 29 61 53 79 73 63 61 6c 6c  HANDLE))aSyscall
3710: 5b 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  [3].pCurrent)..#
3720: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
3730: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
3740: 29 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c  ).  { "CreateFil
3750: 65 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  eA",            
3760: 20 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65   (SYSCALL)Create
3770: 46 69 6c 65 41 2c 20 20 20 20 20 20 20 20 20 20  FileA,          
3780: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
3790: 7b 20 22 43 72 65 61 74 65 46 69 6c 65 41 22 2c  { "CreateFileA",
37a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
37b0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
37c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
37d0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
37e0: 69 6e 65 20 6f 73 43 72 65 61 74 65 46 69 6c 65  ine osCreateFile
37f0: 41 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50  A ((HANDLE(WINAP
3800: 49 2a 29 28 4c 50 43 53 54 52 2c 44 57 4f 52 44  I*)(LPCSTR,DWORD
3810: 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20  ,DWORD, \.      
3820: 20 20 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54    LPSECURITY_ATT
3830: 52 49 42 55 54 45 53 2c 44 57 4f 52 44 2c 44 57  RIBUTES,DWORD,DW
3840: 4f 52 44 2c 48 41 4e 44 4c 45 29 29 61 53 79 73  ORD,HANDLE))aSys
3850: 63 61 6c 6c 5b 34 5d 2e 70 43 75 72 72 65 6e 74  call[4].pCurrent
3860: 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  )..#if !SQLITE_O
3870: 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e  S_WINRT && defin
3880: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
3890: 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 43  HAS_WIDE).  { "C
38a0: 72 65 61 74 65 46 69 6c 65 57 22 2c 20 20 20 20  reateFileW",    
38b0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
38c0: 4c 29 43 72 65 61 74 65 46 69 6c 65 57 2c 20 20  L)CreateFileW,  
38d0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
38e0: 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65 61 74  #else.  { "Creat
38f0: 65 46 69 6c 65 57 22 2c 20 20 20 20 20 20 20 20  eFileW",        
3900: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
3910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3920: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
3930: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72  if..#define osCr
3940: 65 61 74 65 46 69 6c 65 57 20 28 28 48 41 4e 44  eateFileW ((HAND
3950: 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57  LE(WINAPI*)(LPCW
3960: 53 54 52 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c  STR,DWORD,DWORD,
3970: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 53 45 43   \.        LPSEC
3980: 55 52 49 54 59 5f 41 54 54 52 49 42 55 54 45 53  URITY_ATTRIBUTES
3990: 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 48 41 4e  ,DWORD,DWORD,HAN
39a0: 44 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 35 5d  DLE))aSyscall[5]
39b0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
39c0: 28 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  (!SQLITE_OS_WINR
39d0: 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  T && defined(SQL
39e0: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
39f0: 53 49 29 20 26 26 20 5c 0a 20 20 20 20 20 20 20  SI) && \.       
3a00: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
3a10: 5f 4f 4d 49 54 5f 57 41 4c 29 29 0a 20 20 7b 20  _OMIT_WAL)).  { 
3a20: 22 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69  "CreateFileMappi
3a30: 6e 67 41 22 2c 20 20 20 20 20 20 28 53 59 53 43  ngA",      (SYSC
3a40: 41 4c 4c 29 43 72 65 61 74 65 46 69 6c 65 4d 61  ALL)CreateFileMa
3a50: 70 70 69 6e 67 41 2c 20 20 20 20 20 20 30 20 7d  ppingA,      0 }
3a60: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65  ,.#else.  { "Cre
3a70: 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 41 22  ateFileMappingA"
3a80: 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29  ,      (SYSCALL)
3a90: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
3aa0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
3ab0: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
3ac0: 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e  CreateFileMappin
3ad0: 67 41 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41  gA ((HANDLE(WINA
3ae0: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 50 53 45  PI*)(HANDLE,LPSE
3af0: 43 55 52 49 54 59 5f 41 54 54 52 49 42 55 54 45  CURITY_ATTRIBUTE
3b00: 53 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f  S, \.        DWO
3b10: 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 4c  RD,DWORD,DWORD,L
3b20: 50 43 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b  PCSTR))aSyscall[
3b30: 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  6].pCurrent)..#i
3b40: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
3b50: 45 20 7c 7c 20 28 21 53 51 4c 49 54 45 5f 4f 53  E || (!SQLITE_OS
3b60: 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65  _WINRT && define
3b70: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
3b80: 41 53 5f 57 49 44 45 29 20 26 26 20 5c 0a 20 20  AS_WIDE) && \.  
3b90: 20 20 20 20 20 20 21 64 65 66 69 6e 65 64 28 53        !defined(S
3ba0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 29  QLITE_OMIT_WAL))
3bb0: 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65  .  { "CreateFile
3bc0: 4d 61 70 70 69 6e 67 57 22 2c 20 20 20 20 20 20  MappingW",      
3bd0: 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65 46  (SYSCALL)CreateF
3be0: 69 6c 65 4d 61 70 70 69 6e 67 57 2c 20 20 20 20  ileMappingW,    
3bf0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
3c00: 20 22 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70   "CreateFileMapp
3c10: 69 6e 67 57 22 2c 20 20 20 20 20 20 28 53 59 53  ingW",      (SYS
3c20: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
3c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
3c40: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
3c50: 6e 65 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d  ne osCreateFileM
3c60: 61 70 70 69 6e 67 57 20 28 28 48 41 4e 44 4c 45  appingW ((HANDLE
3c70: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
3c80: 2c 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54 52  ,LPSECURITY_ATTR
3c90: 49 42 55 54 45 53 2c 20 5c 0a 20 20 20 20 20 20  IBUTES, \.      
3ca0: 20 20 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57    DWORD,DWORD,DW
3cb0: 4f 52 44 2c 4c 50 43 57 53 54 52 29 29 61 53 79  ORD,LPCWSTR))aSy
3cc0: 73 63 61 6c 6c 5b 37 5d 2e 70 43 75 72 72 65 6e  scall[7].pCurren
3cd0: 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  t)..#if !SQLITE_
3ce0: 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69  OS_WINRT && defi
3cf0: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
3d00: 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22  _HAS_WIDE).  { "
3d10: 43 72 65 61 74 65 4d 75 74 65 78 57 22 2c 20 20  CreateMutexW",  
3d20: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
3d30: 4c 4c 29 43 72 65 61 74 65 4d 75 74 65 78 57 2c  LL)CreateMutexW,
3d40: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
3d50: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65 61  .#else.  { "Crea
3d60: 74 65 4d 75 74 65 78 57 22 2c 20 20 20 20 20 20  teMutexW",      
3d70: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
3d80: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3d90: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
3da0: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43  dif..#define osC
3db0: 72 65 61 74 65 4d 75 74 65 78 57 20 28 28 48 41  reateMutexW ((HA
3dc0: 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50  NDLE(WINAPI*)(LP
3dd0: 53 45 43 55 52 49 54 59 5f 41 54 54 52 49 42 55  SECURITY_ATTRIBU
3de0: 54 45 53 2c 42 4f 4f 4c 2c 20 5c 0a 20 20 20 20  TES,BOOL, \.    
3df0: 20 20 20 20 4c 50 43 57 53 54 52 29 29 61 53 79      LPCWSTR))aSy
3e00: 73 63 61 6c 6c 5b 38 5d 2e 70 43 75 72 72 65 6e  scall[8].pCurren
3e10: 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  t)..#if defined(
3e20: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
3e30: 5f 41 4e 53 49 29 0a 20 20 7b 20 22 44 65 6c 65  _ANSI).  { "Dele
3e40: 74 65 46 69 6c 65 41 22 2c 20 20 20 20 20 20 20  teFileA",       
3e50: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 44        (SYSCALL)D
3e60: 65 6c 65 74 65 46 69 6c 65 41 2c 20 20 20 20 20  eleteFileA,     
3e70: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
3e80: 73 65 0a 20 20 7b 20 22 44 65 6c 65 74 65 46 69  se.  { "DeleteFi
3e90: 6c 65 41 22 2c 20 20 20 20 20 20 20 20 20 20 20  leA",           
3ea0: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
3eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ec0: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
3ed0: 0a 23 64 65 66 69 6e 65 20 6f 73 44 65 6c 65 74  .#define osDelet
3ee0: 65 46 69 6c 65 41 20 28 28 42 4f 4f 4c 28 57 49  eFileA ((BOOL(WI
3ef0: 4e 41 50 49 2a 29 28 4c 50 43 53 54 52 29 29 61  NAPI*)(LPCSTR))a
3f00: 53 79 73 63 61 6c 6c 5b 39 5d 2e 70 43 75 72 72  Syscall[9].pCurr
3f10: 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65  ent)..#if define
3f20: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
3f30: 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 44 65  AS_WIDE).  { "De
3f40: 6c 65 74 65 46 69 6c 65 57 22 2c 20 20 20 20 20  leteFileW",     
3f50: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
3f60: 29 44 65 6c 65 74 65 46 69 6c 65 57 2c 20 20 20  )DeleteFileW,   
3f70: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
3f80: 65 6c 73 65 0a 20 20 7b 20 22 44 65 6c 65 74 65  else.  { "Delete
3f90: 46 69 6c 65 57 22 2c 20 20 20 20 20 20 20 20 20  FileW",         
3fa0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
3fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3fc0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
3fd0: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 44 65 6c  f..#define osDel
3fe0: 65 74 65 46 69 6c 65 57 20 28 28 42 4f 4f 4c 28  eteFileW ((BOOL(
3ff0: 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52  WINAPI*)(LPCWSTR
4000: 29 29 61 53 79 73 63 61 6c 6c 5b 31 30 5d 2e 70  ))aSyscall[10].p
4010: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51  Current)..#if SQ
4020: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
4030: 7b 20 22 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63  { "FileTimeToLoc
4040: 61 6c 46 69 6c 65 54 69 6d 65 22 2c 20 28 53 59  alFileTime", (SY
4050: 53 43 41 4c 4c 29 46 69 6c 65 54 69 6d 65 54 6f  SCALL)FileTimeTo
4060: 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65 2c 20 30  LocalFileTime, 0
4070: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 46   },.#else.  { "F
4080: 69 6c 65 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69  ileTimeToLocalFi
4090: 6c 65 54 69 6d 65 22 2c 20 28 53 59 53 43 41 4c  leTime", (SYSCAL
40a0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
40b0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
40c0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
40d0: 6f 73 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63 61  osFileTimeToLoca
40e0: 6c 46 69 6c 65 54 69 6d 65 20 28 28 42 4f 4f 4c  lFileTime ((BOOL
40f0: 28 57 49 4e 41 50 49 2a 29 28 43 4f 4e 53 54 20  (WINAPI*)(CONST 
4100: 46 49 4c 45 54 49 4d 45 2a 2c 20 5c 0a 20 20 20  FILETIME*, \.   
4110: 20 20 20 20 20 4c 50 46 49 4c 45 54 49 4d 45 29       LPFILETIME)
4120: 29 61 53 79 73 63 61 6c 6c 5b 31 31 5d 2e 70 43  )aSyscall[11].pC
4130: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c  urrent)..#if SQL
4140: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 7b  ITE_OS_WINCE.  {
4150: 20 22 46 69 6c 65 54 69 6d 65 54 6f 53 79 73 74   "FileTimeToSyst
4160: 65 6d 54 69 6d 65 22 2c 20 20 20 20 28 53 59 53  emTime",    (SYS
4170: 43 41 4c 4c 29 46 69 6c 65 54 69 6d 65 54 6f 53  CALL)FileTimeToS
4180: 79 73 74 65 6d 54 69 6d 65 2c 20 20 20 20 30 20  ystemTime,    0 
4190: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 46 69  },.#else.  { "Fi
41a0: 6c 65 54 69 6d 65 54 6f 53 79 73 74 65 6d 54 69  leTimeToSystemTi
41b0: 6d 65 22 2c 20 20 20 20 28 53 59 53 43 41 4c 4c  me",    (SYSCALL
41c0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
41d0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
41e0: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
41f0: 73 46 69 6c 65 54 69 6d 65 54 6f 53 79 73 74 65  sFileTimeToSyste
4200: 6d 54 69 6d 65 20 28 28 42 4f 4f 4c 28 57 49 4e  mTime ((BOOL(WIN
4210: 41 50 49 2a 29 28 43 4f 4e 53 54 20 46 49 4c 45  API*)(CONST FILE
4220: 54 49 4d 45 2a 2c 20 5c 0a 20 20 20 20 20 20 20  TIME*, \.       
4230: 20 4c 50 53 59 53 54 45 4d 54 49 4d 45 29 29 61   LPSYSTEMTIME))a
4240: 53 79 73 63 61 6c 6c 5b 31 32 5d 2e 70 43 75 72  Syscall[12].pCur
4250: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 46 6c 75 73  rent)..  { "Flus
4260: 68 46 69 6c 65 42 75 66 66 65 72 73 22 2c 20 20  hFileBuffers",  
4270: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 46        (SYSCALL)F
4280: 6c 75 73 68 46 69 6c 65 42 75 66 66 65 72 73 2c  lushFileBuffers,
4290: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64          0 },..#d
42a0: 65 66 69 6e 65 20 6f 73 46 6c 75 73 68 46 69 6c  efine osFlushFil
42b0: 65 42 75 66 66 65 72 73 20 28 28 42 4f 4f 4c 28  eBuffers ((BOOL(
42c0: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 29  WINAPI*)(HANDLE)
42d0: 29 61 53 79 73 63 61 6c 6c 5b 31 33 5d 2e 70 43  )aSyscall[13].pC
42e0: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66  urrent)..#if def
42f0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
4300: 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20  2_HAS_ANSI).  { 
4310: 22 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 41 22  "FormatMessageA"
4320: 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43  ,          (SYSC
4330: 41 4c 4c 29 46 6f 72 6d 61 74 4d 65 73 73 61 67  ALL)FormatMessag
4340: 65 41 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d  eA,          0 }
4350: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 46 6f 72  ,.#else.  { "For
4360: 6d 61 74 4d 65 73 73 61 67 65 41 22 2c 20 20 20  matMessageA",   
4370: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
4380: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
4390: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
43a0: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
43b0: 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 41 20 28  FormatMessageA (
43c0: 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28  (DWORD(WINAPI*)(
43d0: 44 57 4f 52 44 2c 4c 50 43 56 4f 49 44 2c 44 57  DWORD,LPCVOID,DW
43e0: 4f 52 44 2c 44 57 4f 52 44 2c 4c 50 53 54 52 2c  ORD,DWORD,LPSTR,
43f0: 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44   \.        DWORD
4400: 2c 76 61 5f 6c 69 73 74 2a 29 29 61 53 79 73 63  ,va_list*))aSysc
4410: 61 6c 6c 5b 31 34 5d 2e 70 43 75 72 72 65 6e 74  all[14].pCurrent
4420: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  )..#if defined(S
4430: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
4440: 57 49 44 45 29 0a 20 20 7b 20 22 46 6f 72 6d 61  WIDE).  { "Forma
4450: 74 4d 65 73 73 61 67 65 57 22 2c 20 20 20 20 20  tMessageW",     
4460: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 46 6f       (SYSCALL)Fo
4470: 72 6d 61 74 4d 65 73 73 61 67 65 57 2c 20 20 20  rmatMessageW,   
4480: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
4490: 65 0a 20 20 7b 20 22 46 6f 72 6d 61 74 4d 65 73  e.  { "FormatMes
44a0: 73 61 67 65 57 22 2c 20 20 20 20 20 20 20 20 20  sageW",         
44b0: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
44c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
44d0: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
44e0: 23 64 65 66 69 6e 65 20 6f 73 46 6f 72 6d 61 74  #define osFormat
44f0: 4d 65 73 73 61 67 65 57 20 28 28 44 57 4f 52 44  MessageW ((DWORD
4500: 28 57 49 4e 41 50 49 2a 29 28 44 57 4f 52 44 2c  (WINAPI*)(DWORD,
4510: 4c 50 43 56 4f 49 44 2c 44 57 4f 52 44 2c 44 57  LPCVOID,DWORD,DW
4520: 4f 52 44 2c 4c 50 57 53 54 52 2c 20 5c 0a 20 20  ORD,LPWSTR, \.  
4530: 20 20 20 20 20 20 44 57 4f 52 44 2c 76 61 5f 6c        DWORD,va_l
4540: 69 73 74 2a 29 29 61 53 79 73 63 61 6c 6c 5b 31  ist*))aSyscall[1
4550: 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  5].pCurrent)..#i
4560: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
4570: 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45  E_OMIT_LOAD_EXTE
4580: 4e 53 49 4f 4e 29 0a 20 20 7b 20 22 46 72 65 65  NSION).  { "Free
4590: 4c 69 62 72 61 72 79 22 2c 20 20 20 20 20 20 20  Library",       
45a0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 46        (SYSCALL)F
45b0: 72 65 65 4c 69 62 72 61 72 79 2c 20 20 20 20 20  reeLibrary,     
45c0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
45d0: 73 65 0a 20 20 7b 20 22 46 72 65 65 4c 69 62 72  se.  { "FreeLibr
45e0: 61 72 79 22 2c 20 20 20 20 20 20 20 20 20 20 20  ary",           
45f0: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
4600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4610: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
4620: 0a 23 64 65 66 69 6e 65 20 6f 73 46 72 65 65 4c  .#define osFreeL
4630: 69 62 72 61 72 79 20 28 28 42 4f 4f 4c 28 57 49  ibrary ((BOOL(WI
4640: 4e 41 50 49 2a 29 28 48 4d 4f 44 55 4c 45 29 29  NAPI*)(HMODULE))
4650: 61 53 79 73 63 61 6c 6c 5b 31 36 5d 2e 70 43 75  aSyscall[16].pCu
4660: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 47 65 74  rrent)..  { "Get
4670: 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
4680: 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29  ",     (SYSCALL)
4690: 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
46a0: 73 49 64 2c 20 20 20 20 20 30 20 7d 2c 0a 0a 23  sId,     0 },..#
46b0: 64 65 66 69 6e 65 20 6f 73 47 65 74 43 75 72 72  define osGetCurr
46c0: 65 6e 74 50 72 6f 63 65 73 73 49 64 20 28 28 44  entProcessId ((D
46d0: 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 56 4f  WORD(WINAPI*)(VO
46e0: 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 31 37 5d  ID))aSyscall[17]
46f0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
4700: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45  !SQLITE_OS_WINCE
4710: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
4720: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
4730: 49 29 0a 20 20 7b 20 22 47 65 74 44 69 73 6b 46  I).  { "GetDiskF
4740: 72 65 65 53 70 61 63 65 41 22 2c 20 20 20 20 20  reeSpaceA",     
4750: 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 44 69    (SYSCALL)GetDi
4760: 73 6b 46 72 65 65 53 70 61 63 65 41 2c 20 20 20  skFreeSpaceA,   
4770: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
4780: 20 7b 20 22 47 65 74 44 69 73 6b 46 72 65 65 53   { "GetDiskFreeS
4790: 70 61 63 65 41 22 2c 20 20 20 20 20 20 20 28 53  paceA",       (S
47a0: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
47b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
47c0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
47d0: 66 69 6e 65 20 6f 73 47 65 74 44 69 73 6b 46 72  fine osGetDiskFr
47e0: 65 65 53 70 61 63 65 41 20 28 28 42 4f 4f 4c 28  eeSpaceA ((BOOL(
47f0: 57 49 4e 41 50 49 2a 29 28 4c 50 43 53 54 52 2c  WINAPI*)(LPCSTR,
4800: 4c 50 44 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c  LPDWORD,LPDWORD,
4810: 4c 50 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20  LPDWORD, \.     
4820: 20 20 20 4c 50 44 57 4f 52 44 29 29 61 53 79 73     LPDWORD))aSys
4830: 63 61 6c 6c 5b 31 38 5d 2e 70 43 75 72 72 65 6e  call[18].pCurren
4840: 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  t)..#if !SQLITE_
4850: 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c  OS_WINCE && !SQL
4860: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20  ITE_OS_WINRT && 
4870: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
4880: 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20  IN32_HAS_WIDE). 
4890: 20 7b 20 22 47 65 74 44 69 73 6b 46 72 65 65 53   { "GetDiskFreeS
48a0: 70 61 63 65 57 22 2c 20 20 20 20 20 20 20 28 53  paceW",       (S
48b0: 59 53 43 41 4c 4c 29 47 65 74 44 69 73 6b 46 72  YSCALL)GetDiskFr
48c0: 65 65 53 70 61 63 65 57 2c 20 20 20 20 20 20 20  eeSpaceW,       
48d0: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
48e0: 47 65 74 44 69 73 6b 46 72 65 65 53 70 61 63 65  GetDiskFreeSpace
48f0: 57 22 2c 20 20 20 20 20 20 20 28 53 59 53 43 41  W",       (SYSCA
4900: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
4910: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
4920: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
4930: 20 6f 73 47 65 74 44 69 73 6b 46 72 65 65 53 70   osGetDiskFreeSp
4940: 61 63 65 57 20 28 28 42 4f 4f 4c 28 57 49 4e 41  aceW ((BOOL(WINA
4950: 50 49 2a 29 28 4c 50 43 57 53 54 52 2c 4c 50 44  PI*)(LPCWSTR,LPD
4960: 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 4c 50 44  WORD,LPDWORD,LPD
4970: 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20  WORD, \.        
4980: 4c 50 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c  LPDWORD))aSyscal
4990: 6c 5b 31 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[19].pCurrent).
49a0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
49b0: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
49c0: 53 49 29 0a 20 20 7b 20 22 47 65 74 46 69 6c 65  SI).  { "GetFile
49d0: 41 74 74 72 69 62 75 74 65 73 41 22 2c 20 20 20  AttributesA",   
49e0: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 46     (SYSCALL)GetF
49f0: 69 6c 65 41 74 74 72 69 62 75 74 65 73 41 2c 20  ileAttributesA, 
4a00: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
4a10: 20 20 7b 20 22 47 65 74 46 69 6c 65 41 74 74 72    { "GetFileAttr
4a20: 69 62 75 74 65 73 41 22 2c 20 20 20 20 20 20 28  ibutesA",      (
4a30: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
4a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a50: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
4a60: 65 66 69 6e 65 20 6f 73 47 65 74 46 69 6c 65 41  efine osGetFileA
4a70: 74 74 72 69 62 75 74 65 73 41 20 28 28 44 57 4f  ttributesA ((DWO
4a80: 52 44 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 53  RD(WINAPI*)(LPCS
4a90: 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 32 30 5d  TR))aSyscall[20]
4aa0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
4ab0: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
4ac0: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
4ad0: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
4ae0: 45 29 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 41  E).  { "GetFileA
4af0: 74 74 72 69 62 75 74 65 73 57 22 2c 20 20 20 20  ttributesW",    
4b00: 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 46 69    (SYSCALL)GetFi
4b10: 6c 65 41 74 74 72 69 62 75 74 65 73 57 2c 20 20  leAttributesW,  
4b20: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
4b30: 20 7b 20 22 47 65 74 46 69 6c 65 41 74 74 72 69   { "GetFileAttri
4b40: 62 75 74 65 73 57 22 2c 20 20 20 20 20 20 28 53  butesW",      (S
4b50: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
4b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b70: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
4b80: 66 69 6e 65 20 6f 73 47 65 74 46 69 6c 65 41 74  fine osGetFileAt
4b90: 74 72 69 62 75 74 65 73 57 20 28 28 44 57 4f 52  tributesW ((DWOR
4ba0: 44 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53  D(WINAPI*)(LPCWS
4bb0: 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 32 31 5d  TR))aSyscall[21]
4bc0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
4bd0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
4be0: 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20  IN32_HAS_WIDE). 
4bf0: 20 7b 20 22 47 65 74 46 69 6c 65 41 74 74 72 69   { "GetFileAttri
4c00: 62 75 74 65 73 45 78 57 22 2c 20 20 20 20 28 53  butesExW",    (S
4c10: 59 53 43 41 4c 4c 29 47 65 74 46 69 6c 65 41 74  YSCALL)GetFileAt
4c20: 74 72 69 62 75 74 65 73 45 78 57 2c 20 20 20 20  tributesExW,    
4c30: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
4c40: 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
4c50: 73 45 78 57 22 2c 20 20 20 20 28 53 59 53 43 41  sExW",    (SYSCA
4c60: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
4c70: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
4c80: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
4c90: 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62   osGetFileAttrib
4ca0: 75 74 65 73 45 78 57 20 28 28 42 4f 4f 4c 28 57  utesExW ((BOOL(W
4cb0: 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52 2c  INAPI*)(LPCWSTR,
4cc0: 47 45 54 5f 46 49 4c 45 45 58 5f 49 4e 46 4f 5f  GET_FILEEX_INFO_
4cd0: 4c 45 56 45 4c 53 2c 20 5c 0a 20 20 20 20 20 20  LEVELS, \.      
4ce0: 20 20 4c 50 56 4f 49 44 29 29 61 53 79 73 63 61    LPVOID))aSysca
4cf0: 6c 6c 5b 32 32 5d 2e 70 43 75 72 72 65 6e 74 29  ll[22].pCurrent)
4d00: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
4d10: 5f 57 49 4e 52 54 0a 20 20 7b 20 22 47 65 74 46  _WINRT.  { "GetF
4d20: 69 6c 65 53 69 7a 65 22 2c 20 20 20 20 20 20 20  ileSize",       
4d30: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47        (SYSCALL)G
4d40: 65 74 46 69 6c 65 53 69 7a 65 2c 20 20 20 20 20  etFileSize,     
4d50: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
4d60: 73 65 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 53  se.  { "GetFileS
4d70: 69 7a 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ize",           
4d80: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
4d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4da0: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
4db0: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 46 69  .#define osGetFi
4dc0: 6c 65 53 69 7a 65 20 28 28 44 57 4f 52 44 28 57  leSize ((DWORD(W
4dd0: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c  INAPI*)(HANDLE,L
4de0: 50 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c  PDWORD))aSyscall
4df0: 5b 32 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [23].pCurrent)..
4e00: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
4e10: 49 4e 43 45 20 26 26 20 64 65 66 69 6e 65 64 28  INCE && defined(
4e20: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
4e30: 5f 41 4e 53 49 29 0a 20 20 7b 20 22 47 65 74 46  _ANSI).  { "GetF
4e40: 75 6c 6c 50 61 74 68 4e 61 6d 65 41 22 2c 20 20  ullPathNameA",  
4e50: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47        (SYSCALL)G
4e60: 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41 2c  etFullPathNameA,
4e70: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
4e80: 73 65 0a 20 20 7b 20 22 47 65 74 46 75 6c 6c 50  se.  { "GetFullP
4e90: 61 74 68 4e 61 6d 65 41 22 2c 20 20 20 20 20 20  athNameA",      
4ea0: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
4eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ec0: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
4ed0: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 46 75  .#define osGetFu
4ee0: 6c 6c 50 61 74 68 4e 61 6d 65 41 20 28 28 44 57  llPathNameA ((DW
4ef0: 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 4c 50 43  ORD(WINAPI*)(LPC
4f00: 53 54 52 2c 44 57 4f 52 44 2c 4c 50 53 54 52 2c  STR,DWORD,LPSTR,
4f10: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 53 54 52   \.        LPSTR
4f20: 2a 29 29 61 53 79 73 63 61 6c 6c 5b 32 34 5d 2e  *))aSyscall[24].
4f30: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
4f40: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
4f50: 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  && !SQLITE_OS_WI
4f60: 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53  NRT && defined(S
4f70: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
4f80: 57 49 44 45 29 0a 20 20 7b 20 22 47 65 74 46 75  WIDE).  { "GetFu
4f90: 6c 6c 50 61 74 68 4e 61 6d 65 57 22 2c 20 20 20  llPathNameW",   
4fa0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65       (SYSCALL)Ge
4fb0: 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57 2c 20  tFullPathNameW, 
4fc0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
4fd0: 65 0a 20 20 7b 20 22 47 65 74 46 75 6c 6c 50 61  e.  { "GetFullPa
4fe0: 74 68 4e 61 6d 65 57 22 2c 20 20 20 20 20 20 20  thNameW",       
4ff0: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
5000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5010: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
5020: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 46 75 6c  #define osGetFul
5030: 6c 50 61 74 68 4e 61 6d 65 57 20 28 28 44 57 4f  lPathNameW ((DWO
5040: 52 44 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57  RD(WINAPI*)(LPCW
5050: 53 54 52 2c 44 57 4f 52 44 2c 4c 50 57 53 54 52  STR,DWORD,LPWSTR
5060: 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 57 53  , \.        LPWS
5070: 54 52 2a 29 29 61 53 79 73 63 61 6c 6c 5b 32 35  TR*))aSyscall[25
5080: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
5090: 20 22 47 65 74 4c 61 73 74 45 72 72 6f 72 22 2c   "GetLastError",
50a0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
50b0: 43 41 4c 4c 29 47 65 74 4c 61 73 74 45 72 72 6f  CALL)GetLastErro
50c0: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 30 20  r,            0 
50d0: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65  },..#define osGe
50e0: 74 4c 61 73 74 45 72 72 6f 72 20 28 28 44 57 4f  tLastError ((DWO
50f0: 52 44 28 57 49 4e 41 50 49 2a 29 28 56 4f 49 44  RD(WINAPI*)(VOID
5100: 29 29 61 53 79 73 63 61 6c 6c 5b 32 36 5d 2e 70  ))aSyscall[26].p
5110: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 64  Current)..#if !d
5120: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
5130: 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f  IT_LOAD_EXTENSIO
5140: 4e 29 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  N).#if SQLITE_OS
5150: 5f 57 49 4e 43 45 0a 20 20 2f 2a 20 54 68 65 20  _WINCE.  /* The 
5160: 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 41 28  GetProcAddressA(
5170: 29 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c  ) routine is onl
5180: 79 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 57  y available on W
5190: 69 6e 64 6f 77 73 20 43 45 2e 20 2a 2f 0a 20 20  indows CE. */.  
51a0: 7b 20 22 47 65 74 50 72 6f 63 41 64 64 72 65 73  { "GetProcAddres
51b0: 73 41 22 2c 20 20 20 20 20 20 20 20 20 28 53 59  sA",         (SY
51c0: 53 43 41 4c 4c 29 47 65 74 50 72 6f 63 41 64 64  SCALL)GetProcAdd
51d0: 72 65 73 73 41 2c 20 20 20 20 20 20 20 20 20 30  ressA,         0
51e0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 41   },.#else.  /* A
51f0: 6c 6c 20 6f 74 68 65 72 20 57 69 6e 64 6f 77 73  ll other Windows
5200: 20 70 6c 61 74 66 6f 72 6d 73 20 65 78 70 65 63   platforms expec
5210: 74 20 47 65 74 50 72 6f 63 41 64 64 72 65 73 73  t GetProcAddress
5220: 28 29 20 74 6f 20 74 61 6b 65 0a 20 20 2a 2a 20  () to take.  ** 
5230: 61 6e 20 41 4e 53 49 20 73 74 72 69 6e 67 20 72  an ANSI string r
5240: 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65  egardless of the
5250: 20 5f 55 4e 49 43 4f 44 45 20 73 65 74 74 69 6e   _UNICODE settin
5260: 67 20 2a 2f 0a 20 20 7b 20 22 47 65 74 50 72 6f  g */.  { "GetPro
5270: 63 41 64 64 72 65 73 73 41 22 2c 20 20 20 20 20  cAddressA",     
5280: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74      (SYSCALL)Get
5290: 50 72 6f 63 41 64 64 72 65 73 73 2c 20 20 20 20  ProcAddress,    
52a0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
52b0: 66 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74  f.#else.  { "Get
52c0: 50 72 6f 63 41 64 64 72 65 73 73 41 22 2c 20 20  ProcAddressA",  
52d0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
52e0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
52f0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
5300: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
5310: 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 41 20  GetProcAddressA 
5320: 28 28 46 41 52 50 52 4f 43 28 57 49 4e 41 50 49  ((FARPROC(WINAPI
5330: 2a 29 28 48 4d 4f 44 55 4c 45 2c 20 5c 0a 20 20  *)(HMODULE, \.  
5340: 20 20 20 20 20 20 4c 50 43 53 54 52 29 29 61 53        LPCSTR))aS
5350: 79 73 63 61 6c 6c 5b 32 37 5d 2e 70 43 75 72 72  yscall[27].pCurr
5360: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
5370: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22  E_OS_WINRT.  { "
5380: 47 65 74 53 79 73 74 65 6d 49 6e 66 6f 22 2c 20  GetSystemInfo", 
5390: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
53a0: 4c 4c 29 47 65 74 53 79 73 74 65 6d 49 6e 66 6f  LL)GetSystemInfo
53b0: 2c 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c  ,           0 },
53c0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 53  .#else.  { "GetS
53d0: 79 73 74 65 6d 49 6e 66 6f 22 2c 20 20 20 20 20  ystemInfo",     
53e0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
53f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
5400: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
5410: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47  dif..#define osG
5420: 65 74 53 79 73 74 65 6d 49 6e 66 6f 20 28 28 56  etSystemInfo ((V
5430: 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 4c 50 53  OID(WINAPI*)(LPS
5440: 59 53 54 45 4d 5f 49 4e 46 4f 29 29 61 53 79 73  YSTEM_INFO))aSys
5450: 63 61 6c 6c 5b 32 38 5d 2e 70 43 75 72 72 65 6e  call[28].pCurren
5460: 74 29 0a 0a 20 20 7b 20 22 47 65 74 53 79 73 74  t)..  { "GetSyst
5470: 65 6d 54 69 6d 65 22 2c 20 20 20 20 20 20 20 20  emTime",        
5480: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 53     (SYSCALL)GetS
5490: 79 73 74 65 6d 54 69 6d 65 2c 20 20 20 20 20 20  ystemTime,      
54a0: 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69       0 },..#defi
54b0: 6e 65 20 6f 73 47 65 74 53 79 73 74 65 6d 54 69  ne osGetSystemTi
54c0: 6d 65 20 28 28 56 4f 49 44 28 57 49 4e 41 50 49  me ((VOID(WINAPI
54d0: 2a 29 28 4c 50 53 59 53 54 45 4d 54 49 4d 45 29  *)(LPSYSTEMTIME)
54e0: 29 61 53 79 73 63 61 6c 6c 5b 32 39 5d 2e 70 43  )aSyscall[29].pC
54f0: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
5500: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
5510: 7b 20 22 47 65 74 53 79 73 74 65 6d 54 69 6d 65  { "GetSystemTime
5520: 41 73 46 69 6c 65 54 69 6d 65 22 2c 20 28 53 59  AsFileTime", (SY
5530: 53 43 41 4c 4c 29 47 65 74 53 79 73 74 65 6d 54  SCALL)GetSystemT
5540: 69 6d 65 41 73 46 69 6c 65 54 69 6d 65 2c 20 30  imeAsFileTime, 0
5550: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47   },.#else.  { "G
5560: 65 74 53 79 73 74 65 6d 54 69 6d 65 41 73 46 69  etSystemTimeAsFi
5570: 6c 65 54 69 6d 65 22 2c 20 28 53 59 53 43 41 4c  leTime", (SYSCAL
5580: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
5590: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
55a0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
55b0: 6f 73 47 65 74 53 79 73 74 65 6d 54 69 6d 65 41  osGetSystemTimeA
55c0: 73 46 69 6c 65 54 69 6d 65 20 28 28 56 4f 49 44  sFileTime ((VOID
55d0: 28 57 49 4e 41 50 49 2a 29 28 20 5c 0a 20 20 20  (WINAPI*)( \.   
55e0: 20 20 20 20 20 4c 50 46 49 4c 45 54 49 4d 45 29       LPFILETIME)
55f0: 29 61 53 79 73 63 61 6c 6c 5b 33 30 5d 2e 70 43  )aSyscall[30].pC
5600: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66  urrent)..#if def
5610: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
5620: 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20  2_HAS_ANSI).  { 
5630: 22 47 65 74 54 65 6d 70 50 61 74 68 41 22 2c 20  "GetTempPathA", 
5640: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
5650: 41 4c 4c 29 47 65 74 54 65 6d 70 50 61 74 68 41  ALL)GetTempPathA
5660: 2c 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d  ,            0 }
5670: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74  ,.#else.  { "Get
5680: 54 65 6d 70 50 61 74 68 41 22 2c 20 20 20 20 20  TempPathA",     
5690: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
56a0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
56b0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
56c0: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
56d0: 47 65 74 54 65 6d 70 50 61 74 68 41 20 28 28 44  GetTempPathA ((D
56e0: 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 44 57  WORD(WINAPI*)(DW
56f0: 4f 52 44 2c 4c 50 53 54 52 29 29 61 53 79 73 63  ORD,LPSTR))aSysc
5700: 61 6c 6c 5b 33 31 5d 2e 70 43 75 72 72 65 6e 74  all[31].pCurrent
5710: 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  )..#if !SQLITE_O
5720: 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e  S_WINRT && defin
5730: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
5740: 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 47  HAS_WIDE).  { "G
5750: 65 74 54 65 6d 70 50 61 74 68 57 22 2c 20 20 20  etTempPathW",   
5760: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
5770: 4c 29 47 65 74 54 65 6d 70 50 61 74 68 57 2c 20  L)GetTempPathW, 
5780: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
5790: 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 54 65  #else.  { "GetTe
57a0: 6d 70 50 61 74 68 57 22 2c 20 20 20 20 20 20 20  mpPathW",       
57b0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
57c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
57d0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
57e0: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65  if..#define osGe
57f0: 74 54 65 6d 70 50 61 74 68 57 20 28 28 44 57 4f  tTempPathW ((DWO
5800: 52 44 28 57 49 4e 41 50 49 2a 29 28 44 57 4f 52  RD(WINAPI*)(DWOR
5810: 44 2c 4c 50 57 53 54 52 29 29 61 53 79 73 63 61  D,LPWSTR))aSysca
5820: 6c 6c 5b 33 32 5d 2e 70 43 75 72 72 65 6e 74 29  ll[32].pCurrent)
5830: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
5840: 5f 57 49 4e 52 54 0a 20 20 7b 20 22 47 65 74 54  _WINRT.  { "GetT
5850: 69 63 6b 43 6f 75 6e 74 22 2c 20 20 20 20 20 20  ickCount",      
5860: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47        (SYSCALL)G
5870: 65 74 54 69 63 6b 43 6f 75 6e 74 2c 20 20 20 20  etTickCount,    
5880: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
5890: 73 65 0a 20 20 7b 20 22 47 65 74 54 69 63 6b 43  se.  { "GetTickC
58a0: 6f 75 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20  ount",          
58b0: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
58c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
58d0: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
58e0: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 54 69  .#define osGetTi
58f0: 63 6b 43 6f 75 6e 74 20 28 28 44 57 4f 52 44 28  ckCount ((DWORD(
5900: 57 49 4e 41 50 49 2a 29 28 56 4f 49 44 29 29 61  WINAPI*)(VOID))a
5910: 53 79 73 63 61 6c 6c 5b 33 33 5d 2e 70 43 75 72  Syscall[33].pCur
5920: 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e  rent)..#if defin
5930: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
5940: 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 47  HAS_ANSI).  { "G
5950: 65 74 56 65 72 73 69 6f 6e 45 78 41 22 2c 20 20  etVersionExA",  
5960: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
5970: 4c 29 47 65 74 56 65 72 73 69 6f 6e 45 78 41 2c  L)GetVersionExA,
5980: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
5990: 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 56 65  #else.  { "GetVe
59a0: 72 73 69 6f 6e 45 78 41 22 2c 20 20 20 20 20 20  rsionExA",      
59b0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
59c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
59d0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
59e0: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65  if..#define osGe
59f0: 74 56 65 72 73 69 6f 6e 45 78 41 20 28 28 42 4f  tVersionExA ((BO
5a00: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 20 5c 0a 20  OL(WINAPI*)( \. 
5a10: 20 20 20 20 20 20 20 4c 50 4f 53 56 45 52 53 49         LPOSVERSI
5a20: 4f 4e 49 4e 46 4f 41 29 29 61 53 79 73 63 61 6c  ONINFOA))aSyscal
5a30: 6c 5b 33 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[34].pCurrent).
5a40: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
5a50: 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64  WINRT && defined
5a60: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
5a70: 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 47 65 74  S_WIDE).  { "Get
5a80: 56 65 72 73 69 6f 6e 45 78 57 22 2c 20 20 20 20  VersionExW",    
5a90: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
5aa0: 47 65 74 56 65 72 73 69 6f 6e 45 78 57 2c 20 20  GetVersionExW,  
5ab0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
5ac0: 6c 73 65 0a 20 20 7b 20 22 47 65 74 56 65 72 73  lse.  { "GetVers
5ad0: 69 6f 6e 45 78 57 22 2c 20 20 20 20 20 20 20 20  ionExW",        
5ae0: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
5af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b00: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
5b10: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 56  ..#define osGetV
5b20: 65 72 73 69 6f 6e 45 78 57 20 28 28 42 4f 4f 4c  ersionExW ((BOOL
5b30: 28 57 49 4e 41 50 49 2a 29 28 20 5c 0a 20 20 20  (WINAPI*)( \.   
5b40: 20 20 20 20 20 4c 50 4f 53 56 45 52 53 49 4f 4e       LPOSVERSION
5b50: 49 4e 46 4f 57 29 29 61 53 79 73 63 61 6c 6c 5b  INFOW))aSyscall[
5b60: 33 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  35].pCurrent).. 
5b70: 20 7b 20 22 48 65 61 70 41 6c 6c 6f 63 22 2c 20   { "HeapAlloc", 
5b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
5b90: 59 53 43 41 4c 4c 29 48 65 61 70 41 6c 6c 6f 63  YSCALL)HeapAlloc
5ba0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
5bb0: 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73  0 },..#define os
5bc0: 48 65 61 70 41 6c 6c 6f 63 20 28 28 4c 50 56 4f  HeapAlloc ((LPVO
5bd0: 49 44 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44  ID(WINAPI*)(HAND
5be0: 4c 45 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20  LE,DWORD, \.    
5bf0: 20 20 20 20 53 49 5a 45 5f 54 29 29 61 53 79 73      SIZE_T))aSys
5c00: 63 61 6c 6c 5b 33 36 5d 2e 70 43 75 72 72 65 6e  call[36].pCurren
5c10: 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  t)..#if !SQLITE_
5c20: 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 48 65  OS_WINRT.  { "He
5c30: 61 70 43 72 65 61 74 65 22 2c 20 20 20 20 20 20  apCreate",      
5c40: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
5c50: 29 48 65 61 70 43 72 65 61 74 65 2c 20 20 20 20  )HeapCreate,    
5c60: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
5c70: 65 6c 73 65 0a 20 20 7b 20 22 48 65 61 70 43 72  else.  { "HeapCr
5c80: 65 61 74 65 22 2c 20 20 20 20 20 20 20 20 20 20  eate",          
5c90: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
5ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5cb0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
5cc0: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 61  f..#define osHea
5cd0: 70 43 72 65 61 74 65 20 28 28 48 41 4e 44 4c 45  pCreate ((HANDLE
5ce0: 28 57 49 4e 41 50 49 2a 29 28 44 57 4f 52 44 2c  (WINAPI*)(DWORD,
5cf0: 53 49 5a 45 5f 54 2c 20 5c 0a 20 20 20 20 20 20  SIZE_T, \.      
5d00: 20 20 53 49 5a 45 5f 54 29 29 61 53 79 73 63 61    SIZE_T))aSysca
5d10: 6c 6c 5b 33 37 5d 2e 70 43 75 72 72 65 6e 74 29  ll[37].pCurrent)
5d20: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
5d30: 5f 57 49 4e 52 54 0a 20 20 7b 20 22 48 65 61 70  _WINRT.  { "Heap
5d40: 44 65 73 74 72 6f 79 22 2c 20 20 20 20 20 20 20  Destroy",       
5d50: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48        (SYSCALL)H
5d60: 65 61 70 44 65 73 74 72 6f 79 2c 20 20 20 20 20  eapDestroy,     
5d70: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
5d80: 73 65 0a 20 20 7b 20 22 48 65 61 70 44 65 73 74  se.  { "HeapDest
5d90: 72 6f 79 22 2c 20 20 20 20 20 20 20 20 20 20 20  roy",           
5da0: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
5db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5dc0: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
5dd0: 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 61 70 44  .#define osHeapD
5de0: 65 73 74 72 6f 79 20 28 28 42 4f 4f 4c 28 57 49  estroy ((BOOL(WI
5df0: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 29 29 61  NAPI*)(HANDLE))a
5e00: 53 79 73 63 61 6c 6c 5b 33 38 5d 2e 70 43 75 72  Syscall[38].pCur
5e10: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 48 65 61 70  rent)..  { "Heap
5e20: 46 72 65 65 22 2c 20 20 20 20 20 20 20 20 20 20  Free",          
5e30: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48        (SYSCALL)H
5e40: 65 61 70 46 72 65 65 2c 20 20 20 20 20 20 20 20  eapFree,        
5e50: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64          0 },..#d
5e60: 65 66 69 6e 65 20 6f 73 48 65 61 70 46 72 65 65  efine osHeapFree
5e70: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
5e80: 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 4c 50  (HANDLE,DWORD,LP
5e90: 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 33  VOID))aSyscall[3
5ea0: 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  9].pCurrent)..  
5eb0: 7b 20 22 48 65 61 70 52 65 41 6c 6c 6f 63 22 2c  { "HeapReAlloc",
5ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
5ed0: 53 43 41 4c 4c 29 48 65 61 70 52 65 41 6c 6c 6f  SCALL)HeapReAllo
5ee0: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30  c,             0
5ef0: 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48   },..#define osH
5f00: 65 61 70 52 65 41 6c 6c 6f 63 20 28 28 4c 50 56  eapReAlloc ((LPV
5f10: 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  OID(WINAPI*)(HAN
5f20: 44 4c 45 2c 44 57 4f 52 44 2c 4c 50 56 4f 49 44  DLE,DWORD,LPVOID
5f30: 2c 20 5c 0a 20 20 20 20 20 20 20 20 53 49 5a 45  , \.        SIZE
5f40: 5f 54 29 29 61 53 79 73 63 61 6c 6c 5b 34 30 5d  _T))aSyscall[40]
5f50: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
5f60: 22 48 65 61 70 53 69 7a 65 22 2c 20 20 20 20 20  "HeapSize",     
5f70: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
5f80: 41 4c 4c 29 48 65 61 70 53 69 7a 65 2c 20 20 20  ALL)HeapSize,   
5f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
5fa0: 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 61  ,..#define osHea
5fb0: 70 53 69 7a 65 20 28 28 53 49 5a 45 5f 54 28 57  pSize ((SIZE_T(W
5fc0: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44  INAPI*)(HANDLE,D
5fd0: 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20  WORD, \.        
5fe0: 4c 50 43 56 4f 49 44 29 29 61 53 79 73 63 61 6c  LPCVOID))aSyscal
5ff0: 6c 5b 34 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[41].pCurrent).
6000: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
6010: 57 49 4e 52 54 0a 20 20 7b 20 22 48 65 61 70 56  WINRT.  { "HeapV
6020: 61 6c 69 64 61 74 65 22 2c 20 20 20 20 20 20 20  alidate",       
6030: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65       (SYSCALL)He
6040: 61 70 56 61 6c 69 64 61 74 65 2c 20 20 20 20 20  apValidate,     
6050: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
6060: 65 0a 20 20 7b 20 22 48 65 61 70 56 61 6c 69 64  e.  { "HeapValid
6070: 61 74 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ate",           
6080: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
6090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
60a0: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
60b0: 23 64 65 66 69 6e 65 20 6f 73 48 65 61 70 56 61  #define osHeapVa
60c0: 6c 69 64 61 74 65 20 28 28 42 4f 4f 4c 28 57 49  lidate ((BOOL(WI
60d0: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57  NAPI*)(HANDLE,DW
60e0: 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c  ORD, \.        L
60f0: 50 43 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c  PCVOID))aSyscall
6100: 5b 34 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [42].pCurrent)..
6110: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
6120: 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f  INCE && !SQLITE_
6130: 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 48 65  OS_WINRT.  { "He
6140: 61 70 43 6f 6d 70 61 63 74 22 2c 20 20 20 20 20  apCompact",     
6150: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
6160: 29 48 65 61 70 43 6f 6d 70 61 63 74 2c 20 20 20  )HeapCompact,   
6170: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
6180: 65 6c 73 65 0a 20 20 7b 20 22 48 65 61 70 43 6f  else.  { "HeapCo
6190: 6d 70 61 63 74 22 2c 20 20 20 20 20 20 20 20 20  mpact",         
61a0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
61b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
61c0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
61d0: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 61  f..#define osHea
61e0: 70 43 6f 6d 70 61 63 74 20 28 28 55 49 4e 54 28  pCompact ((UINT(
61f0: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c  WINAPI*)(HANDLE,
6200: 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b  DWORD))aSyscall[
6210: 34 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  43].pCurrent)..#
6220: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
6230: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
6240: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
6250: 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45  LITE_OMIT_LOAD_E
6260: 58 54 45 4e 53 49 4f 4e 29 0a 20 20 7b 20 22 4c  XTENSION).  { "L
6270: 6f 61 64 4c 69 62 72 61 72 79 41 22 2c 20 20 20  oadLibraryA",   
6280: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
6290: 4c 29 4c 6f 61 64 4c 69 62 72 61 72 79 41 2c 20  L)LoadLibraryA, 
62a0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
62b0: 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 61 64 4c  #else.  { "LoadL
62c0: 69 62 72 61 72 79 41 22 2c 20 20 20 20 20 20 20  ibraryA",       
62d0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
62e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
62f0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
6300: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4c 6f  if..#define osLo
6310: 61 64 4c 69 62 72 61 72 79 41 20 28 28 48 4d 4f  adLibraryA ((HMO
6320: 44 55 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50  DULE(WINAPI*)(LP
6330: 43 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 34  CSTR))aSyscall[4
6340: 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  4].pCurrent)..#i
6350: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
6360: 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  RT && defined(SQ
6370: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57  LITE_WIN32_HAS_W
6380: 49 44 45 29 20 26 26 20 5c 0a 20 20 20 20 20 20  IDE) && \.      
6390: 20 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54    !defined(SQLIT
63a0: 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45  E_OMIT_LOAD_EXTE
63b0: 4e 53 49 4f 4e 29 0a 20 20 7b 20 22 4c 6f 61 64  NSION).  { "Load
63c0: 4c 69 62 72 61 72 79 57 22 2c 20 20 20 20 20 20  LibraryW",      
63d0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4c        (SYSCALL)L
63e0: 6f 61 64 4c 69 62 72 61 72 79 57 2c 20 20 20 20  oadLibraryW,    
63f0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
6400: 73 65 0a 20 20 7b 20 22 4c 6f 61 64 4c 69 62 72  se.  { "LoadLibr
6410: 61 72 79 57 22 2c 20 20 20 20 20 20 20 20 20 20  aryW",          
6420: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
6430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6440: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
6450: 0a 23 64 65 66 69 6e 65 20 6f 73 4c 6f 61 64 4c  .#define osLoadL
6460: 69 62 72 61 72 79 57 20 28 28 48 4d 4f 44 55 4c  ibraryW ((HMODUL
6470: 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53  E(WINAPI*)(LPCWS
6480: 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 34 35 5d  TR))aSyscall[45]
6490: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
64a0: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
64b0: 0a 20 20 7b 20 22 4c 6f 63 61 6c 46 72 65 65 22  .  { "LocalFree"
64c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
64d0: 28 53 59 53 43 41 4c 4c 29 4c 6f 63 61 6c 46 72  (SYSCALL)LocalFr
64e0: 65 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ee,             
64f0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
6500: 20 22 4c 6f 63 61 6c 46 72 65 65 22 2c 20 20 20   "LocalFree",   
6510: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
6520: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
6530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
6540: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
6550: 6e 65 20 6f 73 4c 6f 63 61 6c 46 72 65 65 20 28  ne osLocalFree (
6560: 28 48 4c 4f 43 41 4c 28 57 49 4e 41 50 49 2a 29  (HLOCAL(WINAPI*)
6570: 28 48 4c 4f 43 41 4c 29 29 61 53 79 73 63 61 6c  (HLOCAL))aSyscal
6580: 6c 5b 34 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[46].pCurrent).
6590: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
65a0: 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45  WINCE && !SQLITE
65b0: 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 4c  _OS_WINRT.  { "L
65c0: 6f 63 6b 46 69 6c 65 22 2c 20 20 20 20 20 20 20  ockFile",       
65d0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
65e0: 4c 29 4c 6f 63 6b 46 69 6c 65 2c 20 20 20 20 20  L)LockFile,     
65f0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
6600: 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 63 6b 46  #else.  { "LockF
6610: 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ile",           
6620: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
6630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6640: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
6650: 69 66 0a 0a 23 69 66 6e 64 65 66 20 6f 73 4c 6f  if..#ifndef osLo
6660: 63 6b 46 69 6c 65 0a 23 64 65 66 69 6e 65 20 6f  ckFile.#define o
6670: 73 4c 6f 63 6b 46 69 6c 65 20 28 28 42 4f 4f 4c  sLockFile ((BOOL
6680: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
6690: 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f  ,DWORD,DWORD,DWO
66a0: 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57  RD, \.        DW
66b0: 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 34 37  ORD))aSyscall[47
66c0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 23 65 6e 64  ].pCurrent).#end
66d0: 69 66 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  if..#if !SQLITE_
66e0: 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 4c 6f  OS_WINCE.  { "Lo
66f0: 63 6b 46 69 6c 65 45 78 22 2c 20 20 20 20 20 20  ckFileEx",      
6700: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
6710: 29 4c 6f 63 6b 46 69 6c 65 45 78 2c 20 20 20 20  )LockFileEx,    
6720: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
6730: 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 63 6b 46 69  else.  { "LockFi
6740: 6c 65 45 78 22 2c 20 20 20 20 20 20 20 20 20 20  leEx",          
6750: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
6760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6770: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
6780: 66 0a 0a 23 69 66 6e 64 65 66 20 6f 73 4c 6f 63  f..#ifndef osLoc
6790: 6b 46 69 6c 65 45 78 0a 23 64 65 66 69 6e 65 20  kFileEx.#define 
67a0: 6f 73 4c 6f 63 6b 46 69 6c 65 45 78 20 28 28 42  osLockFileEx ((B
67b0: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  OOL(WINAPI*)(HAN
67c0: 44 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c  DLE,DWORD,DWORD,
67d0: 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20  DWORD,DWORD, \. 
67e0: 20 20 20 20 20 20 20 4c 50 4f 56 45 52 4c 41 50         LPOVERLAP
67f0: 50 45 44 29 29 61 53 79 73 63 61 6c 6c 5b 34 38  PED))aSyscall[48
6800: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 23 65 6e 64  ].pCurrent).#end
6810: 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  if..#if SQLITE_O
6820: 53 5f 57 49 4e 43 45 20 7c 7c 20 28 21 53 51 4c  S_WINCE || (!SQL
6830: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20  ITE_OS_WINRT && 
6840: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
6850: 4f 4d 49 54 5f 57 41 4c 29 29 0a 20 20 7b 20 22  OMIT_WAL)).  { "
6860: 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 22 2c 20  MapViewOfFile", 
6870: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
6880: 4c 4c 29 4d 61 70 56 69 65 77 4f 66 46 69 6c 65  LL)MapViewOfFile
6890: 2c 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c  ,           0 },
68a0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4d 61 70 56  .#else.  { "MapV
68b0: 69 65 77 4f 66 46 69 6c 65 22 2c 20 20 20 20 20  iewOfFile",     
68c0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
68d0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
68e0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
68f0: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4d  dif..#define osM
6900: 61 70 56 69 65 77 4f 66 46 69 6c 65 20 28 28 4c  apViewOfFile ((L
6910: 50 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 48  PVOID(WINAPI*)(H
6920: 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52  ANDLE,DWORD,DWOR
6930: 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20  D,DWORD, \.     
6940: 20 20 20 53 49 5a 45 5f 54 29 29 61 53 79 73 63     SIZE_T))aSysc
6950: 61 6c 6c 5b 34 39 5d 2e 70 43 75 72 72 65 6e 74  all[49].pCurrent
6960: 29 0a 0a 20 20 7b 20 22 4d 75 6c 74 69 42 79 74  )..  { "MultiByt
6970: 65 54 6f 57 69 64 65 43 68 61 72 22 2c 20 20 20  eToWideChar",   
6980: 20 20 28 53 59 53 43 41 4c 4c 29 4d 75 6c 74 69    (SYSCALL)Multi
6990: 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 2c 20  ByteToWideChar, 
69a0: 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e      0 },..#defin
69b0: 65 20 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f 57  e osMultiByteToW
69c0: 69 64 65 43 68 61 72 20 28 28 69 6e 74 28 57 49  ideChar ((int(WI
69d0: 4e 41 50 49 2a 29 28 55 49 4e 54 2c 44 57 4f 52  NAPI*)(UINT,DWOR
69e0: 44 2c 4c 50 43 53 54 52 2c 69 6e 74 2c 4c 50 57  D,LPCSTR,int,LPW
69f0: 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 69  STR, \.        i
6a00: 6e 74 29 29 61 53 79 73 63 61 6c 6c 5b 35 30 5d  nt))aSyscall[50]
6a10: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
6a20: 22 51 75 65 72 79 50 65 72 66 6f 72 6d 61 6e 63  "QueryPerformanc
6a30: 65 43 6f 75 6e 74 65 72 22 2c 20 28 53 59 53 43  eCounter", (SYSC
6a40: 41 4c 4c 29 51 75 65 72 79 50 65 72 66 6f 72 6d  ALL)QueryPerform
6a50: 61 6e 63 65 43 6f 75 6e 74 65 72 2c 20 30 20 7d  anceCounter, 0 }
6a60: 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 51 75 65  ,..#define osQue
6a70: 72 79 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f 75  ryPerformanceCou
6a80: 6e 74 65 72 20 28 28 42 4f 4f 4c 28 57 49 4e 41  nter ((BOOL(WINA
6a90: 50 49 2a 29 28 20 5c 0a 20 20 20 20 20 20 20 20  PI*)( \.        
6aa0: 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 2a 29 29  LARGE_INTEGER*))
6ab0: 61 53 79 73 63 61 6c 6c 5b 35 31 5d 2e 70 43 75  aSyscall[51].pCu
6ac0: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 52 65 61  rrent)..  { "Rea
6ad0: 64 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20  dFile",         
6ae0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
6af0: 52 65 61 64 46 69 6c 65 2c 20 20 20 20 20 20 20  ReadFile,       
6b00: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23           0 },..#
6b10: 64 65 66 69 6e 65 20 6f 73 52 65 61 64 46 69 6c  define osReadFil
6b20: 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  e ((BOOL(WINAPI*
6b30: 29 28 48 41 4e 44 4c 45 2c 4c 50 56 4f 49 44 2c  )(HANDLE,LPVOID,
6b40: 44 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 20 5c  DWORD,LPDWORD, \
6b50: 0a 20 20 20 20 20 20 20 20 4c 50 4f 56 45 52 4c  .        LPOVERL
6b60: 41 50 50 45 44 29 29 61 53 79 73 63 61 6c 6c 5b  APPED))aSyscall[
6b70: 35 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  52].pCurrent).. 
6b80: 20 7b 20 22 53 65 74 45 6e 64 4f 66 46 69 6c 65   { "SetEndOfFile
6b90: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ",            (S
6ba0: 59 53 43 41 4c 4c 29 53 65 74 45 6e 64 4f 66 46  YSCALL)SetEndOfF
6bb0: 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ile,            
6bc0: 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73  0 },..#define os
6bd0: 53 65 74 45 6e 64 4f 66 46 69 6c 65 20 28 28 42  SetEndOfFile ((B
6be0: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  OOL(WINAPI*)(HAN
6bf0: 44 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 35 33  DLE))aSyscall[53
6c00: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
6c10: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
6c20: 54 0a 20 20 7b 20 22 53 65 74 46 69 6c 65 50 6f  T.  { "SetFilePo
6c30: 69 6e 74 65 72 22 2c 20 20 20 20 20 20 20 20 20  inter",         
6c40: 20 28 53 59 53 43 41 4c 4c 29 53 65 74 46 69 6c   (SYSCALL)SetFil
6c50: 65 50 6f 69 6e 74 65 72 2c 20 20 20 20 20 20 20  ePointer,       
6c60: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
6c70: 7b 20 22 53 65 74 46 69 6c 65 50 6f 69 6e 74 65  { "SetFilePointe
6c80: 72 22 2c 20 20 20 20 20 20 20 20 20 20 28 53 59  r",          (SY
6c90: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
6ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
6cb0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
6cc0: 69 6e 65 20 6f 73 53 65 74 46 69 6c 65 50 6f 69  ine osSetFilePoi
6cd0: 6e 74 65 72 20 28 28 44 57 4f 52 44 28 57 49 4e  nter ((DWORD(WIN
6ce0: 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 4f 4e  API*)(HANDLE,LON
6cf0: 47 2c 50 4c 4f 4e 47 2c 20 5c 0a 20 20 20 20 20  G,PLONG, \.     
6d00: 20 20 20 44 57 4f 52 44 29 29 61 53 79 73 63 61     DWORD))aSysca
6d10: 6c 6c 5b 35 34 5d 2e 70 43 75 72 72 65 6e 74 29  ll[54].pCurrent)
6d20: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
6d30: 5f 57 49 4e 52 54 0a 20 20 7b 20 22 53 6c 65 65  _WINRT.  { "Slee
6d40: 70 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  p",             
6d50: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 53        (SYSCALL)S
6d60: 6c 65 65 70 2c 20 20 20 20 20 20 20 20 20 20 20  leep,           
6d70: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
6d80: 73 65 0a 20 20 7b 20 22 53 6c 65 65 70 22 2c 20  se.  { "Sleep", 
6d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6da0: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
6db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6dc0: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
6dd0: 0a 23 64 65 66 69 6e 65 20 6f 73 53 6c 65 65 70  .#define osSleep
6de0: 20 28 28 56 4f 49 44 28 57 49 4e 41 50 49 2a 29   ((VOID(WINAPI*)
6df0: 28 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c  (DWORD))aSyscall
6e00: 5b 35 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [55].pCurrent)..
6e10: 20 20 7b 20 22 53 79 73 74 65 6d 54 69 6d 65 54    { "SystemTimeT
6e20: 6f 46 69 6c 65 54 69 6d 65 22 2c 20 20 20 20 28  oFileTime",    (
6e30: 53 59 53 43 41 4c 4c 29 53 79 73 74 65 6d 54 69  SYSCALL)SystemTi
6e40: 6d 65 54 6f 46 69 6c 65 54 69 6d 65 2c 20 20 20  meToFileTime,   
6e50: 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f   0 },..#define o
6e60: 73 53 79 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c  sSystemTimeToFil
6e70: 65 54 69 6d 65 20 28 28 42 4f 4f 4c 28 57 49 4e  eTime ((BOOL(WIN
6e80: 41 50 49 2a 29 28 43 4f 4e 53 54 20 53 59 53 54  API*)(CONST SYST
6e90: 45 4d 54 49 4d 45 2a 2c 20 5c 0a 20 20 20 20 20  EMTIME*, \.     
6ea0: 20 20 20 4c 50 46 49 4c 45 54 49 4d 45 29 29 61     LPFILETIME))a
6eb0: 53 79 73 63 61 6c 6c 5b 35 36 5d 2e 70 43 75 72  Syscall[56].pCur
6ec0: 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49  rent)..#if !SQLI
6ed0: 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21  TE_OS_WINCE && !
6ee0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
6ef0: 20 20 7b 20 22 55 6e 6c 6f 63 6b 46 69 6c 65 22    { "UnlockFile"
6f00: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ,              (
6f10: 53 59 53 43 41 4c 4c 29 55 6e 6c 6f 63 6b 46 69  SYSCALL)UnlockFi
6f20: 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
6f30: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
6f40: 22 55 6e 6c 6f 63 6b 46 69 6c 65 22 2c 20 20 20  "UnlockFile",   
6f50: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
6f60: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
6f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
6f80: 2c 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  ,.#endif..#ifnde
6f90: 66 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 0a 23  f osUnlockFile.#
6fa0: 64 65 66 69 6e 65 20 6f 73 55 6e 6c 6f 63 6b 46  define osUnlockF
6fb0: 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  ile ((BOOL(WINAP
6fc0: 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44  I*)(HANDLE,DWORD
6fd0: 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a  ,DWORD,DWORD, \.
6fe0: 20 20 20 20 20 20 20 20 44 57 4f 52 44 29 29 61          DWORD))a
6ff0: 53 79 73 63 61 6c 6c 5b 35 37 5d 2e 70 43 75 72  Syscall[57].pCur
7000: 72 65 6e 74 29 0a 23 65 6e 64 69 66 0a 0a 23 69  rent).#endif..#i
7010: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
7020: 43 45 0a 20 20 7b 20 22 55 6e 6c 6f 63 6b 46 69  CE.  { "UnlockFi
7030: 6c 65 45 78 22 2c 20 20 20 20 20 20 20 20 20 20  leEx",          
7040: 20 20 28 53 59 53 43 41 4c 4c 29 55 6e 6c 6f 63    (SYSCALL)Unloc
7050: 6b 46 69 6c 65 45 78 2c 20 20 20 20 20 20 20 20  kFileEx,        
7060: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
7070: 20 7b 20 22 55 6e 6c 6f 63 6b 46 69 6c 65 45 78   { "UnlockFileEx
7080: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ",            (S
7090: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
70a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
70b0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
70c0: 66 69 6e 65 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c  fine osUnlockFil
70d0: 65 45 78 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  eEx ((BOOL(WINAP
70e0: 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44  I*)(HANDLE,DWORD
70f0: 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a  ,DWORD,DWORD, \.
7100: 20 20 20 20 20 20 20 20 4c 50 4f 56 45 52 4c 41          LPOVERLA
7110: 50 50 45 44 29 29 61 53 79 73 63 61 6c 6c 5b 35  PPED))aSyscall[5
7120: 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  8].pCurrent)..#i
7130: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
7140: 45 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  E || !defined(SQ
7150: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 0a 20  LITE_OMIT_WAL). 
7160: 20 7b 20 22 55 6e 6d 61 70 56 69 65 77 4f 66 46   { "UnmapViewOfF
7170: 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 28 53  ile",         (S
7180: 59 53 43 41 4c 4c 29 55 6e 6d 61 70 56 69 65 77  YSCALL)UnmapView
7190: 4f 66 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20  OfFile,         
71a0: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
71b0: 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 22  UnmapViewOfFile"
71c0: 2c 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41  ,         (SYSCA
71d0: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
71e0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
71f0: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
7200: 20 6f 73 55 6e 6d 61 70 56 69 65 77 4f 66 46 69   osUnmapViewOfFi
7210: 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  le ((BOOL(WINAPI
7220: 2a 29 28 4c 50 43 56 4f 49 44 29 29 61 53 79 73  *)(LPCVOID))aSys
7230: 63 61 6c 6c 5b 35 39 5d 2e 70 43 75 72 72 65 6e  call[59].pCurren
7240: 74 29 0a 0a 20 20 7b 20 22 57 69 64 65 43 68 61  t)..  { "WideCha
7250: 72 54 6f 4d 75 6c 74 69 42 79 74 65 22 2c 20 20  rToMultiByte",  
7260: 20 20 20 28 53 59 53 43 41 4c 4c 29 57 69 64 65     (SYSCALL)Wide
7270: 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 2c  CharToMultiByte,
7280: 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69       0 },..#defi
7290: 6e 65 20 6f 73 57 69 64 65 43 68 61 72 54 6f 4d  ne osWideCharToM
72a0: 75 6c 74 69 42 79 74 65 20 28 28 69 6e 74 28 57  ultiByte ((int(W
72b0: 49 4e 41 50 49 2a 29 28 55 49 4e 54 2c 44 57 4f  INAPI*)(UINT,DWO
72c0: 52 44 2c 4c 50 43 57 53 54 52 2c 69 6e 74 2c 4c  RD,LPCWSTR,int,L
72d0: 50 53 54 52 2c 69 6e 74 2c 20 5c 0a 20 20 20 20  PSTR,int, \.    
72e0: 20 20 20 20 4c 50 43 53 54 52 2c 4c 50 42 4f 4f      LPCSTR,LPBOO
72f0: 4c 29 29 61 53 79 73 63 61 6c 6c 5b 36 30 5d 2e  L))aSyscall[60].
7300: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
7310: 57 72 69 74 65 46 69 6c 65 22 2c 20 20 20 20 20  WriteFile",     
7320: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
7330: 4c 4c 29 57 72 69 74 65 46 69 6c 65 2c 20 20 20  LL)WriteFile,   
7340: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
7350: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 57 72 69 74  ..#define osWrit
7360: 65 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e  eFile ((BOOL(WIN
7370: 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 50 43  API*)(HANDLE,LPC
7380: 56 4f 49 44 2c 44 57 4f 52 44 2c 4c 50 44 57 4f  VOID,DWORD,LPDWO
7390: 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  RD, \.        LP
73a0: 4f 56 45 52 4c 41 50 50 45 44 29 29 61 53 79 73  OVERLAPPED))aSys
73b0: 63 61 6c 6c 5b 36 31 5d 2e 70 43 75 72 72 65 6e  call[61].pCurren
73c0: 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  t)..#if SQLITE_O
73d0: 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 43 72 65  S_WINRT.  { "Cre
73e0: 61 74 65 45 76 65 6e 74 45 78 57 22 2c 20 20 20  ateEventExW",   
73f0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
7400: 43 72 65 61 74 65 45 76 65 6e 74 45 78 57 2c 20  CreateEventExW, 
7410: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
7420: 6c 73 65 0a 20 20 7b 20 22 43 72 65 61 74 65 45  lse.  { "CreateE
7430: 76 65 6e 74 45 78 57 22 2c 20 20 20 20 20 20 20  ventExW",       
7440: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
7450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7460: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
7470: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65 61  ..#define osCrea
7480: 74 65 45 76 65 6e 74 45 78 57 20 28 28 48 41 4e  teEventExW ((HAN
7490: 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 53  DLE(WINAPI*)(LPS
74a0: 45 43 55 52 49 54 59 5f 41 54 54 52 49 42 55 54  ECURITY_ATTRIBUT
74b0: 45 53 2c 4c 50 43 57 53 54 52 2c 20 5c 0a 20 20  ES,LPCWSTR, \.  
74c0: 20 20 20 20 20 20 44 57 4f 52 44 2c 44 57 4f 52        DWORD,DWOR
74d0: 44 29 29 61 53 79 73 63 61 6c 6c 5b 36 32 5d 2e  D))aSyscall[62].
74e0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
74f0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
7500: 20 20 7b 20 22 57 61 69 74 46 6f 72 53 69 6e 67    { "WaitForSing
7510: 6c 65 4f 62 6a 65 63 74 22 2c 20 20 20 20 20 28  leObject",     (
7520: 53 59 53 43 41 4c 4c 29 57 61 69 74 46 6f 72 53  SYSCALL)WaitForS
7530: 69 6e 67 6c 65 4f 62 6a 65 63 74 2c 20 20 20 20  ingleObject,    
7540: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
7550: 22 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62  "WaitForSingleOb
7560: 6a 65 63 74 22 2c 20 20 20 20 20 28 53 59 53 43  ject",     (SYSC
7570: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
7580: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
7590: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
75a0: 65 20 6f 73 57 61 69 74 46 6f 72 53 69 6e 67 6c  e osWaitForSingl
75b0: 65 4f 62 6a 65 63 74 20 28 28 44 57 4f 52 44 28  eObject ((DWORD(
75c0: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c  WINAPI*)(HANDLE,
75d0: 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44   \.        DWORD
75e0: 29 29 61 53 79 73 63 61 6c 6c 5b 36 33 5d 2e 70  ))aSyscall[63].p
75f0: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51  Current)..#if SQ
7600: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
7610: 7b 20 22 57 61 69 74 46 6f 72 53 69 6e 67 6c 65  { "WaitForSingle
7620: 4f 62 6a 65 63 74 45 78 22 2c 20 20 20 28 53 59  ObjectEx",   (SY
7630: 53 43 41 4c 4c 29 57 61 69 74 46 6f 72 53 69 6e  SCALL)WaitForSin
7640: 67 6c 65 4f 62 6a 65 63 74 45 78 2c 20 20 20 30  gleObjectEx,   0
7650: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 57   },.#else.  { "W
7660: 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65  aitForSingleObje
7670: 63 74 45 78 22 2c 20 20 20 28 53 59 53 43 41 4c  ctEx",   (SYSCAL
7680: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
7690: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
76a0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
76b0: 6f 73 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f  osWaitForSingleO
76c0: 62 6a 65 63 74 45 78 20 28 28 44 57 4f 52 44 28  bjectEx ((DWORD(
76d0: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c  WINAPI*)(HANDLE,
76e0: 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20  DWORD, \.       
76f0: 20 42 4f 4f 4c 29 29 61 53 79 73 63 61 6c 6c 5b   BOOL))aSyscall[
7700: 36 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  64].pCurrent)..#
7710: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
7720: 52 54 0a 20 20 7b 20 22 53 65 74 46 69 6c 65 50  RT.  { "SetFileP
7730: 6f 69 6e 74 65 72 45 78 22 2c 20 20 20 20 20 20  ointerEx",      
7740: 20 20 28 53 59 53 43 41 4c 4c 29 53 65 74 46 69    (SYSCALL)SetFi
7750: 6c 65 50 6f 69 6e 74 65 72 45 78 2c 20 20 20 20  lePointerEx,    
7760: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
7770: 20 7b 20 22 53 65 74 46 69 6c 65 50 6f 69 6e 74   { "SetFilePoint
7780: 65 72 45 78 22 2c 20 20 20 20 20 20 20 20 28 53  erEx",        (S
7790: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
77a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
77b0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
77c0: 66 69 6e 65 20 6f 73 53 65 74 46 69 6c 65 50 6f  fine osSetFilePo
77d0: 69 6e 74 65 72 45 78 20 28 28 42 4f 4f 4c 28 57  interEx ((BOOL(W
77e0: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c  INAPI*)(HANDLE,L
77f0: 41 52 47 45 5f 49 4e 54 45 47 45 52 2c 20 5c 0a  ARGE_INTEGER, \.
7800: 20 20 20 20 20 20 20 20 50 4c 41 52 47 45 5f 49          PLARGE_I
7810: 4e 54 45 47 45 52 2c 44 57 4f 52 44 29 29 61 53  NTEGER,DWORD))aS
7820: 79 73 63 61 6c 6c 5b 36 35 5d 2e 70 43 75 72 72  yscall[65].pCurr
7830: 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45  ent)..#if SQLITE
7840: 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 47  _OS_WINRT.  { "G
7850: 65 74 46 69 6c 65 49 6e 66 6f 72 6d 61 74 69 6f  etFileInformatio
7860: 6e 42 79 48 61 6e 64 6c 65 45 78 22 2c 20 28 53  nByHandleEx", (S
7870: 59 53 43 41 4c 4c 29 47 65 74 46 69 6c 65 49 6e  YSCALL)GetFileIn
7880: 66 6f 72 6d 61 74 69 6f 6e 42 79 48 61 6e 64 6c  formationByHandl
7890: 65 45 78 2c 20 30 20 7d 2c 0a 23 65 6c 73 65 0a  eEx, 0 },.#else.
78a0: 20 20 7b 20 22 47 65 74 46 69 6c 65 49 6e 66 6f    { "GetFileInfo
78b0: 72 6d 61 74 69 6f 6e 42 79 48 61 6e 64 6c 65 45  rmationByHandleE
78c0: 78 22 2c 20 28 53 59 53 43 41 4c 4c 29 30 2c 20  x", (SYSCALL)0, 
78d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
78e0: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
78f0: 65 66 69 6e 65 20 6f 73 47 65 74 46 69 6c 65 49  efine osGetFileI
7900: 6e 66 6f 72 6d 61 74 69 6f 6e 42 79 48 61 6e 64  nformationByHand
7910: 6c 65 45 78 20 28 28 42 4f 4f 4c 28 57 49 4e 41  leEx ((BOOL(WINA
7920: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 20 5c 0a 20  PI*)(HANDLE, \. 
7930: 20 20 20 20 20 20 20 46 49 4c 45 5f 49 4e 46 4f         FILE_INFO
7940: 5f 42 59 5f 48 41 4e 44 4c 45 5f 43 4c 41 53 53  _BY_HANDLE_CLASS
7950: 2c 4c 50 56 4f 49 44 2c 44 57 4f 52 44 29 29 61  ,LPVOID,DWORD))a
7960: 53 79 73 63 61 6c 6c 5b 36 36 5d 2e 70 43 75 72  Syscall[66].pCur
7970: 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54  rent)..#if SQLIT
7980: 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 21 64  E_OS_WINRT && !d
7990: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
79a0: 49 54 5f 57 41 4c 29 0a 20 20 7b 20 22 4d 61 70  IT_WAL).  { "Map
79b0: 56 69 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70  ViewOfFileFromAp
79c0: 70 22 2c 20 20 20 20 28 53 59 53 43 41 4c 4c 29  p",    (SYSCALL)
79d0: 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 46 72 6f  MapViewOfFileFro
79e0: 6d 41 70 70 2c 20 20 20 20 30 20 7d 2c 0a 23 65  mApp,    0 },.#e
79f0: 6c 73 65 0a 20 20 7b 20 22 4d 61 70 56 69 65 77  lse.  { "MapView
7a00: 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 22 2c 20  OfFileFromApp", 
7a10: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
7a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a30: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
7a40: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4d 61 70 56  ..#define osMapV
7a50: 69 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70  iewOfFileFromApp
7a60: 20 28 28 4c 50 56 4f 49 44 28 57 49 4e 41 50 49   ((LPVOID(WINAPI
7a70: 2a 29 28 48 41 4e 44 4c 45 2c 55 4c 4f 4e 47 2c  *)(HANDLE,ULONG,
7a80: 55 4c 4f 4e 47 36 34 2c 20 5c 0a 20 20 20 20 20  ULONG64, \.     
7a90: 20 20 20 53 49 5a 45 5f 54 29 29 61 53 79 73 63     SIZE_T))aSysc
7aa0: 61 6c 6c 5b 36 37 5d 2e 70 43 75 72 72 65 6e 74  all[67].pCurrent
7ab0: 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  )..#if SQLITE_OS
7ac0: 5f 57 49 4e 52 54 0a 20 20 7b 20 22 43 72 65 61  _WINRT.  { "Crea
7ad0: 74 65 46 69 6c 65 32 22 2c 20 20 20 20 20 20 20  teFile2",       
7ae0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43        (SYSCALL)C
7af0: 72 65 61 74 65 46 69 6c 65 32 2c 20 20 20 20 20  reateFile2,     
7b00: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
7b10: 73 65 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69  se.  { "CreateFi
7b20: 6c 65 32 22 2c 20 20 20 20 20 20 20 20 20 20 20  le2",           
7b30: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
7b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b50: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
7b60: 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74  .#define osCreat
7b70: 65 46 69 6c 65 32 20 28 28 48 41 4e 44 4c 45 28  eFile2 ((HANDLE(
7b80: 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52  WINAPI*)(LPCWSTR
7b90: 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f  ,DWORD,DWORD,DWO
7ba0: 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  RD, \.        LP
7bb0: 43 52 45 41 54 45 46 49 4c 45 32 5f 45 58 54 45  CREATEFILE2_EXTE
7bc0: 4e 44 45 44 5f 50 41 52 41 4d 45 54 45 52 53 29  NDED_PARAMETERS)
7bd0: 29 61 53 79 73 63 61 6c 6c 5b 36 38 5d 2e 70 43  )aSyscall[68].pC
7be0: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c  urrent)..#if SQL
7bf0: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20  ITE_OS_WINRT && 
7c00: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
7c10: 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  OMIT_LOAD_EXTENS
7c20: 49 4f 4e 29 0a 20 20 7b 20 22 4c 6f 61 64 50 61  ION).  { "LoadPa
7c30: 63 6b 61 67 65 64 4c 69 62 72 61 72 79 22 2c 20  ckagedLibrary", 
7c40: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f 61      (SYSCALL)Loa
7c50: 64 50 61 63 6b 61 67 65 64 4c 69 62 72 61 72 79  dPackagedLibrary
7c60: 2c 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65  ,     0 },.#else
7c70: 0a 20 20 7b 20 22 4c 6f 61 64 50 61 63 6b 61 67  .  { "LoadPackag
7c80: 65 64 4c 69 62 72 61 72 79 22 2c 20 20 20 20 20  edLibrary",     
7c90: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
7ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7cb0: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
7cc0: 64 65 66 69 6e 65 20 6f 73 4c 6f 61 64 50 61 63  define osLoadPac
7cd0: 6b 61 67 65 64 4c 69 62 72 61 72 79 20 28 28 48  kagedLibrary ((H
7ce0: 4d 4f 44 55 4c 45 28 57 49 4e 41 50 49 2a 29 28  MODULE(WINAPI*)(
7cf0: 4c 50 43 57 53 54 52 2c 20 5c 0a 20 20 20 20 20  LPCWSTR, \.     
7d00: 20 20 20 44 57 4f 52 44 29 29 61 53 79 73 63 61     DWORD))aSysca
7d10: 6c 6c 5b 36 39 5d 2e 70 43 75 72 72 65 6e 74 29  ll[69].pCurrent)
7d20: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
7d30: 57 49 4e 52 54 0a 20 20 7b 20 22 47 65 74 54 69  WINRT.  { "GetTi
7d40: 63 6b 43 6f 75 6e 74 36 34 22 2c 20 20 20 20 20  ckCount64",     
7d50: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65       (SYSCALL)Ge
7d60: 74 54 69 63 6b 43 6f 75 6e 74 36 34 2c 20 20 20  tTickCount64,   
7d70: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
7d80: 65 0a 20 20 7b 20 22 47 65 74 54 69 63 6b 43 6f  e.  { "GetTickCo
7d90: 75 6e 74 36 34 22 2c 20 20 20 20 20 20 20 20 20  unt64",         
7da0: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
7db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7dc0: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
7dd0: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 54 69 63  #define osGetTic
7de0: 6b 43 6f 75 6e 74 36 34 20 28 28 55 4c 4f 4e 47  kCount64 ((ULONG
7df0: 4c 4f 4e 47 28 57 49 4e 41 50 49 2a 29 28 56 4f  LONG(WINAPI*)(VO
7e00: 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 37 30 5d  ID))aSyscall[70]
7e10: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
7e20: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
7e30: 20 20 7b 20 22 47 65 74 4e 61 74 69 76 65 53 79    { "GetNativeSy
7e40: 73 74 65 6d 49 6e 66 6f 22 2c 20 20 20 20 20 28  stemInfo",     (
7e50: 53 59 53 43 41 4c 4c 29 47 65 74 4e 61 74 69 76  SYSCALL)GetNativ
7e60: 65 53 79 73 74 65 6d 49 6e 66 6f 2c 20 20 20 20  eSystemInfo,    
7e70: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
7e80: 22 47 65 74 4e 61 74 69 76 65 53 79 73 74 65 6d  "GetNativeSystem
7e90: 49 6e 66 6f 22 2c 20 20 20 20 20 28 53 59 53 43  Info",     (SYSC
7ea0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
7eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
7ec0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
7ed0: 65 20 6f 73 47 65 74 4e 61 74 69 76 65 53 79 73  e osGetNativeSys
7ee0: 74 65 6d 49 6e 66 6f 20 28 28 56 4f 49 44 28 57  temInfo ((VOID(W
7ef0: 49 4e 41 50 49 2a 29 28 20 5c 0a 20 20 20 20 20  INAPI*)( \.     
7f00: 20 20 20 4c 50 53 59 53 54 45 4d 5f 49 4e 46 4f     LPSYSTEM_INFO
7f10: 29 29 61 53 79 73 63 61 6c 6c 5b 37 31 5d 2e 70  ))aSyscall[71].p
7f20: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65  Current)..#if de
7f30: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
7f40: 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b  32_HAS_ANSI).  {
7f50: 20 22 4f 75 74 70 75 74 44 65 62 75 67 53 74 72   "OutputDebugStr
7f60: 69 6e 67 41 22 2c 20 20 20 20 20 20 28 53 59 53  ingA",      (SYS
7f70: 43 41 4c 4c 29 4f 75 74 70 75 74 44 65 62 75 67  CALL)OutputDebug
7f80: 53 74 72 69 6e 67 41 2c 20 20 20 20 20 20 30 20  StringA,      0 
7f90: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4f 75  },.#else.  { "Ou
7fa0: 74 70 75 74 44 65 62 75 67 53 74 72 69 6e 67 41  tputDebugStringA
7fb0: 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c  ",      (SYSCALL
7fc0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
7fd0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
7fe0: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
7ff0: 73 4f 75 74 70 75 74 44 65 62 75 67 53 74 72 69  sOutputDebugStri
8000: 6e 67 41 20 28 28 56 4f 49 44 28 57 49 4e 41 50  ngA ((VOID(WINAP
8010: 49 2a 29 28 4c 50 43 53 54 52 29 29 61 53 79 73  I*)(LPCSTR))aSys
8020: 63 61 6c 6c 5b 37 32 5d 2e 70 43 75 72 72 65 6e  call[72].pCurren
8030: 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  t)..#if defined(
8040: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
8050: 5f 57 49 44 45 29 0a 20 20 7b 20 22 4f 75 74 70  _WIDE).  { "Outp
8060: 75 74 44 65 62 75 67 53 74 72 69 6e 67 57 22 2c  utDebugStringW",
8070: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4f        (SYSCALL)O
8080: 75 74 70 75 74 44 65 62 75 67 53 74 72 69 6e 67  utputDebugString
8090: 57 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c  W,      0 },.#el
80a0: 73 65 0a 20 20 7b 20 22 4f 75 74 70 75 74 44 65  se.  { "OutputDe
80b0: 62 75 67 53 74 72 69 6e 67 57 22 2c 20 20 20 20  bugStringW",    
80c0: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
80d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
80e0: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
80f0: 0a 23 64 65 66 69 6e 65 20 6f 73 4f 75 74 70 75  .#define osOutpu
8100: 74 44 65 62 75 67 53 74 72 69 6e 67 57 20 28 28  tDebugStringW ((
8110: 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 4c 50  VOID(WINAPI*)(LP
8120: 43 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b  CWSTR))aSyscall[
8130: 37 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  73].pCurrent).. 
8140: 20 7b 20 22 47 65 74 50 72 6f 63 65 73 73 48 65   { "GetProcessHe
8150: 61 70 22 2c 20 20 20 20 20 20 20 20 20 20 28 53  ap",          (S
8160: 59 53 43 41 4c 4c 29 47 65 74 50 72 6f 63 65 73  YSCALL)GetProces
8170: 73 48 65 61 70 2c 20 20 20 20 20 20 20 20 20 20  sHeap,          
8180: 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73  0 },..#define os
8190: 47 65 74 50 72 6f 63 65 73 73 48 65 61 70 20 28  GetProcessHeap (
81a0: 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29  (HANDLE(WINAPI*)
81b0: 28 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b  (VOID))aSyscall[
81c0: 37 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  74].pCurrent)..#
81d0: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
81e0: 52 54 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  RT && !defined(S
81f0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 0a  QLITE_OMIT_WAL).
8200: 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65 4d    { "CreateFileM
8210: 61 70 70 69 6e 67 46 72 6f 6d 41 70 70 22 2c 20  appingFromApp", 
8220: 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65 46  (SYSCALL)CreateF
8230: 69 6c 65 4d 61 70 70 69 6e 67 46 72 6f 6d 41 70  ileMappingFromAp
8240: 70 2c 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20  p, 0 },.#else.  
8250: 7b 20 22 43 72 65 61 74 65 46 69 6c 65 4d 61 70  { "CreateFileMap
8260: 70 69 6e 67 46 72 6f 6d 41 70 70 22 2c 20 28 53  pingFromApp", (S
8270: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
8280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
8290: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
82a0: 69 6e 65 20 6f 73 43 72 65 61 74 65 46 69 6c 65  ine osCreateFile
82b0: 4d 61 70 70 69 6e 67 46 72 6f 6d 41 70 70 20 28  MappingFromApp (
82c0: 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29  (HANDLE(WINAPI*)
82d0: 28 48 41 4e 44 4c 45 2c 20 5c 0a 20 20 20 20 20  (HANDLE, \.     
82e0: 20 20 20 4c 50 53 45 43 55 52 49 54 59 5f 41 54     LPSECURITY_AT
82f0: 54 52 49 42 55 54 45 53 2c 55 4c 4f 4e 47 2c 55  TRIBUTES,ULONG,U
8300: 4c 4f 4e 47 36 34 2c 4c 50 43 57 53 54 52 29 29  LONG64,LPCWSTR))
8310: 61 53 79 73 63 61 6c 6c 5b 37 35 5d 2e 70 43 75  aSyscall[75].pCu
8320: 72 72 65 6e 74 29 0a 0a 7d 3b 20 2f 2a 20 45 6e  rrent)..}; /* En
8330: 64 20 6f 66 20 74 68 65 20 6f 76 65 72 72 69 64  d of the overrid
8340: 65 61 62 6c 65 20 73 79 73 74 65 6d 20 63 61 6c  eable system cal
8350: 6c 73 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ls */../*.** Thi
8360: 73 20 69 73 20 74 68 65 20 78 53 65 74 53 79 73  s is the xSetSys
8370: 74 65 6d 43 61 6c 6c 28 29 20 6d 65 74 68 6f 64  temCall() method
8380: 20 6f 66 20 73 71 6c 69 74 65 33 5f 76 66 73 20   of sqlite3_vfs 
8390: 66 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65 0a 2a  for all of the.*
83a0: 2a 20 22 77 69 6e 33 32 22 20 56 46 53 65 73 2e  * "win32" VFSes.
83b0: 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
83c0: 4f 4b 20 6f 70 6f 6e 20 73 75 63 63 65 73 73 66  OK opon successf
83d0: 75 6c 6c 79 20 75 70 64 61 74 69 6e 67 20 74 68  ully updating th
83e0: 65 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c  e.** system call
83f0: 20 70 6f 69 6e 74 65 72 2c 20 6f 72 20 53 51 4c   pointer, or SQL
8400: 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 69 66 20  ITE_NOTFOUND if 
8410: 74 68 65 72 65 20 69 73 20 6e 6f 20 63 6f 6e 66  there is no conf
8420: 69 67 75 72 61 62 6c 65 0a 2a 2a 20 73 79 73 74  igurable.** syst
8430: 65 6d 20 63 61 6c 6c 20 6e 61 6d 65 64 20 7a 4e  em call named zN
8440: 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ame..*/.static i
8450: 6e 74 20 77 69 6e 53 65 74 53 79 73 74 65 6d 43  nt winSetSystemC
8460: 61 6c 6c 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  all(.  sqlite3_v
8470: 66 73 20 2a 70 4e 6f 74 55 73 65 64 2c 20 20 20  fs *pNotUsed,   
8480: 20 20 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20       /* The VFS 
8490: 70 6f 69 6e 74 65 72 2e 20 20 4e 6f 74 20 75 73  pointer.  Not us
84a0: 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ed */.  const ch
84b0: 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20  ar *zName,      
84c0: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
84d0: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 74 6f 20   system call to 
84e0: 6f 76 65 72 72 69 64 65 20 2a 2f 0a 20 20 73 71  override */.  sq
84f0: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
8500: 72 20 70 4e 65 77 46 75 6e 63 20 20 2f 2a 20 50  r pNewFunc  /* P
8510: 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20 73 79  ointer to new sy
8520: 73 74 65 6d 20 63 61 6c 6c 20 76 61 6c 75 65 20  stem call value 
8530: 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  */.){.  unsigned
8540: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63   int i;.  int rc
8550: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55   = SQLITE_NOTFOU
8560: 4e 44 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41  ND;..  UNUSED_PA
8570: 52 41 4d 45 54 45 52 28 70 4e 6f 74 55 73 65 64  RAMETER(pNotUsed
8580: 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d  );.  if( zName==
8590: 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e  0 ){.    /* If n
85a0: 6f 20 7a 4e 61 6d 65 20 69 73 20 67 69 76 65 6e  o zName is given
85b0: 2c 20 72 65 73 74 6f 72 65 20 61 6c 6c 20 73 79  , restore all sy
85c0: 73 74 65 6d 20 63 61 6c 6c 73 20 74 6f 20 74 68  stem calls to th
85d0: 65 69 72 20 64 65 66 61 75 6c 74 0a 20 20 20 20  eir default.    
85e0: 2a 2a 20 73 65 74 74 69 6e 67 73 20 61 6e 64 20  ** settings and 
85f0: 72 65 74 75 72 6e 20 4e 55 4c 4c 0a 20 20 20 20  return NULL.    
8600: 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  */.    rc = SQLI
8610: 54 45 5f 4f 4b 3b 0a 20 20 20 20 66 6f 72 28 69  TE_OK;.    for(i
8620: 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 79  =0; i<sizeof(aSy
8630: 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53  scall)/sizeof(aS
8640: 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29  yscall[0]); i++)
8650: 7b 0a 20 20 20 20 20 20 69 66 28 20 61 53 79 73  {.      if( aSys
8660: 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74  call[i].pDefault
8670: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 53 79 73   ){.        aSys
8680: 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74  call[i].pCurrent
8690: 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70   = aSyscall[i].p
86a0: 44 65 66 61 75 6c 74 3b 0a 20 20 20 20 20 20 7d  Default;.      }
86b0: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
86c0: 20 20 20 20 2f 2a 20 49 66 20 7a 4e 61 6d 65 20      /* If zName 
86d0: 69 73 20 73 70 65 63 69 66 69 65 64 2c 20 6f 70  is specified, op
86e0: 65 72 61 74 65 20 6f 6e 20 6f 6e 6c 79 20 74 68  erate on only th
86f0: 65 20 6f 6e 65 20 73 79 73 74 65 6d 20 63 61 6c  e one system cal
8700: 6c 0a 20 20 20 20 2a 2a 20 73 70 65 63 69 66 69  l.    ** specifi
8710: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  ed..    */.    f
8720: 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66  or(i=0; i<sizeof
8730: 28 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f  (aSyscall)/sizeo
8740: 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20  f(aSyscall[0]); 
8750: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
8760: 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53  strcmp(zName, aS
8770: 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29  yscall[i].zName)
8780: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ==0 ){.        i
8790: 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70  f( aSyscall[i].p
87a0: 44 65 66 61 75 6c 74 3d 3d 30 20 29 7b 0a 20 20  Default==0 ){.  
87b0: 20 20 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c          aSyscall
87c0: 5b 69 5d 2e 70 44 65 66 61 75 6c 74 20 3d 20 61  [i].pDefault = a
87d0: 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72  Syscall[i].pCurr
87e0: 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ent;.        }. 
87f0: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
8800: 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 69  TE_OK;.        i
8810: 66 28 20 70 4e 65 77 46 75 6e 63 3d 3d 30 20 29  f( pNewFunc==0 )
8820: 20 70 4e 65 77 46 75 6e 63 20 3d 20 61 53 79 73   pNewFunc = aSys
8830: 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74  call[i].pDefault
8840: 3b 0a 20 20 20 20 20 20 20 20 61 53 79 73 63 61  ;.        aSysca
8850: 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 20 3d  ll[i].pCurrent =
8860: 20 70 4e 65 77 46 75 6e 63 3b 0a 20 20 20 20 20   pNewFunc;.     
8870: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
8880: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
8890: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
88a0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c  * Return the val
88b0: 75 65 20 6f 66 20 61 20 73 79 73 74 65 6d 20 63  ue of a system c
88c0: 61 6c 6c 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c  all.  Return NUL
88d0: 4c 20 69 66 20 7a 4e 61 6d 65 20 69 73 20 6e 6f  L if zName is no
88e0: 74 20 61 0a 2a 2a 20 72 65 63 6f 67 6e 69 7a 65  t a.** recognize
88f0: 64 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6e 61  d system call na
8900: 6d 65 2e 20 20 4e 55 4c 4c 20 69 73 20 61 6c 73  me.  NULL is als
8910: 6f 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68  o returned if th
8920: 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 0a 2a 2a  e system call.**
8930: 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75 6e   is currently un
8940: 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  defined..*/.stat
8950: 69 63 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61  ic sqlite3_sysca
8960: 6c 6c 5f 70 74 72 20 77 69 6e 47 65 74 53 79 73  ll_ptr winGetSys
8970: 74 65 6d 43 61 6c 6c 28 0a 20 20 73 71 6c 69 74  temCall(.  sqlit
8980: 65 33 5f 76 66 73 20 2a 70 4e 6f 74 55 73 65 64  e3_vfs *pNotUsed
8990: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
89a0: 7a 4e 61 6d 65 0a 29 7b 0a 20 20 75 6e 73 69 67  zName.){.  unsig
89b0: 6e 65 64 20 69 6e 74 20 69 3b 0a 0a 20 20 55 4e  ned int i;..  UN
89c0: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
89d0: 4e 6f 74 55 73 65 64 29 3b 0a 20 20 66 6f 72 28  NotUsed);.  for(
89e0: 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53  i=0; i<sizeof(aS
89f0: 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61  yscall)/sizeof(a
8a00: 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b  Syscall[0]); i++
8a10: 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d  ){.    if( strcm
8a20: 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c  p(zName, aSyscal
8a30: 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29  l[i].zName)==0 )
8a40: 20 72 65 74 75 72 6e 20 61 53 79 73 63 61 6c 6c   return aSyscall
8a50: 5b 69 5d 2e 70 43 75 72 72 65 6e 74 3b 0a 20 20  [i].pCurrent;.  
8a60: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
8a70: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
8a80: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  e name of the fi
8a90: 72 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  rst system call 
8aa0: 61 66 74 65 72 20 7a 4e 61 6d 65 2e 20 20 49 66  after zName.  If
8ab0: 20 7a 4e 61 6d 65 3d 3d 4e 55 4c 4c 0a 2a 2a 20   zName==NULL.** 
8ac0: 74 68 65 6e 20 72 65 74 75 72 6e 20 74 68 65 20  then return the 
8ad0: 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 72 73  name of the firs
8ae0: 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20  t system call.  
8af0: 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 7a  Return NULL if z
8b00: 4e 61 6d 65 0a 2a 2a 20 69 73 20 74 68 65 20 6c  Name.** is the l
8b10: 61 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  ast system call 
8b20: 6f 72 20 69 66 20 7a 4e 61 6d 65 20 69 73 20 6e  or if zName is n
8b30: 6f 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  ot the name of a
8b40: 20 76 61 6c 69 64 0a 2a 2a 20 73 79 73 74 65 6d   valid.** system
8b50: 20 63 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63   call..*/.static
8b60: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 77 69 6e   const char *win
8b70: 4e 65 78 74 53 79 73 74 65 6d 43 61 6c 6c 28 73  NextSystemCall(s
8b80: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 2c 20 63  qlite3_vfs *p, c
8b90: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
8ba0: 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 2d 31 3b  ){.  int i = -1;
8bb0: 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ..  UNUSED_PARAM
8bc0: 45 54 45 52 28 70 29 3b 0a 20 20 69 66 28 20 7a  ETER(p);.  if( z
8bd0: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 66 6f 72 28  Name ){.    for(
8be0: 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65  i=0; i<ArraySize
8bf0: 28 61 53 79 73 63 61 6c 6c 29 2d 31 3b 20 69 2b  (aSyscall)-1; i+
8c00: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74  +){.      if( st
8c10: 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73  rcmp(zName, aSys
8c20: 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d  call[i].zName)==
8c30: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  0 ) break;.    }
8c40: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 2b 2b 3b 20  .  }.  for(i++; 
8c50: 69 3c 41 72 72 61 79 53 69 7a 65 28 61 53 79 73  i<ArraySize(aSys
8c60: 63 61 6c 6c 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  call); i++){.   
8c70: 20 69 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d   if( aSyscall[i]
8c80: 2e 70 43 75 72 72 65 6e 74 21 3d 30 20 29 20 72  .pCurrent!=0 ) r
8c90: 65 74 75 72 6e 20 61 53 79 73 63 61 6c 6c 5b 69  eturn aSyscall[i
8ca0: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 72  ].zName;.  }.  r
8cb0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66 64  eturn 0;.}..#ifd
8cc0: 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ef SQLITE_WIN32_
8cd0: 4d 41 4c 4c 4f 43 0a 2f 2a 0a 2a 2a 20 49 66 20  MALLOC./*.** If 
8ce0: 61 20 57 69 6e 33 32 20 6e 61 74 69 76 65 20 68  a Win32 native h
8cf0: 65 61 70 20 68 61 73 20 62 65 65 6e 20 63 6f 6e  eap has been con
8d00: 66 69 67 75 72 65 64 2c 20 74 68 69 73 20 66 75  figured, this fu
8d10: 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 61 74 74 65  nction will atte
8d20: 6d 70 74 20 74 6f 0a 2a 2a 20 63 6f 6d 70 61 63  mpt to.** compac
8d30: 74 20 69 74 2e 20 20 55 70 6f 6e 20 73 75 63 63  t it.  Upon succ
8d40: 65 73 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 77  ess, SQLITE_OK w
8d50: 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 2e  ill be returned.
8d60: 20 20 55 70 6f 6e 20 66 61 69 6c 75 72 65 2c 20    Upon failure, 
8d70: 6f 6e 65 0a 2a 2a 20 6f 66 20 53 51 4c 49 54 45  one.** of SQLITE
8d80: 5f 4e 4f 4d 45 4d 2c 20 53 51 4c 49 54 45 5f 45  _NOMEM, SQLITE_E
8d90: 52 52 4f 52 2c 20 6f 72 20 53 51 4c 49 54 45 5f  RROR, or SQLITE_
8da0: 4e 4f 54 46 4f 55 4e 44 20 77 69 6c 6c 20 62 65  NOTFOUND will be
8db0: 20 72 65 74 75 72 6e 65 64 2e 20 20 54 68 65 0a   returned.  The.
8dc0: 2a 2a 20 22 70 6e 4c 61 72 67 65 73 74 22 20 61  ** "pnLargest" a
8dd0: 72 67 75 6d 65 6e 74 2c 20 69 66 20 6e 6f 6e 2d  rgument, if non-
8de0: 7a 65 72 6f 2c 20 77 69 6c 6c 20 62 65 20 75 73  zero, will be us
8df0: 65 64 20 74 6f 20 72 65 74 75 72 6e 20 74 68 65  ed to return the
8e00: 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20   size of the.** 
8e10: 6c 61 72 67 65 73 74 20 63 6f 6d 6d 69 74 74 65  largest committe
8e20: 64 20 66 72 65 65 20 62 6c 6f 63 6b 20 69 6e 20  d free block in 
8e30: 74 68 65 20 68 65 61 70 2c 20 69 6e 20 62 79 74  the heap, in byt
8e40: 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  es..*/.int sqlit
8e50: 65 33 5f 77 69 6e 33 32 5f 63 6f 6d 70 61 63 74  e3_win32_compact
8e60: 5f 68 65 61 70 28 4c 50 55 49 4e 54 20 70 6e 4c  _heap(LPUINT pnL
8e70: 61 72 67 65 73 74 29 7b 0a 20 20 69 6e 74 20 72  argest){.  int r
8e80: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
8e90: 20 55 49 4e 54 20 6e 4c 61 72 67 65 73 74 20 3d   UINT nLargest =
8ea0: 20 30 3b 0a 20 20 48 41 4e 44 4c 45 20 68 48 65   0;.  HANDLE hHe
8eb0: 61 70 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73 73  ap;..  winMemAss
8ec0: 65 72 74 4d 61 67 69 63 28 29 3b 0a 20 20 68 48  ertMagic();.  hH
8ed0: 65 61 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74 48  eap = winMemGetH
8ee0: 65 61 70 28 29 3b 0a 20 20 61 73 73 65 72 74 28  eap();.  assert(
8ef0: 20 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61   hHeap!=0 );.  a
8f00: 73 73 65 72 74 28 20 68 48 65 61 70 21 3d 49 4e  ssert( hHeap!=IN
8f10: 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c  VALID_HANDLE_VAL
8f20: 55 45 20 29 3b 0a 23 69 66 20 21 53 51 4c 49 54  UE );.#if !SQLIT
8f30: 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65  E_OS_WINRT && de
8f40: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
8f50: 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41  32_MALLOC_VALIDA
8f60: 54 45 29 0a 20 20 61 73 73 65 72 74 28 20 6f 73  TE).  assert( os
8f70: 48 65 61 70 56 61 6c 69 64 61 74 65 28 68 48 65  HeapValidate(hHe
8f80: 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ap, SQLITE_WIN32
8f90: 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 4e 55 4c  _HEAP_FLAGS, NUL
8fa0: 4c 29 20 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  L) );.#endif.#if
8fb0: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43   !SQLITE_OS_WINC
8fc0: 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f  E && !SQLITE_OS_
8fd0: 57 49 4e 52 54 0a 20 20 69 66 28 20 28 6e 4c 61  WINRT.  if( (nLa
8fe0: 72 67 65 73 74 3d 6f 73 48 65 61 70 43 6f 6d 70  rgest=osHeapComp
8ff0: 61 63 74 28 68 48 65 61 70 2c 20 53 51 4c 49 54  act(hHeap, SQLIT
9000: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41  E_WIN32_HEAP_FLA
9010: 47 53 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 44  GS))==0 ){.    D
9020: 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 20 3d  WORD lastErrno =
9030: 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
9040: 29 3b 0a 20 20 20 20 69 66 28 20 6c 61 73 74 45  );.    if( lastE
9050: 72 72 6e 6f 3d 3d 4e 4f 5f 45 52 52 4f 52 20 29  rrno==NO_ERROR )
9060: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
9070: 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  log(SQLITE_NOMEM
9080: 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65 61  , "failed to Hea
9090: 70 43 6f 6d 70 61 63 74 20 28 6e 6f 20 73 70 61  pCompact (no spa
90a0: 63 65 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20  ce), heap=%p",. 
90b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
90c0: 20 28 76 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a   (void*)hHeap);.
90d0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
90e0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c  E_NOMEM;.    }el
90f0: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
9100: 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 45 52 52  3_log(SQLITE_ERR
9110: 4f 52 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 48  OR, "failed to H
9120: 65 61 70 43 6f 6d 70 61 63 74 20 28 25 6c 75 29  eapCompact (%lu)
9130: 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20  , heap=%p",.    
9140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73                os
9150: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20  GetLastError(), 
9160: 28 76 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a 20  (void*)hHeap);. 
9170: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
9180: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
9190: 7d 0a 23 65 6c 73 65 0a 20 20 73 71 6c 69 74 65  }.#else.  sqlite
91a0: 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 54  3_log(SQLITE_NOT
91b0: 46 4f 55 4e 44 2c 20 22 66 61 69 6c 65 64 20 74  FOUND, "failed t
91c0: 6f 20 48 65 61 70 43 6f 6d 70 61 63 74 2c 20 68  o HeapCompact, h
91d0: 65 61 70 3d 25 70 22 2c 0a 20 20 20 20 20 20 20  eap=%p",.       
91e0: 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 68 48         (void*)hH
91f0: 65 61 70 29 3b 0a 20 20 72 63 20 3d 20 53 51 4c  eap);.  rc = SQL
9200: 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 23 65  ITE_NOTFOUND;.#e
9210: 6e 64 69 66 0a 20 20 69 66 28 20 70 6e 4c 61 72  ndif.  if( pnLar
9220: 67 65 73 74 20 29 20 2a 70 6e 4c 61 72 67 65 73  gest ) *pnLarges
9230: 74 20 3d 20 6e 4c 61 72 67 65 73 74 3b 0a 20 20  t = nLargest;.  
9240: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
9250: 0a 2a 2a 20 49 66 20 61 20 57 69 6e 33 32 20 6e  .** If a Win32 n
9260: 61 74 69 76 65 20 68 65 61 70 20 68 61 73 20 62  ative heap has b
9270: 65 65 6e 20 63 6f 6e 66 69 67 75 72 65 64 2c 20  een configured, 
9280: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69  this function wi
9290: 6c 6c 20 61 74 74 65 6d 70 74 20 74 6f 0a 2a 2a  ll attempt to.**
92a0: 20 64 65 73 74 72 6f 79 20 61 6e 64 20 72 65 63   destroy and rec
92b0: 72 65 61 74 65 20 69 74 2e 20 20 49 66 20 74 68  reate it.  If th
92c0: 65 20 57 69 6e 33 32 20 6e 61 74 69 76 65 20 68  e Win32 native h
92d0: 65 61 70 20 69 73 20 6e 6f 74 20 69 73 6f 6c 61  eap is not isola
92e0: 74 65 64 20 61 6e 64 2f 6f 72 0a 2a 2a 20 74 68  ted and/or.** th
92f0: 65 20 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79  e sqlite3_memory
9300: 5f 75 73 65 64 28 29 20 66 75 6e 63 74 69 6f 6e  _used() function
9310: 20 64 6f 65 73 20 6e 6f 74 20 72 65 74 75 72 6e   does not return
9320: 20 7a 65 72 6f 2c 20 53 51 4c 49 54 45 5f 42 55   zero, SQLITE_BU
9330: 53 59 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 72 65  SY will.** be re
9340: 74 75 72 6e 65 64 20 61 6e 64 20 6e 6f 20 63 68  turned and no ch
9350: 61 6e 67 65 73 20 77 69 6c 6c 20 62 65 20 6d 61  anges will be ma
9360: 64 65 20 74 6f 20 74 68 65 20 57 69 6e 33 32 20  de to the Win32 
9370: 6e 61 74 69 76 65 20 68 65 61 70 2e 0a 2a 2f 0a  native heap..*/.
9380: 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 69 6e 33  int sqlite3_win3
9390: 32 5f 72 65 73 65 74 5f 68 65 61 70 28 29 7b 0a  2_reset_heap(){.
93a0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 55 54 45    int rc;.  MUTE
93b0: 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33  X_LOGIC( sqlite3
93c0: 5f 6d 75 74 65 78 20 2a 70 4d 61 73 74 65 72 3b  _mutex *pMaster;
93d0: 20 29 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 73   ) /* The main s
93e0: 74 61 74 69 63 20 6d 75 74 65 78 20 2a 2f 0a 20  tatic mutex */. 
93f0: 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71   MUTEX_LOGIC( sq
9400: 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 4d 65  lite3_mutex *pMe
9410: 6d 3b 20 29 20 20 20 20 2f 2a 20 54 68 65 20 6d  m; )    /* The m
9420: 65 6d 73 79 73 20 73 74 61 74 69 63 20 6d 75 74  emsys static mut
9430: 65 78 20 2a 2f 0a 20 20 4d 55 54 45 58 5f 4c 4f  ex */.  MUTEX_LO
9440: 47 49 43 28 20 70 4d 61 73 74 65 72 20 3d 20 73  GIC( pMaster = s
9450: 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
9460: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
9470: 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 20 29 0a  ATIC_MASTER); ).
9480: 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 70    MUTEX_LOGIC( p
9490: 4d 65 6d 20 3d 20 73 71 6c 69 74 65 33 4d 75 74  Mem = sqlite3Mut
94a0: 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
94b0: 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 45 4d 29  UTEX_STATIC_MEM)
94c0: 3b 20 29 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  ; ).  sqlite3_mu
94d0: 74 65 78 5f 65 6e 74 65 72 28 70 4d 61 73 74 65  tex_enter(pMaste
94e0: 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  r);.  sqlite3_mu
94f0: 74 65 78 5f 65 6e 74 65 72 28 70 4d 65 6d 29 3b  tex_enter(pMem);
9500: 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d  .  winMemAssertM
9510: 61 67 69 63 28 29 3b 0a 20 20 69 66 28 20 77 69  agic();.  if( wi
9520: 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 21 3d 4e  nMemGetHeap()!=N
9530: 55 4c 4c 20 26 26 20 77 69 6e 4d 65 6d 47 65 74  ULL && winMemGet
9540: 4f 77 6e 65 64 28 29 20 26 26 20 73 71 6c 69 74  Owned() && sqlit
9550: 65 33 5f 6d 65 6d 6f 72 79 5f 75 73 65 64 28 29  e3_memory_used()
9560: 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20  ==0 ){.    /*.  
9570: 20 20 2a 2a 20 41 74 20 74 68 69 73 20 70 6f 69    ** At this poi
9580: 6e 74 2c 20 74 68 65 72 65 20 73 68 6f 75 6c 64  nt, there should
9590: 20 62 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69   be no outstandi
95a0: 6e 67 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  ng memory alloca
95b0: 74 69 6f 6e 73 20 6f 6e 0a 20 20 20 20 2a 2a 20  tions on.    ** 
95c0: 74 68 65 20 68 65 61 70 2e 20 20 41 6c 73 6f 2c  the heap.  Also,
95d0: 20 73 69 6e 63 65 20 62 6f 74 68 20 74 68 65 20   since both the 
95e0: 6d 61 73 74 65 72 20 61 6e 64 20 6d 65 6d 73 79  master and memsy
95f0: 73 20 6c 6f 63 6b 73 20 61 72 65 20 63 75 72 72  s locks are curr
9600: 65 6e 74 6c 79 0a 20 20 20 20 2a 2a 20 62 65 69  ently.    ** bei
9610: 6e 67 20 68 65 6c 64 20 62 79 20 75 73 2c 20 6e  ng held by us, n
9620: 6f 20 6f 74 68 65 72 20 66 75 6e 63 74 69 6f 6e  o other function
9630: 20 28 69 2e 65 2e 20 66 72 6f 6d 20 61 6e 6f 74   (i.e. from anot
9640: 68 65 72 20 74 68 72 65 61 64 29 20 73 68 6f 75  her thread) shou
9650: 6c 64 0a 20 20 20 20 2a 2a 20 62 65 20 61 62 6c  ld.    ** be abl
9660: 65 20 74 6f 20 65 76 65 6e 20 61 63 63 65 73 73  e to even access
9670: 20 74 68 65 20 68 65 61 70 2e 20 20 41 74 74 65   the heap.  Atte
9680: 6d 70 74 20 74 6f 20 64 65 73 74 72 6f 79 20 61  mpt to destroy a
9690: 6e 64 20 72 65 63 72 65 61 74 65 20 6f 75 72 0a  nd recreate our.
96a0: 20 20 20 20 2a 2a 20 69 73 6f 6c 61 74 65 64 20      ** isolated 
96b0: 57 69 6e 33 32 20 6e 61 74 69 76 65 20 68 65 61  Win32 native hea
96c0: 70 20 6e 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20 20  p now..    */.  
96d0: 20 20 61 73 73 65 72 74 28 20 77 69 6e 4d 65 6d    assert( winMem
96e0: 47 65 74 48 65 61 70 28 29 21 3d 4e 55 4c 4c 20  GetHeap()!=NULL 
96f0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 77  );.    assert( w
9700: 69 6e 4d 65 6d 47 65 74 4f 77 6e 65 64 28 29 20  inMemGetOwned() 
9710: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
9720: 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 75 73  qlite3_memory_us
9730: 65 64 28 29 3d 3d 30 20 29 3b 0a 20 20 20 20 77  ed()==0 );.    w
9740: 69 6e 4d 65 6d 53 68 75 74 64 6f 77 6e 28 77 69  inMemShutdown(wi
9750: 6e 4d 65 6d 47 65 74 44 61 74 61 50 74 72 28 29  nMemGetDataPtr()
9760: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 77  );.    assert( w
9770: 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 3d 3d  inMemGetHeap()==
9780: 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 61 73 73 65  NULL );.    asse
9790: 72 74 28 20 21 77 69 6e 4d 65 6d 47 65 74 4f 77  rt( !winMemGetOw
97a0: 6e 65 64 28 29 20 29 3b 0a 20 20 20 20 61 73 73  ned() );.    ass
97b0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 65 6d  ert( sqlite3_mem
97c0: 6f 72 79 5f 75 73 65 64 28 29 3d 3d 30 20 29 3b  ory_used()==0 );
97d0: 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4d 65 6d  .    rc = winMem
97e0: 49 6e 69 74 28 77 69 6e 4d 65 6d 47 65 74 44 61  Init(winMemGetDa
97f0: 74 61 50 74 72 28 29 29 3b 0a 20 20 20 20 61 73  taPtr());.    as
9800: 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
9810: 5f 4f 4b 20 7c 7c 20 77 69 6e 4d 65 6d 47 65 74  _OK || winMemGet
9820: 48 65 61 70 28 29 21 3d 4e 55 4c 4c 20 29 3b 0a  Heap()!=NULL );.
9830: 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
9840: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 77 69 6e  SQLITE_OK || win
9850: 4d 65 6d 47 65 74 4f 77 6e 65 64 28 29 20 29 3b  MemGetOwned() );
9860: 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21  .    assert( rc!
9870: 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 71  =SQLITE_OK || sq
9880: 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 75 73 65  lite3_memory_use
9890: 64 28 29 3d 3d 30 20 29 3b 0a 20 20 7d 65 6c 73  d()==0 );.  }els
98a0: 65 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  e{.    /*.    **
98b0: 20 54 68 65 20 57 69 6e 33 32 20 6e 61 74 69 76   The Win32 nativ
98c0: 65 20 68 65 61 70 20 63 61 6e 6e 6f 74 20 62 65  e heap cannot be
98d0: 20 6d 6f 64 69 66 69 65 64 20 62 65 63 61 75 73   modified becaus
98e0: 65 20 69 74 20 6d 61 79 20 62 65 20 69 6e 20 75  e it may be in u
98f0: 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  se..    */.    r
9900: 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
9910: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
9920: 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 65 6d 29  utex_leave(pMem)
9930: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
9940: 78 5f 6c 65 61 76 65 28 70 4d 61 73 74 65 72 29  x_leave(pMaster)
9950: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
9960: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
9970: 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 20 2a  E_WIN32_MALLOC *
9980: 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  /../*.** This fu
9990: 6e 63 74 69 6f 6e 20 6f 75 74 70 75 74 73 20 74  nction outputs t
99a0: 68 65 20 73 70 65 63 69 66 69 65 64 20 28 41 4e  he specified (AN
99b0: 53 49 29 20 73 74 72 69 6e 67 20 74 6f 20 74 68  SI) string to th
99c0: 65 20 57 69 6e 33 32 20 64 65 62 75 67 67 65 72  e Win32 debugger
99d0: 0a 2a 2a 20 28 69 66 20 61 76 61 69 6c 61 62 6c  .** (if availabl
99e0: 65 29 2e 0a 2a 2f 0a 0a 76 6f 69 64 20 73 71 6c  e)..*/..void sql
99f0: 69 74 65 33 5f 77 69 6e 33 32 5f 77 72 69 74 65  ite3_win32_write
9a00: 5f 64 65 62 75 67 28 63 6f 6e 73 74 20 63 68 61  _debug(const cha
9a10: 72 20 2a 7a 42 75 66 2c 20 69 6e 74 20 6e 42 75  r *zBuf, int nBu
9a20: 66 29 7b 0a 20 20 63 68 61 72 20 7a 44 62 67 42  f){.  char zDbgB
9a30: 75 66 5b 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  uf[SQLITE_WIN32_
9a40: 44 42 47 5f 42 55 46 5f 53 49 5a 45 5d 3b 0a 20  DBG_BUF_SIZE];. 
9a50: 20 69 6e 74 20 6e 4d 69 6e 20 3d 20 4d 49 4e 28   int nMin = MIN(
9a60: 6e 42 75 66 2c 20 28 53 51 4c 49 54 45 5f 57 49  nBuf, (SQLITE_WI
9a70: 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45  N32_DBG_BUF_SIZE
9a80: 20 2d 20 31 29 29 3b 20 2f 2a 20 6d 61 79 20 62   - 1)); /* may b
9a90: 65 20 6e 65 67 61 74 69 76 65 2e 20 2a 2f 0a 20  e negative. */. 
9aa0: 20 69 66 28 20 6e 4d 69 6e 3c 2d 31 20 29 20 6e   if( nMin<-1 ) n
9ab0: 4d 69 6e 20 3d 20 2d 31 3b 20 2f 2a 20 61 6c 6c  Min = -1; /* all
9ac0: 20 6e 65 67 61 74 69 76 65 20 76 61 6c 75 65 73   negative values
9ad0: 20 62 65 63 6f 6d 65 20 2d 31 2e 20 2a 2f 0a 20   become -1. */. 
9ae0: 20 61 73 73 65 72 74 28 20 6e 4d 69 6e 3d 3d 2d   assert( nMin==-
9af0: 31 20 7c 7c 20 6e 4d 69 6e 3d 3d 30 20 7c 7c 20  1 || nMin==0 || 
9b00: 6e 4d 69 6e 3c 53 51 4c 49 54 45 5f 57 49 4e 33  nMin<SQLITE_WIN3
9b10: 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 20 29  2_DBG_BUF_SIZE )
9b20: 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ;.#if defined(SQ
9b30: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
9b40: 4e 53 49 29 0a 20 20 69 66 28 20 6e 4d 69 6e 3e  NSI).  if( nMin>
9b50: 30 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28  0 ){.    memset(
9b60: 7a 44 62 67 42 75 66 2c 20 30 2c 20 53 51 4c 49  zDbgBuf, 0, SQLI
9b70: 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46  TE_WIN32_DBG_BUF
9b80: 5f 53 49 5a 45 29 3b 0a 20 20 20 20 6d 65 6d 63  _SIZE);.    memc
9b90: 70 79 28 7a 44 62 67 42 75 66 2c 20 7a 42 75 66  py(zDbgBuf, zBuf
9ba0: 2c 20 6e 4d 69 6e 29 3b 0a 20 20 20 20 6f 73 4f  , nMin);.    osO
9bb0: 75 74 70 75 74 44 65 62 75 67 53 74 72 69 6e 67  utputDebugString
9bc0: 41 28 7a 44 62 67 42 75 66 29 3b 0a 20 20 7d 65  A(zDbgBuf);.  }e
9bd0: 6c 73 65 7b 0a 20 20 20 20 6f 73 4f 75 74 70 75  lse{.    osOutpu
9be0: 74 44 65 62 75 67 53 74 72 69 6e 67 41 28 7a 42  tDebugStringA(zB
9bf0: 75 66 29 3b 0a 20 20 7d 0a 23 65 6c 69 66 20 64  uf);.  }.#elif d
9c00: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
9c10: 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20  N32_HAS_WIDE).  
9c20: 6d 65 6d 73 65 74 28 7a 44 62 67 42 75 66 2c 20  memset(zDbgBuf, 
9c30: 30 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  0, SQLITE_WIN32_
9c40: 44 42 47 5f 42 55 46 5f 53 49 5a 45 29 3b 0a 20  DBG_BUF_SIZE);. 
9c50: 20 69 66 20 28 20 6f 73 4d 75 6c 74 69 42 79 74   if ( osMultiByt
9c60: 65 54 6f 57 69 64 65 43 68 61 72 28 0a 20 20 20  eToWideChar(.   
9c70: 20 20 20 20 20 20 20 6f 73 41 72 65 46 69 6c 65         osAreFile
9c80: 41 70 69 73 41 4e 53 49 28 29 20 3f 20 43 50 5f  ApisANSI() ? CP_
9c90: 41 43 50 20 3a 20 43 50 5f 4f 45 4d 43 50 2c 20  ACP : CP_OEMCP, 
9ca0: 30 2c 20 7a 42 75 66 2c 0a 20 20 20 20 20 20 20  0, zBuf,.       
9cb0: 20 20 20 6e 4d 69 6e 2c 20 28 4c 50 57 53 54 52     nMin, (LPWSTR
9cc0: 29 7a 44 62 67 42 75 66 2c 20 53 51 4c 49 54 45  )zDbgBuf, SQLITE
9cd0: 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53  _WIN32_DBG_BUF_S
9ce0: 49 5a 45 2f 73 69 7a 65 6f 66 28 57 43 48 41 52  IZE/sizeof(WCHAR
9cf0: 29 29 3c 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ))<=0 ){.    ret
9d00: 75 72 6e 3b 0a 20 20 7d 0a 20 20 6f 73 4f 75 74  urn;.  }.  osOut
9d10: 70 75 74 44 65 62 75 67 53 74 72 69 6e 67 57 28  putDebugStringW(
9d20: 28 4c 50 43 57 53 54 52 29 7a 44 62 67 42 75 66  (LPCWSTR)zDbgBuf
9d30: 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 6e  );.#else.  if( n
9d40: 4d 69 6e 3e 30 20 29 7b 0a 20 20 20 20 6d 65 6d  Min>0 ){.    mem
9d50: 73 65 74 28 7a 44 62 67 42 75 66 2c 20 30 2c 20  set(zDbgBuf, 0, 
9d60: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47  SQLITE_WIN32_DBG
9d70: 5f 42 55 46 5f 53 49 5a 45 29 3b 0a 20 20 20 20  _BUF_SIZE);.    
9d80: 6d 65 6d 63 70 79 28 7a 44 62 67 42 75 66 2c 20  memcpy(zDbgBuf, 
9d90: 7a 42 75 66 2c 20 6e 4d 69 6e 29 3b 0a 20 20 20  zBuf, nMin);.   
9da0: 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
9db0: 20 22 25 73 22 2c 20 7a 44 62 67 42 75 66 29 3b   "%s", zDbgBuf);
9dc0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 70  .  }else{.    fp
9dd0: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25  rintf(stderr, "%
9de0: 73 22 2c 20 7a 42 75 66 29 3b 0a 20 20 7d 0a 23  s", zBuf);.  }.#
9df0: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  endif.}../*.** T
9e00: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75  he following rou
9e10: 74 69 6e 65 20 73 75 73 70 65 6e 64 73 20 74 68  tine suspends th
9e20: 65 20 63 75 72 72 65 6e 74 20 74 68 72 65 61 64  e current thread
9e30: 20 66 6f 72 20 61 74 20 6c 65 61 73 74 20 6d 73   for at least ms
9e40: 0a 2a 2a 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73  .** milliseconds
9e50: 2e 20 20 54 68 69 73 20 69 73 20 65 71 75 69 76  .  This is equiv
9e60: 61 6c 65 6e 74 20 74 6f 20 74 68 65 20 57 69 6e  alent to the Win
9e70: 33 32 20 53 6c 65 65 70 28 29 20 69 6e 74 65 72  32 Sleep() inter
9e80: 66 61 63 65 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c  face..*/.#if SQL
9e90: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 73 74 61  ITE_OS_WINRT.sta
9ea0: 74 69 63 20 48 41 4e 44 4c 45 20 73 6c 65 65 70  tic HANDLE sleep
9eb0: 4f 62 6a 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6e 64  Obj = NULL;.#end
9ec0: 69 66 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  if..void sqlite3
9ed0: 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28 44 57 4f  _win32_sleep(DWO
9ee0: 52 44 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 29  RD milliseconds)
9ef0: 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  {.#if SQLITE_OS_
9f00: 57 49 4e 52 54 0a 20 20 69 66 20 28 20 73 6c 65  WINRT.  if ( sle
9f10: 65 70 4f 62 6a 3d 3d 4e 55 4c 4c 20 29 7b 0a 20  epObj==NULL ){. 
9f20: 20 20 20 73 6c 65 65 70 4f 62 6a 20 3d 20 6f 73     sleepObj = os
9f30: 43 72 65 61 74 65 45 76 65 6e 74 45 78 57 28 4e  CreateEventExW(N
9f40: 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 43 52 45 41 54  ULL, NULL, CREAT
9f50: 45 5f 45 56 45 4e 54 5f 4d 41 4e 55 41 4c 5f 52  E_EVENT_MANUAL_R
9f60: 45 53 45 54 2c 0a 20 20 20 20 20 20 20 20 20 20  ESET,.          
9f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9f80: 20 20 20 20 20 20 53 59 4e 43 48 52 4f 4e 49 5a        SYNCHRONIZ
9f90: 45 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  E);.  }.  assert
9fa0: 28 20 73 6c 65 65 70 4f 62 6a 21 3d 4e 55 4c 4c  ( sleepObj!=NULL
9fb0: 20 29 3b 0a 20 20 6f 73 57 61 69 74 46 6f 72 53   );.  osWaitForS
9fc0: 69 6e 67 6c 65 4f 62 6a 65 63 74 45 78 28 73 6c  ingleObjectEx(sl
9fd0: 65 65 70 4f 62 6a 2c 20 6d 69 6c 6c 69 73 65 63  eepObj, millisec
9fe0: 6f 6e 64 73 2c 20 46 41 4c 53 45 29 3b 0a 23 65  onds, FALSE);.#e
9ff0: 6c 73 65 0a 20 20 6f 73 53 6c 65 65 70 28 6d 69  lse.  osSleep(mi
a000: 6c 6c 69 73 65 63 6f 6e 64 73 29 3b 0a 23 65 6e  lliseconds);.#en
a010: 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  dif.}../*.** Ret
a020: 75 72 6e 20 74 72 75 65 20 28 6e 6f 6e 2d 7a 65  urn true (non-ze
a030: 72 6f 29 20 69 66 20 77 65 20 61 72 65 20 72 75  ro) if we are ru
a040: 6e 6e 69 6e 67 20 75 6e 64 65 72 20 57 69 6e 4e  nning under WinN
a050: 54 2c 20 57 69 6e 32 4b 2c 20 57 69 6e 58 50 2c  T, Win2K, WinXP,
a060: 0a 2a 2a 20 6f 72 20 57 69 6e 43 45 2e 20 20 52  .** or WinCE.  R
a070: 65 74 75 72 6e 20 66 61 6c 73 65 20 28 7a 65 72  eturn false (zer
a080: 6f 29 20 66 6f 72 20 57 69 6e 39 35 2c 20 57 69  o) for Win95, Wi
a090: 6e 39 38 2c 20 6f 72 20 57 69 6e 4d 45 2e 0a 2a  n98, or WinME..*
a0a0: 2a 0a 2a 2a 20 48 65 72 65 20 69 73 20 61 6e 20  *.** Here is an 
a0b0: 69 6e 74 65 72 65 73 74 69 6e 67 20 6f 62 73 65  interesting obse
a0c0: 72 76 61 74 69 6f 6e 3a 20 20 57 69 6e 39 35 2c  rvation:  Win95,
a0d0: 20 57 69 6e 39 38 2c 20 61 6e 64 20 57 69 6e 4d   Win98, and WinM
a0e0: 45 20 6c 61 63 6b 0a 2a 2a 20 74 68 65 20 4c 6f  E lack.** the Lo
a0f0: 63 6b 46 69 6c 65 45 78 28 29 20 41 50 49 2e 20  ckFileEx() API. 
a100: 20 42 75 74 20 77 65 20 63 61 6e 20 73 74 69 6c   But we can stil
a110: 6c 20 73 74 61 74 69 63 61 6c 6c 79 20 6c 69 6e  l statically lin
a120: 6b 20 61 67 61 69 6e 73 74 20 74 68 61 74 0a 2a  k against that.*
a130: 2a 20 41 50 49 20 61 73 20 6c 6f 6e 67 20 61 73  * API as long as
a140: 20 77 65 20 64 6f 6e 27 74 20 63 61 6c 6c 20 69   we don't call i
a150: 74 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67 20 57  t when running W
a160: 69 6e 39 35 2f 39 38 2f 4d 45 2e 20 20 41 20 63  in95/98/ME.  A c
a170: 61 6c 6c 20 74 6f 0a 2a 2a 20 74 68 69 73 20 72  all to.** this r
a180: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74  outine is used t
a190: 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74  o determine if t
a1a0: 68 65 20 68 6f 73 74 20 69 73 20 57 69 6e 39 35  he host is Win95
a1b0: 2f 39 38 2f 4d 45 20 6f 72 0a 2a 2a 20 57 69 6e  /98/ME or.** Win
a1c0: 4e 54 2f 32 4b 2f 58 50 20 73 6f 20 74 68 61 74  NT/2K/XP so that
a1d0: 20 77 65 20 77 69 6c 6c 20 6b 6e 6f 77 20 77 68   we will know wh
a1e0: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 77 65 20  ether or not we 
a1f0: 63 61 6e 20 73 61 66 65 6c 79 20 63 61 6c 6c 0a  can safely call.
a200: 2a 2a 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 45  ** the LockFileE
a210: 78 28 29 20 41 50 49 2e 0a 2a 2f 0a 23 69 66 6e  x() API..*/.#ifn
a220: 64 65 66 20 4e 54 44 44 49 5f 57 49 4e 38 0a 23  def NTDDI_WIN8.#
a230: 20 20 64 65 66 69 6e 65 20 4e 54 44 44 49 5f 57    define NTDDI_W
a240: 49 4e 38 20 20 20 20 20 20 20 20 20 20 20 20 20  IN8             
a250: 20 20 20 20 20 20 20 20 20 20 20 30 78 30 36 30             0x060
a260: 32 30 30 30 30 0a 23 65 6e 64 69 66 0a 0a 23 69  20000.#endif..#i
a270: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
a280: 45 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57  E || SQLITE_OS_W
a290: 49 4e 52 54 20 7c 7c 20 21 64 65 66 69 6e 65 64  INRT || !defined
a2a0: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
a2b0: 53 5f 41 4e 53 49 29 0a 23 20 64 65 66 69 6e 65  S_ANSI).# define
a2c0: 20 6f 73 49 73 4e 54 28 29 20 20 28 31 29 0a 23   osIsNT()  (1).#
a2d0: 65 6c 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  elif !defined(SQ
a2e0: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57  LITE_WIN32_HAS_W
a2f0: 49 44 45 29 0a 23 20 64 65 66 69 6e 65 20 6f 73  IDE).# define os
a300: 49 73 4e 54 28 29 20 20 28 30 29 0a 23 65 6c 73  IsNT()  (0).#els
a310: 65 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 6f  e.  static int o
a320: 73 49 73 4e 54 28 76 6f 69 64 29 7b 0a 20 20 20  sIsNT(void){.   
a330: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 6f 73 5f   if( sqlite3_os_
a340: 74 79 70 65 3d 3d 30 20 29 7b 0a 23 69 66 20 64  type==0 ){.#if d
a350: 65 66 69 6e 65 64 28 4e 54 44 44 49 5f 56 45 52  efined(NTDDI_VER
a360: 53 49 4f 4e 29 20 26 26 20 4e 54 44 44 49 5f 56  SION) && NTDDI_V
a370: 45 52 53 49 4f 4e 20 3e 3d 20 4e 54 44 44 49 5f  ERSION >= NTDDI_
a380: 57 49 4e 38 0a 20 20 20 20 20 20 4f 53 56 45 52  WIN8.      OSVER
a390: 53 49 4f 4e 49 4e 46 4f 57 20 73 49 6e 66 6f 3b  SIONINFOW sInfo;
a3a0: 0a 20 20 20 20 20 20 73 49 6e 66 6f 2e 64 77 4f  .      sInfo.dwO
a3b0: 53 56 65 72 73 69 6f 6e 49 6e 66 6f 53 69 7a 65  SVersionInfoSize
a3c0: 20 3d 20 73 69 7a 65 6f 66 28 73 49 6e 66 6f 29   = sizeof(sInfo)
a3d0: 3b 0a 20 20 20 20 20 20 6f 73 47 65 74 56 65 72  ;.      osGetVer
a3e0: 73 69 6f 6e 45 78 57 28 26 73 49 6e 66 6f 29 3b  sionExW(&sInfo);
a3f0: 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 4f 53 56  .#else.      OSV
a400: 45 52 53 49 4f 4e 49 4e 46 4f 41 20 73 49 6e 66  ERSIONINFOA sInf
a410: 6f 3b 0a 20 20 20 20 20 20 73 49 6e 66 6f 2e 64  o;.      sInfo.d
a420: 77 4f 53 56 65 72 73 69 6f 6e 49 6e 66 6f 53 69  wOSVersionInfoSi
a430: 7a 65 20 3d 20 73 69 7a 65 6f 66 28 73 49 6e 66  ze = sizeof(sInf
a440: 6f 29 3b 0a 20 20 20 20 20 20 6f 73 47 65 74 56  o);.      osGetV
a450: 65 72 73 69 6f 6e 45 78 41 28 26 73 49 6e 66 6f  ersionExA(&sInfo
a460: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
a470: 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 20  sqlite3_os_type 
a480: 3d 20 73 49 6e 66 6f 2e 64 77 50 6c 61 74 66 6f  = sInfo.dwPlatfo
a490: 72 6d 49 64 3d 3d 56 45 52 5f 50 4c 41 54 46 4f  rmId==VER_PLATFO
a4a0: 52 4d 5f 57 49 4e 33 32 5f 4e 54 20 3f 20 32 20  RM_WIN32_NT ? 2 
a4b0: 3a 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  : 1;.    }.    r
a4c0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6f 73  eturn sqlite3_os
a4d0: 5f 74 79 70 65 3d 3d 32 3b 0a 20 20 7d 0a 23 65  _type==2;.  }.#e
a4e0: 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
a4f0: 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43  ITE_WIN32_MALLOC
a500: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
a510: 6e 42 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79  nBytes of memory
a520: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
a530: 20 2a 77 69 6e 4d 65 6d 4d 61 6c 6c 6f 63 28 69   *winMemMalloc(i
a540: 6e 74 20 6e 42 79 74 65 73 29 7b 0a 20 20 48 41  nt nBytes){.  HA
a550: 4e 44 4c 45 20 68 48 65 61 70 3b 0a 20 20 76 6f  NDLE hHeap;.  vo
a560: 69 64 20 2a 70 3b 0a 0a 20 20 77 69 6e 4d 65 6d  id *p;..  winMem
a570: 41 73 73 65 72 74 4d 61 67 69 63 28 29 3b 0a 20  AssertMagic();. 
a580: 20 68 48 65 61 70 20 3d 20 77 69 6e 4d 65 6d 47   hHeap = winMemG
a590: 65 74 48 65 61 70 28 29 3b 0a 20 20 61 73 73 65  etHeap();.  asse
a5a0: 72 74 28 20 68 48 65 61 70 21 3d 30 20 29 3b 0a  rt( hHeap!=0 );.
a5b0: 20 20 61 73 73 65 72 74 28 20 68 48 65 61 70 21    assert( hHeap!
a5c0: 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f  =INVALID_HANDLE_
a5d0: 56 41 4c 55 45 20 29 3b 0a 23 69 66 20 21 53 51  VALUE );.#if !SQ
a5e0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
a5f0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
a600: 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c  WIN32_MALLOC_VAL
a610: 49 44 41 54 45 29 0a 20 20 61 73 73 65 72 74 28  IDATE).  assert(
a620: 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74 65 28   osHeapValidate(
a630: 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49  hHeap, SQLITE_WI
a640: 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20  N32_HEAP_FLAGS, 
a650: 4e 55 4c 4c 29 20 29 3b 0a 23 65 6e 64 69 66 0a  NULL) );.#endif.
a660: 20 20 61 73 73 65 72 74 28 20 6e 42 79 74 65 73    assert( nBytes
a670: 3e 3d 30 20 29 3b 0a 20 20 70 20 3d 20 6f 73 48  >=0 );.  p = osH
a680: 65 61 70 41 6c 6c 6f 63 28 68 48 65 61 70 2c 20  eapAlloc(hHeap, 
a690: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
a6a0: 50 5f 46 4c 41 47 53 2c 20 28 53 49 5a 45 5f 54  P_FLAGS, (SIZE_T
a6b0: 29 6e 42 79 74 65 73 29 3b 0a 20 20 69 66 28 20  )nBytes);.  if( 
a6c0: 21 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  !p ){.    sqlite
a6d0: 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d  3_log(SQLITE_NOM
a6e0: 45 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 48  EM, "failed to H
a6f0: 65 61 70 41 6c 6c 6f 63 20 25 75 20 62 79 74 65  eapAlloc %u byte
a700: 73 20 28 25 6c 75 29 2c 20 68 65 61 70 3d 25 70  s (%lu), heap=%p
a710: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
a720: 20 20 20 6e 42 79 74 65 73 2c 20 6f 73 47 65 74     nBytes, osGet
a730: 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 28 76 6f  LastError(), (vo
a740: 69 64 2a 29 68 48 65 61 70 29 3b 0a 20 20 7d 0a  id*)hHeap);.  }.
a750: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
a760: 2a 0a 2a 2a 20 46 72 65 65 20 6d 65 6d 6f 72 79  *.** Free memory
a770: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
a780: 20 77 69 6e 4d 65 6d 46 72 65 65 28 76 6f 69 64   winMemFree(void
a790: 20 2a 70 50 72 69 6f 72 29 7b 0a 20 20 48 41 4e   *pPrior){.  HAN
a7a0: 44 4c 45 20 68 48 65 61 70 3b 0a 0a 20 20 77 69  DLE hHeap;..  wi
a7b0: 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63 28  nMemAssertMagic(
a7c0: 29 3b 0a 20 20 68 48 65 61 70 20 3d 20 77 69 6e  );.  hHeap = win
a7d0: 4d 65 6d 47 65 74 48 65 61 70 28 29 3b 0a 20 20  MemGetHeap();.  
a7e0: 61 73 73 65 72 74 28 20 68 48 65 61 70 21 3d 30  assert( hHeap!=0
a7f0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48   );.  assert( hH
a800: 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e  eap!=INVALID_HAN
a810: 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66  DLE_VALUE );.#if
a820: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
a830: 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  T && defined(SQL
a840: 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43  ITE_WIN32_MALLOC
a850: 5f 56 41 4c 49 44 41 54 45 29 0a 20 20 61 73 73  _VALIDATE).  ass
a860: 65 72 74 28 20 6f 73 48 65 61 70 56 61 6c 69 64  ert( osHeapValid
a870: 61 74 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54  ate(hHeap, SQLIT
a880: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41  E_WIN32_HEAP_FLA
a890: 47 53 2c 20 70 50 72 69 6f 72 29 20 29 3b 0a 23  GS, pPrior) );.#
a8a0: 65 6e 64 69 66 0a 20 20 69 66 28 20 21 70 50 72  endif.  if( !pPr
a8b0: 69 6f 72 20 29 20 72 65 74 75 72 6e 3b 20 2f 2a  ior ) return; /*
a8c0: 20 50 61 73 73 69 6e 67 20 4e 55 4c 4c 20 74 6f   Passing NULL to
a8d0: 20 48 65 61 70 46 72 65 65 20 69 73 20 75 6e 64   HeapFree is und
a8e0: 65 66 69 6e 65 64 2e 20 2a 2f 0a 20 20 69 66 28  efined. */.  if(
a8f0: 20 21 6f 73 48 65 61 70 46 72 65 65 28 68 48 65   !osHeapFree(hHe
a900: 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ap, SQLITE_WIN32
a910: 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 70 50 72  _HEAP_FLAGS, pPr
a920: 69 6f 72 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  ior) ){.    sqli
a930: 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e  te3_log(SQLITE_N
a940: 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f  OMEM, "failed to
a950: 20 48 65 61 70 46 72 65 65 20 62 6c 6f 63 6b 20   HeapFree block 
a960: 25 70 20 28 25 6c 75 29 2c 20 68 65 61 70 3d 25  %p (%lu), heap=%
a970: 70 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  p",.            
a980: 20 20 20 20 70 50 72 69 6f 72 2c 20 6f 73 47 65      pPrior, osGe
a990: 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 28 76  tLastError(), (v
a9a0: 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a 20 20 7d  oid*)hHeap);.  }
a9b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
a9c0: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61 6e 20   the size of an 
a9d0: 65 78 69 73 74 69 6e 67 20 6d 65 6d 6f 72 79 20  existing memory 
a9e0: 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 73 74  allocation.*/.st
a9f0: 61 74 69 63 20 76 6f 69 64 20 2a 77 69 6e 4d 65  atic void *winMe
aa00: 6d 52 65 61 6c 6c 6f 63 28 76 6f 69 64 20 2a 70  mRealloc(void *p
aa10: 50 72 69 6f 72 2c 20 69 6e 74 20 6e 42 79 74 65  Prior, int nByte
aa20: 73 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 48 65  s){.  HANDLE hHe
aa30: 61 70 3b 0a 20 20 76 6f 69 64 20 2a 70 3b 0a 0a  ap;.  void *p;..
aa40: 20 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61    winMemAssertMa
aa50: 67 69 63 28 29 3b 0a 20 20 68 48 65 61 70 20 3d  gic();.  hHeap =
aa60: 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29   winMemGetHeap()
aa70: 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48 65 61  ;.  assert( hHea
aa80: 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  p!=0 );.  assert
aa90: 28 20 68 48 65 61 70 21 3d 49 4e 56 41 4c 49 44  ( hHeap!=INVALID
aaa0: 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b  _HANDLE_VALUE );
aab0: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
aac0: 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64  WINRT && defined
aad0: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41  (SQLITE_WIN32_MA
aae0: 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a 20  LLOC_VALIDATE). 
aaf0: 20 61 73 73 65 72 74 28 20 6f 73 48 65 61 70 56   assert( osHeapV
ab00: 61 6c 69 64 61 74 65 28 68 48 65 61 70 2c 20 53  alidate(hHeap, S
ab10: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
ab20: 5f 46 4c 41 47 53 2c 20 70 50 72 69 6f 72 29 20  _FLAGS, pPrior) 
ab30: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65  );.#endif.  asse
ab40: 72 74 28 20 6e 42 79 74 65 73 3e 3d 30 20 29 3b  rt( nBytes>=0 );
ab50: 0a 20 20 69 66 28 20 21 70 50 72 69 6f 72 20 29  .  if( !pPrior )
ab60: 7b 0a 20 20 20 20 70 20 3d 20 6f 73 48 65 61 70  {.    p = osHeap
ab70: 41 6c 6c 6f 63 28 68 48 65 61 70 2c 20 53 51 4c  Alloc(hHeap, SQL
ab80: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46  ITE_WIN32_HEAP_F
ab90: 4c 41 47 53 2c 20 28 53 49 5a 45 5f 54 29 6e 42  LAGS, (SIZE_T)nB
aba0: 79 74 65 73 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ytes);.  }else{.
abb0: 20 20 20 20 70 20 3d 20 6f 73 48 65 61 70 52 65      p = osHeapRe
abc0: 41 6c 6c 6f 63 28 68 48 65 61 70 2c 20 53 51 4c  Alloc(hHeap, SQL
abd0: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46  ITE_WIN32_HEAP_F
abe0: 4c 41 47 53 2c 20 70 50 72 69 6f 72 2c 20 28 53  LAGS, pPrior, (S
abf0: 49 5a 45 5f 54 29 6e 42 79 74 65 73 29 3b 0a 20  IZE_T)nBytes);. 
ac00: 20 7d 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20   }.  if( !p ){. 
ac10: 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53     sqlite3_log(S
ac20: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61  QLITE_NOMEM, "fa
ac30: 69 6c 65 64 20 74 6f 20 25 73 20 25 75 20 62 79  iled to %s %u by
ac40: 74 65 73 20 28 25 6c 75 29 2c 20 68 65 61 70 3d  tes (%lu), heap=
ac50: 25 70 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %p",.           
ac60: 20 20 20 20 20 70 50 72 69 6f 72 20 3f 20 22 48       pPrior ? "H
ac70: 65 61 70 52 65 41 6c 6c 6f 63 22 20 3a 20 22 48  eapReAlloc" : "H
ac80: 65 61 70 41 6c 6c 6f 63 22 2c 20 6e 42 79 74 65  eapAlloc", nByte
ac90: 73 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f  s, osGetLastErro
aca0: 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  r(),.           
acb0: 20 20 20 20 20 28 76 6f 69 64 2a 29 68 48 65 61       (void*)hHea
acc0: 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  p);.  }.  return
acd0: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   p;.}../*.** Ret
ace0: 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20  urn the size of 
acf0: 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 61  an outstanding a
ad00: 6c 6c 6f 63 61 74 69 6f 6e 2c 20 69 6e 20 62 79  llocation, in by
ad10: 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  tes..*/.static i
ad20: 6e 74 20 77 69 6e 4d 65 6d 53 69 7a 65 28 76 6f  nt winMemSize(vo
ad30: 69 64 20 2a 70 29 7b 0a 20 20 48 41 4e 44 4c 45  id *p){.  HANDLE
ad40: 20 68 48 65 61 70 3b 0a 20 20 53 49 5a 45 5f 54   hHeap;.  SIZE_T
ad50: 20 6e 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73 73   n;..  winMemAss
ad60: 65 72 74 4d 61 67 69 63 28 29 3b 0a 20 20 68 48  ertMagic();.  hH
ad70: 65 61 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74 48  eap = winMemGetH
ad80: 65 61 70 28 29 3b 0a 20 20 61 73 73 65 72 74 28  eap();.  assert(
ad90: 20 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61   hHeap!=0 );.  a
ada0: 73 73 65 72 74 28 20 68 48 65 61 70 21 3d 49 4e  ssert( hHeap!=IN
adb0: 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c  VALID_HANDLE_VAL
adc0: 55 45 20 29 3b 0a 23 69 66 20 21 53 51 4c 49 54  UE );.#if !SQLIT
add0: 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65  E_OS_WINRT && de
ade0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
adf0: 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41  32_MALLOC_VALIDA
ae00: 54 45 29 0a 20 20 61 73 73 65 72 74 28 20 6f 73  TE).  assert( os
ae10: 48 65 61 70 56 61 6c 69 64 61 74 65 28 68 48 65  HeapValidate(hHe
ae20: 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ap, SQLITE_WIN32
ae30: 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 70 29 20  _HEAP_FLAGS, p) 
ae40: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20  );.#endif.  if( 
ae50: 21 70 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  !p ) return 0;. 
ae60: 20 6e 20 3d 20 6f 73 48 65 61 70 53 69 7a 65 28   n = osHeapSize(
ae70: 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49  hHeap, SQLITE_WI
ae80: 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20  N32_HEAP_FLAGS, 
ae90: 70 29 3b 0a 20 20 69 66 28 20 6e 3d 3d 28 53 49  p);.  if( n==(SI
aea0: 5a 45 5f 54 29 2d 31 20 29 7b 0a 20 20 20 20 73  ZE_T)-1 ){.    s
aeb0: 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
aec0: 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64  E_NOMEM, "failed
aed0: 20 74 6f 20 48 65 61 70 53 69 7a 65 20 62 6c 6f   to HeapSize blo
aee0: 63 6b 20 25 70 20 28 25 6c 75 29 2c 20 68 65 61  ck %p (%lu), hea
aef0: 70 3d 25 70 22 2c 0a 20 20 20 20 20 20 20 20 20  p=%p",.         
af00: 20 20 20 20 20 20 20 70 2c 20 6f 73 47 65 74 4c         p, osGetL
af10: 61 73 74 45 72 72 6f 72 28 29 2c 20 28 76 6f 69  astError(), (voi
af20: 64 2a 29 68 48 65 61 70 29 3b 0a 20 20 20 20 72  d*)hHeap);.    r
af30: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72  eturn 0;.  }.  r
af40: 65 74 75 72 6e 20 28 69 6e 74 29 6e 3b 0a 7d 0a  eturn (int)n;.}.
af50: 0a 2f 2a 0a 2a 2a 20 52 6f 75 6e 64 20 75 70 20  ./*.** Round up 
af60: 61 20 72 65 71 75 65 73 74 20 73 69 7a 65 20 74  a request size t
af70: 6f 20 74 68 65 20 6e 65 78 74 20 76 61 6c 69 64  o the next valid
af80: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 69 7a 65   allocation size
af90: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
afa0: 77 69 6e 4d 65 6d 52 6f 75 6e 64 75 70 28 69 6e  winMemRoundup(in
afb0: 74 20 6e 29 7b 0a 20 20 72 65 74 75 72 6e 20 6e  t n){.  return n
afc0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  ;.}../*.** Initi
afd0: 61 6c 69 7a 65 20 74 68 69 73 20 6d 6f 64 75 6c  alize this modul
afe0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
aff0: 20 77 69 6e 4d 65 6d 49 6e 69 74 28 76 6f 69 64   winMemInit(void
b000: 20 2a 70 41 70 70 44 61 74 61 29 7b 0a 20 20 77   *pAppData){.  w
b010: 69 6e 4d 65 6d 44 61 74 61 20 2a 70 57 69 6e 4d  inMemData *pWinM
b020: 65 6d 44 61 74 61 20 3d 20 28 77 69 6e 4d 65 6d  emData = (winMem
b030: 44 61 74 61 20 2a 29 70 41 70 70 44 61 74 61 3b  Data *)pAppData;
b040: 0a 0a 20 20 69 66 28 20 21 70 57 69 6e 4d 65 6d  ..  if( !pWinMem
b050: 44 61 74 61 20 29 20 72 65 74 75 72 6e 20 53 51  Data ) return SQ
b060: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 61 73  LITE_ERROR;.  as
b070: 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61 74  sert( pWinMemDat
b080: 61 2d 3e 6d 61 67 69 63 31 3d 3d 57 49 4e 4d 45  a->magic1==WINME
b090: 4d 5f 4d 41 47 49 43 31 20 29 3b 0a 20 20 61 73  M_MAGIC1 );.  as
b0a0: 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61 74  sert( pWinMemDat
b0b0: 61 2d 3e 6d 61 67 69 63 32 3d 3d 57 49 4e 4d 45  a->magic2==WINME
b0c0: 4d 5f 4d 41 47 49 43 32 20 29 3b 0a 0a 23 69 66  M_MAGIC2 );..#if
b0d0: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
b0e0: 54 20 26 26 20 53 51 4c 49 54 45 5f 57 49 4e 33  T && SQLITE_WIN3
b0f0: 32 5f 48 45 41 50 5f 43 52 45 41 54 45 0a 20 20  2_HEAP_CREATE.  
b100: 69 66 28 20 21 70 57 69 6e 4d 65 6d 44 61 74 61  if( !pWinMemData
b110: 2d 3e 68 48 65 61 70 20 29 7b 0a 20 20 20 20 70  ->hHeap ){.    p
b120: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61  WinMemData->hHea
b130: 70 20 3d 20 6f 73 48 65 61 70 43 72 65 61 74 65  p = osHeapCreate
b140: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45  (SQLITE_WIN32_HE
b150: 41 50 5f 46 4c 41 47 53 2c 0a 20 20 20 20 20 20  AP_FLAGS,.      
b160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b180: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
b190: 50 5f 49 4e 49 54 5f 53 49 5a 45 2c 0a 20 20 20  P_INIT_SIZE,.   
b1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b1c0: 20 20 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f     SQLITE_WIN32_
b1d0: 48 45 41 50 5f 4d 41 58 5f 53 49 5a 45 29 3b 0a  HEAP_MAX_SIZE);.
b1e0: 20 20 20 20 69 66 28 20 21 70 57 69 6e 4d 65 6d      if( !pWinMem
b1f0: 44 61 74 61 2d 3e 68 48 65 61 70 20 29 7b 0a 20  Data->hHeap ){. 
b200: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67       sqlite3_log
b210: 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 0a 20  (SQLITE_NOMEM,. 
b220: 20 20 20 20 20 20 20 20 20 22 66 61 69 6c 65 64           "failed
b230: 20 74 6f 20 48 65 61 70 43 72 65 61 74 65 20 28   to HeapCreate (
b240: 25 6c 75 29 2c 20 66 6c 61 67 73 3d 25 75 2c 20  %lu), flags=%u, 
b250: 69 6e 69 74 53 69 7a 65 3d 25 75 2c 20 6d 61 78  initSize=%u, max
b260: 53 69 7a 65 3d 25 75 22 2c 0a 20 20 20 20 20 20  Size=%u",.      
b270: 20 20 20 20 6f 73 47 65 74 4c 61 73 74 45 72 72      osGetLastErr
b280: 6f 72 28 29 2c 20 53 51 4c 49 54 45 5f 57 49 4e  or(), SQLITE_WIN
b290: 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 0a 20  32_HEAP_FLAGS,. 
b2a0: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
b2b0: 57 49 4e 33 32 5f 48 45 41 50 5f 49 4e 49 54 5f  WIN32_HEAP_INIT_
b2c0: 53 49 5a 45 2c 20 53 51 4c 49 54 45 5f 57 49 4e  SIZE, SQLITE_WIN
b2d0: 33 32 5f 48 45 41 50 5f 4d 41 58 5f 53 49 5a 45  32_HEAP_MAX_SIZE
b2e0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
b2f0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
b300: 20 20 7d 0a 20 20 20 20 70 57 69 6e 4d 65 6d 44    }.    pWinMemD
b310: 61 74 61 2d 3e 62 4f 77 6e 65 64 20 3d 20 54 52  ata->bOwned = TR
b320: 55 45 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  UE;.    assert( 
b330: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f 77  pWinMemData->bOw
b340: 6e 65 64 20 29 3b 0a 20 20 7d 0a 23 65 6c 73 65  ned );.  }.#else
b350: 0a 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e  .  pWinMemData->
b360: 68 48 65 61 70 20 3d 20 6f 73 47 65 74 50 72 6f  hHeap = osGetPro
b370: 63 65 73 73 48 65 61 70 28 29 3b 0a 20 20 69 66  cessHeap();.  if
b380: 28 20 21 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e  ( !pWinMemData->
b390: 68 48 65 61 70 20 29 7b 0a 20 20 20 20 73 71 6c  hHeap ){.    sql
b3a0: 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
b3b0: 4e 4f 4d 45 4d 2c 0a 20 20 20 20 20 20 20 20 22  NOMEM,.        "
b3c0: 66 61 69 6c 65 64 20 74 6f 20 47 65 74 50 72 6f  failed to GetPro
b3d0: 63 65 73 73 48 65 61 70 20 28 25 6c 75 29 22 2c  cessHeap (%lu)",
b3e0: 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
b3f0: 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ));.    return S
b400: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
b410: 0a 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e  .  pWinMemData->
b420: 62 4f 77 6e 65 64 20 3d 20 46 41 4c 53 45 3b 0a  bOwned = FALSE;.
b430: 20 20 61 73 73 65 72 74 28 20 21 70 57 69 6e 4d    assert( !pWinM
b440: 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20 29  emData->bOwned )
b450: 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72  ;.#endif.  asser
b460: 74 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e  t( pWinMemData->
b470: 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61 73  hHeap!=0 );.  as
b480: 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61 74  sert( pWinMemDat
b490: 61 2d 3e 68 48 65 61 70 21 3d 49 4e 56 41 4c 49  a->hHeap!=INVALI
b4a0: 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29  D_HANDLE_VALUE )
b4b0: 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ;.#if !SQLITE_OS
b4c0: 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65  _WINRT && define
b4d0: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d  d(SQLITE_WIN32_M
b4e0: 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a  ALLOC_VALIDATE).
b4f0: 20 20 61 73 73 65 72 74 28 20 6f 73 48 65 61 70    assert( osHeap
b500: 56 61 6c 69 64 61 74 65 28 70 57 69 6e 4d 65 6d  Validate(pWinMem
b510: 44 61 74 61 2d 3e 68 48 65 61 70 2c 20 53 51 4c  Data->hHeap, SQL
b520: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46  ITE_WIN32_HEAP_F
b530: 4c 41 47 53 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23  LAGS, NULL) );.#
b540: 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53  endif.  return S
b550: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
b560: 2a 2a 20 44 65 69 6e 69 74 69 61 6c 69 7a 65 20  ** Deinitialize 
b570: 74 68 69 73 20 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a  this module..*/.
b580: 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 4d  static void winM
b590: 65 6d 53 68 75 74 64 6f 77 6e 28 76 6f 69 64 20  emShutdown(void 
b5a0: 2a 70 41 70 70 44 61 74 61 29 7b 0a 20 20 77 69  *pAppData){.  wi
b5b0: 6e 4d 65 6d 44 61 74 61 20 2a 70 57 69 6e 4d 65  nMemData *pWinMe
b5c0: 6d 44 61 74 61 20 3d 20 28 77 69 6e 4d 65 6d 44  mData = (winMemD
b5d0: 61 74 61 20 2a 29 70 41 70 70 44 61 74 61 3b 0a  ata *)pAppData;.
b5e0: 0a 20 20 69 66 28 20 21 70 57 69 6e 4d 65 6d 44  .  if( !pWinMemD
b5f0: 61 74 61 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ata ) return;.  
b600: 61 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44  assert( pWinMemD
b610: 61 74 61 2d 3e 6d 61 67 69 63 31 3d 3d 57 49 4e  ata->magic1==WIN
b620: 4d 45 4d 5f 4d 41 47 49 43 31 20 29 3b 0a 20 20  MEM_MAGIC1 );.  
b630: 61 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44  assert( pWinMemD
b640: 61 74 61 2d 3e 6d 61 67 69 63 32 3d 3d 57 49 4e  ata->magic2==WIN
b650: 4d 45 4d 5f 4d 41 47 49 43 32 20 29 3b 0a 0a 20  MEM_MAGIC2 );.. 
b660: 20 69 66 28 20 70 57 69 6e 4d 65 6d 44 61 74 61   if( pWinMemData
b670: 2d 3e 68 48 65 61 70 20 29 7b 0a 20 20 20 20 61  ->hHeap ){.    a
b680: 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61  ssert( pWinMemDa
b690: 74 61 2d 3e 68 48 65 61 70 21 3d 49 4e 56 41 4c  ta->hHeap!=INVAL
b6a0: 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20  ID_HANDLE_VALUE 
b6b0: 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  );.#if !SQLITE_O
b6c0: 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e  S_WINRT && defin
b6d0: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
b6e0: 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29  MALLOC_VALIDATE)
b6f0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 73 48  .    assert( osH
b700: 65 61 70 56 61 6c 69 64 61 74 65 28 70 57 69 6e  eapValidate(pWin
b710: 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 2c 20  MemData->hHeap, 
b720: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
b730: 50 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c 29 20 29  P_FLAGS, NULL) )
b740: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  ;.#endif.    if(
b750: 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f   pWinMemData->bO
b760: 77 6e 65 64 20 29 7b 0a 20 20 20 20 20 20 69 66  wned ){.      if
b770: 28 20 21 6f 73 48 65 61 70 44 65 73 74 72 6f 79  ( !osHeapDestroy
b780: 28 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48  (pWinMemData->hH
b790: 65 61 70 29 20 29 7b 0a 20 20 20 20 20 20 20 20  eap) ){.        
b7a0: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49  sqlite3_log(SQLI
b7b0: 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65  TE_NOMEM, "faile
b7c0: 64 20 74 6f 20 48 65 61 70 44 65 73 74 72 6f 79  d to HeapDestroy
b7d0: 20 28 25 6c 75 29 2c 20 68 65 61 70 3d 25 70 22   (%lu), heap=%p"
b7e0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
b7f0: 20 20 20 20 20 20 6f 73 47 65 74 4c 61 73 74 45        osGetLastE
b800: 72 72 6f 72 28 29 2c 20 28 76 6f 69 64 2a 29 70  rror(), (void*)p
b810: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61  WinMemData->hHea
b820: 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  p);.      }.    
b830: 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62    pWinMemData->b
b840: 4f 77 6e 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20  Owned = FALSE;. 
b850: 20 20 20 7d 0a 20 20 20 20 70 57 69 6e 4d 65 6d     }.    pWinMem
b860: 44 61 74 61 2d 3e 68 48 65 61 70 20 3d 20 4e 55  Data->hHeap = NU
b870: 4c 4c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  LL;.  }.}../*.**
b880: 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 6c 6f   Populate the lo
b890: 77 2d 6c 65 76 65 6c 20 6d 65 6d 6f 72 79 20 61  w-level memory a
b8a0: 6c 6c 6f 63 61 74 69 6f 6e 20 66 75 6e 63 74 69  llocation functi
b8b0: 6f 6e 20 70 6f 69 6e 74 65 72 73 20 69 6e 0a 2a  on pointers in.*
b8c0: 2a 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  * sqlite3GlobalC
b8d0: 6f 6e 66 69 67 2e 6d 20 77 69 74 68 20 70 6f 69  onfig.m with poi
b8e0: 6e 74 65 72 73 20 74 6f 20 74 68 65 20 72 6f 75  nters to the rou
b8f0: 74 69 6e 65 73 20 69 6e 20 74 68 69 73 20 66 69  tines in this fi
b900: 6c 65 2e 20 54 68 65 0a 2a 2a 20 61 72 67 75 6d  le. The.** argum
b910: 65 6e 74 73 20 73 70 65 63 69 66 79 20 74 68 65  ents specify the
b920: 20 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72 79   block of memory
b930: 20 74 6f 20 6d 61 6e 61 67 65 2e 0a 2a 2a 0a 2a   to manage..**.*
b940: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
b950: 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62 79  s only called by
b960: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28   sqlite3_config(
b970: 29 2c 20 61 6e 64 20 74 68 65 72 65 66 6f 72 65  ), and therefore
b980: 0a 2a 2a 20 69 73 20 6e 6f 74 20 72 65 71 75 69  .** is not requi
b990: 72 65 64 20 74 6f 20 62 65 20 74 68 72 65 61 64  red to be thread
b9a0: 73 61 66 65 20 28 69 74 20 69 73 20 6e 6f 74 29  safe (it is not)
b9b0: 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 73 71 6c 69 74  ..*/.const sqlit
b9c0: 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 2a  e3_mem_methods *
b9d0: 73 71 6c 69 74 65 33 4d 65 6d 47 65 74 57 69 6e  sqlite3MemGetWin
b9e0: 33 32 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74  32(void){.  stat
b9f0: 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
ba00: 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 77 69 6e  _mem_methods win
ba10: 4d 65 6d 4d 65 74 68 6f 64 73 20 3d 20 7b 0a 20  MemMethods = {. 
ba20: 20 20 20 77 69 6e 4d 65 6d 4d 61 6c 6c 6f 63 2c     winMemMalloc,
ba30: 0a 20 20 20 20 77 69 6e 4d 65 6d 46 72 65 65 2c  .    winMemFree,
ba40: 0a 20 20 20 20 77 69 6e 4d 65 6d 52 65 61 6c 6c  .    winMemReall
ba50: 6f 63 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 53 69  oc,.    winMemSi
ba60: 7a 65 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 52 6f  ze,.    winMemRo
ba70: 75 6e 64 75 70 2c 0a 20 20 20 20 77 69 6e 4d 65  undup,.    winMe
ba80: 6d 49 6e 69 74 2c 0a 20 20 20 20 77 69 6e 4d 65  mInit,.    winMe
ba90: 6d 53 68 75 74 64 6f 77 6e 2c 0a 20 20 20 20 26  mShutdown,.    &
baa0: 77 69 6e 5f 6d 65 6d 5f 64 61 74 61 0a 20 20 7d  win_mem_data.  }
bab0: 3b 0a 20 20 72 65 74 75 72 6e 20 26 77 69 6e 4d  ;.  return &winM
bac0: 65 6d 4d 65 74 68 6f 64 73 3b 0a 7d 0a 0a 76 6f  emMethods;.}..vo
bad0: 69 64 20 73 71 6c 69 74 65 33 4d 65 6d 53 65 74  id sqlite3MemSet
bae0: 44 65 66 61 75 6c 74 28 76 6f 69 64 29 7b 0a 20  Default(void){. 
baf0: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28   sqlite3_config(
bb00: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 41  SQLITE_CONFIG_MA
bb10: 4c 4c 4f 43 2c 20 73 71 6c 69 74 65 33 4d 65 6d  LLOC, sqlite3Mem
bb20: 47 65 74 57 69 6e 33 32 28 29 29 3b 0a 7d 0a 23  GetWin32());.}.#
bb30: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
bb40: 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 20 2a 2f 0a  WIN32_MALLOC */.
bb50: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61  ./*.** Convert a
bb60: 20 55 54 46 2d 38 20 73 74 72 69 6e 67 20 74 6f   UTF-8 string to
bb70: 20 4d 69 63 72 6f 73 6f 66 74 20 55 6e 69 63 6f   Microsoft Unico
bb80: 64 65 20 28 55 54 46 2d 31 36 3f 29 2e 20 0a 2a  de (UTF-16?). .*
bb90: 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f  *.** Space to ho
bba0: 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  ld the returned 
bbb0: 73 74 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e  string is obtain
bbc0: 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 0a  ed from malloc..
bbd0: 2a 2f 0a 73 74 61 74 69 63 20 4c 50 57 53 54 52  */.static LPWSTR
bbe0: 20 77 69 6e 55 74 66 38 54 6f 55 6e 69 63 6f 64   winUtf8ToUnicod
bbf0: 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  e(const char *zF
bc00: 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20  ilename){.  int 
bc10: 6e 43 68 61 72 3b 0a 20 20 4c 50 57 53 54 52 20  nChar;.  LPWSTR 
bc20: 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 3b 0a 0a  zWideFilename;..
bc30: 20 20 6e 43 68 61 72 20 3d 20 6f 73 4d 75 6c 74    nChar = osMult
bc40: 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 28  iByteToWideChar(
bc50: 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a 46 69 6c  CP_UTF8, 0, zFil
bc60: 65 6e 61 6d 65 2c 20 2d 31 2c 20 4e 55 4c 4c 2c  ename, -1, NULL,
bc70: 20 30 29 3b 0a 20 20 69 66 28 20 6e 43 68 61 72   0);.  if( nChar
bc80: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
bc90: 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 57 69 64 65  n 0;.  }.  zWide
bca0: 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74  Filename = sqlit
bcb0: 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 43  e3MallocZero( nC
bcc0: 68 61 72 2a 73 69 7a 65 6f 66 28 7a 57 69 64 65  har*sizeof(zWide
bcd0: 46 69 6c 65 6e 61 6d 65 5b 30 5d 29 20 29 3b 0a  Filename[0]) );.
bce0: 20 20 69 66 28 20 7a 57 69 64 65 46 69 6c 65 6e    if( zWideFilen
bcf0: 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ame==0 ){.    re
bd00: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 43  turn 0;.  }.  nC
bd10: 68 61 72 20 3d 20 6f 73 4d 75 6c 74 69 42 79 74  har = osMultiByt
bd20: 65 54 6f 57 69 64 65 43 68 61 72 28 43 50 5f 55  eToWideChar(CP_U
bd30: 54 46 38 2c 20 30 2c 20 7a 46 69 6c 65 6e 61 6d  TF8, 0, zFilenam
bd40: 65 2c 20 2d 31 2c 20 7a 57 69 64 65 46 69 6c 65  e, -1, zWideFile
bd50: 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20  name,.          
bd60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd70: 20 20 20 20 20 20 6e 43 68 61 72 29 3b 0a 20 20        nChar);.  
bd80: 69 66 28 20 6e 43 68 61 72 3d 3d 30 20 29 7b 0a  if( nChar==0 ){.
bd90: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
bda0: 28 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 29 3b  (zWideFilename);
bdb0: 0a 20 20 20 20 7a 57 69 64 65 46 69 6c 65 6e 61  .    zWideFilena
bdc0: 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  me = 0;.  }.  re
bdd0: 74 75 72 6e 20 7a 57 69 64 65 46 69 6c 65 6e 61  turn zWideFilena
bde0: 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  me;.}../*.** Con
bdf0: 76 65 72 74 20 4d 69 63 72 6f 73 6f 66 74 20 55  vert Microsoft U
be00: 6e 69 63 6f 64 65 20 74 6f 20 55 54 46 2d 38 2e  nicode to UTF-8.
be10: 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20    Space to hold 
be20: 74 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72  the returned str
be30: 69 6e 67 20 69 73 0a 2a 2a 20 6f 62 74 61 69 6e  ing is.** obtain
be40: 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f  ed from sqlite3_
be50: 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61  malloc()..*/.sta
be60: 74 69 63 20 63 68 61 72 20 2a 77 69 6e 55 6e 69  tic char *winUni
be70: 63 6f 64 65 54 6f 55 74 66 38 28 4c 50 43 57 53  codeToUtf8(LPCWS
be80: 54 52 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65  TR zWideFilename
be90: 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a  ){.  int nByte;.
bea0: 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d    char *zFilenam
beb0: 65 3b 0a 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73  e;..  nByte = os
bec0: 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42  WideCharToMultiB
bed0: 79 74 65 28 43 50 5f 55 54 46 38 2c 20 30 2c 20  yte(CP_UTF8, 0, 
bee0: 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c 20 2d  zWideFilename, -
bef0: 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  1, 0, 0, 0, 0);.
bf00: 20 20 69 66 28 20 6e 42 79 74 65 20 3d 3d 20 30    if( nByte == 0
bf10: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
bf20: 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d  ;.  }.  zFilenam
bf30: 65 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  e = sqlite3Mallo
bf40: 63 5a 65 72 6f 28 20 6e 42 79 74 65 20 29 3b 0a  cZero( nByte );.
bf50: 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 3d    if( zFilename=
bf60: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
bf70: 20 30 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20   0;.  }.  nByte 
bf80: 3d 20 6f 73 57 69 64 65 43 68 61 72 54 6f 4d 75  = osWideCharToMu
bf90: 6c 74 69 42 79 74 65 28 43 50 5f 55 54 46 38 2c  ltiByte(CP_UTF8,
bfa0: 20 30 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d   0, zWideFilenam
bfb0: 65 2c 20 2d 31 2c 20 7a 46 69 6c 65 6e 61 6d 65  e, -1, zFilename
bfc0: 2c 20 6e 42 79 74 65 2c 0a 20 20 20 20 20 20 20  , nByte,.       
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 20 30 29 3b 0a           0, 0);.
bff0: 20 20 69 66 28 20 6e 42 79 74 65 20 3d 3d 20 30    if( nByte == 0
c000: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
c010: 66 72 65 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  free(zFilename);
c020: 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d  .    zFilename =
c030: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
c040: 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f   zFilename;.}../
c050: 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 6e 20  *.** Convert an 
c060: 41 4e 53 49 20 73 74 72 69 6e 67 20 74 6f 20 4d  ANSI string to M
c070: 69 63 72 6f 73 6f 66 74 20 55 6e 69 63 6f 64 65  icrosoft Unicode
c080: 2c 20 62 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a  , based on the.*
c090: 2a 20 63 75 72 72 65 6e 74 20 63 6f 64 65 70 61  * current codepa
c0a0: 67 65 20 73 65 74 74 69 6e 67 73 20 66 6f 72 20  ge settings for 
c0b0: 66 69 6c 65 20 61 70 69 73 2e 0a 2a 2a 20 0a 2a  file apis..** .*
c0c0: 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20  * Space to hold 
c0d0: 74 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72  the returned str
c0e0: 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64 0a  ing is obtained.
c0f0: 2a 2a 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f  ** from sqlite3_
c100: 6d 61 6c 6c 6f 63 2e 0a 2a 2f 0a 73 74 61 74 69  malloc..*/.stati
c110: 63 20 4c 50 57 53 54 52 20 77 69 6e 4d 62 63 73  c LPWSTR winMbcs
c120: 54 6f 55 6e 69 63 6f 64 65 28 63 6f 6e 73 74 20  ToUnicode(const 
c130: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29  char *zFilename)
c140: 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20  {.  int nByte;. 
c150: 20 4c 50 57 53 54 52 20 7a 4d 62 63 73 46 69 6c   LPWSTR zMbcsFil
c160: 65 6e 61 6d 65 3b 0a 20 20 69 6e 74 20 63 6f 64  ename;.  int cod
c170: 65 70 61 67 65 20 3d 20 6f 73 41 72 65 46 69 6c  epage = osAreFil
c180: 65 41 70 69 73 41 4e 53 49 28 29 20 3f 20 43 50  eApisANSI() ? CP
c190: 5f 41 43 50 20 3a 20 43 50 5f 4f 45 4d 43 50 3b  _ACP : CP_OEMCP;
c1a0: 0a 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73 4d 75  ..  nByte = osMu
c1b0: 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43 68 61  ltiByteToWideCha
c1c0: 72 28 63 6f 64 65 70 61 67 65 2c 20 30 2c 20 7a  r(codepage, 0, z
c1d0: 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 4e 55  Filename, -1, NU
c1e0: 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  LL,.            
c1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c200: 20 20 20 20 30 29 2a 73 69 7a 65 6f 66 28 57 43      0)*sizeof(WC
c210: 48 41 52 29 3b 0a 20 20 69 66 28 20 6e 42 79 74  HAR);.  if( nByt
c220: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  e==0 ){.    retu
c230: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 4d 62 63  rn 0;.  }.  zMbc
c240: 73 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c 69  sFilename = sqli
c250: 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e  te3MallocZero( n
c260: 42 79 74 65 2a 73 69 7a 65 6f 66 28 7a 4d 62 63  Byte*sizeof(zMbc
c270: 73 46 69 6c 65 6e 61 6d 65 5b 30 5d 29 20 29 3b  sFilename[0]) );
c280: 0a 20 20 69 66 28 20 7a 4d 62 63 73 46 69 6c 65  .  if( zMbcsFile
c290: 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72  name==0 ){.    r
c2a0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e  eturn 0;.  }.  n
c2b0: 42 79 74 65 20 3d 20 6f 73 4d 75 6c 74 69 42 79  Byte = osMultiBy
c2c0: 74 65 54 6f 57 69 64 65 43 68 61 72 28 63 6f 64  teToWideChar(cod
c2d0: 65 70 61 67 65 2c 20 30 2c 20 7a 46 69 6c 65 6e  epage, 0, zFilen
c2e0: 61 6d 65 2c 20 2d 31 2c 20 7a 4d 62 63 73 46 69  ame, -1, zMbcsFi
c2f0: 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  lename,.        
c300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c310: 20 20 20 20 20 20 20 20 6e 42 79 74 65 29 3b 0a          nByte);.
c320: 20 20 69 66 28 20 6e 42 79 74 65 3d 3d 30 20 29    if( nByte==0 )
c330: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
c340: 65 65 28 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65  ee(zMbcsFilename
c350: 29 3b 0a 20 20 20 20 7a 4d 62 63 73 46 69 6c 65  );.    zMbcsFile
c360: 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  name = 0;.  }.  
c370: 72 65 74 75 72 6e 20 7a 4d 62 63 73 46 69 6c 65  return zMbcsFile
c380: 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  name;.}../*.** C
c390: 6f 6e 76 65 72 74 20 4d 69 63 72 6f 73 6f 66 74  onvert Microsoft
c3a0: 20 55 6e 69 63 6f 64 65 20 74 6f 20 6d 75 6c 74   Unicode to mult
c3b0: 69 2d 62 79 74 65 20 63 68 61 72 61 63 74 65 72  i-byte character
c3c0: 20 73 74 72 69 6e 67 2c 20 62 61 73 65 64 20 6f   string, based o
c3d0: 6e 20 74 68 65 0a 2a 2a 20 75 73 65 72 27 73 20  n the.** user's 
c3e0: 41 4e 53 49 20 63 6f 64 65 70 61 67 65 2e 0a 2a  ANSI codepage..*
c3f0: 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f  *.** Space to ho
c400: 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  ld the returned 
c410: 73 74 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e  string is obtain
c420: 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74  ed from.** sqlit
c430: 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a  e3_malloc()..*/.
c440: 73 74 61 74 69 63 20 63 68 61 72 20 2a 77 69 6e  static char *win
c450: 55 6e 69 63 6f 64 65 54 6f 4d 62 63 73 28 4c 50  UnicodeToMbcs(LP
c460: 43 57 53 54 52 20 7a 57 69 64 65 46 69 6c 65 6e  CWSTR zWideFilen
c470: 61 6d 65 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74  ame){.  int nByt
c480: 65 3b 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65  e;.  char *zFile
c490: 6e 61 6d 65 3b 0a 20 20 69 6e 74 20 63 6f 64 65  name;.  int code
c4a0: 70 61 67 65 20 3d 20 6f 73 41 72 65 46 69 6c 65  page = osAreFile
c4b0: 41 70 69 73 41 4e 53 49 28 29 20 3f 20 43 50 5f  ApisANSI() ? CP_
c4c0: 41 43 50 20 3a 20 43 50 5f 4f 45 4d 43 50 3b 0a  ACP : CP_OEMCP;.
c4d0: 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73 57 69 64  .  nByte = osWid
c4e0: 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65  eCharToMultiByte
c4f0: 28 63 6f 64 65 70 61 67 65 2c 20 30 2c 20 7a 57  (codepage, 0, zW
c500: 69 64 65 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c  ideFilename, -1,
c510: 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20   0, 0, 0, 0);.  
c520: 69 66 28 20 6e 42 79 74 65 20 3d 3d 20 30 20 29  if( nByte == 0 )
c530: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
c540: 20 20 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20    }.  zFilename 
c550: 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  = sqlite3MallocZ
c560: 65 72 6f 28 20 6e 42 79 74 65 20 29 3b 0a 20 20  ero( nByte );.  
c570: 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30  if( zFilename==0
c580: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
c590: 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20  ;.  }.  nByte = 
c5a0: 6f 73 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74  osWideCharToMult
c5b0: 69 42 79 74 65 28 63 6f 64 65 70 61 67 65 2c 20  iByte(codepage, 
c5c0: 30 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65  0, zWideFilename
c5d0: 2c 20 2d 31 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  , -1, zFilename,
c5e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
c5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c600: 20 6e 42 79 74 65 2c 20 30 2c 20 30 29 3b 0a 20   nByte, 0, 0);. 
c610: 20 69 66 28 20 6e 42 79 74 65 20 3d 3d 20 30 20   if( nByte == 0 
c620: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
c630: 72 65 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  ree(zFilename);.
c640: 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20      zFilename = 
c650: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
c660: 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a  zFilename;.}../*
c670: 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 6d 75 6c 74  .** Convert mult
c680: 69 62 79 74 65 20 63 68 61 72 61 63 74 65 72 20  ibyte character 
c690: 73 74 72 69 6e 67 20 74 6f 20 55 54 46 2d 38 2e  string to UTF-8.
c6a0: 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20    Space to hold 
c6b0: 74 68 65 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20  the.** returned 
c6c0: 73 74 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e  string is obtain
c6d0: 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f  ed from sqlite3_
c6e0: 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 63 68 61  malloc()..*/.cha
c6f0: 72 20 2a 73 71 6c 69 74 65 33 5f 77 69 6e 33 32  r *sqlite3_win32
c700: 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28 63 6f  _mbcs_to_utf8(co
c710: 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
c720: 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 46  ame){.  char *zF
c730: 69 6c 65 6e 61 6d 65 55 74 66 38 3b 0a 20 20 4c  ilenameUtf8;.  L
c740: 50 57 53 54 52 20 7a 54 6d 70 57 69 64 65 3b 0a  PWSTR zTmpWide;.
c750: 0a 20 20 7a 54 6d 70 57 69 64 65 20 3d 20 77 69  .  zTmpWide = wi
c760: 6e 4d 62 63 73 54 6f 55 6e 69 63 6f 64 65 28 7a  nMbcsToUnicode(z
c770: 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28  Filename);.  if(
c780: 20 7a 54 6d 70 57 69 64 65 3d 3d 30 20 29 7b 0a   zTmpWide==0 ){.
c790: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
c7a0: 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 55 74 66  }.  zFilenameUtf
c7b0: 38 20 3d 20 77 69 6e 55 6e 69 63 6f 64 65 54 6f  8 = winUnicodeTo
c7c0: 55 74 66 38 28 7a 54 6d 70 57 69 64 65 29 3b 0a  Utf8(zTmpWide);.
c7d0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
c7e0: 54 6d 70 57 69 64 65 29 3b 0a 20 20 72 65 74 75  TmpWide);.  retu
c7f0: 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 55 74 66 38  rn zFilenameUtf8
c800: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  ;.}../*.** Conve
c810: 72 74 20 55 54 46 2d 38 20 74 6f 20 6d 75 6c 74  rt UTF-8 to mult
c820: 69 62 79 74 65 20 63 68 61 72 61 63 74 65 72 20  ibyte character 
c830: 73 74 72 69 6e 67 2e 20 20 53 70 61 63 65 20 74  string.  Space t
c840: 6f 20 68 6f 6c 64 20 74 68 65 20 0a 2a 2a 20 72  o hold the .** r
c850: 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69  eturned string i
c860: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
c870: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29  sqlite3_malloc()
c880: 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74  ..*/.char *sqlit
c890: 65 33 5f 77 69 6e 33 32 5f 75 74 66 38 5f 74 6f  e3_win32_utf8_to
c8a0: 5f 6d 62 63 73 28 63 6f 6e 73 74 20 63 68 61 72  _mbcs(const char
c8b0: 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20   *zFilename){.  
c8c0: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 4d  char *zFilenameM
c8d0: 62 63 73 3b 0a 20 20 4c 50 57 53 54 52 20 7a 54  bcs;.  LPWSTR zT
c8e0: 6d 70 57 69 64 65 3b 0a 0a 20 20 7a 54 6d 70 57  mpWide;..  zTmpW
c8f0: 69 64 65 20 3d 20 77 69 6e 55 74 66 38 54 6f 55  ide = winUtf8ToU
c900: 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65  nicode(zFilename
c910: 29 3b 0a 20 20 69 66 28 20 7a 54 6d 70 57 69 64  );.  if( zTmpWid
c920: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  e==0 ){.    retu
c930: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c  rn 0;.  }.  zFil
c940: 65 6e 61 6d 65 4d 62 63 73 20 3d 20 77 69 6e 55  enameMbcs = winU
c950: 6e 69 63 6f 64 65 54 6f 4d 62 63 73 28 7a 54 6d  nicodeToMbcs(zTm
c960: 70 57 69 64 65 29 3b 0a 20 20 73 71 6c 69 74 65  pWide);.  sqlite
c970: 33 5f 66 72 65 65 28 7a 54 6d 70 57 69 64 65 29  3_free(zTmpWide)
c980: 3b 0a 20 20 72 65 74 75 72 6e 20 7a 46 69 6c 65  ;.  return zFile
c990: 6e 61 6d 65 4d 62 63 73 3b 0a 7d 0a 0a 2f 2a 0a  nameMbcs;.}../*.
c9a0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
c9b0: 20 73 65 74 73 20 74 68 65 20 64 61 74 61 20 64   sets the data d
c9c0: 69 72 65 63 74 6f 72 79 20 6f 72 20 74 68 65 20  irectory or the 
c9d0: 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74  temporary direct
c9e0: 6f 72 79 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20  ory based on.** 
c9f0: 74 68 65 20 70 72 6f 76 69 64 65 64 20 61 72 67  the provided arg
ca00: 75 6d 65 6e 74 73 2e 20 20 54 68 65 20 74 79 70  uments.  The typ
ca10: 65 20 61 72 67 75 6d 65 6e 74 20 6d 75 73 74 20  e argument must 
ca20: 62 65 20 31 20 69 6e 20 6f 72 64 65 72 20 74 6f  be 1 in order to
ca30: 20 73 65 74 20 74 68 65 0a 2a 2a 20 64 61 74 61   set the.** data
ca40: 20 64 69 72 65 63 74 6f 72 79 20 6f 72 20 32 20   directory or 2 
ca50: 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 65 74 20  in order to set 
ca60: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 64 69  the temporary di
ca70: 72 65 63 74 6f 72 79 2e 20 20 54 68 65 20 7a 56  rectory.  The zV
ca80: 61 6c 75 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  alue.** argument
ca90: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
caa0: 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 74 6f  the directory to
cab0: 20 75 73 65 2e 20 20 54 68 65 20 72 65 74 75 72   use.  The retur
cac0: 6e 20 76 61 6c 75 65 20 77 69 6c 6c 20 62 65 0a  n value will be.
cad0: 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  ** SQLITE_OK if 
cae0: 73 75 63 63 65 73 73 66 75 6c 2e 0a 2a 2f 0a 69  successful..*/.i
caf0: 6e 74 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32  nt sqlite3_win32
cb00: 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79 28 44  _set_directory(D
cb10: 57 4f 52 44 20 74 79 70 65 2c 20 4c 50 43 57 53  WORD type, LPCWS
cb20: 54 52 20 7a 56 61 6c 75 65 29 7b 0a 20 20 63 68  TR zValue){.  ch
cb30: 61 72 20 2a 2a 70 70 44 69 72 65 63 74 6f 72 79  ar **ppDirectory
cb40: 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 0;.#ifndef SQ
cb50: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e  LITE_OMIT_AUTOIN
cb60: 49 54 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71  IT.  int rc = sq
cb70: 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65  lite3_initialize
cb80: 28 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  ();.  if( rc ) r
cb90: 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66  eturn rc;.#endif
cba0: 0a 20 20 69 66 28 20 74 79 70 65 3d 3d 53 51 4c  .  if( type==SQL
cbb0: 49 54 45 5f 57 49 4e 33 32 5f 44 41 54 41 5f 44  ITE_WIN32_DATA_D
cbc0: 49 52 45 43 54 4f 52 59 5f 54 59 50 45 20 29 7b  IRECTORY_TYPE ){
cbd0: 0a 20 20 20 20 70 70 44 69 72 65 63 74 6f 72 79  .    ppDirectory
cbe0: 20 3d 20 26 73 71 6c 69 74 65 33 5f 64 61 74 61   = &sqlite3_data
cbf0: 5f 64 69 72 65 63 74 6f 72 79 3b 0a 20 20 7d 65  _directory;.  }e
cc00: 6c 73 65 20 69 66 28 20 74 79 70 65 3d 3d 53 51  lse if( type==SQ
cc10: 4c 49 54 45 5f 57 49 4e 33 32 5f 54 45 4d 50 5f  LITE_WIN32_TEMP_
cc20: 44 49 52 45 43 54 4f 52 59 5f 54 59 50 45 20 29  DIRECTORY_TYPE )
cc30: 7b 0a 20 20 20 20 70 70 44 69 72 65 63 74 6f 72  {.    ppDirector
cc40: 79 20 3d 20 26 73 71 6c 69 74 65 33 5f 74 65 6d  y = &sqlite3_tem
cc50: 70 5f 64 69 72 65 63 74 6f 72 79 3b 0a 20 20 7d  p_directory;.  }
cc60: 0a 20 20 61 73 73 65 72 74 28 20 21 70 70 44 69  .  assert( !ppDi
cc70: 72 65 63 74 6f 72 79 20 7c 7c 20 74 79 70 65 3d  rectory || type=
cc80: 3d 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 41  =SQLITE_WIN32_DA
cc90: 54 41 5f 44 49 52 45 43 54 4f 52 59 5f 54 59 50  TA_DIRECTORY_TYP
cca0: 45 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 74  E.          || t
ccb0: 79 70 65 3d 3d 53 51 4c 49 54 45 5f 57 49 4e 33  ype==SQLITE_WIN3
ccc0: 32 5f 54 45 4d 50 5f 44 49 52 45 43 54 4f 52 59  2_TEMP_DIRECTORY
ccd0: 5f 54 59 50 45 0a 20 20 29 3b 0a 20 20 61 73 73  _TYPE.  );.  ass
cce0: 65 72 74 28 20 21 70 70 44 69 72 65 63 74 6f 72  ert( !ppDirector
ccf0: 79 20 7c 7c 20 73 71 6c 69 74 65 33 4d 65 6d 64  y || sqlite3Memd
cd00: 65 62 75 67 48 61 73 54 79 70 65 28 2a 70 70 44  ebugHasType(*ppD
cd10: 69 72 65 63 74 6f 72 79 2c 20 4d 45 4d 54 59 50  irectory, MEMTYP
cd20: 45 5f 48 45 41 50 29 20 29 3b 0a 20 20 69 66 28  E_HEAP) );.  if(
cd30: 20 70 70 44 69 72 65 63 74 6f 72 79 20 29 7b 0a   ppDirectory ){.
cd40: 20 20 20 20 63 68 61 72 20 2a 7a 56 61 6c 75 65      char *zValue
cd50: 55 74 66 38 20 3d 20 30 3b 0a 20 20 20 20 69 66  Utf8 = 0;.    if
cd60: 28 20 7a 56 61 6c 75 65 20 26 26 20 7a 56 61 6c  ( zValue && zVal
cd70: 75 65 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 7a  ue[0] ){.      z
cd80: 56 61 6c 75 65 55 74 66 38 20 3d 20 77 69 6e 55  ValueUtf8 = winU
cd90: 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 56 61  nicodeToUtf8(zVa
cda0: 6c 75 65 29 3b 0a 20 20 20 20 20 20 69 66 20 28  lue);.      if (
cdb0: 20 7a 56 61 6c 75 65 55 74 66 38 3d 3d 30 20 29   zValueUtf8==0 )
cdc0: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
cdd0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
cde0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
cdf0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 2a 70   sqlite3_free(*p
ce00: 70 44 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 20  pDirectory);.   
ce10: 20 2a 70 70 44 69 72 65 63 74 6f 72 79 20 3d 20   *ppDirectory = 
ce20: 7a 56 61 6c 75 65 55 74 66 38 3b 0a 20 20 20 20  zValueUtf8;.    
ce30: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
ce40: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
ce50: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a  QLITE_ERROR;.}..
ce60: 2f 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  /*.** The return
ce70: 20 76 61 6c 75 65 20 6f 66 20 77 69 6e 47 65 74   value of winGet
ce80: 4c 61 73 74 45 72 72 6f 72 4d 73 67 0a 2a 2a 20  LastErrorMsg.** 
ce90: 69 73 20 7a 65 72 6f 20 69 66 20 74 68 65 20 65  is zero if the e
cea0: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66 69 74  rror message fit
ceb0: 73 20 69 6e 20 74 68 65 20 62 75 66 66 65 72 2c  s in the buffer,
cec0: 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20   or non-zero.** 
ced0: 6f 74 68 65 72 77 69 73 65 20 28 69 66 20 74 68  otherwise (if th
cee0: 65 20 6d 65 73 73 61 67 65 20 77 61 73 20 74 72  e message was tr
cef0: 75 6e 63 61 74 65 64 29 2e 0a 2a 2f 0a 73 74 61  uncated)..*/.sta
cf00: 74 69 63 20 69 6e 74 20 77 69 6e 47 65 74 4c 61  tic int winGetLa
cf10: 73 74 45 72 72 6f 72 4d 73 67 28 44 57 4f 52 44  stErrorMsg(DWORD
cf20: 20 6c 61 73 74 45 72 72 6e 6f 2c 20 69 6e 74 20   lastErrno, int 
cf30: 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66  nBuf, char *zBuf
cf40: 29 7b 0a 20 20 2f 2a 20 46 6f 72 6d 61 74 4d 65  ){.  /* FormatMe
cf50: 73 73 61 67 65 20 72 65 74 75 72 6e 73 20 30 20  ssage returns 0 
cf60: 6f 6e 20 66 61 69 6c 75 72 65 2e 20 20 4f 74 68  on failure.  Oth
cf70: 65 72 77 69 73 65 20 69 74 0a 20 20 2a 2a 20 72  erwise it.  ** r
cf80: 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65  eturns the numbe
cf90: 72 20 6f 66 20 54 43 48 41 52 73 20 77 72 69 74  r of TCHARs writ
cfa0: 74 65 6e 20 74 6f 20 74 68 65 20 6f 75 74 70 75  ten to the outpu
cfb0: 74 0a 20 20 2a 2a 20 62 75 66 66 65 72 2c 20 65  t.  ** buffer, e
cfc0: 78 63 6c 75 64 69 6e 67 20 74 68 65 20 74 65 72  xcluding the ter
cfd0: 6d 69 6e 61 74 69 6e 67 20 6e 75 6c 6c 20 63 68  minating null ch
cfe0: 61 72 2e 0a 20 20 2a 2f 0a 20 20 44 57 4f 52 44  ar..  */.  DWORD
cff0: 20 64 77 4c 65 6e 20 3d 20 30 3b 0a 20 20 63 68   dwLen = 0;.  ch
d000: 61 72 20 2a 7a 4f 75 74 20 3d 20 30 3b 0a 0a 20  ar *zOut = 0;.. 
d010: 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b   if( osIsNT() ){
d020: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
d030: 49 4e 52 54 0a 20 20 20 20 57 43 48 41 52 20 7a  INRT.    WCHAR z
d040: 54 65 6d 70 57 69 64 65 5b 53 51 4c 49 54 45 5f  TempWide[SQLITE_
d050: 57 49 4e 33 32 5f 4d 41 58 5f 45 52 52 4d 53 47  WIN32_MAX_ERRMSG
d060: 5f 43 48 41 52 53 2b 31 5d 3b 0a 20 20 20 20 64  _CHARS+1];.    d
d070: 77 4c 65 6e 20 3d 20 6f 73 46 6f 72 6d 61 74 4d  wLen = osFormatM
d080: 65 73 73 61 67 65 57 28 46 4f 52 4d 41 54 5f 4d  essageW(FORMAT_M
d090: 45 53 53 41 47 45 5f 46 52 4f 4d 5f 53 59 53 54  ESSAGE_FROM_SYST
d0a0: 45 4d 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  EM |.           
d0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d0c0: 20 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45    FORMAT_MESSAGE
d0d0: 5f 49 47 4e 4f 52 45 5f 49 4e 53 45 52 54 53 2c  _IGNORE_INSERTS,
d0e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4e 55                NU
d100: 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  LL,.            
d110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d120: 20 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20   lastErrno,.    
d130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d140: 20 20 20 20 20 20 20 20 20 30 2c 0a 20 20 20 20           0,.    
d150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d160: 20 20 20 20 20 20 20 20 20 7a 54 65 6d 70 57 69           zTempWi
d170: 64 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  de,.            
d180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d190: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41   SQLITE_WIN32_MA
d1a0: 58 5f 45 52 52 4d 53 47 5f 43 48 41 52 53 2c 0a  X_ERRMSG_CHARS,.
d1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 29 3b               0);
d1d0: 0a 23 65 6c 73 65 0a 20 20 20 20 4c 50 57 53 54  .#else.    LPWST
d1e0: 52 20 7a 54 65 6d 70 57 69 64 65 20 3d 20 4e 55  R zTempWide = NU
d1f0: 4c 4c 3b 0a 20 20 20 20 64 77 4c 65 6e 20 3d 20  LL;.    dwLen = 
d200: 6f 73 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 57  osFormatMessageW
d210: 28 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f  (FORMAT_MESSAGE_
d220: 41 4c 4c 4f 43 41 54 45 5f 42 55 46 46 45 52 20  ALLOCATE_BUFFER 
d230: 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
d240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 46                 F
d250: 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 46 52  ORMAT_MESSAGE_FR
d260: 4f 4d 5f 53 59 53 54 45 4d 20 7c 0a 20 20 20 20  OM_SYSTEM |.    
d270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d280: 20 20 20 20 20 20 20 20 20 46 4f 52 4d 41 54 5f           FORMAT_
d290: 4d 45 53 53 41 47 45 5f 49 47 4e 4f 52 45 5f 49  MESSAGE_IGNORE_I
d2a0: 4e 53 45 52 54 53 2c 0a 20 20 20 20 20 20 20 20  NSERTS,.        
d2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d2c0: 20 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20       NULL,.     
d2d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d2e0: 20 20 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e          lastErrn
d2f0: 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
d300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d310: 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
d320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d330: 28 4c 50 57 53 54 52 29 20 26 7a 54 65 6d 70 57  (LPWSTR) &zTempW
d340: 69 64 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ide,.           
d350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d360: 20 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20    0,.           
d370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d380: 20 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20    0);.#endif.   
d390: 20 69 66 28 20 64 77 4c 65 6e 20 3e 20 30 20 29   if( dwLen > 0 )
d3a0: 7b 0a 20 20 20 20 20 20 2f 2a 20 61 6c 6c 6f 63  {.      /* alloc
d3b0: 61 74 65 20 61 20 62 75 66 66 65 72 20 61 6e 64  ate a buffer and
d3c0: 20 63 6f 6e 76 65 72 74 20 74 6f 20 55 54 46 38   convert to UTF8
d3d0: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
d3e0: 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
d3f0: 6f 63 28 29 3b 0a 20 20 20 20 20 20 7a 4f 75 74  oc();.      zOut
d400: 20 3d 20 77 69 6e 55 6e 69 63 6f 64 65 54 6f 55   = winUnicodeToU
d410: 74 66 38 28 7a 54 65 6d 70 57 69 64 65 29 3b 0a  tf8(zTempWide);.
d420: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64        sqlite3End
d430: 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
d440: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
d450: 49 4e 52 54 0a 20 20 20 20 20 20 2f 2a 20 66 72  INRT.      /* fr
d460: 65 65 20 74 68 65 20 73 79 73 74 65 6d 20 62 75  ee the system bu
d470: 66 66 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 62  ffer allocated b
d480: 79 20 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 20  y FormatMessage 
d490: 2a 2f 0a 20 20 20 20 20 20 6f 73 4c 6f 63 61 6c  */.      osLocal
d4a0: 46 72 65 65 28 7a 54 65 6d 70 57 69 64 65 29 3b  Free(zTempWide);
d4b0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
d4c0: 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
d4d0: 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20  WIN32_HAS_ANSI. 
d4e0: 20 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20   else{.    char 
d4f0: 2a 7a 54 65 6d 70 20 3d 20 4e 55 4c 4c 3b 0a 20  *zTemp = NULL;. 
d500: 20 20 20 64 77 4c 65 6e 20 3d 20 6f 73 46 6f 72     dwLen = osFor
d510: 6d 61 74 4d 65 73 73 61 67 65 41 28 46 4f 52 4d  matMessageA(FORM
d520: 41 54 5f 4d 45 53 53 41 47 45 5f 41 4c 4c 4f 43  AT_MESSAGE_ALLOC
d530: 41 54 45 5f 42 55 46 46 45 52 20 7c 0a 20 20 20  ATE_BUFFER |.   
d540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d550: 20 20 20 20 20 20 20 20 20 20 46 4f 52 4d 41 54            FORMAT
d560: 5f 4d 45 53 53 41 47 45 5f 46 52 4f 4d 5f 53 59  _MESSAGE_FROM_SY
d570: 53 54 45 4d 20 7c 0a 20 20 20 20 20 20 20 20 20  STEM |.         
d580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d590: 20 20 20 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41      FORMAT_MESSA
d5a0: 47 45 5f 49 47 4e 4f 52 45 5f 49 4e 53 45 52 54  GE_IGNORE_INSERT
d5b0: 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  S,.             
d5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d5d0: 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20  NULL,.          
d5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d5f0: 20 20 20 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20     lastErrno,.  
d600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d610: 20 20 20 20 20 20 20 20 20 20 20 30 2c 0a 20 20             0,.  
d620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d630: 20 20 20 20 20 20 20 20 20 20 20 28 4c 50 53 54             (LPST
d640: 52 29 20 26 7a 54 65 6d 70 2c 0a 20 20 20 20 20  R) &zTemp,.     
d650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d660: 20 20 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20          0,.     
d670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d680: 20 20 20 20 20 20 20 20 30 29 3b 0a 20 20 20 20          0);.    
d690: 69 66 28 20 64 77 4c 65 6e 20 3e 20 30 20 29 7b  if( dwLen > 0 ){
d6a0: 0a 20 20 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61  .      /* alloca
d6b0: 74 65 20 61 20 62 75 66 66 65 72 20 61 6e 64 20  te a buffer and 
d6c0: 63 6f 6e 76 65 72 74 20 74 6f 20 55 54 46 38 20  convert to UTF8 
d6d0: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
d6e0: 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
d6f0: 63 28 29 3b 0a 20 20 20 20 20 20 7a 4f 75 74 20  c();.      zOut 
d700: 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  = sqlite3_win32_
d710: 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28 7a 54 65  mbcs_to_utf8(zTe
d720: 6d 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  mp);.      sqlit
d730: 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
d740: 63 28 29 3b 0a 20 20 20 20 20 20 2f 2a 20 66 72  c();.      /* fr
d750: 65 65 20 74 68 65 20 73 79 73 74 65 6d 20 62 75  ee the system bu
d760: 66 66 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 62  ffer allocated b
d770: 79 20 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 20  y FormatMessage 
d780: 2a 2f 0a 20 20 20 20 20 20 6f 73 4c 6f 63 61 6c  */.      osLocal
d790: 46 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20 20  Free(zTemp);.   
d7a0: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
d7b0: 69 66 28 20 30 20 3d 3d 20 64 77 4c 65 6e 20 29  if( 0 == dwLen )
d7c0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  {.    sqlite3_sn
d7d0: 70 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75  printf(nBuf, zBu
d7e0: 66 2c 20 22 4f 73 45 72 72 6f 72 20 30 78 25 6c  f, "OsError 0x%l
d7f0: 78 20 28 25 6c 75 29 22 2c 20 6c 61 73 74 45 72  x (%lu)", lastEr
d800: 72 6e 6f 2c 20 6c 61 73 74 45 72 72 6e 6f 29 3b  rno, lastErrno);
d810: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
d820: 20 63 6f 70 79 20 61 20 6d 61 78 69 6d 75 6d 20   copy a maximum 
d830: 6f 66 20 6e 42 75 66 20 63 68 61 72 73 20 74 6f  of nBuf chars to
d840: 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 2a   output buffer *
d850: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  /.    sqlite3_sn
d860: 70 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75  printf(nBuf, zBu
d870: 66 2c 20 22 25 73 22 2c 20 7a 4f 75 74 29 3b 0a  f, "%s", zOut);.
d880: 20 20 20 20 2f 2a 20 66 72 65 65 20 74 68 65 20      /* free the 
d890: 55 54 46 38 20 62 75 66 66 65 72 20 2a 2f 0a 20  UTF8 buffer */. 
d8a0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
d8b0: 7a 4f 75 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74  zOut);.  }.  ret
d8c0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a  urn 0;.}../*.**.
d8d0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
d8e0: 20 2d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 41 74   - winLogErrorAt
d8f0: 4c 69 6e 65 28 29 20 2d 20 69 73 20 6f 6e 6c 79  Line() - is only
d900: 20 65 76 65 72 20 63 61 6c 6c 65 64 20 76 69 61   ever called via
d910: 20 74 68 65 20 6d 61 63 72 6f 0a 2a 2a 20 77 69   the macro.** wi
d920: 6e 4c 6f 67 45 72 72 6f 72 28 29 2e 0a 2a 2a 0a  nLogError()..**.
d930: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
d940: 69 73 20 69 6e 76 6f 6b 65 64 20 61 66 74 65 72  is invoked after
d950: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
d960: 20 69 6e 20 61 6e 20 4f 53 20 66 75 6e 63 74 69   in an OS functi
d970: 6f 6e 2e 0a 2a 2a 20 49 74 20 6c 6f 67 73 20 61  on..** It logs a
d980: 20 6d 65 73 73 61 67 65 20 75 73 69 6e 67 20 73   message using s
d990: 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20 63 6f 6e  qlite3_log() con
d9a0: 74 61 69 6e 69 6e 67 20 74 68 65 20 63 75 72 72  taining the curr
d9b0: 65 6e 74 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20  ent value of.** 
d9c0: 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 2c 20  error code and, 
d9d0: 69 66 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 65  if possible, the
d9e0: 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20   human-readable 
d9f0: 65 71 75 69 76 61 6c 65 6e 74 20 66 72 6f 6d 20  equivalent from 
da00: 0a 2a 2a 20 46 6f 72 6d 61 74 4d 65 73 73 61 67  .** FormatMessag
da10: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72  e..**.** The fir
da20: 73 74 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73  st argument pass
da30: 65 64 20 74 6f 20 74 68 65 20 6d 61 63 72 6f 20  ed to the macro 
da40: 73 68 6f 75 6c 64 20 62 65 20 74 68 65 20 65 72  should be the er
da50: 72 6f 72 20 63 6f 64 65 20 74 68 61 74 0a 2a 2a  ror code that.**
da60: 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65   will be returne
da70: 64 20 74 6f 20 53 51 4c 69 74 65 20 28 65 2e 67  d to SQLite (e.g
da80: 2e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44  . SQLITE_IOERR_D
da90: 45 4c 45 54 45 2c 20 53 51 4c 49 54 45 5f 43 41  ELETE, SQLITE_CA
daa0: 4e 54 4f 50 45 4e 29 2e 20 0a 2a 2a 20 54 68 65  NTOPEN). .** The
dab0: 20 74 77 6f 20 73 75 62 73 65 71 75 65 6e 74 20   two subsequent 
dac0: 61 72 67 75 6d 65 6e 74 73 20 73 68 6f 75 6c 64  arguments should
dad0: 20 62 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   be the name of 
dae0: 74 68 65 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20  the OS function 
daf0: 74 68 61 74 0a 2a 2a 20 66 61 69 6c 65 64 20 61  that.** failed a
db00: 6e 64 20 74 68 65 20 61 73 73 6f 63 69 61 74 65  nd the associate
db10: 64 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 70 61  d file-system pa
db20: 74 68 2c 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a 23  th, if any..*/.#
db30: 64 65 66 69 6e 65 20 77 69 6e 4c 6f 67 45 72 72  define winLogErr
db40: 6f 72 28 61 2c 62 2c 63 2c 64 29 20 20 20 77 69  or(a,b,c,d)   wi
db50: 6e 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 28  nLogErrorAtLine(
db60: 61 2c 62 2c 63 2c 64 2c 5f 5f 4c 49 4e 45 5f 5f  a,b,c,d,__LINE__
db70: 29 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  ).static int win
db80: 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 0a  LogErrorAtLine(.
db90: 20 20 69 6e 74 20 65 72 72 63 6f 64 65 2c 20 20    int errcode,  
dba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dbb0: 20 20 2f 2a 20 53 51 4c 69 74 65 20 65 72 72 6f    /* SQLite erro
dbc0: 72 20 63 6f 64 65 20 2a 2f 0a 20 20 44 57 4f 52  r code */.  DWOR
dbd0: 44 20 6c 61 73 74 45 72 72 6e 6f 2c 20 20 20 20  D lastErrno,    
dbe0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
dbf0: 69 6e 33 32 20 6c 61 73 74 20 65 72 72 6f 72 20  in32 last error 
dc00: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
dc10: 2a 7a 46 75 6e 63 2c 20 20 20 20 20 20 20 20 20  *zFunc,         
dc20: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
dc30: 4f 53 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74  OS function that
dc40: 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 63 6f 6e   failed */.  con
dc50: 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20  st char *zPath, 
dc60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
dc70: 46 69 6c 65 20 70 61 74 68 20 61 73 73 6f 63 69  File path associ
dc80: 61 74 65 64 20 77 69 74 68 20 65 72 72 6f 72 20  ated with error 
dc90: 2a 2f 0a 20 20 69 6e 74 20 69 4c 69 6e 65 20 20  */.  int iLine  
dca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dcb0: 20 20 20 20 20 2f 2a 20 53 6f 75 72 63 65 20 6c       /* Source l
dcc0: 69 6e 65 20 6e 75 6d 62 65 72 20 77 68 65 72 65  ine number where
dcd0: 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20   error occurred 
dce0: 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 7a 4d 73  */.){.  char zMs
dcf0: 67 5b 35 30 30 5d 3b 20 20 20 20 20 20 20 20 20  g[500];         
dd00: 20 20 20 20 20 20 20 20 2f 2a 20 48 75 6d 61 6e          /* Human
dd10: 20 72 65 61 64 61 62 6c 65 20 65 72 72 6f 72 20   readable error 
dd20: 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  text */.  int i;
dd30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
dd50: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20  p counter */..  
dd60: 7a 4d 73 67 5b 30 5d 20 3d 20 30 3b 0a 20 20 77  zMsg[0] = 0;.  w
dd70: 69 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 4d 73  inGetLastErrorMs
dd80: 67 28 6c 61 73 74 45 72 72 6e 6f 2c 20 73 69 7a  g(lastErrno, siz
dd90: 65 6f 66 28 7a 4d 73 67 29 2c 20 7a 4d 73 67 29  eof(zMsg), zMsg)
dda0: 3b 0a 20 20 61 73 73 65 72 74 28 20 65 72 72 63  ;.  assert( errc
ddb0: 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ode!=SQLITE_OK )
ddc0: 3b 0a 20 20 69 66 28 20 7a 50 61 74 68 3d 3d 30  ;.  if( zPath==0
ddd0: 20 29 20 7a 50 61 74 68 20 3d 20 22 22 3b 0a 20   ) zPath = "";. 
dde0: 20 66 6f 72 28 69 3d 30 3b 20 7a 4d 73 67 5b 69   for(i=0; zMsg[i
ddf0: 5d 20 26 26 20 7a 4d 73 67 5b 69 5d 21 3d 27 5c  ] && zMsg[i]!='\
de00: 72 27 20 26 26 20 7a 4d 73 67 5b 69 5d 21 3d 27  r' && zMsg[i]!='
de10: 5c 6e 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 7a 4d  \n'; i++){}.  zM
de20: 73 67 5b 69 5d 20 3d 20 30 3b 0a 20 20 73 71 6c  sg[i] = 0;.  sql
de30: 69 74 65 33 5f 6c 6f 67 28 65 72 72 63 6f 64 65  ite3_log(errcode
de40: 2c 0a 20 20 20 20 20 20 22 6f 73 5f 77 69 6e 2e  ,.      "os_win.
de50: 63 3a 25 64 3a 20 28 25 6c 75 29 20 25 73 28 25  c:%d: (%lu) %s(%
de60: 73 29 20 2d 20 25 73 22 2c 0a 20 20 20 20 20 20  s) - %s",.      
de70: 69 4c 69 6e 65 2c 20 6c 61 73 74 45 72 72 6e 6f  iLine, lastErrno
de80: 2c 20 7a 46 75 6e 63 2c 20 7a 50 61 74 68 2c 20  , zFunc, zPath, 
de90: 7a 4d 73 67 0a 20 20 29 3b 0a 0a 20 20 72 65 74  zMsg.  );..  ret
dea0: 75 72 6e 20 65 72 72 63 6f 64 65 3b 0a 7d 0a 0a  urn errcode;.}..
deb0: 2f 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72  /*.** The number
dec0: 20 6f 66 20 74 69 6d 65 73 20 74 68 61 74 20 61   of times that a
ded0: 20 52 65 61 64 46 69 6c 65 28 29 2c 20 57 72 69   ReadFile(), Wri
dee0: 74 65 46 69 6c 65 28 29 2c 20 61 6e 64 20 44 65  teFile(), and De
def0: 6c 65 74 65 46 69 6c 65 28 29 0a 2a 2a 20 77 69  leteFile().** wi
df00: 6c 6c 20 62 65 20 72 65 74 72 69 65 64 20 66 6f  ll be retried fo
df10: 6c 6c 6f 77 69 6e 67 20 61 20 6c 6f 63 6b 69 6e  llowing a lockin
df20: 67 20 65 72 72 6f 72 20 2d 20 70 72 6f 62 61 62  g error - probab
df30: 6c 79 20 63 61 75 73 65 64 20 62 79 20 0a 2a 2a  ly caused by .**
df40: 20 61 6e 74 69 76 69 72 75 73 20 73 6f 66 74 77   antivirus softw
df50: 61 72 65 2e 20 20 41 6c 73 6f 20 74 68 65 20 69  are.  Also the i
df60: 6e 69 74 69 61 6c 20 64 65 6c 61 79 20 62 65 66  nitial delay bef
df70: 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 72 65  ore the first re
df80: 74 72 79 2e 0a 2a 2a 20 54 68 65 20 64 65 6c 61  try..** The dela
df90: 79 20 69 6e 63 72 65 61 73 65 73 20 6c 69 6e 65  y increases line
dfa0: 61 72 6c 79 20 77 69 74 68 20 65 61 63 68 20 72  arly with each r
dfb0: 65 74 72 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  etry..*/.#ifndef
dfc0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f   SQLITE_WIN32_IO
dfd0: 45 52 52 5f 52 45 54 52 59 0a 23 20 64 65 66 69  ERR_RETRY.# defi
dfe0: 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ne SQLITE_WIN32_
dff0: 49 4f 45 52 52 5f 52 45 54 52 59 20 31 30 0a 23  IOERR_RETRY 10.#
e000: 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51  endif.#ifndef SQ
e010: 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52  LITE_WIN32_IOERR
e020: 5f 52 45 54 52 59 5f 44 45 4c 41 59 0a 23 20 64  _RETRY_DELAY.# d
e030: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e  efine SQLITE_WIN
e040: 33 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 5f 44  32_IOERR_RETRY_D
e050: 45 4c 41 59 20 32 35 0a 23 65 6e 64 69 66 0a 73  ELAY 25.#endif.s
e060: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 49 6f 65  tatic int winIoe
e070: 72 72 52 65 74 72 79 20 3d 20 53 51 4c 49 54 45  rrRetry = SQLITE
e080: 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54  _WIN32_IOERR_RET
e090: 52 59 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77  RY;.static int w
e0a0: 69 6e 49 6f 65 72 72 52 65 74 72 79 44 65 6c 61  inIoerrRetryDela
e0b0: 79 20 3d 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  y = SQLITE_WIN32
e0c0: 5f 49 4f 45 52 52 5f 52 45 54 52 59 5f 44 45 4c  _IOERR_RETRY_DEL
e0d0: 41 59 3b 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 20  AY;../*.** If a 
e0e0: 52 65 61 64 46 69 6c 65 28 29 20 6f 72 20 57 72  ReadFile() or Wr
e0f0: 69 74 65 46 69 6c 65 28 29 20 65 72 72 6f 72 20  iteFile() error 
e100: 6f 63 63 75 72 73 2c 20 69 6e 76 6f 6b 65 20 74  occurs, invoke t
e110: 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 74  his routine.** t
e120: 6f 20 73 65 65 20 69 66 20 69 74 20 73 68 6f 75  o see if it shou
e130: 6c 64 20 62 65 20 72 65 74 72 69 65 64 2e 20 20  ld be retried.  
e140: 52 65 74 75 72 6e 20 54 52 55 45 20 74 6f 20 72  Return TRUE to r
e150: 65 74 72 79 2e 20 20 52 65 74 75 72 6e 20 46 41  etry.  Return FA
e160: 4c 53 45 0a 2a 2a 20 74 6f 20 67 69 76 65 20 75  LSE.** to give u
e170: 70 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72 2e  p with an error.
e180: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
e190: 69 6e 52 65 74 72 79 49 6f 65 72 72 28 69 6e 74  inRetryIoerr(int
e1a0: 20 2a 70 6e 52 65 74 72 79 2c 20 44 57 4f 52 44   *pnRetry, DWORD
e1b0: 20 2a 70 45 72 72 6f 72 29 7b 0a 20 20 44 57 4f   *pError){.  DWO
e1c0: 52 44 20 65 20 3d 20 6f 73 47 65 74 4c 61 73 74  RD e = osGetLast
e1d0: 45 72 72 6f 72 28 29 3b 0a 20 20 69 66 28 20 2a  Error();.  if( *
e1e0: 70 6e 52 65 74 72 79 3e 3d 77 69 6e 49 6f 65 72  pnRetry>=winIoer
e1f0: 72 52 65 74 72 79 20 29 7b 0a 20 20 20 20 69 66  rRetry ){.    if
e200: 28 20 70 45 72 72 6f 72 20 29 7b 0a 20 20 20 20  ( pError ){.    
e210: 20 20 2a 70 45 72 72 6f 72 20 3d 20 65 3b 0a 20    *pError = e;. 
e220: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
e230: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 65 3d 3d  0;.  }.  if( e==
e240: 45 52 52 4f 52 5f 41 43 43 45 53 53 5f 44 45 4e  ERROR_ACCESS_DEN
e250: 49 45 44 20 7c 7c 0a 20 20 20 20 20 20 65 3d 3d  IED ||.      e==
e260: 45 52 52 4f 52 5f 4c 4f 43 4b 5f 56 49 4f 4c 41  ERROR_LOCK_VIOLA
e270: 54 49 4f 4e 20 7c 7c 0a 20 20 20 20 20 20 65 3d  TION ||.      e=
e280: 3d 45 52 52 4f 52 5f 53 48 41 52 49 4e 47 5f 56  =ERROR_SHARING_V
e290: 49 4f 4c 41 54 49 4f 4e 20 29 7b 0a 20 20 20 20  IOLATION ){.    
e2a0: 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c  sqlite3_win32_sl
e2b0: 65 65 70 28 77 69 6e 49 6f 65 72 72 52 65 74 72  eep(winIoerrRetr
e2c0: 79 44 65 6c 61 79 2a 28 31 2b 2a 70 6e 52 65 74  yDelay*(1+*pnRet
e2d0: 72 79 29 29 3b 0a 20 20 20 20 2b 2b 2a 70 6e 52  ry));.    ++*pnR
e2e0: 65 74 72 79 3b 0a 20 20 20 20 72 65 74 75 72 6e  etry;.    return
e2f0: 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45   1;.  }.  if( pE
e300: 72 72 6f 72 20 29 7b 0a 20 20 20 20 2a 70 45 72  rror ){.    *pEr
e310: 72 6f 72 20 3d 20 65 3b 0a 20 20 7d 0a 20 20 72  ror = e;.  }.  r
e320: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
e330: 2a 20 4c 6f 67 20 61 20 49 2f 4f 20 65 72 72 6f  * Log a I/O erro
e340: 72 20 72 65 74 72 79 20 65 70 69 73 6f 64 65 2e  r retry episode.
e350: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
e360: 77 69 6e 4c 6f 67 49 6f 65 72 72 28 69 6e 74 20  winLogIoerr(int 
e370: 6e 52 65 74 72 79 29 7b 0a 20 20 69 66 28 20 6e  nRetry){.  if( n
e380: 52 65 74 72 79 20 29 7b 0a 20 20 20 20 73 71 6c  Retry ){.    sql
e390: 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
e3a0: 49 4f 45 52 52 2c 20 0a 20 20 20 20 20 20 22 64  IOERR, .      "d
e3b0: 65 6c 61 79 65 64 20 25 64 6d 73 20 66 6f 72 20  elayed %dms for 
e3c0: 6c 6f 63 6b 2f 73 68 61 72 69 6e 67 20 63 6f 6e  lock/sharing con
e3d0: 66 6c 69 63 74 22 2c 0a 20 20 20 20 20 20 77 69  flict",.      wi
e3e0: 6e 49 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79  nIoerrRetryDelay
e3f0: 2a 6e 52 65 74 72 79 2a 28 6e 52 65 74 72 79 2b  *nRetry*(nRetry+
e400: 31 29 2f 32 0a 20 20 20 20 29 3b 0a 20 20 7d 0a  1)/2.    );.  }.
e410: 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  }..#if SQLITE_OS
e420: 5f 57 49 4e 43 45 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  _WINCE./********
e430: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e440: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e450: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e460: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e470: 2a 0a 2a 2a 20 54 68 69 73 20 73 65 63 74 69 6f  *.** This sectio
e480: 6e 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65 20  n contains code 
e490: 66 6f 72 20 57 69 6e 43 45 20 6f 6e 6c 79 2e 0a  for WinCE only..
e4a0: 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
e4b0: 53 51 4c 49 54 45 5f 4d 53 56 43 5f 4c 4f 43 41  SQLITE_MSVC_LOCA
e4c0: 4c 54 49 4d 45 5f 41 50 49 29 20 7c 7c 20 21 53  LTIME_API) || !S
e4d0: 51 4c 49 54 45 5f 4d 53 56 43 5f 4c 4f 43 41 4c  QLITE_MSVC_LOCAL
e4e0: 54 49 4d 45 5f 41 50 49 0a 2f 2a 0a 2a 2a 20 54  TIME_API./*.** T
e4f0: 68 65 20 4d 53 56 43 20 43 52 54 20 6f 6e 20 57  he MSVC CRT on W
e500: 69 6e 64 6f 77 73 20 43 45 20 6d 61 79 20 6e 6f  indows CE may no
e510: 74 20 68 61 76 65 20 61 20 6c 6f 63 61 6c 74 69  t have a localti
e520: 6d 65 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20  me() function.  
e530: 53 6f 0a 2a 2a 20 63 72 65 61 74 65 20 61 20 73  So.** create a s
e540: 75 62 73 74 69 74 75 74 65 2e 0a 2a 2f 0a 23 69  ubstitute..*/.#i
e550: 6e 63 6c 75 64 65 20 3c 74 69 6d 65 2e 68 3e 0a  nclude <time.h>.
e560: 73 74 72 75 63 74 20 74 6d 20 2a 5f 5f 63 64 65  struct tm *__cde
e570: 63 6c 20 6c 6f 63 61 6c 74 69 6d 65 28 63 6f 6e  cl localtime(con
e580: 73 74 20 74 69 6d 65 5f 74 20 2a 74 29 0a 7b 0a  st time_t *t).{.
e590: 20 20 73 74 61 74 69 63 20 73 74 72 75 63 74 20    static struct 
e5a0: 74 6d 20 79 3b 0a 20 20 46 49 4c 45 54 49 4d 45  tm y;.  FILETIME
e5b0: 20 75 54 6d 2c 20 6c 54 6d 3b 0a 20 20 53 59 53   uTm, lTm;.  SYS
e5c0: 54 45 4d 54 49 4d 45 20 70 54 6d 3b 0a 20 20 73  TEMTIME pTm;.  s
e5d0: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 74 36 34  qlite3_int64 t64
e5e0: 3b 0a 20 20 74 36 34 20 3d 20 2a 74 3b 0a 20 20  ;.  t64 = *t;.  
e5f0: 74 36 34 20 3d 20 28 74 36 34 20 2b 20 31 31 36  t64 = (t64 + 116
e600: 34 34 34 37 33 36 30 30 29 2a 31 30 30 30 30 30  44473600)*100000
e610: 30 30 3b 0a 20 20 75 54 6d 2e 64 77 4c 6f 77 44  00;.  uTm.dwLowD
e620: 61 74 65 54 69 6d 65 20 3d 20 28 44 57 4f 52 44  ateTime = (DWORD
e630: 29 28 74 36 34 20 26 20 30 78 46 46 46 46 46 46  )(t64 & 0xFFFFFF
e640: 46 46 29 3b 0a 20 20 75 54 6d 2e 64 77 48 69 67  FF);.  uTm.dwHig
e650: 68 44 61 74 65 54 69 6d 65 3d 20 28 44 57 4f 52  hDateTime= (DWOR
e660: 44 29 28 74 36 34 20 3e 3e 20 33 32 29 3b 0a 20  D)(t64 >> 32);. 
e670: 20 6f 73 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63   osFileTimeToLoc
e680: 61 6c 46 69 6c 65 54 69 6d 65 28 26 75 54 6d 2c  alFileTime(&uTm,
e690: 26 6c 54 6d 29 3b 0a 20 20 6f 73 46 69 6c 65 54  &lTm);.  osFileT
e6a0: 69 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 28  imeToSystemTime(
e6b0: 26 6c 54 6d 2c 26 70 54 6d 29 3b 0a 20 20 79 2e  &lTm,&pTm);.  y.
e6c0: 74 6d 5f 79 65 61 72 20 3d 20 70 54 6d 2e 77 59  tm_year = pTm.wY
e6d0: 65 61 72 20 2d 20 31 39 30 30 3b 0a 20 20 79 2e  ear - 1900;.  y.
e6e0: 74 6d 5f 6d 6f 6e 20 3d 20 70 54 6d 2e 77 4d 6f  tm_mon = pTm.wMo
e6f0: 6e 74 68 20 2d 20 31 3b 0a 20 20 79 2e 74 6d 5f  nth - 1;.  y.tm_
e700: 77 64 61 79 20 3d 20 70 54 6d 2e 77 44 61 79 4f  wday = pTm.wDayO
e710: 66 57 65 65 6b 3b 0a 20 20 79 2e 74 6d 5f 6d 64  fWeek;.  y.tm_md
e720: 61 79 20 3d 20 70 54 6d 2e 77 44 61 79 3b 0a 20  ay = pTm.wDay;. 
e730: 20 79 2e 74 6d 5f 68 6f 75 72 20 3d 20 70 54 6d   y.tm_hour = pTm
e740: 2e 77 48 6f 75 72 3b 0a 20 20 79 2e 74 6d 5f 6d  .wHour;.  y.tm_m
e750: 69 6e 20 3d 20 70 54 6d 2e 77 4d 69 6e 75 74 65  in = pTm.wMinute
e760: 3b 0a 20 20 79 2e 74 6d 5f 73 65 63 20 3d 20 70  ;.  y.tm_sec = p
e770: 54 6d 2e 77 53 65 63 6f 6e 64 3b 0a 20 20 72 65  Tm.wSecond;.  re
e780: 74 75 72 6e 20 26 79 3b 0a 7d 0a 23 65 6e 64 69  turn &y;.}.#endi
e790: 66 0a 0a 23 64 65 66 69 6e 65 20 48 41 4e 44 4c  f..#define HANDL
e7a0: 45 5f 54 4f 5f 57 49 4e 46 49 4c 45 28 61 29 20  E_TO_WINFILE(a) 
e7b0: 28 77 69 6e 46 69 6c 65 2a 29 26 28 28 63 68 61  (winFile*)&((cha
e7c0: 72 2a 29 61 29 5b 2d 28 69 6e 74 29 6f 66 66 73  r*)a)[-(int)offs
e7d0: 65 74 6f 66 28 77 69 6e 46 69 6c 65 2c 68 29 5d  etof(winFile,h)]
e7e0: 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20  ../*.** Acquire 
e7f0: 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 68 61  a lock on the ha
e800: 6e 64 6c 65 20 68 0a 2a 2f 0a 73 74 61 74 69 63  ndle h.*/.static
e810: 20 76 6f 69 64 20 77 69 6e 63 65 4d 75 74 65 78   void winceMutex
e820: 41 63 71 75 69 72 65 28 48 41 4e 44 4c 45 20 68  Acquire(HANDLE h
e830: 29 7b 0a 20 20 20 44 57 4f 52 44 20 64 77 45 72  ){.   DWORD dwEr
e840: 72 3b 0a 20 20 20 64 6f 20 7b 0a 20 20 20 20 20  r;.   do {.     
e850: 64 77 45 72 72 20 3d 20 6f 73 57 61 69 74 46 6f  dwErr = osWaitFo
e860: 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 28 68 2c  rSingleObject(h,
e870: 20 49 4e 46 49 4e 49 54 45 29 3b 0a 20 20 20 7d   INFINITE);.   }
e880: 20 77 68 69 6c 65 20 28 64 77 45 72 72 20 21 3d   while (dwErr !=
e890: 20 57 41 49 54 5f 4f 42 4a 45 43 54 5f 30 20 26   WAIT_OBJECT_0 &
e8a0: 26 20 64 77 45 72 72 20 21 3d 20 57 41 49 54 5f  & dwErr != WAIT_
e8b0: 41 42 41 4e 44 4f 4e 45 44 29 3b 0a 7d 0a 2f 2a  ABANDONED);.}./*
e8c0: 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 6c 6f  .** Release a lo
e8d0: 63 6b 20 61 63 71 75 69 72 65 64 20 62 79 20 77  ck acquired by w
e8e0: 69 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72 65  inceMutexAcquire
e8f0: 28 29 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 77 69  ().*/.#define wi
e900: 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28  nceMutexRelease(
e910: 68 29 20 52 65 6c 65 61 73 65 4d 75 74 65 78 28  h) ReleaseMutex(
e920: 68 29 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  h)../*.** Create
e930: 20 74 68 65 20 6d 75 74 65 78 20 61 6e 64 20 73   the mutex and s
e940: 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 75 73 65  hared memory use
e950: 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 69 6e  d for locking in
e960: 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 64 65 73   the file.** des
e970: 63 72 69 70 74 6f 72 20 70 46 69 6c 65 0a 2a 2f  criptor pFile.*/
e980: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 63  .static int winc
e990: 65 43 72 65 61 74 65 4c 6f 63 6b 28 63 6f 6e 73  eCreateLock(cons
e9a0: 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
e9b0: 65 2c 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  e, winFile *pFil
e9c0: 65 29 7b 0a 20 20 4c 50 57 53 54 52 20 7a 54 6f  e){.  LPWSTR zTo
e9d0: 6b 3b 0a 20 20 4c 50 57 53 54 52 20 7a 4e 61 6d  k;.  LPWSTR zNam
e9e0: 65 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45  e;.  DWORD lastE
e9f0: 72 72 6e 6f 3b 0a 20 20 42 4f 4f 4c 20 62 4c 6f  rrno;.  BOOL bLo
ea00: 67 67 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20  gged = FALSE;.  
ea10: 42 4f 4f 4c 20 62 49 6e 69 74 20 3d 20 54 52 55  BOOL bInit = TRU
ea20: 45 3b 0a 0a 20 20 7a 4e 61 6d 65 20 3d 20 77 69  E;..  zName = wi
ea30: 6e 55 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a  nUtf8ToUnicode(z
ea40: 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28  Filename);.  if(
ea50: 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20   zName==0 ){.   
ea60: 20 2f 2a 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72   /* out of memor
ea70: 79 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  y */.    return 
ea80: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
ea90: 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e  EM;.  }..  /* In
eaa0: 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6c 6f 63  itialize the loc
eab0: 61 6c 20 6c 6f 63 6b 64 61 74 61 20 2a 2f 0a 20  al lockdata */. 
eac0: 20 6d 65 6d 73 65 74 28 26 70 46 69 6c 65 2d 3e   memset(&pFile->
ead0: 6c 6f 63 61 6c 2c 20 30 2c 20 73 69 7a 65 6f 66  local, 0, sizeof
eae0: 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 29 29 3b  (pFile->local));
eaf0: 0a 0a 20 20 2f 2a 20 52 65 70 6c 61 63 65 20 74  ..  /* Replace t
eb00: 68 65 20 62 61 63 6b 73 6c 61 73 68 65 73 20 66  he backslashes f
eb10: 72 6f 6d 20 74 68 65 20 66 69 6c 65 6e 61 6d 65  rom the filename
eb20: 20 61 6e 64 20 6c 6f 77 65 72 63 61 73 65 20 69   and lowercase i
eb30: 74 0a 20 20 2a 2a 20 74 6f 20 64 65 72 69 76 65  t.  ** to derive
eb40: 20 61 20 6d 75 74 65 78 20 6e 61 6d 65 2e 20 2a   a mutex name. *
eb50: 2f 0a 20 20 7a 54 6f 6b 20 3d 20 6f 73 43 68 61  /.  zTok = osCha
eb60: 72 4c 6f 77 65 72 57 28 7a 4e 61 6d 65 29 3b 0a  rLowerW(zName);.
eb70: 20 20 66 6f 72 20 28 3b 2a 7a 54 6f 6b 3b 7a 54    for (;*zTok;zT
eb80: 6f 6b 2b 2b 29 7b 0a 20 20 20 20 69 66 20 28 2a  ok++){.    if (*
eb90: 7a 54 6f 6b 20 3d 3d 20 27 5c 5c 27 29 20 2a 7a  zTok == '\\') *z
eba0: 54 6f 6b 20 3d 20 27 5f 27 3b 0a 20 20 7d 0a 0a  Tok = '_';.  }..
ebb0: 20 20 2f 2a 20 43 72 65 61 74 65 2f 6f 70 65 6e    /* Create/open
ebc0: 20 74 68 65 20 6e 61 6d 65 64 20 6d 75 74 65 78   the named mutex
ebd0: 20 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e 68 4d 75   */.  pFile->hMu
ebe0: 74 65 78 20 3d 20 6f 73 43 72 65 61 74 65 4d 75  tex = osCreateMu
ebf0: 74 65 78 57 28 4e 55 4c 4c 2c 20 46 41 4c 53 45  texW(NULL, FALSE
ec00: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 20 28  , zName);.  if (
ec10: 21 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 7b  !pFile->hMutex){
ec20: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74  .    pFile->last
ec30: 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
ec40: 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 73 71  tError();.    sq
ec50: 6c 69 74 65 33 5f 66 72 65 65 28 7a 4e 61 6d 65  lite3_free(zName
ec60: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 77 69  );.    return wi
ec70: 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
ec80: 5f 49 4f 45 52 52 2c 20 70 46 69 6c 65 2d 3e 6c  _IOERR, pFile->l
ec90: 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
eca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ecb0: 20 22 77 69 6e 63 65 43 72 65 61 74 65 4c 6f 63   "winceCreateLoc
ecc0: 6b 31 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b  k1", zFilename);
ecd0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69  .  }..  /* Acqui
ece0: 72 65 20 74 68 65 20 6d 75 74 65 78 20 62 65 66  re the mutex bef
ecf0: 6f 72 65 20 63 6f 6e 74 69 6e 75 69 6e 67 20 2a  ore continuing *
ed00: 2f 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 41 63  /.  winceMutexAc
ed10: 71 75 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75  quire(pFile->hMu
ed20: 74 65 78 29 3b 0a 20 20 0a 20 20 2f 2a 20 53 69  tex);.  .  /* Si
ed30: 6e 63 65 20 74 68 65 20 6e 61 6d 65 73 20 6f 66  nce the names of
ed40: 20 6e 61 6d 65 64 20 6d 75 74 65 78 65 73 2c 20   named mutexes, 
ed50: 73 65 6d 61 70 68 6f 72 65 73 2c 20 66 69 6c 65  semaphores, file
ed60: 20 6d 61 70 70 69 6e 67 73 20 65 74 63 20 61 72   mappings etc ar
ed70: 65 20 0a 20 20 2a 2a 20 63 61 73 65 2d 73 65 6e  e .  ** case-sen
ed80: 73 69 74 69 76 65 2c 20 74 61 6b 65 20 61 64 76  sitive, take adv
ed90: 61 6e 74 61 67 65 20 6f 66 20 74 68 61 74 20 62  antage of that b
eda0: 79 20 75 70 70 65 72 63 61 73 69 6e 67 20 74 68  y uppercasing th
edb0: 65 20 6d 75 74 65 78 20 6e 61 6d 65 0a 20 20 2a  e mutex name.  *
edc0: 2a 20 61 6e 64 20 75 73 69 6e 67 20 74 68 61 74  * and using that
edd0: 20 61 73 20 74 68 65 20 73 68 61 72 65 64 20 66   as the shared f
ede0: 69 6c 65 6d 61 70 70 69 6e 67 20 6e 61 6d 65 2e  ilemapping name.
edf0: 0a 20 20 2a 2f 0a 20 20 6f 73 43 68 61 72 55 70  .  */.  osCharUp
ee00: 70 65 72 57 28 7a 4e 61 6d 65 29 3b 0a 20 20 70  perW(zName);.  p
ee10: 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 20 3d 20  File->hShared = 
ee20: 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70  osCreateFileMapp
ee30: 69 6e 67 57 28 49 4e 56 41 4c 49 44 5f 48 41 4e  ingW(INVALID_HAN
ee40: 44 4c 45 5f 56 41 4c 55 45 2c 20 4e 55 4c 4c 2c  DLE_VALUE, NULL,
ee50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ee60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee70: 20 20 20 20 20 20 20 20 20 50 41 47 45 5f 52 45           PAGE_RE
ee80: 41 44 57 52 49 54 45 2c 20 30 2c 20 73 69 7a 65  ADWRITE, 0, size
ee90: 6f 66 28 77 69 6e 63 65 4c 6f 63 6b 29 2c 0a 20  of(winceLock),. 
eea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eeb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eec0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 29 3b 20 20         zName);  
eed0: 0a 0a 20 20 2f 2a 20 53 65 74 20 61 20 66 6c 61  ..  /* Set a fla
eee0: 67 20 74 68 61 74 20 69 6e 64 69 63 61 74 65 73  g that indicates
eef0: 20 77 65 27 72 65 20 74 68 65 20 66 69 72 73 74   we're the first
ef00: 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 20 6d   to create the m
ef10: 65 6d 6f 72 79 20 73 6f 20 69 74 20 0a 20 20 2a  emory so it .  *
ef20: 2a 20 6d 75 73 74 20 62 65 20 7a 65 72 6f 2d 69  * must be zero-i
ef30: 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20  nitialized */.  
ef40: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
ef50: 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
ef60: 69 66 20 28 6c 61 73 74 45 72 72 6e 6f 20 3d 3d  if (lastErrno ==
ef70: 20 45 52 52 4f 52 5f 41 4c 52 45 41 44 59 5f 45   ERROR_ALREADY_E
ef80: 58 49 53 54 53 29 7b 0a 20 20 20 20 62 49 6e 69  XISTS){.    bIni
ef90: 74 20 3d 20 46 41 4c 53 45 3b 0a 20 20 7d 0a 0a  t = FALSE;.  }..
efa0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
efb0: 4e 61 6d 65 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  Name);..  /* If 
efc0: 77 65 20 73 75 63 63 65 65 64 65 64 20 69 6e 20  we succeeded in 
efd0: 6d 61 6b 69 6e 67 20 74 68 65 20 73 68 61 72 65  making the share
efe0: 64 20 6d 65 6d 6f 72 79 20 68 61 6e 64 6c 65 2c  d memory handle,
eff0: 20 6d 61 70 20 69 74 2e 20 2a 2f 0a 20 20 69 66   map it. */.  if
f000: 28 20 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64  ( pFile->hShared
f010: 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 73   ){.    pFile->s
f020: 68 61 72 65 64 20 3d 20 28 77 69 6e 63 65 4c 6f  hared = (winceLo
f030: 63 6b 2a 29 6f 73 4d 61 70 56 69 65 77 4f 66 46  ck*)osMapViewOfF
f040: 69 6c 65 28 70 46 69 6c 65 2d 3e 68 53 68 61 72  ile(pFile->hShar
f050: 65 64 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  ed, .           
f060: 20 20 46 49 4c 45 5f 4d 41 50 5f 52 45 41 44 7c    FILE_MAP_READ|
f070: 46 49 4c 45 5f 4d 41 50 5f 57 52 49 54 45 2c 20  FILE_MAP_WRITE, 
f080: 30 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 69 6e  0, 0, sizeof(win
f090: 63 65 4c 6f 63 6b 29 29 3b 0a 20 20 20 20 2f 2a  ceLock));.    /*
f0a0: 20 49 66 20 6d 61 70 70 69 6e 67 20 66 61 69 6c   If mapping fail
f0b0: 65 64 2c 20 63 6c 6f 73 65 20 74 68 65 20 73 68  ed, close the sh
f0c0: 61 72 65 64 20 6d 65 6d 6f 72 79 20 68 61 6e 64  ared memory hand
f0d0: 6c 65 20 61 6e 64 20 65 72 61 73 65 20 69 74 20  le and erase it 
f0e0: 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 46 69 6c  */.    if( !pFil
f0f0: 65 2d 3e 73 68 61 72 65 64 20 29 7b 0a 20 20 20  e->shared ){.   
f100: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
f110: 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
f120: 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 77 69  rror();.      wi
f130: 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
f140: 5f 49 4f 45 52 52 2c 20 70 46 69 6c 65 2d 3e 6c  _IOERR, pFile->l
f150: 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
f160: 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
f170: 63 65 43 72 65 61 74 65 4c 6f 63 6b 32 22 2c 20  ceCreateLock2", 
f180: 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  zFilename);.    
f190: 20 20 62 4c 6f 67 67 65 64 20 3d 20 54 52 55 45    bLogged = TRUE
f1a0: 3b 0a 20 20 20 20 20 20 6f 73 43 6c 6f 73 65 48  ;.      osCloseH
f1b0: 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 53 68  andle(pFile->hSh
f1c0: 61 72 65 64 29 3b 0a 20 20 20 20 20 20 70 46 69  ared);.      pFi
f1d0: 6c 65 2d 3e 68 53 68 61 72 65 64 20 3d 20 4e 55  le->hShared = NU
f1e0: 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  LL;.    }.  }.. 
f1f0: 20 2f 2a 20 49 66 20 73 68 61 72 65 64 20 6d 65   /* If shared me
f200: 6d 6f 72 79 20 63 6f 75 6c 64 20 6e 6f 74 20 62  mory could not b
f210: 65 20 63 72 65 61 74 65 64 2c 20 74 68 65 6e 20  e created, then 
f220: 63 6c 6f 73 65 20 74 68 65 20 6d 75 74 65 78 20  close the mutex 
f230: 61 6e 64 20 66 61 69 6c 20 2a 2f 0a 20 20 69 66  and fail */.  if
f240: 28 20 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64  ( pFile->hShared
f250: 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66  ==NULL ){.    if
f260: 28 20 21 62 4c 6f 67 67 65 64 20 29 7b 0a 20 20  ( !bLogged ){.  
f270: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
f280: 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f  rrno = lastErrno
f290: 3b 0a 20 20 20 20 20 20 77 69 6e 4c 6f 67 45 72  ;.      winLogEr
f2a0: 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
f2b0: 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  , pFile->lastErr
f2c0: 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
f2d0: 20 20 20 20 20 20 22 77 69 6e 63 65 43 72 65 61        "winceCrea
f2e0: 74 65 4c 6f 63 6b 33 22 2c 20 7a 46 69 6c 65 6e  teLock3", zFilen
f2f0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 62 4c 6f 67  ame);.      bLog
f300: 67 65 64 20 3d 20 54 52 55 45 3b 0a 20 20 20 20  ged = TRUE;.    
f310: 7d 0a 20 20 20 20 77 69 6e 63 65 4d 75 74 65 78  }.    winceMutex
f320: 52 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68  Release(pFile->h
f330: 4d 75 74 65 78 29 3b 0a 20 20 20 20 6f 73 43 6c  Mutex);.    osCl
f340: 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d  oseHandle(pFile-
f350: 3e 68 4d 75 74 65 78 29 3b 0a 20 20 20 20 70 46  >hMutex);.    pF
f360: 69 6c 65 2d 3e 68 4d 75 74 65 78 20 3d 20 4e 55  ile->hMutex = NU
f370: 4c 4c 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  LL;.    return S
f380: 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 7d  QLITE_IOERR;.  }
f390: 0a 20 20 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c  .  .  /* Initial
f3a0: 69 7a 65 20 74 68 65 20 73 68 61 72 65 64 20 6d  ize the shared m
f3b0: 65 6d 6f 72 79 20 69 66 20 77 65 27 72 65 20 73  emory if we're s
f3c0: 75 70 70 6f 73 65 64 20 74 6f 20 2a 2f 0a 20 20  upposed to */.  
f3d0: 69 66 28 20 62 49 6e 69 74 20 29 7b 0a 20 20 20  if( bInit ){.   
f3e0: 20 6d 65 6d 73 65 74 28 70 46 69 6c 65 2d 3e 73   memset(pFile->s
f3f0: 68 61 72 65 64 2c 20 30 2c 20 73 69 7a 65 6f 66  hared, 0, sizeof
f400: 28 77 69 6e 63 65 4c 6f 63 6b 29 29 3b 0a 20 20  (winceLock));.  
f410: 7d 0a 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 52  }..  winceMutexR
f420: 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d  elease(pFile->hM
f430: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
f440: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
f450: 0a 2a 2a 20 44 65 73 74 72 6f 79 20 74 68 65 20  .** Destroy the 
f460: 70 61 72 74 20 6f 66 20 77 69 6e 46 69 6c 65 20  part of winFile 
f470: 74 68 61 74 20 64 65 61 6c 73 20 77 69 74 68 20  that deals with 
f480: 77 69 6e 63 65 20 6c 6f 63 6b 73 0a 2a 2f 0a 73  wince locks.*/.s
f490: 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 63 65  tatic void wince
f4a0: 44 65 73 74 72 6f 79 4c 6f 63 6b 28 77 69 6e 46  DestroyLock(winF
f4b0: 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69  ile *pFile){.  i
f4c0: 66 20 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78  f (pFile->hMutex
f4d0: 29 7b 0a 20 20 20 20 2f 2a 20 41 63 71 75 69 72  ){.    /* Acquir
f4e0: 65 20 74 68 65 20 6d 75 74 65 78 20 2a 2f 0a 20  e the mutex */. 
f4f0: 20 20 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71     winceMutexAcq
f500: 75 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74  uire(pFile->hMut
f510: 65 78 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65  ex);..    /* The
f520: 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b   following block
f530: 73 20 73 68 6f 75 6c 64 20 70 72 6f 62 61 62 6c  s should probabl
f540: 79 20 61 73 73 65 72 74 20 69 6e 20 64 65 62 75  y assert in debu
f550: 67 20 6d 6f 64 65 2c 20 62 75 74 20 74 68 65 79  g mode, but they
f560: 0a 20 20 20 20 20 20 20 61 72 65 20 74 6f 20 63  .       are to c
f570: 6c 65 61 6e 75 70 20 69 6e 20 63 61 73 65 20 61  leanup in case a
f580: 6e 79 20 6c 6f 63 6b 73 20 72 65 6d 61 69 6e 65  ny locks remaine
f590: 64 20 6f 70 65 6e 20 2a 2f 0a 20 20 20 20 69 66  d open */.    if
f5a0: 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e   (pFile->local.n
f5b0: 52 65 61 64 65 72 73 29 7b 0a 20 20 20 20 20 20  Readers){.      
f5c0: 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 6e  pFile->shared->n
f5d0: 52 65 61 64 65 72 73 20 2d 2d 3b 0a 20 20 20 20  Readers --;.    
f5e0: 7d 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d  }.    if (pFile-
f5f0: 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76 65 64  >local.bReserved
f600: 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
f610: 73 68 61 72 65 64 2d 3e 62 52 65 73 65 72 76 65  shared->bReserve
f620: 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d  d = FALSE;.    }
f630: 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  .    if (pFile->
f640: 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67 29 7b  local.bPending){
f650: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68  .      pFile->sh
f660: 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e 67 20 3d  ared->bPending =
f670: 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 20 20   FALSE;.    }.  
f680: 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63    if (pFile->loc
f690: 61 6c 2e 62 45 78 63 6c 75 73 69 76 65 29 7b 0a  al.bExclusive){.
f6a0: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61        pFile->sha
f6b0: 72 65 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20  red->bExclusive 
f6c0: 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 0a  = FALSE;.    }..
f6d0: 20 20 20 20 2f 2a 20 44 65 2d 72 65 66 65 72 65      /* De-refere
f6e0: 6e 63 65 20 61 6e 64 20 63 6c 6f 73 65 20 6f 75  nce and close ou
f6f0: 72 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 68  r copy of the sh
f700: 61 72 65 64 20 6d 65 6d 6f 72 79 20 68 61 6e 64  ared memory hand
f710: 6c 65 20 2a 2f 0a 20 20 20 20 6f 73 55 6e 6d 61  le */.    osUnma
f720: 70 56 69 65 77 4f 66 46 69 6c 65 28 70 46 69 6c  pViewOfFile(pFil
f730: 65 2d 3e 73 68 61 72 65 64 29 3b 0a 20 20 20 20  e->shared);.    
f740: 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46  osCloseHandle(pF
f750: 69 6c 65 2d 3e 68 53 68 61 72 65 64 29 3b 0a 0a  ile->hShared);..
f760: 20 20 20 20 2f 2a 20 44 6f 6e 65 20 77 69 74 68      /* Done with
f770: 20 74 68 65 20 6d 75 74 65 78 20 2a 2f 0a 20 20   the mutex */.  
f780: 20 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c 65    winceMutexRele
f790: 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65  ase(pFile->hMute
f7a0: 78 29 3b 20 20 20 20 0a 20 20 20 20 6f 73 43 6c  x);    .    osCl
f7b0: 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d  oseHandle(pFile-
f7c0: 3e 68 4d 75 74 65 78 29 3b 0a 20 20 20 20 70 46  >hMutex);.    pF
f7d0: 69 6c 65 2d 3e 68 4d 75 74 65 78 20 3d 20 4e 55  ile->hMutex = NU
f7e0: 4c 4c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 0a 2a  LL;.  }.}../* .*
f7f0: 2a 20 41 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74  * An implementat
f800: 69 6f 6e 20 6f 66 20 74 68 65 20 4c 6f 63 6b 46  ion of the LockF
f810: 69 6c 65 28 29 20 41 50 49 20 6f 66 20 57 69 6e  ile() API of Win
f820: 64 6f 77 73 20 66 6f 72 20 43 45 0a 2a 2f 0a 73  dows for CE.*/.s
f830: 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 63 65  tatic BOOL wince
f840: 4c 6f 63 6b 46 69 6c 65 28 0a 20 20 4c 50 48 41  LockFile(.  LPHA
f850: 4e 44 4c 45 20 70 68 46 69 6c 65 2c 0a 20 20 44  NDLE phFile,.  D
f860: 57 4f 52 44 20 64 77 46 69 6c 65 4f 66 66 73 65  WORD dwFileOffse
f870: 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 64 77  tLow,.  DWORD dw
f880: 46 69 6c 65 4f 66 66 73 65 74 48 69 67 68 2c 0a  FileOffsetHigh,.
f890: 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f    DWORD nNumberO
f8a0: 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 2c  fBytesToLockLow,
f8b0: 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72  .  DWORD nNumber
f8c0: 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 48 69 67  OfBytesToLockHig
f8d0: 68 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a  h.){.  winFile *
f8e0: 70 46 69 6c 65 20 3d 20 48 41 4e 44 4c 45 5f 54  pFile = HANDLE_T
f8f0: 4f 5f 57 49 4e 46 49 4c 45 28 70 68 46 69 6c 65  O_WINFILE(phFile
f900: 29 3b 0a 20 20 42 4f 4f 4c 20 62 52 65 74 75 72  );.  BOOL bRetur
f910: 6e 20 3d 20 46 41 4c 53 45 3b 0a 0a 20 20 55 4e  n = FALSE;..  UN
f920: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64  USED_PARAMETER(d
f930: 77 46 69 6c 65 4f 66 66 73 65 74 48 69 67 68 29  wFileOffsetHigh)
f940: 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
f950: 45 54 45 52 28 6e 4e 75 6d 62 65 72 4f 66 42 79  ETER(nNumberOfBy
f960: 74 65 73 54 6f 4c 6f 63 6b 48 69 67 68 29 3b 0a  tesToLockHigh);.
f970: 0a 20 20 69 66 20 28 21 70 46 69 6c 65 2d 3e 68  .  if (!pFile->h
f980: 4d 75 74 65 78 29 20 72 65 74 75 72 6e 20 54 52  Mutex) return TR
f990: 55 45 3b 0a 20 20 77 69 6e 63 65 4d 75 74 65 78  UE;.  winceMutex
f9a0: 41 63 71 75 69 72 65 28 70 46 69 6c 65 2d 3e 68  Acquire(pFile->h
f9b0: 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 57 61  Mutex);..  /* Wa
f9c0: 6e 74 69 6e 67 20 61 6e 20 65 78 63 6c 75 73 69  nting an exclusi
f9d0: 76 65 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 69 66  ve lock? */.  if
f9e0: 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f   (dwFileOffsetLo
f9f0: 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52  w == (DWORD)SHAR
fa00: 45 44 5f 46 49 52 53 54 0a 20 20 20 20 20 20 20  ED_FIRST.       
fa10: 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65  && nNumberOfByte
fa20: 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 28 44  sToLockLow == (D
fa30: 57 4f 52 44 29 53 48 41 52 45 44 5f 53 49 5a 45  WORD)SHARED_SIZE
fa40: 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65  ){.    if (pFile
fa50: 2d 3e 73 68 61 72 65 64 2d 3e 6e 52 65 61 64 65  ->shared->nReade
fa60: 72 73 20 3d 3d 20 30 20 26 26 20 70 46 69 6c 65  rs == 0 && pFile
fa70: 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75  ->shared->bExclu
fa80: 73 69 76 65 20 3d 3d 20 30 29 7b 0a 20 20 20 20  sive == 0){.    
fa90: 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64     pFile->shared
faa0: 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 20 54  ->bExclusive = T
fab0: 52 55 45 3b 0a 20 20 20 20 20 20 20 70 46 69 6c  RUE;.       pFil
fac0: 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73  e->local.bExclus
fad0: 69 76 65 20 3d 20 54 52 55 45 3b 0a 20 20 20 20  ive = TRUE;.    
fae0: 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55     bReturn = TRU
faf0: 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  E;.    }.  }..  
fb00: 2f 2a 20 57 61 6e 74 20 61 20 72 65 61 64 2d 6f  /* Want a read-o
fb10: 6e 6c 79 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 65  nly lock? */.  e
fb20: 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66  lse if (dwFileOf
fb30: 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52  fsetLow == (DWOR
fb40: 44 29 53 48 41 52 45 44 5f 46 49 52 53 54 20 26  D)SHARED_FIRST &
fb50: 26 0a 20 20 20 20 20 20 20 20 20 20 20 6e 4e 75  &.           nNu
fb60: 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63  mberOfBytesToLoc
fb70: 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20  kLow == 1){.    
fb80: 69 66 20 28 70 46 69 6c 65 2d 3e 73 68 61 72 65  if (pFile->share
fb90: 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 3d  d->bExclusive ==
fba0: 20 30 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65   0){.      pFile
fbb0: 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73  ->local.nReaders
fbc0: 20 2b 2b 3b 0a 20 20 20 20 20 20 69 66 20 28 70   ++;.      if (p
fbd0: 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61  File->local.nRea
fbe0: 64 65 72 73 20 3d 3d 20 31 29 7b 0a 20 20 20 20  ders == 1){.    
fbf0: 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65      pFile->share
fc00: 64 2d 3e 6e 52 65 61 64 65 72 73 20 2b 2b 3b 0a  d->nReaders ++;.
fc10: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 52        }.      bR
fc20: 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20  eturn = TRUE;.  
fc30: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 61    }.  }..  /* Wa
fc40: 6e 74 20 61 20 70 65 6e 64 69 6e 67 20 6c 6f 63  nt a pending loc
fc50: 6b 3f 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20  k? */.  else if 
fc60: 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77  (dwFileOffsetLow
fc70: 20 3d 3d 20 28 44 57 4f 52 44 29 50 45 4e 44 49   == (DWORD)PENDI
fc80: 4e 47 5f 42 59 54 45 0a 20 20 20 20 20 20 20 20  NG_BYTE.        
fc90: 20 20 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42     && nNumberOfB
fca0: 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d  ytesToLockLow ==
fcb0: 20 31 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e   1){.    /* If n
fcc0: 6f 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 20 68  o pending lock h
fcd0: 61 73 20 62 65 65 6e 20 61 63 71 75 69 72 65 64  as been acquired
fce0: 2c 20 74 68 65 6e 20 61 63 71 75 69 72 65 20 69  , then acquire i
fcf0: 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 46 69  t */.    if (pFi
fd00: 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e  le->shared->bPen
fd10: 64 69 6e 67 20 3d 3d 20 30 29 20 7b 0a 20 20 20  ding == 0) {.   
fd20: 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64     pFile->shared
fd30: 2d 3e 62 50 65 6e 64 69 6e 67 20 3d 20 54 52 55  ->bPending = TRU
fd40: 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  E;.      pFile->
fd50: 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67 20 3d  local.bPending =
fd60: 20 54 52 55 45 3b 0a 20 20 20 20 20 20 62 52 65   TRUE;.      bRe
fd70: 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20  turn = TRUE;.   
fd80: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 61 6e   }.  }..  /* Wan
fd90: 74 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63  t a reserved loc
fda0: 6b 3f 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20  k? */.  else if 
fdb0: 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77  (dwFileOffsetLow
fdc0: 20 3d 3d 20 28 44 57 4f 52 44 29 52 45 53 45 52   == (DWORD)RESER
fdd0: 56 45 44 5f 42 59 54 45 0a 20 20 20 20 20 20 20  VED_BYTE.       
fde0: 20 20 20 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66      && nNumberOf
fdf0: 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d  BytesToLockLow =
fe00: 3d 20 31 29 7b 0a 20 20 20 20 69 66 20 28 70 46  = 1){.    if (pF
fe10: 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52 65  ile->shared->bRe
fe20: 73 65 72 76 65 64 20 3d 3d 20 30 29 20 7b 0a 20  served == 0) {. 
fe30: 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72       pFile->shar
fe40: 65 64 2d 3e 62 52 65 73 65 72 76 65 64 20 3d 20  ed->bReserved = 
fe50: 54 52 55 45 3b 0a 20 20 20 20 20 20 70 46 69 6c  TRUE;.      pFil
fe60: 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76  e->local.bReserv
fe70: 65 64 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20  ed = TRUE;.     
fe80: 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b   bReturn = TRUE;
fe90: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 77 69  .    }.  }..  wi
fea0: 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28  nceMutexRelease(
feb0: 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a  pFile->hMutex);.
fec0: 20 20 72 65 74 75 72 6e 20 62 52 65 74 75 72 6e    return bReturn
fed0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6d  ;.}../*.** An im
fee0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
fef0: 74 68 65 20 55 6e 6c 6f 63 6b 46 69 6c 65 20 41  the UnlockFile A
ff00: 50 49 20 6f 66 20 57 69 6e 64 6f 77 73 20 66 6f  PI of Windows fo
ff10: 72 20 43 45 0a 2a 2f 0a 73 74 61 74 69 63 20 42  r CE.*/.static B
ff20: 4f 4f 4c 20 77 69 6e 63 65 55 6e 6c 6f 63 6b 46  OOL winceUnlockF
ff30: 69 6c 65 28 0a 20 20 4c 50 48 41 4e 44 4c 45 20  ile(.  LPHANDLE 
ff40: 70 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20  phFile,.  DWORD 
ff50: 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 2c  dwFileOffsetLow,
ff60: 0a 20 20 44 57 4f 52 44 20 64 77 46 69 6c 65 4f  .  DWORD dwFileO
ff70: 66 66 73 65 74 48 69 67 68 2c 0a 20 20 44 57 4f  ffsetHigh,.  DWO
ff80: 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65  RD nNumberOfByte
ff90: 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 2c 0a 20 20  sToUnlockLow,.  
ffa0: 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42  DWORD nNumberOfB
ffb0: 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 48 69 67 68  ytesToUnlockHigh
ffc0: 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70  .){.  winFile *p
ffd0: 46 69 6c 65 20 3d 20 48 41 4e 44 4c 45 5f 54 4f  File = HANDLE_TO
ffe0: 5f 57 49 4e 46 49 4c 45 28 70 68 46 69 6c 65 29  _WINFILE(phFile)
fff0: 3b 0a 20 20 42 4f 4f 4c 20 62 52 65 74 75 72 6e  ;.  BOOL bReturn
10000 20 3d 20 46 41 4c 53 45 3b 0a 0a 20 20 55 4e 55   = FALSE;..  UNU
10010 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 77  SED_PARAMETER(dw
10020 46 69 6c 65 4f 66 66 73 65 74 48 69 67 68 29 3b  FileOffsetHigh);
10030 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
10040 54 45 52 28 6e 4e 75 6d 62 65 72 4f 66 42 79 74  TER(nNumberOfByt
10050 65 73 54 6f 55 6e 6c 6f 63 6b 48 69 67 68 29 3b  esToUnlockHigh);
10060 0a 0a 20 20 69 66 20 28 21 70 46 69 6c 65 2d 3e  ..  if (!pFile->
10070 68 4d 75 74 65 78 29 20 72 65 74 75 72 6e 20 54  hMutex) return T
10080 52 55 45 3b 0a 20 20 77 69 6e 63 65 4d 75 74 65  RUE;.  winceMute
10090 78 41 63 71 75 69 72 65 28 70 46 69 6c 65 2d 3e  xAcquire(pFile->
100a0 68 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 52  hMutex);..  /* R
100b0 65 6c 65 61 73 69 6e 67 20 61 20 72 65 61 64 65  eleasing a reade
100c0 72 20 6c 6f 63 6b 20 6f 72 20 61 6e 20 65 78 63  r lock or an exc
100d0 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20  lusive lock */. 
100e0 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65   if (dwFileOffse
100f0 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 53  tLow == (DWORD)S
10100 48 41 52 45 44 5f 46 49 52 53 54 29 7b 0a 20 20  HARED_FIRST){.  
10110 20 20 2f 2a 20 44 69 64 20 77 65 20 68 61 76 65    /* Did we have
10120 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
10130 63 6b 3f 20 2a 2f 0a 20 20 20 20 69 66 20 28 70  ck? */.    if (p
10140 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63  File->local.bExc
10150 6c 75 73 69 76 65 29 7b 0a 20 20 20 20 20 20 61  lusive){.      a
10160 73 73 65 72 74 28 6e 4e 75 6d 62 65 72 4f 66 42  ssert(nNumberOfB
10170 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20  ytesToUnlockLow 
10180 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45 44  == (DWORD)SHARED
10190 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 70 46  _SIZE);.      pF
101a0 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c  ile->local.bExcl
101b0 75 73 69 76 65 20 3d 20 46 41 4c 53 45 3b 0a 20  usive = FALSE;. 
101c0 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72       pFile->shar
101d0 65 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d  ed->bExclusive =
101e0 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 62 52   FALSE;.      bR
101f0 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20  eturn = TRUE;.  
10200 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 69 64 20    }..    /* Did 
10210 77 65 20 6a 75 73 74 20 68 61 76 65 20 61 20 72  we just have a r
10220 65 61 64 65 72 20 6c 6f 63 6b 3f 20 2a 2f 0a 20  eader lock? */. 
10230 20 20 20 65 6c 73 65 20 69 66 20 28 70 46 69 6c     else if (pFil
10240 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72  e->local.nReader
10250 73 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  s){.      assert
10260 28 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54  (nNumberOfBytesT
10270 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 28 44  oUnlockLow == (D
10280 57 4f 52 44 29 53 48 41 52 45 44 5f 53 49 5a 45  WORD)SHARED_SIZE
10290 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  .             ||
102a0 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54   nNumberOfBytesT
102b0 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29  oUnlockLow == 1)
102c0 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  ;.      pFile->l
102d0 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 20 2d 2d  ocal.nReaders --
102e0 3b 0a 20 20 20 20 20 20 69 66 20 28 70 46 69 6c  ;.      if (pFil
102f0 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72  e->local.nReader
10300 73 20 3d 3d 20 30 29 0a 20 20 20 20 20 20 7b 0a  s == 0).      {.
10310 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73          pFile->s
10320 68 61 72 65 64 2d 3e 6e 52 65 61 64 65 72 73 20  hared->nReaders 
10330 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  --;.      }.    
10340 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45    bReturn = TRUE
10350 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
10360 2a 20 52 65 6c 65 61 73 69 6e 67 20 61 20 70 65  * Releasing a pe
10370 6e 64 69 6e 67 20 6c 6f 63 6b 20 2a 2f 0a 20 20  nding lock */.  
10380 65 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f  else if (dwFileO
10390 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f  ffsetLow == (DWO
103a0 52 44 29 50 45 4e 44 49 4e 47 5f 42 59 54 45 0a  RD)PENDING_BYTE.
103b0 20 20 20 20 20 20 20 20 20 20 20 26 26 20 6e 4e             && nN
103c0 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e  umberOfBytesToUn
103d0 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20  lockLow == 1){. 
103e0 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f     if (pFile->lo
103f0 63 61 6c 2e 62 50 65 6e 64 69 6e 67 29 7b 0a 20  cal.bPending){. 
10400 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61       pFile->loca
10410 6c 2e 62 50 65 6e 64 69 6e 67 20 3d 20 46 41 4c  l.bPending = FAL
10420 53 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  SE;.      pFile-
10430 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e  >shared->bPendin
10440 67 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20  g = FALSE;.     
10450 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b   bReturn = TRUE;
10460 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20  .    }.  }.  /* 
10470 52 65 6c 65 61 73 69 6e 67 20 61 20 72 65 73 65  Releasing a rese
10480 72 76 65 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 65  rved lock */.  e
10490 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66  lse if (dwFileOf
104a0 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52  fsetLow == (DWOR
104b0 44 29 52 45 53 45 52 56 45 44 5f 42 59 54 45 0a  D)RESERVED_BYTE.
104c0 20 20 20 20 20 20 20 20 20 20 20 26 26 20 6e 4e             && nN
104d0 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e  umberOfBytesToUn
104e0 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20  lockLow == 1){. 
104f0 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f     if (pFile->lo
10500 63 61 6c 2e 62 52 65 73 65 72 76 65 64 29 20 7b  cal.bReserved) {
10510 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f  .      pFile->lo
10520 63 61 6c 2e 62 52 65 73 65 72 76 65 64 20 3d 20  cal.bReserved = 
10530 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 70 46 69  FALSE;.      pFi
10540 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52 65 73  le->shared->bRes
10550 65 72 76 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20  erved = FALSE;. 
10560 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54       bReturn = T
10570 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  RUE;.    }.  }..
10580 20 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c 65    winceMutexRele
10590 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65  ase(pFile->hMute
105a0 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 52 65  x);.  return bRe
105b0 74 75 72 6e 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 45 6e  turn;.}./*.** En
105c0 64 20 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c  d of the special
105d0 20 63 6f 64 65 20 66 6f 72 20 77 69 6e 63 65 0a   code for wince.
105e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
105f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10610 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10620 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23  *************/.#
10630 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
10640 4f 53 5f 57 49 4e 43 45 20 2a 2f 0a 0a 2f 2a 0a  OS_WINCE */../*.
10650 2a 2a 20 4c 6f 63 6b 20 61 20 66 69 6c 65 20 72  ** Lock a file r
10660 65 67 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  egion..*/.static
10670 20 42 4f 4f 4c 20 77 69 6e 4c 6f 63 6b 46 69 6c   BOOL winLockFil
10680 65 28 0a 20 20 4c 50 48 41 4e 44 4c 45 20 70 68  e(.  LPHANDLE ph
10690 46 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20 66 6c  File,.  DWORD fl
106a0 61 67 73 2c 0a 20 20 44 57 4f 52 44 20 6f 66 66  ags,.  DWORD off
106b0 73 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20  setLow,.  DWORD 
106c0 6f 66 66 73 65 74 48 69 67 68 2c 0a 20 20 44 57  offsetHigh,.  DW
106d0 4f 52 44 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c  ORD numBytesLow,
106e0 0a 20 20 44 57 4f 52 44 20 6e 75 6d 42 79 74 65  .  DWORD numByte
106f0 73 48 69 67 68 0a 29 7b 0a 23 69 66 20 53 51 4c  sHigh.){.#if SQL
10700 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 2f  ITE_OS_WINCE.  /
10710 2a 0a 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 69 6e  *.  ** NOTE: Win
10720 64 6f 77 73 20 43 45 20 69 73 20 68 61 6e 64 6c  dows CE is handl
10730 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20 68  ed differently h
10740 65 72 65 20 64 75 65 20 69 74 73 20 6c 61 63 6b  ere due its lack
10750 20 6f 66 20 74 68 65 20 57 69 6e 33 32 0a 20 20   of the Win32.  
10760 2a 2a 20 20 20 20 20 20 20 41 50 49 20 4c 6f 63  **       API Loc
10770 6b 46 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 72 65  kFile..  */.  re
10780 74 75 72 6e 20 77 69 6e 63 65 4c 6f 63 6b 46 69  turn winceLockFi
10790 6c 65 28 70 68 46 69 6c 65 2c 20 6f 66 66 73 65  le(phFile, offse
107a0 74 4c 6f 77 2c 20 6f 66 66 73 65 74 48 69 67 68  tLow, offsetHigh
107b0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
107c0 20 20 20 20 20 20 20 20 20 6e 75 6d 42 79 74 65           numByte
107d0 73 4c 6f 77 2c 20 6e 75 6d 42 79 74 65 73 48 69  sLow, numBytesHi
107e0 67 68 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28  gh);.#else.  if(
107f0 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 20 20   osIsNT() ){.   
10800 20 4f 56 45 52 4c 41 50 50 45 44 20 6f 76 6c 70   OVERLAPPED ovlp
10810 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 6f 76  ;.    memset(&ov
10820 6c 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4f 56  lp, 0, sizeof(OV
10830 45 52 4c 41 50 50 45 44 29 29 3b 0a 20 20 20 20  ERLAPPED));.    
10840 6f 76 6c 70 2e 4f 66 66 73 65 74 20 3d 20 6f 66  ovlp.Offset = of
10850 66 73 65 74 4c 6f 77 3b 0a 20 20 20 20 6f 76 6c  fsetLow;.    ovl
10860 70 2e 4f 66 66 73 65 74 48 69 67 68 20 3d 20 6f  p.OffsetHigh = o
10870 66 66 73 65 74 48 69 67 68 3b 0a 20 20 20 20 72  ffsetHigh;.    r
10880 65 74 75 72 6e 20 6f 73 4c 6f 63 6b 46 69 6c 65  eturn osLockFile
10890 45 78 28 2a 70 68 46 69 6c 65 2c 20 66 6c 61 67  Ex(*phFile, flag
108a0 73 2c 20 30 2c 20 6e 75 6d 42 79 74 65 73 4c 6f  s, 0, numBytesLo
108b0 77 2c 20 6e 75 6d 42 79 74 65 73 48 69 67 68 2c  w, numBytesHigh,
108c0 20 26 6f 76 6c 70 29 3b 0a 20 20 7d 65 6c 73 65   &ovlp);.  }else
108d0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6f 73 4c  {.    return osL
108e0 6f 63 6b 46 69 6c 65 28 2a 70 68 46 69 6c 65 2c  ockFile(*phFile,
108f0 20 6f 66 66 73 65 74 4c 6f 77 2c 20 6f 66 66 73   offsetLow, offs
10900 65 74 48 69 67 68 2c 20 6e 75 6d 42 79 74 65 73  etHigh, numBytes
10910 4c 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Low,.           
10920 20 20 20 20 20 20 20 20 20 20 20 6e 75 6d 42 79             numBy
10930 74 65 73 48 69 67 68 29 3b 0a 20 20 7d 0a 23 65  tesHigh);.  }.#e
10940 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e  ndif.}../*.** Un
10950 6c 6f 63 6b 20 61 20 66 69 6c 65 20 72 65 67 69  lock a file regi
10960 6f 6e 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 42  on.. */.static B
10970 4f 4f 4c 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c  OOL winUnlockFil
10980 65 28 0a 20 20 4c 50 48 41 4e 44 4c 45 20 70 68  e(.  LPHANDLE ph
10990 46 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20 6f 66  File,.  DWORD of
109a0 66 73 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44  fsetLow,.  DWORD
109b0 20 6f 66 66 73 65 74 48 69 67 68 2c 0a 20 20 44   offsetHigh,.  D
109c0 57 4f 52 44 20 6e 75 6d 42 79 74 65 73 4c 6f 77  WORD numBytesLow
109d0 2c 0a 20 20 44 57 4f 52 44 20 6e 75 6d 42 79 74  ,.  DWORD numByt
109e0 65 73 48 69 67 68 0a 29 7b 0a 23 69 66 20 53 51  esHigh.){.#if SQ
109f0 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
10a00 2f 2a 0a 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 69  /*.  ** NOTE: Wi
10a10 6e 64 6f 77 73 20 43 45 20 69 73 20 68 61 6e 64  ndows CE is hand
10a20 6c 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20  led differently 
10a30 68 65 72 65 20 64 75 65 20 69 74 73 20 6c 61 63  here due its lac
10a40 6b 20 6f 66 20 74 68 65 20 57 69 6e 33 32 0a 20  k of the Win32. 
10a50 20 2a 2a 20 20 20 20 20 20 20 41 50 49 20 55 6e   **       API Un
10a60 6c 6f 63 6b 46 69 6c 65 2e 0a 20 20 2a 2f 0a 20  lockFile..  */. 
10a70 20 72 65 74 75 72 6e 20 77 69 6e 63 65 55 6e 6c   return winceUnl
10a80 6f 63 6b 46 69 6c 65 28 70 68 46 69 6c 65 2c 20  ockFile(phFile, 
10a90 6f 66 66 73 65 74 4c 6f 77 2c 20 6f 66 66 73 65  offsetLow, offse
10aa0 74 48 69 67 68 2c 0a 20 20 20 20 20 20 20 20 20  tHigh,.         
10ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ac0 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 20 6e 75 6d  numBytesLow, num
10ad0 42 79 74 65 73 48 69 67 68 29 3b 0a 23 65 6c 73  BytesHigh);.#els
10ae0 65 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29  e.  if( osIsNT()
10af0 20 29 7b 0a 20 20 20 20 4f 56 45 52 4c 41 50 50   ){.    OVERLAPP
10b00 45 44 20 6f 76 6c 70 3b 0a 20 20 20 20 6d 65 6d  ED ovlp;.    mem
10b10 73 65 74 28 26 6f 76 6c 70 2c 20 30 2c 20 73 69  set(&ovlp, 0, si
10b20 7a 65 6f 66 28 4f 56 45 52 4c 41 50 50 45 44 29  zeof(OVERLAPPED)
10b30 29 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66 66 73  );.    ovlp.Offs
10b40 65 74 20 3d 20 6f 66 66 73 65 74 4c 6f 77 3b 0a  et = offsetLow;.
10b50 20 20 20 20 6f 76 6c 70 2e 4f 66 66 73 65 74 48      ovlp.OffsetH
10b60 69 67 68 20 3d 20 6f 66 66 73 65 74 48 69 67 68  igh = offsetHigh
10b70 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6f 73 55  ;.    return osU
10b80 6e 6c 6f 63 6b 46 69 6c 65 45 78 28 2a 70 68 46  nlockFileEx(*phF
10b90 69 6c 65 2c 20 30 2c 20 6e 75 6d 42 79 74 65 73  ile, 0, numBytes
10ba0 4c 6f 77 2c 20 6e 75 6d 42 79 74 65 73 48 69 67  Low, numBytesHig
10bb0 68 2c 20 26 6f 76 6c 70 29 3b 0a 20 20 7d 65 6c  h, &ovlp);.  }el
10bc0 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6f  se{.    return o
10bd0 73 55 6e 6c 6f 63 6b 46 69 6c 65 28 2a 70 68 46  sUnlockFile(*phF
10be0 69 6c 65 2c 20 6f 66 66 73 65 74 4c 6f 77 2c 20  ile, offsetLow, 
10bf0 6f 66 66 73 65 74 48 69 67 68 2c 20 6e 75 6d 42  offsetHigh, numB
10c00 79 74 65 73 4c 6f 77 2c 0a 20 20 20 20 20 20 20  ytesLow,.       
10c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c20 20 6e 75 6d 42 79 74 65 73 48 69 67 68 29 3b 0a   numBytesHigh);.
10c30 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a    }.#endif.}../*
10c40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10c50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10c60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10c70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10c80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20  ************.** 
10c90 54 68 65 20 6e 65 78 74 20 67 72 6f 75 70 20 6f  The next group o
10ca0 66 20 72 6f 75 74 69 6e 65 73 20 69 6d 70 6c 65  f routines imple
10cb0 6d 65 6e 74 20 74 68 65 20 49 2f 4f 20 6d 65 74  ment the I/O met
10cc0 68 6f 64 73 20 73 70 65 63 69 66 69 65 64 0a 2a  hods specified.*
10cd0 2a 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 33  * by the sqlite3
10ce0 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
10cf0 63 74 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ct..************
10d00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10d10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10d20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10d30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10d40 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 20  **/../*.** Some 
10d50 4d 69 63 72 6f 73 6f 66 74 20 63 6f 6d 70 69 6c  Microsoft compil
10d60 65 72 73 20 6c 61 63 6b 20 74 68 69 73 20 64 65  ers lack this de
10d70 66 69 6e 69 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66  finition..*/.#if
10d80 6e 64 65 66 20 49 4e 56 41 4c 49 44 5f 53 45 54  ndef INVALID_SET
10d90 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 0a 23 20  _FILE_POINTER.# 
10da0 64 65 66 69 6e 65 20 49 4e 56 41 4c 49 44 5f 53  define INVALID_S
10db0 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 20  ET_FILE_POINTER 
10dc0 28 28 44 57 4f 52 44 29 2d 31 29 0a 23 65 6e 64  ((DWORD)-1).#end
10dd0 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  if../*.** Move t
10de0 68 65 20 63 75 72 72 65 6e 74 20 70 6f 73 69 74  he current posit
10df0 69 6f 6e 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ion of the file 
10e00 68 61 6e 64 6c 65 20 70 61 73 73 65 64 20 61 73  handle passed as
10e10 20 74 68 65 20 66 69 72 73 74 20 0a 2a 2a 20 61   the first .** a
10e20 72 67 75 6d 65 6e 74 20 74 6f 20 6f 66 66 73 65  rgument to offse
10e30 74 20 69 4f 66 66 73 65 74 20 77 69 74 68 69 6e  t iOffset within
10e40 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20 73 75   the file. If su
10e50 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e  ccessful, return
10e60 20 30 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73   0. .** Otherwis
10e70 65 2c 20 73 65 74 20 70 46 69 6c 65 2d 3e 6c 61  e, set pFile->la
10e80 73 74 45 72 72 6e 6f 20 61 6e 64 20 72 65 74 75  stErrno and retu
10e90 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a  rn non-zero..*/.
10ea0 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 65  static int winSe
10eb0 65 6b 46 69 6c 65 28 77 69 6e 46 69 6c 65 20 2a  ekFile(winFile *
10ec0 70 46 69 6c 65 2c 20 73 71 6c 69 74 65 33 5f 69  pFile, sqlite3_i
10ed0 6e 74 36 34 20 69 4f 66 66 73 65 74 29 7b 0a 23  nt64 iOffset){.#
10ee0 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
10ef0 4e 52 54 0a 20 20 4c 4f 4e 47 20 75 70 70 65 72  NRT.  LONG upper
10f00 42 69 74 73 3b 20 20 20 20 20 20 20 20 20 20 20  Bits;           
10f10 20 20 20 20 20 20 2f 2a 20 4d 6f 73 74 20 73 69        /* Most si
10f20 67 2e 20 33 32 20 62 69 74 73 20 6f 66 20 6e 65  g. 32 bits of ne
10f30 77 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 4c 4f  w offset */.  LO
10f40 4e 47 20 6c 6f 77 65 72 42 69 74 73 3b 20 20 20  NG lowerBits;   
10f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10f60 20 4c 65 61 73 74 20 73 69 67 2e 20 33 32 20 62   Least sig. 32 b
10f70 69 74 73 20 6f 66 20 6e 65 77 20 6f 66 66 73 65  its of new offse
10f80 74 20 2a 2f 0a 20 20 44 57 4f 52 44 20 64 77 52  t */.  DWORD dwR
10f90 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  et;             
10fa0 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
10fb0 72 65 74 75 72 6e 65 64 20 62 79 20 53 65 74 46  returned by SetF
10fc0 69 6c 65 50 6f 69 6e 74 65 72 28 29 20 2a 2f 0a  ilePointer() */.
10fd0 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e    DWORD lastErrn
10fe0 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o;              
10ff0 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72    /* Value retur
11000 6e 65 64 20 62 79 20 47 65 74 4c 61 73 74 45 72  ned by GetLastEr
11010 72 6f 72 28 29 20 2a 2f 0a 0a 20 20 4f 53 54 52  ror() */..  OSTR
11020 41 43 45 28 28 22 53 45 45 4b 20 66 69 6c 65 3d  ACE(("SEEK file=
11030 25 70 2c 20 6f 66 66 73 65 74 3d 25 6c 6c 64 5c  %p, offset=%lld\
11040 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 69 4f  n", pFile->h, iO
11050 66 66 73 65 74 29 29 3b 0a 0a 20 20 75 70 70 65  ffset));..  uppe
11060 72 42 69 74 73 20 3d 20 28 4c 4f 4e 47 29 28 28  rBits = (LONG)((
11070 69 4f 66 66 73 65 74 3e 3e 33 32 29 20 26 20 30  iOffset>>32) & 0
11080 78 37 66 66 66 66 66 66 66 29 3b 0a 20 20 6c 6f  x7fffffff);.  lo
11090 77 65 72 42 69 74 73 20 3d 20 28 4c 4f 4e 47 29  werBits = (LONG)
110a0 28 69 4f 66 66 73 65 74 20 26 20 30 78 66 66 66  (iOffset & 0xfff
110b0 66 66 66 66 66 29 3b 0a 0a 20 20 2f 2a 20 41 50  fffff);..  /* AP
110c0 49 20 6f 64 64 69 74 79 3a 20 49 66 20 73 75 63  I oddity: If suc
110d0 63 65 73 73 66 75 6c 2c 20 53 65 74 46 69 6c 65  cessful, SetFile
110e0 50 6f 69 6e 74 65 72 28 29 20 72 65 74 75 72 6e  Pointer() return
110f0 73 20 61 20 64 77 6f 72 64 20 0a 20 20 2a 2a 20  s a dword .  ** 
11100 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6c  containing the l
11110 6f 77 65 72 20 33 32 2d 62 69 74 73 20 6f 66 20  ower 32-bits of 
11120 74 68 65 20 6e 65 77 20 66 69 6c 65 2d 6f 66 66  the new file-off
11130 73 65 74 2e 20 4f 72 2c 20 69 66 20 69 74 20 66  set. Or, if it f
11140 61 69 6c 73 2c 0a 20 20 2a 2a 20 69 74 20 72 65  ails,.  ** it re
11150 74 75 72 6e 73 20 49 4e 56 41 4c 49 44 5f 53 45  turns INVALID_SE
11160 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 2e 20  T_FILE_POINTER. 
11170 48 6f 77 65 76 65 72 20 61 63 63 6f 72 64 69 6e  However accordin
11180 67 20 74 6f 20 4d 53 44 4e 2c 20 0a 20 20 2a 2a  g to MSDN, .  **
11190 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c   INVALID_SET_FIL
111a0 45 5f 50 4f 49 4e 54 45 52 20 6d 61 79 20 61 6c  E_POINTER may al
111b0 73 6f 20 62 65 20 61 20 76 61 6c 69 64 20 6e 65  so be a valid ne
111c0 77 20 6f 66 66 73 65 74 2e 20 53 6f 20 74 6f 20  w offset. So to 
111d0 64 65 74 65 72 6d 69 6e 65 20 0a 20 20 2a 2a 20  determine .  ** 
111e0 77 68 65 74 68 65 72 20 61 6e 20 65 72 72 6f 72  whether an error
111f0 20 68 61 73 20 61 63 74 75 61 6c 6c 79 20 6f 63   has actually oc
11200 63 75 72 72 65 64 2c 20 69 74 20 69 73 20 61 6c  curred, it is al
11210 73 6f 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  so necessary to 
11220 63 61 6c 6c 20 0a 20 20 2a 2a 20 47 65 74 4c 61  call .  ** GetLa
11230 73 74 45 72 72 6f 72 28 29 2e 0a 20 20 2a 2f 0a  stError()..  */.
11240 20 20 64 77 52 65 74 20 3d 20 6f 73 53 65 74 46    dwRet = osSetF
11250 69 6c 65 50 6f 69 6e 74 65 72 28 70 46 69 6c 65  ilePointer(pFile
11260 2d 3e 68 2c 20 6c 6f 77 65 72 42 69 74 73 2c 20  ->h, lowerBits, 
11270 26 75 70 70 65 72 42 69 74 73 2c 20 46 49 4c 45  &upperBits, FILE
11280 5f 42 45 47 49 4e 29 3b 0a 0a 20 20 69 66 28 20  _BEGIN);..  if( 
11290 28 64 77 52 65 74 3d 3d 49 4e 56 41 4c 49 44 5f  (dwRet==INVALID_
112a0 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52  SET_FILE_POINTER
112b0 0a 20 20 20 20 20 20 26 26 20 28 28 6c 61 73 74  .      && ((last
112c0 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
112d0 74 45 72 72 6f 72 28 29 29 21 3d 4e 4f 5f 45 52  tError())!=NO_ER
112e0 52 4f 52 29 29 20 29 7b 0a 20 20 20 20 70 46 69  ROR)) ){.    pFi
112f0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
11300 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 77  lastErrno;.    w
11310 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
11320 45 5f 49 4f 45 52 52 5f 53 45 45 4b 2c 20 70 46  E_IOERR_SEEK, pF
11330 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a  ile->lastErrno,.
11340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11350 22 77 69 6e 53 65 65 6b 46 69 6c 65 22 2c 20 70  "winSeekFile", p
11360 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
11370 20 20 4f 53 54 52 41 43 45 28 28 22 53 45 45 4b    OSTRACE(("SEEK
11380 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c   file=%p, rc=SQL
11390 49 54 45 5f 49 4f 45 52 52 5f 53 45 45 4b 5c 6e  ITE_IOERR_SEEK\n
113a0 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20  ", pFile->h));. 
113b0 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
113c0 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 45  ..  OSTRACE(("SE
113d0 45 4b 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53  EK file=%p, rc=S
113e0 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69  QLITE_OK\n", pFi
113f0 6c 65 2d 3e 68 29 29 3b 0a 20 20 72 65 74 75 72  le->h));.  retur
11400 6e 20 30 3b 0a 23 65 6c 73 65 0a 20 20 2f 2a 0a  n 0;.#else.  /*.
11410 20 20 2a 2a 20 53 61 6d 65 20 61 73 20 61 62 6f    ** Same as abo
11420 76 65 2c 20 65 78 63 65 70 74 20 74 68 61 74 20  ve, except that 
11430 74 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74  this implementat
11440 69 6f 6e 20 77 6f 72 6b 73 20 66 6f 72 20 57 69  ion works for Wi
11450 6e 52 54 2e 0a 20 20 2a 2f 0a 0a 20 20 4c 41 52  nRT..  */..  LAR
11460 47 45 5f 49 4e 54 45 47 45 52 20 78 3b 20 20 20  GE_INTEGER x;   
11470 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11480 54 68 65 20 6e 65 77 20 6f 66 66 73 65 74 20 2a  The new offset *
11490 2f 0a 20 20 42 4f 4f 4c 20 62 52 65 74 3b 20 20  /.  BOOL bRet;  
114a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
114b0 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74      /* Value ret
114c0 75 72 6e 65 64 20 62 79 20 53 65 74 46 69 6c 65  urned by SetFile
114d0 50 6f 69 6e 74 65 72 45 78 28 29 20 2a 2f 0a 0a  PointerEx() */..
114e0 20 20 78 2e 51 75 61 64 50 61 72 74 20 3d 20 69    x.QuadPart = i
114f0 4f 66 66 73 65 74 3b 0a 20 20 62 52 65 74 20 3d  Offset;.  bRet =
11500 20 6f 73 53 65 74 46 69 6c 65 50 6f 69 6e 74 65   osSetFilePointe
11510 72 45 78 28 70 46 69 6c 65 2d 3e 68 2c 20 78 2c  rEx(pFile->h, x,
11520 20 30 2c 20 46 49 4c 45 5f 42 45 47 49 4e 29 3b   0, FILE_BEGIN);
11530 0a 0a 20 20 69 66 28 21 62 52 65 74 29 7b 0a 20  ..  if(!bRet){. 
11540 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
11550 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
11560 72 72 6f 72 28 29 3b 0a 20 20 20 20 77 69 6e 4c  rror();.    winL
11570 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
11580 4f 45 52 52 5f 53 45 45 4b 2c 20 70 46 69 6c 65  OERR_SEEK, pFile
11590 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20  ->lastErrno,.   
115a0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
115b0 6e 53 65 65 6b 46 69 6c 65 22 2c 20 70 46 69 6c  nSeekFile", pFil
115c0 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 4f  e->zPath);.    O
115d0 53 54 52 41 43 45 28 28 22 53 45 45 4b 20 66 69  STRACE(("SEEK fi
115e0 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
115f0 5f 49 4f 45 52 52 5f 53 45 45 4b 5c 6e 22 2c 20  _IOERR_SEEK\n", 
11600 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20  pFile->h));.    
11610 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20  return 1;.  }.. 
11620 20 4f 53 54 52 41 43 45 28 28 22 53 45 45 4b 20   OSTRACE(("SEEK 
11630 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49  file=%p, rc=SQLI
11640 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d  TE_OK\n", pFile-
11650 3e 68 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 30  >h));.  return 0
11660 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 69 66 20  ;.#endif.}..#if 
11670 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
11680 53 49 5a 45 3e 30 0a 2f 2a 20 46 6f 72 77 61 72  SIZE>0./* Forwar
11690 64 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  d references to 
116a0 56 46 53 20 68 65 6c 70 65 72 20 6d 65 74 68 6f  VFS helper metho
116b0 64 73 20 75 73 65 64 20 66 6f 72 20 6d 65 6d 6f  ds used for memo
116c0 72 79 20 6d 61 70 70 65 64 20 66 69 6c 65 73 20  ry mapped files 
116d0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
116e0 6e 4d 61 70 66 69 6c 65 28 77 69 6e 46 69 6c 65  nMapfile(winFile
116f0 2a 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  *, sqlite3_int64
11700 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  );.static int wi
11710 6e 55 6e 6d 61 70 66 69 6c 65 28 77 69 6e 46 69  nUnmapfile(winFi
11720 6c 65 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a  le*);.#endif../*
11730 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65  .** Close a file
11740 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 72 65  ..**.** It is re
11750 70 6f 72 74 65 64 20 74 68 61 74 20 61 6e 20 61  ported that an a
11760 74 74 65 6d 70 74 20 74 6f 20 63 6c 6f 73 65 20  ttempt to close 
11770 61 20 68 61 6e 64 6c 65 20 6d 69 67 68 74 20 73  a handle might s
11780 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 66 61 69 6c  ometimes.** fail
11790 2e 20 20 54 68 69 73 20 69 73 20 61 20 76 65 72  .  This is a ver
117a0 79 20 75 6e 72 65 61 73 6f 6e 61 62 6c 65 20 72  y unreasonable r
117b0 65 73 75 6c 74 2c 20 62 75 74 20 57 69 6e 64 6f  esult, but Windo
117c0 77 73 20 69 73 20 6e 6f 74 6f 72 69 6f 75 73 0a  ws is notorious.
117d0 2a 2a 20 66 6f 72 20 62 65 69 6e 67 20 75 6e 72  ** for being unr
117e0 65 61 73 6f 6e 61 62 6c 65 20 73 6f 20 49 20 64  easonable so I d
117f0 6f 20 6e 6f 74 20 64 6f 75 62 74 20 74 68 61 74  o not doubt that
11800 20 69 74 20 6d 69 67 68 74 20 68 61 70 70 65 6e   it might happen
11810 2e 20 20 49 66 0a 2a 2a 20 74 68 65 20 63 6c 6f  .  If.** the clo
11820 73 65 20 66 61 69 6c 73 2c 20 77 65 20 70 61 75  se fails, we pau
11830 73 65 20 66 6f 72 20 31 30 30 20 6d 69 6c 6c 69  se for 100 milli
11840 73 65 63 6f 6e 64 73 20 61 6e 64 20 74 72 79 20  seconds and try 
11850 61 67 61 69 6e 2e 20 20 41 73 0a 2a 2a 20 6d 61  again.  As.** ma
11860 6e 79 20 61 73 20 4d 58 5f 43 4c 4f 53 45 5f 41  ny as MX_CLOSE_A
11870 54 54 45 4d 50 54 20 61 74 74 65 6d 70 74 73 20  TTEMPT attempts 
11880 74 6f 20 63 6c 6f 73 65 20 74 68 65 20 68 61 6e  to close the han
11890 64 6c 65 20 61 72 65 20 6d 61 64 65 20 62 65 66  dle are made bef
118a0 6f 72 65 0a 2a 2a 20 67 69 76 69 6e 67 20 75 70  ore.** giving up
118b0 20 61 6e 64 20 72 65 74 75 72 6e 69 6e 67 20 61   and returning a
118c0 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 23 64 65 66  n error..*/.#def
118d0 69 6e 65 20 4d 58 5f 43 4c 4f 53 45 5f 41 54 54  ine MX_CLOSE_ATT
118e0 45 4d 50 54 20 33 0a 73 74 61 74 69 63 20 69 6e  EMPT 3.static in
118f0 74 20 77 69 6e 43 6c 6f 73 65 28 73 71 6c 69 74  t winClose(sqlit
11900 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20  e3_file *id){.  
11910 69 6e 74 20 72 63 2c 20 63 6e 74 20 3d 20 30 3b  int rc, cnt = 0;
11920 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  .  winFile *pFil
11930 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64  e = (winFile*)id
11940 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 21  ;..  assert( id!
11950 3d 30 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  =0 );.#ifndef SQ
11960 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
11970 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 70  assert( pFile->p
11980 53 68 6d 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66  Shm==0 );.#endif
11990 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
119a0 2d 3e 68 21 3d 4e 55 4c 4c 20 26 26 20 70 46 69  ->h!=NULL && pFi
119b0 6c 65 2d 3e 68 21 3d 49 4e 56 41 4c 49 44 5f 48  le->h!=INVALID_H
119c0 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 20  ANDLE_VALUE );. 
119d0 20 4f 53 54 52 41 43 45 28 28 22 43 4c 4f 53 45   OSTRACE(("CLOSE
119e0 20 66 69 6c 65 3d 25 70 5c 6e 22 2c 20 70 46 69   file=%p\n", pFi
119f0 6c 65 2d 3e 68 29 29 3b 0a 0a 23 69 66 20 53 51  le->h));..#if SQ
11a00 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
11a10 5a 45 3e 30 0a 20 20 77 69 6e 55 6e 6d 61 70 66  ZE>0.  winUnmapf
11a20 69 6c 65 28 70 46 69 6c 65 29 3b 0a 23 65 6e 64  ile(pFile);.#end
11a30 69 66 0a 0a 20 20 64 6f 7b 0a 20 20 20 20 72 63  if..  do{.    rc
11a40 20 3d 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65   = osCloseHandle
11a50 28 70 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 20 20  (pFile->h);.    
11a60 2f 2a 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  /* SimulateIOErr
11a70 6f 72 28 20 72 63 3d 30 3b 20 63 6e 74 3d 4d 58  or( rc=0; cnt=MX
11a80 5f 43 4c 4f 53 45 5f 41 54 54 45 4d 50 54 3b 20  _CLOSE_ATTEMPT; 
11a90 29 3b 20 2a 2f 0a 20 20 7d 77 68 69 6c 65 28 20  ); */.  }while( 
11aa0 72 63 3d 3d 30 20 26 26 20 2b 2b 63 6e 74 20 3c  rc==0 && ++cnt <
11ab0 20 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d 50   MX_CLOSE_ATTEMP
11ac0 54 20 26 26 20 28 73 71 6c 69 74 65 33 5f 77 69  T && (sqlite3_wi
11ad0 6e 33 32 5f 73 6c 65 65 70 28 31 30 30 29 2c 20  n32_sleep(100), 
11ae0 31 29 20 29 3b 0a 23 69 66 20 53 51 4c 49 54 45  1) );.#if SQLITE
11af0 5f 4f 53 5f 57 49 4e 43 45 0a 23 64 65 66 69 6e  _OS_WINCE.#defin
11b00 65 20 57 49 4e 43 45 5f 44 45 4c 45 54 49 4f 4e  e WINCE_DELETION
11b10 5f 41 54 54 45 4d 50 54 53 20 33 0a 20 20 77 69  _ATTEMPTS 3.  wi
11b20 6e 63 65 44 65 73 74 72 6f 79 4c 6f 63 6b 28 70  nceDestroyLock(p
11b30 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 70 46 69  File);.  if( pFi
11b40 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f  le->zDeleteOnClo
11b50 73 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 63 6e  se ){.    int cn
11b60 74 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65  t = 0;.    while
11b70 28 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 44  (.           osD
11b80 65 6c 65 74 65 46 69 6c 65 57 28 70 46 69 6c 65  eleteFileW(pFile
11b90 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65  ->zDeleteOnClose
11ba0 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 26 26 20  )==0.        && 
11bb0 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75  osGetFileAttribu
11bc0 74 65 73 57 28 70 46 69 6c 65 2d 3e 7a 44 65 6c  tesW(pFile->zDel
11bd0 65 74 65 4f 6e 43 6c 6f 73 65 29 21 3d 30 78 66  eteOnClose)!=0xf
11be0 66 66 66 66 66 66 66 20 0a 20 20 20 20 20 20 20  fffffff .       
11bf0 20 26 26 20 63 6e 74 2b 2b 20 3c 20 57 49 4e 43   && cnt++ < WINC
11c00 45 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d  E_DELETION_ATTEM
11c10 50 54 53 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  PTS.    ){.     
11c20 20 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f    sqlite3_win32_
11c30 73 6c 65 65 70 28 31 30 30 29 3b 20 20 2f 2a 20  sleep(100);  /* 
11c40 57 61 69 74 20 61 20 6c 69 74 74 6c 65 20 62 65  Wait a little be
11c50 66 6f 72 65 20 74 72 79 69 6e 67 20 61 67 61 69  fore trying agai
11c60 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 73  n */.    }.    s
11c70 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46 69 6c  qlite3_free(pFil
11c80 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73  e->zDeleteOnClos
11c90 65 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  e);.  }.#endif. 
11ca0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 70   if( rc ){.    p
11cb0 46 69 6c 65 2d 3e 68 20 3d 20 4e 55 4c 4c 3b 0a  File->h = NULL;.
11cc0 20 20 7d 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65    }.  OpenCounte
11cd0 72 28 2d 31 29 3b 0a 20 20 4f 53 54 52 41 43 45  r(-1);.  OSTRACE
11ce0 28 28 22 43 4c 4f 53 45 20 66 69 6c 65 3d 25 70  (("CLOSE file=%p
11cf0 2c 20 72 63 3d 25 73 5c 6e 22 2c 20 70 46 69 6c  , rc=%s\n", pFil
11d00 65 2d 3e 68 2c 20 72 63 20 3f 20 22 6f 6b 22 20  e->h, rc ? "ok" 
11d10 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20  : "failed"));.  
11d20 72 65 74 75 72 6e 20 72 63 20 3f 20 53 51 4c 49  return rc ? SQLI
11d30 54 45 5f 4f 4b 0a 20 20 20 20 20 20 20 20 20 20  TE_OK.          
11d40 20 20 3a 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28    : winLogError(
11d50 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f  SQLITE_IOERR_CLO
11d60 53 45 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72  SE, osGetLastErr
11d70 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20  or(),.          
11d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d90 22 77 69 6e 43 6c 6f 73 65 22 2c 20 70 46 69 6c  "winClose", pFil
11da0 65 2d 3e 7a 50 61 74 68 29 3b 0a 7d 0a 0a 2f 2a  e->zPath);.}../*
11db0 0a 2a 2a 20 52 65 61 64 20 64 61 74 61 20 66 72  .** Read data fr
11dc0 6f 6d 20 61 20 66 69 6c 65 20 69 6e 74 6f 20 61  om a file into a
11dd0 20 62 75 66 66 65 72 2e 20 20 52 65 74 75 72 6e   buffer.  Return
11de0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 61 6c   SQLITE_OK if al
11df0 6c 0a 2a 2a 20 62 79 74 65 73 20 77 65 72 65 20  l.** bytes were 
11e00 72 65 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c  read successfull
11e10 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4f 45  y and SQLITE_IOE
11e20 52 52 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67  RR if anything g
11e30 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 0a 2a 2f  oes.** wrong..*/
11e40 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 52  .static int winR
11e50 65 61 64 28 0a 20 20 73 71 6c 69 74 65 33 5f 66  ead(.  sqlite3_f
11e60 69 6c 65 20 2a 69 64 2c 20 20 20 20 20 20 20 20  ile *id,        
11e70 20 20 2f 2a 20 46 69 6c 65 20 74 6f 20 72 65 61    /* File to rea
11e80 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 76 6f 69 64  d from */.  void
11e90 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20 20   *pBuf,         
11ea0 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
11eb0 63 6f 6e 74 65 6e 74 20 69 6e 74 6f 20 74 68 69  content into thi
11ec0 73 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e  s buffer */.  in
11ed0 74 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20 20  t amt,          
11ee0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
11ef0 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 72  er of bytes to r
11f00 65 61 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ead */.  sqlite3
11f10 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 20 20 20  _int64 offset   
11f20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 72 65 61      /* Begin rea
11f30 64 69 6e 67 20 61 74 20 74 68 69 73 20 6f 66 66  ding at this off
11f40 73 65 74 20 2a 2f 0a 29 7b 0a 23 69 66 20 21 53  set */.){.#if !S
11f50 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20  QLITE_OS_WINCE. 
11f60 20 4f 56 45 52 4c 41 50 50 45 44 20 6f 76 65 72   OVERLAPPED over
11f70 6c 61 70 70 65 64 3b 20 20 20 20 20 20 20 20 20  lapped;         
11f80 20 2f 2a 20 54 68 65 20 6f 66 66 73 65 74 20 66   /* The offset f
11f90 6f 72 20 52 65 61 64 46 69 6c 65 2e 20 2a 2f 0a  or ReadFile. */.
11fa0 23 65 6e 64 69 66 0a 20 20 77 69 6e 46 69 6c 65  #endif.  winFile
11fb0 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69   *pFile = (winFi
11fc0 6c 65 2a 29 69 64 3b 20 20 2f 2a 20 66 69 6c 65  le*)id;  /* file
11fd0 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 44 57 4f   handle */.  DWO
11fe0 52 44 20 6e 52 65 61 64 3b 20 20 20 20 20 20 20  RD nRead;       
11ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12000 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
12010 61 63 74 75 61 6c 6c 79 20 72 65 61 64 20 66 72  actually read fr
12020 6f 6d 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  om file */.  int
12030 20 6e 52 65 74 72 79 20 3d 20 30 3b 20 20 20 20   nRetry = 0;    
12040 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12050 4e 75 6d 62 65 72 20 6f 66 20 72 65 74 72 79 73  Number of retrys
12060 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69   */..  assert( i
12070 64 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  d!=0 );.  assert
12080 28 20 61 6d 74 3e 30 20 29 3b 0a 20 20 61 73 73  ( amt>0 );.  ass
12090 65 72 74 28 20 6f 66 66 73 65 74 3e 3d 30 20 29  ert( offset>=0 )
120a0 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
120b0 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54  ror(return SQLIT
120c0 45 5f 49 4f 45 52 52 5f 52 45 41 44 29 3b 0a 20  E_IOERR_READ);. 
120d0 20 4f 53 54 52 41 43 45 28 28 22 52 45 41 44 20   OSTRACE(("READ 
120e0 66 69 6c 65 3d 25 70 2c 20 62 75 66 66 65 72 3d  file=%p, buffer=
120f0 25 70 2c 20 61 6d 6f 75 6e 74 3d 25 64 2c 20 6f  %p, amount=%d, o
12100 66 66 73 65 74 3d 25 6c 6c 64 2c 20 6c 6f 63 6b  ffset=%lld, lock
12110 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%d\n",.        
12120 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70 42 75     pFile->h, pBu
12130 66 2c 20 61 6d 74 2c 20 6f 66 66 73 65 74 2c 20  f, amt, offset, 
12140 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29  pFile->locktype)
12150 29 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  );..#if SQLITE_M
12160 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20  AX_MMAP_SIZE>0. 
12170 20 2f 2a 20 44 65 61 6c 20 77 69 74 68 20 61 73   /* Deal with as
12180 20 6d 75 63 68 20 6f 66 20 74 68 69 73 20 72 65   much of this re
12190 61 64 20 72 65 71 75 65 73 74 20 61 73 20 70 6f  ad request as po
121a0 73 73 69 62 6c 65 20 62 79 20 74 72 61 6e 73 66  ssible by transf
121b0 65 72 69 6e 67 0a 20 20 2a 2a 20 64 61 74 61 20  ering.  ** data 
121c0 66 72 6f 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20  from the memory 
121d0 6d 61 70 70 69 6e 67 20 75 73 69 6e 67 20 6d 65  mapping using me
121e0 6d 63 70 79 28 29 2e 20 20 2a 2f 0a 20 20 69 66  mcpy().  */.  if
121f0 28 20 6f 66 66 73 65 74 3c 70 46 69 6c 65 2d 3e  ( offset<pFile->
12200 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20  mmapSize ){.    
12210 69 66 28 20 6f 66 66 73 65 74 2b 61 6d 74 20 3c  if( offset+amt <
12220 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a  = pFile->mmapSiz
12230 65 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  e ){.      memcp
12240 79 28 70 42 75 66 2c 20 26 28 28 75 38 20 2a 29  y(pBuf, &((u8 *)
12250 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69  (pFile->pMapRegi
12260 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20 61 6d  on))[offset], am
12270 74 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43  t);.      OSTRAC
12280 45 28 28 22 52 45 41 44 2d 4d 4d 41 50 20 66 69  E(("READ-MMAP fi
12290 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
122a0 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  _OK\n", pFile->h
122b0 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
122c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
122d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
122e0 20 6e 43 6f 70 79 20 3d 20 28 69 6e 74 29 28 70   nCopy = (int)(p
122f0 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 2d  File->mmapSize -
12300 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20   offset);.      
12310 6d 65 6d 63 70 79 28 70 42 75 66 2c 20 26 28 28  memcpy(pBuf, &((
12320 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61  u8 *)(pFile->pMa
12330 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74  pRegion))[offset
12340 5d 2c 20 6e 43 6f 70 79 29 3b 0a 20 20 20 20 20  ], nCopy);.     
12350 20 70 42 75 66 20 3d 20 26 28 28 75 38 20 2a 29   pBuf = &((u8 *)
12360 70 42 75 66 29 5b 6e 43 6f 70 79 5d 3b 0a 20 20  pBuf)[nCopy];.  
12370 20 20 20 20 61 6d 74 20 2d 3d 20 6e 43 6f 70 79      amt -= nCopy
12380 3b 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b  ;.      offset +
12390 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 7d 0a 20  = nCopy;.    }. 
123a0 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53   }.#endif..#if S
123b0 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20  QLITE_OS_WINCE. 
123c0 20 69 66 28 20 77 69 6e 53 65 65 6b 46 69 6c 65   if( winSeekFile
123d0 28 70 46 69 6c 65 2c 20 6f 66 66 73 65 74 29 20  (pFile, offset) 
123e0 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  ){.    OSTRACE((
123f0 22 52 45 41 44 20 66 69 6c 65 3d 25 70 2c 20 72  "READ file=%p, r
12400 63 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 5c 6e 22  c=SQLITE_FULL\n"
12410 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
12420 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
12430 46 55 4c 4c 3b 0a 20 20 7d 0a 20 20 77 68 69 6c  FULL;.  }.  whil
12440 65 28 20 21 6f 73 52 65 61 64 46 69 6c 65 28 70  e( !osReadFile(p
12450 46 69 6c 65 2d 3e 68 2c 20 70 42 75 66 2c 20 61  File->h, pBuf, a
12460 6d 74 2c 20 26 6e 52 65 61 64 2c 20 30 29 20 29  mt, &nRead, 0) )
12470 7b 0a 23 65 6c 73 65 0a 20 20 6d 65 6d 73 65 74  {.#else.  memset
12480 28 26 6f 76 65 72 6c 61 70 70 65 64 2c 20 30 2c  (&overlapped, 0,
12490 20 73 69 7a 65 6f 66 28 4f 56 45 52 4c 41 50 50   sizeof(OVERLAPP
124a0 45 44 29 29 3b 0a 20 20 6f 76 65 72 6c 61 70 70  ED));.  overlapp
124b0 65 64 2e 4f 66 66 73 65 74 20 3d 20 28 4c 4f 4e  ed.Offset = (LON
124c0 47 29 28 6f 66 66 73 65 74 20 26 20 30 78 66 66  G)(offset & 0xff
124d0 66 66 66 66 66 66 29 3b 0a 20 20 6f 76 65 72 6c  ffffff);.  overl
124e0 61 70 70 65 64 2e 4f 66 66 73 65 74 48 69 67 68  apped.OffsetHigh
124f0 20 3d 20 28 4c 4f 4e 47 29 28 28 6f 66 66 73 65   = (LONG)((offse
12500 74 3e 3e 33 32 29 20 26 20 30 78 37 66 66 66 66  t>>32) & 0x7ffff
12510 66 66 66 29 3b 0a 20 20 77 68 69 6c 65 28 20 21  fff);.  while( !
12520 6f 73 52 65 61 64 46 69 6c 65 28 70 46 69 6c 65  osReadFile(pFile
12530 2d 3e 68 2c 20 70 42 75 66 2c 20 61 6d 74 2c 20  ->h, pBuf, amt, 
12540 26 6e 52 65 61 64 2c 20 26 6f 76 65 72 6c 61 70  &nRead, &overlap
12550 70 65 64 29 20 26 26 0a 20 20 20 20 20 20 20 20  ped) &&.        
12560 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
12570 29 21 3d 45 52 52 4f 52 5f 48 41 4e 44 4c 45 5f  )!=ERROR_HANDLE_
12580 45 4f 46 20 29 7b 0a 23 65 6e 64 69 66 0a 20 20  EOF ){.#endif.  
12590 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e    DWORD lastErrn
125a0 6f 3b 0a 20 20 20 20 69 66 28 20 77 69 6e 52 65  o;.    if( winRe
125b0 74 72 79 49 6f 65 72 72 28 26 6e 52 65 74 72 79  tryIoerr(&nRetry
125c0 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 20  , &lastErrno) ) 
125d0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 46  continue;.    pF
125e0 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
125f0 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20   lastErrno;.    
12600 4f 53 54 52 41 43 45 28 28 22 52 45 41 44 20 66  OSTRACE(("READ f
12610 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  ile=%p, rc=SQLIT
12620 45 5f 49 4f 45 52 52 5f 52 45 41 44 5c 6e 22 2c  E_IOERR_READ\n",
12630 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20   pFile->h));.   
12640 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72   return winLogEr
12650 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
12660 5f 52 45 41 44 2c 20 70 46 69 6c 65 2d 3e 6c 61  _READ, pFile->la
12670 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
12680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12690 22 77 69 6e 52 65 61 64 22 2c 20 70 46 69 6c 65  "winRead", pFile
126a0 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 20 20  ->zPath);.  }.  
126b0 77 69 6e 4c 6f 67 49 6f 65 72 72 28 6e 52 65 74  winLogIoerr(nRet
126c0 72 79 29 3b 0a 20 20 69 66 28 20 6e 52 65 61 64  ry);.  if( nRead
126d0 3c 28 44 57 4f 52 44 29 61 6d 74 20 29 7b 0a 20  <(DWORD)amt ){. 
126e0 20 20 20 2f 2a 20 55 6e 72 65 61 64 20 70 61 72     /* Unread par
126f0 74 73 20 6f 66 20 74 68 65 20 62 75 66 66 65 72  ts of the buffer
12700 20 6d 75 73 74 20 62 65 20 7a 65 72 6f 2d 66 69   must be zero-fi
12710 6c 6c 65 64 20 2a 2f 0a 20 20 20 20 6d 65 6d 73  lled */.    mems
12720 65 74 28 26 28 28 63 68 61 72 2a 29 70 42 75 66  et(&((char*)pBuf
12730 29 5b 6e 52 65 61 64 5d 2c 20 30 2c 20 61 6d 74  )[nRead], 0, amt
12740 2d 6e 52 65 61 64 29 3b 0a 20 20 20 20 4f 53 54  -nRead);.    OST
12750 52 41 43 45 28 28 22 52 45 41 44 20 66 69 6c 65  RACE(("READ file
12760 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49  =%p, rc=SQLITE_I
12770 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 5c  OERR_SHORT_READ\
12780 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  n", pFile->h));.
12790 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
127a0 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
127b0 41 44 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41  AD;.  }..  OSTRA
127c0 43 45 28 28 22 52 45 41 44 20 66 69 6c 65 3d 25  CE(("READ file=%
127d0 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c  p, rc=SQLITE_OK\
127e0 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  n", pFile->h));.
127f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
12800 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  OK;.}../*.** Wri
12810 74 65 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62  te data from a b
12820 75 66 66 65 72 20 69 6e 74 6f 20 61 20 66 69 6c  uffer into a fil
12830 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  e.  Return SQLIT
12840 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 0a  E_OK on success.
12850 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72  ** or some other
12860 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 6e 20 66   error code on f
12870 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69  ailure..*/.stati
12880 63 20 69 6e 74 20 77 69 6e 57 72 69 74 65 28 0a  c int winWrite(.
12890 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
128a0 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  id,             
128b0 20 20 2f 2a 20 46 69 6c 65 20 74 6f 20 77 72 69    /* File to wri
128c0 74 65 20 69 6e 74 6f 20 2a 2f 0a 20 20 63 6f 6e  te into */.  con
128d0 73 74 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20  st void *pBuf,  
128e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
128f0 54 68 65 20 62 79 74 65 73 20 74 6f 20 62 65 20  The bytes to be 
12900 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 69 6e 74  written */.  int
12910 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20   amt,           
12920 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12930 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
12940 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20 73 71  to write */.  sq
12950 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73  lite3_int64 offs
12960 65 74 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  et            /*
12970 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 74 68 65   Offset into the
12980 20 66 69 6c 65 20 74 6f 20 62 65 67 69 6e 20 77   file to begin w
12990 72 69 74 69 6e 67 20 61 74 20 2a 2f 0a 29 7b 0a  riting at */.){.
129a0 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 20 20 20    int rc = 0;   
129b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
129c0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 65 72 72    /* True if err
129d0 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65 64 2c  or has occurred,
129e0 20 65 6c 73 65 20 66 61 6c 73 65 20 2a 2f 0a 20   else false */. 
129f0 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20   winFile *pFile 
12a00 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 20  = (winFile*)id; 
12a10 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65 20   /* File handle 
12a20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 74 72 79 20  */.  int nRetry 
12a30 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
12a40 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
12a50 66 20 72 65 74 72 69 65 73 20 2a 2f 0a 0a 20 20  f retries */..  
12a60 61 73 73 65 72 74 28 20 61 6d 74 3e 30 20 29 3b  assert( amt>0 );
12a70 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
12a80 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f   );.  SimulateIO
12a90 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c  Error(return SQL
12aa0 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 29  ITE_IOERR_WRITE)
12ab0 3b 0a 20 20 53 69 6d 75 6c 61 74 65 44 69 73 6b  ;.  SimulateDisk
12ac0 66 75 6c 6c 45 72 72 6f 72 28 72 65 74 75 72 6e  fullError(return
12ad0 20 53 51 4c 49 54 45 5f 46 55 4c 4c 29 3b 0a 0a   SQLITE_FULL);..
12ae0 20 20 4f 53 54 52 41 43 45 28 28 22 57 52 49 54    OSTRACE(("WRIT
12af0 45 20 66 69 6c 65 3d 25 70 2c 20 62 75 66 66 65  E file=%p, buffe
12b00 72 3d 25 70 2c 20 61 6d 6f 75 6e 74 3d 25 64 2c  r=%p, amount=%d,
12b10 20 6f 66 66 73 65 74 3d 25 6c 6c 64 2c 20 6c 6f   offset=%lld, lo
12b20 63 6b 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  ck=%d\n",.      
12b30 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70       pFile->h, p
12b40 42 75 66 2c 20 61 6d 74 2c 20 6f 66 66 73 65 74  Buf, amt, offset
12b50 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  , pFile->locktyp
12b60 65 29 29 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45  e));..#if SQLITE
12b70 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
12b80 0a 20 20 2f 2a 20 44 65 61 6c 20 77 69 74 68 20  .  /* Deal with 
12b90 61 73 20 6d 75 63 68 20 6f 66 20 74 68 69 73 20  as much of this 
12ba0 77 72 69 74 65 20 72 65 71 75 65 73 74 20 61 73  write request as
12bb0 20 70 6f 73 73 69 62 6c 65 20 62 79 20 74 72 61   possible by tra
12bc0 6e 73 66 65 72 69 6e 67 0a 20 20 2a 2a 20 64 61  nsfering.  ** da
12bd0 74 61 20 66 72 6f 6d 20 74 68 65 20 6d 65 6d 6f  ta from the memo
12be0 72 79 20 6d 61 70 70 69 6e 67 20 75 73 69 6e 67  ry mapping using
12bf0 20 6d 65 6d 63 70 79 28 29 2e 20 20 2a 2f 0a 20   memcpy().  */. 
12c00 20 69 66 28 20 6f 66 66 73 65 74 3c 70 46 69 6c   if( offset<pFil
12c10 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20  e->mmapSize ){. 
12c20 20 20 20 69 66 28 20 6f 66 66 73 65 74 2b 61 6d     if( offset+am
12c30 74 20 3c 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70  t <= pFile->mmap
12c40 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 6d 65  Size ){.      me
12c50 6d 63 70 79 28 26 28 28 75 38 20 2a 29 28 70 46  mcpy(&((u8 *)(pF
12c60 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29  ile->pMapRegion)
12c70 29 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75 66 2c  )[offset], pBuf,
12c80 20 61 6d 74 29 3b 0a 20 20 20 20 20 20 4f 53 54   amt);.      OST
12c90 52 41 43 45 28 28 22 57 52 49 54 45 2d 4d 4d 41  RACE(("WRITE-MMA
12ca0 50 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51  P file=%p, rc=SQ
12cb0 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c  LITE_OK\n", pFil
12cc0 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65  e->h));.      re
12cd0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
12ce0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12cf0 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20 28 69 6e   int nCopy = (in
12d00 74 29 28 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69  t)(pFile->mmapSi
12d10 7a 65 20 2d 20 6f 66 66 73 65 74 29 3b 0a 20 20  ze - offset);.  
12d20 20 20 20 20 6d 65 6d 63 70 79 28 26 28 28 75 38      memcpy(&((u8
12d30 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52   *)(pFile->pMapR
12d40 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c  egion))[offset],
12d50 20 70 42 75 66 2c 20 6e 43 6f 70 79 29 3b 0a 20   pBuf, nCopy);. 
12d60 20 20 20 20 20 70 42 75 66 20 3d 20 26 28 28 75       pBuf = &((u
12d70 38 20 2a 29 70 42 75 66 29 5b 6e 43 6f 70 79 5d  8 *)pBuf)[nCopy]
12d80 3b 0a 20 20 20 20 20 20 61 6d 74 20 2d 3d 20 6e  ;.      amt -= n
12d90 43 6f 70 79 3b 0a 20 20 20 20 20 20 6f 66 66 73  Copy;.      offs
12da0 65 74 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20 20  et += nCopy;.   
12db0 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23   }.  }.#endif..#
12dc0 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
12dd0 43 45 0a 20 20 72 63 20 3d 20 77 69 6e 53 65 65  CE.  rc = winSee
12de0 6b 46 69 6c 65 28 70 46 69 6c 65 2c 20 6f 66 66  kFile(pFile, off
12df0 73 65 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  set);.  if( rc==
12e00 30 20 29 7b 0a 23 65 6c 73 65 0a 20 20 7b 0a 23  0 ){.#else.  {.#
12e10 65 6e 64 69 66 0a 23 69 66 20 21 53 51 4c 49 54  endif.#if !SQLIT
12e20 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20 4f  E_OS_WINCE.    O
12e30 56 45 52 4c 41 50 50 45 44 20 6f 76 65 72 6c 61  VERLAPPED overla
12e40 70 70 65 64 3b 20 20 20 20 20 20 20 20 2f 2a 20  pped;        /* 
12e50 54 68 65 20 6f 66 66 73 65 74 20 66 6f 72 20 57  The offset for W
12e60 72 69 74 65 46 69 6c 65 2e 20 2a 2f 0a 23 65 6e  riteFile. */.#en
12e70 64 69 66 0a 20 20 20 20 75 38 20 2a 61 52 65 6d  dif.    u8 *aRem
12e80 20 3d 20 28 75 38 20 2a 29 70 42 75 66 3b 20 20   = (u8 *)pBuf;  
12e90 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20 79 65        /* Data ye
12ea0 74 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  t to be written 
12eb0 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 52 65 6d 20  */.    int nRem 
12ec0 3d 20 61 6d 74 3b 20 20 20 20 20 20 20 20 20 20  = amt;          
12ed0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
12ee0 66 20 62 79 74 65 73 20 79 65 74 20 74 6f 20 62  f bytes yet to b
12ef0 65 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 20  e written */.   
12f00 20 44 57 4f 52 44 20 6e 57 72 69 74 65 3b 20 20   DWORD nWrite;  
12f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12f20 2a 20 42 79 74 65 73 20 77 72 69 74 74 65 6e 20  * Bytes written 
12f30 62 79 20 65 61 63 68 20 57 72 69 74 65 46 69 6c  by each WriteFil
12f40 65 28 29 20 63 61 6c 6c 20 2a 2f 0a 20 20 20 20  e() call */.    
12f50 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 20  DWORD lastErrno 
12f60 3d 20 4e 4f 5f 45 52 52 4f 52 3b 20 20 20 2f 2a  = NO_ERROR;   /*
12f70 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   Value returned 
12f80 62 79 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28  by GetLastError(
12f90 29 20 2a 2f 0a 0a 23 69 66 20 21 53 51 4c 49 54  ) */..#if !SQLIT
12fa0 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20 6d  E_OS_WINCE.    m
12fb0 65 6d 73 65 74 28 26 6f 76 65 72 6c 61 70 70 65  emset(&overlappe
12fc0 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4f 56 45  d, 0, sizeof(OVE
12fd0 52 4c 41 50 50 45 44 29 29 3b 0a 20 20 20 20 6f  RLAPPED));.    o
12fe0 76 65 72 6c 61 70 70 65 64 2e 4f 66 66 73 65 74  verlapped.Offset
12ff0 20 3d 20 28 4c 4f 4e 47 29 28 6f 66 66 73 65 74   = (LONG)(offset
13000 20 26 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a   & 0xffffffff);.
13010 20 20 20 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f      overlapped.O
13020 66 66 73 65 74 48 69 67 68 20 3d 20 28 4c 4f 4e  ffsetHigh = (LON
13030 47 29 28 28 6f 66 66 73 65 74 3e 3e 33 32 29 20  G)((offset>>32) 
13040 26 20 30 78 37 66 66 66 66 66 66 66 29 3b 0a 23  & 0x7fffffff);.#
13050 65 6e 64 69 66 0a 0a 20 20 20 20 77 68 69 6c 65  endif..    while
13060 28 20 6e 52 65 6d 3e 30 20 29 7b 0a 23 69 66 20  ( nRem>0 ){.#if 
13070 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
13080 20 20 20 20 20 20 69 66 28 20 21 6f 73 57 72 69        if( !osWri
13090 74 65 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c  teFile(pFile->h,
130a0 20 61 52 65 6d 2c 20 6e 52 65 6d 2c 20 26 6e 57   aRem, nRem, &nW
130b0 72 69 74 65 2c 20 30 29 20 29 7b 0a 23 65 6c 73  rite, 0) ){.#els
130c0 65 0a 20 20 20 20 20 20 69 66 28 20 21 6f 73 57  e.      if( !osW
130d0 72 69 74 65 46 69 6c 65 28 70 46 69 6c 65 2d 3e  riteFile(pFile->
130e0 68 2c 20 61 52 65 6d 2c 20 6e 52 65 6d 2c 20 26  h, aRem, nRem, &
130f0 6e 57 72 69 74 65 2c 20 26 6f 76 65 72 6c 61 70  nWrite, &overlap
13100 70 65 64 29 20 29 7b 0a 23 65 6e 64 69 66 0a 20  ped) ){.#endif. 
13110 20 20 20 20 20 20 20 69 66 28 20 77 69 6e 52 65         if( winRe
13120 74 72 79 49 6f 65 72 72 28 26 6e 52 65 74 72 79  tryIoerr(&nRetry
13130 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 20  , &lastErrno) ) 
13140 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
13150 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
13160 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
13170 57 72 69 74 65 3d 3d 30 20 7c 7c 20 6e 57 72 69  Write==0 || nWri
13180 74 65 3c 3d 28 44 57 4f 52 44 29 6e 52 65 6d 20  te<=(DWORD)nRem 
13190 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 57 72  );.      if( nWr
131a0 69 74 65 3d 3d 30 20 7c 7c 20 6e 57 72 69 74 65  ite==0 || nWrite
131b0 3e 28 44 57 4f 52 44 29 6e 52 65 6d 20 29 7b 0a  >(DWORD)nRem ){.
131c0 20 20 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e          lastErrn
131d0 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
131e0 6f 72 28 29 3b 0a 20 20 20 20 20 20 20 20 62 72  or();.        br
131f0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66  eak;.      }.#if
13200 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43   !SQLITE_OS_WINC
13210 45 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b  E.      offset +
13220 3d 20 6e 57 72 69 74 65 3b 0a 20 20 20 20 20 20  = nWrite;.      
13230 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66 66 73 65  overlapped.Offse
13240 74 20 3d 20 28 4c 4f 4e 47 29 28 6f 66 66 73 65  t = (LONG)(offse
13250 74 20 26 20 30 78 66 66 66 66 66 66 66 66 29 3b  t & 0xffffffff);
13260 0a 20 20 20 20 20 20 6f 76 65 72 6c 61 70 70 65  .      overlappe
13270 64 2e 4f 66 66 73 65 74 48 69 67 68 20 3d 20 28  d.OffsetHigh = (
13280 4c 4f 4e 47 29 28 28 6f 66 66 73 65 74 3e 3e 33  LONG)((offset>>3
13290 32 29 20 26 20 30 78 37 66 66 66 66 66 66 66 29  2) & 0x7fffffff)
132a0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 61  ;.#endif.      a
132b0 52 65 6d 20 2b 3d 20 6e 57 72 69 74 65 3b 0a 20  Rem += nWrite;. 
132c0 20 20 20 20 20 6e 52 65 6d 20 2d 3d 20 6e 57 72       nRem -= nWr
132d0 69 74 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ite;.    }.    i
132e0 66 28 20 6e 52 65 6d 3e 30 20 29 7b 0a 20 20 20  f( nRem>0 ){.   
132f0 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
13300 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b  rno = lastErrno;
13310 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  .      rc = 1;. 
13320 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
13330 72 63 20 29 7b 0a 20 20 20 20 69 66 28 20 20 20  rc ){.    if(   
13340 28 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  ( pFile->lastErr
13350 6e 6f 3d 3d 45 52 52 4f 52 5f 48 41 4e 44 4c 45  no==ERROR_HANDLE
13360 5f 44 49 53 4b 5f 46 55 4c 4c 20 29 0a 20 20 20  _DISK_FULL ).   
13370 20 20 20 20 7c 7c 20 28 20 70 46 69 6c 65 2d 3e      || ( pFile->
13380 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52  lastErrno==ERROR
13390 5f 44 49 53 4b 5f 46 55 4c 4c 20 29 29 7b 0a 20  _DISK_FULL )){. 
133a0 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 57       OSTRACE(("W
133b0 52 49 54 45 20 66 69 6c 65 3d 25 70 2c 20 72 63  RITE file=%p, rc
133c0 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 5c 6e 22 2c  =SQLITE_FULL\n",
133d0 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20   pFile->h));.   
133e0 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67     return winLog
133f0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 46 55 4c  Error(SQLITE_FUL
13400 4c 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  L, pFile->lastEr
13410 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
13420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
13430 69 6e 57 72 69 74 65 31 22 2c 20 70 46 69 6c 65  inWrite1", pFile
13440 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a  ->zPath);.    }.
13450 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 57 52      OSTRACE(("WR
13460 49 54 45 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  ITE file=%p, rc=
13470 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49  SQLITE_IOERR_WRI
13480 54 45 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29  TE\n", pFile->h)
13490 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 77 69  );.    return wi
134a0 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
134b0 5f 49 4f 45 52 52 5f 57 52 49 54 45 2c 20 70 46  _IOERR_WRITE, pF
134c0 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a  ile->lastErrno,.
134d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
134e0 20 20 20 20 20 20 20 22 77 69 6e 57 72 69 74 65         "winWrite
134f0 32 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  2", pFile->zPath
13500 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
13510 77 69 6e 4c 6f 67 49 6f 65 72 72 28 6e 52 65 74  winLogIoerr(nRet
13520 72 79 29 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41  ry);.  }.  OSTRA
13530 43 45 28 28 22 57 52 49 54 45 20 66 69 6c 65 3d  CE(("WRITE file=
13540 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b  %p, rc=SQLITE_OK
13550 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  \n", pFile->h));
13560 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
13570 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72  _OK;.}../*.** Tr
13580 75 6e 63 61 74 65 20 61 6e 20 6f 70 65 6e 20 66  uncate an open f
13590 69 6c 65 20 74 6f 20 61 20 73 70 65 63 69 66 69  ile to a specifi
135a0 65 64 20 73 69 7a 65 0a 2a 2f 0a 73 74 61 74 69  ed size.*/.stati
135b0 63 20 69 6e 74 20 77 69 6e 54 72 75 6e 63 61 74  c int winTruncat
135c0 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
135d0 69 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  id, sqlite3_int6
135e0 34 20 6e 42 79 74 65 29 7b 0a 20 20 77 69 6e 46  4 nByte){.  winF
135f0 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69  ile *pFile = (wi
13600 6e 46 69 6c 65 2a 29 69 64 3b 20 20 2f 2a 20 46  nFile*)id;  /* F
13610 69 6c 65 20 68 61 6e 64 6c 65 20 6f 62 6a 65 63  ile handle objec
13620 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  t */.  int rc = 
13630 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
13640 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
13650 20 63 6f 64 65 20 66 6f 72 20 74 68 69 73 20 66   code for this f
13660 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 44 57 4f  unction */.  DWO
13670 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 0a 20  RD lastErrno;.. 
13680 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
13690 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
136a0 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54  ror(return SQLIT
136b0 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45  E_IOERR_TRUNCATE
136c0 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54  );.  OSTRACE(("T
136d0 52 55 4e 43 41 54 45 20 66 69 6c 65 3d 25 70 2c  RUNCATE file=%p,
136e0 20 73 69 7a 65 3d 25 6c 6c 64 2c 20 6c 6f 63 6b   size=%lld, lock
136f0 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%d\n",.        
13700 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 6e 42 79     pFile->h, nBy
13710 74 65 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  te, pFile->lockt
13720 79 70 65 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ype));..  /* If 
13730 74 68 65 20 75 73 65 72 20 68 61 73 20 63 6f 6e  the user has con
13740 66 69 67 75 72 65 64 20 61 20 63 68 75 6e 6b 2d  figured a chunk-
13750 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 66 69  size for this fi
13760 6c 65 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65  le, truncate the
13770 0a 20 20 2a 2a 20 66 69 6c 65 20 73 6f 20 74 68  .  ** file so th
13780 61 74 20 69 74 20 63 6f 6e 73 69 73 74 73 20 6f  at it consists o
13790 66 20 61 6e 20 69 6e 74 65 67 65 72 20 6e 75 6d  f an integer num
137a0 62 65 72 20 6f 66 20 63 68 75 6e 6b 73 20 28 69  ber of chunks (i
137b0 2e 65 2e 20 74 68 65 0a 20 20 2a 2a 20 61 63 74  .e. the.  ** act
137c0 75 61 6c 20 66 69 6c 65 20 73 69 7a 65 20 61 66  ual file size af
137d0 74 65 72 20 74 68 65 20 6f 70 65 72 61 74 69 6f  ter the operatio
137e0 6e 20 6d 61 79 20 62 65 20 6c 61 72 67 65 72 20  n may be larger 
137f0 74 68 61 6e 20 74 68 65 20 72 65 71 75 65 73 74  than the request
13800 65 64 0a 20 20 2a 2a 20 73 69 7a 65 29 2e 0a 20  ed.  ** size).. 
13810 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
13820 3e 73 7a 43 68 75 6e 6b 3e 30 20 29 7b 0a 20 20  >szChunk>0 ){.  
13830 20 20 6e 42 79 74 65 20 3d 20 28 28 6e 42 79 74    nByte = ((nByt
13840 65 20 2b 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75  e + pFile->szChu
13850 6e 6b 20 2d 20 31 29 2f 70 46 69 6c 65 2d 3e 73  nk - 1)/pFile->s
13860 7a 43 68 75 6e 6b 29 20 2a 20 70 46 69 6c 65 2d  zChunk) * pFile-
13870 3e 73 7a 43 68 75 6e 6b 3b 0a 20 20 7d 0a 0a 20  >szChunk;.  }.. 
13880 20 2f 2a 20 53 65 74 45 6e 64 4f 66 46 69 6c 65   /* SetEndOfFile
13890 28 29 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a  () returns non-z
138a0 65 72 6f 20 77 68 65 6e 20 73 75 63 63 65 73 73  ero when success
138b0 66 75 6c 2c 20 6f 72 20 7a 65 72 6f 20 77 68 65  ful, or zero whe
138c0 6e 20 69 74 20 66 61 69 6c 73 2e 20 2a 2f 0a 20  n it fails. */. 
138d0 20 69 66 28 20 77 69 6e 53 65 65 6b 46 69 6c 65   if( winSeekFile
138e0 28 70 46 69 6c 65 2c 20 6e 42 79 74 65 29 20 29  (pFile, nByte) )
138f0 7b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f  {.    rc = winLo
13900 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
13910 45 52 52 5f 54 52 55 4e 43 41 54 45 2c 20 70 46  ERR_TRUNCATE, pF
13920 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a  ile->lastErrno,.
13930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13940 20 20 20 20 20 22 77 69 6e 54 72 75 6e 63 61 74       "winTruncat
13950 65 31 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  e1", pFile->zPat
13960 68 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  h);.  }else if( 
13970 30 3d 3d 6f 73 53 65 74 45 6e 64 4f 66 46 69 6c  0==osSetEndOfFil
13980 65 28 70 46 69 6c 65 2d 3e 68 29 20 26 26 0a 20  e(pFile->h) &&. 
13990 20 20 20 20 20 20 20 20 20 20 20 28 28 6c 61 73             ((las
139a0 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
139b0 73 74 45 72 72 6f 72 28 29 29 21 3d 45 52 52 4f  stError())!=ERRO
139c0 52 5f 55 53 45 52 5f 4d 41 50 50 45 44 5f 46 49  R_USER_MAPPED_FI
139d0 4c 45 29 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  LE) ){.    pFile
139e0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61  ->lastErrno = la
139f0 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 72 63 20  stErrno;.    rc 
13a00 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  = winLogError(SQ
13a10 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43  LITE_IOERR_TRUNC
13a20 41 54 45 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74  ATE, pFile->last
13a30 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  Errno,.         
13a40 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
13a50 54 72 75 6e 63 61 74 65 32 22 2c 20 70 46 69 6c  Truncate2", pFil
13a60 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 0a  e->zPath);.  }..
13a70 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  #if SQLITE_MAX_M
13a80 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 2f 2a 20  MAP_SIZE>0.  /* 
13a90 49 66 20 74 68 65 20 66 69 6c 65 20 77 61 73 20  If the file was 
13aa0 74 72 75 6e 63 61 74 65 64 20 74 6f 20 61 20 73  truncated to a s
13ab0 69 7a 65 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e  ize smaller than
13ac0 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 0a 20   the currently. 
13ad0 20 2a 2a 20 6d 61 70 70 65 64 20 72 65 67 69 6f   ** mapped regio
13ae0 6e 2c 20 72 65 64 75 63 65 20 74 68 65 20 65 66  n, reduce the ef
13af0 66 65 63 74 69 76 65 20 6d 61 70 70 69 6e 67 20  fective mapping 
13b00 73 69 7a 65 20 61 73 20 77 65 6c 6c 2e 20 53 51  size as well. SQ
13b10 4c 69 74 65 20 77 69 6c 6c 0a 20 20 2a 2a 20 75  Lite will.  ** u
13b20 73 65 20 72 65 61 64 28 29 20 61 6e 64 20 77 72  se read() and wr
13b30 69 74 65 28 29 20 74 6f 20 61 63 63 65 73 73 20  ite() to access 
13b40 64 61 74 61 20 62 65 79 6f 6e 64 20 74 68 69 73  data beyond this
13b50 20 70 6f 69 6e 74 20 66 72 6f 6d 20 6e 6f 77 20   point from now 
13b60 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  on..  */.  if( p
13b70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e  File->pMapRegion
13b80 20 26 26 20 6e 42 79 74 65 3c 70 46 69 6c 65 2d   && nByte<pFile-
13b90 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20  >mmapSize ){.   
13ba0 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65   pFile->mmapSize
13bb0 20 3d 20 6e 42 79 74 65 3b 0a 20 20 7d 0a 23 65   = nByte;.  }.#e
13bc0 6e 64 69 66 0a 0a 20 20 4f 53 54 52 41 43 45 28  ndif..  OSTRACE(
13bd0 28 22 54 52 55 4e 43 41 54 45 20 66 69 6c 65 3d  ("TRUNCATE file=
13be0 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 20 70 46  %p, rc=%s\n", pF
13bf0 69 6c 65 2d 3e 68 2c 20 73 71 6c 69 74 65 33 45  ile->h, sqlite3E
13c00 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20  rrName(rc)));.  
13c10 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
13c20 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
13c30 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65  ./*.** Count the
13c40 20 6e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 73   number of fulls
13c50 79 6e 63 73 20 61 6e 64 20 6e 6f 72 6d 61 6c 20  yncs and normal 
13c60 73 79 6e 63 73 2e 20 20 54 68 69 73 20 69 73 20  syncs.  This is 
13c70 75 73 65 64 20 74 6f 20 74 65 73 74 0a 2a 2a 20  used to test.** 
13c80 74 68 61 74 20 73 79 6e 63 73 20 61 6e 64 20 66  that syncs and f
13c90 75 6c 6c 73 79 6e 63 73 20 61 72 65 20 6f 63 63  ullsyncs are occ
13ca0 75 72 69 6e 67 20 61 74 20 74 68 65 20 72 69 67  uring at the rig
13cb0 68 74 20 74 69 6d 65 73 2e 0a 2a 2f 0a 69 6e 74  ht times..*/.int
13cc0 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f   sqlite3_sync_co
13cd0 75 6e 74 20 3d 20 30 3b 0a 69 6e 74 20 73 71 6c  unt = 0;.int sql
13ce0 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f  ite3_fullsync_co
13cf0 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  unt = 0;.#endif.
13d00 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ./*.** Make sure
13d10 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 61   all writes to a
13d20 20 70 61 72 74 69 63 75 6c 61 72 20 66 69 6c 65   particular file
13d30 20 61 72 65 20 63 6f 6d 6d 69 74 74 65 64 20 74   are committed t
13d40 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69  o disk..*/.stati
13d50 63 20 69 6e 74 20 77 69 6e 53 79 6e 63 28 73 71  c int winSync(sq
13d60 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
13d70 69 6e 74 20 66 6c 61 67 73 29 7b 0a 23 69 66 6e  int flags){.#ifn
13d80 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  def SQLITE_NO_SY
13d90 4e 43 0a 20 20 2f 2a 0a 20 20 2a 2a 20 55 73 65  NC.  /*.  ** Use
13da0 64 20 6f 6e 6c 79 20 77 68 65 6e 20 53 51 4c 49  d only when SQLI
13db0 54 45 5f 4e 4f 5f 53 59 4e 43 20 69 73 20 6e 6f  TE_NO_SYNC is no
13dc0 74 20 64 65 66 69 6e 65 64 2e 0a 20 20 20 2a 2f  t defined..   */
13dd0 0a 20 20 42 4f 4f 4c 20 72 63 3b 0a 23 65 6e 64  .  BOOL rc;.#end
13de0 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  if.#if !defined(
13df0 4e 44 45 42 55 47 29 20 7c 7c 20 21 64 65 66 69  NDEBUG) || !defi
13e00 6e 65 64 28 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  ned(SQLITE_NO_SY
13e10 4e 43 29 20 7c 7c 20 5c 0a 20 20 20 20 28 64 65  NC) || \.    (de
13e20 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
13e30 54 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  T) && defined(SQ
13e40 4c 49 54 45 5f 44 45 42 55 47 29 29 0a 20 20 2f  LITE_DEBUG)).  /
13e50 2a 0a 20 20 2a 2a 20 55 73 65 64 20 77 68 65 6e  *.  ** Used when
13e60 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20   SQLITE_NO_SYNC 
13e70 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 20 61  is not defined a
13e80 6e 64 20 62 79 20 74 68 65 20 61 73 73 65 72 74  nd by the assert
13e90 28 29 20 61 6e 64 2f 6f 72 0a 20 20 2a 2a 20 4f  () and/or.  ** O
13ea0 53 54 52 41 43 45 28 29 20 6d 61 63 72 6f 73 2e  STRACE() macros.
13eb0 0a 20 20 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65  .   */.  winFile
13ec0 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69   *pFile = (winFi
13ed0 6c 65 2a 29 69 64 3b 0a 23 65 6c 73 65 0a 20 20  le*)id;.#else.  
13ee0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
13ef0 28 69 64 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  (id);.#endif..  
13f00 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
13f10 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74  .  /* Check that
13f20 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 53   one of SQLITE_S
13f30 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 46 55  YNC_NORMAL or FU
13f40 4c 4c 20 77 61 73 20 70 61 73 73 65 64 20 2a 2f  LL was passed */
13f50 0a 20 20 61 73 73 65 72 74 28 28 66 6c 61 67 73  .  assert((flags
13f60 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53  &0x0F)==SQLITE_S
13f70 59 4e 43 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20  YNC_NORMAL.     
13f80 20 7c 7c 20 28 66 6c 61 67 73 26 30 78 30 46 29   || (flags&0x0F)
13f90 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55  ==SQLITE_SYNC_FU
13fa0 4c 4c 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 55 6e  LL.  );..  /* Un
13fb0 69 78 20 63 61 6e 6e 6f 74 2c 20 62 75 74 20 73  ix cannot, but s
13fc0 6f 6d 65 20 73 79 73 74 65 6d 73 20 6d 61 79 20  ome systems may 
13fd0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55  return SQLITE_FU
13fe0 4c 4c 20 66 72 6f 6d 20 68 65 72 65 2e 20 54 68  LL from here. Th
13ff0 69 73 0a 20 20 2a 2a 20 6c 69 6e 65 20 69 73 20  is.  ** line is 
14000 74 6f 20 74 65 73 74 20 74 68 61 74 20 64 6f 69  to test that doi
14010 6e 67 20 73 6f 20 64 6f 65 73 20 6e 6f 74 20 63  ng so does not c
14020 61 75 73 65 20 61 6e 79 20 70 72 6f 62 6c 65 6d  ause any problem
14030 73 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61  s..  */.  Simula
14040 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28  teDiskfullError(
14050 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46   return SQLITE_F
14060 55 4c 4c 20 29 3b 0a 0a 20 20 4f 53 54 52 41 43  ULL );..  OSTRAC
14070 45 28 28 22 53 59 4e 43 20 66 69 6c 65 3d 25 70  E(("SYNC file=%p
14080 2c 20 66 6c 61 67 73 3d 25 78 2c 20 6c 6f 63 6b  , flags=%x, lock
14090 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%d\n",.        
140a0 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 66 6c 61     pFile->h, fla
140b0 67 73 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  gs, pFile->lockt
140c0 79 70 65 29 29 3b 0a 0a 23 69 66 6e 64 65 66 20  ype));..#ifndef 
140d0 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 55 4e  SQLITE_TEST.  UN
140e0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66  USED_PARAMETER(f
140f0 6c 61 67 73 29 3b 0a 23 65 6c 73 65 0a 20 20 69  lags);.#else.  i
14100 66 28 20 28 66 6c 61 67 73 26 30 78 30 46 29 3d  f( (flags&0x0F)=
14110 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c  =SQLITE_SYNC_FUL
14120 4c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  L ){.    sqlite3
14130 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 2b  _fullsync_count+
14140 2b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  +;.  }.  sqlite3
14150 5f 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 23  _sync_count++;.#
14160 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 77  endif..  /* If w
14170 65 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20  e compiled with 
14180 74 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  the SQLITE_NO_SY
14190 4e 43 20 66 6c 61 67 2c 20 74 68 65 6e 20 73 79  NC flag, then sy
141a0 6e 63 69 6e 67 20 69 73 20 61 0a 20 20 2a 2a 20  ncing is a.  ** 
141b0 6e 6f 2d 6f 70 0a 20 20 2a 2f 0a 23 69 66 64 65  no-op.  */.#ifde
141c0 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43  f SQLITE_NO_SYNC
141d0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 59 4e  .  OSTRACE(("SYN
141e0 43 2d 4e 4f 50 20 66 69 6c 65 3d 25 70 2c 20 72  C-NOP file=%p, r
141f0 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20  c=SQLITE_OK\n", 
14200 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 72 65  pFile->h));.  re
14210 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
14220 23 65 6c 73 65 0a 20 20 72 63 20 3d 20 6f 73 46  #else.  rc = osF
14230 6c 75 73 68 46 69 6c 65 42 75 66 66 65 72 73 28  lushFileBuffers(
14240 70 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 53 69 6d  pFile->h);.  Sim
14250 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63  ulateIOError( rc
14260 3d 46 41 4c 53 45 20 29 3b 0a 20 20 69 66 28 20  =FALSE );.  if( 
14270 72 63 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43  rc ){.    OSTRAC
14280 45 28 28 22 53 59 4e 43 20 66 69 6c 65 3d 25 70  E(("SYNC file=%p
14290 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e  , rc=SQLITE_OK\n
142a0 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20  ", pFile->h));. 
142b0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
142c0 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _OK;.  }else{.  
142d0 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
142e0 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
142f0 72 6f 72 28 29 3b 0a 20 20 20 20 4f 53 54 52 41  ror();.    OSTRA
14300 43 45 28 28 22 53 59 4e 43 20 66 69 6c 65 3d 25  CE(("SYNC file=%
14310 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45  p, rc=SQLITE_IOE
14320 52 52 5f 46 53 59 4e 43 5c 6e 22 2c 20 70 46 69  RR_FSYNC\n", pFi
14330 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65 74  le->h));.    ret
14340 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  urn winLogError(
14350 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 59  SQLITE_IOERR_FSY
14360 4e 43 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  NC, pFile->lastE
14370 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
14380 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
14390 6e 53 79 6e 63 22 2c 20 70 46 69 6c 65 2d 3e 7a  nSync", pFile->z
143a0 50 61 74 68 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  Path);.  }.#endi
143b0 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72  f.}../*.** Deter
143c0 6d 69 6e 65 20 74 68 65 20 63 75 72 72 65 6e 74  mine the current
143d0 20 73 69 7a 65 20 6f 66 20 61 20 66 69 6c 65 20   size of a file 
143e0 69 6e 20 62 79 74 65 73 0a 2a 2f 0a 73 74 61 74  in bytes.*/.stat
143f0 69 63 20 69 6e 74 20 77 69 6e 46 69 6c 65 53 69  ic int winFileSi
14400 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ze(sqlite3_file 
14410 2a 69 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74  *id, sqlite3_int
14420 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20 77 69  64 *pSize){.  wi
14430 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  nFile *pFile = (
14440 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69  winFile*)id;.  i
14450 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
14460 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64  K;..  assert( id
14470 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
14480 20 70 53 69 7a 65 21 3d 30 20 29 3b 0a 20 20 53   pSize!=0 );.  S
14490 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72  imulateIOError(r
144a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
144b0 52 52 5f 46 53 54 41 54 29 3b 0a 20 20 4f 53 54  RR_FSTAT);.  OST
144c0 52 41 43 45 28 28 22 53 49 5a 45 20 66 69 6c 65  RACE(("SIZE file
144d0 3d 25 70 2c 20 70 53 69 7a 65 3d 25 70 5c 6e 22  =%p, pSize=%p\n"
144e0 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 70 53 69 7a  , pFile->h, pSiz
144f0 65 29 29 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45  e));..#if SQLITE
14500 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 0a 20 20  _OS_WINRT.  {.  
14510 20 20 46 49 4c 45 5f 53 54 41 4e 44 41 52 44 5f    FILE_STANDARD_
14520 49 4e 46 4f 20 69 6e 66 6f 3b 0a 20 20 20 20 69  INFO info;.    i
14530 66 28 20 6f 73 47 65 74 46 69 6c 65 49 6e 66 6f  f( osGetFileInfo
14540 72 6d 61 74 69 6f 6e 42 79 48 61 6e 64 6c 65 45  rmationByHandleE
14550 78 28 70 46 69 6c 65 2d 3e 68 2c 20 46 69 6c 65  x(pFile->h, File
14560 53 74 61 6e 64 61 72 64 49 6e 66 6f 2c 0a 20 20  StandardInfo,.  
14570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14590 20 20 20 26 69 6e 66 6f 2c 20 73 69 7a 65 6f 66     &info, sizeof
145a0 28 69 6e 66 6f 29 29 20 29 7b 0a 20 20 20 20 20  (info)) ){.     
145b0 20 2a 70 53 69 7a 65 20 3d 20 69 6e 66 6f 2e 45   *pSize = info.E
145c0 6e 64 4f 66 46 69 6c 65 2e 51 75 61 64 50 61 72  ndOfFile.QuadPar
145d0 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  t;.    }else{.  
145e0 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
145f0 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
14600 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 72  Error();.      r
14610 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  c = winLogError(
14620 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54  SQLITE_IOERR_FST
14630 41 54 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  AT, pFile->lastE
14640 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
14650 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
14660 6e 46 69 6c 65 53 69 7a 65 22 2c 20 70 46 69 6c  nFileSize", pFil
14670 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d  e->zPath);.    }
14680 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 7b 0a 20  .  }.#else.  {. 
14690 20 20 20 44 57 4f 52 44 20 75 70 70 65 72 42 69     DWORD upperBi
146a0 74 73 3b 0a 20 20 20 20 44 57 4f 52 44 20 6c 6f  ts;.    DWORD lo
146b0 77 65 72 42 69 74 73 3b 0a 20 20 20 20 44 57 4f  werBits;.    DWO
146c0 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 0a 20  RD lastErrno;.. 
146d0 20 20 20 6c 6f 77 65 72 42 69 74 73 20 3d 20 6f     lowerBits = o
146e0 73 47 65 74 46 69 6c 65 53 69 7a 65 28 70 46 69  sGetFileSize(pFi
146f0 6c 65 2d 3e 68 2c 20 26 75 70 70 65 72 42 69 74  le->h, &upperBit
14700 73 29 3b 0a 20 20 20 20 2a 70 53 69 7a 65 20 3d  s);.    *pSize =
14710 20 28 28 28 73 71 6c 69 74 65 33 5f 69 6e 74 36   (((sqlite3_int6
14720 34 29 75 70 70 65 72 42 69 74 73 29 3c 3c 33 32  4)upperBits)<<32
14730 29 20 2b 20 6c 6f 77 65 72 42 69 74 73 3b 0a 20  ) + lowerBits;. 
14740 20 20 20 69 66 28 20 20 20 28 6c 6f 77 65 72 42     if(   (lowerB
14750 69 74 73 20 3d 3d 20 49 4e 56 41 4c 49 44 5f 46  its == INVALID_F
14760 49 4c 45 5f 53 49 5a 45 29 0a 20 20 20 20 20 20  ILE_SIZE).      
14770 20 26 26 20 28 28 6c 61 73 74 45 72 72 6e 6f 20   && ((lastErrno 
14780 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
14790 28 29 29 21 3d 4e 4f 5f 45 52 52 4f 52 29 20 29  ())!=NO_ERROR) )
147a0 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
147b0 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45  astErrno = lastE
147c0 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d  rrno;.      rc =
147d0 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
147e0 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 2c  ITE_IOERR_FSTAT,
147f0 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
14800 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
14810 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 46 69            "winFi
14820 6c 65 53 69 7a 65 22 2c 20 70 46 69 6c 65 2d 3e  leSize", pFile->
14830 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20  zPath);.    }.  
14840 7d 0a 23 65 6e 64 69 66 0a 20 20 4f 53 54 52 41  }.#endif.  OSTRA
14850 43 45 28 28 22 53 49 5a 45 20 66 69 6c 65 3d 25  CE(("SIZE file=%
14860 70 2c 20 70 53 69 7a 65 3d 25 70 2c 20 2a 70 53  p, pSize=%p, *pS
14870 69 7a 65 3d 25 6c 6c 64 2c 20 72 63 3d 25 73 5c  ize=%lld, rc=%s\
14880 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  n",.           p
14890 46 69 6c 65 2d 3e 68 2c 20 70 53 69 7a 65 2c 20  File->h, pSize, 
148a0 2a 70 53 69 7a 65 2c 20 73 71 6c 69 74 65 33 45  *pSize, sqlite3E
148b0 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20  rrName(rc)));.  
148c0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
148d0 0a 2a 2a 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49  .** LOCKFILE_FAI
148e0 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 20 69 73  L_IMMEDIATELY is
148f0 20 75 6e 64 65 66 69 6e 65 64 20 6f 6e 20 73 6f   undefined on so
14900 6d 65 20 57 69 6e 64 6f 77 73 20 73 79 73 74 65  me Windows syste
14910 6d 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4c  ms..*/.#ifndef L
14920 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d  OCKFILE_FAIL_IMM
14930 45 44 49 41 54 45 4c 59 0a 23 20 64 65 66 69 6e  EDIATELY.# defin
14940 65 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f  e LOCKFILE_FAIL_
14950 49 4d 4d 45 44 49 41 54 45 4c 59 20 31 0a 23 65  IMMEDIATELY 1.#e
14960 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 4c 4f  ndif..#ifndef LO
14970 43 4b 46 49 4c 45 5f 45 58 43 4c 55 53 49 56 45  CKFILE_EXCLUSIVE
14980 5f 4c 4f 43 4b 0a 23 20 64 65 66 69 6e 65 20 4c  _LOCK.# define L
14990 4f 43 4b 46 49 4c 45 5f 45 58 43 4c 55 53 49 56  OCKFILE_EXCLUSIV
149a0 45 5f 4c 4f 43 4b 20 32 0a 23 65 6e 64 69 66 0a  E_LOCK 2.#endif.
149b0 0a 2f 2a 0a 2a 2a 20 48 69 73 74 6f 72 69 63 61  ./*.** Historica
149c0 6c 6c 79 2c 20 53 51 4c 69 74 65 20 68 61 73 20  lly, SQLite has 
149d0 75 73 65 64 20 62 6f 74 68 20 74 68 65 20 4c 6f  used both the Lo
149e0 63 6b 46 69 6c 65 20 61 6e 64 20 4c 6f 63 6b 46  ckFile and LockF
149f0 69 6c 65 45 78 20 66 75 6e 63 74 69 6f 6e 73 2e  ileEx functions.
14a00 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20 4c 6f 63  .** When the Loc
14a10 6b 46 69 6c 65 20 66 75 6e 63 74 69 6f 6e 20 77  kFile function w
14a20 61 73 20 75 73 65 64 2c 20 69 74 20 77 61 73 20  as used, it was 
14a30 61 6c 77 61 79 73 20 65 78 70 65 63 74 65 64 20  always expected 
14a40 74 6f 20 66 61 69 6c 0a 2a 2a 20 69 6d 6d 65 64  to fail.** immed
14a50 69 61 74 65 6c 79 20 69 66 20 74 68 65 20 6c 6f  iately if the lo
14a60 63 6b 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20  ck could not be 
14a70 6f 62 74 61 69 6e 65 64 2e 20 20 41 6c 73 6f 2c  obtained.  Also,
14a80 20 69 74 20 61 6c 77 61 79 73 20 65 78 70 65 63   it always expec
14a90 74 65 64 20 74 6f 0a 2a 2a 20 6f 62 74 61 69 6e  ted to.** obtain
14aa0 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
14ab0 63 6b 2e 20 20 54 68 65 73 65 20 66 6c 61 67 73  ck.  These flags
14ac0 20 61 72 65 20 75 73 65 64 20 77 69 74 68 20 74   are used with t
14ad0 68 65 20 4c 6f 63 6b 46 69 6c 65 45 78 20 66 75  he LockFileEx fu
14ae0 6e 63 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 72 65  nction.** and re
14af0 66 6c 65 63 74 20 74 68 6f 73 65 20 65 78 70 65  flect those expe
14b00 63 74 61 74 69 6f 6e 73 3b 20 74 68 65 72 65 66  ctations; theref
14b10 6f 72 65 2c 20 74 68 65 79 20 73 68 6f 75 6c 64  ore, they should
14b20 20 6e 6f 74 20 62 65 20 63 68 61 6e 67 65 64 2e   not be changed.
14b30 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
14b40 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47  TE_LOCKFILE_FLAG
14b50 53 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54  S.# define SQLIT
14b60 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53  E_LOCKFILE_FLAGS
14b70 20 20 20 28 4c 4f 43 4b 46 49 4c 45 5f 46 41 49     (LOCKFILE_FAI
14b80 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 20 7c 20  L_IMMEDIATELY | 
14b90 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  \.              
14ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14bb0 20 20 20 20 4c 4f 43 4b 46 49 4c 45 5f 45 58 43      LOCKFILE_EXC
14bc0 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a 23 65 6e  LUSIVE_LOCK).#en
14bd0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 75 72 72 65  dif../*.** Curre
14be0 6e 74 6c 79 2c 20 53 51 4c 69 74 65 20 6e 65 76  ntly, SQLite nev
14bf0 65 72 20 63 61 6c 6c 73 20 74 68 65 20 4c 6f 63  er calls the Loc
14c00 6b 46 69 6c 65 45 78 20 66 75 6e 63 74 69 6f 6e  kFileEx function
14c10 20 77 69 74 68 6f 75 74 20 77 61 6e 74 69 6e 67   without wanting
14c20 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20   the.** call to 
14c30 66 61 69 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79  fail immediately
14c40 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 63 61 6e   if the lock can
14c50 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2e  not be obtained.
14c60 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
14c70 54 45 5f 4c 4f 43 4b 46 49 4c 45 45 58 5f 46 4c  TE_LOCKFILEEX_FL
14c80 41 47 53 0a 23 20 64 65 66 69 6e 65 20 53 51 4c  AGS.# define SQL
14c90 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 45 58 5f 46  ITE_LOCKFILEEX_F
14ca0 4c 41 47 53 20 28 4c 4f 43 4b 46 49 4c 45 5f 46  LAGS (LOCKFILE_F
14cb0 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 29  AIL_IMMEDIATELY)
14cc0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41  .#endif../*.** A
14cd0 63 71 75 69 72 65 20 61 20 72 65 61 64 65 72 20  cquire a reader 
14ce0 6c 6f 63 6b 2e 0a 2a 2a 20 44 69 66 66 65 72 65  lock..** Differe
14cf0 6e 74 20 41 50 49 20 72 6f 75 74 69 6e 65 73 20  nt API routines 
14d00 61 72 65 20 63 61 6c 6c 65 64 20 64 65 70 65 6e  are called depen
14d10 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20  ding on whether 
14d20 6f 72 20 6e 6f 74 20 74 68 69 73 0a 2a 2a 20 69  or not this.** i
14d30 73 20 57 69 6e 39 78 20 6f 72 20 57 69 6e 4e 54  s Win9x or WinNT
14d40 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
14d50 77 69 6e 47 65 74 52 65 61 64 4c 6f 63 6b 28 77  winGetReadLock(w
14d60 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a  inFile *pFile){.
14d70 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 4f 53 54    int res;.  OST
14d80 52 41 43 45 28 28 22 52 45 41 44 2d 4c 4f 43 4b  RACE(("READ-LOCK
14d90 20 66 69 6c 65 3d 25 70 2c 20 6c 6f 63 6b 3d 25   file=%p, lock=%
14da0 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  d\n", pFile->h, 
14db0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29  pFile->locktype)
14dc0 29 3b 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28  );.  if( osIsNT(
14dd0 29 20 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f  ) ){.#if SQLITE_
14de0 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20 2f 2a 0a  OS_WINCE.    /*.
14df0 20 20 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 69 6e      ** NOTE: Win
14e00 64 6f 77 73 20 43 45 20 69 73 20 68 61 6e 64 6c  dows CE is handl
14e10 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20 68  ed differently h
14e20 65 72 65 20 64 75 65 20 69 74 73 20 6c 61 63 6b  ere due its lack
14e30 20 6f 66 20 74 68 65 20 57 69 6e 33 32 0a 20 20   of the Win32.  
14e40 20 20 2a 2a 20 20 20 20 20 20 20 41 50 49 20 4c    **       API L
14e50 6f 63 6b 46 69 6c 65 45 78 2e 0a 20 20 20 20 2a  ockFileEx..    *
14e60 2f 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e 63  /.    res = winc
14e70 65 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65  eLockFile(&pFile
14e80 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53  ->h, SHARED_FIRS
14e90 54 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 23 65 6c  T, 0, 1, 0);.#el
14ea0 73 65 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e  se.    res = win
14eb0 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d  LockFile(&pFile-
14ec0 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46  >h, SQLITE_LOCKF
14ed0 49 4c 45 45 58 5f 46 4c 41 47 53 2c 20 53 48 41  ILEEX_FLAGS, SHA
14ee0 52 45 44 5f 46 49 52 53 54 2c 20 30 2c 0a 20 20  RED_FIRST, 0,.  
14ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f00 20 20 20 20 53 48 41 52 45 44 5f 53 49 5a 45 2c      SHARED_SIZE,
14f10 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a   0);.#endif.  }.
14f20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49  #ifdef SQLITE_WI
14f30 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65  N32_HAS_ANSI.  e
14f40 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6c 6b 3b  lse{.    int lk;
14f50 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e  .    sqlite3_ran
14f60 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 6c  domness(sizeof(l
14f70 6b 29 2c 20 26 6c 6b 29 3b 0a 20 20 20 20 70 46  k), &lk);.    pF
14f80 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42  ile->sharedLockB
14f90 79 74 65 20 3d 20 28 73 68 6f 72 74 29 28 28 6c  yte = (short)((l
14fa0 6b 20 26 20 30 78 37 66 66 66 66 66 66 66 29 25  k & 0x7fffffff)%
14fb0 28 53 48 41 52 45 44 5f 53 49 5a 45 20 2d 20 31  (SHARED_SIZE - 1
14fc0 29 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 77 69  ));.    res = wi
14fd0 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65  nLockFile(&pFile
14fe0 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  ->h, SQLITE_LOCK
14ff0 46 49 4c 45 5f 46 4c 41 47 53 2c 0a 20 20 20 20  FILE_FLAGS,.    
15000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15010 20 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b 70    SHARED_FIRST+p
15020 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b  File->sharedLock
15030 42 79 74 65 2c 20 30 2c 20 31 2c 20 30 29 3b 0a  Byte, 0, 1, 0);.
15040 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28    }.#endif.  if(
15050 20 72 65 73 20 3d 3d 20 30 20 29 7b 0a 20 20 20   res == 0 ){.   
15060 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
15070 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
15080 6f 72 28 29 3b 0a 20 20 20 20 2f 2a 20 4e 6f 20  or();.    /* No 
15090 6e 65 65 64 20 74 6f 20 6c 6f 67 20 61 20 66 61  need to log a fa
150a0 69 6c 75 72 65 20 74 6f 20 6c 6f 63 6b 20 2a 2f  ilure to lock */
150b0 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28  .  }.  OSTRACE((
150c0 22 52 45 41 44 2d 4c 4f 43 4b 20 66 69 6c 65 3d  "READ-LOCK file=
150d0 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 20 70 46  %p, rc=%s\n", pF
150e0 69 6c 65 2d 3e 68 2c 20 73 71 6c 69 74 65 33 45  ile->h, sqlite3E
150f0 72 72 4e 61 6d 65 28 72 65 73 29 29 29 3b 0a 20  rrName(res)));. 
15100 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a   return res;.}..
15110 2f 2a 0a 2a 2a 20 55 6e 64 6f 20 61 20 72 65 61  /*.** Undo a rea
15120 64 6c 6f 63 6b 0a 2a 2f 0a 73 74 61 74 69 63 20  dlock.*/.static 
15130 69 6e 74 20 77 69 6e 55 6e 6c 6f 63 6b 52 65 61  int winUnlockRea
15140 64 4c 6f 63 6b 28 77 69 6e 46 69 6c 65 20 2a 70  dLock(winFile *p
15150 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20 72 65 73  File){.  int res
15160 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72  ;.  DWORD lastEr
15170 72 6e 6f 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  rno;.  OSTRACE((
15180 22 52 45 41 44 2d 55 4e 4c 4f 43 4b 20 66 69 6c  "READ-UNLOCK fil
15190 65 3d 25 70 2c 20 6c 6f 63 6b 3d 25 64 5c 6e 22  e=%p, lock=%d\n"
151a0 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c  , pFile->h, pFil
151b0 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 20  e->locktype));. 
151c0 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b   if( osIsNT() ){
151d0 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e 55 6e  .    res = winUn
151e0 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d  lockFile(&pFile-
151f0 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54  >h, SHARED_FIRST
15200 2c 20 30 2c 20 53 48 41 52 45 44 5f 53 49 5a 45  , 0, SHARED_SIZE
15210 2c 20 30 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66  , 0);.  }.#ifdef
15220 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41   SQLITE_WIN32_HA
15230 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20  S_ANSI.  else{. 
15240 20 20 20 72 65 73 20 3d 20 77 69 6e 55 6e 6c 6f     res = winUnlo
15250 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68  ckFile(&pFile->h
15260 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b 70  , SHARED_FIRST+p
15270 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b  File->sharedLock
15280 42 79 74 65 2c 20 30 2c 20 31 2c 20 30 29 3b 0a  Byte, 0, 1, 0);.
15290 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28    }.#endif.  if(
152a0 20 72 65 73 3d 3d 30 20 26 26 20 28 28 6c 61 73   res==0 && ((las
152b0 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
152c0 73 74 45 72 72 6f 72 28 29 29 21 3d 45 52 52 4f  stError())!=ERRO
152d0 52 5f 4e 4f 54 5f 4c 4f 43 4b 45 44 29 20 29 7b  R_NOT_LOCKED) ){
152e0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74  .    pFile->last
152f0 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e  Errno = lastErrn
15300 6f 3b 0a 20 20 20 20 77 69 6e 4c 6f 67 45 72 72  o;.    winLogErr
15310 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
15320 55 4e 4c 4f 43 4b 2c 20 70 46 69 6c 65 2d 3e 6c  UNLOCK, pFile->l
15330 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
15340 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 55 6e            "winUn
15350 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 22 2c 20 70  lockReadLock", p
15360 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
15370 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52 45  }.  OSTRACE(("RE
15380 41 44 2d 55 4e 4c 4f 43 4b 20 66 69 6c 65 3d 25  AD-UNLOCK file=%
15390 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 20 70 46 69  p, rc=%s\n", pFi
153a0 6c 65 2d 3e 68 2c 20 73 71 6c 69 74 65 33 45 72  le->h, sqlite3Er
153b0 72 4e 61 6d 65 28 72 65 73 29 29 29 3b 0a 20 20  rName(res)));.  
153c0 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f  return res;.}../
153d0 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69  *.** Lock the fi
153e0 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b  le with the lock
153f0 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61   specified by pa
15400 72 61 6d 65 74 65 72 20 6c 6f 63 6b 74 79 70 65  rameter locktype
15410 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65   - one.** of the
15420 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
15430 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44  *     (1) SHARED
15440 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29  _LOCK.**     (2)
15450 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a   RESERVED_LOCK.*
15460 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e  *     (3) PENDIN
15470 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34  G_LOCK.**     (4
15480 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ) EXCLUSIVE_LOCK
15490 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73  .**.** Sometimes
154a0 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67   when requesting
154b0 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c   one lock state,
154c0 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b   additional lock
154d0 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69   states.** are i
154e0 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65  nserted in betwe
154f0 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67  en.  The locking
15500 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f   might fail on o
15510 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a  ne of the later.
15520 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c  ** transitions l
15530 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20  eaving the lock 
15540 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20  state different 
15550 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61  from what it sta
15560 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c  rted but.** stil
15570 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67  l short of its g
15580 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  oal.  The follow
15590 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20  ing chart shows 
155a0 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74  the allowed.** t
155b0 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74  ransitions and t
155c0 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65  he inserted inte
155d0 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a  rmediate states:
155e0 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b  .**.**    UNLOCK
155f0 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20  ED -> SHARED.** 
15600 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53     SHARED -> RES
15610 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  ERVED.**    SHAR
15620 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
15630 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
15640 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28     RESERVED -> (
15650 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
15660 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44  USIVE.**    PEND
15670 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  ING -> EXCLUSIVE
15680 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
15690 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e  ine will only in
156a0 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20  crease a lock.  
156b0 54 68 65 20 77 69 6e 55 6e 6c 6f 63 6b 28 29 20  The winUnlock() 
156c0 72 6f 75 74 69 6e 65 0a 2a 2a 20 65 72 61 73 65  routine.** erase
156d0 73 20 61 6c 6c 20 6c 6f 63 6b 73 20 61 74 20 6f  s all locks at o
156e0 6e 63 65 20 61 6e 64 20 72 65 74 75 72 6e 73 20  nce and returns 
156f0 75 73 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74  us immediately t
15700 6f 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  o locking level 
15710 30 2e 0a 2a 2a 20 49 74 20 69 73 20 6e 6f 74 20  0..** It is not 
15720 70 6f 73 73 69 62 6c 65 20 74 6f 20 6c 6f 77 65  possible to lowe
15730 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  r the locking le
15740 76 65 6c 20 6f 6e 65 20 73 74 65 70 20 61 74 20  vel one step at 
15750 61 20 74 69 6d 65 2e 20 20 59 6f 75 0a 2a 2a 20  a time.  You.** 
15760 6d 75 73 74 20 67 6f 20 73 74 72 61 69 67 68 74  must go straight
15770 20 74 6f 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65   to locking leve
15780 6c 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  l 0..*/.static i
15790 6e 74 20 77 69 6e 4c 6f 63 6b 28 73 71 6c 69 74  nt winLock(sqlit
157a0 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
157b0 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e   locktype){.  in
157c0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
157d0 3b 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63  ;    /* Return c
157e0 6f 64 65 20 66 72 6f 6d 20 73 75 62 72 6f 75 74  ode from subrout
157f0 69 6e 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ines */.  int re
15800 73 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20  s = 1;          
15810 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20 61 20   /* Result of a 
15820 57 69 6e 64 6f 77 73 20 6c 6f 63 6b 20 63 61 6c  Windows lock cal
15830 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 65 77 4c 6f  l */.  int newLo
15840 63 6b 74 79 70 65 3b 20 20 20 20 20 20 20 2f 2a  cktype;       /*
15850 20 53 65 74 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b   Set pFile->lock
15860 74 79 70 65 20 74 6f 20 74 68 69 73 20 76 61 6c  type to this val
15870 75 65 20 62 65 66 6f 72 65 20 65 78 69 74 69 6e  ue before exitin
15880 67 20 2a 2f 0a 20 20 69 6e 74 20 67 6f 74 50 65  g */.  int gotPe
15890 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20 30 3b 2f 2a  ndingLock = 0;/*
158a0 20 54 72 75 65 20 69 66 20 77 65 20 61 63 71 75   True if we acqu
158b0 69 72 65 64 20 61 20 50 45 4e 44 49 4e 47 20 6c  ired a PENDING l
158c0 6f 63 6b 20 74 68 69 73 20 74 69 6d 65 20 2a 2f  ock this time */
158d0 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  .  winFile *pFil
158e0 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64  e = (winFile*)id
158f0 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72  ;.  DWORD lastEr
15900 72 6e 6f 20 3d 20 4e 4f 5f 45 52 52 4f 52 3b 0a  rno = NO_ERROR;.
15910 0a 20 20 61 73 73 65 72 74 28 20 69 64 21 3d 30  .  assert( id!=0
15920 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22   );.  OSTRACE(("
15930 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6f 6c  LOCK file=%p, ol
15940 64 4c 6f 63 6b 3d 25 64 28 25 64 29 2c 20 6e 65  dLock=%d(%d), ne
15950 77 4c 6f 63 6b 3d 25 64 5c 6e 22 2c 0a 20 20 20  wLock=%d\n",.   
15960 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68          pFile->h
15970 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  , pFile->locktyp
15980 65 2c 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64  e, pFile->shared
15990 4c 6f 63 6b 42 79 74 65 2c 20 6c 6f 63 6b 74 79  LockByte, lockty
159a0 70 65 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  pe));..  /* If t
159b0 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20  here is already 
159c0 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20 74  a lock of this t
159d0 79 70 65 20 6f 72 20 6d 6f 72 65 20 72 65 73 74  ype or more rest
159e0 72 69 63 74 69 76 65 20 6f 6e 20 74 68 65 0a 20  rictive on the. 
159f0 20 2a 2a 20 4f 73 46 69 6c 65 2c 20 64 6f 20 6e   ** OsFile, do n
15a00 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75 73  othing. Don't us
15a10 65 20 74 68 65 20 65 6e 64 5f 6c 6f 63 6b 3a 20  e the end_lock: 
15a20 65 78 69 74 20 70 61 74 68 2c 20 61 73 0a 20 20  exit path, as.  
15a30 2a 2a 20 73 71 6c 69 74 65 33 4f 73 45 6e 74 65  ** sqlite3OsEnte
15a40 72 4d 75 74 65 78 28 29 20 68 61 73 6e 27 74 20  rMutex() hasn't 
15a50 62 65 65 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e  been called yet.
15a60 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  .  */.  if( pFil
15a70 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 6c 6f 63  e->locktype>=loc
15a80 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 4f 53 54  ktype ){.    OST
15a90 52 41 43 45 28 28 22 4c 4f 43 4b 2d 48 45 4c 44  RACE(("LOCK-HELD
15aa0 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c   file=%p, rc=SQL
15ab0 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65  ITE_OK\n", pFile
15ac0 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75 72  ->h));.    retur
15ad0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
15ae0 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
15af0 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71   the locking seq
15b00 75 65 6e 63 65 20 69 73 20 63 6f 72 72 65 63 74  uence is correct
15b10 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
15b20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 21  pFile->locktype!
15b30 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 6c 6f 63 6b  =NO_LOCK || lock
15b40 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
15b50 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c  K );.  assert( l
15b60 6f 63 6b 74 79 70 65 21 3d 50 45 4e 44 49 4e 47  ocktype!=PENDING
15b70 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
15b80 74 28 20 6c 6f 63 6b 74 79 70 65 21 3d 52 45 53  t( locktype!=RES
15b90 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46  ERVED_LOCK || pF
15ba0 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53  ile->locktype==S
15bb0 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20  HARED_LOCK );.. 
15bc0 20 2f 2a 20 4c 6f 63 6b 20 74 68 65 20 50 45 4e   /* Lock the PEN
15bd0 44 49 4e 47 5f 4c 4f 43 4b 20 62 79 74 65 20 69  DING_LOCK byte i
15be0 66 20 77 65 20 6e 65 65 64 20 74 6f 20 61 63 71  f we need to acq
15bf0 75 69 72 65 20 61 20 50 45 4e 44 49 4e 47 20 6c  uire a PENDING l
15c00 6f 63 6b 20 6f 72 0a 20 20 2a 2a 20 61 20 53 48  ock or.  ** a SH
15c10 41 52 45 44 20 6c 6f 63 6b 2e 20 20 49 66 20 77  ARED lock.  If w
15c20 65 20 61 72 65 20 61 63 71 75 69 72 69 6e 67 20  e are acquiring 
15c30 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74  a SHARED lock, t
15c40 68 65 20 61 63 71 75 69 73 69 74 69 6f 6e 20 6f  he acquisition o
15c50 66 0a 20 20 2a 2a 20 74 68 65 20 50 45 4e 44 49  f.  ** the PENDI
15c60 4e 47 5f 4c 4f 43 4b 20 62 79 74 65 20 69 73 20  NG_LOCK byte is 
15c70 74 65 6d 70 6f 72 61 72 79 2e 0a 20 20 2a 2f 0a  temporary..  */.
15c80 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20    newLocktype = 
15c90 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3b  pFile->locktype;
15ca0 0a 20 20 69 66 28 20 20 20 28 70 46 69 6c 65 2d  .  if(   (pFile-
15cb0 3e 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f  >locktype==NO_LO
15cc0 43 4b 29 0a 20 20 20 20 20 7c 7c 20 28 20 20 20  CK).     || (   
15cd0 28 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55  (locktype==EXCLU
15ce0 53 49 56 45 5f 4c 4f 43 4b 29 0a 20 20 20 20 20  SIVE_LOCK).     
15cf0 20 20 20 20 26 26 20 28 70 46 69 6c 65 2d 3e 6c      && (pFile->l
15d00 6f 63 6b 74 79 70 65 3d 3d 52 45 53 45 52 56 45  ocktype==RESERVE
15d10 44 5f 4c 4f 43 4b 29 29 0a 20 20 29 7b 0a 20 20  D_LOCK)).  ){.  
15d20 20 20 69 6e 74 20 63 6e 74 20 3d 20 33 3b 0a 20    int cnt = 3;. 
15d30 20 20 20 77 68 69 6c 65 28 20 63 6e 74 2d 2d 3e     while( cnt-->
15d40 30 20 26 26 20 28 72 65 73 20 3d 20 77 69 6e 4c  0 && (res = winL
15d50 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e  ockFile(&pFile->
15d60 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49  h, SQLITE_LOCKFI
15d70 4c 45 5f 46 4c 41 47 53 2c 0a 20 20 20 20 20 20  LE_FLAGS,.      
15d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15da0 20 20 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c     PENDING_BYTE,
15db0 20 30 2c 20 31 2c 20 30 29 29 3d 3d 30 20 29 7b   0, 1, 0))==0 ){
15dc0 0a 20 20 20 20 20 20 2f 2a 20 54 72 79 20 33 20  .      /* Try 3 
15dd0 74 69 6d 65 73 20 74 6f 20 67 65 74 20 74 68 65  times to get the
15de0 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 2e 20 20   pending lock.  
15df0 54 68 69 73 20 69 73 20 6e 65 65 64 65 64 20 74  This is needed t
15e00 6f 20 77 6f 72 6b 0a 20 20 20 20 20 20 2a 2a 20  o work.      ** 
15e10 61 72 6f 75 6e 64 20 70 72 6f 62 6c 65 6d 73 20  around problems 
15e20 63 61 75 73 65 64 20 62 79 20 69 6e 64 65 78 69  caused by indexi
15e30 6e 67 20 61 6e 64 2f 6f 72 20 61 6e 74 69 2d 76  ng and/or anti-v
15e40 69 72 75 73 20 73 6f 66 74 77 61 72 65 20 6f 6e  irus software on
15e50 0a 20 20 20 20 20 20 2a 2a 20 57 69 6e 64 6f 77  .      ** Window
15e60 73 20 73 79 73 74 65 6d 73 2e 0a 20 20 20 20 20  s systems..     
15e70 20 2a 2a 20 49 66 20 79 6f 75 20 61 72 65 20 75   ** If you are u
15e80 73 69 6e 67 20 74 68 69 73 20 63 6f 64 65 20 61  sing this code a
15e90 73 20 61 20 6d 6f 64 65 6c 20 66 6f 72 20 61 6c  s a model for al
15ea0 74 65 72 6e 61 74 69 76 65 20 56 46 53 65 73 2c  ternative VFSes,
15eb0 20 64 6f 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a   do not.      **
15ec0 20 63 6f 70 79 20 74 68 69 73 20 72 65 74 72 79   copy this retry
15ed0 20 6c 6f 67 69 63 2e 20 20 49 74 20 69 73 20 61   logic.  It is a
15ee0 20 68 61 63 6b 20 69 6e 74 65 6e 64 65 64 20 66   hack intended f
15ef0 6f 72 20 57 69 6e 64 6f 77 73 20 6f 6e 6c 79 2e  or Windows only.
15f00 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
15f10 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 2d 50  OSTRACE(("LOCK-P
15f20 45 4e 44 49 4e 47 2d 46 41 49 4c 20 66 69 6c 65  ENDING-FAIL file
15f30 3d 25 70 2c 20 63 6f 75 6e 74 3d 25 64 2c 20 72  =%p, count=%d, r
15f40 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  c=%s\n",.       
15f50 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68          pFile->h
15f60 2c 20 63 6e 74 2c 20 73 71 6c 69 74 65 33 45 72  , cnt, sqlite3Er
15f70 72 4e 61 6d 65 28 72 65 73 29 29 29 3b 0a 20 20  rName(res)));.  
15f80 20 20 20 20 69 66 28 20 63 6e 74 20 29 20 73 71      if( cnt ) sq
15f90 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65  lite3_win32_slee
15fa0 70 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  p(1);.    }.    
15fb0 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d  gotPendingLock =
15fc0 20 72 65 73 3b 0a 20 20 20 20 69 66 28 20 21 72   res;.    if( !r
15fd0 65 73 20 29 7b 0a 20 20 20 20 20 20 6c 61 73 74  es ){.      last
15fe0 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
15ff0 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 7d 0a  tError();.    }.
16000 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72    }..  /* Acquir
16010 65 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 0a  e a shared lock.
16020 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74    */.  if( lockt
16030 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype==SHARED_LOCK
16040 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20 61   && res ){.    a
16050 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f  ssert( pFile->lo
16060 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20  cktype==NO_LOCK 
16070 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e  );.    res = win
16080 47 65 74 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c  GetReadLock(pFil
16090 65 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73 20  e);.    if( res 
160a0 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c 6f 63 6b  ){.      newLock
160b0 74 79 70 65 20 3d 20 53 48 41 52 45 44 5f 4c 4f  type = SHARED_LO
160c0 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  CK;.    }else{. 
160d0 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d       lastErrno =
160e0 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
160f0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
16100 2f 2a 20 41 63 71 75 69 72 65 20 61 20 52 45 53  /* Acquire a RES
16110 45 52 56 45 44 20 6c 6f 63 6b 0a 20 20 2a 2f 0a  ERVED lock.  */.
16120 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d    if( locktype==
16130 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26  RESERVED_LOCK &&
16140 20 72 65 73 20 29 7b 0a 20 20 20 20 61 73 73 65   res ){.    asse
16150 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  rt( pFile->lockt
16160 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype==SHARED_LOCK
16170 20 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 77 69   );.    res = wi
16180 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65  nLockFile(&pFile
16190 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  ->h, SQLITE_LOCK
161a0 46 49 4c 45 5f 46 4c 41 47 53 2c 20 52 45 53 45  FILE_FLAGS, RESE
161b0 52 56 45 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c  RVED_BYTE, 0, 1,
161c0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73   0);.    if( res
161d0 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c 6f 63   ){.      newLoc
161e0 6b 74 79 70 65 20 3d 20 52 45 53 45 52 56 45 44  ktype = RESERVED
161f0 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65  _LOCK;.    }else
16200 7b 0a 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e  {.      lastErrn
16210 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
16220 6f 72 28 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  or();.    }.  }.
16230 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20  .  /* Acquire a 
16240 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 0a 20 20 2a  PENDING lock.  *
16250 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65  /.  if( locktype
16260 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
16270 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20 6e   && res ){.    n
16280 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 50 45 4e  ewLocktype = PEN
16290 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20 67  DING_LOCK;.    g
162a0 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20  otPendingLock = 
162b0 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71  0;.  }..  /* Acq
162c0 75 69 72 65 20 61 6e 20 45 58 43 4c 55 53 49 56  uire an EXCLUSIV
162d0 45 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66  E lock.  */.  if
162e0 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c  ( locktype==EXCL
162f0 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 72 65  USIVE_LOCK && re
16300 73 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  s ){.    assert(
16310 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
16320 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  >=SHARED_LOCK );
16330 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e 55 6e  .    res = winUn
16340 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 28 70 46 69  lockReadLock(pFi
16350 6c 65 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 77  le);.    res = w
16360 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c  inLockFile(&pFil
16370 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43  e->h, SQLITE_LOC
16380 4b 46 49 4c 45 5f 46 4c 41 47 53 2c 20 53 48 41  KFILE_FLAGS, SHA
16390 52 45 44 5f 46 49 52 53 54 2c 20 30 2c 0a 20 20  RED_FIRST, 0,.  
163a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
163b0 20 20 20 20 53 48 41 52 45 44 5f 53 49 5a 45 2c      SHARED_SIZE,
163c0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73   0);.    if( res
163d0 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c 6f 63   ){.      newLoc
163e0 6b 74 79 70 65 20 3d 20 45 58 43 4c 55 53 49 56  ktype = EXCLUSIV
163f0 45 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73  E_LOCK;.    }els
16400 65 7b 0a 20 20 20 20 20 20 6c 61 73 74 45 72 72  e{.      lastErr
16410 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
16420 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 77 69 6e  ror();.      win
16430 47 65 74 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c  GetReadLock(pFil
16440 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  e);.    }.  }.. 
16450 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 68 6f   /* If we are ho
16460 6c 64 69 6e 67 20 61 20 50 45 4e 44 49 4e 47 20  lding a PENDING 
16470 6c 6f 63 6b 20 74 68 61 74 20 6f 75 67 68 74 20  lock that ought 
16480 74 6f 20 62 65 20 72 65 6c 65 61 73 65 64 2c 20  to be released, 
16490 74 68 65 6e 0a 20 20 2a 2a 20 72 65 6c 65 61 73  then.  ** releas
164a0 65 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20  e it now..  */. 
164b0 20 69 66 28 20 67 6f 74 50 65 6e 64 69 6e 67 4c   if( gotPendingL
164c0 6f 63 6b 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d  ock && locktype=
164d0 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  =SHARED_LOCK ){.
164e0 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c      winUnlockFil
164f0 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 50 45 4e  e(&pFile->h, PEN
16500 44 49 4e 47 5f 42 59 54 45 2c 20 30 2c 20 31 2c  DING_BYTE, 0, 1,
16510 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55   0);.  }..  /* U
16520 70 64 61 74 65 20 74 68 65 20 73 74 61 74 65 20  pdate the state 
16530 6f 66 20 74 68 65 20 6c 6f 63 6b 20 68 61 73 20  of the lock has 
16540 68 65 6c 64 20 69 6e 20 74 68 65 20 66 69 6c 65  held in the file
16550 20 64 65 73 63 72 69 70 74 6f 72 20 74 68 65 6e   descriptor then
16560 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 74 68 65  .  ** return the
16570 20 61 70 70 72 6f 70 72 69 61 74 65 20 72 65 73   appropriate res
16580 75 6c 74 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20  ult code..  */. 
16590 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20   if( res ){.    
165a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
165b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46 69    }else{.    pFi
165c0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
165d0 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 72  lastErrno;.    r
165e0 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
165f0 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4c  .    OSTRACE(("L
16600 4f 43 4b 2d 46 41 49 4c 20 66 69 6c 65 3d 25 70  OCK-FAIL file=%p
16610 2c 20 77 61 6e 74 65 64 3d 25 64 2c 20 67 6f 74  , wanted=%d, got
16620 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%d\n",.        
16630 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 6c       pFile->h, l
16640 6f 63 6b 74 79 70 65 2c 20 6e 65 77 4c 6f 63 6b  ocktype, newLock
16650 74 79 70 65 29 29 3b 0a 20 20 7d 0a 20 20 70 46  type));.  }.  pF
16660 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20  ile->locktype = 
16670 28 75 38 29 6e 65 77 4c 6f 63 6b 74 79 70 65 3b  (u8)newLocktype;
16680 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43  .  OSTRACE(("LOC
16690 4b 20 66 69 6c 65 3d 25 70 2c 20 6c 6f 63 6b 3d  K file=%p, lock=
166a0 25 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20  %d, rc=%s\n",.  
166b0 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
166c0 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  h, pFile->lockty
166d0 70 65 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61  pe, sqlite3ErrNa
166e0 6d 65 28 72 63 29 29 29 3b 0a 20 20 72 65 74 75  me(rc)));.  retu
166f0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
16700 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65  This routine che
16710 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73 20  cks if there is 
16720 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
16730 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63  held on the spec
16740 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79  ified.** file by
16750 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68   this or any oth
16760 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73  er process. If s
16770 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65  uch a lock is he
16780 6c 64 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f  ld, return.** no
16790 6e 2d 7a 65 72 6f 2c 20 6f 74 68 65 72 77 69 73  n-zero, otherwis
167a0 65 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69  e zero..*/.stati
167b0 63 20 69 6e 74 20 77 69 6e 43 68 65 63 6b 52 65  c int winCheckRe
167c0 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74  servedLock(sqlit
167d0 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
167e0 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e   *pResOut){.  in
167f0 74 20 72 63 3b 0a 20 20 77 69 6e 46 69 6c 65 20  t rc;.  winFile 
16800 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c  *pFile = (winFil
16810 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61  e*)id;..  Simula
16820 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
16830 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  n SQLITE_IOERR_C
16840 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b  HECKRESERVEDLOCK
16850 3b 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  ; );.  OSTRACE((
16860 22 54 45 53 54 2d 57 52 2d 4c 4f 43 4b 20 66 69  "TEST-WR-LOCK fi
16870 6c 65 3d 25 70 2c 20 70 52 65 73 4f 75 74 3d 25  le=%p, pResOut=%
16880 70 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  p\n", pFile->h, 
16890 70 52 65 73 4f 75 74 29 29 3b 0a 0a 20 20 61 73  pResOut));..  as
168a0 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20  sert( id!=0 );. 
168b0 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b   if( pFile->lock
168c0 74 79 70 65 3e 3d 52 45 53 45 52 56 45 44 5f 4c  type>=RESERVED_L
168d0 4f 43 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  OCK ){.    rc = 
168e0 31 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  1;.    OSTRACE((
168f0 22 54 45 53 54 2d 57 52 2d 4c 4f 43 4b 20 66 69  "TEST-WR-LOCK fi
16900 6c 65 3d 25 70 2c 20 72 63 3d 25 64 20 28 6c 6f  le=%p, rc=%d (lo
16910 63 61 6c 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  cal)\n", pFile->
16920 68 2c 20 72 63 29 29 3b 0a 20 20 7d 65 6c 73 65  h, rc));.  }else
16930 7b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f  {.    rc = winLo
16940 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68  ckFile(&pFile->h
16950 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c  , SQLITE_LOCKFIL
16960 45 45 58 5f 46 4c 41 47 53 2c 52 45 53 45 52 56  EEX_FLAGS,RESERV
16970 45 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30  ED_BYTE, 0, 1, 0
16980 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
16990 0a 20 20 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b  .      winUnlock
169a0 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20  File(&pFile->h, 
169b0 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 30  RESERVED_BYTE, 0
169c0 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  , 1, 0);.    }. 
169d0 20 20 20 72 63 20 3d 20 21 72 63 3b 0a 20 20 20     rc = !rc;.   
169e0 20 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 2d   OSTRACE(("TEST-
169f0 57 52 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c  WR-LOCK file=%p,
16a00 20 72 63 3d 25 64 20 28 72 65 6d 6f 74 65 29 5c   rc=%d (remote)\
16a10 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63  n", pFile->h, rc
16a20 29 29 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 4f  ));.  }.  *pResO
16a30 75 74 20 3d 20 72 63 3b 0a 20 20 4f 53 54 52 41  ut = rc;.  OSTRA
16a40 43 45 28 28 22 54 45 53 54 2d 57 52 2d 4c 4f 43  CE(("TEST-WR-LOC
16a50 4b 20 66 69 6c 65 3d 25 70 2c 20 70 52 65 73 4f  K file=%p, pResO
16a60 75 74 3d 25 70 2c 20 2a 70 52 65 73 4f 75 74 3d  ut=%p, *pResOut=
16a70 25 64 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b  %d, rc=SQLITE_OK
16a80 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
16a90 70 46 69 6c 65 2d 3e 68 2c 20 70 52 65 73 4f 75  pFile->h, pResOu
16aa0 74 2c 20 2a 70 52 65 73 4f 75 74 29 29 3b 0a 20  t, *pResOut));. 
16ab0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
16ac0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65  K;.}../*.** Lowe
16ad0 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  r the locking le
16ae0 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63  vel on file desc
16af0 72 69 70 74 6f 72 20 69 64 20 74 6f 20 6c 6f 63  riptor id to loc
16b00 6b 74 79 70 65 2e 20 20 6c 6f 63 6b 74 79 70 65  ktype.  locktype
16b10 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68  .** must be eith
16b20 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48  er NO_LOCK or SH
16b30 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a  ARED_LOCK..**.**
16b40 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   If the locking 
16b50 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c  level of the fil
16b60 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
16b70 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65  already at or be
16b80 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65  low.** the reque
16b90 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  sted locking lev
16ba0 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  el, this routine
16bb0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
16bc0 2a 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73  ** It is not pos
16bd0 73 69 62 6c 65 20 66 6f 72 20 74 68 69 73 20 72  sible for this r
16be0 6f 75 74 69 6e 65 20 74 6f 20 66 61 69 6c 20 69  outine to fail i
16bf0 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
16c00 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 4e 4f 5f 4c  ument.** is NO_L
16c10 4f 43 4b 2e 20 20 49 66 20 74 68 65 20 73 65 63  OCK.  If the sec
16c20 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
16c30 53 48 41 52 45 44 5f 4c 4f 43 4b 20 74 68 65 6e  SHARED_LOCK then
16c40 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
16c50 20 6d 69 67 68 74 20 72 65 74 75 72 6e 20 53 51   might return SQ
16c60 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 2a 2f 0a 73  LITE_IOERR;.*/.s
16c70 74 61 74 69 63 20 69 6e 74 20 77 69 6e 55 6e 6c  tatic int winUnl
16c80 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
16c90 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79   *id, int lockty
16ca0 70 65 29 7b 0a 20 20 69 6e 74 20 74 79 70 65 3b  pe){.  int type;
16cb0 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  .  winFile *pFil
16cc0 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64  e = (winFile*)id
16cd0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
16ce0 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74  ITE_OK;.  assert
16cf0 28 20 70 46 69 6c 65 21 3d 30 20 29 3b 0a 20 20  ( pFile!=0 );.  
16d00 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65  assert( locktype
16d10 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  <=SHARED_LOCK );
16d20 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c  .  OSTRACE(("UNL
16d30 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6f 6c 64  OCK file=%p, old
16d40 4c 6f 63 6b 3d 25 64 28 25 64 29 2c 20 6e 65 77  Lock=%d(%d), new
16d50 4c 6f 63 6b 3d 25 64 5c 6e 22 2c 0a 20 20 20 20  Lock=%d\n",.    
16d60 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c         pFile->h,
16d70 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
16d80 2c 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c  , pFile->sharedL
16d90 6f 63 6b 42 79 74 65 2c 20 6c 6f 63 6b 74 79 70  ockByte, locktyp
16da0 65 29 29 3b 0a 20 20 74 79 70 65 20 3d 20 70 46  e));.  type = pF
16db0 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20  ile->locktype;. 
16dc0 20 69 66 28 20 74 79 70 65 3e 3d 45 58 43 4c 55   if( type>=EXCLU
16dd0 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  SIVE_LOCK ){.   
16de0 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26   winUnlockFile(&
16df0 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44  pFile->h, SHARED
16e00 5f 46 49 52 53 54 2c 20 30 2c 20 53 48 41 52 45  _FIRST, 0, SHARE
16e10 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20 20 20  D_SIZE, 0);.    
16e20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48  if( locktype==SH
16e30 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 21 77 69  ARED_LOCK && !wi
16e40 6e 47 65 74 52 65 61 64 4c 6f 63 6b 28 70 46 69  nGetReadLock(pFi
16e50 6c 65 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  le) ){.      /* 
16e60 54 68 69 73 20 73 68 6f 75 6c 64 20 6e 65 76 65  This should neve
16e70 72 20 68 61 70 70 65 6e 2e 20 20 57 65 20 73 68  r happen.  We sh
16e80 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20 61  ould always be a
16e90 62 6c 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ble to.      ** 
16ea0 72 65 61 63 71 75 69 72 65 20 74 68 65 20 72 65  reacquire the re
16eb0 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20  ad lock */.     
16ec0 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f   rc = winLogErro
16ed0 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  r(SQLITE_IOERR_U
16ee0 4e 4c 4f 43 4b 2c 20 6f 73 47 65 74 4c 61 73 74  NLOCK, osGetLast
16ef0 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20  Error(),.       
16f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f10 22 77 69 6e 55 6e 6c 6f 63 6b 22 2c 20 70 46 69  "winUnlock", pFi
16f20 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20  le->zPath);.    
16f30 7d 0a 20 20 7d 0a 20 20 69 66 28 20 74 79 70 65  }.  }.  if( type
16f40 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  >=RESERVED_LOCK 
16f50 29 7b 0a 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b  ){.    winUnlock
16f60 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20  File(&pFile->h, 
16f70 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 30  RESERVED_BYTE, 0
16f80 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69  , 1, 0);.  }.  i
16f90 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f  f( locktype==NO_
16fa0 4c 4f 43 4b 20 26 26 20 74 79 70 65 3e 3d 53 48  LOCK && type>=SH
16fb0 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
16fc0 20 77 69 6e 55 6e 6c 6f 63 6b 52 65 61 64 4c 6f   winUnlockReadLo
16fd0 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20 7d 0a 20  ck(pFile);.  }. 
16fe0 20 69 66 28 20 74 79 70 65 3e 3d 50 45 4e 44 49   if( type>=PENDI
16ff0 4e 47 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 77  NG_LOCK ){.    w
17000 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46  inUnlockFile(&pF
17010 69 6c 65 2d 3e 68 2c 20 50 45 4e 44 49 4e 47 5f  ile->h, PENDING_
17020 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a  BYTE, 0, 1, 0);.
17030 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f 63    }.  pFile->loc
17040 6b 74 79 70 65 20 3d 20 28 75 38 29 6c 6f 63 6b  ktype = (u8)lock
17050 74 79 70 65 3b 0a 20 20 4f 53 54 52 41 43 45 28  type;.  OSTRACE(
17060 28 22 55 4e 4c 4f 43 4b 20 66 69 6c 65 3d 25 70  ("UNLOCK file=%p
17070 2c 20 6c 6f 63 6b 3d 25 64 2c 20 72 63 3d 25 73  , lock=%d, rc=%s
17080 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
17090 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d  pFile->h, pFile-
170a0 3e 6c 6f 63 6b 74 79 70 65 2c 20 73 71 6c 69 74  >locktype, sqlit
170b0 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b  e3ErrName(rc)));
170c0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
170d0 0a 2f 2a 0a 2a 2a 20 49 66 20 2a 70 41 72 67 20  ./*.** If *pArg 
170e0 69 73 20 69 6e 69 74 69 74 69 61 6c 6c 79 20 6e  is inititially n
170f0 65 67 61 74 69 76 65 20 74 68 65 6e 20 74 68 69  egative then thi
17100 73 20 69 73 20 61 20 71 75 65 72 79 2e 20 20 53  s is a query.  S
17110 65 74 20 2a 70 41 72 67 20 74 6f 0a 2a 2a 20 31  et *pArg to.** 1
17120 20 6f 72 20 30 20 64 65 70 65 6e 64 69 6e 67 20   or 0 depending 
17130 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  on whether or no
17140 74 20 62 69 74 20 6d 61 73 6b 20 6f 66 20 70 46  t bit mask of pF
17150 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 69  ile->ctrlFlags i
17160 73 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  s set..**.** If 
17170 2a 70 41 72 67 20 69 73 20 30 20 6f 72 20 31 2c  *pArg is 0 or 1,
17180 20 74 68 65 6e 20 63 6c 65 61 72 20 6f 72 20 73   then clear or s
17190 65 74 20 74 68 65 20 6d 61 73 6b 20 62 69 74 20  et the mask bit 
171a0 6f 66 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c  of pFile->ctrlFl
171b0 61 67 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ags..*/.static v
171c0 6f 69 64 20 77 69 6e 4d 6f 64 65 42 69 74 28 77  oid winModeBit(w
171d0 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 75  inFile *pFile, u
171e0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6d 61 73  nsigned char mas
171f0 6b 2c 20 69 6e 74 20 2a 70 41 72 67 29 7b 0a 20  k, int *pArg){. 
17200 20 69 66 28 20 2a 70 41 72 67 3c 30 20 29 7b 0a   if( *pArg<0 ){.
17210 20 20 20 20 2a 70 41 72 67 20 3d 20 28 70 46 69      *pArg = (pFi
17220 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20  le->ctrlFlags & 
17230 6d 61 73 6b 29 21 3d 30 3b 0a 20 20 7d 65 6c 73  mask)!=0;.  }els
17240 65 20 69 66 28 20 28 2a 70 41 72 67 29 3d 3d 30  e if( (*pArg)==0
17250 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63   ){.    pFile->c
17260 74 72 6c 46 6c 61 67 73 20 26 3d 20 7e 6d 61 73  trlFlags &= ~mas
17270 6b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  k;.  }else{.    
17280 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
17290 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 7d 0a 7d 0a   |= mask;.  }.}.
172a0 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65  ./* Forward refe
172b0 72 65 6e 63 65 73 20 74 6f 20 56 46 53 20 68 65  rences to VFS he
172c0 6c 70 65 72 20 6d 65 74 68 6f 64 73 20 75 73 65  lper methods use
172d0 64 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20  d for temporary 
172e0 66 69 6c 65 73 20 2a 2f 0a 73 74 61 74 69 63 20  files */.static 
172f0 69 6e 74 20 77 69 6e 47 65 74 54 65 6d 70 6e 61  int winGetTempna
17300 6d 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  me(sqlite3_vfs *
17310 2c 20 63 68 61 72 20 2a 2a 29 3b 0a 73 74 61 74  , char **);.stat
17320 69 63 20 69 6e 74 20 77 69 6e 49 73 44 69 72 28  ic int winIsDir(
17330 63 6f 6e 73 74 20 76 6f 69 64 20 2a 29 3b 0a 73  const void *);.s
17340 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 49 73  tatic BOOL winIs
17350 44 72 69 76 65 4c 65 74 74 65 72 41 6e 64 43 6f  DriveLetterAndCo
17360 6c 6f 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  lon(const char *
17370 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 74 72 6f  );../*.** Contro
17380 6c 20 61 6e 64 20 71 75 65 72 79 20 6f 66 20 74  l and query of t
17390 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 68 61 6e  he open file han
173a0 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  dle..*/.static i
173b0 6e 74 20 77 69 6e 46 69 6c 65 43 6f 6e 74 72 6f  nt winFileContro
173c0 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  l(sqlite3_file *
173d0 69 64 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64  id, int op, void
173e0 20 2a 70 41 72 67 29 7b 0a 20 20 77 69 6e 46 69   *pArg){.  winFi
173f0 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e  le *pFile = (win
17400 46 69 6c 65 2a 29 69 64 3b 0a 20 20 4f 53 54 52  File*)id;.  OSTR
17410 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65  ACE(("FCNTL file
17420 3d 25 70 2c 20 6f 70 3d 25 64 2c 20 70 41 72 67  =%p, op=%d, pArg
17430 3d 25 70 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  =%p\n", pFile->h
17440 2c 20 6f 70 2c 20 70 41 72 67 29 29 3b 0a 20 20  , op, pArg));.  
17450 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20  switch( op ){.  
17460 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
17470 4e 54 4c 5f 4c 4f 43 4b 53 54 41 54 45 3a 20 7b  NTL_LOCKSTATE: {
17480 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41  .      *(int*)pA
17490 72 67 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  rg = pFile->lock
174a0 74 79 70 65 3b 0a 20 20 20 20 20 20 4f 53 54 52  type;.      OSTR
174b0 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65  ACE(("FCNTL file
174c0 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f  =%p, rc=SQLITE_O
174d0 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29  K\n", pFile->h))
174e0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
174f0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
17500 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
17510 4c 41 53 54 5f 45 52 52 4e 4f 3a 20 7b 0a 20 20  LAST_ERRNO: {.  
17520 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20      *(int*)pArg 
17530 3d 20 28 69 6e 74 29 70 46 69 6c 65 2d 3e 6c 61  = (int)pFile->la
17540 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 4f  stErrno;.      O
17550 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66  STRACE(("FCNTL f
17560 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  ile=%p, rc=SQLIT
17570 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  E_OK\n", pFile->
17580 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  h));.      retur
17590 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
175a0 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
175b0 54 45 5f 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53  TE_FCNTL_CHUNK_S
175c0 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20 70 46 69  IZE: {.      pFi
175d0 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 3d 20 2a 28  le->szChunk = *(
175e0 69 6e 74 20 2a 29 70 41 72 67 3b 0a 20 20 20 20  int *)pArg;.    
175f0 20 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54    OSTRACE(("FCNT
17600 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51  L file=%p, rc=SQ
17610 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c  LITE_OK\n", pFil
17620 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65  e->h));.      re
17630 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
17640 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
17650 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45  QLITE_FCNTL_SIZE
17660 5f 48 49 4e 54 3a 20 7b 0a 20 20 20 20 20 20 69  _HINT: {.      i
17670 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e  f( pFile->szChun
17680 6b 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  k>0 ){.        s
17690 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 6c 64  qlite3_int64 old
176a0 53 7a 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  Sz;.        int 
176b0 72 63 20 3d 20 77 69 6e 46 69 6c 65 53 69 7a 65  rc = winFileSize
176c0 28 69 64 2c 20 26 6f 6c 64 53 7a 29 3b 0a 20 20  (id, &oldSz);.  
176d0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
176e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
176f0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74       sqlite3_int
17700 36 34 20 6e 65 77 53 7a 20 3d 20 2a 28 73 71 6c  64 newSz = *(sql
17710 69 74 65 33 5f 69 6e 74 36 34 2a 29 70 41 72 67  ite3_int64*)pArg
17720 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
17730 6e 65 77 53 7a 3e 6f 6c 64 53 7a 20 29 7b 0a 20  newSz>oldSz ){. 
17740 20 20 20 20 20 20 20 20 20 20 20 53 69 6d 75 6c             Simul
17750 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
17760 28 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  (1);.           
17770 20 72 63 20 3d 20 77 69 6e 54 72 75 6e 63 61 74   rc = winTruncat
17780 65 28 69 64 2c 20 6e 65 77 53 7a 29 3b 0a 20 20  e(id, newSz);.  
17790 20 20 20 20 20 20 20 20 20 20 53 69 6d 75 6c 61            Simula
177a0 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28  teIOErrorBenign(
177b0 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  0);.          }.
177c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
177d0 20 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54    OSTRACE(("FCNT
177e0 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73  L file=%p, rc=%s
177f0 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 73  \n", pFile->h, s
17800 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63  qlite3ErrName(rc
17810 29 29 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  )));.        ret
17820 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
17830 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
17840 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72  FCNTL file=%p, r
17850 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20  c=SQLITE_OK\n", 
17860 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20  pFile->h));.    
17870 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
17880 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  OK;.    }.    ca
17890 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
178a0 50 45 52 53 49 53 54 5f 57 41 4c 3a 20 7b 0a 20  PERSIST_WAL: {. 
178b0 20 20 20 20 20 77 69 6e 4d 6f 64 65 42 69 74 28       winModeBit(
178c0 70 46 69 6c 65 2c 20 57 49 4e 46 49 4c 45 5f 50  pFile, WINFILE_P
178d0 45 52 53 49 53 54 5f 57 41 4c 2c 20 28 69 6e 74  ERSIST_WAL, (int
178e0 2a 29 70 41 72 67 29 3b 0a 20 20 20 20 20 20 4f  *)pArg);.      O
178f0 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66  STRACE(("FCNTL f
17900 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  ile=%p, rc=SQLIT
17910 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  E_OK\n", pFile->
17920 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  h));.      retur
17930 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
17940 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
17950 54 45 5f 46 43 4e 54 4c 5f 50 4f 57 45 52 53 41  TE_FCNTL_POWERSA
17960 46 45 5f 4f 56 45 52 57 52 49 54 45 3a 20 7b 0a  FE_OVERWRITE: {.
17970 20 20 20 20 20 20 77 69 6e 4d 6f 64 65 42 69 74        winModeBit
17980 28 70 46 69 6c 65 2c 20 57 49 4e 46 49 4c 45 5f  (pFile, WINFILE_
17990 50 53 4f 57 2c 20 28 69 6e 74 2a 29 70 41 72 67  PSOW, (int*)pArg
179a0 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  );.      OSTRACE
179b0 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70  (("FCNTL file=%p
179c0 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e  , rc=SQLITE_OK\n
179d0 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20  ", pFile->h));. 
179e0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
179f0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
17a00 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
17a10 54 4c 5f 56 46 53 4e 41 4d 45 3a 20 7b 0a 20 20  TL_VFSNAME: {.  
17a20 20 20 20 20 2a 28 63 68 61 72 2a 2a 29 70 41 72      *(char**)pAr
17a30 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  g = sqlite3_mpri
17a40 6e 74 66 28 22 77 69 6e 33 32 22 29 3b 0a 20 20  ntf("win32");.  
17a50 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46 43      OSTRACE(("FC
17a60 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  NTL file=%p, rc=
17a70 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46  SQLITE_OK\n", pF
17a80 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20  ile->h));.      
17a90 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
17aa0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
17ab0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 57 49   SQLITE_FCNTL_WI
17ac0 4e 33 32 5f 41 56 5f 52 45 54 52 59 3a 20 7b 0a  N32_AV_RETRY: {.
17ad0 20 20 20 20 20 20 69 6e 74 20 2a 61 20 3d 20 28        int *a = (
17ae0 69 6e 74 2a 29 70 41 72 67 3b 0a 20 20 20 20 20  int*)pArg;.     
17af0 20 69 66 28 20 61 5b 30 5d 3e 30 20 29 7b 0a 20   if( a[0]>0 ){. 
17b00 20 20 20 20 20 20 20 77 69 6e 49 6f 65 72 72 52         winIoerrR
17b10 65 74 72 79 20 3d 20 61 5b 30 5d 3b 0a 20 20 20  etry = a[0];.   
17b20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
17b30 20 20 61 5b 30 5d 20 3d 20 77 69 6e 49 6f 65 72    a[0] = winIoer
17b40 72 52 65 74 72 79 3b 0a 20 20 20 20 20 20 7d 0a  rRetry;.      }.
17b50 20 20 20 20 20 20 69 66 28 20 61 5b 31 5d 3e 30        if( a[1]>0
17b60 20 29 7b 0a 20 20 20 20 20 20 20 20 77 69 6e 49   ){.        winI
17b70 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79 20 3d  oerrRetryDelay =
17b80 20 61 5b 31 5d 3b 0a 20 20 20 20 20 20 7d 65 6c   a[1];.      }el
17b90 73 65 7b 0a 20 20 20 20 20 20 20 20 61 5b 31 5d  se{.        a[1]
17ba0 20 3d 20 77 69 6e 49 6f 65 72 72 52 65 74 72 79   = winIoerrRetry
17bb0 44 65 6c 61 79 3b 0a 20 20 20 20 20 20 7d 0a 20  Delay;.      }. 
17bc0 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46       OSTRACE(("F
17bd0 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63  CNTL file=%p, rc
17be0 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70  =SQLITE_OK\n", p
17bf0 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20  File->h));.     
17c00 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
17c10 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
17c20 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 54  e SQLITE_FCNTL_T
17c30 45 4d 50 46 49 4c 45 4e 41 4d 45 3a 20 7b 0a 20  EMPFILENAME: {. 
17c40 20 20 20 20 20 63 68 61 72 20 2a 7a 54 46 69 6c       char *zTFil
17c50 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74  e = 0;.      int
17c60 20 72 63 20 3d 20 77 69 6e 47 65 74 54 65 6d 70   rc = winGetTemp
17c70 6e 61 6d 65 28 70 46 69 6c 65 2d 3e 70 56 66 73  name(pFile->pVfs
17c80 2c 20 26 7a 54 46 69 6c 65 29 3b 0a 20 20 20 20  , &zTFile);.    
17c90 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
17ca0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  _OK ){.        *
17cb0 28 63 68 61 72 2a 2a 29 70 41 72 67 20 3d 20 7a  (char**)pArg = z
17cc0 54 46 69 6c 65 3b 0a 20 20 20 20 20 20 7d 0a 20  TFile;.      }. 
17cd0 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46       OSTRACE(("F
17ce0 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63  CNTL file=%p, rc
17cf0 3d 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  =%s\n", pFile->h
17d00 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65  , sqlite3ErrName
17d10 28 72 63 29 29 29 3b 0a 20 20 20 20 20 20 72 65  (rc)));.      re
17d20 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 23  turn rc;.    }.#
17d30 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
17d40 41 50 5f 53 49 5a 45 3e 30 0a 20 20 20 20 63 61  AP_SIZE>0.    ca
17d50 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
17d60 4d 4d 41 50 5f 53 49 5a 45 3a 20 7b 0a 20 20 20  MMAP_SIZE: {.   
17d70 20 20 20 69 36 34 20 6e 65 77 4c 69 6d 69 74 20     i64 newLimit 
17d80 3d 20 2a 28 69 36 34 2a 29 70 41 72 67 3b 0a 20  = *(i64*)pArg;. 
17d90 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51       int rc = SQ
17da0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69  LITE_OK;.      i
17db0 66 28 20 6e 65 77 4c 69 6d 69 74 3e 73 71 6c 69  f( newLimit>sqli
17dc0 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
17dd0 6d 78 4d 6d 61 70 20 29 7b 0a 20 20 20 20 20 20  mxMmap ){.      
17de0 20 20 6e 65 77 4c 69 6d 69 74 20 3d 20 73 71 6c    newLimit = sql
17df0 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
17e00 2e 6d 78 4d 6d 61 70 3b 0a 20 20 20 20 20 20 7d  .mxMmap;.      }
17e10 0a 20 20 20 20 20 20 2a 28 69 36 34 2a 29 70 41  .      *(i64*)pA
17e20 72 67 20 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70  rg = pFile->mmap
17e30 53 69 7a 65 4d 61 78 3b 0a 20 20 20 20 20 20 69  SizeMax;.      i
17e40 66 28 20 6e 65 77 4c 69 6d 69 74 3e 3d 30 20 26  f( newLimit>=0 &
17e50 26 20 6e 65 77 4c 69 6d 69 74 21 3d 70 46 69 6c  & newLimit!=pFil
17e60 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 26  e->mmapSizeMax &
17e70 26 20 70 46 69 6c 65 2d 3e 6e 46 65 74 63 68 4f  & pFile->nFetchO
17e80 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ut==0 ){.       
17e90 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65   pFile->mmapSize
17ea0 4d 61 78 20 3d 20 6e 65 77 4c 69 6d 69 74 3b 0a  Max = newLimit;.
17eb0 20 20 20 20 20 20 20 20 69 66 28 20 70 46 69 6c          if( pFil
17ec0 65 2d 3e 6d 6d 61 70 53 69 7a 65 3e 30 20 29 7b  e->mmapSize>0 ){
17ed0 0a 20 20 20 20 20 20 20 20 20 20 77 69 6e 55 6e  .          winUn
17ee0 6d 61 70 66 69 6c 65 28 70 46 69 6c 65 29 3b 0a  mapfile(pFile);.
17ef0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77            rc = w
17f00 69 6e 4d 61 70 66 69 6c 65 28 70 46 69 6c 65 2c  inMapfile(pFile,
17f10 20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a   -1);.        }.
17f20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 4f 53        }.      OS
17f30 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69  TRACE(("FCNTL fi
17f40 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c  le=%p, rc=%s\n",
17f50 20 70 46 69 6c 65 2d 3e 68 2c 20 73 71 6c 69 74   pFile->h, sqlit
17f60 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b  e3ErrName(rc)));
17f70 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
17f80 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
17f90 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 46   }.  OSTRACE(("F
17fa0 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63  CNTL file=%p, rc
17fb0 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44  =SQLITE_NOTFOUND
17fc0 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  \n", pFile->h));
17fd0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
17fe0 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 7d 0a 0a 2f 2a  _NOTFOUND;.}../*
17ff0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73  .** Return the s
18000 65 63 74 6f 72 20 73 69 7a 65 20 69 6e 20 62 79  ector size in by
18010 74 65 73 20 6f 66 20 74 68 65 20 75 6e 64 65 72  tes of the under
18020 6c 79 69 6e 67 20 62 6c 6f 63 6b 20 64 65 76 69  lying block devi
18030 63 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73 70  ce for.** the sp
18040 65 63 69 66 69 65 64 20 66 69 6c 65 2e 20 54 68  ecified file. Th
18050 69 73 20 69 73 20 61 6c 6d 6f 73 74 20 61 6c 77  is is almost alw
18060 61 79 73 20 35 31 32 20 62 79 74 65 73 2c 20 62  ays 512 bytes, b
18070 75 74 20 6d 61 79 20 62 65 0a 2a 2a 20 6c 61 72  ut may be.** lar
18080 67 65 72 20 66 6f 72 20 73 6f 6d 65 20 64 65 76  ger for some dev
18090 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69  ices..**.** SQLi
180a0 74 65 20 63 6f 64 65 20 61 73 73 75 6d 65 73 20  te code assumes 
180b0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 61  this function ca
180c0 6e 6e 6f 74 20 66 61 69 6c 2e 20 49 74 20 61 6c  nnot fail. It al
180d0 73 6f 20 61 73 73 75 6d 65 73 20 74 68 61 74 0a  so assumes that.
180e0 2a 2a 20 69 66 20 74 77 6f 20 66 69 6c 65 73 20  ** if two files 
180f0 61 72 65 20 63 72 65 61 74 65 64 20 69 6e 20 74  are created in t
18100 68 65 20 73 61 6d 65 20 66 69 6c 65 2d 73 79 73  he same file-sys
18110 74 65 6d 20 64 69 72 65 63 74 6f 72 79 20 28 69  tem directory (i
18120 2e 65 2e 0a 2a 2a 20 61 20 64 61 74 61 62 61 73  .e..** a databas
18130 65 20 61 6e 64 20 69 74 73 20 6a 6f 75 72 6e 61  e and its journa
18140 6c 20 66 69 6c 65 29 20 74 68 61 74 20 74 68 65  l file) that the
18150 20 73 65 63 74 6f 72 20 73 69 7a 65 20 77 69 6c   sector size wil
18160 6c 20 62 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65  l be the.** same
18170 20 66 6f 72 20 62 6f 74 68 2e 0a 2a 2f 0a 73 74   for both..*/.st
18180 61 74 69 63 20 69 6e 74 20 77 69 6e 53 65 63 74  atic int winSect
18190 6f 72 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66  orSize(sqlite3_f
181a0 69 6c 65 20 2a 69 64 29 7b 0a 20 20 28 76 6f 69  ile *id){.  (voi
181b0 64 29 69 64 3b 0a 20 20 72 65 74 75 72 6e 20 53  d)id;.  return S
181c0 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 45  QLITE_DEFAULT_SE
181d0 43 54 4f 52 5f 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a  CTOR_SIZE;.}../*
181e0 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 76 65 63  .** Return a vec
181f0 74 6f 72 20 6f 66 20 64 65 76 69 63 65 20 63 68  tor of device ch
18200 61 72 61 63 74 65 72 69 73 74 69 63 73 2e 0a 2a  aracteristics..*
18210 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
18220 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
18230 73 74 69 63 73 28 73 71 6c 69 74 65 33 5f 66 69  stics(sqlite3_fi
18240 6c 65 20 2a 69 64 29 7b 0a 20 20 77 69 6e 46 69  le *id){.  winFi
18250 6c 65 20 2a 70 20 3d 20 28 77 69 6e 46 69 6c 65  le *p = (winFile
18260 2a 29 69 64 3b 0a 20 20 72 65 74 75 72 6e 20 53  *)id;.  return S
18270 51 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44 45  QLITE_IOCAP_UNDE
18280 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45  LETABLE_WHEN_OPE
18290 4e 20 7c 0a 20 20 20 20 20 20 20 20 20 28 28 70  N |.         ((p
182a0 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 57 49  ->ctrlFlags & WI
182b0 4e 46 49 4c 45 5f 50 53 4f 57 29 3f 53 51 4c 49  NFILE_PSOW)?SQLI
182c0 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53 41  TE_IOCAP_POWERSA
182d0 46 45 5f 4f 56 45 52 57 52 49 54 45 3a 30 29 3b  FE_OVERWRITE:0);
182e0 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 57 69 6e 64 6f  .}../* .** Windo
182f0 77 73 20 77 69 6c 6c 20 6f 6e 6c 79 20 6c 65 74  ws will only let
18300 20 79 6f 75 20 63 72 65 61 74 65 20 66 69 6c 65   you create file
18310 20 76 69 65 77 20 6d 61 70 70 69 6e 67 73 0a 2a   view mappings.*
18320 2a 20 6f 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  * on allocation 
18330 73 69 7a 65 20 67 72 61 6e 75 6c 61 72 69 74 79  size granularity
18340 20 62 6f 75 6e 64 61 72 69 65 73 2e 0a 2a 2a 20   boundaries..** 
18350 44 75 72 69 6e 67 20 73 71 6c 69 74 65 33 5f 6f  During sqlite3_o
18360 73 5f 69 6e 69 74 28 29 20 77 65 20 64 6f 20 61  s_init() we do a
18370 20 47 65 74 53 79 73 74 65 6d 49 6e 66 6f 28 29   GetSystemInfo()
18380 0a 2a 2a 20 74 6f 20 67 65 74 20 74 68 65 20 67  .** to get the g
18390 72 61 6e 75 6c 61 72 69 74 79 20 73 69 7a 65 2e  ranularity size.
183a0 0a 2a 2f 0a 53 59 53 54 45 4d 5f 49 4e 46 4f 20  .*/.SYSTEM_INFO 
183b0 77 69 6e 53 79 73 49 6e 66 6f 3b 0a 0a 23 69 66  winSysInfo;..#if
183c0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
183d0 5f 57 41 4c 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c 70  _WAL../*.** Help
183e0 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20  er functions to 
183f0 6f 62 74 61 69 6e 20 61 6e 64 20 72 65 6c 69 6e  obtain and relin
18400 71 75 69 73 68 20 74 68 65 20 67 6c 6f 62 61 6c  quish the global
18410 20 6d 75 74 65 78 2e 20 54 68 65 0a 2a 2a 20 67   mutex. The.** g
18420 6c 6f 62 61 6c 20 6d 75 74 65 78 20 69 73 20 75  lobal mutex is u
18430 73 65 64 20 74 6f 20 70 72 6f 74 65 63 74 20 74  sed to protect t
18440 68 65 20 77 69 6e 4c 6f 63 6b 49 6e 66 6f 20 6f  he winLockInfo o
18450 62 6a 65 63 74 73 20 75 73 65 64 20 62 79 20 0a  bjects used by .
18460 2a 2a 20 74 68 69 73 20 66 69 6c 65 2c 20 61 6c  ** this file, al
18470 6c 20 6f 66 20 77 68 69 63 68 20 6d 61 79 20 62  l of which may b
18480 65 20 73 68 61 72 65 64 20 62 79 20 6d 75 6c 74  e shared by mult
18490 69 70 6c 65 20 74 68 72 65 61 64 73 2e 0a 2a 2a  iple threads..**
184a0 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 77 69 6e  .** Function win
184b0 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 69  ShmMutexHeld() i
184c0 73 20 75 73 65 64 20 74 6f 20 61 73 73 65 72 74  s used to assert
184d0 28 29 20 74 68 61 74 20 74 68 65 20 67 6c 6f 62  () that the glob
184e0 61 6c 20 6d 75 74 65 78 20 0a 2a 2a 20 69 73 20  al mutex .** is 
184f0 68 65 6c 64 20 77 68 65 6e 20 72 65 71 75 69 72  held when requir
18500 65 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ed. This functio
18510 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 61  n is only used a
18520 73 20 70 61 72 74 20 6f 66 20 61 73 73 65 72 74  s part of assert
18530 28 29 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  () .** statement
18540 73 2e 20 65 2e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20  s. e.g..**.**   
18550 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78  winShmEnterMutex
18560 28 29 0a 2a 2a 20 20 20 20 20 61 73 73 65 72 74  ().**     assert
18570 28 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c  ( winShmMutexHel
18580 64 28 29 20 29 3b 0a 2a 2a 20 20 20 77 69 6e 53  d() );.**   winS
18590 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 0a 2a  hmLeaveMutex().*
185a0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69  /.static void wi
185b0 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 76  nShmEnterMutex(v
185c0 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  oid){.  sqlite3_
185d0 6d 75 74 65 78 5f 65 6e 74 65 72 28 73 71 6c 69  mutex_enter(sqli
185e0 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
185f0 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
18600 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 73 74  C_MASTER));.}.st
18610 61 74 69 63 20 76 6f 69 64 20 77 69 6e 53 68 6d  atic void winShm
18620 4c 65 61 76 65 4d 75 74 65 78 28 76 6f 69 64 29  LeaveMutex(void)
18630 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  {.  sqlite3_mute
18640 78 5f 6c 65 61 76 65 28 73 71 6c 69 74 65 33 4d  x_leave(sqlite3M
18650 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
18660 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41  _MUTEX_STATIC_MA
18670 53 54 45 52 29 29 3b 0a 7d 0a 23 69 66 64 65 66  STER));.}.#ifdef
18680 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 73 74   SQLITE_DEBUG.st
18690 61 74 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 4d  atic int winShmM
186a0 75 74 65 78 48 65 6c 64 28 76 6f 69 64 29 20 7b  utexHeld(void) {
186b0 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
186c0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 73 71 6c  3_mutex_held(sql
186d0 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
186e0 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
186f0 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 23  IC_MASTER));.}.#
18700 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a  endif../*.** Obj
18710 65 63 74 20 75 73 65 64 20 74 6f 20 72 65 70 72  ect used to repr
18720 65 73 65 6e 74 20 61 20 73 69 6e 67 6c 65 20 66  esent a single f
18730 69 6c 65 20 6f 70 65 6e 65 64 20 61 6e 64 20 6d  ile opened and m
18740 6d 61 70 70 65 64 20 74 6f 20 70 72 6f 76 69 64  mapped to provid
18750 65 0a 2a 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f  e.** shared memo
18760 72 79 2e 20 20 57 68 65 6e 20 6d 75 6c 74 69 70  ry.  When multip
18770 6c 65 20 74 68 72 65 61 64 73 20 61 6c 6c 20 72  le threads all r
18780 65 66 65 72 65 6e 63 65 20 74 68 65 20 73 61 6d  eference the sam
18790 65 0a 2a 2a 20 6c 6f 67 2d 73 75 6d 6d 61 72 79  e.** log-summary
187a0 2c 20 65 61 63 68 20 74 68 72 65 61 64 20 68 61  , each thread ha
187b0 73 20 69 74 73 20 6f 77 6e 20 77 69 6e 46 69 6c  s its own winFil
187c0 65 20 6f 62 6a 65 63 74 2c 20 62 75 74 20 74 68  e object, but th
187d0 65 79 20 61 6c 6c 0a 2a 2a 20 70 6f 69 6e 74 20  ey all.** point 
187e0 74 6f 20 61 20 73 69 6e 67 6c 65 20 69 6e 73 74  to a single inst
187f0 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62 6a  ance of this obj
18800 65 63 74 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  ect.  In other w
18810 6f 72 64 73 2c 20 65 61 63 68 0a 2a 2a 20 6c 6f  ords, each.** lo
18820 67 2d 73 75 6d 6d 61 72 79 20 69 73 20 6f 70 65  g-summary is ope
18830 6e 65 64 20 6f 6e 6c 79 20 6f 6e 63 65 20 70 65  ned only once pe
18840 72 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a  r process..**.**
18850 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64   winShmMutexHeld
18860 28 29 20 6d 75 73 74 20 62 65 20 74 72 75 65 20  () must be true 
18870 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20 6f 72  when creating or
18880 20 64 65 73 74 72 6f 79 69 6e 67 0a 2a 2a 20 74   destroying.** t
18890 68 69 73 20 6f 62 6a 65 63 74 20 6f 72 20 77 68  his object or wh
188a0 69 6c 65 20 72 65 61 64 69 6e 67 20 6f 72 20 77  ile reading or w
188b0 72 69 74 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f  riting the follo
188c0 77 69 6e 67 20 66 69 65 6c 64 73 3a 0a 2a 2a 0a  wing fields:.**.
188d0 2a 2a 20 20 20 20 20 20 6e 52 65 66 0a 2a 2a 20  **      nRef.** 
188e0 20 20 20 20 20 70 4e 65 78 74 20 0a 2a 2a 0a 2a       pNext .**.*
188f0 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
18900 66 69 65 6c 64 73 20 61 72 65 20 72 65 61 64 2d  fields are read-
18910 6f 6e 6c 79 20 61 66 74 65 72 20 74 68 65 20 6f  only after the o
18920 62 6a 65 63 74 20 69 73 20 63 72 65 61 74 65 64  bject is created
18930 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20 20 66 69  :.** .**      fi
18940 64 0a 2a 2a 20 20 20 20 20 20 7a 46 69 6c 65 6e  d.**      zFilen
18950 61 6d 65 0a 2a 2a 0a 2a 2a 20 45 69 74 68 65 72  ame.**.** Either
18960 20 77 69 6e 53 68 6d 4e 6f 64 65 2e 6d 75 74 65   winShmNode.mute
18970 78 20 6d 75 73 74 20 62 65 20 68 65 6c 64 20 6f  x must be held o
18980 72 20 77 69 6e 53 68 6d 4e 6f 64 65 2e 6e 52 65  r winShmNode.nRe
18990 66 3d 3d 30 20 61 6e 64 0a 2a 2a 20 77 69 6e 53  f==0 and.** winS
189a0 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 69 73  hmMutexHeld() is
189b0 20 74 72 75 65 20 77 68 65 6e 20 72 65 61 64 69   true when readi
189c0 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 61 6e  ng or writing an
189d0 79 20 6f 74 68 65 72 20 66 69 65 6c 64 0a 2a 2a  y other field.**
189e0 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75   in this structu
189f0 72 65 2e 0a 2a 2a 0a 2a 2f 0a 73 74 72 75 63 74  re..**.*/.struct
18a00 20 77 69 6e 53 68 6d 4e 6f 64 65 20 7b 0a 20 20   winShmNode {.  
18a10 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d  sqlite3_mutex *m
18a20 75 74 65 78 3b 20 20 20 20 20 20 2f 2a 20 4d 75  utex;      /* Mu
18a30 74 65 78 20 74 6f 20 61 63 63 65 73 73 20 74 68  tex to access th
18a40 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63  is object */.  c
18a50 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20  har *zFilename; 
18a60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
18a70 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 2a 2f  e of the file */
18a80 0a 20 20 77 69 6e 46 69 6c 65 20 68 46 69 6c 65  .  winFile hFile
18a90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
18aa0 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 66 72 6f   File handle fro
18ab0 6d 20 77 69 6e 4f 70 65 6e 20 2a 2f 0a 0a 20 20  m winOpen */..  
18ac0 69 6e 74 20 73 7a 52 65 67 69 6f 6e 3b 20 20 20  int szRegion;   
18ad0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
18ae0 7a 65 20 6f 66 20 73 68 61 72 65 64 2d 6d 65 6d  ze of shared-mem
18af0 6f 72 79 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20  ory regions */. 
18b00 20 69 6e 74 20 6e 52 65 67 69 6f 6e 3b 20 20 20   int nRegion;   
18b10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
18b20 69 7a 65 20 6f 66 20 61 72 72 61 79 20 61 70 52  ize of array apR
18b30 65 67 69 6f 6e 20 2a 2f 0a 20 20 73 74 72 75 63  egion */.  struc
18b40 74 20 53 68 6d 52 65 67 69 6f 6e 20 7b 0a 20 20  t ShmRegion {.  
18b50 20 20 48 41 4e 44 4c 45 20 68 4d 61 70 3b 20 20    HANDLE hMap;  
18b60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
18b70 6c 65 20 68 61 6e 64 6c 65 20 66 72 6f 6d 20 43  le handle from C
18b80 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67  reateFileMapping
18b90 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 4d   */.    void *pM
18ba0 61 70 3b 0a 20 20 7d 20 2a 61 52 65 67 69 6f 6e  ap;.  } *aRegion
18bb0 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72  ;.  DWORD lastEr
18bc0 72 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f  rno;           /
18bd0 2a 20 54 68 65 20 57 69 6e 64 6f 77 73 20 65 72  * The Windows er
18be0 72 6e 6f 20 66 72 6f 6d 20 74 68 65 20 6c 61 73  rno from the las
18bf0 74 20 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a 0a  t I/O error */..
18c00 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20    int nRef;     
18c10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18c20 4e 75 6d 62 65 72 20 6f 66 20 77 69 6e 53 68 6d  Number of winShm
18c30 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e   objects pointin
18c40 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a 20 20 77  g to this */.  w
18c50 69 6e 53 68 6d 20 2a 70 46 69 72 73 74 3b 20 20  inShm *pFirst;  
18c60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
18c70 20 77 69 6e 53 68 6d 20 6f 62 6a 65 63 74 73 20   winShm objects 
18c80 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 69 73  pointing to this
18c90 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65   */.  winShmNode
18ca0 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20   *pNext;        
18cb0 20 2f 2a 20 4e 65 78 74 20 69 6e 20 6c 69 73 74   /* Next in list
18cc0 20 6f 66 20 61 6c 6c 20 77 69 6e 53 68 6d 4e 6f   of all winShmNo
18cd0 64 65 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 23 69  de objects */.#i
18ce0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
18cf0 47 0a 20 20 75 38 20 6e 65 78 74 53 68 6d 49 64  G.  u8 nextShmId
18d00 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
18d10 2a 20 4e 65 78 74 20 61 76 61 69 6c 61 62 6c 65  * Next available
18d20 20 77 69 6e 53 68 6d 2e 69 64 20 76 61 6c 75 65   winShm.id value
18d30 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f   */.#endif.};../
18d40 2a 0a 2a 2a 20 41 20 67 6c 6f 62 61 6c 20 61 72  *.** A global ar
18d50 72 61 79 20 6f 66 20 61 6c 6c 20 77 69 6e 53 68  ray of all winSh
18d60 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 73 2e 0a 2a  mNode objects..*
18d70 2a 0a 2a 2a 20 54 68 65 20 77 69 6e 53 68 6d 4d  *.** The winShmM
18d80 75 74 65 78 48 65 6c 64 28 29 20 6d 75 73 74 20  utexHeld() must 
18d90 62 65 20 74 72 75 65 20 77 68 69 6c 65 20 72 65  be true while re
18da0 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ading or writing
18db0 20 74 68 69 73 20 6c 69 73 74 2e 0a 2a 2f 0a 73   this list..*/.s
18dc0 74 61 74 69 63 20 77 69 6e 53 68 6d 4e 6f 64 65  tatic winShmNode
18dd0 20 2a 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74   *winShmNodeList
18de0 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 53 74 72   = 0;../*.** Str
18df0 75 63 74 75 72 65 20 75 73 65 64 20 69 6e 74 65  ucture used inte
18e00 72 6e 61 6c 6c 79 20 62 79 20 74 68 69 73 20 56  rnally by this V
18e10 46 53 20 74 6f 20 72 65 63 6f 72 64 20 74 68 65  FS to record the
18e20 20 73 74 61 74 65 20 6f 66 20 61 6e 0a 2a 2a 20   state of an.** 
18e30 6f 70 65 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f  open shared memo
18e40 72 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a  ry connection..*
18e50 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
18e60 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20 69 6e  ng fields are in
18e70 69 74 69 61 6c 69 7a 65 64 20 77 68 65 6e 20 74  itialized when t
18e80 68 69 73 20 6f 62 6a 65 63 74 20 69 73 20 63 72  his object is cr
18e90 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20 61 72 65  eated and.** are
18ea0 20 72 65 61 64 2d 6f 6e 6c 79 20 74 68 65 72 65   read-only there
18eb0 61 66 74 65 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  after:.**.**    
18ec0 77 69 6e 53 68 6d 2e 70 53 68 6d 4e 6f 64 65 0a  winShm.pShmNode.
18ed0 2a 2a 20 20 20 20 77 69 6e 53 68 6d 2e 69 64 0a  **    winShm.id.
18ee0 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 74 68 65 72 20  **.** All other 
18ef0 66 69 65 6c 64 73 20 61 72 65 20 72 65 61 64 2f  fields are read/
18f00 77 72 69 74 65 2e 20 20 54 68 65 20 77 69 6e 53  write.  The winS
18f10 68 6d 2e 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  hm.pShmNode->mut
18f20 65 78 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a  ex must be held.
18f30 2a 2a 20 77 68 69 6c 65 20 61 63 63 65 73 73 69  ** while accessi
18f40 6e 67 20 61 6e 79 20 72 65 61 64 2f 77 72 69 74  ng any read/writ
18f50 65 20 66 69 65 6c 64 73 2e 0a 2a 2f 0a 73 74 72  e fields..*/.str
18f60 75 63 74 20 77 69 6e 53 68 6d 20 7b 0a 20 20 77  uct winShm {.  w
18f70 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e  inShmNode *pShmN
18f80 6f 64 65 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  ode;      /* The
18f90 20 75 6e 64 65 72 6c 79 69 6e 67 20 77 69 6e 53   underlying winS
18fa0 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 2a 2f  hmNode object */
18fb0 0a 20 20 77 69 6e 53 68 6d 20 2a 70 4e 65 78 74  .  winShm *pNext
18fc0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
18fd0 20 4e 65 78 74 20 77 69 6e 53 68 6d 20 77 69 74   Next winShm wit
18fe0 68 20 74 68 65 20 73 61 6d 65 20 77 69 6e 53 68  h the same winSh
18ff0 6d 4e 6f 64 65 20 2a 2f 0a 20 20 75 38 20 68 61  mNode */.  u8 ha
19000 73 4d 75 74 65 78 3b 20 20 20 20 20 20 20 20 20  sMutex;         
19010 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
19020 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 77 69 6e   holding the win
19030 53 68 6d 4e 6f 64 65 20 6d 75 74 65 78 20 2a 2f  ShmNode mutex */
19040 0a 20 20 75 31 36 20 73 68 61 72 65 64 4d 61 73  .  u16 sharedMas
19050 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  k;            /*
19060 20 4d 61 73 6b 20 6f 66 20 73 68 61 72 65 64 20   Mask of shared 
19070 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20  locks held */.  
19080 75 31 36 20 65 78 63 6c 4d 61 73 6b 3b 20 20 20  u16 exclMask;   
19090 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
190a0 73 6b 20 6f 66 20 65 78 63 6c 75 73 69 76 65 20  sk of exclusive 
190b0 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 23 69  locks held */.#i
190c0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
190d0 47 0a 20 20 75 38 20 69 64 3b 20 20 20 20 20 20  G.  u8 id;      
190e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
190f0 2a 20 49 64 20 6f 66 20 74 68 69 73 20 63 6f 6e  * Id of this con
19100 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 69 74 73  nection with its
19110 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 23   winShmNode */.#
19120 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  endif.};../*.** 
19130 43 6f 6e 73 74 61 6e 74 73 20 75 73 65 64 20 66  Constants used f
19140 6f 72 20 6c 6f 63 6b 69 6e 67 0a 2a 2f 0a 23 64  or locking.*/.#d
19150 65 66 69 6e 65 20 57 49 4e 5f 53 48 4d 5f 42 41  efine WIN_SHM_BA
19160 53 45 20 20 20 28 28 32 32 2b 53 51 4c 49 54 45  SE   ((22+SQLITE
19170 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 2a 34 29 20 20  _SHM_NLOCK)*4)  
19180 20 20 20 20 20 20 2f 2a 20 66 69 72 73 74 20 6c        /* first l
19190 6f 63 6b 20 62 79 74 65 20 2a 2f 0a 23 64 65 66  ock byte */.#def
191a0 69 6e 65 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 20  ine WIN_SHM_DMS 
191b0 20 20 20 28 57 49 4e 5f 53 48 4d 5f 42 41 53 45     (WIN_SHM_BASE
191c0 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43  +SQLITE_SHM_NLOC
191d0 4b 29 20 20 2f 2a 20 64 65 61 64 6d 61 6e 20 73  K)  /* deadman s
191e0 77 69 74 63 68 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  witch */../*.** 
191f0 41 70 70 6c 79 20 61 64 76 69 73 6f 72 79 20 6c  Apply advisory l
19200 6f 63 6b 73 20 66 6f 72 20 61 6c 6c 20 6e 20 62  ocks for all n b
19210 79 74 65 73 20 62 65 67 69 6e 6e 69 6e 67 20 61  ytes beginning a
19220 74 20 6f 66 73 74 2e 0a 2a 2f 0a 23 64 65 66 69  t ofst..*/.#defi
19230 6e 65 20 5f 53 48 4d 5f 55 4e 4c 43 4b 20 20 31  ne _SHM_UNLCK  1
19240 0a 23 64 65 66 69 6e 65 20 5f 53 48 4d 5f 52 44  .#define _SHM_RD
19250 4c 43 4b 20 20 32 0a 23 64 65 66 69 6e 65 20 5f  LCK  2.#define _
19260 53 48 4d 5f 57 52 4c 43 4b 20 20 33 0a 73 74 61  SHM_WRLCK  3.sta
19270 74 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 53 79  tic int winShmSy
19280 73 74 65 6d 4c 6f 63 6b 28 0a 20 20 77 69 6e 53  stemLock(.  winS
19290 68 6d 4e 6f 64 65 20 2a 70 46 69 6c 65 2c 20 20  hmNode *pFile,  
192a0 20 20 2f 2a 20 41 70 70 6c 79 20 6c 6f 63 6b 73    /* Apply locks
192b0 20 74 6f 20 74 68 69 73 20 6f 70 65 6e 20 73 68   to this open sh
192c0 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d  ared-memory segm
192d0 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 6f 63  ent */.  int loc
192e0 6b 54 79 70 65 2c 20 20 20 20 20 20 20 20 20 2f  kType,         /
192f0 2a 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20 5f 53  * _SHM_UNLCK, _S
19300 48 4d 5f 52 44 4c 43 4b 2c 20 6f 72 20 5f 53 48  HM_RDLCK, or _SH
19310 4d 5f 57 52 4c 43 4b 20 2a 2f 0a 20 20 69 6e 74  M_WRLCK */.  int
19320 20 6f 66 73 74 2c 20 20 20 20 20 20 20 20 20 20   ofst,          
19330 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
19340 66 69 72 73 74 20 62 79 74 65 20 74 6f 20 62 65  first byte to be
19350 20 6c 6f 63 6b 65 64 2f 75 6e 6c 6f 63 6b 65 64   locked/unlocked
19360 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 20   */.  int nByte 
19370 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
19380 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
19390 6f 20 6c 6f 63 6b 20 6f 72 20 75 6e 6c 6f 63 6b  o lock or unlock
193a0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
193b0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
193c0 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66 6f  * Result code fo
193d0 72 6d 20 4c 6f 63 6b 2f 55 6e 6c 6f 63 6b 46 69  rm Lock/UnlockFi
193e0 6c 65 45 78 28 29 20 2a 2f 0a 0a 20 20 2f 2a 20  leEx() */..  /* 
193f0 41 63 63 65 73 73 20 74 6f 20 74 68 65 20 77 69  Access to the wi
19400 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20  nShmNode object 
19410 69 73 20 73 65 72 69 61 6c 69 7a 65 64 20 62 79  is serialized by
19420 20 74 68 65 20 63 61 6c 6c 65 72 20 2a 2f 0a 20   the caller */. 
19430 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
19440 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 46 69 6c  _mutex_held(pFil
19450 65 2d 3e 6d 75 74 65 78 29 20 7c 7c 20 70 46 69  e->mutex) || pFi
19460 6c 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a  le->nRef==0 );..
19470 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d    OSTRACE(("SHM-
19480 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6c 6f  LOCK file=%p, lo
19490 63 6b 3d 25 64 2c 20 6f 66 66 73 65 74 3d 25 64  ck=%d, offset=%d
194a0 2c 20 73 69 7a 65 3d 25 64 5c 6e 22 2c 0a 20 20  , size=%d\n",.  
194b0 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
194c0 68 46 69 6c 65 2e 68 2c 20 6c 6f 63 6b 54 79 70  hFile.h, lockTyp
194d0 65 2c 20 6f 66 73 74 2c 20 6e 42 79 74 65 29 29  e, ofst, nByte))
194e0 3b 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73 65 2f  ;..  /* Release/
194f0 41 63 71 75 69 72 65 20 74 68 65 20 73 79 73 74  Acquire the syst
19500 65 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b 20 2a 2f  em-level lock */
19510 0a 20 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d  .  if( lockType=
19520 3d 5f 53 48 4d 5f 55 4e 4c 43 4b 20 29 7b 0a 20  =_SHM_UNLCK ){. 
19530 20 20 20 72 63 20 3d 20 77 69 6e 55 6e 6c 6f 63     rc = winUnloc
19540 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 46  kFile(&pFile->hF
19550 69 6c 65 2e 68 2c 20 6f 66 73 74 2c 20 30 2c 20  ile.h, ofst, 0, 
19560 6e 42 79 74 65 2c 20 30 29 3b 0a 20 20 7d 65 6c  nByte, 0);.  }el
19570 73 65 7b 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69  se{.    /* Initi
19580 61 6c 69 7a 65 20 74 68 65 20 6c 6f 63 6b 69 6e  alize the lockin
19590 67 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a  g parameters */.
195a0 20 20 20 20 44 57 4f 52 44 20 64 77 46 6c 61 67      DWORD dwFlag
195b0 73 20 3d 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49  s = LOCKFILE_FAI
195c0 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 3b 0a 20  L_IMMEDIATELY;. 
195d0 20 20 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 20     if( lockType 
195e0 3d 3d 20 5f 53 48 4d 5f 57 52 4c 43 4b 20 29 20  == _SHM_WRLCK ) 
195f0 64 77 46 6c 61 67 73 20 7c 3d 20 4c 4f 43 4b 46  dwFlags |= LOCKF
19600 49 4c 45 5f 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ILE_EXCLUSIVE_LO
19610 43 4b 3b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e  CK;.    rc = win
19620 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d  LockFile(&pFile-
19630 3e 68 46 69 6c 65 2e 68 2c 20 64 77 46 6c 61 67  >hFile.h, dwFlag
19640 73 2c 20 6f 66 73 74 2c 20 30 2c 20 6e 42 79 74  s, ofst, 0, nByt
19650 65 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 0a 20 20  e, 0);.  }.  .  
19660 69 66 28 20 72 63 21 3d 20 30 20 29 7b 0a 20 20  if( rc!= 0 ){.  
19670 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
19680 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
19690 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
196a0 3d 20 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f  =  osGetLastErro
196b0 72 28 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  r();.    rc = SQ
196c0 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a  LITE_BUSY;.  }..
196d0 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d    OSTRACE(("SHM-
196e0 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 66 75  LOCK file=%p, fu
196f0 6e 63 3d 25 73 2c 20 65 72 72 6e 6f 3d 25 6c 75  nc=%s, errno=%lu
19700 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20  , rc=%s\n",.    
19710 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 46         pFile->hF
19720 69 6c 65 2e 68 2c 20 28 6c 6f 63 6b 54 79 70 65  ile.h, (lockType
19730 20 3d 3d 20 5f 53 48 4d 5f 55 4e 4c 43 4b 29 20   == _SHM_UNLCK) 
19740 3f 20 22 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65  ? "winUnlockFile
19750 22 20 3a 0a 20 20 20 20 20 20 20 20 20 20 20 22  " :.           "
19760 77 69 6e 4c 6f 63 6b 46 69 6c 65 22 2c 20 70 46  winLockFile", pF
19770 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 20  ile->lastErrno, 
19780 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72  sqlite3ErrName(r
19790 63 29 29 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  c)));..  return 
197a0 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72  rc;.}../* Forwar
197b0 64 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  d references to 
197c0 56 46 53 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 73  VFS methods */.s
197d0 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4f 70 65  tatic int winOpe
197e0 6e 28 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c 63  n(sqlite3_vfs*,c
197f0 6f 6e 73 74 20 63 68 61 72 2a 2c 73 71 6c 69 74  onst char*,sqlit
19800 65 33 5f 66 69 6c 65 2a 2c 69 6e 74 2c 69 6e 74  e3_file*,int,int
19810 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77  *);.static int w
19820 69 6e 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33  inDelete(sqlite3
19830 5f 76 66 73 20 2a 2c 63 6f 6e 73 74 20 63 68 61  _vfs *,const cha
19840 72 2a 2c 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20  r*,int);../*.** 
19850 50 75 72 67 65 20 74 68 65 20 77 69 6e 53 68 6d  Purge the winShm
19860 4e 6f 64 65 4c 69 73 74 20 6c 69 73 74 20 6f 66  NodeList list of
19870 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 77 69 74   all entries wit
19880 68 20 77 69 6e 53 68 6d 4e 6f 64 65 2e 6e 52 65  h winShmNode.nRe
19890 66 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  f==0..**.** This
198a0 20 69 73 20 6e 6f 74 20 61 20 56 46 53 20 73 68   is not a VFS sh
198b0 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 74 68  ared-memory meth
198c0 6f 64 3b 20 69 74 20 69 73 20 61 20 75 74 69 6c  od; it is a util
198d0 69 74 79 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c  ity function cal
198e0 6c 65 64 0a 2a 2a 20 62 79 20 56 46 53 20 73 68  led.** by VFS sh
198f0 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 74 68  ared-memory meth
19900 6f 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ods..*/.static v
19910 6f 69 64 20 77 69 6e 53 68 6d 50 75 72 67 65 28  oid winShmPurge(
19920 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
19930 73 2c 20 69 6e 74 20 64 65 6c 65 74 65 46 6c 61  s, int deleteFla
19940 67 29 7b 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65  g){.  winShmNode
19950 20 2a 2a 70 70 3b 0a 20 20 77 69 6e 53 68 6d 4e   **pp;.  winShmN
19960 6f 64 65 20 2a 70 3b 0a 20 20 61 73 73 65 72 74  ode *p;.  assert
19970 28 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c  ( winShmMutexHel
19980 64 28 29 20 29 3b 0a 20 20 4f 53 54 52 41 43 45  d() );.  OSTRACE
19990 28 28 22 53 48 4d 2d 50 55 52 47 45 20 70 69 64  (("SHM-PURGE pid
199a0 3d 25 6c 75 2c 20 64 65 6c 65 74 65 46 6c 61 67  =%lu, deleteFlag
199b0 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%d\n",.        
199c0 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50     osGetCurrentP
199d0 72 6f 63 65 73 73 49 64 28 29 2c 20 64 65 6c 65  rocessId(), dele
199e0 74 65 46 6c 61 67 29 29 3b 0a 20 20 70 70 20 3d  teFlag));.  pp =
199f0 20 26 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74   &winShmNodeList
19a00 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 20 3d 20  ;.  while( (p = 
19a10 2a 70 70 29 21 3d 30 20 29 7b 0a 20 20 20 20 69  *pp)!=0 ){.    i
19a20 66 28 20 70 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b  f( p->nRef==0 ){
19a30 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
19a40 20 20 20 20 69 66 28 20 70 2d 3e 6d 75 74 65 78      if( p->mutex
19a50 20 29 7b 20 73 71 6c 69 74 65 33 5f 6d 75 74 65   ){ sqlite3_mute
19a60 78 5f 66 72 65 65 28 70 2d 3e 6d 75 74 65 78 29  x_free(p->mutex)
19a70 3b 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  ; }.      for(i=
19a80 30 3b 20 69 3c 70 2d 3e 6e 52 65 67 69 6f 6e 3b  0; i<p->nRegion;
19a90 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 42   i++){.        B
19aa0 4f 4f 4c 20 62 52 63 20 3d 20 6f 73 55 6e 6d 61  OOL bRc = osUnma
19ab0 70 56 69 65 77 4f 66 46 69 6c 65 28 70 2d 3e 61  pViewOfFile(p->a
19ac0 52 65 67 69 6f 6e 5b 69 5d 2e 70 4d 61 70 29 3b  Region[i].pMap);
19ad0 0a 20 20 20 20 20 20 20 20 4f 53 54 52 41 43 45  .        OSTRACE
19ae0 28 28 22 53 48 4d 2d 50 55 52 47 45 2d 55 4e 4d  (("SHM-PURGE-UNM
19af0 41 50 20 70 69 64 3d 25 6c 75 2c 20 72 65 67 69  AP pid=%lu, regi
19b00 6f 6e 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22 2c  on=%d, rc=%s\n",
19b10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19b20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72    osGetCurrentPr
19b30 6f 63 65 73 73 49 64 28 29 2c 20 69 2c 20 62 52  ocessId(), i, bR
19b40 63 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c  c ? "ok" : "fail
19b50 65 64 22 29 29 3b 0a 20 20 20 20 20 20 20 20 55  ed"));.        U
19b60 4e 55 53 45 44 5f 56 41 52 49 41 42 4c 45 5f 56  NUSED_VARIABLE_V
19b70 41 4c 55 45 28 62 52 63 29 3b 0a 20 20 20 20 20  ALUE(bRc);.     
19b80 20 20 20 62 52 63 20 3d 20 6f 73 43 6c 6f 73 65     bRc = osClose
19b90 48 61 6e 64 6c 65 28 70 2d 3e 61 52 65 67 69 6f  Handle(p->aRegio
19ba0 6e 5b 69 5d 2e 68 4d 61 70 29 3b 0a 20 20 20 20  n[i].hMap);.    
19bb0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 53 48      OSTRACE(("SH
19bc0 4d 2d 50 55 52 47 45 2d 43 4c 4f 53 45 20 70 69  M-PURGE-CLOSE pi
19bd0 64 3d 25 6c 75 2c 20 72 65 67 69 6f 6e 3d 25 64  d=%lu, region=%d
19be0 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20  , rc=%s\n",.    
19bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47               osG
19c00 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
19c10 49 64 28 29 2c 20 69 2c 20 62 52 63 20 3f 20 22  Id(), i, bRc ? "
19c20 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29  ok" : "failed"))
19c30 3b 0a 20 20 20 20 20 20 20 20 55 4e 55 53 45 44  ;.        UNUSED
19c40 5f 56 41 52 49 41 42 4c 45 5f 56 41 4c 55 45 28  _VARIABLE_VALUE(
19c50 62 52 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  bRc);.      }.  
19c60 20 20 20 20 69 66 28 20 70 2d 3e 68 46 69 6c 65      if( p->hFile
19c70 2e 68 21 3d 4e 55 4c 4c 20 26 26 20 70 2d 3e 68  .h!=NULL && p->h
19c80 46 69 6c 65 2e 68 21 3d 49 4e 56 41 4c 49 44 5f  File.h!=INVALID_
19c90 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 7b 0a  HANDLE_VALUE ){.
19ca0 20 20 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65          Simulate
19cb0 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29  IOErrorBenign(1)
19cc0 3b 0a 20 20 20 20 20 20 20 20 77 69 6e 43 6c 6f  ;.        winClo
19cd0 73 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  se((sqlite3_file
19ce0 20 2a 29 26 70 2d 3e 68 46 69 6c 65 29 3b 0a 20   *)&p->hFile);. 
19cf0 20 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49         SimulateI
19d00 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b  OErrorBenign(0);
19d10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
19d20 66 28 20 64 65 6c 65 74 65 46 6c 61 67 20 29 7b  f( deleteFlag ){
19d30 0a 20 20 20 20 20 20 20 20 53 69 6d 75 6c 61 74  .        Simulat
19d40 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31  eIOErrorBenign(1
19d50 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
19d60 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
19d70 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20 77  loc();.        w
19d80 69 6e 44 65 6c 65 74 65 28 70 56 66 73 2c 20 70  inDelete(pVfs, p
19d90 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 30 29 3b  ->zFilename, 0);
19da0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
19db0 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
19dc0 29 3b 0a 20 20 20 20 20 20 20 20 53 69 6d 75 6c  );.        Simul
19dd0 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
19de0 28 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  (0);.      }.   
19df0 20 20 20 2a 70 70 20 3d 20 70 2d 3e 70 4e 65 78     *pp = p->pNex
19e00 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
19e10 5f 66 72 65 65 28 70 2d 3e 61 52 65 67 69 6f 6e  _free(p->aRegion
19e20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
19e30 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 7d 65  _free(p);.    }e
19e40 6c 73 65 7b 0a 20 20 20 20 20 20 70 70 20 3d 20  lse{.      pp = 
19e50 26 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d  &p->pNext;.    }
19e60 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70  .  }.}../*.** Op
19e70 65 6e 20 74 68 65 20 73 68 61 72 65 64 2d 6d 65  en the shared-me
19e80 6d 6f 72 79 20 61 72 65 61 20 61 73 73 6f 63 69  mory area associ
19e90 61 74 65 64 20 77 69 74 68 20 64 61 74 61 62 61  ated with databa
19ea0 73 65 20 66 69 6c 65 20 70 44 62 46 64 2e 0a 2a  se file pDbFd..*
19eb0 2a 0a 2a 2a 20 57 68 65 6e 20 6f 70 65 6e 69 6e  *.** When openin
19ec0 67 20 61 20 6e 65 77 20 73 68 61 72 65 64 2d 6d  g a new shared-m
19ed0 65 6d 6f 72 79 20 66 69 6c 65 2c 20 69 66 20 6e  emory file, if n
19ee0 6f 20 6f 74 68 65 72 20 69 6e 73 74 61 6e 63 65  o other instance
19ef0 73 20 6f 66 20 74 68 61 74 0a 2a 2a 20 66 69 6c  s of that.** fil
19f00 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20  e are currently 
19f10 6f 70 65 6e 2c 20 69 6e 20 74 68 69 73 20 70 72  open, in this pr
19f20 6f 63 65 73 73 20 6f 72 20 69 6e 20 6f 74 68 65  ocess or in othe
19f30 72 20 70 72 6f 63 65 73 73 65 73 2c 20 74 68 65  r processes, the
19f40 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20 6d 75  n.** the file mu
19f50 73 74 20 62 65 20 74 72 75 6e 63 61 74 65 64 20  st be truncated 
19f60 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68 20 6f  to zero length o
19f70 72 20 68 61 76 65 20 69 74 73 20 68 65 61 64 65  r have its heade
19f80 72 20 63 6c 65 61 72 65 64 2e 0a 2a 2f 0a 73 74  r cleared..*/.st
19f90 61 74 69 63 20 69 6e 74 20 77 69 6e 4f 70 65 6e  atic int winOpen
19fa0 53 68 61 72 65 64 4d 65 6d 6f 72 79 28 77 69 6e  SharedMemory(win
19fb0 46 69 6c 65 20 2a 70 44 62 46 64 29 7b 0a 20 20  File *pDbFd){.  
19fc0 73 74 72 75 63 74 20 77 69 6e 53 68 6d 20 2a 70  struct winShm *p
19fd0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
19fe0 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63     /* The connec
19ff0 74 69 6f 6e 20 74 6f 20 62 65 20 6f 70 65 6e 65  tion to be opene
1a000 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 77 69  d */.  struct wi
1a010 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f  nShmNode *pShmNo
1a020 64 65 20 3d 20 30 3b 20 20 20 2f 2a 20 54 68 65  de = 0;   /* The
1a030 20 75 6e 64 65 72 6c 79 69 6e 67 20 6d 6d 61 70   underlying mmap
1a040 70 65 64 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  ped file */.  in
1a050 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
1a060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a070 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
1a080 2a 2f 0a 20 20 73 74 72 75 63 74 20 77 69 6e 53  */.  struct winS
1a090 68 6d 4e 6f 64 65 20 2a 70 4e 65 77 3b 20 20 20  hmNode *pNew;   
1a0a0 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 6c 79          /* Newly
1a0b0 20 61 6c 6c 6f 63 61 74 65 64 20 77 69 6e 53 68   allocated winSh
1a0c0 6d 4e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  mNode */.  int n
1a0d0 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  Name;           
1a0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a0f0 20 53 69 7a 65 20 6f 66 20 7a 4e 61 6d 65 20 69   Size of zName i
1a100 6e 20 62 79 74 65 73 20 2a 2f 0a 0a 20 20 61 73  n bytes */..  as
1a110 73 65 72 74 28 20 70 44 62 46 64 2d 3e 70 53 68  sert( pDbFd->pSh
1a120 6d 3d 3d 30 20 29 3b 20 20 20 20 2f 2a 20 4e 6f  m==0 );    /* No
1a130 74 20 70 72 65 76 69 6f 75 73 6c 79 20 6f 70 65  t previously ope
1a140 6e 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c  ned */..  /* All
1a150 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20  ocate space for 
1a160 74 68 65 20 6e 65 77 20 73 71 6c 69 74 65 33 5f  the new sqlite3_
1a170 73 68 6d 20 6f 62 6a 65 63 74 2e 20 20 41 6c 73  shm object.  Als
1a180 6f 20 73 70 65 63 75 6c 61 74 69 76 65 6c 79 0a  o speculatively.
1a190 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 20 73 70    ** allocate sp
1a1a0 61 63 65 20 66 6f 72 20 61 20 6e 65 77 20 77 69  ace for a new wi
1a1b0 6e 53 68 6d 4e 6f 64 65 20 61 6e 64 20 66 69 6c  nShmNode and fil
1a1c0 65 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 70 20  ename..  */.  p 
1a1d0 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  = sqlite3MallocZ
1a1e0 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70 29 20  ero( sizeof(*p) 
1a1f0 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  );.  if( p==0 ) 
1a200 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
1a210 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 6e 4e 61  ERR_NOMEM;.  nNa
1a220 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  me = sqlite3Strl
1a230 65 6e 33 30 28 70 44 62 46 64 2d 3e 7a 50 61 74  en30(pDbFd->zPat
1a240 68 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c  h);.  pNew = sql
1a250 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20  ite3MallocZero( 
1a260 73 69 7a 65 6f 66 28 2a 70 53 68 6d 4e 6f 64 65  sizeof(*pShmNode
1a270 29 20 2b 20 6e 4e 61 6d 65 20 2b 20 31 37 20 29  ) + nName + 17 )
1a280 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
1a290 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
1a2a0 72 65 65 28 70 29 3b 0a 20 20 20 20 72 65 74 75  ree(p);.    retu
1a2b0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
1a2c0 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 4e 65  NOMEM;.  }.  pNe
1a2d0 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 28  w->zFilename = (
1a2e0 63 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a  char*)&pNew[1];.
1a2f0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
1a300 74 66 28 6e 4e 61 6d 65 2b 31 35 2c 20 70 4e 65  tf(nName+15, pNe
1a310 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 25  w->zFilename, "%
1a320 73 2d 73 68 6d 22 2c 20 70 44 62 46 64 2d 3e 7a  s-shm", pDbFd->z
1a330 50 61 74 68 29 3b 0a 20 20 73 71 6c 69 74 65 33  Path);.  sqlite3
1a340 46 69 6c 65 53 75 66 66 69 78 33 28 70 44 62 46  FileSuffix3(pDbF
1a350 64 2d 3e 7a 50 61 74 68 2c 20 70 4e 65 77 2d 3e  d->zPath, pNew->
1a360 7a 46 69 6c 65 6e 61 6d 65 29 3b 20 0a 0a 20 20  zFilename); ..  
1a370 2f 2a 20 4c 6f 6f 6b 20 74 6f 20 73 65 65 20 69  /* Look to see i
1a380 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 65 78  f there is an ex
1a390 69 73 74 69 6e 67 20 77 69 6e 53 68 6d 4e 6f 64  isting winShmNod
1a3a0 65 20 74 68 61 74 20 63 61 6e 20 62 65 20 75 73  e that can be us
1a3b0 65 64 2e 0a 20 20 2a 2a 20 49 66 20 6e 6f 20 6d  ed..  ** If no m
1a3c0 61 74 63 68 69 6e 67 20 77 69 6e 53 68 6d 4e 6f  atching winShmNo
1a3d0 64 65 20 63 75 72 72 65 6e 74 6c 79 20 65 78 69  de currently exi
1a3e0 73 74 73 2c 20 63 72 65 61 74 65 20 61 20 6e 65  sts, create a ne
1a3f0 77 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 77 69  w one..  */.  wi
1a400 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 29  nShmEnterMutex()
1a410 3b 0a 20 20 66 6f 72 28 70 53 68 6d 4e 6f 64 65  ;.  for(pShmNode
1a420 20 3d 20 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73   = winShmNodeLis
1a430 74 3b 20 70 53 68 6d 4e 6f 64 65 3b 20 70 53 68  t; pShmNode; pSh
1a440 6d 4e 6f 64 65 3d 70 53 68 6d 4e 6f 64 65 2d 3e  mNode=pShmNode->
1a450 70 4e 65 78 74 29 7b 0a 20 20 20 20 2f 2a 20 54  pNext){.    /* T
1a460 42 44 20 6e 65 65 64 20 74 6f 20 63 6f 6d 65 20  BD need to come 
1a470 75 70 20 77 69 74 68 20 62 65 74 74 65 72 20 6d  up with better m
1a480 61 74 63 68 20 68 65 72 65 2e 20 20 50 65 72 68  atch here.  Perh
1a490 61 70 73 0a 20 20 20 20 2a 2a 20 75 73 65 20 46  aps.    ** use F
1a4a0 49 4c 45 5f 49 44 5f 42 4f 54 48 5f 44 49 52 5f  ILE_ID_BOTH_DIR_
1a4b0 49 4e 46 4f 20 53 74 72 75 63 74 75 72 65 2e 0a  INFO Structure..
1a4c0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73      */.    if( s
1a4d0 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 53  qlite3StrICmp(pS
1a4e0 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d  hmNode->zFilenam
1a4f0 65 2c 20 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61  e, pNew->zFilena
1a500 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  me)==0 ) break;.
1a510 20 20 7d 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f    }.  if( pShmNo
1a520 64 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  de ){.    sqlite
1a530 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20  3_free(pNew);.  
1a540 7d 65 6c 73 65 7b 0a 20 20 20 20 70 53 68 6d 4e  }else{.    pShmN
1a550 6f 64 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20  ode = pNew;.    
1a560 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 28 28  pNew = 0;.    ((
1a570 77 69 6e 46 69 6c 65 2a 29 28 26 70 53 68 6d 4e  winFile*)(&pShmN
1a580 6f 64 65 2d 3e 68 46 69 6c 65 29 29 2d 3e 68 20  ode->hFile))->h 
1a590 3d 20 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  = INVALID_HANDLE
1a5a0 5f 56 41 4c 55 45 3b 0a 20 20 20 20 70 53 68 6d  _VALUE;.    pShm
1a5b0 4e 6f 64 65 2d 3e 70 4e 65 78 74 20 3d 20 77 69  Node->pNext = wi
1a5c0 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 3b 0a 20 20  nShmNodeList;.  
1a5d0 20 20 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74    winShmNodeList
1a5e0 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20   = pShmNode;..  
1a5f0 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65    pShmNode->mute
1a600 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  x = sqlite3_mute
1a610 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  x_alloc(SQLITE_M
1a620 55 54 45 58 5f 46 41 53 54 29 3b 0a 20 20 20 20  UTEX_FAST);.    
1a630 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  if( pShmNode->mu
1a640 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tex==0 ){.      
1a650 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
1a660 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67  R_NOMEM;.      g
1a670 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72  oto shm_open_err
1a680 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20  ;.    }..    rc 
1a690 3d 20 77 69 6e 4f 70 65 6e 28 70 44 62 46 64 2d  = winOpen(pDbFd-
1a6a0 3e 70 56 66 73 2c 0a 20 20 20 20 20 20 20 20 20  >pVfs,.         
1a6b0 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65          pShmNode
1a6c0 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20  ->zFilename,    
1a6d0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
1a6e0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 28 55 54   of the file (UT
1a6f0 46 2d 38 29 20 2a 2f 0a 20 20 20 20 20 20 20 20  F-8) */.        
1a700 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65           (sqlite
1a710 33 5f 66 69 6c 65 2a 29 26 70 53 68 6d 4e 6f 64  3_file*)&pShmNod
1a720 65 2d 3e 68 46 69 6c 65 2c 20 20 2f 2a 20 46 69  e->hFile,  /* Fi
1a730 6c 65 20 68 61 6e 64 6c 65 20 68 65 72 65 20 2a  le handle here *
1a740 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
1a750 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57     SQLITE_OPEN_W
1a760 41 4c 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  AL | SQLITE_OPEN
1a770 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c  _READWRITE | SQL
1a780 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c  ITE_OPEN_CREATE,
1a790 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1a7a0 20 20 30 29 3b 0a 20 20 20 20 69 66 28 20 53 51    0);.    if( SQ
1a7b0 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20  LITE_OK!=rc ){. 
1a7c0 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70       goto shm_op
1a7d0 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20  en_err;.    }.. 
1a7e0 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73     /* Check to s
1a7f0 65 65 20 69 66 20 61 6e 6f 74 68 65 72 20 70 72  ee if another pr
1a800 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67  ocess is holding
1a810 20 74 68 65 20 64 65 61 64 2d 6d 61 6e 20 73 77   the dead-man sw
1a820 69 74 63 68 2e 0a 20 20 20 20 2a 2a 20 49 66 20  itch..    ** If 
1a830 6e 6f 74 2c 20 74 72 75 6e 63 61 74 65 20 74 68  not, truncate th
1a840 65 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20 6c  e file to zero l
1a850 65 6e 67 74 68 2e 20 0a 20 20 20 20 2a 2f 0a 20  ength. .    */. 
1a860 20 20 20 69 66 28 20 77 69 6e 53 68 6d 53 79 73     if( winShmSys
1a870 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65  temLock(pShmNode
1a880 2c 20 5f 53 48 4d 5f 57 52 4c 43 4b 2c 20 57 49  , _SHM_WRLCK, WI
1a890 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3d 3d 53  N_SHM_DMS, 1)==S
1a8a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1a8b0 20 20 72 63 20 3d 20 77 69 6e 54 72 75 6e 63 61    rc = winTrunca
1a8c0 74 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  te((sqlite3_file
1a8d0 20 2a 29 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46   *)&pShmNode->hF
1a8e0 69 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  ile, 0);.      i
1a8f0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1a900 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1a910 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
1a920 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4f 50 45  ITE_IOERR_SHMOPE
1a930 4e 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f  N, osGetLastErro
1a940 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  r(),.           
1a950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
1a960 69 6e 4f 70 65 6e 53 68 6d 22 2c 20 70 44 62 46  inOpenShm", pDbF
1a970 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20  d->zPath);.     
1a980 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
1a990 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1a9a0 7b 0a 20 20 20 20 20 20 77 69 6e 53 68 6d 53 79  {.      winShmSy
1a9b0 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64  stemLock(pShmNod
1a9c0 65 2c 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20 57  e, _SHM_UNLCK, W
1a9d0 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a  IN_SHM_DMS, 1);.
1a9e0 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 53 68        rc = winSh
1a9f0 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d  mSystemLock(pShm
1aa00 4e 6f 64 65 2c 20 5f 53 48 4d 5f 52 44 4c 43 4b  Node, _SHM_RDLCK
1aa10 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31  , WIN_SHM_DMS, 1
1aa20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
1aa30 20 72 63 20 29 20 67 6f 74 6f 20 73 68 6d 5f 6f   rc ) goto shm_o
1aa40 70 65 6e 5f 65 72 72 3b 0a 20 20 7d 0a 0a 20 20  pen_err;.  }..  
1aa50 2f 2a 20 4d 61 6b 65 20 74 68 65 20 6e 65 77 20  /* Make the new 
1aa60 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 20 63 68 69  connection a chi
1aa70 6c 64 20 6f 66 20 74 68 65 20 77 69 6e 53 68 6d  ld of the winShm
1aa80 4e 6f 64 65 20 2a 2f 0a 20 20 70 2d 3e 70 53 68  Node */.  p->pSh
1aa90 6d 4e 6f 64 65 20 3d 20 70 53 68 6d 4e 6f 64 65  mNode = pShmNode
1aaa0 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
1aab0 44 45 42 55 47 0a 20 20 70 2d 3e 69 64 20 3d 20  DEBUG.  p->id = 
1aac0 70 53 68 6d 4e 6f 64 65 2d 3e 6e 65 78 74 53 68  pShmNode->nextSh
1aad0 6d 49 64 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20  mId++;.#endif.  
1aae0 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2b 2b  pShmNode->nRef++
1aaf0 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53 68 6d 20  ;.  pDbFd->pShm 
1ab00 3d 20 70 3b 0a 20 20 77 69 6e 53 68 6d 4c 65 61  = p;.  winShmLea
1ab10 76 65 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f 2a  veMutex();..  /*
1ab20 20 54 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   The reference c
1ab30 6f 75 6e 74 20 6f 6e 20 70 53 68 6d 4e 6f 64 65  ount on pShmNode
1ab40 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
1ab50 6e 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 75 6e  n incremented un
1ab60 64 65 72 0a 20 20 2a 2a 20 74 68 65 20 63 6f 76  der.  ** the cov
1ab70 65 72 20 6f 66 20 74 68 65 20 77 69 6e 53 68 6d  er of the winShm
1ab80 45 6e 74 65 72 4d 75 74 65 78 28 29 20 6d 75 74  EnterMutex() mut
1ab90 65 78 20 61 6e 64 20 74 68 65 20 70 6f 69 6e 74  ex and the point
1aba0 65 72 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a  er from the.  **
1abb0 20 6e 65 77 20 28 73 74 72 75 63 74 20 77 69 6e   new (struct win
1abc0 53 68 6d 29 20 6f 62 6a 65 63 74 20 74 6f 20 74  Shm) object to t
1abd0 68 65 20 70 53 68 6d 4e 6f 64 65 20 68 61 73 20  he pShmNode has 
1abe0 62 65 65 6e 20 73 65 74 2e 20 41 6c 6c 20 74 68  been set. All th
1abf0 61 74 20 69 73 0a 20 20 2a 2a 20 6c 65 66 74 20  at is.  ** left 
1ac00 74 6f 20 64 6f 20 69 73 20 74 6f 20 6c 69 6e 6b  to do is to link
1ac10 20 74 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20   the new object 
1ac20 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20  into the linked 
1ac30 6c 69 73 74 20 73 74 61 72 74 69 6e 67 0a 20 20  list starting.  
1ac40 2a 2a 20 61 74 20 70 53 68 6d 4e 6f 64 65 2d 3e  ** at pShmNode->
1ac50 70 46 69 72 73 74 2e 20 54 68 69 73 20 6d 75 73  pFirst. This mus
1ac60 74 20 62 65 20 64 6f 6e 65 20 77 68 69 6c 65 20  t be done while 
1ac70 68 6f 6c 64 69 6e 67 20 74 68 65 20 70 53 68 6d  holding the pShm
1ac80 4e 6f 64 65 2d 3e 6d 75 74 65 78 20 0a 20 20 2a  Node->mutex .  *
1ac90 2a 20 6d 75 74 65 78 2e 0a 20 20 2a 2f 0a 20 20  * mutex..  */.  
1aca0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
1acb0 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  ter(pShmNode->mu
1acc0 74 65 78 29 3b 0a 20 20 70 2d 3e 70 4e 65 78 74  tex);.  p->pNext
1acd0 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69   = pShmNode->pFi
1ace0 72 73 74 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 2d  rst;.  pShmNode-
1acf0 3e 70 46 69 72 73 74 20 3d 20 70 3b 0a 20 20 73  >pFirst = p;.  s
1ad00 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
1ad10 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  ve(pShmNode->mut
1ad20 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ex);.  return SQ
1ad30 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a  LITE_OK;..  /* J
1ad40 75 6d 70 20 68 65 72 65 20 6f 6e 20 61 6e 79 20  ump here on any 
1ad50 65 72 72 6f 72 20 2a 2f 0a 73 68 6d 5f 6f 70 65  error */.shm_ope
1ad60 6e 5f 65 72 72 3a 0a 20 20 77 69 6e 53 68 6d 53  n_err:.  winShmS
1ad70 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f  ystemLock(pShmNo
1ad80 64 65 2c 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20  de, _SHM_UNLCK, 
1ad90 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3b  WIN_SHM_DMS, 1);
1ada0 0a 20 20 77 69 6e 53 68 6d 50 75 72 67 65 28 70  .  winShmPurge(p
1adb0 44 62 46 64 2d 3e 70 56 66 73 2c 20 30 29 3b 20  DbFd->pVfs, 0); 
1adc0 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 6c       /* This cal
1add0 6c 20 66 72 65 65 73 20 70 53 68 6d 4e 6f 64 65  l frees pShmNode
1ade0 20 69 66 20 72 65 71 75 69 72 65 64 20 2a 2f 0a   if required */.
1adf0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
1ae00 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
1ae10 65 28 70 4e 65 77 29 3b 0a 20 20 77 69 6e 53 68  e(pNew);.  winSh
1ae20 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  mLeaveMutex();. 
1ae30 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1ae40 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63 6f 6e  *.** Close a con
1ae50 6e 65 63 74 69 6f 6e 20 74 6f 20 73 68 61 72 65  nection to share
1ae60 64 2d 6d 65 6d 6f 72 79 2e 20 20 44 65 6c 65 74  d-memory.  Delet
1ae70 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  e the underlying
1ae80 20 0a 2a 2a 20 73 74 6f 72 61 67 65 20 69 66 20   .** storage if 
1ae90 64 65 6c 65 74 65 46 6c 61 67 20 69 73 20 74 72  deleteFlag is tr
1aea0 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ue..*/.static in
1aeb0 74 20 77 69 6e 53 68 6d 55 6e 6d 61 70 28 0a 20  t winShmUnmap(. 
1aec0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66   sqlite3_file *f
1aed0 64 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  d,          /* D
1aee0 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 20  atabase holding 
1aef0 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f  shared memory */
1af00 0a 20 20 69 6e 74 20 64 65 6c 65 74 65 46 6c 61  .  int deleteFla
1af10 67 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  g             /*
1af20 20 44 65 6c 65 74 65 20 61 66 74 65 72 20 63 6c   Delete after cl
1af30 6f 73 69 6e 67 20 69 66 20 74 72 75 65 20 2a 2f  osing if true */
1af40 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70  .){.  winFile *p
1af50 44 62 46 64 3b 20 20 20 20 20 20 20 2f 2a 20 44  DbFd;       /* D
1af60 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 20  atabase holding 
1af70 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 2a 2f  shared-memory */
1af80 0a 20 20 77 69 6e 53 68 6d 20 2a 70 3b 20 20 20  .  winShm *p;   
1af90 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1afa0 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65  connection to be
1afb0 20 63 6c 6f 73 65 64 20 2a 2f 0a 20 20 77 69 6e   closed */.  win
1afc0 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64  ShmNode *pShmNod
1afd0 65 3b 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c  e; /* The underl
1afe0 79 69 6e 67 20 73 68 61 72 65 64 2d 6d 65 6d 6f  ying shared-memo
1aff0 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 77 69 6e  ry file */.  win
1b000 53 68 6d 20 2a 2a 70 70 3b 20 20 20 20 20 20 20  Shm **pp;       
1b010 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e     /* For loopin
1b020 67 20 6f 76 65 72 20 73 69 62 6c 69 6e 67 20 63  g over sibling c
1b030 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20  onnections */.. 
1b040 20 70 44 62 46 64 20 3d 20 28 77 69 6e 46 69 6c   pDbFd = (winFil
1b050 65 2a 29 66 64 3b 0a 20 20 70 20 3d 20 70 44 62  e*)fd;.  p = pDb
1b060 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 69 66 28 20  Fd->pShm;.  if( 
1b070 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  p==0 ) return SQ
1b080 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 53 68 6d 4e  LITE_OK;.  pShmN
1b090 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64  ode = p->pShmNod
1b0a0 65 3b 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20  e;..  /* Remove 
1b0b0 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 66 72 6f  connection p fro
1b0c0 6d 20 74 68 65 20 73 65 74 20 6f 66 20 63 6f 6e  m the set of con
1b0d0 6e 65 63 74 69 6f 6e 73 20 61 73 73 6f 63 69 61  nections associa
1b0e0 74 65 64 0a 20 20 2a 2a 20 77 69 74 68 20 70 53  ted.  ** with pS
1b0f0 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69  hmNode */.  sqli
1b100 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
1b110 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
1b120 3b 0a 20 20 66 6f 72 28 70 70 3d 26 70 53 68 6d  ;.  for(pp=&pShm
1b130 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 28 2a  Node->pFirst; (*
1b140 70 70 29 21 3d 70 3b 20 70 70 20 3d 20 26 28 2a  pp)!=p; pp = &(*
1b150 70 70 29 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20  pp)->pNext){}.  
1b160 2a 70 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  *pp = p->pNext;.
1b170 0a 20 20 2f 2a 20 46 72 65 65 20 74 68 65 20 63  .  /* Free the c
1b180 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 2a 2f 0a 20  onnection p */. 
1b190 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
1b1a0 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53 68 6d 20  ;.  pDbFd->pShm 
1b1b0 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  = 0;.  sqlite3_m
1b1c0 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e  utex_leave(pShmN
1b1d0 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 0a 20 20  ode->mutex);..  
1b1e0 2f 2a 20 49 66 20 70 53 68 6d 4e 6f 64 65 2d 3e  /* If pShmNode->
1b1f0 6e 52 65 66 20 68 61 73 20 72 65 61 63 68 65 64  nRef has reached
1b200 20 30 2c 20 74 68 65 6e 20 63 6c 6f 73 65 20 74   0, then close t
1b210 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a 20 20  he underlying.  
1b220 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ** shared-memory
1b230 20 66 69 6c 65 2c 20 74 6f 6f 20 2a 2f 0a 20 20   file, too */.  
1b240 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78  winShmEnterMutex
1b250 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53  ();.  assert( pS
1b260 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3e 30 20 29  hmNode->nRef>0 )
1b270 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  ;.  pShmNode->nR
1b280 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 53 68 6d  ef--;.  if( pShm
1b290 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b  Node->nRef==0 ){
1b2a0 0a 20 20 20 20 77 69 6e 53 68 6d 50 75 72 67 65  .    winShmPurge
1b2b0 28 70 44 62 46 64 2d 3e 70 56 66 73 2c 20 64 65  (pDbFd->pVfs, de
1b2c0 6c 65 74 65 46 6c 61 67 29 3b 0a 20 20 7d 0a 20  leteFlag);.  }. 
1b2d0 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65   winShmLeaveMute
1b2e0 78 28 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53  x();..  return S
1b2f0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
1b300 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6c 6f  ** Change the lo
1b310 63 6b 20 73 74 61 74 65 20 66 6f 72 20 61 20 73  ck state for a s
1b320 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73 65 67  hared-memory seg
1b330 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
1b340 69 6e 74 20 77 69 6e 53 68 6d 4c 6f 63 6b 28 0a  int winShmLock(.
1b350 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
1b360 66 64 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  fd,          /* 
1b370 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 6f  Database file ho
1b380 6c 64 69 6e 67 20 74 68 65 20 73 68 61 72 65 64  lding the shared
1b390 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74   memory */.  int
1b3a0 20 6f 66 73 74 2c 20 20 20 20 20 20 20 20 20 20   ofst,          
1b3b0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
1b3c0 20 6c 6f 63 6b 20 74 6f 20 61 63 71 75 69 72 65   lock to acquire
1b3d0 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20   or release */. 
1b3e0 20 69 6e 74 20 6e 2c 20 20 20 20 20 20 20 20 20   int n,         
1b3f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1b400 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20 74  umber of locks t
1b410 6f 20 61 63 71 75 69 72 65 20 6f 72 20 72 65 6c  o acquire or rel
1b420 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  ease */.  int fl
1b430 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20 20  ags             
1b440 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20       /* What to 
1b450 64 6f 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b  do with the lock
1b460 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65   */.){.  winFile
1b470 20 2a 70 44 62 46 64 20 3d 20 28 77 69 6e 46 69   *pDbFd = (winFi
1b480 6c 65 2a 29 66 64 3b 20 20 20 20 20 20 20 20 2f  le*)fd;        /
1b490 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 68 6f 6c  * Connection hol
1b4a0 64 69 6e 67 20 73 68 61 72 65 64 20 6d 65 6d 6f  ding shared memo
1b4b0 72 79 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a  ry */.  winShm *
1b4c0 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b  p = pDbFd->pShm;
1b4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b4e0 20 54 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f   The shared memo
1b4f0 72 79 20 62 65 69 6e 67 20 6c 6f 63 6b 65 64 20  ry being locked 
1b500 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70 58 3b  */.  winShm *pX;
1b510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b520 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
1b530 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 61  r looping over a
1b540 6c 6c 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 20  ll siblings */. 
1b550 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68   winShmNode *pSh
1b560 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e  mNode = p->pShmN
1b570 6f 64 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ode;.  int rc = 
1b580 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
1b590 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b5a0 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20  Result code */. 
1b5b0 20 75 31 36 20 6d 61 73 6b 3b 20 20 20 20 20 20   u16 mask;      
1b5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b5d0 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
1b5e0 66 20 6c 6f 63 6b 73 20 74 6f 20 74 61 6b 65 20  f locks to take 
1b5f0 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 0a 20  or release */.. 
1b600 20 61 73 73 65 72 74 28 20 6f 66 73 74 3e 3d 30   assert( ofst>=0
1b610 20 26 26 20 6f 66 73 74 2b 6e 3c 3d 53 51 4c 49   && ofst+n<=SQLI
1b620 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a  TE_SHM_NLOCK );.
1b630 20 20 61 73 73 65 72 74 28 20 6e 3e 3d 31 20 29    assert( n>=1 )
1b640 3b 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61 67  ;.  assert( flag
1b650 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 4c  s==(SQLITE_SHM_L
1b660 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d  OCK | SQLITE_SHM
1b670 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20 20 20  _SHARED).       
1b680 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54  || flags==(SQLIT
1b690 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c  E_SHM_LOCK | SQL
1b6a0 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56  ITE_SHM_EXCLUSIV
1b6b0 45 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61  E).       || fla
1b6c0 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f  gs==(SQLITE_SHM_
1b6d0 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f  UNLOCK | SQLITE_
1b6e0 53 48 4d 5f 53 48 41 52 45 44 29 0a 20 20 20 20  SHM_SHARED).    
1b6f0 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51     || flags==(SQ
1b700 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20  LITE_SHM_UNLOCK 
1b710 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43  | SQLITE_SHM_EXC
1b720 4c 55 53 49 56 45 29 20 29 3b 0a 20 20 61 73 73  LUSIVE) );.  ass
1b730 65 72 74 28 20 6e 3d 3d 31 20 7c 7c 20 28 66 6c  ert( n==1 || (fl
1b740 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d  ags & SQLITE_SHM
1b750 5f 45 58 43 4c 55 53 49 56 45 29 21 3d 30 20 29  _EXCLUSIVE)!=0 )
1b760 3b 0a 0a 20 20 6d 61 73 6b 20 3d 20 28 75 31 36  ;..  mask = (u16
1b770 29 28 28 31 55 3c 3c 28 6f 66 73 74 2b 6e 29 29  )((1U<<(ofst+n))
1b780 20 2d 20 28 31 55 3c 3c 6f 66 73 74 29 29 3b 0a   - (1U<<ofst));.
1b790 20 20 61 73 73 65 72 74 28 20 6e 3e 31 20 7c 7c    assert( n>1 ||
1b7a0 20 6d 61 73 6b 3d 3d 28 31 3c 3c 6f 66 73 74 29   mask==(1<<ofst)
1b7b0 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   );.  sqlite3_mu
1b7c0 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f  tex_enter(pShmNo
1b7d0 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66  de->mutex);.  if
1b7e0 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ( flags & SQLITE
1b7f0 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20  _SHM_UNLOCK ){. 
1b800 20 20 20 75 31 36 20 61 6c 6c 4d 61 73 6b 20 3d     u16 allMask =
1b810 20 30 3b 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c   0; /* Mask of l
1b820 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 73 69 62  ocks held by sib
1b830 6c 69 6e 67 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a  lings */..    /*
1b840 20 53 65 65 20 69 66 20 61 6e 79 20 73 69 62 6c   See if any sibl
1b850 69 6e 67 73 20 68 6f 6c 64 20 74 68 69 73 20 73  ings hold this s
1b860 61 6d 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  ame lock */.    
1b870 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d  for(pX=pShmNode-
1b880 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d  >pFirst; pX; pX=
1b890 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  pX->pNext){.    
1b8a0 20 20 69 66 28 20 70 58 3d 3d 70 20 29 20 63 6f    if( pX==p ) co
1b8b0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 61 73  ntinue;.      as
1b8c0 73 65 72 74 28 20 28 70 58 2d 3e 65 78 63 6c 4d  sert( (pX->exclM
1b8d0 61 73 6b 20 26 20 28 70 2d 3e 65 78 63 6c 4d 61  ask & (p->exclMa
1b8e0 73 6b 7c 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b  sk|p->sharedMask
1b8f0 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  ))==0 );.      a
1b900 6c 6c 4d 61 73 6b 20 7c 3d 20 70 58 2d 3e 73 68  llMask |= pX->sh
1b910 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a  aredMask;.    }.
1b920 0a 20 20 20 20 2f 2a 20 55 6e 6c 6f 63 6b 20 74  .    /* Unlock t
1b930 68 65 20 73 79 73 74 65 6d 2d 6c 65 76 65 6c 20  he system-level 
1b940 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28  locks */.    if(
1b950 20 28 6d 61 73 6b 20 26 20 61 6c 6c 4d 61 73 6b   (mask & allMask
1b960 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  )==0 ){.      rc
1b970 20 3d 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c   = winShmSystemL
1b980 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53  ock(pShmNode, _S
1b990 48 4d 5f 55 4e 4c 43 4b 2c 20 6f 66 73 74 2b 57  HM_UNLCK, ofst+W
1b9a0 49 4e 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b  IN_SHM_BASE, n);
1b9b0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1b9c0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
1b9d0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1b9e0 55 6e 64 6f 20 74 68 65 20 6c 6f 63 61 6c 20 6c  Undo the local l
1b9f0 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28 20  ocks */.    if( 
1ba00 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1ba10 0a 20 20 20 20 20 20 70 2d 3e 65 78 63 6c 4d 61  .      p->exclMa
1ba20 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20  sk &= ~mask;.   
1ba30 20 20 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b     p->sharedMask
1ba40 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d   &= ~mask;.    }
1ba50 20 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c   .  }else if( fl
1ba60 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d  ags & SQLITE_SHM
1ba70 5f 53 48 41 52 45 44 20 29 7b 0a 20 20 20 20 75  _SHARED ){.    u
1ba80 31 36 20 61 6c 6c 53 68 61 72 65 64 20 3d 20 30  16 allShared = 0
1ba90 3b 20 20 2f 2a 20 55 6e 69 6f 6e 20 6f 66 20 6c  ;  /* Union of l
1baa0 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 63 6f 6e  ocks held by con
1bab0 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65 72 20 74  nections other t
1bac0 68 61 6e 20 22 70 22 20 2a 2f 0a 0a 20 20 20 20  han "p" */..    
1bad0 2f 2a 20 46 69 6e 64 20 6f 75 74 20 77 68 69 63  /* Find out whic
1bae0 68 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 61  h shared locks a
1baf0 72 65 20 61 6c 72 65 61 64 79 20 68 65 6c 64 20  re already held 
1bb00 62 79 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65  by sibling conne
1bb10 63 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20 49  ctions..    ** I
1bb20 66 20 61 6e 79 20 73 69 62 6c 69 6e 67 20 61 6c  f any sibling al
1bb30 72 65 61 64 79 20 68 6f 6c 64 73 20 61 6e 20 65  ready holds an e
1bb40 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20 67  xclusive lock, g
1bb50 6f 20 61 68 65 61 64 20 61 6e 64 20 72 65 74 75  o ahead and retu
1bb60 72 6e 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45  rn.    ** SQLITE
1bb70 5f 42 55 53 59 2e 0a 20 20 20 20 2a 2f 0a 20 20  _BUSY..    */.  
1bb80 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64    for(pX=pShmNod
1bb90 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70  e->pFirst; pX; p
1bba0 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  X=pX->pNext){.  
1bbb0 20 20 20 20 69 66 28 20 28 70 58 2d 3e 65 78 63      if( (pX->exc
1bbc0 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30  lMask & mask)!=0
1bbd0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1bbe0 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
1bbf0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1bc00 20 20 20 7d 0a 20 20 20 20 20 20 61 6c 6c 53 68     }.      allSh
1bc10 61 72 65 64 20 7c 3d 20 70 58 2d 3e 73 68 61 72  ared |= pX->shar
1bc20 65 64 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20  edMask;.    }.. 
1bc30 20 20 20 2f 2a 20 47 65 74 20 73 68 61 72 65 64     /* Get shared
1bc40 20 6c 6f 63 6b 73 20 61 74 20 74 68 65 20 73 79   locks at the sy
1bc50 73 74 65 6d 20 6c 65 76 65 6c 2c 20 69 66 20 6e  stem level, if n
1bc60 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 20 20  ecessary */.    
1bc70 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1bc80 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  K ){.      if( (
1bc90 61 6c 6c 53 68 61 72 65 64 20 26 20 6d 61 73 6b  allShared & mask
1bca0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
1bcb0 72 63 20 3d 20 77 69 6e 53 68 6d 53 79 73 74 65  rc = winShmSyste
1bcc0 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20  mLock(pShmNode, 
1bcd0 5f 53 48 4d 5f 52 44 4c 43 4b 2c 20 6f 66 73 74  _SHM_RDLCK, ofst
1bce0 2b 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2c 20 6e  +WIN_SHM_BASE, n
1bcf0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
1bd00 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
1bd10 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
1bd20 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65      }..    /* Ge
1bd30 74 20 74 68 65 20 6c 6f 63 61 6c 20 73 68 61 72  t the local shar
1bd40 65 64 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20  ed locks */.    
1bd50 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1bd60 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 73 68  K ){.      p->sh
1bd70 61 72 65 64 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b  aredMask |= mask
1bd80 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
1bd90 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  .    /* Make sur
1bda0 65 20 6e 6f 20 73 69 62 6c 69 6e 67 20 63 6f 6e  e no sibling con
1bdb0 6e 65 63 74 69 6f 6e 73 20 68 6f 6c 64 20 6c 6f  nections hold lo
1bdc0 63 6b 73 20 74 68 61 74 20 77 69 6c 6c 20 62 6c  cks that will bl
1bdd0 6f 63 6b 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  ock this.    ** 
1bde0 6c 6f 63 6b 2e 20 20 49 66 20 61 6e 79 20 64 6f  lock.  If any do
1bdf0 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
1be00 42 55 53 59 20 72 69 67 68 74 20 61 77 61 79 2e  BUSY right away.
1be10 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
1be20 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69  pX=pShmNode->pFi
1be30 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e  rst; pX; pX=pX->
1be40 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  pNext){.      if
1be50 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20  ( (pX->exclMask 
1be60 26 20 6d 61 73 6b 29 21 3d 30 20 7c 7c 20 28 70  & mask)!=0 || (p
1be70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 20  X->sharedMask & 
1be80 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20  mask)!=0 ){.    
1be90 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1bea0 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 62 72  BUSY;.        br
1beb0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
1bec0 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 47 65 74   }.  .    /* Get
1bed0 20 74 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c   the exclusive l
1bee0 6f 63 6b 73 20 61 74 20 74 68 65 20 73 79 73 74  ocks at the syst
1bef0 65 6d 20 6c 65 76 65 6c 2e 20 20 54 68 65 6e 20  em level.  Then 
1bf00 69 66 20 73 75 63 63 65 73 73 66 75 6c 0a 20 20  if successful.  
1bf10 20 20 2a 2a 20 61 6c 73 6f 20 6d 61 72 6b 20 74    ** also mark t
1bf20 68 65 20 6c 6f 63 61 6c 20 63 6f 6e 6e 65 63 74  he local connect
1bf30 69 6f 6e 20 61 73 20 62 65 69 6e 67 20 6c 6f 63  ion as being loc
1bf40 6b 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ked..    */.    
1bf50 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1bf60 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
1bf70 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b  winShmSystemLock
1bf80 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f  (pShmNode, _SHM_
1bf90 57 52 4c 43 4b 2c 20 6f 66 73 74 2b 57 49 4e 5f  WRLCK, ofst+WIN_
1bfa0 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20  SHM_BASE, n);.  
1bfb0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1bfc0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1bfd0 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73 68 61   assert( (p->sha
1bfe0 72 65 64 4d 61 73 6b 20 26 20 6d 61 73 6b 29 3d  redMask & mask)=
1bff0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  =0 );.        p-
1c000 3e 65 78 63 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73  >exclMask |= mas
1c010 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
1c020 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
1c030 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e  utex_leave(pShmN
1c040 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 4f  ode->mutex);.  O
1c050 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43  STRACE(("SHM-LOC
1c060 4b 20 70 69 64 3d 25 6c 75 2c 20 69 64 3d 25 64  K pid=%lu, id=%d
1c070 2c 20 73 68 61 72 65 64 4d 61 73 6b 3d 25 30 33  , sharedMask=%03
1c080 78 2c 20 65 78 63 6c 4d 61 73 6b 3d 25 30 33 78  x, exclMask=%03x
1c090 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20  , rc=%s\n",.    
1c0a0 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72         osGetCurr
1c0b0 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
1c0c0 70 2d 3e 69 64 2c 20 70 2d 3e 73 68 61 72 65 64  p->id, p->shared
1c0d0 4d 61 73 6b 2c 20 70 2d 3e 65 78 63 6c 4d 61 73  Mask, p->exclMas
1c0e0 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 73 71  k,.           sq
1c0f0 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29  lite3ErrName(rc)
1c100 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ));.  return rc;
1c110 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  .}../*.** Implem
1c120 65 6e 74 20 61 20 6d 65 6d 6f 72 79 20 62 61 72  ent a memory bar
1c130 72 69 65 72 20 6f 72 20 6d 65 6d 6f 72 79 20 66  rier or memory f
1c140 65 6e 63 65 20 6f 6e 20 73 68 61 72 65 64 20 6d  ence on shared m
1c150 65 6d 6f 72 79 2e 20 20 0a 2a 2a 0a 2a 2a 20 41  emory.  .**.** A
1c160 6c 6c 20 6c 6f 61 64 73 20 61 6e 64 20 73 74 6f  ll loads and sto
1c170 72 65 73 20 62 65 67 75 6e 20 62 65 66 6f 72 65  res begun before
1c180 20 74 68 65 20 62 61 72 72 69 65 72 20 6d 75 73   the barrier mus
1c190 74 20 63 6f 6d 70 6c 65 74 65 20 62 65 66 6f 72  t complete befor
1c1a0 65 0a 2a 2a 20 61 6e 79 20 6c 6f 61 64 20 6f 72  e.** any load or
1c1b0 20 73 74 6f 72 65 20 62 65 67 75 6e 20 61 66 74   store begun aft
1c1c0 65 72 20 74 68 65 20 62 61 72 72 69 65 72 2e 0a  er the barrier..
1c1d0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
1c1e0 69 6e 53 68 6d 42 61 72 72 69 65 72 28 0a 20 20  inShmBarrier(.  
1c1f0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
1c200 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
1c210 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 20 74 68  abase holding th
1c220 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  e shared memory 
1c230 2a 2f 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  */.){.  UNUSED_P
1c240 41 52 41 4d 45 54 45 52 28 66 64 29 3b 0a 20 20  ARAMETER(fd);.  
1c250 2f 2a 20 4d 65 6d 6f 72 79 42 61 72 72 69 65 72  /* MemoryBarrier
1c260 28 29 3b 20 2f 2f 20 64 6f 65 73 20 6e 6f 74 20  (); // does not 
1c270 77 6f 72 6b 20 2d 2d 20 64 6f 20 6e 6f 74 20 6b  work -- do not k
1c280 6e 6f 77 20 77 68 79 20 6e 6f 74 20 2a 2f 0a 20  now why not */. 
1c290 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65   winShmEnterMute
1c2a0 78 28 29 3b 0a 20 20 77 69 6e 53 68 6d 4c 65 61  x();.  winShmLea
1c2b0 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 0a 2f 2a  veMutex();.}../*
1c2c0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
1c2d0 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f  n is called to o
1c2e0 62 74 61 69 6e 20 61 20 70 6f 69 6e 74 65 72 20  btain a pointer 
1c2f0 74 6f 20 72 65 67 69 6f 6e 20 69 52 65 67 69 6f  to region iRegio
1c300 6e 20 6f 66 20 74 68 65 20 0a 2a 2a 20 73 68 61  n of the .** sha
1c310 72 65 64 2d 6d 65 6d 6f 72 79 20 61 73 73 6f 63  red-memory assoc
1c320 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 64  iated with the d
1c330 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 64 2e  atabase file fd.
1c340 20 53 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72   Shared-memory r
1c350 65 67 69 6f 6e 73 20 0a 2a 2a 20 61 72 65 20 6e  egions .** are n
1c360 75 6d 62 65 72 65 64 20 73 74 61 72 74 69 6e 67  umbered starting
1c370 20 66 72 6f 6d 20 7a 65 72 6f 2e 20 45 61 63 68   from zero. Each
1c380 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72   shared-memory r
1c390 65 67 69 6f 6e 20 69 73 20 73 7a 52 65 67 69 6f  egion is szRegio
1c3a0 6e 20 0a 2a 2a 20 62 79 74 65 73 20 69 6e 20 73  n .** bytes in s
1c3b0 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ize..**.** If an
1c3c0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61   error occurs, a
1c3d0 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
1c3e0 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70  returned and *pp
1c3f0 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e   is set to NULL.
1c400 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
1c410 2c 20 69 66 20 74 68 65 20 69 73 57 72 69 74 65  , if the isWrite
1c420 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 30 20   parameter is 0 
1c430 61 6e 64 20 74 68 65 20 72 65 71 75 65 73 74 65  and the requeste
1c440 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 0a  d shared-memory.
1c450 2a 2a 20 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f  ** region has no
1c460 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  t been allocated
1c470 20 28 62 79 20 61 6e 79 20 63 6c 69 65 6e 74 2c   (by any client,
1c480 20 69 6e 63 6c 75 64 69 6e 67 20 6f 6e 65 20 72   including one r
1c490 75 6e 6e 69 6e 67 20 69 6e 20 61 0a 2a 2a 20 73  unning in a.** s
1c4a0 65 70 61 72 61 74 65 20 70 72 6f 63 65 73 73 29  eparate process)
1c4b0 2c 20 74 68 65 6e 20 2a 70 70 20 69 73 20 73 65  , then *pp is se
1c4c0 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 53 51  t to NULL and SQ
1c4d0 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
1c4e0 2e 20 49 66 20 0a 2a 2a 20 69 73 57 72 69 74 65  . If .** isWrite
1c4f0 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64   is non-zero and
1c500 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 73   the requested s
1c510 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67  hared-memory reg
1c520 69 6f 6e 20 68 61 73 20 6e 6f 74 20 79 65 74 20  ion has not yet 
1c530 0a 2a 2a 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  .** been allocat
1c540 65 64 2c 20 69 74 20 69 73 20 61 6c 6c 6f 63 61  ed, it is alloca
1c550 74 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ted by this func
1c560 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  tion..**.** If t
1c570 68 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  he shared-memory
1c580 20 72 65 67 69 6f 6e 20 68 61 73 20 61 6c 72 65   region has alre
1c590 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  ady been allocat
1c5a0 65 64 20 6f 72 20 69 73 20 61 6c 6c 6f 63 61 74  ed or is allocat
1c5b0 65 64 20 62 79 0a 2a 2a 20 74 68 69 73 20 63 61  ed by.** this ca
1c5c0 6c 6c 20 61 73 20 64 65 73 63 72 69 62 65 64 20  ll as described 
1c5d0 61 62 6f 76 65 2c 20 74 68 65 6e 20 69 74 20 69  above, then it i
1c5e0 73 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 74 68  s mapped into th
1c5f0 69 73 20 70 72 6f 63 65 73 73 65 73 20 0a 2a 2a  is processes .**
1c600 20 61 64 64 72 65 73 73 20 73 70 61 63 65 20 28   address space (
1c610 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72  if it is not alr
1c620 65 61 64 79 29 2c 20 2a 70 70 20 69 73 20 73 65  eady), *pp is se
1c630 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  t to point to th
1c640 65 20 6d 61 70 70 65 64 20 0a 2a 2a 20 6d 65 6d  e mapped .** mem
1c650 6f 72 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  ory and SQLITE_O
1c660 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  K returned..*/.s
1c670 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 68 6d  tatic int winShm
1c680 4d 61 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 66  Map(.  sqlite3_f
1c690 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20  ile *fd,        
1c6a0 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65         /* Handle
1c6b0 20 6f 70 65 6e 20 6f 6e 20 64 61 74 61 62 61 73   open on databas
1c6c0 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  e file */.  int 
1c6d0 69 52 65 67 69 6f 6e 2c 20 20 20 20 20 20 20 20  iRegion,        
1c6e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1c6f0 65 67 69 6f 6e 20 74 6f 20 72 65 74 72 69 65 76  egion to retriev
1c700 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 52 65 67  e */.  int szReg
1c710 69 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  ion,            
1c720 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
1c730 66 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 69  f regions */.  i
1c740 6e 74 20 69 73 57 72 69 74 65 2c 20 20 20 20 20  nt isWrite,     
1c750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c760 2a 20 54 72 75 65 20 74 6f 20 65 78 74 65 6e 64  * True to extend
1c770 20 66 69 6c 65 20 69 66 20 6e 65 63 65 73 73 61   file if necessa
1c780 72 79 20 2a 2f 0a 20 20 76 6f 69 64 20 76 6f 6c  ry */.  void vol
1c790 61 74 69 6c 65 20 2a 2a 70 70 20 20 20 20 20 20  atile **pp      
1c7a0 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
1c7b0 4d 61 70 70 65 64 20 6d 65 6d 6f 72 79 20 2a 2f  Mapped memory */
1c7c0 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70  .){.  winFile *p
1c7d0 44 62 46 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a  DbFd = (winFile*
1c7e0 29 66 64 3b 0a 20 20 77 69 6e 53 68 6d 20 2a 70  )fd;.  winShm *p
1c7f0 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a   = pDbFd->pShm;.
1c800 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53    winShmNode *pS
1c810 68 6d 4e 6f 64 65 3b 0a 20 20 69 6e 74 20 72 63  hmNode;.  int rc
1c820 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
1c830 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20 72   if( !p ){.    r
1c840 63 20 3d 20 77 69 6e 4f 70 65 6e 53 68 61 72 65  c = winOpenShare
1c850 64 4d 65 6d 6f 72 79 28 70 44 62 46 64 29 3b 0a  dMemory(pDbFd);.
1c860 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1c870 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
1c880 63 3b 0a 20 20 20 20 70 20 3d 20 70 44 62 46 64  c;.    p = pDbFd
1c890 2d 3e 70 53 68 6d 3b 0a 20 20 7d 0a 20 20 70 53  ->pShm;.  }.  pS
1c8a0 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d  hmNode = p->pShm
1c8b0 4e 6f 64 65 3b 0a 0a 20 20 73 71 6c 69 74 65 33  Node;..  sqlite3
1c8c0 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68  _mutex_enter(pSh
1c8d0 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20  mNode->mutex);. 
1c8e0 20 61 73 73 65 72 74 28 20 73 7a 52 65 67 69 6f   assert( szRegio
1c8f0 6e 3d 3d 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52  n==pShmNode->szR
1c900 65 67 69 6f 6e 20 7c 7c 20 70 53 68 6d 4e 6f 64  egion || pShmNod
1c910 65 2d 3e 6e 52 65 67 69 6f 6e 3d 3d 30 20 29 3b  e->nRegion==0 );
1c920 0a 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65  ..  if( pShmNode
1c930 2d 3e 6e 52 65 67 69 6f 6e 3c 3d 69 52 65 67 69  ->nRegion<=iRegi
1c940 6f 6e 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  on ){.    struct
1c950 20 53 68 6d 52 65 67 69 6f 6e 20 2a 61 70 4e 65   ShmRegion *apNe
1c960 77 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  w;           /* 
1c970 4e 65 77 20 61 52 65 67 69 6f 6e 5b 5d 20 61 72  New aRegion[] ar
1c980 72 61 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ray */.    int n
1c990 42 79 74 65 20 3d 20 28 69 52 65 67 69 6f 6e 2b  Byte = (iRegion+
1c9a0 31 29 2a 73 7a 52 65 67 69 6f 6e 3b 20 20 2f 2a  1)*szRegion;  /*
1c9b0 20 4d 69 6e 69 6d 75 6d 20 72 65 71 75 69 72 65   Minimum require
1c9c0 64 20 66 69 6c 65 20 73 69 7a 65 20 2a 2f 0a 20  d file size */. 
1c9d0 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
1c9e0 20 73 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20   sz;            
1c9f0 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
1ca00 20 73 69 7a 65 20 6f 66 20 77 61 6c 2d 69 6e 64   size of wal-ind
1ca10 65 78 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20  ex file */..    
1ca20 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69  pShmNode->szRegi
1ca30 6f 6e 20 3d 20 73 7a 52 65 67 69 6f 6e 3b 0a 0a  on = szRegion;..
1ca40 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65      /* The reque
1ca50 73 74 65 64 20 72 65 67 69 6f 6e 20 69 73 20 6e  sted region is n
1ca60 6f 74 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 74  ot mapped into t
1ca70 68 69 73 20 70 72 6f 63 65 73 73 65 73 20 61 64  his processes ad
1ca80 64 72 65 73 73 20 73 70 61 63 65 2e 0a 20 20 20  dress space..   
1ca90 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   ** Check to see
1caa0 20 69 66 20 69 74 20 68 61 73 20 62 65 65 6e 20   if it has been 
1cab0 61 6c 6c 6f 63 61 74 65 64 20 28 69 2e 65 2e 20  allocated (i.e. 
1cac0 69 66 20 74 68 65 20 77 61 6c 2d 69 6e 64 65 78  if the wal-index
1cad0 20 66 69 6c 65 20 69 73 0a 20 20 20 20 2a 2a 20   file is.    ** 
1cae0 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20  large enough to 
1caf0 63 6f 6e 74 61 69 6e 20 74 68 65 20 72 65 71 75  contain the requ
1cb00 65 73 74 65 64 20 72 65 67 69 6f 6e 29 2e 0a 20  ested region).. 
1cb10 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 77     */.    rc = w
1cb20 69 6e 46 69 6c 65 53 69 7a 65 28 28 73 71 6c 69  inFileSize((sqli
1cb30 74 65 33 5f 66 69 6c 65 20 2a 29 26 70 53 68 6d  te3_file *)&pShm
1cb40 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c 20 26 73 7a  Node->hFile, &sz
1cb50 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
1cb60 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1cb70 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72    rc = winLogErr
1cb80 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
1cb90 53 48 4d 53 49 5a 45 2c 20 6f 73 47 65 74 4c 61  SHMSIZE, osGetLa
1cba0 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20  stError(),.     
1cbb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cbc0 20 20 22 77 69 6e 53 68 6d 4d 61 70 31 22 2c 20    "winShmMap1", 
1cbd0 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20  pDbFd->zPath);. 
1cbe0 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67       goto shmpag
1cbf0 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20  e_out;.    }..  
1cc00 20 20 69 66 28 20 73 7a 3c 6e 42 79 74 65 20 29    if( sz<nByte )
1cc10 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72  {.      /* The r
1cc20 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20  equested memory 
1cc30 72 65 67 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20  region does not 
1cc40 65 78 69 73 74 2e 20 49 66 20 69 73 57 72 69 74  exist. If isWrit
1cc50 65 20 69 73 20 73 65 74 20 74 6f 0a 20 20 20 20  e is set to.    
1cc60 20 20 2a 2a 20 7a 65 72 6f 2c 20 65 78 69 74 20    ** zero, exit 
1cc70 65 61 72 6c 79 2e 20 2a 70 70 20 77 69 6c 6c 20  early. *pp will 
1cc80 62 65 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61  be set to NULL a
1cc90 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
1cca0 75 72 6e 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a  urned..      **.
1ccb0 20 20 20 20 20 20 2a 2a 20 41 6c 74 65 72 6e 61        ** Alterna
1ccc0 74 69 76 65 6c 79 2c 20 69 66 20 69 73 57 72 69  tively, if isWri
1ccd0 74 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  te is non-zero, 
1cce0 75 73 65 20 66 74 72 75 6e 63 61 74 65 28 29 20  use ftruncate() 
1ccf0 74 6f 20 61 6c 6c 6f 63 61 74 65 0a 20 20 20 20  to allocate.    
1cd00 20 20 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74    ** the request
1cd10 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed memory region
1cd20 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1cd30 20 69 66 28 20 21 69 73 57 72 69 74 65 20 29 20   if( !isWrite ) 
1cd40 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74  goto shmpage_out
1cd50 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e  ;.      rc = win
1cd60 54 72 75 6e 63 61 74 65 28 28 73 71 6c 69 74 65  Truncate((sqlite
1cd70 33 5f 66 69 6c 65 20 2a 29 26 70 53 68 6d 4e 6f  3_file *)&pShmNo
1cd80 64 65 2d 3e 68 46 69 6c 65 2c 20 6e 42 79 74 65  de->hFile, nByte
1cd90 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1cda0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1cdb0 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f        rc = winLo
1cdc0 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
1cdd0 45 52 52 5f 53 48 4d 53 49 5a 45 2c 20 6f 73 47  ERR_SHMSIZE, osG
1cde0 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20  etLastError(),. 
1cdf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce00 20 20 20 20 20 20 20 20 22 77 69 6e 53 68 6d 4d          "winShmM
1ce10 61 70 32 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61  ap2", pDbFd->zPa
1ce20 74 68 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  th);.        got
1ce30 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20  o shmpage_out;. 
1ce40 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
1ce50 20 20 2f 2a 20 4d 61 70 20 74 68 65 20 72 65 71    /* Map the req
1ce60 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72 65  uested memory re
1ce70 67 69 6f 6e 20 69 6e 74 6f 20 74 68 69 73 20 70  gion into this p
1ce80 72 6f 63 65 73 73 65 73 20 61 64 64 72 65 73 73  rocesses address
1ce90 20 73 70 61 63 65 2e 20 2a 2f 0a 20 20 20 20 61   space. */.    a
1cea0 70 4e 65 77 20 3d 20 28 73 74 72 75 63 74 20 53  pNew = (struct S
1ceb0 68 6d 52 65 67 69 6f 6e 20 2a 29 73 71 6c 69 74  hmRegion *)sqlit
1cec0 65 33 5f 72 65 61 6c 6c 6f 63 28 0a 20 20 20 20  e3_realloc(.    
1ced0 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52      pShmNode->aR
1cee0 65 67 69 6f 6e 2c 20 28 69 52 65 67 69 6f 6e 2b  egion, (iRegion+
1cef0 31 29 2a 73 69 7a 65 6f 66 28 61 70 4e 65 77 5b  1)*sizeof(apNew[
1cf00 30 5d 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 69  0]).    );.    i
1cf10 66 28 20 21 61 70 4e 65 77 20 29 7b 0a 20 20 20  f( !apNew ){.   
1cf20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
1cf30 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  OERR_NOMEM;.    
1cf40 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f    goto shmpage_o
1cf50 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53  ut;.    }.    pS
1cf60 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 20  hmNode->aRegion 
1cf70 3d 20 61 70 4e 65 77 3b 0a 0a 20 20 20 20 77 68  = apNew;..    wh
1cf80 69 6c 65 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  ile( pShmNode->n
1cf90 52 65 67 69 6f 6e 3c 3d 69 52 65 67 69 6f 6e 20  Region<=iRegion 
1cfa0 29 7b 0a 20 20 20 20 20 20 48 41 4e 44 4c 45 20  ){.      HANDLE 
1cfb0 68 4d 61 70 20 3d 20 4e 55 4c 4c 3b 20 20 20 20  hMap = NULL;    
1cfc0 20 20 20 20 20 2f 2a 20 66 69 6c 65 2d 6d 61 70       /* file-map
1cfd0 70 69 6e 67 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  ping handle */. 
1cfe0 20 20 20 20 20 76 6f 69 64 20 2a 70 4d 61 70 20       void *pMap 
1cff0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
1d000 20 2f 2a 20 4d 61 70 70 65 64 20 6d 65 6d 6f 72   /* Mapped memor
1d010 79 20 72 65 67 69 6f 6e 20 2a 2f 0a 20 20 20 20  y region */.    
1d020 20 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f   .#if SQLITE_OS_
1d030 57 49 4e 52 54 0a 20 20 20 20 20 20 68 4d 61 70  WINRT.      hMap
1d040 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d   = osCreateFileM
1d050 61 70 70 69 6e 67 46 72 6f 6d 41 70 70 28 70 53  appingFromApp(pS
1d060 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2e 68 2c  hmNode->hFile.h,
1d070 0a 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c  .          NULL,
1d080 20 50 41 47 45 5f 52 45 41 44 57 52 49 54 45 2c   PAGE_READWRITE,
1d090 20 6e 42 79 74 65 2c 20 4e 55 4c 4c 0a 20 20 20   nByte, NULL.   
1d0a0 20 20 20 29 3b 0a 23 65 6c 69 66 20 64 65 66 69     );.#elif defi
1d0b0 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
1d0c0 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 20 20 20  _HAS_WIDE).     
1d0d0 20 68 4d 61 70 20 3d 20 6f 73 43 72 65 61 74 65   hMap = osCreate
1d0e0 46 69 6c 65 4d 61 70 70 69 6e 67 57 28 70 53 68  FileMappingW(pSh
1d0f0 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2e 68 2c 20  mNode->hFile.h, 
1d100 0a 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c  .          NULL,
1d110 20 50 41 47 45 5f 52 45 41 44 57 52 49 54 45 2c   PAGE_READWRITE,
1d120 20 30 2c 20 6e 42 79 74 65 2c 20 4e 55 4c 4c 0a   0, nByte, NULL.
1d130 20 20 20 20 20 20 29 3b 0a 23 65 6c 69 66 20 64        );.#elif d
1d140 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
1d150 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20  N32_HAS_ANSI).  
1d160 20 20 20 20 68 4d 61 70 20 3d 20 6f 73 43 72 65      hMap = osCre
1d170 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 41 28  ateFileMappingA(
1d180 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2e  pShmNode->hFile.
1d190 68 2c 20 0a 20 20 20 20 20 20 20 20 20 20 4e 55  h, .          NU
1d1a0 4c 4c 2c 20 50 41 47 45 5f 52 45 41 44 57 52 49  LL, PAGE_READWRI
1d1b0 54 45 2c 20 30 2c 20 6e 42 79 74 65 2c 20 4e 55  TE, 0, nByte, NU
1d1c0 4c 4c 0a 20 20 20 20 20 20 29 3b 0a 23 65 6e 64  LL.      );.#end
1d1d0 69 66 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  if.      OSTRACE
1d1e0 28 28 22 53 48 4d 2d 4d 41 50 2d 43 52 45 41 54  (("SHM-MAP-CREAT
1d1f0 45 20 70 69 64 3d 25 6c 75 2c 20 72 65 67 69 6f  E pid=%lu, regio
1d200 6e 3d 25 64 2c 20 73 69 7a 65 3d 25 64 2c 20 72  n=%d, size=%d, r
1d210 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  c=%s\n",.       
1d220 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
1d230 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
1d240 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69   pShmNode->nRegi
1d250 6f 6e 2c 20 6e 42 79 74 65 2c 0a 20 20 20 20 20  on, nByte,.     
1d260 20 20 20 20 20 20 20 20 20 20 68 4d 61 70 20 3f            hMap ?
1d270 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22   "ok" : "failed"
1d280 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 68 4d  ));.      if( hM
1d290 61 70 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  ap ){.        in
1d2a0 74 20 69 4f 66 66 73 65 74 20 3d 20 70 53 68 6d  t iOffset = pShm
1d2b0 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2a 73 7a  Node->nRegion*sz
1d2c0 52 65 67 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20  Region;.        
1d2d0 69 6e 74 20 69 4f 66 66 73 65 74 53 68 69 66 74  int iOffsetShift
1d2e0 20 3d 20 69 4f 66 66 73 65 74 20 25 20 77 69 6e   = iOffset % win
1d2f0 53 79 73 49 6e 66 6f 2e 64 77 41 6c 6c 6f 63 61  SysInfo.dwAlloca
1d300 74 69 6f 6e 47 72 61 6e 75 6c 61 72 69 74 79 3b  tionGranularity;
1d310 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
1d320 49 4e 52 54 0a 20 20 20 20 20 20 20 20 70 4d 61  INRT.        pMa
1d330 70 20 3d 20 6f 73 4d 61 70 56 69 65 77 4f 66 46  p = osMapViewOfF
1d340 69 6c 65 46 72 6f 6d 41 70 70 28 68 4d 61 70 2c  ileFromApp(hMap,
1d350 20 46 49 4c 45 5f 4d 41 50 5f 57 52 49 54 45 20   FILE_MAP_WRITE 
1d360 7c 20 46 49 4c 45 5f 4d 41 50 5f 52 45 41 44 2c  | FILE_MAP_READ,
1d370 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 4f 66  .            iOf
1d380 66 73 65 74 20 2d 20 69 4f 66 66 73 65 74 53 68  fset - iOffsetSh
1d390 69 66 74 2c 20 73 7a 52 65 67 69 6f 6e 20 2b 20  ift, szRegion + 
1d3a0 69 4f 66 66 73 65 74 53 68 69 66 74 0a 20 20 20  iOffsetShift.   
1d3b0 20 20 20 20 20 29 3b 0a 23 65 6c 73 65 0a 20 20       );.#else.  
1d3c0 20 20 20 20 20 20 70 4d 61 70 20 3d 20 6f 73 4d        pMap = osM
1d3d0 61 70 56 69 65 77 4f 66 46 69 6c 65 28 68 4d 61  apViewOfFile(hMa
1d3e0 70 2c 20 46 49 4c 45 5f 4d 41 50 5f 57 52 49 54  p, FILE_MAP_WRIT
1d3f0 45 20 7c 20 46 49 4c 45 5f 4d 41 50 5f 52 45 41  E | FILE_MAP_REA
1d400 44 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 30  D,.            0
1d410 2c 20 69 4f 66 66 73 65 74 20 2d 20 69 4f 66 66  , iOffset - iOff
1d420 73 65 74 53 68 69 66 74 2c 20 73 7a 52 65 67 69  setShift, szRegi
1d430 6f 6e 20 2b 20 69 4f 66 66 73 65 74 53 68 69 66  on + iOffsetShif
1d440 74 0a 20 20 20 20 20 20 20 20 29 3b 0a 23 65 6e  t.        );.#en
1d450 64 69 66 0a 20 20 20 20 20 20 20 20 4f 53 54 52  dif.        OSTR
1d460 41 43 45 28 28 22 53 48 4d 2d 4d 41 50 2d 4d 41  ACE(("SHM-MAP-MA
1d470 50 20 70 69 64 3d 25 6c 75 2c 20 72 65 67 69 6f  P pid=%lu, regio
1d480 6e 3d 25 64 2c 20 6f 66 66 73 65 74 3d 25 64 2c  n=%d, offset=%d,
1d490 20 73 69 7a 65 3d 25 64 2c 20 72 63 3d 25 73 5c   size=%d, rc=%s\
1d4a0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
1d4b0 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e       osGetCurren
1d4c0 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 53  tProcessId(), pS
1d4d0 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2c  hmNode->nRegion,
1d4e0 20 69 4f 66 66 73 65 74 2c 0a 20 20 20 20 20 20   iOffset,.      
1d4f0 20 20 20 20 20 20 20 20 20 20 20 73 7a 52 65 67             szReg
1d500 69 6f 6e 2c 20 70 4d 61 70 20 3f 20 22 6f 6b 22  ion, pMap ? "ok"
1d510 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20   : "failed"));. 
1d520 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1d530 20 21 70 4d 61 70 20 29 7b 0a 20 20 20 20 20 20   !pMap ){.      
1d540 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6c 61 73 74    pShmNode->last
1d550 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
1d560 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20  tError();.      
1d570 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72    rc = winLogErr
1d580 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
1d590 53 48 4d 4d 41 50 2c 20 70 53 68 6d 4e 6f 64 65  SHMMAP, pShmNode
1d5a0 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20  ->lastErrno,.   
1d5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d5c0 20 20 20 20 20 20 22 77 69 6e 53 68 6d 4d 61 70        "winShmMap
1d5d0 33 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 68  3", pDbFd->zPath
1d5e0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 68  );.        if( h
1d5f0 4d 61 70 20 29 20 6f 73 43 6c 6f 73 65 48 61 6e  Map ) osCloseHan
1d600 64 6c 65 28 68 4d 61 70 29 3b 0a 20 20 20 20 20  dle(hMap);.     
1d610 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f     goto shmpage_
1d620 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  out;.      }..  
1d630 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52      pShmNode->aR
1d640 65 67 69 6f 6e 5b 70 53 68 6d 4e 6f 64 65 2d 3e  egion[pShmNode->
1d650 6e 52 65 67 69 6f 6e 5d 2e 70 4d 61 70 20 3d 20  nRegion].pMap = 
1d660 70 4d 61 70 3b 0a 20 20 20 20 20 20 70 53 68 6d  pMap;.      pShm
1d670 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 5b 70 53  Node->aRegion[pS
1d680 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 5d  hmNode->nRegion]
1d690 2e 68 4d 61 70 20 3d 20 68 4d 61 70 3b 0a 20 20  .hMap = hMap;.  
1d6a0 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52      pShmNode->nR
1d6b0 65 67 69 6f 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20  egion++;.    }. 
1d6c0 20 7d 0a 0a 73 68 6d 70 61 67 65 5f 6f 75 74 3a   }..shmpage_out:
1d6d0 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d  .  if( pShmNode-
1d6e0 3e 6e 52 65 67 69 6f 6e 3e 69 52 65 67 69 6f 6e  >nRegion>iRegion
1d6f0 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4f 66 66   ){.    int iOff
1d700 73 65 74 20 3d 20 69 52 65 67 69 6f 6e 2a 73 7a  set = iRegion*sz
1d710 52 65 67 69 6f 6e 3b 0a 20 20 20 20 69 6e 74 20  Region;.    int 
1d720 69 4f 66 66 73 65 74 53 68 69 66 74 20 3d 20 69  iOffsetShift = i
1d730 4f 66 66 73 65 74 20 25 20 77 69 6e 53 79 73 49  Offset % winSysI
1d740 6e 66 6f 2e 64 77 41 6c 6c 6f 63 61 74 69 6f 6e  nfo.dwAllocation
1d750 47 72 61 6e 75 6c 61 72 69 74 79 3b 0a 20 20 20  Granularity;.   
1d760 20 63 68 61 72 20 2a 70 20 3d 20 28 63 68 61 72   char *p = (char
1d770 20 2a 29 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65   *)pShmNode->aRe
1d780 67 69 6f 6e 5b 69 52 65 67 69 6f 6e 5d 2e 70 4d  gion[iRegion].pM
1d790 61 70 3b 0a 20 20 20 20 2a 70 70 20 3d 20 28 76  ap;.    *pp = (v
1d7a0 6f 69 64 20 2a 29 26 70 5b 69 4f 66 66 73 65 74  oid *)&p[iOffset
1d7b0 53 68 69 66 74 5d 3b 0a 20 20 7d 65 6c 73 65 7b  Shift];.  }else{
1d7c0 0a 20 20 20 20 2a 70 70 20 3d 20 30 3b 0a 20 20  .    *pp = 0;.  
1d7d0 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
1d7e0 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65  x_leave(pShmNode
1d7f0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
1d800 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6c 73 65 0a  rn rc;.}..#else.
1d810 23 20 64 65 66 69 6e 65 20 77 69 6e 53 68 6d 4d  # define winShmM
1d820 61 70 20 20 20 20 20 30 0a 23 20 64 65 66 69 6e  ap     0.# defin
1d830 65 20 77 69 6e 53 68 6d 4c 6f 63 6b 20 20 20 20  e winShmLock    
1d840 30 0a 23 20 64 65 66 69 6e 65 20 77 69 6e 53 68  0.# define winSh
1d850 6d 42 61 72 72 69 65 72 20 30 0a 23 20 64 65 66  mBarrier 0.# def
1d860 69 6e 65 20 77 69 6e 53 68 6d 55 6e 6d 61 70 20  ine winShmUnmap 
1d870 20 20 30 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69    0.#endif /* #i
1d880 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1d890 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  T_WAL */../*.** 
1d8a0 43 6c 65 61 6e 73 20 75 70 20 74 68 65 20 6d 61  Cleans up the ma
1d8b0 70 70 65 64 20 72 65 67 69 6f 6e 20 6f 66 20 74  pped region of t
1d8c0 68 65 20 73 70 65 63 69 66 69 65 64 20 66 69 6c  he specified fil
1d8d0 65 2c 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a 23 69  e, if any..*/.#i
1d8e0 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
1d8f0 50 5f 53 49 5a 45 3e 30 0a 73 74 61 74 69 63 20  P_SIZE>0.static 
1d900 69 6e 74 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65  int winUnmapfile
1d910 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29  (winFile *pFile)
1d920 7b 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  {.  assert( pFil
1d930 65 21 3d 30 20 29 3b 0a 20 20 4f 53 54 52 41 43  e!=0 );.  OSTRAC
1d940 45 28 28 22 55 4e 4d 41 50 2d 46 49 4c 45 20 70  E(("UNMAP-FILE p
1d950 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70  id=%lu, pFile=%p
1d960 2c 20 68 4d 61 70 3d 25 70 2c 20 70 4d 61 70 52  , hMap=%p, pMapR
1d970 65 67 69 6f 6e 3d 25 70 2c 20 22 0a 20 20 20 20  egion=%p, ".    
1d980 20 20 20 20 20 20 20 22 6d 6d 61 70 53 69 7a 65         "mmapSize
1d990 3d 25 6c 6c 64 2c 20 6d 6d 61 70 53 69 7a 65 41  =%lld, mmapSizeA
1d9a0 63 74 75 61 6c 3d 25 6c 6c 64 2c 20 6d 6d 61 70  ctual=%lld, mmap
1d9b0 53 69 7a 65 4d 61 78 3d 25 6c 6c 64 5c 6e 22 2c  SizeMax=%lld\n",
1d9c0 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65  .           osGe
1d9d0 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
1d9e0 64 28 29 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c  d(), pFile, pFil
1d9f0 65 2d 3e 68 4d 61 70 2c 20 70 46 69 6c 65 2d 3e  e->hMap, pFile->
1da00 70 4d 61 70 52 65 67 69 6f 6e 2c 0a 20 20 20 20  pMapRegion,.    
1da10 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d         pFile->mm
1da20 61 70 53 69 7a 65 2c 20 70 46 69 6c 65 2d 3e 6d  apSize, pFile->m
1da30 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 2c 20 70  mapSizeActual, p
1da40 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61  File->mmapSizeMa
1da50 78 29 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65  x));.  if( pFile
1da60 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 29 7b 0a  ->pMapRegion ){.
1da70 20 20 20 20 69 66 28 20 21 6f 73 55 6e 6d 61 70      if( !osUnmap
1da80 56 69 65 77 4f 66 46 69 6c 65 28 70 46 69 6c 65  ViewOfFile(pFile
1da90 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 20 29 7b  ->pMapRegion) ){
1daa0 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  .      pFile->la
1dab0 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
1dac0 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
1dad0 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4d 41    OSTRACE(("UNMA
1dae0 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c 75 2c 20  P-FILE pid=%lu, 
1daf0 70 46 69 6c 65 3d 25 70 2c 20 70 4d 61 70 52 65  pFile=%p, pMapRe
1db00 67 69 6f 6e 3d 25 70 2c 20 22 0a 20 20 20 20 20  gion=%p, ".     
1db10 20 20 20 20 20 20 20 20 20 20 22 72 63 3d 53 51            "rc=SQ
1db20 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 5c  LITE_IOERR_MMAP\
1db30 6e 22 2c 20 6f 73 47 65 74 43 75 72 72 65 6e 74  n", osGetCurrent
1db40 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69  ProcessId(), pFi
1db50 6c 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  le,.            
1db60 20 20 20 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65     pFile->pMapRe
1db70 67 69 6f 6e 29 29 3b 0a 20 20 20 20 20 20 72 65  gion));.      re
1db80 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72  turn winLogError
1db90 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d  (SQLITE_IOERR_MM
1dba0 41 50 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  AP, pFile->lastE
1dbb0 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
1dbc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1dbd0 77 69 6e 55 6e 6d 61 70 66 69 6c 65 31 22 2c 20  winUnmapfile1", 
1dbe0 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
1dbf0 20 20 20 7d 0a 20 20 20 20 70 46 69 6c 65 2d 3e     }.    pFile->
1dc00 70 4d 61 70 52 65 67 69 6f 6e 20 3d 20 30 3b 0a  pMapRegion = 0;.
1dc10 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53      pFile->mmapS
1dc20 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 46 69  ize = 0;.    pFi
1dc30 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75  le->mmapSizeActu
1dc40 61 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  al = 0;.  }.  if
1dc50 28 20 70 46 69 6c 65 2d 3e 68 4d 61 70 21 3d 4e  ( pFile->hMap!=N
1dc60 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28 20 21  ULL ){.    if( !
1dc70 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46  osCloseHandle(pF
1dc80 69 6c 65 2d 3e 68 4d 61 70 29 20 29 7b 0a 20 20  ile->hMap) ){.  
1dc90 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
1dca0 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
1dcb0 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 4f  Error();.      O
1dcc0 53 54 52 41 43 45 28 28 22 55 4e 4d 41 50 2d 46  STRACE(("UNMAP-F
1dcd0 49 4c 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69  ILE pid=%lu, pFi
1dce0 6c 65 3d 25 70 2c 20 68 4d 61 70 3d 25 70 2c 20  le=%p, hMap=%p, 
1dcf0 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rc=SQLITE_IOERR_
1dd00 4d 4d 41 50 5c 6e 22 2c 0a 20 20 20 20 20 20 20  MMAP\n",.       
1dd10 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
1dd20 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
1dd30 20 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68   pFile, pFile->h
1dd40 4d 61 70 29 29 3b 0a 20 20 20 20 20 20 72 65 74  Map));.      ret
1dd50 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  urn winLogError(
1dd60 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41  SQLITE_IOERR_MMA
1dd70 50 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  P, pFile->lastEr
1dd80 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
1dd90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
1dda0 69 6e 55 6e 6d 61 70 66 69 6c 65 32 22 2c 20 70  inUnmapfile2", p
1ddb0 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
1ddc0 20 20 7d 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68    }.    pFile->h
1ddd0 4d 61 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a  Map = NULL;.  }.
1dde0 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4d 41    OSTRACE(("UNMA
1ddf0 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c 75 2c 20  P-FILE pid=%lu, 
1de00 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c  pFile=%p, rc=SQL
1de10 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20  ITE_OK\n",.     
1de20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65        osGetCurre
1de30 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70  ntProcessId(), p
1de40 46 69 6c 65 29 29 3b 0a 20 20 72 65 74 75 72 6e  File));.  return
1de50 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
1de60 2a 0a 2a 2a 20 4d 65 6d 6f 72 79 20 6d 61 70 20  *.** Memory map 
1de70 6f 72 20 72 65 6d 61 70 20 74 68 65 20 66 69 6c  or remap the fil
1de80 65 20 6f 70 65 6e 65 64 20 62 79 20 66 69 6c 65  e opened by file
1de90 2d 64 65 73 63 72 69 70 74 6f 72 20 70 46 64 20  -descriptor pFd 
1dea0 28 69 66 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20  (if the file.** 
1deb0 69 73 20 61 6c 72 65 61 64 79 20 6d 61 70 70 65  is already mappe
1dec0 64 2c 20 74 68 65 20 65 78 69 73 74 69 6e 67 20  d, the existing 
1ded0 6d 61 70 70 69 6e 67 20 69 73 20 72 65 70 6c 61  mapping is repla
1dee0 63 65 64 20 62 79 20 74 68 65 20 6e 65 77 29 2e  ced by the new).
1def0 20 4f 72 2c 20 69 66 20 0a 2a 2a 20 74 68 65 72   Or, if .** ther
1df00 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  e already exists
1df10 20 61 20 6d 61 70 70 69 6e 67 20 66 6f 72 20 74   a mapping for t
1df20 68 69 73 20 66 69 6c 65 2c 20 61 6e 64 20 74 68  his file, and th
1df30 65 72 65 20 61 72 65 20 73 74 69 6c 6c 20 0a 2a  ere are still .*
1df40 2a 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 78 46  * outstanding xF
1df50 65 74 63 68 28 29 20 72 65 66 65 72 65 6e 63 65  etch() reference
1df60 73 20 74 6f 20 69 74 2c 20 74 68 69 73 20 66 75  s to it, this fu
1df70 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
1df80 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61  p..**.** If para
1df90 6d 65 74 65 72 20 6e 42 79 74 65 20 69 73 20 6e  meter nByte is n
1dfa0 6f 6e 2d 6e 65 67 61 74 69 76 65 2c 20 74 68 65  on-negative, the
1dfb0 6e 20 69 74 20 69 73 20 74 68 65 20 72 65 71 75  n it is the requ
1dfc0 65 73 74 65 64 20 73 69 7a 65 20 6f 66 20 0a 2a  ested size of .*
1dfd0 2a 20 74 68 65 20 6d 61 70 70 69 6e 67 20 74 6f  * the mapping to
1dfe0 20 63 72 65 61 74 65 2e 20 4f 74 68 65 72 77 69   create. Otherwi
1dff0 73 65 2c 20 69 66 20 6e 42 79 74 65 20 69 73 20  se, if nByte is 
1e000 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20  less than zero, 
1e010 74 68 65 6e 20 74 68 65 20 0a 2a 2a 20 72 65 71  then the .** req
1e020 75 65 73 74 65 64 20 73 69 7a 65 20 69 73 20 74  uested size is t
1e030 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66  he size of the f
1e040 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 54 68 65  ile on disk. The
1e050 20 61 63 74 75 61 6c 20 73 69 7a 65 20 6f 66 20   actual size of 
1e060 74 68 65 0a 2a 2a 20 63 72 65 61 74 65 64 20 6d  the.** created m
1e070 61 70 70 69 6e 67 20 69 73 20 65 69 74 68 65 72  apping is either
1e080 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 73   the requested s
1e090 69 7a 65 20 6f 72 20 74 68 65 20 76 61 6c 75 65  ize or the value
1e0a0 20 63 6f 6e 66 69 67 75 72 65 64 20 0a 2a 2a 20   configured .** 
1e0b0 75 73 69 6e 67 20 53 51 4c 49 54 45 5f 46 43 4e  using SQLITE_FCN
1e0c0 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 2c 20 77 68  TL_MMAP_SIZE, wh
1e0d0 69 63 68 65 76 65 72 20 69 73 20 73 6d 61 6c 6c  ichever is small
1e0e0 65 72 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  er..**.** SQLITE
1e0f0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
1e100 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75  if no error occu
1e110 72 73 20 28 65 76 65 6e 20 69 66 20 74 68 65 20  rs (even if the 
1e120 6d 61 70 70 69 6e 67 20 69 73 20 6e 6f 74 0a 2a  mapping is not.*
1e130 2a 20 72 65 63 72 65 61 74 65 64 20 61 73 20 61  * recreated as a
1e140 20 72 65 73 75 6c 74 20 6f 66 20 6f 75 74 73 74   result of outst
1e150 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65  anding reference
1e160 73 29 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20  s) or an SQLite 
1e170 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 6f 74  error.** code ot
1e180 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74  herwise..*/.stat
1e190 69 63 20 69 6e 74 20 77 69 6e 4d 61 70 66 69 6c  ic int winMapfil
1e1a0 65 28 77 69 6e 46 69 6c 65 20 2a 70 46 64 2c 20  e(winFile *pFd, 
1e1b0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 42  sqlite3_int64 nB
1e1c0 79 74 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  yte){.  sqlite3_
1e1d0 69 6e 74 36 34 20 6e 4d 61 70 20 3d 20 6e 42 79  int64 nMap = nBy
1e1e0 74 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  te;.  int rc;.. 
1e1f0 20 61 73 73 65 72 74 28 20 6e 4d 61 70 3e 3d 30   assert( nMap>=0
1e200 20 7c 7c 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f   || pFd->nFetchO
1e210 75 74 3d 3d 30 20 29 3b 0a 20 20 4f 53 54 52 41  ut==0 );.  OSTRA
1e220 43 45 28 28 22 4d 41 50 2d 46 49 4c 45 20 70 69  CE(("MAP-FILE pi
1e230 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c  d=%lu, pFile=%p,
1e240 20 73 69 7a 65 3d 25 6c 6c 64 5c 6e 22 2c 0a 20   size=%lld\n",. 
1e250 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43            osGetC
1e260 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28  urrentProcessId(
1e270 29 2c 20 70 46 64 2c 20 6e 42 79 74 65 29 29 3b  ), pFd, nByte));
1e280 0a 0a 20 20 69 66 28 20 70 46 64 2d 3e 6e 46 65  ..  if( pFd->nFe
1e290 74 63 68 4f 75 74 3e 30 20 29 20 72 65 74 75 72  tchOut>0 ) retur
1e2a0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  n SQLITE_OK;..  
1e2b0 69 66 28 20 6e 4d 61 70 3c 30 20 29 7b 0a 20 20  if( nMap<0 ){.  
1e2c0 20 20 72 63 20 3d 20 77 69 6e 46 69 6c 65 53 69    rc = winFileSi
1e2d0 7a 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ze((sqlite3_file
1e2e0 2a 29 70 46 64 2c 20 26 6e 4d 61 70 29 3b 0a 20  *)pFd, &nMap);. 
1e2f0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
1e300 20 20 20 4f 53 54 52 41 43 45 28 28 22 4d 41 50     OSTRACE(("MAP
1e310 2d 46 49 4c 45 20 70 69 64 3d 25 6c 75 2c 20 70  -FILE pid=%lu, p
1e320 46 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49  File=%p, rc=SQLI
1e330 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 5c 6e  TE_IOERR_FSTAT\n
1e340 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1e350 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72    osGetCurrentPr
1e360 6f 63 65 73 73 49 64 28 29 2c 20 70 46 64 29 29  ocessId(), pFd))
1e370 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
1e380 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41  QLITE_IOERR_FSTA
1e390 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  T;.    }.  }.  i
1e3a0 66 28 20 6e 4d 61 70 3e 70 46 64 2d 3e 6d 6d 61  f( nMap>pFd->mma
1e3b0 70 53 69 7a 65 4d 61 78 20 29 7b 0a 20 20 20 20  pSizeMax ){.    
1e3c0 6e 4d 61 70 20 3d 20 70 46 64 2d 3e 6d 6d 61 70  nMap = pFd->mmap
1e3d0 53 69 7a 65 4d 61 78 3b 0a 20 20 7d 0a 20 20 6e  SizeMax;.  }.  n
1e3e0 4d 61 70 20 26 3d 20 7e 28 73 71 6c 69 74 65 33  Map &= ~(sqlite3
1e3f0 5f 69 6e 74 36 34 29 28 77 69 6e 53 79 73 49 6e  _int64)(winSysIn
1e400 66 6f 2e 64 77 50 61 67 65 53 69 7a 65 20 2d 20  fo.dwPageSize - 
1e410 31 29 3b 0a 20 0a 20 20 69 66 28 20 6e 4d 61 70  1);. .  if( nMap
1e420 3d 3d 30 20 26 26 20 70 46 64 2d 3e 6d 6d 61 70  ==0 && pFd->mmap
1e430 53 69 7a 65 3e 30 20 29 7b 0a 20 20 20 20 77 69  Size>0 ){.    wi
1e440 6e 55 6e 6d 61 70 66 69 6c 65 28 70 46 64 29 3b  nUnmapfile(pFd);
1e450 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4d 61 70 21  .  }.  if( nMap!
1e460 3d 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 29  =pFd->mmapSize )
1e470 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4e 65 77  {.    void *pNew
1e480 20 3d 20 30 3b 0a 20 20 20 20 44 57 4f 52 44 20   = 0;.    DWORD 
1e490 70 72 6f 74 65 63 74 20 3d 20 50 41 47 45 5f 52  protect = PAGE_R
1e4a0 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 44 57 4f  EADONLY;.    DWO
1e4b0 52 44 20 66 6c 61 67 73 20 3d 20 46 49 4c 45 5f  RD flags = FILE_
1e4c0 4d 41 50 5f 52 45 41 44 3b 0a 0a 20 20 20 20 77  MAP_READ;..    w
1e4d0 69 6e 55 6e 6d 61 70 66 69 6c 65 28 70 46 64 29  inUnmapfile(pFd)
1e4e0 3b 0a 20 20 20 20 69 66 28 20 28 70 46 64 2d 3e  ;.    if( (pFd->
1e4f0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 49 4e 46  ctrlFlags & WINF
1e500 49 4c 45 5f 52 44 4f 4e 4c 59 29 3d 3d 30 20 29  ILE_RDONLY)==0 )
1e510 7b 0a 20 20 20 20 20 20 70 72 6f 74 65 63 74 20  {.      protect 
1e520 3d 20 50 41 47 45 5f 52 45 41 44 57 52 49 54 45  = PAGE_READWRITE
1e530 3b 0a 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d  ;.      flags |=
1e540 20 46 49 4c 45 5f 4d 41 50 5f 57 52 49 54 45 3b   FILE_MAP_WRITE;
1e550 0a 20 20 20 20 7d 0a 23 69 66 20 53 51 4c 49 54  .    }.#if SQLIT
1e560 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 70  E_OS_WINRT.    p
1e570 46 64 2d 3e 68 4d 61 70 20 3d 20 6f 73 43 72 65  Fd->hMap = osCre
1e580 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 46 72  ateFileMappingFr
1e590 6f 6d 41 70 70 28 70 46 64 2d 3e 68 2c 20 4e 55  omApp(pFd->h, NU
1e5a0 4c 4c 2c 20 70 72 6f 74 65 63 74 2c 20 6e 4d 61  LL, protect, nMa
1e5b0 70 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6c 69 66 20  p, NULL);.#elif 
1e5c0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
1e5d0 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20  IN32_HAS_WIDE). 
1e5e0 20 20 20 70 46 64 2d 3e 68 4d 61 70 20 3d 20 6f     pFd->hMap = o
1e5f0 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69  sCreateFileMappi
1e600 6e 67 57 28 70 46 64 2d 3e 68 2c 20 4e 55 4c 4c  ngW(pFd->h, NULL
1e610 2c 20 70 72 6f 74 65 63 74 2c 0a 20 20 20 20 20  , protect,.     
1e620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e630 20 20 20 20 20 20 20 20 20 20 20 28 44 57 4f 52             (DWOR
1e640 44 29 28 28 6e 4d 61 70 3e 3e 33 32 29 20 26 20  D)((nMap>>32) & 
1e650 30 78 66 66 66 66 66 66 66 66 29 2c 0a 20 20 20  0xffffffff),.   
1e660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e670 20 20 20 20 20 20 20 20 20 20 20 20 20 28 44 57               (DW
1e680 4f 52 44 29 28 6e 4d 61 70 20 26 20 30 78 66 66  ORD)(nMap & 0xff
1e690 66 66 66 66 66 66 29 2c 20 4e 55 4c 4c 29 3b 0a  ffffff), NULL);.
1e6a0 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 53 51  #elif defined(SQ
1e6b0 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
1e6c0 4e 53 49 29 0a 20 20 20 20 70 46 64 2d 3e 68 4d  NSI).    pFd->hM
1e6d0 61 70 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c  ap = osCreateFil
1e6e0 65 4d 61 70 70 69 6e 67 41 28 70 46 64 2d 3e 68  eMappingA(pFd->h
1e6f0 2c 20 4e 55 4c 4c 2c 20 70 72 6f 74 65 63 74 2c  , NULL, protect,
1e700 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1e710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e720 20 28 44 57 4f 52 44 29 28 28 6e 4d 61 70 3e 3e   (DWORD)((nMap>>
1e730 33 32 29 20 26 20 30 78 66 66 66 66 66 66 66 66  32) & 0xffffffff
1e740 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
1e750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e760 20 20 20 28 44 57 4f 52 44 29 28 6e 4d 61 70 20     (DWORD)(nMap 
1e770 26 20 30 78 66 66 66 66 66 66 66 66 29 2c 20 4e  & 0xffffffff), N
1e780 55 4c 4c 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  ULL);.#endif.   
1e790 20 69 66 28 20 70 46 64 2d 3e 68 4d 61 70 3d 3d   if( pFd->hMap==
1e7a0 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 70 46  NULL ){.      pF
1e7b0 64 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f  d->lastErrno = o
1e7c0 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b  sGetLastError();
1e7d0 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c  .      rc = winL
1e7e0 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
1e7f0 4f 45 52 52 5f 4d 4d 41 50 2c 20 70 46 64 2d 3e  OERR_MMAP, pFd->
1e800 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  lastErrno,.     
1e810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e820 20 20 22 77 69 6e 4d 61 70 66 69 6c 65 31 22 2c    "winMapfile1",
1e830 20 70 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20   pFd->zPath);.  
1e840 20 20 20 20 2f 2a 20 4c 6f 67 20 74 68 65 20 65      /* Log the e
1e850 72 72 6f 72 2c 20 62 75 74 20 63 6f 6e 74 69 6e  rror, but contin
1e860 75 65 20 6e 6f 72 6d 61 6c 20 6f 70 65 72 61 74  ue normal operat
1e870 69 6f 6e 20 75 73 69 6e 67 20 78 52 65 61 64 2f  ion using xRead/
1e880 78 57 72 69 74 65 20 2a 2f 0a 20 20 20 20 20 20  xWrite */.      
1e890 4f 53 54 52 41 43 45 28 28 22 4d 41 50 2d 46 49  OSTRACE(("MAP-FI
1e8a0 4c 45 2d 43 52 45 41 54 45 20 70 69 64 3d 25 6c  LE-CREATE pid=%l
1e8b0 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d  u, pFile=%p, rc=
1e8c0 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
1e8d0 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65        osGetCurre
1e8e0 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70  ntProcessId(), p
1e8f0 46 64 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61  Fd, sqlite3ErrNa
1e900 6d 65 28 72 63 29 29 29 3b 0a 20 20 20 20 20 20  me(rc)));.      
1e910 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1e920 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
1e930 72 74 28 20 28 6e 4d 61 70 20 25 20 77 69 6e 53  rt( (nMap % winS
1e940 79 73 49 6e 66 6f 2e 64 77 50 61 67 65 53 69 7a  ysInfo.dwPageSiz
1e950 65 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  e)==0 );.    ass
1e960 65 72 74 28 20 73 69 7a 65 6f 66 28 53 49 5a 45  ert( sizeof(SIZE
1e970 5f 54 29 3d 3d 73 69 7a 65 6f 66 28 73 71 6c 69  _T)==sizeof(sqli
1e980 74 65 33 5f 69 6e 74 36 34 29 20 7c 7c 20 6e 4d  te3_int64) || nM
1e990 61 70 3c 3d 30 78 66 66 66 66 66 66 66 66 20 29  ap<=0xffffffff )
1e9a0 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ;.#if SQLITE_OS_
1e9b0 57 49 4e 52 54 0a 20 20 20 20 70 4e 65 77 20 3d  WINRT.    pNew =
1e9c0 20 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 6c 65   osMapViewOfFile
1e9d0 46 72 6f 6d 41 70 70 28 70 46 64 2d 3e 68 4d 61  FromApp(pFd->hMa
1e9e0 70 2c 20 66 6c 61 67 73 2c 20 30 2c 20 28 53 49  p, flags, 0, (SI
1e9f0 5a 45 5f 54 29 6e 4d 61 70 29 3b 0a 23 65 6c 73  ZE_T)nMap);.#els
1ea00 65 0a 20 20 20 20 70 4e 65 77 20 3d 20 6f 73 4d  e.    pNew = osM
1ea10 61 70 56 69 65 77 4f 66 46 69 6c 65 28 70 46 64  apViewOfFile(pFd
1ea20 2d 3e 68 4d 61 70 2c 20 66 6c 61 67 73 2c 20 30  ->hMap, flags, 0
1ea30 2c 20 30 2c 20 28 53 49 5a 45 5f 54 29 6e 4d 61  , 0, (SIZE_T)nMa
1ea40 70 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69  p);.#endif.    i
1ea50 66 28 20 70 4e 65 77 3d 3d 4e 55 4c 4c 20 29 7b  f( pNew==NULL ){
1ea60 0a 20 20 20 20 20 20 6f 73 43 6c 6f 73 65 48 61  .      osCloseHa
1ea70 6e 64 6c 65 28 70 46 64 2d 3e 68 4d 61 70 29 3b  ndle(pFd->hMap);
1ea80 0a 20 20 20 20 20 20 70 46 64 2d 3e 68 4d 61 70  .      pFd->hMap
1ea90 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 70   = NULL;.      p
1eaa0 46 64 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  Fd->lastErrno = 
1eab0 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
1eac0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e  ;.      rc = win
1ead0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
1eae0 49 4f 45 52 52 5f 4d 4d 41 50 2c 20 70 46 64 2d  IOERR_MMAP, pFd-
1eaf0 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20  >lastErrno,.    
1eb00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb10 20 20 20 22 77 69 6e 4d 61 70 66 69 6c 65 32 22     "winMapfile2"
1eb20 2c 20 70 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20  , pFd->zPath);. 
1eb30 20 20 20 20 20 2f 2a 20 4c 6f 67 20 74 68 65 20       /* Log the 
1eb40 65 72 72 6f 72 2c 20 62 75 74 20 63 6f 6e 74 69  error, but conti
1eb50 6e 75 65 20 6e 6f 72 6d 61 6c 20 6f 70 65 72 61  nue normal opera
1eb60 74 69 6f 6e 20 75 73 69 6e 67 20 78 52 65 61 64  tion using xRead
1eb70 2f 78 57 72 69 74 65 20 2a 2f 0a 20 20 20 20 20  /xWrite */.     
1eb80 20 4f 53 54 52 41 43 45 28 28 22 4d 41 50 2d 46   OSTRACE(("MAP-F
1eb90 49 4c 45 2d 4d 41 50 20 70 69 64 3d 25 6c 75 2c  ILE-MAP pid=%lu,
1eba0 20 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73   pFile=%p, rc=%s
1ebb0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
1ebc0 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74      osGetCurrent
1ebd0 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 64  ProcessId(), pFd
1ebe0 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65  , sqlite3ErrName
1ebf0 28 72 63 29 29 29 3b 0a 20 20 20 20 20 20 72 65  (rc)));.      re
1ec00 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1ec10 20 20 20 20 7d 0a 20 20 20 20 70 46 64 2d 3e 70      }.    pFd->p
1ec20 4d 61 70 52 65 67 69 6f 6e 20 3d 20 70 4e 65 77  MapRegion = pNew
1ec30 3b 0a 20 20 20 20 70 46 64 2d 3e 6d 6d 61 70 53  ;.    pFd->mmapS
1ec40 69 7a 65 20 3d 20 6e 4d 61 70 3b 0a 20 20 20 20  ize = nMap;.    
1ec50 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74  pFd->mmapSizeAct
1ec60 75 61 6c 20 3d 20 6e 4d 61 70 3b 0a 20 20 7d 0a  ual = nMap;.  }.
1ec70 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4d 41 50  .  OSTRACE(("MAP
1ec80 2d 46 49 4c 45 20 70 69 64 3d 25 6c 75 2c 20 70  -FILE pid=%lu, p
1ec90 46 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49  File=%p, rc=SQLI
1eca0 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20  TE_OK\n",.      
1ecb0 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e       osGetCurren
1ecc0 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46  tProcessId(), pF
1ecd0 64 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  d));.  return SQ
1ece0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
1ecf0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f  f /* SQLITE_MAX_
1ed00 4d 4d 41 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a  MMAP_SIZE>0 */..
1ed10 2f 2a 0a 2a 2a 20 49 66 20 70 6f 73 73 69 62 6c  /*.** If possibl
1ed20 65 2c 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  e, return a poin
1ed30 74 65 72 20 74 6f 20 61 20 6d 61 70 70 69 6e 67  ter to a mapping
1ed40 20 6f 66 20 66 69 6c 65 20 66 64 20 73 74 61 72   of file fd star
1ed50 74 69 6e 67 20 61 74 20 6f 66 66 73 65 74 0a 2a  ting at offset.*
1ed60 2a 20 69 4f 66 66 2e 20 54 68 65 20 6d 61 70 70  * iOff. The mapp
1ed70 69 6e 67 20 6d 75 73 74 20 62 65 20 76 61 6c 69  ing must be vali
1ed80 64 20 66 6f 72 20 61 74 20 6c 65 61 73 74 20 6e  d for at least n
1ed90 41 6d 74 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a  Amt bytes..**.**
1eda0 20 49 66 20 73 75 63 68 20 61 20 70 6f 69 6e 74   If such a point
1edb0 65 72 20 63 61 6e 20 62 65 20 6f 62 74 61 69 6e  er can be obtain
1edc0 65 64 2c 20 73 74 6f 72 65 20 69 74 20 69 6e 20  ed, store it in 
1edd0 2a 70 70 20 61 6e 64 20 72 65 74 75 72 6e 20 53  *pp and return S
1ede0 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 4f 72 2c  QLITE_OK..** Or,
1edf0 20 69 66 20 6f 6e 65 20 63 61 6e 6e 6f 74 20 62   if one cannot b
1ee00 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75  ut no error occu
1ee10 72 73 2c 20 73 65 74 20 2a 70 70 20 74 6f 20 30  rs, set *pp to 0
1ee20 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
1ee30 54 45 5f 4f 4b 2e 0a 2a 2a 20 46 69 6e 61 6c 6c  TE_OK..** Finall
1ee40 79 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20 64  y, if an error d
1ee50 6f 65 73 20 6f 63 63 75 72 2c 20 72 65 74 75 72  oes occur, retur
1ee60 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  n an SQLite erro
1ee70 72 20 63 6f 64 65 2e 20 54 68 65 20 66 69 6e 61  r code. The fina
1ee80 6c 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 2a 70  l.** value of *p
1ee90 70 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20 69  p is undefined i
1eea0 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a  n this case..**.
1eeb0 2a 2a 20 49 66 20 74 68 69 73 20 66 75 6e 63 74  ** If this funct
1eec0 69 6f 6e 20 64 6f 65 73 20 72 65 74 75 72 6e 20  ion does return 
1eed0 61 20 70 6f 69 6e 74 65 72 2c 20 74 68 65 20 63  a pointer, the c
1eee0 61 6c 6c 65 72 20 6d 75 73 74 20 65 76 65 6e 74  aller must event
1eef0 75 61 6c 6c 79 20 0a 2a 2a 20 72 65 6c 65 61 73  ually .** releas
1ef00 65 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  e the reference 
1ef10 62 79 20 63 61 6c 6c 69 6e 67 20 77 69 6e 55 6e  by calling winUn
1ef20 66 65 74 63 68 28 29 2e 0a 2a 2f 0a 73 74 61 74  fetch()..*/.stat
1ef30 69 63 20 69 6e 74 20 77 69 6e 46 65 74 63 68 28  ic int winFetch(
1ef40 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
1ef50 2c 20 69 36 34 20 69 4f 66 66 2c 20 69 6e 74 20  , i64 iOff, int 
1ef60 6e 41 6d 74 2c 20 76 6f 69 64 20 2a 2a 70 70 29  nAmt, void **pp)
1ef70 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  {.#if SQLITE_MAX
1ef80 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 77  _MMAP_SIZE>0.  w
1ef90 69 6e 46 69 6c 65 20 2a 70 46 64 20 3d 20 28 77  inFile *pFd = (w
1efa0 69 6e 46 69 6c 65 2a 29 66 64 3b 20 20 20 2f 2a  inFile*)fd;   /*
1efb0 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   The underlying 
1efc0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
1efd0 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70 20 3d 20  .#endif.  *pp = 
1efe0 30 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22  0;..  OSTRACE(("
1eff0 46 45 54 43 48 20 70 69 64 3d 25 6c 75 2c 20 70  FETCH pid=%lu, p
1f000 46 69 6c 65 3d 25 70 2c 20 6f 66 66 73 65 74 3d  File=%p, offset=
1f010 25 6c 6c 64 2c 20 61 6d 6f 75 6e 74 3d 25 64 2c  %lld, amount=%d,
1f020 20 70 70 3d 25 70 5c 6e 22 2c 0a 20 20 20 20 20   pp=%p\n",.     
1f030 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65        osGetCurre
1f040 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 66  ntProcessId(), f
1f050 64 2c 20 69 4f 66 66 2c 20 6e 41 6d 74 2c 20 70  d, iOff, nAmt, p
1f060 70 29 29 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45  p));..#if SQLITE
1f070 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
1f080 0a 20 20 69 66 28 20 70 46 64 2d 3e 6d 6d 61 70  .  if( pFd->mmap
1f090 53 69 7a 65 4d 61 78 3e 30 20 29 7b 0a 20 20 20  SizeMax>0 ){.   
1f0a0 20 69 66 28 20 70 46 64 2d 3e 70 4d 61 70 52 65   if( pFd->pMapRe
1f0b0 67 69 6f 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  gion==0 ){.     
1f0c0 20 69 6e 74 20 72 63 20 3d 20 77 69 6e 4d 61 70   int rc = winMap
1f0d0 66 69 6c 65 28 70 46 64 2c 20 2d 31 29 3b 0a 20  file(pFd, -1);. 
1f0e0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1f0f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1f100 20 20 4f 53 54 52 41 43 45 28 28 22 46 45 54 43    OSTRACE(("FETC
1f110 48 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65  H pid=%lu, pFile
1f120 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20  =%p, rc=%s\n",. 
1f130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f140 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
1f150 65 73 73 49 64 28 29 2c 20 70 46 64 2c 20 73 71  essId(), pFd, sq
1f160 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29  lite3ErrName(rc)
1f170 29 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ));.        retu
1f180 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
1f190 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46 64     }.    if( pFd
1f1a0 2d 3e 6d 6d 61 70 53 69 7a 65 20 3e 3d 20 69 4f  ->mmapSize >= iO
1f1b0 66 66 2b 6e 41 6d 74 20 29 7b 0a 20 20 20 20 20  ff+nAmt ){.     
1f1c0 20 2a 70 70 20 3d 20 26 28 28 75 38 20 2a 29 70   *pp = &((u8 *)p
1f1d0 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 5b  Fd->pMapRegion)[
1f1e0 69 4f 66 66 5d 3b 0a 20 20 20 20 20 20 70 46 64  iOff];.      pFd
1f1f0 2d 3e 6e 46 65 74 63 68 4f 75 74 2b 2b 3b 0a 20  ->nFetchOut++;. 
1f200 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
1f210 0a 20 20 4f 53 54 52 41 43 45 28 28 22 46 45 54  .  OSTRACE(("FET
1f220 43 48 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c  CH pid=%lu, pFil
1f230 65 3d 25 70 2c 20 70 70 3d 25 70 2c 20 2a 70 70  e=%p, pp=%p, *pp
1f240 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f  =%p, rc=SQLITE_O
1f250 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  K\n",.          
1f260 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
1f270 63 65 73 73 49 64 28 29 2c 20 66 64 2c 20 70 70  cessId(), fd, pp
1f280 2c 20 2a 70 70 29 29 3b 0a 20 20 72 65 74 75 72  , *pp));.  retur
1f290 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1f2a0 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 74 68 69  /*.** If the thi
1f2b0 72 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e  rd argument is n
1f2c0 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68  on-NULL, then th
1f2d0 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 6c 65  is function rele
1f2e0 61 73 65 73 20 61 20 0a 2a 2a 20 72 65 66 65 72  ases a .** refer
1f2f0 65 6e 63 65 20 6f 62 74 61 69 6e 65 64 20 62 79  ence obtained by
1f300 20 61 6e 20 65 61 72 6c 69 65 72 20 63 61 6c 6c   an earlier call
1f310 20 74 6f 20 77 69 6e 46 65 74 63 68 28 29 2e 20   to winFetch(). 
1f320 54 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 61 72  The second.** ar
1f330 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f  gument passed to
1f340 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   this function m
1f350 75 73 74 20 62 65 20 74 68 65 20 73 61 6d 65 20  ust be the same 
1f360 61 73 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  as the correspon
1f370 64 69 6e 67 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  ding.** argument
1f380 20 74 68 61 74 20 77 61 73 20 70 61 73 73 65 64   that was passed
1f390 20 74 6f 20 74 68 65 20 77 69 6e 46 65 74 63 68   to the winFetch
1f3a0 28 29 20 69 6e 76 6f 63 61 74 69 6f 6e 2e 20 0a  () invocation. .
1f3b0 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65  **.** Or, if the
1f3c0 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 20   third argument 
1f3d0 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68  is NULL, then th
1f3e0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 62  is function is b
1f3f0 65 69 6e 67 20 63 61 6c 6c 65 64 20 0a 2a 2a 20  eing called .** 
1f400 74 6f 20 69 6e 66 6f 72 6d 20 74 68 65 20 56 46  to inform the VF
1f410 53 20 6c 61 79 65 72 20 74 68 61 74 2c 20 61 63  S layer that, ac
1f420 63 6f 72 64 69 6e 67 20 74 6f 20 50 4f 53 49 58  cording to POSIX
1f430 2c 20 61 6e 79 20 65 78 69 73 74 69 6e 67 20 6d  , any existing m
1f440 61 70 70 69 6e 67 20 0a 2a 2a 20 6d 61 79 20 6e  apping .** may n
1f450 6f 77 20 62 65 20 69 6e 76 61 6c 69 64 20 61 6e  ow be invalid an
1f460 64 20 73 68 6f 75 6c 64 20 62 65 20 75 6e 6d 61  d should be unma
1f470 70 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pped..*/.static 
1f480 69 6e 74 20 77 69 6e 55 6e 66 65 74 63 68 28 73  int winUnfetch(s
1f490 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c  qlite3_file *fd,
1f4a0 20 69 36 34 20 69 4f 66 66 2c 20 76 6f 69 64 20   i64 iOff, void 
1f4b0 2a 70 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f  *p){.#if SQLITE_
1f4c0 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
1f4d0 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 64 20 3d    winFile *pFd =
1f4e0 20 28 77 69 6e 46 69 6c 65 2a 29 66 64 3b 20 20   (winFile*)fd;  
1f4f0 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69   /* The underlyi
1f500 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ng database file
1f510 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 70 3d 3d   */..  /* If p==
1f520 30 20 28 75 6e 6d 61 70 20 74 68 65 20 65 6e 74  0 (unmap the ent
1f530 69 72 65 20 66 69 6c 65 29 20 74 68 65 6e 20 74  ire file) then t
1f540 68 65 72 65 20 6d 75 73 74 20 62 65 20 6e 6f 20  here must be no 
1f550 6f 75 74 73 74 61 6e 64 69 6e 67 20 0a 20 20 2a  outstanding .  *
1f560 2a 20 78 46 65 74 63 68 20 72 65 66 65 72 65 6e  * xFetch referen
1f570 63 65 73 2e 20 4f 72 2c 20 69 66 20 70 21 3d 30  ces. Or, if p!=0
1f580 20 28 6d 65 61 6e 69 6e 67 20 69 74 20 69 73 20   (meaning it is 
1f590 61 6e 20 78 46 65 74 63 68 20 72 65 66 65 72 65  an xFetch refere
1f5a0 6e 63 65 29 2c 0a 20 20 2a 2a 20 74 68 65 6e 20  nce),.  ** then 
1f5b0 74 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 74  there must be at
1f5c0 20 6c 65 61 73 74 20 6f 6e 65 20 6f 75 74 73 74   least one outst
1f5d0 61 6e 64 69 6e 67 2e 20 20 2a 2f 0a 20 20 61 73  anding.  */.  as
1f5e0 73 65 72 74 28 20 28 70 3d 3d 30 29 3d 3d 28 70  sert( (p==0)==(p
1f5f0 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30  Fd->nFetchOut==0
1f600 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 21  ) );..  /* If p!
1f610 3d 30 2c 20 69 74 20 6d 75 73 74 20 6d 61 74 63  =0, it must matc
1f620 68 20 74 68 65 20 69 4f 66 66 20 76 61 6c 75 65  h the iOff value
1f630 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  . */.  assert( p
1f640 3d 3d 30 20 7c 7c 20 70 3d 3d 26 28 28 75 38 20  ==0 || p==&((u8 
1f650 2a 29 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f  *)pFd->pMapRegio
1f660 6e 29 5b 69 4f 66 66 5d 20 29 3b 0a 0a 20 20 4f  n)[iOff] );..  O
1f670 53 54 52 41 43 45 28 28 22 55 4e 46 45 54 43 48  STRACE(("UNFETCH
1f680 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d   pid=%lu, pFile=
1f690 25 70 2c 20 6f 66 66 73 65 74 3d 25 6c 6c 64 2c  %p, offset=%lld,
1f6a0 20 70 3d 25 70 5c 6e 22 2c 0a 20 20 20 20 20 20   p=%p\n",.      
1f6b0 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e       osGetCurren
1f6c0 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46  tProcessId(), pF
1f6d0 64 2c 20 69 4f 66 66 2c 20 70 29 29 3b 0a 0a 20  d, iOff, p));.. 
1f6e0 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 70 46   if( p ){.    pF
1f6f0 64 2d 3e 6e 46 65 74 63 68 4f 75 74 2d 2d 3b 0a  d->nFetchOut--;.
1f700 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
1f710 46 49 58 4d 45 3a 20 20 49 66 20 57 69 6e 64 6f  FIXME:  If Windo
1f720 77 73 20 74 72 75 6c 79 20 61 6c 77 61 79 73 20  ws truly always 
1f730 70 72 65 76 65 6e 74 73 20 74 72 75 6e 63 61 74  prevents truncat
1f740 69 6e 67 20 6f 72 20 64 65 6c 65 74 69 6e 67 20  ing or deleting 
1f750 61 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 77 68  a.    ** file wh
1f760 69 6c 65 20 61 20 6d 61 70 70 69 6e 67 20 69 73  ile a mapping is
1f770 20 68 65 6c 64 2c 20 74 68 65 6e 20 74 68 65 20   held, then the 
1f780 66 6f 6c 6c 6f 77 69 6e 67 20 77 69 6e 55 6e 6d  following winUnm
1f790 61 70 66 69 6c 65 28 29 20 63 61 6c 6c 0a 20 20  apfile() call.  
1f7a0 20 20 2a 2a 20 69 73 20 75 6e 6e 65 63 65 73 73    ** is unnecess
1f7b0 61 72 79 20 63 61 6e 20 63 61 6e 20 62 65 20 6f  ary can can be o
1f7c0 6d 69 74 74 65 64 20 2d 20 70 6f 74 65 6e 74 69  mitted - potenti
1f7d0 61 6c 6c 79 20 69 6d 70 72 6f 76 69 6e 67 0a 20  ally improving. 
1f7e0 20 20 20 2a 2a 20 70 65 72 66 6f 72 6d 61 6e 63     ** performanc
1f7f0 65 2e 20 20 2a 2f 0a 20 20 20 20 77 69 6e 55 6e  e.  */.    winUn
1f800 6d 61 70 66 69 6c 65 28 70 46 64 29 3b 0a 20 20  mapfile(pFd);.  
1f810 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 64  }..  assert( pFd
1f820 2d 3e 6e 46 65 74 63 68 4f 75 74 3e 3d 30 20 29  ->nFetchOut>=0 )
1f830 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 4f 53 54 52  ;.#endif..  OSTR
1f840 41 43 45 28 28 22 55 4e 46 45 54 43 48 20 70 69  ACE(("UNFETCH pi
1f850 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c  d=%lu, pFile=%p,
1f860 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22   rc=SQLITE_OK\n"
1f870 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 47  ,.           osG
1f880 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
1f890 49 64 28 29 2c 20 66 64 29 29 3b 0a 20 20 72 65  Id(), fd));.  re
1f8a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1f8b0 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20 65 6e  }../*.** Here en
1f8c0 64 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  ds the implement
1f8d0 61 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 73 71 6c  ation of all sql
1f8e0 69 74 65 33 5f 66 69 6c 65 20 6d 65 74 68 6f 64  ite3_file method
1f8f0 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  s..**.**********
1f900 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64  ************ End
1f910 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 4d 65   sqlite3_file Me
1f920 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  thods **********
1f930 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f940 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
1f950 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f960 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f970 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f980 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f990 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ****/../*.** Thi
1f9a0 73 20 76 65 63 74 6f 72 20 64 65 66 69 6e 65 73  s vector defines
1f9b0 20 61 6c 6c 20 74 68 65 20 6d 65 74 68 6f 64 73   all the methods
1f9c0 20 74 68 61 74 20 63 61 6e 20 6f 70 65 72 61 74   that can operat
1f9d0 65 20 6f 6e 20 61 6e 0a 2a 2a 20 73 71 6c 69 74  e on an.** sqlit
1f9e0 65 33 5f 66 69 6c 65 20 66 6f 72 20 77 69 6e 33  e3_file for win3
1f9f0 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  2..*/.static con
1fa00 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  st sqlite3_io_me
1fa10 74 68 6f 64 73 20 77 69 6e 49 6f 4d 65 74 68 6f  thods winIoMetho
1fa20 64 20 3d 20 7b 0a 20 20 33 2c 20 20 20 20 20 20  d = {.  3,      
1fa30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa40 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73          /* iVers
1fa50 69 6f 6e 20 2a 2f 0a 20 20 77 69 6e 43 6c 6f 73  ion */.  winClos
1fa60 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
1fa70 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f           /* xClo
1fa80 73 65 20 2a 2f 0a 20 20 77 69 6e 52 65 61 64 2c  se */.  winRead,
1fa90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1faa0 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65 61 64          /* xRead
1fab0 20 2a 2f 0a 20 20 77 69 6e 57 72 69 74 65 2c 20   */.  winWrite, 
1fac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fad0 20 20 20 20 20 20 2f 2a 20 78 57 72 69 74 65 20        /* xWrite 
1fae0 2a 2f 0a 20 20 77 69 6e 54 72 75 6e 63 61 74 65  */.  winTruncate
1faf0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1fb00 20 20 20 20 20 2f 2a 20 78 54 72 75 6e 63 61 74       /* xTruncat
1fb10 65 20 2a 2f 0a 20 20 77 69 6e 53 79 6e 63 2c 20  e */.  winSync, 
1fb20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb30 20 20 20 20 20 20 20 2f 2a 20 78 53 79 6e 63 20         /* xSync 
1fb40 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 53 69 7a 65  */.  winFileSize
1fb50 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1fb60 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 53 69 7a       /* xFileSiz
1fb70 65 20 2a 2f 0a 20 20 77 69 6e 4c 6f 63 6b 2c 20  e */.  winLock, 
1fb80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb90 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20         /* xLock 
1fba0 2a 2f 0a 20 20 77 69 6e 55 6e 6c 6f 63 6b 2c 20  */.  winUnlock, 
1fbb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fbc0 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20       /* xUnlock 
1fbd0 2a 2f 0a 20 20 77 69 6e 43 68 65 63 6b 52 65 73  */.  winCheckRes
1fbe0 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20 20 20 20  ervedLock,      
1fbf0 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65       /* xCheckRe
1fc00 73 65 72 76 65 64 4c 6f 63 6b 20 2a 2f 0a 20 20  servedLock */.  
1fc10 77 69 6e 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c 20  winFileControl, 
1fc20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fc30 2f 2a 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 20  /* xFileControl 
1fc40 2a 2f 0a 20 20 77 69 6e 53 65 63 74 6f 72 53 69  */.  winSectorSi
1fc50 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ze,             
1fc60 20 20 20 20 20 2f 2a 20 78 53 65 63 74 6f 72 53       /* xSectorS
1fc70 69 7a 65 20 2a 2f 0a 20 20 77 69 6e 44 65 76 69  ize */.  winDevi
1fc80 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
1fc90 73 2c 20 20 20 20 20 20 20 2f 2a 20 78 44 65 76  s,       /* xDev
1fca0 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
1fcb0 63 73 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4d 61  cs */.  winShmMa
1fcc0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
1fcd0 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d          /* xShmM
1fce0 61 70 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4c 6f  ap */.  winShmLo
1fcf0 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
1fd00 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4c          /* xShmL
1fd10 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 42  ock */.  winShmB
1fd20 61 72 72 69 65 72 2c 20 20 20 20 20 20 20 20 20  arrier,         
1fd30 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d           /* xShm
1fd40 42 61 72 72 69 65 72 20 2a 2f 0a 20 20 77 69 6e  Barrier */.  win
1fd50 53 68 6d 55 6e 6d 61 70 2c 20 20 20 20 20 20 20  ShmUnmap,       
1fd60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1fd70 78 53 68 6d 55 6e 6d 61 70 20 2a 2f 0a 20 20 77  xShmUnmap */.  w
1fd80 69 6e 46 65 74 63 68 2c 20 20 20 20 20 20 20 20  inFetch,        
1fd90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1fda0 2a 20 78 46 65 74 63 68 20 2a 2f 0a 20 20 77 69  * xFetch */.  wi
1fdb0 6e 55 6e 66 65 74 63 68 20 20 20 20 20 20 20 20  nUnfetch        
1fdc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1fdd0 20 78 55 6e 66 65 74 63 68 20 2a 2f 0a 7d 3b 0a   xUnfetch */.};.
1fde0 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
1fdf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1fe00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1fe10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1fe20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
1fe30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1fe40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 73 71 6c 69  *********** sqli
1fe50 74 65 33 5f 76 66 73 20 6d 65 74 68 6f 64 73 20  te3_vfs methods 
1fe60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1fe70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a  ************.**.
1fe80 2a 2a 20 54 68 69 73 20 64 69 76 69 73 69 6f 6e  ** This division
1fe90 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 69 6d   contains the im
1fea0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
1feb0 6d 65 74 68 6f 64 73 20 6f 6e 20 74 68 65 0a 2a  methods on the.*
1fec0 2a 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6f 62  * sqlite3_vfs ob
1fed0 6a 65 63 74 2e 0a 2a 2f 0a 0a 23 69 66 20 30 0a  ject..*/..#if 0.
1fee0 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20  /*.** Convert a 
1fef0 66 69 6c 65 6e 61 6d 65 20 66 72 6f 6d 20 77 68  filename from wh
1ff00 61 74 65 76 65 72 20 74 68 65 20 75 6e 64 65 72  atever the under
1ff10 6c 79 69 6e 67 20 6f 70 65 72 61 74 69 6e 67 20  lying operating 
1ff20 73 79 73 74 65 6d 0a 2a 2a 20 73 75 70 70 6f 72  system.** suppor
1ff30 74 73 20 66 6f 72 20 66 69 6c 65 6e 61 6d 65 73  ts for filenames
1ff40 20 69 6e 74 6f 20 55 54 46 2d 38 2e 20 20 53 70   into UTF-8.  Sp
1ff50 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ace to hold the 
1ff60 72 65 73 75 6c 74 20 69 73 0a 2a 2a 20 6f 62 74  result is.** obt
1ff70 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f  ained from mallo
1ff80 63 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66 72  c and must be fr
1ff90 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69  eed by the calli
1ffa0 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  ng function..*/.
1ffb0 73 74 61 74 69 63 20 63 68 61 72 20 2a 77 69 6e  static char *win
1ffc0 43 6f 6e 76 65 72 74 54 6f 55 74 66 38 46 69 6c  ConvertToUtf8Fil
1ffd0 65 6e 61 6d 65 28 63 6f 6e 73 74 20 76 6f 69 64  ename(const void
1ffe0 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20   *zFilename){.  
1fff0 63 68 61 72 20 2a 7a 43 6f 6e 76 65 72 74 65 64  char *zConverted
20000 20 3d 20 30 3b 0a 20 20 69 66 28 20 6f 73 49 73   = 0;.  if( osIs
20010 4e 54 28 29 20 29 7b 0a 20 20 20 20 7a 43 6f 6e  NT() ){.    zCon
20020 76 65 72 74 65 64 20 3d 20 77 69 6e 55 6e 69 63  verted = winUnic
20030 6f 64 65 54 6f 55 74 66 38 28 7a 46 69 6c 65 6e  odeToUtf8(zFilen
20040 61 6d 65 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66  ame);.  }.#ifdef
20050 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41   SQLITE_WIN32_HA
20060 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20  S_ANSI.  else{. 
20070 20 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20     zConverted = 
20080 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d 62  sqlite3_win32_mb
20090 63 73 5f 74 6f 5f 75 74 66 38 28 7a 46 69 6c 65  cs_to_utf8(zFile
200a0 6e 61 6d 65 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  name);.  }.#endi
200b0 66 0a 20 20 2f 2a 20 63 61 6c 6c 65 72 20 77 69  f.  /* caller wi
200c0 6c 6c 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66  ll handle out of
200d0 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 72 65 74   memory */.  ret
200e0 75 72 6e 20 7a 43 6f 6e 76 65 72 74 65 64 3b 0a  urn zConverted;.
200f0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
20100 43 6f 6e 76 65 72 74 20 61 20 55 54 46 2d 38 20  Convert a UTF-8 
20110 66 69 6c 65 6e 61 6d 65 20 69 6e 74 6f 20 77 68  filename into wh
20120 61 74 65 76 65 72 20 66 6f 72 6d 20 74 68 65 20  atever form the 
20130 75 6e 64 65 72 6c 79 69 6e 67 0a 2a 2a 20 6f 70  underlying.** op
20140 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 77  erating system w
20150 61 6e 74 73 20 66 69 6c 65 6e 61 6d 65 73 20 69  ants filenames i
20160 6e 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  n.  Space to hol
20170 64 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20  d the result.** 
20180 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  is obtained from
20190 20 6d 61 6c 6c 6f 63 20 61 6e 64 20 6d 75 73 74   malloc and must
201a0 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65   be freed by the
201b0 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63   calling.** func
201c0 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
201d0 76 6f 69 64 20 2a 77 69 6e 43 6f 6e 76 65 72 74  void *winConvert
201e0 46 72 6f 6d 55 74 66 38 46 69 6c 65 6e 61 6d 65  FromUtf8Filename
201f0 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69  (const char *zFi
20200 6c 65 6e 61 6d 65 29 7b 0a 20 20 76 6f 69 64 20  lename){.  void 
20210 2a 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 30 3b  *zConverted = 0;
20220 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20  .  if( osIsNT() 
20230 29 7b 0a 20 20 20 20 7a 43 6f 6e 76 65 72 74 65  ){.    zConverte
20240 64 20 3d 20 77 69 6e 55 74 66 38 54 6f 55 6e 69  d = winUtf8ToUni
20250 63 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  code(zFilename);
20260 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49  .  }.#ifdef SQLI
20270 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
20280 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 7a 43  I.  else{.    zC
20290 6f 6e 76 65 72 74 65 64 20 3d 20 73 71 6c 69 74  onverted = sqlit
202a0 65 33 5f 77 69 6e 33 32 5f 75 74 66 38 5f 74 6f  e3_win32_utf8_to
202b0 5f 6d 62 63 73 28 7a 46 69 6c 65 6e 61 6d 65 29  _mbcs(zFilename)
202c0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2f  ;.  }.#endif.  /
202d0 2a 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 68 61  * caller will ha
202e0 6e 64 6c 65 20 6f 75 74 20 6f 66 20 6d 65 6d 6f  ndle out of memo
202f0 72 79 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 7a  ry */.  return z
20300 43 6f 6e 76 65 72 74 65 64 3b 0a 7d 0a 0a 2f 2a  Converted;.}../*
20310 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
20320 6e 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65  n returns non-ze
20330 72 6f 20 69 66 20 74 68 65 20 73 70 65 63 69 66  ro if the specif
20340 69 65 64 20 55 54 46 2d 38 20 73 74 72 69 6e 67  ied UTF-8 string
20350 20 62 75 66 66 65 72 0a 2a 2a 20 65 6e 64 73 20   buffer.** ends 
20360 77 69 74 68 20 61 20 64 69 72 65 63 74 6f 72 79  with a directory
20370 20 73 65 70 61 72 61 74 6f 72 20 63 68 61 72 61   separator chara
20380 63 74 65 72 20 6f 72 20 6f 6e 65 20 77 61 73 20  cter or one was 
20390 73 75 63 63 65 73 73 66 75 6c 6c 79 0a 2a 2a 20  successfully.** 
203a0 61 64 64 65 64 20 74 6f 20 69 74 2e 0a 2a 2f 0a  added to it..*/.
203b0 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 61  static int winMa
203c0 6b 65 45 6e 64 49 6e 44 69 72 53 65 70 28 69 6e  keEndInDirSep(in
203d0 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42  t nBuf, char *zB
203e0 75 66 29 7b 0a 20 20 69 66 28 20 7a 42 75 66 20  uf){.  if( zBuf 
203f0 29 7b 0a 20 20 20 20 69 6e 74 20 6e 4c 65 6e 20  ){.    int nLen 
20400 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
20410 30 28 7a 42 75 66 29 3b 0a 20 20 20 20 69 66 28  0(zBuf);.    if(
20420 20 6e 4c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20   nLen>0 ){.     
20430 20 69 66 28 20 77 69 6e 49 73 44 69 72 53 65 70   if( winIsDirSep
20440 28 7a 42 75 66 5b 6e 4c 65 6e 2d 31 5d 29 20 29  (zBuf[nLen-1]) )
20450 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
20460 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20   1;.      }else 
20470 69 66 28 20 6e 4c 65 6e 2b 31 3c 6e 42 75 66 20  if( nLen+1<nBuf 
20480 29 7b 0a 20 20 20 20 20 20 20 20 7a 42 75 66 5b  ){.        zBuf[
20490 6e 4c 65 6e 5d 20 3d 20 77 69 6e 47 65 74 44 69  nLen] = winGetDi
204a0 72 53 65 70 28 29 3b 0a 20 20 20 20 20 20 20 20  rSep();.        
204b0 7a 42 75 66 5b 6e 4c 65 6e 2b 31 5d 20 3d 20 27  zBuf[nLen+1] = '
204c0 5c 30 27 3b 0a 20 20 20 20 20 20 20 20 72 65 74  \0';.        ret
204d0 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
204e0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
204f0 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  n 0;.}../*.** Cr
20500 65 61 74 65 20 61 20 74 65 6d 70 6f 72 61 72 79  eate a temporary
20510 20 66 69 6c 65 20 6e 61 6d 65 20 61 6e 64 20 73   file name and s
20520 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 69  tore the resulti
20530 6e 67 20 70 6f 69 6e 74 65 72 20 69 6e 74 6f 20  ng pointer into 
20540 70 7a 42 75 66 2e 0a 2a 2a 20 54 68 65 20 70 6f  pzBuf..** The po
20550 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20 69  inter returned i
20560 6e 20 70 7a 42 75 66 20 6d 75 73 74 20 62 65 20  n pzBuf must be 
20570 66 72 65 65 64 20 76 69 61 20 73 71 6c 69 74 65  freed via sqlite
20580 33 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a 73 74 61  3_free()..*/.sta
20590 74 69 63 20 69 6e 74 20 77 69 6e 47 65 74 54 65  tic int winGetTe
205a0 6d 70 6e 61 6d 65 28 73 71 6c 69 74 65 33 5f 76  mpname(sqlite3_v
205b0 66 73 20 2a 70 56 66 73 2c 20 63 68 61 72 20 2a  fs *pVfs, char *
205c0 2a 70 7a 42 75 66 29 7b 0a 20 20 73 74 61 74 69  *pzBuf){.  stati
205d0 63 20 63 68 61 72 20 7a 43 68 61 72 73 5b 5d 20  c char zChars[] 
205e0 3d 0a 20 20 20 20 22 61 62 63 64 65 66 67 68 69  =.    "abcdefghi
205f0 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79  jklmnopqrstuvwxy
20600 7a 22 0a 20 20 20 20 22 41 42 43 44 45 46 47 48  z".    "ABCDEFGH
20610 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58  IJKLMNOPQRSTUVWX
20620 59 5a 22 0a 20 20 20 20 22 30 31 32 33 34 35 36  YZ".    "0123456
20630 37 38 39 22 3b 0a 20 20 73 69 7a 65 5f 74 20 69  789";.  size_t i
20640 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e 50 72 65 20  , j;.  int nPre 
20650 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
20660 30 28 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49  0(SQLITE_TEMP_FI
20670 4c 45 5f 50 52 45 46 49 58 29 3b 0a 20 20 69 6e  LE_PREFIX);.  in
20680 74 20 6e 4d 61 78 2c 20 6e 42 75 66 2c 20 6e 44  t nMax, nBuf, nD
20690 69 72 2c 20 6e 4c 65 6e 3b 0a 20 20 63 68 61 72  ir, nLen;.  char
206a0 20 2a 7a 42 75 66 3b 0a 0a 20 20 2f 2a 20 49 74   *zBuf;..  /* It
206b0 27 73 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61  's odd to simula
206c0 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68  te an io-error h
206d0 65 72 65 2c 20 62 75 74 20 72 65 61 6c 6c 79 20  ere, but really 
206e0 74 68 69 73 20 69 73 20 6a 75 73 74 0a 20 20 2a  this is just.  *
206f0 2a 20 75 73 69 6e 67 20 74 68 65 20 69 6f 2d 65  * using the io-e
20700 72 72 6f 72 20 69 6e 66 72 61 73 74 72 75 63 74  rror infrastruct
20710 75 72 65 20 74 6f 20 74 65 73 74 20 74 68 61 74  ure to test that
20720 20 53 51 4c 69 74 65 20 68 61 6e 64 6c 65 73 20   SQLite handles 
20730 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69  this.  ** functi
20740 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 0a 20 20 2a  on failing. .  *
20750 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  /.  SimulateIOEr
20760 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
20770 54 45 5f 49 4f 45 52 52 20 29 3b 0a 0a 20 20 2f  TE_IOERR );..  /
20780 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 74 65 6d  * Allocate a tem
20790 70 6f 72 61 72 79 20 62 75 66 66 65 72 20 74 6f  porary buffer to
207a0 20 73 74 6f 72 65 20 74 68 65 20 66 75 6c 6c 79   store the fully
207b0 20 71 75 61 6c 69 66 69 65 64 20 66 69 6c 65 0a   qualified file.
207c0 20 20 2a 2a 20 6e 61 6d 65 20 66 6f 72 20 74 68    ** name for th
207d0 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  e temporary file
207e0 2e 20 20 49 66 20 74 68 69 73 20 66 61 69 6c 73  .  If this fails
207f0 2c 20 77 65 20 63 61 6e 6e 6f 74 20 63 6f 6e 74  , we cannot cont
20800 69 6e 75 65 2e 0a 20 20 2a 2f 0a 20 20 6e 4d 61  inue..  */.  nMa
20810 78 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  x = pVfs->mxPath
20820 6e 61 6d 65 3b 20 6e 42 75 66 20 3d 20 6e 4d 61  name; nBuf = nMa
20830 78 20 2b 20 32 3b 0a 20 20 7a 42 75 66 20 3d 20  x + 2;.  zBuf = 
20840 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
20850 6f 28 20 6e 42 75 66 20 29 3b 0a 20 20 69 66 28  o( nBuf );.  if(
20860 20 21 7a 42 75 66 20 29 7b 0a 20 20 20 20 4f 53   !zBuf ){.    OS
20870 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c  TRACE(("TEMP-FIL
20880 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f  ENAME rc=SQLITE_
20890 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29  IOERR_NOMEM\n"))
208a0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
208b0 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b  ITE_IOERR_NOMEM;
208c0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 67 75 72  .  }..  /* Figur
208d0 65 20 6f 75 74 20 74 68 65 20 65 66 66 65 63 74  e out the effect
208e0 69 76 65 20 74 65 6d 70 6f 72 61 72 79 20 64 69  ive temporary di
208f0 72 65 63 74 6f 72 79 2e 20 20 46 69 72 73 74 2c  rectory.  First,
20900 20 63 68 65 63 6b 20 69 66 20 6f 6e 65 0a 20 20   check if one.  
20910 2a 2a 20 68 61 73 20 62 65 65 6e 20 65 78 70 6c  ** has been expl
20920 69 63 69 74 6c 79 20 73 65 74 20 62 79 20 74 68  icitly set by th
20930 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 3b 20 6f  e application; o
20940 74 68 65 72 77 69 73 65 2c 20 75 73 65 20 74 68  therwise, use th
20950 65 20 6f 6e 65 0a 20 20 2a 2a 20 63 6f 6e 66 69  e one.  ** confi
20960 67 75 72 65 64 20 62 79 20 74 68 65 20 6f 70 65  gured by the ope
20970 72 61 74 69 6e 67 20 73 79 73 74 65 6d 2e 0a 20  rating system.. 
20980 20 2a 2f 0a 20 20 6e 44 69 72 20 3d 20 6e 4d 61   */.  nDir = nMa
20990 78 20 2d 20 28 6e 50 72 65 20 2b 20 31 35 29 3b  x - (nPre + 15);
209a0 0a 20 20 61 73 73 65 72 74 28 20 6e 44 69 72 3e  .  assert( nDir>
209b0 30 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  0 );.  if( sqlit
209c0 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72  e3_temp_director
209d0 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 44 69  y ){.    int nDi
209e0 72 4c 65 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  rLen = sqlite3St
209f0 72 6c 65 6e 33 30 28 73 71 6c 69 74 65 33 5f 74  rlen30(sqlite3_t
20a00 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 29 3b 0a  emp_directory);.
20a10 20 20 20 20 69 66 28 20 6e 44 69 72 4c 65 6e 3e      if( nDirLen>
20a20 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21  0 ){.      if( !
20a30 77 69 6e 49 73 44 69 72 53 65 70 28 73 71 6c 69  winIsDirSep(sqli
20a40 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f  te3_temp_directo
20a50 72 79 5b 6e 44 69 72 4c 65 6e 2d 31 5d 29 20 29  ry[nDirLen-1]) )
20a60 7b 0a 20 20 20 20 20 20 20 20 6e 44 69 72 4c 65  {.        nDirLe
20a70 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n++;.      }.   
20a80 20 20 20 69 66 28 20 6e 44 69 72 4c 65 6e 3e 6e     if( nDirLen>n
20a90 44 69 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73  Dir ){.        s
20aa0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66  qlite3_free(zBuf
20ab0 29 3b 0a 20 20 20 20 20 20 20 20 4f 53 54 52 41  );.        OSTRA
20ac0 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41  CE(("TEMP-FILENA
20ad0 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 45 52 52  ME rc=SQLITE_ERR
20ae0 4f 52 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 20  OR\n"));.       
20af0 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72   return winLogEr
20b00 72 6f 72 28 53 51 4c 49 54 45 5f 45 52 52 4f 52  ror(SQLITE_ERROR
20b10 2c 20 30 2c 20 22 77 69 6e 47 65 74 54 65 6d 70  , 0, "winGetTemp
20b20 6e 61 6d 65 31 22 2c 20 30 29 3b 0a 20 20 20 20  name1", 0);.    
20b30 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
20b40 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4d 61 78 2c  3_snprintf(nMax,
20b50 20 7a 42 75 66 2c 20 22 25 73 22 2c 20 73 71 6c   zBuf, "%s", sql
20b60 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74  ite3_temp_direct
20b70 6f 72 79 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ory);.    }.  }.
20b80 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 43 59  #if defined(__CY
20b90 47 57 49 4e 5f 5f 29 0a 20 20 65 6c 73 65 7b 0a  GWIN__).  else{.
20ba0 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
20bb0 20 63 68 61 72 20 2a 61 7a 44 69 72 73 5b 5d 20   char *azDirs[] 
20bc0 3d 20 7b 0a 20 20 20 20 20 20 20 30 2c 20 2f 2a  = {.       0, /*
20bd0 20 67 65 74 65 6e 76 28 22 53 51 4c 49 54 45 5f   getenv("SQLITE_
20be0 54 4d 50 44 49 52 22 29 20 2a 2f 0a 20 20 20 20  TMPDIR") */.    
20bf0 20 20 20 30 2c 20 2f 2a 20 67 65 74 65 6e 76 28     0, /* getenv(
20c00 22 54 4d 50 44 49 52 22 29 20 2a 2f 0a 20 20 20  "TMPDIR") */.   
20c10 20 20 20 20 30 2c 20 2f 2a 20 67 65 74 65 6e 76      0, /* getenv
20c20 28 22 54 4d 50 22 29 20 2a 2f 0a 20 20 20 20 20  ("TMP") */.     
20c30 20 20 30 2c 20 2f 2a 20 67 65 74 65 6e 76 28 22    0, /* getenv("
20c40 54 45 4d 50 22 29 20 2a 2f 0a 20 20 20 20 20 20  TEMP") */.      
20c50 20 30 2c 20 2f 2a 20 67 65 74 65 6e 76 28 22 55   0, /* getenv("U
20c60 53 45 52 50 52 4f 46 49 4c 45 22 29 20 2a 2f 0a  SERPROFILE") */.
20c70 20 20 20 20 20 20 20 22 2f 76 61 72 2f 74 6d 70         "/var/tmp
20c80 22 2c 0a 20 20 20 20 20 20 20 22 2f 75 73 72 2f  ",.       "/usr/
20c90 74 6d 70 22 2c 0a 20 20 20 20 20 20 20 22 2f 74  tmp",.       "/t
20ca0 6d 70 22 2c 0a 20 20 20 20 20 20 20 22 2e 22 2c  mp",.       ".",
20cb0 0a 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20  .       0       
20cc0 20 2f 2a 20 4c 69 73 74 20 74 65 72 6d 69 6e 61   /* List termina
20cd0 74 6f 72 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20  tor */.    };.  
20ce0 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69    unsigned int i
20cf0 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
20d00 20 2a 7a 44 69 72 20 3d 20 30 3b 0a 0a 20 20 20   *zDir = 0;..   
20d10 20 69 66 28 20 21 61 7a 44 69 72 73 5b 30 5d 20   if( !azDirs[0] 
20d20 29 20 61 7a 44 69 72 73 5b 30 5d 20 3d 20 67 65  ) azDirs[0] = ge
20d30 74 65 6e 76 28 22 53 51 4c 49 54 45 5f 54 4d 50  tenv("SQLITE_TMP
20d40 44 49 52 22 29 3b 0a 20 20 20 20 69 66 28 20 21  DIR");.    if( !
20d50 61 7a 44 69 72 73 5b 31 5d 20 29 20 61 7a 44 69  azDirs[1] ) azDi
20d60 72 73 5b 31 5d 20 3d 20 67 65 74 65 6e 76 28 22  rs[1] = getenv("
20d70 54 4d 50 44 49 52 22 29 3b 0a 20 20 20 20 69 66  TMPDIR");.    if
20d80 28 20 21 61 7a 44 69 72 73 5b 32 5d 20 29 20 61  ( !azDirs[2] ) a
20d90 7a 44 69 72 73 5b 32 5d 20 3d 20 67 65 74 65 6e  zDirs[2] = geten
20da0 76 28 22 54 4d 50 22 29 3b 0a 20 20 20 20 69 66  v("TMP");.    if
20db0 28 20 21 61 7a 44 69 72 73 5b 33 5d 20 29 20 61  ( !azDirs[3] ) a
20dc0 7a 44 69 72 73 5b 33 5d 20 3d 20 67 65 74 65 6e  zDirs[3] = geten
20dd0 76 28 22 54 45 4d 50 22 29 3b 0a 20 20 20 20 69  v("TEMP");.    i
20de0 66 28 20 21 61 7a 44 69 72 73 5b 34 5d 20 29 20  f( !azDirs[4] ) 
20df0 61 7a 44 69 72 73 5b 34 5d 20 3d 20 67 65 74 65  azDirs[4] = gete
20e00 6e 76 28 22 55 53 45 52 50 52 4f 46 49 4c 45 22  nv("USERPROFILE"
20e10 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
20e20 69 3c 73 69 7a 65 6f 66 28 61 7a 44 69 72 73 29  i<sizeof(azDirs)
20e30 2f 73 69 7a 65 6f 66 28 61 7a 44 69 72 73 5b 30  /sizeof(azDirs[0
20e40 5d 29 3b 20 7a 44 69 72 3d 61 7a 44 69 72 73 5b  ]); zDir=azDirs[
20e50 69 2b 2b 5d 29 7b 0a 20 20 20 20 20 20 76 6f 69  i++]){.      voi
20e60 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20  d *zConverted;. 
20e70 20 20 20 20 20 69 66 28 20 7a 44 69 72 3d 3d 30       if( zDir==0
20e80 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
20e90 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 74     /* If the pat
20ea0 68 20 73 74 61 72 74 73 20 77 69 74 68 20 61 20  h starts with a 
20eb0 64 72 69 76 65 20 6c 65 74 74 65 72 20 66 6f 6c  drive letter fol
20ec0 6c 6f 77 65 64 20 62 79 20 74 68 65 20 63 6f 6c  lowed by the col
20ed0 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 63 68 61 72  on.      ** char
20ee0 61 63 74 65 72 2c 20 61 73 73 75 6d 65 20 69 74  acter, assume it
20ef0 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 6e 61   is already a na
20f00 74 69 76 65 20 57 69 6e 33 32 20 70 61 74 68 3b  tive Win32 path;
20f10 20 6f 74 68 65 72 77 69 73 65 2c 0a 20 20 20 20   otherwise,.    
20f20 20 20 2a 2a 20 69 74 20 6d 75 73 74 20 62 65 20    ** it must be 
20f30 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 61 20 6e  converted to a n
20f40 61 74 69 76 65 20 57 69 6e 33 32 20 70 61 74 68  ative Win32 path
20f50 20 76 69 61 20 74 68 65 20 43 79 67 77 69 6e 20   via the Cygwin 
20f60 41 50 49 0a 20 20 20 20 20 20 2a 2a 20 70 72 69  API.      ** pri
20f70 6f 72 20 74 6f 20 75 73 69 6e 67 20 69 74 2e 0a  or to using it..
20f80 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
20f90 66 28 20 77 69 6e 49 73 44 72 69 76 65 4c 65 74  f( winIsDriveLet
20fa0 74 65 72 41 6e 64 43 6f 6c 6f 6e 28 7a 44 69 72  terAndColon(zDir
20fb0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f  ) ){.        zCo
20fc0 6e 76 65 72 74 65 64 20 3d 20 77 69 6e 43 6f 6e  nverted = winCon
20fd0 76 65 72 74 46 72 6f 6d 55 74 66 38 46 69 6c 65  vertFromUtf8File
20fe0 6e 61 6d 65 28 7a 44 69 72 29 3b 0a 20 20 20 20  name(zDir);.    
20ff0 20 20 20 20 69 66 28 20 21 7a 43 6f 6e 76 65 72      if( !zConver
21000 74 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ted ){.         
21010 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42   sqlite3_free(zB
21020 75 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 4f  uf);.          O
21030 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49  STRACE(("TEMP-FI
21040 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45  LENAME rc=SQLITE
21050 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29  _IOERR_NOMEM\n")
21060 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
21070 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
21080 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
21090 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 77 69  }.        if( wi
210a0 6e 49 73 44 69 72 28 7a 43 6f 6e 76 65 72 74 65  nIsDir(zConverte
210b0 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  d) ){.          
210c0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
210d0 28 6e 4d 61 78 2c 20 7a 42 75 66 2c 20 22 25 73  (nMax, zBuf, "%s
210e0 22 2c 20 7a 44 69 72 29 3b 0a 20 20 20 20 20 20  ", zDir);.      
210f0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
21100 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
21110 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
21120 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
21130 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
21140 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20  onverted);.     
21150 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
21160 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 73 71 6c  zConverted = sql
21170 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20  ite3MallocZero( 
21180 6e 4d 61 78 2b 31 20 29 3b 0a 20 20 20 20 20 20  nMax+1 );.      
21190 20 20 69 66 28 20 21 7a 43 6f 6e 76 65 72 74 65    if( !zConverte
211a0 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  d ){.          s
211b0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66  qlite3_free(zBuf
211c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 4f 53 54  );.          OST
211d0 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45  RACE(("TEMP-FILE
211e0 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 49  NAME rc=SQLITE_I
211f0 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b  OERR_NOMEM\n"));
21200 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
21210 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  n SQLITE_IOERR_N
21220 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 7d 0a  OMEM;.        }.
21230 20 20 20 20 20 20 20 20 69 66 28 20 63 79 67 77          if( cygw
21240 69 6e 5f 63 6f 6e 76 5f 70 61 74 68 28 0a 20 20  in_conv_path(.  
21250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73                os
21260 49 73 4e 54 28 29 20 3f 20 43 43 50 5f 50 4f 53  IsNT() ? CCP_POS
21270 49 58 5f 54 4f 5f 57 49 4e 5f 57 20 3a 20 43 43  IX_TO_WIN_W : CC
21280 50 5f 50 4f 53 49 58 5f 54 4f 5f 57 49 4e 5f 41  P_POSIX_TO_WIN_A
21290 2c 20 7a 44 69 72 2c 0a 20 20 20 20 20 20 20 20  , zDir,.        
212a0 20 20 20 20 20 20 20 20 7a 43 6f 6e 76 65 72 74          zConvert
212b0 65 64 2c 20 6e 4d 61 78 2b 31 29 3c 30 20 29 7b  ed, nMax+1)<0 ){
212c0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
212d0 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74  e3_free(zConvert
212e0 65 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  ed);.          s
212f0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66  qlite3_free(zBuf
21300 29 3b 0a 20 20 20 20 20 20 20 20 20 20 4f 53 54  );.          OST
21310 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45  RACE(("TEMP-FILE
21320 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 49  NAME rc=SQLITE_I
21330 4f 45 52 52 5f 43 4f 4e 56 50 41 54 48 5c 6e 22  OERR_CONVPATH\n"
21340 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  ));.          re
21350 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72  turn winLogError
21360 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4f  (SQLITE_IOERR_CO
21370 4e 56 50 41 54 48 2c 20 28 44 57 4f 52 44 29 65  NVPATH, (DWORD)e
21380 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
21390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
213a0 20 20 20 22 77 69 6e 47 65 74 54 65 6d 70 6e 61     "winGetTempna
213b0 6d 65 32 22 2c 20 7a 44 69 72 29 3b 0a 20 20 20  me2", zDir);.   
213c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
213d0 66 28 20 77 69 6e 49 73 44 69 72 28 7a 43 6f 6e  f( winIsDir(zCon
213e0 76 65 72 74 65 64 29 20 29 7b 0a 20 20 20 20 20  verted) ){.     
213f0 20 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20       /* At this 
21400 70 6f 69 6e 74 2c 20 77 65 20 6b 6e 6f 77 20 74  point, we know t
21410 68 65 20 63 61 6e 64 69 64 61 74 65 20 64 69 72  he candidate dir
21420 65 63 74 6f 72 79 20 65 78 69 73 74 73 20 61 6e  ectory exists an
21430 64 20 73 68 6f 75 6c 64 0a 20 20 20 20 20 20 20  d should.       
21440 20 20 20 2a 2a 20 62 65 20 75 73 65 64 2e 20 20     ** be used.  
21450 48 6f 77 65 76 65 72 2c 20 77 65 20 6d 61 79 20  However, we may 
21460 6e 65 65 64 20 74 6f 20 63 6f 6e 76 65 72 74 20  need to convert 
21470 74 68 65 20 73 74 72 69 6e 67 20 63 6f 6e 74 61  the string conta
21480 69 6e 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20  ining.          
21490 2a 2a 20 69 74 73 20 6e 61 6d 65 20 69 6e 74 6f  ** its name into
214a0 20 55 54 46 2d 38 20 28 69 2e 65 2e 20 69 66 20   UTF-8 (i.e. if 
214b0 69 74 20 69 73 20 55 54 46 2d 31 36 20 72 69 67  it is UTF-16 rig
214c0 68 74 20 6e 6f 77 29 2e 0a 20 20 20 20 20 20 20  ht now)..       
214d0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
214e0 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a  if( osIsNT() ){.
214f0 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72              char
21500 20 2a 7a 55 74 66 38 20 3d 20 77 69 6e 55 6e 69   *zUtf8 = winUni
21510 63 6f 64 65 54 6f 55 74 66 38 28 7a 43 6f 6e 76  codeToUtf8(zConv
21520 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 20 20  erted);.        
21530 20 20 20 20 69 66 28 20 21 7a 55 74 66 38 20 29      if( !zUtf8 )
21540 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
21550 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
21560 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20  nverted);.      
21570 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
21580 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20  free(zBuf);.    
21590 20 20 20 20 20 20 20 20 20 20 4f 53 54 52 41 43            OSTRAC
215a0 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d  E(("TEMP-FILENAM
215b0 45 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52  E rc=SQLITE_IOER
215c0 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20  R_NOMEM\n"));.  
215d0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
215e0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
215f0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20  NOMEM;.         
21600 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
21610 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
21620 66 28 6e 4d 61 78 2c 20 7a 42 75 66 2c 20 22 25  f(nMax, zBuf, "%
21630 73 22 2c 20 7a 55 74 66 38 29 3b 0a 20 20 20 20  s", zUtf8);.    
21640 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
21650 66 72 65 65 28 7a 55 74 66 38 29 3b 0a 20 20 20  free(zUtf8);.   
21660 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
21670 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
21680 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  );.            b
21690 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
216a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
216b0 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
216c0 6e 74 66 28 6e 4d 61 78 2c 20 7a 42 75 66 2c 20  ntf(nMax, zBuf, 
216d0 22 25 73 22 2c 20 7a 43 6f 6e 76 65 72 74 65 64  "%s", zConverted
216e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
216f0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e  qlite3_free(zCon
21700 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 20  verted);.       
21710 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
21720 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
21730 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
21740 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
21750 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  d);.      }.    
21760 7d 0a 20 20 7d 0a 23 65 6c 69 66 20 21 53 51 4c  }.  }.#elif !SQL
21770 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20  ITE_OS_WINRT && 
21780 21 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49  !defined(__CYGWI
21790 4e 5f 5f 29 0a 20 20 65 6c 73 65 20 69 66 28 20  N__).  else if( 
217a0 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 20 20 20  osIsNT() ){.    
217b0 63 68 61 72 20 2a 7a 4d 75 6c 74 69 3b 0a 20 20  char *zMulti;.  
217c0 20 20 4c 50 57 53 54 52 20 7a 57 69 64 65 50 61    LPWSTR zWidePa
217d0 74 68 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  th = sqlite3Mall
217e0 6f 63 5a 65 72 6f 28 20 6e 4d 61 78 2a 73 69 7a  ocZero( nMax*siz
217f0 65 6f 66 28 57 43 48 41 52 29 20 29 3b 0a 20 20  eof(WCHAR) );.  
21800 20 20 69 66 28 20 21 7a 57 69 64 65 50 61 74 68    if( !zWidePath
21810 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
21820 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20  3_free(zBuf);.  
21830 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45      OSTRACE(("TE
21840 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53  MP-FILENAME rc=S
21850 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
21860 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 72 65  M\n"));.      re
21870 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
21880 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  R_NOMEM;.    }. 
21890 20 20 20 69 66 28 20 6f 73 47 65 74 54 65 6d 70     if( osGetTemp
218a0 50 61 74 68 57 28 6e 4d 61 78 2c 20 7a 57 69 64  PathW(nMax, zWid
218b0 65 50 61 74 68 29 3d 3d 30 20 29 7b 0a 20 20 20  ePath)==0 ){.   
218c0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
218d0 7a 57 69 64 65 50 61 74 68 29 3b 0a 20 20 20 20  zWidePath);.    
218e0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
218f0 42 75 66 29 3b 0a 20 20 20 20 20 20 4f 53 54 52  Buf);.      OSTR
21900 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e  ACE(("TEMP-FILEN
21910 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f  AME rc=SQLITE_IO
21920 45 52 52 5f 47 45 54 54 45 4d 50 50 41 54 48 5c  ERR_GETTEMPPATH\
21930 6e 22 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75  n"));.      retu
21940 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53  rn winLogError(S
21950 51 4c 49 54 45 5f 49 4f 45 52 52 5f 47 45 54 54  QLITE_IOERR_GETT
21960 45 4d 50 50 41 54 48 2c 20 6f 73 47 65 74 4c 61  EMPPATH, osGetLa
21970 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20  stError(),.     
21980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21990 20 20 20 20 22 77 69 6e 47 65 74 54 65 6d 70 6e      "winGetTempn
219a0 61 6d 65 32 22 2c 20 30 29 3b 0a 20 20 20 20 7d  ame2", 0);.    }
219b0 0a 20 20 20 20 7a 4d 75 6c 74 69 20 3d 20 77 69  .    zMulti = wi
219c0 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 7a  nUnicodeToUtf8(z
219d0 57 69 64 65 50 61 74 68 29 3b 0a 20 20 20 20 69  WidePath);.    i
219e0 66 28 20 7a 4d 75 6c 74 69 20 29 7b 0a 20 20 20  f( zMulti ){.   
219f0 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
21a00 6e 74 66 28 6e 4d 61 78 2c 20 7a 42 75 66 2c 20  ntf(nMax, zBuf, 
21a10 22 25 73 22 2c 20 7a 4d 75 6c 74 69 29 3b 0a 20  "%s", zMulti);. 
21a20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
21a30 65 28 7a 4d 75 6c 74 69 29 3b 0a 20 20 20 20 20  e(zMulti);.     
21a40 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 57   sqlite3_free(zW
21a50 69 64 65 50 61 74 68 29 3b 0a 20 20 20 20 7d 65  idePath);.    }e
21a60 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
21a70 65 33 5f 66 72 65 65 28 7a 57 69 64 65 50 61 74  e3_free(zWidePat
21a80 68 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  h);.      sqlite
21a90 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20  3_free(zBuf);.  
21aa0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45      OSTRACE(("TE
21ab0 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53  MP-FILENAME rc=S
21ac0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
21ad0 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 72 65  M\n"));.      re
21ae0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
21af0 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  R_NOMEM;.    }. 
21b00 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
21b10 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a  _WIN32_HAS_ANSI.
21b20 20 20 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72    else{.    char
21b30 20 2a 7a 55 74 66 38 3b 0a 20 20 20 20 63 68 61   *zUtf8;.    cha
21b40 72 20 2a 7a 4d 62 63 73 50 61 74 68 20 3d 20 73  r *zMbcsPath = s
21b50 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
21b60 28 20 6e 4d 61 78 20 29 3b 0a 20 20 20 20 69 66  ( nMax );.    if
21b70 28 20 21 7a 4d 62 63 73 50 61 74 68 20 29 7b 0a  ( !zMbcsPath ){.
21b80 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
21b90 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20  ee(zBuf);.      
21ba0 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46  OSTRACE(("TEMP-F
21bb0 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54  ILENAME rc=SQLIT
21bc0 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22  E_IOERR_NOMEM\n"
21bd0 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
21be0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
21bf0 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  MEM;.    }.    i
21c00 66 28 20 6f 73 47 65 74 54 65 6d 70 50 61 74 68  f( osGetTempPath
21c10 41 28 6e 4d 61 78 2c 20 7a 4d 62 63 73 50 61 74  A(nMax, zMbcsPat
21c20 68 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  h)==0 ){.      s
21c30 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66  qlite3_free(zBuf
21c40 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  );.      OSTRACE
21c50 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45  (("TEMP-FILENAME
21c60 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52   rc=SQLITE_IOERR
21c70 5f 47 45 54 54 45 4d 50 50 41 54 48 5c 6e 22 29  _GETTEMPPATH\n")
21c80 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
21c90 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
21ca0 54 45 5f 49 4f 45 52 52 5f 47 45 54 54 45 4d 50  TE_IOERR_GETTEMP
21cb0 50 41 54 48 2c 20 6f 73 47 65 74 4c 61 73 74 45  PATH, osGetLastE
21cc0 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20  rror(),.        
21cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21ce0 20 22 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65   "winGetTempname
21cf0 33 22 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  3", 0);.    }.  
21d00 20 20 7a 55 74 66 38 20 3d 20 73 71 6c 69 74 65    zUtf8 = sqlite
21d10 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f  3_win32_mbcs_to_
21d20 75 74 66 38 28 7a 4d 62 63 73 50 61 74 68 29 3b  utf8(zMbcsPath);
21d30 0a 20 20 20 20 69 66 28 20 7a 55 74 66 38 20 29  .    if( zUtf8 )
21d40 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
21d50 73 6e 70 72 69 6e 74 66 28 6e 4d 61 78 2c 20 7a  snprintf(nMax, z
21d60 42 75 66 2c 20 22 25 73 22 2c 20 7a 55 74 66 38  Buf, "%s", zUtf8
21d70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
21d80 5f 66 72 65 65 28 7a 55 74 66 38 29 3b 0a 20 20  _free(zUtf8);.  
21d90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
21da0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66  qlite3_free(zBuf
21db0 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  );.      OSTRACE
21dc0 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45  (("TEMP-FILENAME
21dd0 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52   rc=SQLITE_IOERR
21de0 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20 20  _NOMEM\n"));.   
21df0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
21e00 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20  _IOERR_NOMEM;.  
21e10 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f    }.  }.#endif /
21e20 2a 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  * SQLITE_WIN32_H
21e30 41 53 5f 41 4e 53 49 20 2a 2f 0a 23 65 6e 64 69  AS_ANSI */.#endi
21e40 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 53 5f  f /* !SQLITE_OS_
21e50 57 49 4e 52 54 20 2a 2f 0a 0a 20 20 2f 2a 0a 20  WINRT */..  /*. 
21e60 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20 6d 61 6b   ** Check to mak
21e70 65 20 73 75 72 65 20 74 68 65 20 74 65 6d 70 6f  e sure the tempo
21e80 72 61 72 79 20 64 69 72 65 63 74 6f 72 79 20 65  rary directory e
21e90 6e 64 73 20 77 69 74 68 20 61 6e 20 61 70 70 72  nds with an appr
21ea0 6f 70 72 69 61 74 65 0a 20 20 2a 2a 20 73 65 70  opriate.  ** sep
21eb0 61 72 61 74 6f 72 2e 20 20 49 66 20 69 74 20 64  arator.  If it d
21ec0 6f 65 73 20 6e 6f 74 20 61 6e 64 20 74 68 65 72  oes not and ther
21ed0 65 20 69 73 20 6e 6f 74 20 65 6e 6f 75 67 68 20  e is not enough 
21ee0 73 70 61 63 65 20 6c 65 66 74 20 74 6f 20 61 64  space left to ad
21ef0 64 0a 20 20 2a 2a 20 6f 6e 65 2c 20 66 61 69 6c  d.  ** one, fail
21f00 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 77 69  ..  */.  if( !wi
21f10 6e 4d 61 6b 65 45 6e 64 49 6e 44 69 72 53 65 70  nMakeEndInDirSep
21f20 28 6e 44 69 72 2b 31 2c 20 7a 42 75 66 29 20 29  (nDir+1, zBuf) )
21f30 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
21f40 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 4f 53  ee(zBuf);.    OS
21f50 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c  TRACE(("TEMP-FIL
21f60 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f  ENAME rc=SQLITE_
21f70 45 52 52 4f 52 5c 6e 22 29 29 3b 0a 20 20 20 20  ERROR\n"));.    
21f80 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72  return winLogErr
21f90 6f 72 28 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c  or(SQLITE_ERROR,
21fa0 20 30 2c 20 22 77 69 6e 47 65 74 54 65 6d 70 6e   0, "winGetTempn
21fb0 61 6d 65 34 22 2c 20 30 29 3b 0a 20 20 7d 0a 0a  ame4", 0);.  }..
21fc0 20 20 2f 2a 0a 20 20 2a 2a 20 43 68 65 63 6b 20    /*.  ** Check 
21fd0 74 68 61 74 20 74 68 65 20 6f 75 74 70 75 74 20  that the output 
21fe0 62 75 66 66 65 72 20 69 73 20 6c 61 72 67 65 20  buffer is large 
21ff0 65 6e 6f 75 67 68 20 66 6f 72 20 74 68 65 20 74  enough for the t
22000 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 0a 20  emporary file . 
22010 20 2a 2a 20 6e 61 6d 65 20 69 6e 20 74 68 65 20   ** name in the 
22020 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 61 74  following format
22030 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 22 3c  :.  **.  **   "<
22040 74 65 6d 70 6f 72 61 72 79 5f 64 69 72 65 63 74  temporary_direct
22050 6f 72 79 3e 2f 65 74 69 6c 71 73 5f 58 58 58 58  ory>/etilqs_XXXX
22060 58 58 58 58 58 58 58 58 58 58 58 5c 30 5c 30 22  XXXXXXXXXXX\0\0"
22070 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 6e 6f  .  **.  ** If no
22080 74 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  t, return SQLITE
22090 5f 45 52 52 4f 52 2e 20 20 54 68 65 20 6e 75 6d  _ERROR.  The num
220a0 62 65 72 20 31 37 20 69 73 20 75 73 65 64 20 68  ber 17 is used h
220b0 65 72 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 0a  ere in order to.
220c0 20 20 2a 2a 20 61 63 63 6f 75 6e 74 20 66 6f 72    ** account for
220d0 20 74 68 65 20 73 70 61 63 65 20 75 73 65 64 20   the space used 
220e0 62 79 20 74 68 65 20 31 35 20 63 68 61 72 61 63  by the 15 charac
220f0 74 65 72 20 72 61 6e 64 6f 6d 20 73 75 66 66 69  ter random suffi
22100 78 20 61 6e 64 20 74 68 65 0a 20 20 2a 2a 20 74  x and the.  ** t
22110 77 6f 20 74 72 61 69 6c 69 6e 67 20 4e 55 4c 20  wo trailing NUL 
22120 63 68 61 72 61 63 74 65 72 73 2e 20 20 54 68 65  characters.  The
22130 20 66 69 6e 61 6c 20 64 69 72 65 63 74 6f 72 79   final directory
22140 20 73 65 70 61 72 61 74 6f 72 20 63 68 61 72 61   separator chara
22150 63 74 65 72 0a 20 20 2a 2a 20 68 61 73 20 61 6c  cter.  ** has al
22160 72 65 61 64 79 20 61 64 64 65 64 20 69 66 20 69  ready added if i
22170 74 20 77 61 73 20 6e 6f 74 20 61 6c 72 65 61 64  t was not alread
22180 79 20 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2f 0a  y present..  */.
22190 20 20 6e 4c 65 6e 20 3d 20 73 71 6c 69 74 65 33    nLen = sqlite3
221a0 53 74 72 6c 65 6e 33 30 28 7a 42 75 66 29 3b 0a  Strlen30(zBuf);.
221b0 20 20 69 66 28 20 28 6e 4c 65 6e 20 2b 20 6e 50    if( (nLen + nP
221c0 72 65 20 2b 20 31 37 29 20 3e 20 6e 42 75 66 20  re + 17) > nBuf 
221d0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
221e0 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 4f  ree(zBuf);.    O
221f0 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49  STRACE(("TEMP-FI
22200 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45  LENAME rc=SQLITE
22210 5f 45 52 52 4f 52 5c 6e 22 29 29 3b 0a 20 20 20  _ERROR\n"));.   
22220 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72   return winLogEr
22230 72 6f 72 28 53 51 4c 49 54 45 5f 45 52 52 4f 52  ror(SQLITE_ERROR
22240 2c 20 30 2c 20 22 77 69 6e 47 65 74 54 65 6d 70  , 0, "winGetTemp
22250 6e 61 6d 65 35 22 2c 20 30 29 3b 0a 20 20 7d 0a  name5", 0);.  }.
22260 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  .  sqlite3_snpri
22270 6e 74 66 28 6e 42 75 66 2d 31 36 2d 6e 4c 65 6e  ntf(nBuf-16-nLen
22280 2c 20 7a 42 75 66 2b 6e 4c 65 6e 2c 20 53 51 4c  , zBuf+nLen, SQL
22290 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52  ITE_TEMP_FILE_PR
222a0 45 46 49 58 29 3b 0a 0a 20 20 6a 20 3d 20 73 71  EFIX);..  j = sq
222b0 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 42  lite3Strlen30(zB
222c0 75 66 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72  uf);.  sqlite3_r
222d0 61 6e 64 6f 6d 6e 65 73 73 28 31 35 2c 20 26 7a  andomness(15, &z
222e0 42 75 66 5b 6a 5d 29 3b 0a 20 20 66 6f 72 28 69  Buf[j]);.  for(i
222f0 3d 30 3b 20 69 3c 31 35 3b 20 69 2b 2b 2c 20 6a  =0; i<15; i++, j
22300 2b 2b 29 7b 0a 20 20 20 20 7a 42 75 66 5b 6a 5d  ++){.    zBuf[j]
22310 20 3d 20 28 63 68 61 72 29 7a 43 68 61 72 73 5b   = (char)zChars[
22320 20 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72   ((unsigned char
22330 29 7a 42 75 66 5b 6a 5d 29 25 28 73 69 7a 65 6f  )zBuf[j])%(sizeo
22340 66 28 7a 43 68 61 72 73 29 2d 31 29 20 5d 3b 0a  f(zChars)-1) ];.
22350 20 20 7d 0a 20 20 7a 42 75 66 5b 6a 5d 20 3d 20    }.  zBuf[j] = 
22360 30 3b 0a 20 20 7a 42 75 66 5b 6a 2b 31 5d 20 3d  0;.  zBuf[j+1] =
22370 20 30 3b 0a 20 20 2a 70 7a 42 75 66 20 3d 20 7a   0;.  *pzBuf = z
22380 42 75 66 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28  Buf;..  OSTRACE(
22390 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20  ("TEMP-FILENAME 
223a0 6e 61 6d 65 3d 25 73 2c 20 72 63 3d 53 51 4c 49  name=%s, rc=SQLI
223b0 54 45 5f 4f 4b 5c 6e 22 2c 20 7a 42 75 66 29 29  TE_OK\n", zBuf))
223c0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
223d0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
223e0 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
223f0 65 20 6e 61 6d 65 64 20 66 69 6c 65 20 69 73 20  e named file is 
22400 72 65 61 6c 6c 79 20 61 20 64 69 72 65 63 74 6f  really a directo
22410 72 79 2e 20 20 52 65 74 75 72 6e 20 66 61 6c 73  ry.  Return fals
22420 65 20 69 66 0a 2a 2a 20 69 74 20 69 73 20 73 6f  e if.** it is so
22430 6d 65 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68  mething other th
22440 61 6e 20 61 20 64 69 72 65 63 74 6f 72 79 2c 20  an a directory, 
22450 6f 72 20 69 66 20 74 68 65 72 65 20 69 73 20 61  or if there is a
22460 6e 79 20 6b 69 6e 64 20 6f 66 20 6d 65 6d 6f 72  ny kind of memor
22470 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  y.** allocation 
22480 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  failure..*/.stat
22490 69 63 20 69 6e 74 20 77 69 6e 49 73 44 69 72 28  ic int winIsDir(
224a0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 43 6f 6e  const void *zCon
224b0 76 65 72 74 65 64 29 7b 0a 20 20 44 57 4f 52 44  verted){.  DWORD
224c0 20 61 74 74 72 3b 0a 20 20 69 6e 74 20 72 63 20   attr;.  int rc 
224d0 3d 20 30 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73  = 0;.  DWORD las
224e0 74 45 72 72 6e 6f 3b 0a 0a 20 20 69 66 28 20 6f  tErrno;..  if( o
224f0 73 49 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 69  sIsNT() ){.    i
22500 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20  nt cnt = 0;.    
22510 57 49 4e 33 32 5f 46 49 4c 45 5f 41 54 54 52 49  WIN32_FILE_ATTRI
22520 42 55 54 45 5f 44 41 54 41 20 73 41 74 74 72 44  BUTE_DATA sAttrD
22530 61 74 61 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  ata;.    memset(
22540 26 73 41 74 74 72 44 61 74 61 2c 20 30 2c 20 73  &sAttrData, 0, s
22550 69 7a 65 6f 66 28 73 41 74 74 72 44 61 74 61 29  izeof(sAttrData)
22560 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 21 28  );.    while( !(
22570 72 63 20 3d 20 6f 73 47 65 74 46 69 6c 65 41 74  rc = osGetFileAt
22580 74 72 69 62 75 74 65 73 45 78 57 28 28 4c 50 43  tributesExW((LPC
22590 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c  WSTR)zConverted,
225a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
225b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 47 65                Ge
225c0 74 46 69 6c 65 45 78 49 6e 66 6f 53 74 61 6e 64  tFileExInfoStand
225d0 61 72 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ard,.           
225e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
225f0 20 20 26 73 41 74 74 72 44 61 74 61 29 29 20 26    &sAttrData)) &
22600 26 20 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28  & winRetryIoerr(
22610 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f  &cnt, &lastErrno
22620 29 20 29 7b 7d 0a 20 20 20 20 69 66 28 20 21 72  ) ){}.    if( !r
22630 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  c ){.      retur
22640 6e 20 30 3b 20 2f 2a 20 49 6e 76 61 6c 69 64 20  n 0; /* Invalid 
22650 6e 61 6d 65 3f 20 2a 2f 0a 20 20 20 20 7d 0a 20  name? */.    }. 
22660 20 20 20 61 74 74 72 20 3d 20 73 41 74 74 72 44     attr = sAttrD
22670 61 74 61 2e 64 77 46 69 6c 65 41 74 74 72 69 62  ata.dwFileAttrib
22680 75 74 65 73 3b 0a 23 69 66 20 53 51 4c 49 54 45  utes;.#if SQLITE
22690 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a 20 20 7d  _OS_WINCE==0.  }
226a0 65 6c 73 65 7b 0a 20 20 20 20 61 74 74 72 20 3d  else{.    attr =
226b0 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62   osGetFileAttrib
226c0 75 74 65 73 41 28 28 63 68 61 72 2a 29 7a 43 6f  utesA((char*)zCo
226d0 6e 76 65 72 74 65 64 29 3b 0a 23 65 6e 64 69 66  nverted);.#endif
226e0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 61  .  }.  return (a
226f0 74 74 72 21 3d 49 4e 56 41 4c 49 44 5f 46 49 4c  ttr!=INVALID_FIL
22700 45 5f 41 54 54 52 49 42 55 54 45 53 29 20 26 26  E_ATTRIBUTES) &&
22710 20 28 61 74 74 72 26 46 49 4c 45 5f 41 54 54 52   (attr&FILE_ATTR
22720 49 42 55 54 45 5f 44 49 52 45 43 54 4f 52 59 29  IBUTE_DIRECTORY)
22730 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  ;.}../*.** Open 
22740 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  a file..*/.stati
22750 63 20 69 6e 74 20 77 69 6e 4f 70 65 6e 28 0a 20  c int winOpen(. 
22760 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
22770 66 73 2c 20 20 20 20 20 20 20 20 2f 2a 20 55 73  fs,        /* Us
22780 65 64 20 74 6f 20 67 65 74 20 6d 61 78 69 6d 75  ed to get maximu
22790 6d 20 70 61 74 68 20 6e 61 6d 65 20 6c 65 6e 67  m path name leng
227a0 74 68 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  th */.  const ch
227b0 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20  ar *zName,      
227c0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
227d0 20 66 69 6c 65 20 28 55 54 46 2d 38 29 20 2a 2f   file (UTF-8) */
227e0 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
227f0 2a 69 64 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  *id,         /* 
22800 57 72 69 74 65 20 74 68 65 20 53 51 4c 69 74 65  Write the SQLite
22810 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 68 65 72   file handle her
22820 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  e */.  int flags
22830 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
22840 20 2f 2a 20 4f 70 65 6e 20 6d 6f 64 65 20 66 6c   /* Open mode fl
22850 61 67 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4f  ags */.  int *pO
22860 75 74 46 6c 61 67 73 20 20 20 20 20 20 20 20 20  utFlags         
22870 20 20 20 2f 2a 20 53 74 61 74 75 73 20 72 65 74     /* Status ret
22880 75 72 6e 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a  urn flags */.){.
22890 20 20 48 41 4e 44 4c 45 20 68 3b 0a 20 20 44 57    HANDLE h;.  DW
228a0 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20  ORD lastErrno = 
228b0 30 3b 0a 20 20 44 57 4f 52 44 20 64 77 44 65 73  0;.  DWORD dwDes
228c0 69 72 65 64 41 63 63 65 73 73 3b 0a 20 20 44 57  iredAccess;.  DW
228d0 4f 52 44 20 64 77 53 68 61 72 65 4d 6f 64 65 3b  ORD dwShareMode;
228e0 0a 20 20 44 57 4f 52 44 20 64 77 43 72 65 61 74  .  DWORD dwCreat
228f0 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 3b 0a  ionDisposition;.
22900 20 20 44 57 4f 52 44 20 64 77 46 6c 61 67 73 41    DWORD dwFlagsA
22910 6e 64 41 74 74 72 69 62 75 74 65 73 20 3d 20 30  ndAttributes = 0
22920 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ;.#if SQLITE_OS_
22930 57 49 4e 43 45 0a 20 20 69 6e 74 20 69 73 54 65  WINCE.  int isTe
22940 6d 70 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20  mp = 0;.#endif. 
22950 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20   winFile *pFile 
22960 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a  = (winFile*)id;.
22970 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74    void *zConvert
22980 65 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ed;             
22990 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 69 6e 20   /* Filename in 
229a0 4f 53 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20  OS encoding */. 
229b0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 74   const char *zUt
229c0 66 38 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 20  f8Name = zName; 
229d0 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 69 6e 20 55  /* Filename in U
229e0 54 46 2d 38 20 65 6e 63 6f 64 69 6e 67 20 2a 2f  TF-8 encoding */
229f0 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a  .  int cnt = 0;.
22a00 0a 20 20 2f 2a 20 49 66 20 61 72 67 75 6d 65 6e  .  /* If argumen
22a10 74 20 7a 50 61 74 68 20 69 73 20 61 20 4e 55 4c  t zPath is a NUL
22a20 4c 20 70 6f 69 6e 74 65 72 2c 20 74 68 69 73 20  L pointer, this 
22a30 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 71 75  function is requ
22a40 69 72 65 64 20 74 6f 20 6f 70 65 6e 0a 20 20 2a  ired to open.  *
22a50 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  * a temporary fi
22a60 6c 65 2e 20 55 73 65 20 74 68 69 73 20 62 75 66  le. Use this buf
22a70 66 65 72 20 74 6f 20 73 74 6f 72 65 20 74 68 65  fer to store the
22a80 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e 2e 0a 20   file name in.. 
22a90 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54 6d 70   */.  char *zTmp
22aa0 6e 61 6d 65 20 3d 20 30 3b 20 2f 2a 20 46 6f 72  name = 0; /* For
22ab0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 6e   temporary filen
22ac0 61 6d 65 2c 20 69 66 20 6e 65 63 65 73 73 61 72  ame, if necessar
22ad0 79 2e 20 2a 2f 0a 0a 20 20 69 6e 74 20 72 63 20  y. */..  int rc 
22ae0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
22af0 20 20 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74          /* Funct
22b00 69 6f 6e 20 52 65 74 75 72 6e 20 43 6f 64 65 20  ion Return Code 
22b10 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
22b20 4e 44 45 42 55 47 29 20 7c 7c 20 53 51 4c 49 54  NDEBUG) || SQLIT
22b30 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 69 6e 74  E_OS_WINCE.  int
22b40 20 65 54 79 70 65 20 3d 20 66 6c 61 67 73 26 30   eType = flags&0
22b50 78 46 46 46 46 46 46 30 30 3b 20 20 2f 2a 20 54  xFFFFFF00;  /* T
22b60 79 70 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 6f  ype of file to o
22b70 70 65 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20  pen */.#endif.. 
22b80 20 69 6e 74 20 69 73 45 78 63 6c 75 73 69 76 65   int isExclusive
22b90 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c    = (flags & SQL
22ba0 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49  ITE_OPEN_EXCLUSI
22bb0 56 45 29 3b 0a 20 20 69 6e 74 20 69 73 44 65 6c  VE);.  int isDel
22bc0 65 74 65 20 20 20 20 20 3d 20 28 66 6c 61 67 73  ete     = (flags
22bd0 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44   & SQLITE_OPEN_D
22be0 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 29 3b 0a 20  ELETEONCLOSE);. 
22bf0 20 69 6e 74 20 69 73 43 72 65 61 74 65 20 20 20   int isCreate   
22c00 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c    = (flags & SQL
22c10 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29  ITE_OPEN_CREATE)
22c20 3b 0a 20 20 69 6e 74 20 69 73 52 65 61 64 6f 6e  ;.  int isReadon
22c30 6c 79 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20  ly   = (flags & 
22c40 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
22c50 4f 4e 4c 59 29 3b 0a 20 20 69 6e 74 20 69 73 52  ONLY);.  int isR
22c60 65 61 64 57 72 69 74 65 20 20 3d 20 28 66 6c 61  eadWrite  = (fla
22c70 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
22c80 5f 52 45 41 44 57 52 49 54 45 29 3b 0a 0a 23 69  _READWRITE);..#i
22c90 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 69  fndef NDEBUG.  i
22ca0 6e 74 20 69 73 4f 70 65 6e 4a 6f 75 72 6e 61 6c  nt isOpenJournal
22cb0 20 3d 20 28 69 73 43 72 65 61 74 65 20 26 26 20   = (isCreate && 
22cc0 28 0a 20 20 20 20 20 20 20 20 65 54 79 70 65 3d  (.        eType=
22cd0 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53  =SQLITE_OPEN_MAS
22ce0 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20  TER_JOURNAL .   
22cf0 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
22d00 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
22d10 52 4e 41 4c 20 0a 20 20 20 20 20 7c 7c 20 65 54  RNAL .     || eT
22d20 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
22d30 5f 57 41 4c 0a 20 20 29 29 3b 0a 23 65 6e 64 69  _WAL.  ));.#endi
22d40 66 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4f  f..  OSTRACE(("O
22d50 50 45 4e 20 6e 61 6d 65 3d 25 73 2c 20 70 46 69  PEN name=%s, pFi
22d60 6c 65 3d 25 70 2c 20 66 6c 61 67 73 3d 25 78 2c  le=%p, flags=%x,
22d70 20 70 4f 75 74 46 6c 61 67 73 3d 25 70 5c 6e 22   pOutFlags=%p\n"
22d80 2c 0a 20 20 20 20 20 20 20 20 20 20 20 7a 55 74  ,.           zUt
22d90 66 38 4e 61 6d 65 2c 20 69 64 2c 20 66 6c 61 67  f8Name, id, flag
22da0 73 2c 20 70 4f 75 74 46 6c 61 67 73 29 29 3b 0a  s, pOutFlags));.
22db0 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 65 20  .  /* Check the 
22dc0 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 61 74 65 6d  following statem
22dd0 65 6e 74 73 20 61 72 65 20 74 72 75 65 3a 20 0a  ents are true: .
22de0 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 28 61 29 20    **.  **   (a) 
22df0 45 78 61 63 74 6c 79 20 6f 6e 65 20 6f 66 20 74  Exactly one of t
22e00 68 65 20 52 45 41 44 57 52 49 54 45 20 61 6e 64  he READWRITE and
22e10 20 52 45 41 44 4f 4e 4c 59 20 66 6c 61 67 73 20   READONLY flags 
22e20 6d 75 73 74 20 62 65 20 73 65 74 2c 20 61 6e 64  must be set, and
22e30 20 0a 20 20 2a 2a 20 20 20 28 62 29 20 69 66 20   .  **   (b) if 
22e40 43 52 45 41 54 45 20 69 73 20 73 65 74 2c 20 74  CREATE is set, t
22e50 68 65 6e 20 52 45 41 44 57 52 49 54 45 20 6d 75  hen READWRITE mu
22e60 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2c 20  st also be set, 
22e70 61 6e 64 0a 20 20 2a 2a 20 20 20 28 63 29 20 69  and.  **   (c) i
22e80 66 20 45 58 43 4c 55 53 49 56 45 20 69 73 20 73  f EXCLUSIVE is s
22e90 65 74 2c 20 74 68 65 6e 20 43 52 45 41 54 45 20  et, then CREATE 
22ea0 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74  must also be set
22eb0 2e 0a 20 20 2a 2a 20 20 20 28 64 29 20 69 66 20  ..  **   (d) if 
22ec0 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 69 73  DELETEONCLOSE is
22ed0 20 73 65 74 2c 20 74 68 65 6e 20 43 52 45 41 54   set, then CREAT
22ee0 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73  E must also be s
22ef0 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  et..  */.  asser
22f00 74 28 28 69 73 52 65 61 64 6f 6e 6c 79 3d 3d 30  t((isReadonly==0
22f10 20 7c 7c 20 69 73 52 65 61 64 57 72 69 74 65 3d   || isReadWrite=
22f20 3d 30 29 20 26 26 20 28 69 73 52 65 61 64 57 72  =0) && (isReadWr
22f30 69 74 65 20 7c 7c 20 69 73 52 65 61 64 6f 6e 6c  ite || isReadonl
22f40 79 29 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73  y));.  assert(is
22f50 43 72 65 61 74 65 3d 3d 30 20 7c 7c 20 69 73 52  Create==0 || isR
22f60 65 61 64 57 72 69 74 65 29 3b 0a 20 20 61 73 73  eadWrite);.  ass
22f70 65 72 74 28 69 73 45 78 63 6c 75 73 69 76 65 3d  ert(isExclusive=
22f80 3d 30 20 7c 7c 20 69 73 43 72 65 61 74 65 29 3b  =0 || isCreate);
22f90 0a 20 20 61 73 73 65 72 74 28 69 73 44 65 6c 65  .  assert(isDele
22fa0 74 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61 74  te==0 || isCreat
22fb0 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 61  e);..  /* The ma
22fc0 69 6e 20 44 42 2c 20 6d 61 69 6e 20 6a 6f 75 72  in DB, main jour
22fd0 6e 61 6c 2c 20 57 41 4c 20 66 69 6c 65 20 61 6e  nal, WAL file an
22fe0 64 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  d master journal
22ff0 20 61 72 65 20 6e 65 76 65 72 20 0a 20 20 2a 2a   are never .  **
23000 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64   automatically d
23010 65 6c 65 74 65 64 2e 20 4e 6f 72 20 61 72 65 20  eleted. Nor are 
23020 74 68 65 79 20 65 76 65 72 20 74 65 6d 70 6f 72  they ever tempor
23030 61 72 79 20 66 69 6c 65 73 2e 20 20 2a 2f 0a 20  ary files.  */. 
23040 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65 6c   assert( (!isDel
23050 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c  ete && zName) ||
23060 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f   eType!=SQLITE_O
23070 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 3b 0a 20  PEN_MAIN_DB );. 
23080 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65 6c   assert( (!isDel
23090 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c  ete && zName) ||
230a0 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f   eType!=SQLITE_O
230b0 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
230c0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21   );.  assert( (!
230d0 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d  isDelete && zNam
230e0 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c  e) || eType!=SQL
230f0 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f  ITE_OPEN_MASTER_
23100 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 61 73 73  JOURNAL );.  ass
23110 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20  ert( (!isDelete 
23120 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79  && zName) || eTy
23130 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe!=SQLITE_OPEN_
23140 57 41 4c 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73  WAL );..  /* Ass
23150 65 72 74 20 74 68 61 74 20 74 68 65 20 75 70 70  ert that the upp
23160 65 72 20 6c 61 79 65 72 20 68 61 73 20 73 65 74  er layer has set
23170 20 6f 6e 65 20 6f 66 20 74 68 65 20 22 66 69 6c   one of the "fil
23180 65 2d 74 79 70 65 22 20 66 6c 61 67 73 2e 20 2a  e-type" flags. *
23190 2f 0a 20 20 61 73 73 65 72 74 28 20 65 54 79 70  /.  assert( eTyp
231a0 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e==SQLITE_OPEN_M
231b0 41 49 4e 5f 44 42 20 20 20 20 20 20 7c 7c 20 65  AIN_DB      || e
231c0 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
231d0 4e 5f 54 45 4d 50 5f 44 42 20 0a 20 20 20 20 20  N_TEMP_DB .     
231e0 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
231f0 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
23200 52 4e 41 4c 20 7c 7c 20 65 54 79 70 65 3d 3d 53  RNAL || eType==S
23210 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
23220 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 20 20  JOURNAL .       
23230 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
23240 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c  _OPEN_SUBJOURNAL
23250 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c     || eType==SQL
23260 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f  ITE_OPEN_MASTER_
23270 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 20 20  JOURNAL .       
23280 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
23290 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f  _OPEN_TRANSIENT_
232a0 44 42 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c  DB || eType==SQL
232b0 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 29  ITE_OPEN_WAL.  )
232c0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  ;..  assert( pFi
232d0 6c 65 21 3d 30 20 29 3b 0a 20 20 6d 65 6d 73 65  le!=0 );.  memse
232e0 74 28 70 46 69 6c 65 2c 20 30 2c 20 73 69 7a 65  t(pFile, 0, size
232f0 6f 66 28 77 69 6e 46 69 6c 65 29 29 3b 0a 20 20  of(winFile));.  
23300 70 46 69 6c 65 2d 3e 68 20 3d 20 49 4e 56 41 4c  pFile->h = INVAL
23310 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 3b  ID_HANDLE_VALUE;
23320 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
23330 57 49 4e 52 54 0a 20 20 69 66 28 20 21 7a 55 74  WINRT.  if( !zUt
23340 66 38 4e 61 6d 65 20 26 26 20 21 73 71 6c 69 74  f8Name && !sqlit
23350 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72  e3_temp_director
23360 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
23370 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 45 52 52 4f  _log(SQLITE_ERRO
23380 52 2c 0a 20 20 20 20 20 20 20 20 22 73 71 6c 69  R,.        "sqli
23390 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f  te3_temp_directo
233a0 72 79 20 76 61 72 69 61 62 6c 65 20 73 68 6f 75  ry variable shou
233b0 6c 64 20 62 65 20 73 65 74 20 66 6f 72 20 57 69  ld be set for Wi
233c0 6e 52 54 22 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  nRT");.  }.#endi
233d0 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73  f..  /* If the s
233e0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74  econd argument t
233f0 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  o this function 
23400 69 73 20 4e 55 4c 4c 2c 20 67 65 6e 65 72 61 74  is NULL, generat
23410 65 20 61 20 0a 20 20 2a 2a 20 74 65 6d 70 6f 72  e a .  ** tempor
23420 61 72 79 20 66 69 6c 65 20 6e 61 6d 65 20 74 6f  ary file name to
23430 20 75 73 65 20 0a 20 20 2a 2f 0a 20 20 69 66 28   use .  */.  if(
23440 20 21 7a 55 74 66 38 4e 61 6d 65 20 29 7b 0a 20   !zUtf8Name ){. 
23450 20 20 20 61 73 73 65 72 74 28 20 69 73 44 65 6c     assert( isDel
23460 65 74 65 20 26 26 20 21 69 73 4f 70 65 6e 4a 6f  ete && !isOpenJo
23470 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 72 63 20  urnal );.    rc 
23480 3d 20 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65  = winGetTempname
23490 28 70 56 66 73 2c 20 26 7a 54 6d 70 6e 61 6d 65  (pVfs, &zTmpname
234a0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
234b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
234c0 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e    OSTRACE(("OPEN
234d0 20 6e 61 6d 65 3d 25 73 2c 20 72 63 3d 25 73 22   name=%s, rc=%s"
234e0 2c 20 7a 55 74 66 38 4e 61 6d 65 2c 20 73 71 6c  , zUtf8Name, sql
234f0 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29  ite3ErrName(rc))
23500 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
23510 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 55  rc;.    }.    zU
23520 74 66 38 4e 61 6d 65 20 3d 20 7a 54 6d 70 6e 61  tf8Name = zTmpna
23530 6d 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 61  me;.  }..  /* Da
23540 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 73  tabase filenames
23550 20 61 72 65 20 64 6f 75 62 6c 65 2d 7a 65 72 6f   are double-zero
23560 20 74 65 72 6d 69 6e 61 74 65 64 20 69 66 20 74   terminated if t
23570 68 65 79 20 61 72 65 20 6e 6f 74 0a 20 20 2a 2a  hey are not.  **
23580 20 55 52 49 73 20 77 69 74 68 20 70 61 72 61 6d   URIs with param
23590 65 74 65 72 73 2e 20 20 48 65 6e 63 65 2c 20 74  eters.  Hence, t
235a0 68 65 79 20 63 61 6e 20 61 6c 77 61 79 73 20 62  hey can always b
235b0 65 20 70 61 73 73 65 64 20 69 6e 74 6f 0a 20 20  e passed into.  
235c0 2a 2a 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 70  ** sqlite3_uri_p
235d0 61 72 61 6d 65 74 65 72 28 29 2e 0a 20 20 2a 2f  arameter()..  */
235e0 0a 20 20 61 73 73 65 72 74 28 20 28 65 54 79 70  .  assert( (eTyp
235f0 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e!=SQLITE_OPEN_M
23600 41 49 4e 5f 44 42 29 20 7c 7c 20 28 66 6c 61 67  AIN_DB) || (flag
23610 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
23620 55 52 49 29 20 7c 7c 0a 20 20 20 20 20 20 20 7a  URI) ||.       z
23630 55 74 66 38 4e 61 6d 65 5b 73 71 6c 69 74 65 33  Utf8Name[sqlite3
23640 53 74 72 6c 65 6e 33 30 28 7a 55 74 66 38 4e 61  Strlen30(zUtf8Na
23650 6d 65 29 2b 31 5d 3d 3d 30 20 29 3b 0a 0a 20 20  me)+1]==0 );..  
23660 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 66  /* Convert the f
23670 69 6c 65 6e 61 6d 65 20 74 6f 20 74 68 65 20 73  ilename to the s
23680 79 73 74 65 6d 20 65 6e 63 6f 64 69 6e 67 2e 20  ystem encoding. 
23690 2a 2f 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64 20  */.  zConverted 
236a0 3d 20 77 69 6e 43 6f 6e 76 65 72 74 46 72 6f 6d  = winConvertFrom
236b0 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 55 74  Utf8Filename(zUt
236c0 66 38 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a  f8Name);.  if( z
236d0 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a  Converted==0 ){.
236e0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
236f0 28 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20  (zTmpname);.    
23700 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 20 6e  OSTRACE(("OPEN n
23710 61 6d 65 3d 25 73 2c 20 72 63 3d 53 51 4c 49 54  ame=%s, rc=SQLIT
23720 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 22 2c 20  E_IOERR_NOMEM", 
23730 7a 55 74 66 38 4e 61 6d 65 29 29 3b 0a 20 20 20  zUtf8Name));.   
23740 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
23750 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  OERR_NOMEM;.  }.
23760 0a 20 20 69 66 28 20 77 69 6e 49 73 44 69 72 28  .  if( winIsDir(
23770 7a 43 6f 6e 76 65 72 74 65 64 29 20 29 7b 0a 20  zConverted) ){. 
23780 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
23790 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20  zConverted);.   
237a0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54   sqlite3_free(zT
237b0 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20 4f 53 54  mpname);.    OST
237c0 52 41 43 45 28 28 22 4f 50 45 4e 20 6e 61 6d 65  RACE(("OPEN name
237d0 3d 25 73 2c 20 72 63 3d 53 51 4c 49 54 45 5f 43  =%s, rc=SQLITE_C
237e0 41 4e 54 4f 50 45 4e 5f 49 53 44 49 52 22 2c 20  ANTOPEN_ISDIR", 
237f0 7a 55 74 66 38 4e 61 6d 65 29 29 3b 0a 20 20 20  zUtf8Name));.   
23800 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
23810 41 4e 54 4f 50 45 4e 5f 49 53 44 49 52 3b 0a 20  ANTOPEN_ISDIR;. 
23820 20 7d 0a 0a 20 20 69 66 28 20 69 73 52 65 61 64   }..  if( isRead
23830 57 72 69 74 65 20 29 7b 0a 20 20 20 20 64 77 44  Write ){.    dwD
23840 65 73 69 72 65 64 41 63 63 65 73 73 20 3d 20 47  esiredAccess = G
23850 45 4e 45 52 49 43 5f 52 45 41 44 20 7c 20 47 45  ENERIC_READ | GE
23860 4e 45 52 49 43 5f 57 52 49 54 45 3b 0a 20 20 7d  NERIC_WRITE;.  }
23870 65 6c 73 65 7b 0a 20 20 20 20 64 77 44 65 73 69  else{.    dwDesi
23880 72 65 64 41 63 63 65 73 73 20 3d 20 47 45 4e 45  redAccess = GENE
23890 52 49 43 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a 20  RIC_READ;.  }.. 
238a0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   /* SQLITE_OPEN_
238b0 45 58 43 4c 55 53 49 56 45 20 69 73 20 75 73 65  EXCLUSIVE is use
238c0 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  d to make sure t
238d0 68 61 74 20 61 20 6e 65 77 20 66 69 6c 65 20 69  hat a new file i
238e0 73 20 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 2e  s .  ** created.
238f0 20 53 51 4c 69 74 65 20 64 6f 65 73 6e 27 74 20   SQLite doesn't 
23900 75 73 65 20 69 74 20 74 6f 20 69 6e 64 69 63 61  use it to indica
23910 74 65 20 22 65 78 63 6c 75 73 69 76 65 20 61 63  te "exclusive ac
23920 63 65 73 73 22 20 0a 20 20 2a 2a 20 61 73 20 69  cess" .  ** as i
23930 74 20 69 73 20 75 73 75 61 6c 6c 79 20 75 6e 64  t is usually und
23940 65 72 73 74 6f 6f 64 2e 0a 20 20 2a 2f 0a 20 20  erstood..  */.  
23950 69 66 28 20 69 73 45 78 63 6c 75 73 69 76 65 20  if( isExclusive 
23960 29 7b 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65  ){.    /* Create
23970 73 20 61 20 6e 65 77 20 66 69 6c 65 2c 20 6f 6e  s a new file, on
23980 6c 79 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f  ly if it does no
23990 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 2e  t already exist.
239a0 20 2a 2f 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   */.    /* If th
239b0 65 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 69  e file exists, i
239c0 74 20 66 61 69 6c 73 2e 20 2a 2f 0a 20 20 20 20  t fails. */.    
239d0 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73  dwCreationDispos
239e0 69 74 69 6f 6e 20 3d 20 43 52 45 41 54 45 5f 4e  ition = CREATE_N
239f0 45 57 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  EW;.  }else if( 
23a00 69 73 43 72 65 61 74 65 20 29 7b 0a 20 20 20 20  isCreate ){.    
23a10 2f 2a 20 4f 70 65 6e 20 65 78 69 73 74 69 6e 67  /* Open existing
23a20 20 66 69 6c 65 2c 20 6f 72 20 63 72 65 61 74 65   file, or create
23a30 20 69 66 20 69 74 20 64 6f 65 73 6e 27 74 20 65   if it doesn't e
23a40 78 69 73 74 20 2a 2f 0a 20 20 20 20 64 77 43 72  xist */.    dwCr
23a50 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f  eationDispositio
23a60 6e 20 3d 20 4f 50 45 4e 5f 41 4c 57 41 59 53 3b  n = OPEN_ALWAYS;
23a70 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
23a80 20 4f 70 65 6e 73 20 61 20 66 69 6c 65 2c 20 6f   Opens a file, o
23a90 6e 6c 79 20 69 66 20 69 74 20 65 78 69 73 74 73  nly if it exists
23aa0 2e 20 2a 2f 0a 20 20 20 20 64 77 43 72 65 61 74  . */.    dwCreat
23ab0 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 20 3d  ionDisposition =
23ac0 20 4f 50 45 4e 5f 45 58 49 53 54 49 4e 47 3b 0a   OPEN_EXISTING;.
23ad0 20 20 7d 0a 0a 20 20 64 77 53 68 61 72 65 4d 6f    }..  dwShareMo
23ae0 64 65 20 3d 20 46 49 4c 45 5f 53 48 41 52 45 5f  de = FILE_SHARE_
23af0 52 45 41 44 20 7c 20 46 49 4c 45 5f 53 48 41 52  READ | FILE_SHAR
23b00 45 5f 57 52 49 54 45 3b 0a 0a 20 20 69 66 28 20  E_WRITE;..  if( 
23b10 69 73 44 65 6c 65 74 65 20 29 7b 0a 23 69 66 20  isDelete ){.#if 
23b20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
23b30 20 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74      dwFlagsAndAt
23b40 74 72 69 62 75 74 65 73 20 3d 20 46 49 4c 45 5f  tributes = FILE_
23b50 41 54 54 52 49 42 55 54 45 5f 48 49 44 44 45 4e  ATTRIBUTE_HIDDEN
23b60 3b 0a 20 20 20 20 69 73 54 65 6d 70 20 3d 20 31  ;.    isTemp = 1
23b70 3b 0a 23 65 6c 73 65 0a 20 20 20 20 64 77 46 6c  ;.#else.    dwFl
23b80 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73  agsAndAttributes
23b90 20 3d 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54   = FILE_ATTRIBUT
23ba0 45 5f 54 45 4d 50 4f 52 41 52 59 0a 20 20 20 20  E_TEMPORARY.    
23bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23bc0 20 20 20 20 20 20 20 20 20 20 20 7c 20 46 49 4c             | FIL
23bd0 45 5f 41 54 54 52 49 42 55 54 45 5f 48 49 44 44  E_ATTRIBUTE_HIDD
23be0 45 4e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  EN.             
23bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c00 20 20 7c 20 46 49 4c 45 5f 46 4c 41 47 5f 44 45    | FILE_FLAG_DE
23c10 4c 45 54 45 5f 4f 4e 5f 43 4c 4f 53 45 3b 0a 23  LETE_ON_CLOSE;.#
23c20 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20  endif.  }else{. 
23c30 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74     dwFlagsAndAtt
23c40 72 69 62 75 74 65 73 20 3d 20 46 49 4c 45 5f 41  ributes = FILE_A
23c50 54 54 52 49 42 55 54 45 5f 4e 4f 52 4d 41 4c 3b  TTRIBUTE_NORMAL;
23c60 0a 20 20 7d 0a 20 20 2f 2a 20 52 65 70 6f 72 74  .  }.  /* Report
23c70 73 20 66 72 6f 6d 20 74 68 65 20 69 6e 74 65 72  s from the inter
23c80 6e 65 74 20 61 72 65 20 74 68 61 74 20 70 65 72  net are that per
23c90 66 6f 72 6d 61 6e 63 65 20 69 73 20 61 6c 77 61  formance is alwa
23ca0 79 73 0a 20 20 2a 2a 20 62 65 74 74 65 72 20 69  ys.  ** better i
23cb0 66 20 46 49 4c 45 5f 46 4c 41 47 5f 52 41 4e 44  f FILE_FLAG_RAND
23cc0 4f 4d 5f 41 43 43 45 53 53 20 69 73 20 75 73 65  OM_ACCESS is use
23cd0 64 2e 20 20 54 69 63 6b 65 74 20 23 32 36 39 39  d.  Ticket #2699
23ce0 2e 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  . */.#if SQLITE_
23cf0 4f 53 5f 57 49 4e 43 45 0a 20 20 64 77 46 6c 61  OS_WINCE.  dwFla
23d00 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 20  gsAndAttributes 
23d10 7c 3d 20 46 49 4c 45 5f 46 4c 41 47 5f 52 41 4e  |= FILE_FLAG_RAN
23d20 44 4f 4d 5f 41 43 43 45 53 53 3b 0a 23 65 6e 64  DOM_ACCESS;.#end
23d30 69 66 0a 0a 20 20 69 66 28 20 6f 73 49 73 4e 54  if..  if( osIsNT
23d40 28 29 20 29 7b 0a 23 69 66 20 53 51 4c 49 54 45  () ){.#if SQLITE
23d50 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 43 52  _OS_WINRT.    CR
23d60 45 41 54 45 46 49 4c 45 32 5f 45 58 54 45 4e 44  EATEFILE2_EXTEND
23d70 45 44 5f 50 41 52 41 4d 45 54 45 52 53 20 65 78  ED_PARAMETERS ex
23d80 74 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73  tendedParameters
23d90 3b 0a 20 20 20 20 65 78 74 65 6e 64 65 64 50 61  ;.    extendedPa
23da0 72 61 6d 65 74 65 72 73 2e 64 77 53 69 7a 65 20  rameters.dwSize 
23db0 3d 20 73 69 7a 65 6f 66 28 43 52 45 41 54 45 46  = sizeof(CREATEF
23dc0 49 4c 45 32 5f 45 58 54 45 4e 44 45 44 5f 50 41  ILE2_EXTENDED_PA
23dd0 52 41 4d 45 54 45 52 53 29 3b 0a 20 20 20 20 65  RAMETERS);.    e
23de0 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72  xtendedParameter
23df0 73 2e 64 77 46 69 6c 65 41 74 74 72 69 62 75 74  s.dwFileAttribut
23e00 65 73 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20  es =.           
23e10 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69   dwFlagsAndAttri
23e20 62 75 74 65 73 20 26 20 46 49 4c 45 5f 41 54 54  butes & FILE_ATT
23e30 52 49 42 55 54 45 5f 4d 41 53 4b 3b 0a 20 20 20  RIBUTE_MASK;.   
23e40 20 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74   extendedParamet
23e50 65 72 73 2e 64 77 46 69 6c 65 46 6c 61 67 73 20  ers.dwFileFlags 
23e60 3d 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72  = dwFlagsAndAttr
23e70 69 62 75 74 65 73 20 26 20 46 49 4c 45 5f 46 4c  ibutes & FILE_FL
23e80 41 47 5f 4d 41 53 4b 3b 0a 20 20 20 20 65 78 74  AG_MASK;.    ext
23e90 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73 2e  endedParameters.
23ea0 64 77 53 65 63 75 72 69 74 79 51 6f 73 46 6c 61  dwSecurityQosFla
23eb0 67 73 20 3d 20 53 45 43 55 52 49 54 59 5f 41 4e  gs = SECURITY_AN
23ec0 4f 4e 59 4d 4f 55 53 3b 0a 20 20 20 20 65 78 74  ONYMOUS;.    ext
23ed0 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73 2e  endedParameters.
23ee0 6c 70 53 65 63 75 72 69 74 79 41 74 74 72 69 62  lpSecurityAttrib
23ef0 75 74 65 73 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  utes = NULL;.   
23f00 20 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74   extendedParamet
23f10 65 72 73 2e 68 54 65 6d 70 6c 61 74 65 46 69 6c  ers.hTemplateFil
23f20 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 77 68  e = NULL;.    wh
23f30 69 6c 65 28 20 28 68 20 3d 20 6f 73 43 72 65 61  ile( (h = osCrea
23f40 74 65 46 69 6c 65 32 28 28 4c 50 43 57 53 54 52  teFile2((LPCWSTR
23f50 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20  )zConverted,.   
23f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23f70 20 20 20 20 20 20 20 20 20 20 20 64 77 44 65 73             dwDes
23f80 69 72 65 64 41 63 63 65 73 73 2c 0a 20 20 20 20  iredAccess,.    
23f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23fa0 20 20 20 20 20 20 20 20 20 20 64 77 53 68 61 72            dwShar
23fb0 65 4d 6f 64 65 2c 0a 20 20 20 20 20 20 20 20 20  eMode,.         
23fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23fd0 20 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44       dwCreationD
23fe0 69 73 70 6f 73 69 74 69 6f 6e 2c 0a 20 20 20 20  isposition,.    
23ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24000 20 20 20 20 20 20 20 20 20 20 26 65 78 74 65 6e            &exten
24010 64 65 64 50 61 72 61 6d 65 74 65 72 73 29 29 3d  dedParameters))=
24020 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f  =INVALID_HANDLE_
24030 56 41 4c 55 45 20 26 26 0a 20 20 20 20 20 20 20  VALUE &&.       
24040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24050 20 20 20 20 20 20 20 77 69 6e 52 65 74 72 79 49         winRetryI
24060 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74  oerr(&cnt, &last
24070 45 72 72 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20  Errno) ){.      
24080 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 6f 70           /* Noop
24090 20 2a 2f 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a   */.    }.#else.
240a0 20 20 20 20 77 68 69 6c 65 28 20 28 68 20 3d 20      while( (h = 
240b0 6f 73 43 72 65 61 74 65 46 69 6c 65 57 28 28 4c  osCreateFileW((L
240c0 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65  PCWSTR)zConverte
240d0 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
240e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
240f0 20 64 77 44 65 73 69 72 65 64 41 63 63 65 73 73   dwDesiredAccess
24100 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
24110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24120 64 77 53 68 61 72 65 4d 6f 64 65 2c 20 4e 55 4c  dwShareMode, NUL
24130 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  L,.             
24140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24150 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f   dwCreationDispo
24160 73 69 74 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20  sition,.        
24170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24180 20 20 20 20 20 20 64 77 46 6c 61 67 73 41 6e 64        dwFlagsAnd
24190 41 74 74 72 69 62 75 74 65 73 2c 0a 20 20 20 20  Attributes,.    
241a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
241b0 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 29 29            NULL))
241c0 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  ==INVALID_HANDLE
241d0 5f 56 41 4c 55 45 20 26 26 0a 20 20 20 20 20 20  _VALUE &&.      
241e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
241f0 20 20 20 20 20 20 20 20 77 69 6e 52 65 74 72 79          winRetry
24200 49 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c 61 73  Ioerr(&cnt, &las
24210 74 45 72 72 6e 6f 29 20 29 7b 0a 20 20 20 20 20  tErrno) ){.     
24220 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 6f            /* Noo
24230 70 20 2a 2f 0a 20 20 20 20 7d 0a 23 65 6e 64 69  p */.    }.#endi
24240 66 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c  f.  }.#ifdef SQL
24250 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
24260 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 77  SI.  else{.    w
24270 68 69 6c 65 28 20 28 68 20 3d 20 6f 73 43 72 65  hile( (h = osCre
24280 61 74 65 46 69 6c 65 41 28 28 4c 50 43 53 54 52  ateFileA((LPCSTR
24290 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20  )zConverted,.   
242a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
242b0 20 20 20 20 20 20 20 20 20 20 20 64 77 44 65 73             dwDes
242c0 69 72 65 64 41 63 63 65 73 73 2c 0a 20 20 20 20  iredAccess,.    
242d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
242e0 20 20 20 20 20 20 20 20 20 20 64 77 53 68 61 72            dwShar
242f0 65 4d 6f 64 65 2c 20 4e 55 4c 4c 2c 0a 20 20 20  eMode, NULL,.   
24300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24310 20 20 20 20 20 20 20 20 20 20 20 64 77 43 72 65             dwCre
24320 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e  ationDisposition
24330 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
24340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24350 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62  dwFlagsAndAttrib
24360 75 74 65 73 2c 0a 20 20 20 20 20 20 20 20 20 20  utes,.          
24370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24380 20 20 20 20 4e 55 4c 4c 29 29 3d 3d 49 4e 56 41      NULL))==INVA
24390 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
243a0 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20   &&.            
243b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
243c0 20 20 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28    winRetryIoerr(
243d0 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f  &cnt, &lastErrno
243e0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
243f0 20 20 20 20 2f 2a 20 4e 6f 6f 70 20 2a 2f 0a 20      /* Noop */. 
24400 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
24410 20 20 77 69 6e 4c 6f 67 49 6f 65 72 72 28 63 6e    winLogIoerr(cn
24420 74 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28  t);..  OSTRACE((
24430 22 4f 50 45 4e 20 66 69 6c 65 3d 25 70 2c 20 6e  "OPEN file=%p, n
24440 61 6d 65 3d 25 73 2c 20 61 63 63 65 73 73 3d 25  ame=%s, access=%
24450 6c 78 2c 20 72 63 3d 25 73 5c 6e 22 2c 20 68 2c  lx, rc=%s\n", h,
24460 20 7a 55 74 66 38 4e 61 6d 65 2c 0a 20 20 20 20   zUtf8Name,.    
24470 20 20 20 20 20 20 20 64 77 44 65 73 69 72 65 64         dwDesired
24480 41 63 63 65 73 73 2c 20 28 68 3d 3d 49 4e 56 41  Access, (h==INVA
24490 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
244a0 29 20 3f 20 22 66 61 69 6c 65 64 22 20 3a 20 22  ) ? "failed" : "
244b0 6f 6b 22 29 29 3b 0a 0a 20 20 69 66 28 20 68 3d  ok"));..  if( h=
244c0 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f  =INVALID_HANDLE_
244d0 56 41 4c 55 45 20 29 7b 0a 20 20 20 20 70 46 69  VALUE ){.    pFi
244e0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
244f0 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 77  lastErrno;.    w
24500 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
24510 45 5f 43 41 4e 54 4f 50 45 4e 2c 20 70 46 69 6c  E_CANTOPEN, pFil
24520 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 20 22 77  e->lastErrno, "w
24530 69 6e 4f 70 65 6e 22 2c 20 7a 55 74 66 38 4e 61  inOpen", zUtf8Na
24540 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  me);.    sqlite3
24550 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
24560 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
24570 72 65 65 28 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20  ree(zTmpname);. 
24580 20 20 20 69 66 28 20 69 73 52 65 61 64 57 72 69     if( isReadWri
24590 74 65 20 26 26 20 21 69 73 45 78 63 6c 75 73 69  te && !isExclusi
245a0 76 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ve ){.      retu
245b0 72 6e 20 77 69 6e 4f 70 65 6e 28 70 56 66 73 2c  rn winOpen(pVfs,
245c0 20 7a 4e 61 6d 65 2c 20 69 64 2c 20 0a 20 20 20   zName, id, .   
245d0 20 20 20 20 20 20 28 28 66 6c 61 67 73 7c 53 51        ((flags|SQ
245e0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
245f0 4c 59 29 20 26 0a 20 20 20 20 20 20 20 20 20 20  LY) &.          
24600 20 20 20 20 20 20 20 20 20 20 20 7e 28 53 51 4c             ~(SQL
24610 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c  ITE_OPEN_CREATE|
24620 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
24630 57 52 49 54 45 29 29 2c 0a 20 20 20 20 20 20 20  WRITE)),.       
24640 20 20 70 4f 75 74 46 6c 61 67 73 29 3b 0a 20 20    pOutFlags);.  
24650 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
24660 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e  eturn SQLITE_CAN
24670 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20  TOPEN_BKPT;.    
24680 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4f 75  }.  }..  if( pOu
24690 74 46 6c 61 67 73 20 29 7b 0a 20 20 20 20 69 66  tFlags ){.    if
246a0 28 20 69 73 52 65 61 64 57 72 69 74 65 20 29 7b  ( isReadWrite ){
246b0 0a 20 20 20 20 20 20 2a 70 4f 75 74 46 6c 61 67  .      *pOutFlag
246c0 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s = SQLITE_OPEN_
246d0 52 45 41 44 57 52 49 54 45 3b 0a 20 20 20 20 7d  READWRITE;.    }
246e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 4f 75  else{.      *pOu
246f0 74 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f  tFlags = SQLITE_
24700 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  OPEN_READONLY;. 
24710 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 4f 53 54 52     }.  }..  OSTR
24720 41 43 45 28 28 22 4f 50 45 4e 20 66 69 6c 65 3d  ACE(("OPEN file=
24730 25 70 2c 20 6e 61 6d 65 3d 25 73 2c 20 61 63 63  %p, name=%s, acc
24740 65 73 73 3d 25 6c 78 2c 20 70 4f 75 74 46 6c 61  ess=%lx, pOutFla
24750 67 73 3d 25 70 2c 20 2a 70 4f 75 74 46 6c 61 67  gs=%p, *pOutFlag
24760 73 3d 25 64 2c 20 22 0a 20 20 20 20 20 20 20 20  s=%d, ".        
24770 20 20 20 22 72 63 3d 25 73 5c 6e 22 2c 20 68 2c     "rc=%s\n", h,
24780 20 7a 55 74 66 38 4e 61 6d 65 2c 20 64 77 44 65   zUtf8Name, dwDe
24790 73 69 72 65 64 41 63 63 65 73 73 2c 20 70 4f 75  siredAccess, pOu
247a0 74 46 6c 61 67 73 2c 20 70 4f 75 74 46 6c 61 67  tFlags, pOutFlag
247b0 73 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20 2a  s ?.           *
247c0 70 4f 75 74 46 6c 61 67 73 20 3a 20 30 2c 20 28  pOutFlags : 0, (
247d0 68 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c  h==INVALID_HANDL
247e0 45 5f 56 41 4c 55 45 29 20 3f 20 22 66 61 69 6c  E_VALUE) ? "fail
247f0 65 64 22 20 3a 20 22 6f 6b 22 29 29 3b 0a 0a 23  ed" : "ok"));..#
24800 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
24810 43 45 0a 20 20 69 66 28 20 69 73 52 65 61 64 57  CE.  if( isReadW
24820 72 69 74 65 20 26 26 20 65 54 79 70 65 3d 3d 53  rite && eType==S
24830 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
24840 44 42 0a 20 20 20 20 20 20 20 26 26 20 28 72 63  DB.       && (rc
24850 20 3d 20 77 69 6e 63 65 43 72 65 61 74 65 4c 6f   = winceCreateLo
24860 63 6b 28 7a 4e 61 6d 65 2c 20 70 46 69 6c 65 29  ck(zName, pFile)
24870 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 29  )!=SQLITE_OK.  )
24880 7b 0a 20 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e  {.    osCloseHan
24890 64 6c 65 28 68 29 3b 0a 20 20 20 20 73 71 6c 69  dle(h);.    sqli
248a0 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
248b0 74 65 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ted);.    sqlite
248c0 33 5f 66 72 65 65 28 7a 54 6d 70 6e 61 6d 65 29  3_free(zTmpname)
248d0 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  ;.    OSTRACE(("
248e0 4f 50 45 4e 2d 43 45 2d 4c 4f 43 4b 20 6e 61 6d  OPEN-CE-LOCK nam
248f0 65 3d 25 73 2c 20 72 63 3d 25 73 5c 6e 22 2c 20  e=%s, rc=%s\n", 
24900 7a 4e 61 6d 65 2c 20 73 71 6c 69 74 65 33 45 72  zName, sqlite3Er
24910 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 20  rName(rc)));.   
24920 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
24930 20 20 69 66 28 20 69 73 54 65 6d 70 20 29 7b 0a    if( isTemp ){.
24940 20 20 20 20 70 46 69 6c 65 2d 3e 7a 44 65 6c 65      pFile->zDele
24950 74 65 4f 6e 43 6c 6f 73 65 20 3d 20 7a 43 6f 6e  teOnClose = zCon
24960 76 65 72 74 65 64 3b 0a 20 20 7d 65 6c 73 65 0a  verted;.  }else.
24970 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20 73  #endif.  {.    s
24980 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e  qlite3_free(zCon
24990 76 65 72 74 65 64 29 3b 0a 20 20 7d 0a 0a 20 20  verted);.  }..  
249a0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 6d  sqlite3_free(zTm
249b0 70 6e 61 6d 65 29 3b 0a 20 20 70 46 69 6c 65 2d  pname);.  pFile-
249c0 3e 70 4d 65 74 68 6f 64 20 3d 20 26 77 69 6e 49  >pMethod = &winI
249d0 6f 4d 65 74 68 6f 64 3b 0a 20 20 70 46 69 6c 65  oMethod;.  pFile
249e0 2d 3e 70 56 66 73 20 3d 20 70 56 66 73 3b 0a 20  ->pVfs = pVfs;. 
249f0 20 70 46 69 6c 65 2d 3e 68 20 3d 20 68 3b 0a 20   pFile->h = h;. 
24a00 20 69 66 28 20 69 73 52 65 61 64 6f 6e 6c 79 20   if( isReadonly 
24a10 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74  ){.    pFile->ct
24a20 72 6c 46 6c 61 67 73 20 7c 3d 20 57 49 4e 46 49  rlFlags |= WINFI
24a30 4c 45 5f 52 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20  LE_RDONLY;.  }. 
24a40 20 69 66 28 20 73 71 6c 69 74 65 33 5f 75 72 69   if( sqlite3_uri
24a50 5f 62 6f 6f 6c 65 61 6e 28 7a 4e 61 6d 65 2c 20  _boolean(zName, 
24a60 22 70 73 6f 77 22 2c 20 53 51 4c 49 54 45 5f 50  "psow", SQLITE_P
24a70 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49  OWERSAFE_OVERWRI
24a80 54 45 29 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  TE) ){.    pFile
24a90 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 57  ->ctrlFlags |= W
24aa0 49 4e 46 49 4c 45 5f 50 53 4f 57 3b 0a 20 20 7d  INFILE_PSOW;.  }
24ab0 0a 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  .  pFile->lastEr
24ac0 72 6e 6f 20 3d 20 4e 4f 5f 45 52 52 4f 52 3b 0a  rno = NO_ERROR;.
24ad0 20 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 20 3d    pFile->zPath =
24ae0 20 7a 4e 61 6d 65 3b 0a 23 69 66 20 53 51 4c 49   zName;.#if SQLI
24af0 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
24b00 3e 30 0a 20 20 70 46 69 6c 65 2d 3e 68 4d 61 70  >0.  pFile->hMap
24b10 20 3d 20 4e 55 4c 4c 3b 0a 20 20 70 46 69 6c 65   = NULL;.  pFile
24b20 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 3d 20 30  ->pMapRegion = 0
24b30 3b 0a 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53  ;.  pFile->mmapS
24b40 69 7a 65 20 3d 20 30 3b 0a 20 20 70 46 69 6c 65  ize = 0;.  pFile
24b50 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c  ->mmapSizeActual
24b60 20 3d 20 30 3b 0a 20 20 70 46 69 6c 65 2d 3e 6d   = 0;.  pFile->m
24b70 6d 61 70 53 69 7a 65 4d 61 78 20 3d 20 73 71 6c  mapSizeMax = sql
24b80 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
24b90 2e 73 7a 4d 6d 61 70 3b 0a 23 65 6e 64 69 66 0a  .szMmap;.#endif.
24ba0 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2b  .  OpenCounter(+
24bb0 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  1);.  return rc;
24bc0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
24bd0 20 74 68 65 20 6e 61 6d 65 64 20 66 69 6c 65 2e   the named file.
24be0 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
24bf0 20 57 69 6e 64 6f 77 73 20 64 6f 65 73 20 6e 6f   Windows does no
24c00 74 20 61 6c 6c 6f 77 20 61 20 66 69 6c 65 20 74  t allow a file t
24c10 6f 20 62 65 20 64 65 6c 65 74 65 64 20 69 66 20  o be deleted if 
24c20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 70 72  some other.** pr
24c30 6f 63 65 73 73 20 68 61 73 20 69 74 20 6f 70 65  ocess has it ope
24c40 6e 2e 20 20 53 6f 6d 65 74 69 6d 65 73 20 61 20  n.  Sometimes a 
24c50 76 69 72 75 73 20 73 63 61 6e 6e 65 72 20 6f 72  virus scanner or
24c60 20 69 6e 64 65 78 69 6e 67 20 70 72 6f 67 72 61   indexing progra
24c70 6d 0a 2a 2a 20 77 69 6c 6c 20 6f 70 65 6e 20 61  m.** will open a
24c80 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 68   journal file sh
24c90 6f 72 74 6c 79 20 61 66 74 65 72 20 69 74 20 69  ortly after it i
24ca0 73 20 63 72 65 61 74 65 64 20 69 6e 20 6f 72 64  s created in ord
24cb0 65 72 20 74 6f 20 64 6f 0a 2a 2a 20 77 68 61 74  er to do.** what
24cc0 65 76 65 72 20 69 74 20 64 6f 65 73 2e 20 20 57  ever it does.  W
24cd0 68 69 6c 65 20 74 68 69 73 20 6f 74 68 65 72 20  hile this other 
24ce0 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69  process is holdi
24cf0 6e 67 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 6f  ng the.** file o
24d00 70 65 6e 2c 20 77 65 20 77 69 6c 6c 20 62 65 20  pen, we will be 
24d10 75 6e 61 62 6c 65 20 74 6f 20 64 65 6c 65 74 65  unable to delete
24d20 20 69 74 2e 20 20 54 6f 20 77 6f 72 6b 20 61 72   it.  To work ar
24d30 6f 75 6e 64 20 74 68 69 73 0a 2a 2a 20 70 72 6f  ound this.** pro
24d40 62 6c 65 6d 2c 20 77 65 20 64 65 6c 61 79 20 31  blem, we delay 1
24d50 30 30 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20  00 milliseconds 
24d60 61 6e 64 20 74 72 79 20 74 6f 20 64 65 6c 65 74  and try to delet
24d70 65 20 61 67 61 69 6e 2e 20 20 55 70 0a 2a 2a 20  e again.  Up.** 
24d80 74 6f 20 4d 58 5f 44 45 4c 45 54 49 4f 4e 5f 41  to MX_DELETION_A
24d90 54 54 45 4d 50 54 73 20 64 65 6c 65 74 69 6f 6e  TTEMPTs deletion
24da0 20 61 74 74 65 6d 70 74 73 20 61 72 65 20 72 75   attempts are ru
24db0 6e 20 62 65 66 6f 72 65 20 67 69 76 69 6e 67 0a  n before giving.
24dc0 2a 2a 20 75 70 20 61 6e 64 20 72 65 74 75 72 6e  ** up and return
24dd0 69 6e 67 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f  ing an error..*/
24de0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 44  .static int winD
24df0 65 6c 65 74 65 28 0a 20 20 73 71 6c 69 74 65 33  elete(.  sqlite3
24e00 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20  _vfs *pVfs,     
24e10 20 20 20 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64       /* Not used
24e20 20 6f 6e 20 77 69 6e 33 32 20 2a 2f 0a 20 20 63   on win32 */.  c
24e30 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
24e40 6e 61 6d 65 2c 20 20 20 20 20 20 2f 2a 20 4e 61  name,      /* Na
24e50 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 64 65  me of file to de
24e60 6c 65 74 65 20 2a 2f 0a 20 20 69 6e 74 20 73 79  lete */.  int sy
24e70 6e 63 44 69 72 20 20 20 20 20 20 20 20 20 20 20  ncDir           
24e80 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 75 73 65        /* Not use
24e90 64 20 6f 6e 20 77 69 6e 33 32 20 2a 2f 0a 29 7b  d on win32 */.){
24ea0 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a  .  int cnt = 0;.
24eb0 20 20 69 6e 74 20 72 63 3b 0a 20 20 44 57 4f 52    int rc;.  DWOR
24ec0 44 20 61 74 74 72 3b 0a 20 20 44 57 4f 52 44 20  D attr;.  DWORD 
24ed0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 20  lastErrno = 0;. 
24ee0 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65   void *zConverte
24ef0 64 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  d;.  UNUSED_PARA
24f00 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 55  METER(pVfs);.  U
24f10 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
24f20 73 79 6e 63 44 69 72 29 3b 0a 0a 20 20 53 69 6d  syncDir);..  Sim
24f30 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74  ulateIOError(ret
24f40 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
24f50 5f 44 45 4c 45 54 45 29 3b 0a 20 20 4f 53 54 52  _DELETE);.  OSTR
24f60 41 43 45 28 28 22 44 45 4c 45 54 45 20 6e 61 6d  ACE(("DELETE nam
24f70 65 3d 25 73 2c 20 73 79 6e 63 44 69 72 3d 25 64  e=%s, syncDir=%d
24f80 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20  \n", zFilename, 
24f90 73 79 6e 63 44 69 72 29 29 3b 0a 0a 20 20 7a 43  syncDir));..  zC
24fa0 6f 6e 76 65 72 74 65 64 20 3d 20 77 69 6e 43 6f  onverted = winCo
24fb0 6e 76 65 72 74 46 72 6f 6d 55 74 66 38 46 69 6c  nvertFromUtf8Fil
24fc0 65 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29  ename(zFilename)
24fd0 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74  ;.  if( zConvert
24fe0 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 4f 53 54  ed==0 ){.    OST
24ff0 52 41 43 45 28 28 22 44 45 4c 45 54 45 20 6e 61  RACE(("DELETE na
25000 6d 65 3d 25 73 2c 20 72 63 3d 53 51 4c 49 54 45  me=%s, rc=SQLITE
25010 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 2c  _IOERR_NOMEM\n",
25020 20 7a 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20   zFilename));.  
25030 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
25040 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  IOERR_NOMEM;.  }
25050 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20  .  if( osIsNT() 
25060 29 7b 0a 20 20 20 20 64 6f 20 7b 0a 23 69 66 20  ){.    do {.#if 
25070 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
25080 20 20 20 20 20 20 57 49 4e 33 32 5f 46 49 4c 45        WIN32_FILE
25090 5f 41 54 54 52 49 42 55 54 45 5f 44 41 54 41 20  _ATTRIBUTE_DATA 
250a0 73 41 74 74 72 44 61 74 61 3b 0a 20 20 20 20 20  sAttrData;.     
250b0 20 6d 65 6d 73 65 74 28 26 73 41 74 74 72 44 61   memset(&sAttrDa
250c0 74 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 41  ta, 0, sizeof(sA
250d0 74 74 72 44 61 74 61 29 29 3b 0a 20 20 20 20 20  ttrData));.     
250e0 20 69 66 20 28 20 6f 73 47 65 74 46 69 6c 65 41   if ( osGetFileA
250f0 74 74 72 69 62 75 74 65 73 45 78 57 28 7a 43 6f  ttributesExW(zCo
25100 6e 76 65 72 74 65 64 2c 20 47 65 74 46 69 6c 65  nverted, GetFile
25110 45 78 49 6e 66 6f 53 74 61 6e 64 61 72 64 2c 0a  ExInfoStandard,.
25120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25140 20 20 26 73 41 74 74 72 44 61 74 61 29 20 29 7b    &sAttrData) ){
25150 0a 20 20 20 20 20 20 20 20 61 74 74 72 20 3d 20  .        attr = 
25160 73 41 74 74 72 44 61 74 61 2e 64 77 46 69 6c 65  sAttrData.dwFile
25170 41 74 74 72 69 62 75 74 65 73 3b 0a 20 20 20 20  Attributes;.    
25180 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
25190 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47   lastErrno = osG
251a0 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
251b0 20 20 20 20 20 20 20 69 66 28 20 6c 61 73 74 45         if( lastE
251c0 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 46 49 4c 45  rrno==ERROR_FILE
251d0 5f 4e 4f 54 5f 46 4f 55 4e 44 0a 20 20 20 20 20  _NOT_FOUND.     
251e0 20 20 20 20 7c 7c 20 6c 61 73 74 45 72 72 6e 6f      || lastErrno
251f0 3d 3d 45 52 52 4f 52 5f 50 41 54 48 5f 4e 4f 54  ==ERROR_PATH_NOT
25200 5f 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20 20 20  _FOUND ){.      
25210 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
25220 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45  IOERR_DELETE_NOE
25230 4e 54 3b 20 2f 2a 20 41 6c 72 65 61 64 79 20 67  NT; /* Already g
25240 6f 6e 65 3f 20 2a 2f 0a 20 20 20 20 20 20 20 20  one? */.        
25250 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
25260 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
25270 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  OR;.        }.  
25280 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
25290 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 20     }.#else.     
252a0 20 61 74 74 72 20 3d 20 6f 73 47 65 74 46 69 6c   attr = osGetFil
252b0 65 41 74 74 72 69 62 75 74 65 73 57 28 7a 43 6f  eAttributesW(zCo
252c0 6e 76 65 72 74 65 64 29 3b 0a 23 65 6e 64 69 66  nverted);.#endif
252d0 0a 20 20 20 20 20 20 69 66 20 28 20 61 74 74 72  .      if ( attr
252e0 3d 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41  ==INVALID_FILE_A
252f0 54 54 52 49 42 55 54 45 53 20 29 7b 0a 20 20 20  TTRIBUTES ){.   
25300 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d       lastErrno =
25310 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
25320 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c  );.        if( l
25330 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f  astErrno==ERROR_
25340 46 49 4c 45 5f 4e 4f 54 5f 46 4f 55 4e 44 0a 20  FILE_NOT_FOUND. 
25350 20 20 20 20 20 20 20 20 7c 7c 20 6c 61 73 74 45          || lastE
25360 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 50 41 54 48  rrno==ERROR_PATH
25370 5f 4e 4f 54 5f 46 4f 55 4e 44 20 29 7b 0a 20 20  _NOT_FOUND ){.  
25380 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
25390 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45  ITE_IOERR_DELETE
253a0 5f 4e 4f 45 4e 54 3b 20 2f 2a 20 41 6c 72 65 61  _NOENT; /* Alrea
253b0 64 79 20 67 6f 6e 65 3f 20 2a 2f 0a 20 20 20 20  dy gone? */.    
253c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
253d0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
253e0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
253f0 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  }.        break;
25400 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
25410 66 20 28 20 61 74 74 72 26 46 49 4c 45 5f 41 54  f ( attr&FILE_AT
25420 54 52 49 42 55 54 45 5f 44 49 52 45 43 54 4f 52  TRIBUTE_DIRECTOR
25430 59 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  Y ){.        rc 
25440 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20  = SQLITE_ERROR; 
25450 2f 2a 20 46 69 6c 65 73 20 6f 6e 6c 79 2e 20 2a  /* Files only. *
25460 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  /.        break;
25470 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
25480 66 20 28 20 6f 73 44 65 6c 65 74 65 46 69 6c 65  f ( osDeleteFile
25490 57 28 7a 43 6f 6e 76 65 72 74 65 64 29 20 29 7b  W(zConverted) ){
254a0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
254b0 4c 49 54 45 5f 4f 4b 3b 20 2f 2a 20 44 65 6c 65  LITE_OK; /* Dele
254c0 74 65 64 20 4f 4b 2e 20 2a 2f 0a 20 20 20 20 20  ted OK. */.     
254d0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
254e0 7d 0a 20 20 20 20 20 20 69 66 20 28 20 21 77 69  }.      if ( !wi
254f0 6e 52 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74  nRetryIoerr(&cnt
25500 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b  , &lastErrno) ){
25510 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
25520 4c 49 54 45 5f 45 52 52 4f 52 3b 20 2f 2a 20 4e  LITE_ERROR; /* N
25530 6f 20 6d 6f 72 65 20 72 65 74 72 69 65 73 2e 20  o more retries. 
25540 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  */.        break
25550 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20  ;.      }.    } 
25560 77 68 69 6c 65 28 31 29 3b 0a 20 20 7d 0a 23 69  while(1);.  }.#i
25570 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  fdef SQLITE_WIN3
25580 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73  2_HAS_ANSI.  els
25590 65 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20  e{.    do {.    
255a0 20 20 61 74 74 72 20 3d 20 6f 73 47 65 74 46 69    attr = osGetFi
255b0 6c 65 41 74 74 72 69 62 75 74 65 73 41 28 7a 43  leAttributesA(zC
255c0 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20  onverted);.     
255d0 20 69 66 20 28 20 61 74 74 72 3d 3d 49 4e 56 41   if ( attr==INVA
255e0 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55  LID_FILE_ATTRIBU
255f0 54 45 53 20 29 7b 0a 20 20 20 20 20 20 20 20 6c  TES ){.        l
25600 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
25610 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
25620 20 20 20 20 20 69 66 28 20 6c 61 73 74 45 72 72       if( lastErr
25630 6e 6f 3d 3d 45 52 52 4f 52 5f 46 49 4c 45 5f 4e  no==ERROR_FILE_N
25640 4f 54 5f 46 4f 55 4e 44 0a 20 20 20 20 20 20 20  OT_FOUND.       
25650 20 20 7c 7c 20 6c 61 73 74 45 72 72 6e 6f 3d 3d    || lastErrno==
25660 45 52 52 4f 52 5f 50 41 54 48 5f 4e 4f 54 5f 46  ERROR_PATH_NOT_F
25670 4f 55 4e 44 20 29 7b 0a 20 20 20 20 20 20 20 20  OUND ){.        
25680 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
25690 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54  ERR_DELETE_NOENT
256a0 3b 20 2f 2a 20 41 6c 72 65 61 64 79 20 67 6f 6e  ; /* Already gon
256b0 65 3f 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65  e? */.        }e
256c0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72  lse{.          r
256d0 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
256e0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
256f0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
25700 20 7d 0a 20 20 20 20 20 20 69 66 20 28 20 61 74   }.      if ( at
25710 74 72 26 46 49 4c 45 5f 41 54 54 52 49 42 55 54  tr&FILE_ATTRIBUT
25720 45 5f 44 49 52 45 43 54 4f 52 59 20 29 7b 0a 20  E_DIRECTORY ){. 
25730 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
25740 54 45 5f 45 52 52 4f 52 3b 20 2f 2a 20 46 69 6c  TE_ERROR; /* Fil
25750 65 73 20 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20  es only. */.    
25760 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
25770 20 7d 0a 20 20 20 20 20 20 69 66 20 28 20 6f 73   }.      if ( os
25780 44 65 6c 65 74 65 46 69 6c 65 41 28 7a 43 6f 6e  DeleteFileA(zCon
25790 76 65 72 74 65 64 29 20 29 7b 0a 20 20 20 20 20  verted) ){.     
257a0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
257b0 4b 3b 20 2f 2a 20 44 65 6c 65 74 65 64 20 4f 4b  K; /* Deleted OK
257c0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65  . */.        bre
257d0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
257e0 20 20 69 66 20 28 20 21 77 69 6e 52 65 74 72 79    if ( !winRetry
257f0 49 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c 61 73  Ioerr(&cnt, &las
25800 74 45 72 72 6e 6f 29 20 29 7b 0a 20 20 20 20 20  tErrno) ){.     
25810 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
25820 52 52 4f 52 3b 20 2f 2a 20 4e 6f 20 6d 6f 72 65  RROR; /* No more
25830 20 72 65 74 72 69 65 73 2e 20 2a 2f 0a 20 20 20   retries. */.   
25840 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
25850 20 20 7d 0a 20 20 20 20 7d 20 77 68 69 6c 65 28    }.    } while(
25860 31 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  1);.  }.#endif. 
25870 20 69 66 28 20 72 63 20 26 26 20 72 63 21 3d 53   if( rc && rc!=S
25880 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45  QLITE_IOERR_DELE
25890 54 45 5f 4e 4f 45 4e 54 20 29 7b 0a 20 20 20 20  TE_NOENT ){.    
258a0 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72  rc = winLogError
258b0 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45  (SQLITE_IOERR_DE
258c0 4c 45 54 45 2c 20 6c 61 73 74 45 72 72 6e 6f 2c  LETE, lastErrno,
258d0 20 22 77 69 6e 44 65 6c 65 74 65 22 2c 20 7a 46   "winDelete", zF
258e0 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73  ilename);.  }els
258f0 65 7b 0a 20 20 20 20 77 69 6e 4c 6f 67 49 6f 65  e{.    winLogIoe
25900 72 72 28 63 6e 74 29 3b 0a 20 20 7d 0a 20 20 73  rr(cnt);.  }.  s
25910 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e  qlite3_free(zCon
25920 76 65 72 74 65 64 29 3b 0a 20 20 4f 53 54 52 41  verted);.  OSTRA
25930 43 45 28 28 22 44 45 4c 45 54 45 20 6e 61 6d 65  CE(("DELETE name
25940 3d 25 73 2c 20 72 63 3d 25 73 5c 6e 22 2c 20 7a  =%s, rc=%s\n", z
25950 46 69 6c 65 6e 61 6d 65 2c 20 73 71 6c 69 74 65  Filename, sqlite
25960 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a  3ErrName(rc)));.
25970 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
25980 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68 65 20  /*.** Check the 
25990 65 78 69 73 74 65 6e 63 65 20 61 6e 64 20 73 74  existence and st
259a0 61 74 75 73 20 6f 66 20 61 20 66 69 6c 65 2e 0a  atus of a file..
259b0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
259c0 6e 41 63 63 65 73 73 28 0a 20 20 73 71 6c 69 74  nAccess(.  sqlit
259d0 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20  e3_vfs *pVfs,   
259e0 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 75 73 65        /* Not use
259f0 64 20 6f 6e 20 77 69 6e 33 32 20 2a 2f 0a 20 20  d on win32 */.  
25a00 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
25a10 65 6e 61 6d 65 2c 20 20 20 20 20 2f 2a 20 4e 61  ename,     /* Na
25a20 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 63 68  me of file to ch
25a30 65 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  eck */.  int fla
25a40 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gs,             
25a50 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 74      /* Type of t
25a60 65 73 74 20 74 6f 20 6d 61 6b 65 20 6f 6e 20 74  est to make on t
25a70 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  his file */.  in
25a80 74 20 2a 70 52 65 73 4f 75 74 20 20 20 20 20 20  t *pResOut      
25a90 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
25aa0 20 52 65 73 75 6c 74 20 2a 2f 0a 29 7b 0a 20 20   Result */.){.  
25ab0 44 57 4f 52 44 20 61 74 74 72 3b 0a 20 20 69 6e  DWORD attr;.  in
25ac0 74 20 72 63 20 3d 20 30 3b 0a 20 20 44 57 4f 52  t rc = 0;.  DWOR
25ad0 44 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b  D lastErrno = 0;
25ae0 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72  .  void *zConver
25af0 74 65 64 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  ted;.  UNUSED_PA
25b00 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 0a  RAMETER(pVfs);..
25b10 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
25b20 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
25b30 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 3b 20 29  _IOERR_ACCESS; )
25b40 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 41 43  ;.  OSTRACE(("AC
25b50 43 45 53 53 20 6e 61 6d 65 3d 25 73 2c 20 66 6c  CESS name=%s, fl
25b60 61 67 73 3d 25 78 2c 20 70 52 65 73 4f 75 74 3d  ags=%x, pResOut=
25b70 25 70 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %p\n",.         
25b80 20 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 66 6c 61    zFilename, fla
25b90 67 73 2c 20 70 52 65 73 4f 75 74 29 29 3b 0a 0a  gs, pResOut));..
25ba0 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77    zConverted = w
25bb0 69 6e 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66  inConvertFromUtf
25bc0 38 46 69 6c 65 6e 61 6d 65 28 7a 46 69 6c 65 6e  8Filename(zFilen
25bd0 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e  ame);.  if( zCon
25be0 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20  verted==0 ){.   
25bf0 20 4f 53 54 52 41 43 45 28 28 22 41 43 43 45 53   OSTRACE(("ACCES
25c00 53 20 6e 61 6d 65 3d 25 73 2c 20 72 63 3d 53 51  S name=%s, rc=SQ
25c10 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
25c20 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 29  \n", zFilename))
25c30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
25c40 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b  ITE_IOERR_NOMEM;
25c50 0a 20 20 7d 0a 20 20 69 66 28 20 6f 73 49 73 4e  .  }.  if( osIsN
25c60 54 28 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 63  T() ){.    int c
25c70 6e 74 20 3d 20 30 3b 0a 20 20 20 20 57 49 4e 33  nt = 0;.    WIN3
25c80 32 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  2_FILE_ATTRIBUTE
25c90 5f 44 41 54 41 20 73 41 74 74 72 44 61 74 61 3b  _DATA sAttrData;
25ca0 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 41 74  .    memset(&sAt
25cb0 74 72 44 61 74 61 2c 20 30 2c 20 73 69 7a 65 6f  trData, 0, sizeo
25cc0 66 28 73 41 74 74 72 44 61 74 61 29 29 3b 0a 20  f(sAttrData));. 
25cd0 20 20 20 77 68 69 6c 65 28 20 21 28 72 63 20 3d     while( !(rc =
25ce0 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62   osGetFileAttrib
25cf0 75 74 65 73 45 78 57 28 28 4c 50 43 57 53 54 52  utesExW((LPCWSTR
25d00 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20  )zConverted,.   
25d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25d20 20 20 20 20 20 20 20 20 20 20 47 65 74 46 69 6c            GetFil
25d30 65 45 78 49 6e 66 6f 53 74 61 6e 64 61 72 64 2c  eExInfoStandard,
25d40 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
25d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
25d60 73 41 74 74 72 44 61 74 61 29 29 20 26 26 20 77  sAttrData)) && w
25d70 69 6e 52 65 74 72 79 49 6f 65 72 72 28 26 63 6e  inRetryIoerr(&cn
25d80 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29  t, &lastErrno) )
25d90 7b 7d 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  {}.    if( rc ){
25da0 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 61 6e  .      /* For an
25db0 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
25dc0 58 49 53 54 53 20 71 75 65 72 79 2c 20 74 72 65  XISTS query, tre
25dd0 61 74 20 61 20 7a 65 72 6f 2d 6c 65 6e 67 74 68  at a zero-length
25de0 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 61   file.      ** a
25df0 73 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74  s if it does not
25e00 20 65 78 69 73 74 2e 0a 20 20 20 20 20 20 2a 2f   exist..      */
25e10 0a 20 20 20 20 20 20 69 66 28 20 20 20 20 66 6c  .      if(    fl
25e20 61 67 73 3d 3d 53 51 4c 49 54 45 5f 41 43 43 45  ags==SQLITE_ACCE
25e30 53 53 5f 45 58 49 53 54 53 0a 20 20 20 20 20 20  SS_EXISTS.      
25e40 20 20 20 20 26 26 20 73 41 74 74 72 44 61 74 61      && sAttrData
25e50 2e 6e 46 69 6c 65 53 69 7a 65 48 69 67 68 3d 3d  .nFileSizeHigh==
25e60 30 20 0a 20 20 20 20 20 20 20 20 20 20 26 26 20  0 .          && 
25e70 73 41 74 74 72 44 61 74 61 2e 6e 46 69 6c 65 53  sAttrData.nFileS
25e80 69 7a 65 4c 6f 77 3d 3d 30 20 29 7b 0a 20 20 20  izeLow==0 ){.   
25e90 20 20 20 20 20 61 74 74 72 20 3d 20 49 4e 56 41       attr = INVA
25ea0 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55  LID_FILE_ATTRIBU
25eb0 54 45 53 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  TES;.      }else
25ec0 7b 0a 20 20 20 20 20 20 20 20 61 74 74 72 20 3d  {.        attr =
25ed0 20 73 41 74 74 72 44 61 74 61 2e 64 77 46 69 6c   sAttrData.dwFil
25ee0 65 41 74 74 72 69 62 75 74 65 73 3b 0a 20 20 20  eAttributes;.   
25ef0 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
25f00 20 20 20 20 20 20 77 69 6e 4c 6f 67 49 6f 65 72        winLogIoer
25f10 72 28 63 6e 74 29 3b 0a 20 20 20 20 20 20 69 66  r(cnt);.      if
25f20 28 20 6c 61 73 74 45 72 72 6e 6f 21 3d 45 52 52  ( lastErrno!=ERR
25f30 4f 52 5f 46 49 4c 45 5f 4e 4f 54 5f 46 4f 55 4e  OR_FILE_NOT_FOUN
25f40 44 20 26 26 20 6c 61 73 74 45 72 72 6e 6f 21 3d  D && lastErrno!=
25f50 45 52 52 4f 52 5f 50 41 54 48 5f 4e 4f 54 5f 46  ERROR_PATH_NOT_F
25f60 4f 55 4e 44 20 29 7b 0a 20 20 20 20 20 20 20 20  OUND ){.        
25f70 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
25f80 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20  nverted);.      
25f90 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45    return winLogE
25fa0 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
25fb0 52 5f 41 43 43 45 53 53 2c 20 6c 61 73 74 45 72  R_ACCESS, lastEr
25fc0 72 6e 6f 2c 20 22 77 69 6e 41 63 63 65 73 73 22  rno, "winAccess"
25fd0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
25fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 46 69               zFi
25ff0 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d  lename);.      }
26000 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 74  else{.        at
26010 74 72 20 3d 20 49 4e 56 41 4c 49 44 5f 46 49 4c  tr = INVALID_FIL
26020 45 5f 41 54 54 52 49 42 55 54 45 53 3b 0a 20 20  E_ATTRIBUTES;.  
26030 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
26040 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49  #ifdef SQLITE_WI
26050 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65  N32_HAS_ANSI.  e
26060 6c 73 65 7b 0a 20 20 20 20 61 74 74 72 20 3d 20  lse{.    attr = 
26070 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75  osGetFileAttribu
26080 74 65 73 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e  tesA((char*)zCon
26090 76 65 72 74 65 64 29 3b 0a 20 20 7d 0a 23 65 6e  verted);.  }.#en
260a0 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  dif.  sqlite3_fr
260b0 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
260c0 20 20 73 77 69 74 63 68 28 20 66 6c 61 67 73 20    switch( flags 
260d0 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  ){.    case SQLI
260e0 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 3a 0a  TE_ACCESS_READ:.
260f0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
26100 41 43 43 45 53 53 5f 45 58 49 53 54 53 3a 0a 20  ACCESS_EXISTS:. 
26110 20 20 20 20 20 72 63 20 3d 20 61 74 74 72 21 3d       rc = attr!=
26120 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54  INVALID_FILE_ATT
26130 52 49 42 55 54 45 53 3b 0a 20 20 20 20 20 20 62  RIBUTES;.      b
26140 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
26150 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41  QLITE_ACCESS_REA
26160 44 57 52 49 54 45 3a 0a 20 20 20 20 20 20 72 63  DWRITE:.      rc
26170 20 3d 20 61 74 74 72 21 3d 49 4e 56 41 4c 49 44   = attr!=INVALID
26180 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53  _FILE_ATTRIBUTES
26190 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20   &&.            
261a0 20 28 61 74 74 72 20 26 20 46 49 4c 45 5f 41 54   (attr & FILE_AT
261b0 54 52 49 42 55 54 45 5f 52 45 41 44 4f 4e 4c 59  TRIBUTE_READONLY
261c0 29 3d 3d 30 3b 0a 20 20 20 20 20 20 62 72 65 61  )==0;.      brea
261d0 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  k;.    default:.
261e0 20 20 20 20 20 20 61 73 73 65 72 74 28 21 22 49        assert(!"I
261f0 6e 76 61 6c 69 64 20 66 6c 61 67 73 20 61 72 67  nvalid flags arg
26200 75 6d 65 6e 74 22 29 3b 0a 20 20 7d 0a 20 20 2a  ument");.  }.  *
26210 70 52 65 73 4f 75 74 20 3d 20 72 63 3b 0a 20 20  pResOut = rc;.  
26220 4f 53 54 52 41 43 45 28 28 22 41 43 43 45 53 53  OSTRACE(("ACCESS
26230 20 6e 61 6d 65 3d 25 73 2c 20 70 52 65 73 4f 75   name=%s, pResOu
26240 74 3d 25 70 2c 20 2a 70 52 65 73 4f 75 74 3d 25  t=%p, *pResOut=%
26250 64 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c  d, rc=SQLITE_OK\
26260 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 7a  n",.           z
26270 46 69 6c 65 6e 61 6d 65 2c 20 70 52 65 73 4f 75  Filename, pResOu
26280 74 2c 20 2a 70 52 65 73 4f 75 74 29 29 3b 0a 20  t, *pResOut));. 
26290 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
262a0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  K;.}../*.** Retu
262b0 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20  rns non-zero if 
262c0 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70 61  the specified pa
262d0 74 68 20 6e 61 6d 65 20 73 74 61 72 74 73 20 77  th name starts w
262e0 69 74 68 20 61 20 64 72 69 76 65 20 6c 65 74 74  ith a drive lett
262f0 65 72 0a 2a 2a 20 66 6f 6c 6c 6f 77 65 64 20 62  er.** followed b
26300 79 20 61 20 63 6f 6c 6f 6e 20 63 68 61 72 61 63  y a colon charac
26310 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42  ter..*/.static B
26320 4f 4f 4c 20 77 69 6e 49 73 44 72 69 76 65 4c 65  OOL winIsDriveLe
26330 74 74 65 72 41 6e 64 43 6f 6c 6f 6e 28 0a 20 20  tterAndColon(.  
26340 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
26350 68 6e 61 6d 65 0a 29 7b 0a 20 20 72 65 74 75 72  hname.){.  retur
26360 6e 20 28 20 73 71 6c 69 74 65 33 49 73 61 6c 70  n ( sqlite3Isalp
26370 68 61 28 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 29  ha(zPathname[0])
26380 20 26 26 20 7a 50 61 74 68 6e 61 6d 65 5b 31 5d   && zPathname[1]
26390 3d 3d 27 3a 27 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ==':' );.}../*.*
263a0 2a 20 52 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65  * Returns non-ze
263b0 72 6f 20 69 66 20 74 68 65 20 73 70 65 63 69 66  ro if the specif
263c0 69 65 64 20 70 61 74 68 20 6e 61 6d 65 20 73 68  ied path name sh
263d0 6f 75 6c 64 20 62 65 20 75 73 65 64 20 76 65 72  ould be used ver
263e0 62 61 74 69 6d 2e 20 20 49 66 0a 2a 2a 20 6e 6f  batim.  If.** no
263f0 6e 2d 7a 65 72 6f 20 69 73 20 72 65 74 75 72 6e  n-zero is return
26400 65 64 20 66 72 6f 6d 20 74 68 69 73 20 66 75 6e  ed from this fun
26410 63 74 69 6f 6e 2c 20 74 68 65 20 63 61 6c 6c 69  ction, the calli
26420 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74  ng function must
26430 20 73 69 6d 70 6c 79 0a 2a 2a 20 75 73 65 20 74   simply.** use t
26440 68 65 20 70 72 6f 76 69 64 65 64 20 70 61 74 68  he provided path
26450 20 6e 61 6d 65 20 76 65 72 62 61 74 69 6d 20 2d   name verbatim -
26460 4f 52 2d 20 72 65 73 6f 6c 76 65 20 69 74 20 69  OR- resolve it i
26470 6e 74 6f 20 61 20 66 75 6c 6c 20 70 61 74 68 20  nto a full path 
26480 6e 61 6d 65 0a 2a 2a 20 75 73 69 6e 67 20 74 68  name.** using th
26490 65 20 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d  e GetFullPathNam
264a0 65 20 57 69 6e 33 32 20 41 50 49 20 66 75 6e 63  e Win32 API func
264b0 74 69 6f 6e 20 28 69 66 20 61 76 61 69 6c 61 62  tion (if availab
264c0 6c 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42  le)..*/.static B
264d0 4f 4f 4c 20 77 69 6e 49 73 56 65 72 62 61 74 69  OOL winIsVerbati
264e0 6d 50 61 74 68 6e 61 6d 65 28 0a 20 20 63 6f 6e  mPathname(.  con
264f0 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 6e 61  st char *zPathna
26500 6d 65 0a 29 7b 0a 20 20 2f 2a 0a 20 20 2a 2a 20  me.){.  /*.  ** 
26510 49 66 20 74 68 65 20 70 61 74 68 20 6e 61 6d 65  If the path name
26520 20 73 74 61 72 74 73 20 77 69 74 68 20 61 20 66   starts with a f
26530 6f 72 77 61 72 64 20 73 6c 61 73 68 20 6f 72 20  orward slash or 
26540 61 20 62 61 63 6b 73 6c 61 73 68 2c 20 69 74 20  a backslash, it 
26550 69 73 20 65 69 74 68 65 72 0a 20 20 2a 2a 20 61  is either.  ** a
26560 20 6c 65 67 61 6c 20 55 4e 43 20 6e 61 6d 65 2c   legal UNC name,
26570 20 61 20 76 6f 6c 75 6d 65 20 72 65 6c 61 74 69   a volume relati
26580 76 65 20 70 61 74 68 2c 20 6f 72 20 61 6e 20 61  ve path, or an a
26590 62 73 6f 6c 75 74 65 20 70 61 74 68 20 6e 61 6d  bsolute path nam
265a0 65 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 22 55  e in the.  ** "U
265b0 6e 69 78 22 20 66 6f 72 6d 61 74 20 6f 6e 20 57  nix" format on W
265c0 69 6e 64 6f 77 73 2e 20 20 54 68 65 72 65 20 69  indows.  There i
265d0 73 20 6e 6f 20 65 61 73 79 20 77 61 79 20 74 6f  s no easy way to
265e0 20 64 69 66 66 65 72 65 6e 74 69 61 74 65 20 62   differentiate b
265f0 65 74 77 65 65 6e 0a 20 20 2a 2a 20 74 68 65 20  etween.  ** the 
26600 66 69 6e 61 6c 20 74 77 6f 20 63 61 73 65 73 3b  final two cases;
26610 20 74 68 65 72 65 66 6f 72 65 2c 20 77 65 20 72   therefore, we r
26620 65 74 75 72 6e 20 74 68 65 20 73 61 66 65 72 20  eturn the safer 
26630 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20  return value of 
26640 54 52 55 45 0a 20 20 2a 2a 20 73 6f 20 74 68 61  TRUE.  ** so tha
26650 74 20 63 61 6c 6c 65 72 73 20 6f 66 20 74 68 69  t callers of thi
26660 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20  s function will 
26670 73 69 6d 70 6c 79 20 75 73 65 20 69 74 20 76 65  simply use it ve
26680 72 62 61 74 69 6d 2e 0a 20 20 2a 2f 0a 20 20 69  rbatim..  */.  i
26690 66 20 28 20 77 69 6e 49 73 44 69 72 53 65 70 28  f ( winIsDirSep(
266a0 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 29 20 29 7b  zPathname[0]) ){
266b0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 52 55 45  .    return TRUE
266c0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
266d0 20 49 66 20 74 68 65 20 70 61 74 68 20 6e 61 6d   If the path nam
266e0 65 20 73 74 61 72 74 73 20 77 69 74 68 20 61 20  e starts with a 
266f0 6c 65 74 74 65 72 20 61 6e 64 20 61 20 63 6f 6c  letter and a col
26700 6f 6e 20 69 74 20 69 73 20 65 69 74 68 65 72 20  on it is either 
26710 61 20 76 6f 6c 75 6d 65 0a 20 20 2a 2a 20 72 65  a volume.  ** re
26720 6c 61 74 69 76 65 20 70 61 74 68 20 6f 72 20 61  lative path or a
26730 6e 20 61 62 73 6f 6c 75 74 65 20 70 61 74 68 2e  n absolute path.
26740 20 20 43 61 6c 6c 65 72 73 20 6f 66 20 74 68 69    Callers of thi
26750 73 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20  s function must 
26760 6e 6f 74 0a 20 20 2a 2a 20 61 74 74 65 6d 70 74  not.  ** attempt
26770 20 74 6f 20 74 72 65 61 74 20 69 74 20 61 73 20   to treat it as 
26780 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 20  a relative path 
26790 6e 61 6d 65 20 28 69 2e 65 2e 20 74 68 65 79 20  name (i.e. they 
267a0 73 68 6f 75 6c 64 20 73 69 6d 70 6c 79 20 75 73  should simply us
267b0 65 0a 20 20 2a 2a 20 69 74 20 76 65 72 62 61 74  e.  ** it verbat
267c0 69 6d 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 20 28  im)..  */.  if (
267d0 20 77 69 6e 49 73 44 72 69 76 65 4c 65 74 74 65   winIsDriveLette
267e0 72 41 6e 64 43 6f 6c 6f 6e 28 7a 50 61 74 68 6e  rAndColon(zPathn
267f0 61 6d 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ame) ){.    retu
26800 72 6e 20 54 52 55 45 3b 0a 20 20 7d 0a 0a 20 20  rn TRUE;.  }..  
26810 2f 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 67 65  /*.  ** If we ge
26820 74 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c  t to this point,
26830 20 74 68 65 20 70 61 74 68 20 6e 61 6d 65 20 73   the path name s
26840 68 6f 75 6c 64 20 61 6c 6d 6f 73 74 20 63 65 72  hould almost cer
26850 74 61 69 6e 6c 79 20 62 65 20 61 20 70 75 72 65  tainly be a pure
26860 6c 79 0a 20 20 2a 2a 20 72 65 6c 61 74 69 76 65  ly.  ** relative
26870 20 6f 6e 65 20 28 69 2e 65 2e 20 6e 6f 74 20 61   one (i.e. not a
26880 20 55 4e 43 20 6e 61 6d 65 2c 20 6e 6f 74 20 61   UNC name, not a
26890 62 73 6f 6c 75 74 65 2c 20 61 6e 64 20 6e 6f 74  bsolute, and not
268a0 20 76 6f 6c 75 6d 65 20 72 65 6c 61 74 69 76 65   volume relative
268b0 29 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e  )..  */.  return
268c0 20 46 41 4c 53 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   FALSE;.}../*.**
268d0 20 54 75 72 6e 20 61 20 72 65 6c 61 74 69 76 65   Turn a relative
268e0 20 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f 20 61   pathname into a
268f0 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 2e 20   full pathname. 
26900 20 57 72 69 74 65 20 74 68 65 20 66 75 6c 6c 0a   Write the full.
26910 2a 2a 20 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f  ** pathname into
26920 20 7a 4f 75 74 5b 5d 2e 20 20 7a 4f 75 74 5b 5d   zOut[].  zOut[]
26930 20 77 69 6c 6c 20 62 65 20 61 74 20 6c 65 61 73   will be at leas
26940 74 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  t pVfs->mxPathna
26950 6d 65 0a 2a 2a 20 62 79 74 65 73 20 69 6e 20 73  me.** bytes in s
26960 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ize..*/.static i
26970 6e 74 20 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61  nt winFullPathna
26980 6d 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  me(.  sqlite3_vf
26990 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20  s *pVfs,        
269a0 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
269b0 6f 20 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a  o vfs object */.
269c0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52    const char *zR
269d0 65 6c 61 74 69 76 65 2c 20 20 20 20 20 20 20 20  elative,        
269e0 2f 2a 20 50 6f 73 73 69 62 6c 79 20 72 65 6c 61  /* Possibly rela
269f0 74 69 76 65 20 69 6e 70 75 74 20 70 61 74 68 20  tive input path 
26a00 2a 2f 0a 20 20 69 6e 74 20 6e 46 75 6c 6c 2c 20  */.  int nFull, 
26a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6f 75     /* Size of ou
26a30 74 70 75 74 20 62 75 66 66 65 72 20 69 6e 20 62  tput buffer in b
26a40 79 74 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ytes */.  char *
26a50 7a 46 75 6c 6c 20 20 20 20 20 20 20 20 20 20 20  zFull           
26a60 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75          /* Outpu
26a70 74 20 62 75 66 66 65 72 20 2a 2f 0a 29 7b 0a 20  t buffer */.){. 
26a80 20 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f   .#if defined(__
26a90 43 59 47 57 49 4e 5f 5f 29 0a 20 20 53 69 6d 75  CYGWIN__).  Simu
26aa0 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
26ab0 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
26ac0 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   );.  UNUSED_PAR
26ad0 41 4d 45 54 45 52 28 6e 46 75 6c 6c 29 3b 0a 20  AMETER(nFull);. 
26ae0 20 61 73 73 65 72 74 28 20 6e 46 75 6c 6c 3e 3d   assert( nFull>=
26af0 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
26b00 20 29 3b 0a 20 20 69 66 20 28 20 73 71 6c 69 74   );.  if ( sqlit
26b10 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72  e3_data_director
26b20 79 20 26 26 20 21 77 69 6e 49 73 56 65 72 62 61  y && !winIsVerba
26b30 74 69 6d 50 61 74 68 6e 61 6d 65 28 7a 52 65 6c  timPathname(zRel
26b40 61 74 69 76 65 29 20 29 7b 0a 20 20 20 20 2f 2a  ative) ){.    /*
26b50 0a 20 20 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 65  .    ** NOTE: We
26b60 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74   are dealing wit
26b70 68 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74  h a relative pat
26b80 68 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 64  h name and the d
26b90 61 74 61 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ata.    **      
26ba0 20 64 69 72 65 63 74 6f 72 79 20 68 61 73 20 62   directory has b
26bb0 65 65 6e 20 73 65 74 2e 20 20 54 68 65 72 65 66  een set.  Theref
26bc0 6f 72 65 2c 20 75 73 65 20 69 74 20 61 73 20 74  ore, use it as t
26bd0 68 65 20 62 61 73 69 73 0a 20 20 20 20 2a 2a 20  he basis.    ** 
26be0 20 20 20 20 20 20 66 6f 72 20 63 6f 6e 76 65 72        for conver
26bf0 74 69 6e 67 20 74 68 65 20 72 65 6c 61 74 69 76  ting the relativ
26c00 65 20 70 61 74 68 20 6e 61 6d 65 20 74 6f 20 61  e path name to a
26c10 6e 20 61 62 73 6f 6c 75 74 65 0a 20 20 20 20 2a  n absolute.    *
26c20 2a 20 20 20 20 20 20 20 6f 6e 65 20 62 79 20 70  *       one by p
26c30 72 65 70 65 6e 64 69 6e 67 20 74 68 65 20 64 61  repending the da
26c40 74 61 20 64 69 72 65 63 74 6f 72 79 20 61 6e 64  ta directory and
26c50 20 61 20 73 6c 61 73 68 2e 0a 20 20 20 20 2a 2f   a slash..    */
26c60 0a 20 20 20 20 63 68 61 72 20 2a 7a 4f 75 74 20  .    char *zOut 
26c70 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  = sqlite3MallocZ
26c80 65 72 6f 28 20 70 56 66 73 2d 3e 6d 78 50 61 74  ero( pVfs->mxPat
26c90 68 6e 61 6d 65 2b 31 20 29 3b 0a 20 20 20 20 69  hname+1 );.    i
26ca0 66 28 20 21 7a 4f 75 74 20 29 7b 0a 20 20 20 20  f( !zOut ){.    
26cb0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
26cc0 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  IOERR_NOMEM;.   
26cd0 20 7d 0a 20 20 20 20 69 66 28 20 63 79 67 77 69   }.    if( cygwi
26ce0 6e 5f 63 6f 6e 76 5f 70 61 74 68 28 43 43 50 5f  n_conv_path(CCP_
26cf0 50 4f 53 49 58 5f 54 4f 5f 57 49 4e 5f 41 7c 43  POSIX_TO_WIN_A|C
26d00 43 50 5f 52 45 4c 41 54 49 56 45 2c 20 7a 52 65  CP_RELATIVE, zRe
26d10 6c 61 74 69 76 65 2c 20 7a 4f 75 74 2c 0a 20 20  lative, zOut,.  
26d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d30 20 20 20 20 20 20 20 70 56 66 73 2d 3e 6d 78 50         pVfs->mxP
26d40 61 74 68 6e 61 6d 65 2b 31 29 3c 30 20 29 7b 0a  athname+1)<0 ){.
26d50 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
26d60 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20 20 20  ee(zOut);.      
26d70 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72  return winLogErr
26d80 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  or(SQLITE_CANTOP
26d90 45 4e 5f 43 4f 4e 56 50 41 54 48 2c 20 28 44 57  EN_CONVPATH, (DW
26da0 4f 52 44 29 65 72 72 6e 6f 2c 0a 20 20 20 20 20  ORD)errno,.     
26db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26dc0 20 20 20 20 22 77 69 6e 46 75 6c 6c 50 61 74 68      "winFullPath
26dd0 6e 61 6d 65 31 22 2c 20 7a 52 65 6c 61 74 69 76  name1", zRelativ
26de0 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  e);.    }.    sq
26df0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d  lite3_snprintf(M
26e00 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e  IN(nFull, pVfs->
26e10 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75  mxPathname), zFu
26e20 6c 6c 2c 20 22 25 73 25 63 25 73 22 2c 0a 20 20  ll, "%s%c%s",.  
26e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26e40 20 20 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f     sqlite3_data_
26e50 64 69 72 65 63 74 6f 72 79 2c 20 77 69 6e 47 65  directory, winGe
26e60 74 44 69 72 53 65 70 28 29 2c 20 7a 4f 75 74 29  tDirSep(), zOut)
26e70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
26e80 65 65 28 7a 4f 75 74 29 3b 0a 20 20 7d 65 6c 73  ee(zOut);.  }els
26e90 65 7b 0a 20 20 20 20 69 66 28 20 63 79 67 77 69  e{.    if( cygwi
26ea0 6e 5f 63 6f 6e 76 5f 70 61 74 68 28 43 43 50 5f  n_conv_path(CCP_
26eb0 50 4f 53 49 58 5f 54 4f 5f 57 49 4e 5f 41 2c 20  POSIX_TO_WIN_A, 
26ec0 7a 52 65 6c 61 74 69 76 65 2c 20 7a 46 75 6c 6c  zRelative, zFull
26ed0 2c 20 6e 46 75 6c 6c 29 3c 30 20 29 7b 0a 20 20  , nFull)<0 ){.  
26ee0 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f      return winLo
26ef0 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41  gError(SQLITE_CA
26f00 4e 54 4f 50 45 4e 5f 43 4f 4e 56 50 41 54 48 2c  NTOPEN_CONVPATH,
26f10 20 28 44 57 4f 52 44 29 65 72 72 6e 6f 2c 0a 20   (DWORD)errno,. 
26f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26f30 20 20 20 20 20 20 20 20 22 77 69 6e 46 75 6c 6c          "winFull
26f40 50 61 74 68 6e 61 6d 65 32 22 2c 20 7a 52 65 6c  Pathname2", zRel
26f50 61 74 69 76 65 29 3b 0a 20 20 20 20 7d 0a 20 20  ative);.    }.  
26f60 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
26f70 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 0a 23 69  E_OK;.#endif..#i
26f80 66 20 28 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f (SQLITE_OS_WIN
26f90 43 45 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f  CE || SQLITE_OS_
26fa0 57 49 4e 52 54 29 20 26 26 20 21 64 65 66 69 6e  WINRT) && !defin
26fb0 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20  ed(__CYGWIN__). 
26fc0 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
26fd0 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
26fe0 45 52 52 4f 52 20 29 3b 0a 20 20 2f 2a 20 57 69  ERROR );.  /* Wi
26ff0 6e 43 45 20 68 61 73 20 6e 6f 20 63 6f 6e 63 65  nCE has no conce
27000 70 74 20 6f 66 20 61 20 72 65 6c 61 74 69 76 65  pt of a relative
27010 20 70 61 74 68 6e 61 6d 65 2c 20 6f 72 20 73 6f   pathname, or so
27020 20 49 20 61 6d 20 74 6f 6c 64 2e 20 2a 2f 0a 20   I am told. */. 
27030 20 2f 2a 20 57 69 6e 52 54 20 68 61 73 20 6e 6f   /* WinRT has no
27040 20 77 61 79 20 74 6f 20 63 6f 6e 76 65 72 74 20   way to convert 
27050 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 20  a relative path 
27060 74 6f 20 61 6e 20 61 62 73 6f 6c 75 74 65 20 6f  to an absolute o
27070 6e 65 2e 20 2a 2f 0a 20 20 69 66 20 28 20 73 71  ne. */.  if ( sq
27080 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63  lite3_data_direc
27090 74 6f 72 79 20 26 26 20 21 77 69 6e 49 73 56 65  tory && !winIsVe
270a0 72 62 61 74 69 6d 50 61 74 68 6e 61 6d 65 28 7a  rbatimPathname(z
270b0 52 65 6c 61 74 69 76 65 29 20 29 7b 0a 20 20 20  Relative) ){.   
270c0 20 2f 2a 0a 20 20 20 20 2a 2a 20 4e 4f 54 45 3a   /*.    ** NOTE:
270d0 20 57 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20   We are dealing 
270e0 77 69 74 68 20 61 20 72 65 6c 61 74 69 76 65 20  with a relative 
270f0 70 61 74 68 20 6e 61 6d 65 20 61 6e 64 20 74 68  path name and th
27100 65 20 64 61 74 61 0a 20 20 20 20 2a 2a 20 20 20  e data.    **   
27110 20 20 20 20 64 69 72 65 63 74 6f 72 79 20 68 61      directory ha
27120 73 20 62 65 65 6e 20 73 65 74 2e 20 20 54 68 65  s been set.  The
27130 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74 20 61  refore, use it a
27140 73 20 74 68 65 20 62 61 73 69 73 0a 20 20 20 20  s the basis.    
27150 2a 2a 20 20 20 20 20 20 20 66 6f 72 20 63 6f 6e  **       for con
27160 76 65 72 74 69 6e 67 20 74 68 65 20 72 65 6c 61  verting the rela
27170 74 69 76 65 20 70 61 74 68 20 6e 61 6d 65 20 74  tive path name t
27180 6f 20 61 6e 20 61 62 73 6f 6c 75 74 65 0a 20 20  o an absolute.  
27190 20 20 2a 2a 20 20 20 20 20 20 20 6f 6e 65 20 62    **       one b
271a0 79 20 70 72 65 70 65 6e 64 69 6e 67 20 74 68 65  y prepending the
271b0 20 64 61 74 61 20 64 69 72 65 63 74 6f 72 79 20   data directory 
271c0 61 6e 64 20 61 20 62 61 63 6b 73 6c 61 73 68 2e  and a backslash.
271d0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
271e0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49 4e  te3_snprintf(MIN
271f0 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78  (nFull, pVfs->mx
27200 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c  Pathname), zFull
27210 2c 20 22 25 73 25 63 25 73 22 2c 0a 20 20 20 20  , "%s%c%s",.    
27220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27230 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69   sqlite3_data_di
27240 72 65 63 74 6f 72 79 2c 20 77 69 6e 47 65 74 44  rectory, winGetD
27250 69 72 53 65 70 28 29 2c 20 7a 52 65 6c 61 74 69  irSep(), zRelati
27260 76 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ve);.  }else{.  
27270 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
27280 74 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70 56  tf(MIN(nFull, pV
27290 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 29 2c  fs->mxPathname),
272a0 20 7a 46 75 6c 6c 2c 20 22 25 73 22 2c 20 7a 52   zFull, "%s", zR
272b0 65 6c 61 74 69 76 65 29 3b 0a 20 20 7d 0a 20 20  elative);.  }.  
272c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
272d0 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 53  ;.#endif..#if !S
272e0 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26  QLITE_OS_WINCE &
272f0 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  & !SQLITE_OS_WIN
27300 52 54 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f  RT && !defined(_
27310 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20 44 57 4f  _CYGWIN__).  DWO
27320 52 44 20 6e 42 79 74 65 3b 0a 20 20 76 6f 69 64  RD nByte;.  void
27330 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20   *zConverted;.  
27340 63 68 61 72 20 2a 7a 4f 75 74 3b 0a 0a 20 20 2f  char *zOut;..  /
27350 2a 20 49 66 20 74 68 69 73 20 70 61 74 68 20 6e  * If this path n
27360 61 6d 65 20 62 65 67 69 6e 73 20 77 69 74 68 20  ame begins with 
27370 22 2f 58 3a 22 2c 20 77 68 65 72 65 20 22 58 22  "/X:", where "X"
27380 20 69 73 20 61 6e 79 20 61 6c 70 68 61 62 65 74   is any alphabet
27390 69 63 0a 20 20 2a 2a 20 63 68 61 72 61 63 74 65  ic.  ** characte
273a0 72 2c 20 64 69 73 63 61 72 64 20 74 68 65 20 69  r, discard the i
273b0 6e 69 74 69 61 6c 20 22 2f 22 20 66 72 6f 6d 20  nitial "/" from 
273c0 74 68 65 20 70 61 74 68 6e 61 6d 65 2e 0a 20 20  the pathname..  
273d0 2a 2f 0a 20 20 69 66 28 20 7a 52 65 6c 61 74 69  */.  if( zRelati
273e0 76 65 5b 30 5d 3d 3d 27 2f 27 20 26 26 20 77 69  ve[0]=='/' && wi
273f0 6e 49 73 44 72 69 76 65 4c 65 74 74 65 72 41 6e  nIsDriveLetterAn
27400 64 43 6f 6c 6f 6e 28 7a 52 65 6c 61 74 69 76 65  dColon(zRelative
27410 2b 31 29 20 29 7b 0a 20 20 20 20 7a 52 65 6c 61  +1) ){.    zRela
27420 74 69 76 65 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f  tive++;.  }..  /
27430 2a 20 49 74 27 73 20 6f 64 64 20 74 6f 20 73 69  * It's odd to si
27440 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72 72  mulate an io-err
27450 6f 72 20 68 65 72 65 2c 20 62 75 74 20 72 65 61  or here, but rea
27460 6c 6c 79 20 74 68 69 73 20 69 73 20 6a 75 73 74  lly this is just
27470 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20  .  ** using the 
27480 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61 73 74  io-error infrast
27490 72 75 63 74 75 72 65 20 74 6f 20 74 65 73 74 20  ructure to test 
274a0 74 68 61 74 20 53 51 4c 69 74 65 20 68 61 6e 64  that SQLite hand
274b0 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75  les this.  ** fu
274c0 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20  nction failing. 
274d0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f  This function co
274e0 75 6c 64 20 66 61 69 6c 20 69 66 2c 20 66 6f 72  uld fail if, for
274f0 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 0a 20 20   example, the.  
27500 2a 2a 20 63 75 72 72 65 6e 74 20 77 6f 72 6b 69  ** current worki
27510 6e 67 20 64 69 72 65 63 74 6f 72 79 20 68 61 73  ng directory has
27520 20 62 65 65 6e 20 75 6e 6c 69 6e 6b 65 64 2e 0a   been unlinked..
27530 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49    */.  SimulateI
27540 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
27550 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20  QLITE_ERROR );. 
27560 20 69 66 20 28 20 73 71 6c 69 74 65 33 5f 64 61   if ( sqlite3_da
27570 74 61 5f 64 69 72 65 63 74 6f 72 79 20 26 26 20  ta_directory && 
27580 21 77 69 6e 49 73 56 65 72 62 61 74 69 6d 50 61  !winIsVerbatimPa
27590 74 68 6e 61 6d 65 28 7a 52 65 6c 61 74 69 76 65  thname(zRelative
275a0 29 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20  ) ){.    /*.    
275b0 2a 2a 20 4e 4f 54 45 3a 20 57 65 20 61 72 65 20  ** NOTE: We are 
275c0 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20 72  dealing with a r
275d0 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61 6d  elative path nam
275e0 65 20 61 6e 64 20 74 68 65 20 64 61 74 61 0a 20  e and the data. 
275f0 20 20 20 2a 2a 20 20 20 20 20 20 20 64 69 72 65     **       dire
27600 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 73  ctory has been s
27610 65 74 2e 20 20 54 68 65 72 65 66 6f 72 65 2c 20  et.  Therefore, 
27620 75 73 65 20 69 74 20 61 73 20 74 68 65 20 62 61  use it as the ba
27630 73 69 73 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  sis.    **      
27640 20 66 6f 72 20 63 6f 6e 76 65 72 74 69 6e 67 20   for converting 
27650 74 68 65 20 72 65 6c 61 74 69 76 65 20 70 61 74  the relative pat
27660 68 20 6e 61 6d 65 20 74 6f 20 61 6e 20 61 62 73  h name to an abs
27670 6f 6c 75 74 65 0a 20 20 20 20 2a 2a 20 20 20 20  olute.    **    
27680 20 20 20 6f 6e 65 20 62 79 20 70 72 65 70 65 6e     one by prepen
27690 64 69 6e 67 20 74 68 65 20 64 61 74 61 20 64 69  ding the data di
276a0 72 65 63 74 6f 72 79 20 61 6e 64 20 61 20 62 61  rectory and a ba
276b0 63 6b 73 6c 61 73 68 2e 0a 20 20 20 20 2a 2f 0a  ckslash..    */.
276c0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
276d0 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20  intf(MIN(nFull, 
276e0 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
276f0 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 25 63 25  ), zFull, "%s%c%
27700 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  s",.            
27710 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
27720 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79 2c  _data_directory,
27730 20 77 69 6e 47 65 74 44 69 72 53 65 70 28 29 2c   winGetDirSep(),
27740 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 20   zRelative);.   
27750 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
27760 4b 3b 0a 20 20 7d 0a 20 20 7a 43 6f 6e 76 65 72  K;.  }.  zConver
27770 74 65 64 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74  ted = winConvert
27780 46 72 6f 6d 55 74 66 38 46 69 6c 65 6e 61 6d 65  FromUtf8Filename
27790 28 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 69  (zRelative);.  i
277a0 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30  f( zConverted==0
277b0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
277c0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
277d0 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 73 49  M;.  }.  if( osI
277e0 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 4c 50 57  sNT() ){.    LPW
277f0 53 54 52 20 7a 54 65 6d 70 3b 0a 20 20 20 20 6e  STR zTemp;.    n
27800 42 79 74 65 20 3d 20 6f 73 47 65 74 46 75 6c 6c  Byte = osGetFull
27810 50 61 74 68 4e 61 6d 65 57 28 28 4c 50 43 57 53  PathNameW((LPCWS
27820 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 30  TR)zConverted, 0
27830 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 0, 0);.    if(
27840 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20   nByte==0 ){.   
27850 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
27860 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20  zConverted);.   
27870 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67     return winLog
27880 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e  Error(SQLITE_CAN
27890 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48 2c 20  TOPEN_FULLPATH, 
278a0 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
278b0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
278c0 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 46             "winF
278d0 75 6c 6c 50 61 74 68 6e 61 6d 65 31 22 2c 20 7a  ullPathname1", z
278e0 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 20 20 7d  Relative);.    }
278f0 0a 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 33 3b  .    nByte += 3;
27900 0a 20 20 20 20 7a 54 65 6d 70 20 3d 20 73 71 6c  .    zTemp = sql
27910 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20  ite3MallocZero( 
27920 6e 42 79 74 65 2a 73 69 7a 65 6f 66 28 7a 54 65  nByte*sizeof(zTe
27930 6d 70 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66  mp[0]) );.    if
27940 28 20 7a 54 65 6d 70 3d 3d 30 20 29 7b 0a 20 20  ( zTemp==0 ){.  
27950 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
27960 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
27970 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
27980 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20  E_IOERR_NOMEM;. 
27990 20 20 20 7d 0a 20 20 20 20 6e 42 79 74 65 20 3d     }.    nByte =
279a0 20 6f 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61   osGetFullPathNa
279b0 6d 65 57 28 28 4c 50 43 57 53 54 52 29 7a 43 6f  meW((LPCWSTR)zCo
279c0 6e 76 65 72 74 65 64 2c 20 6e 42 79 74 65 2c 20  nverted, nByte, 
279d0 7a 54 65 6d 70 2c 20 30 29 3b 0a 20 20 20 20 69  zTemp, 0);.    i
279e0 66 28 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20  f( nByte==0 ){. 
279f0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
27a00 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
27a10 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
27a20 65 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20 20  e(zTemp);.      
27a30 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72  return winLogErr
27a40 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  or(SQLITE_CANTOP
27a50 45 4e 5f 46 55 4c 4c 50 41 54 48 2c 20 6f 73 47  EN_FULLPATH, osG
27a60 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20  etLastError(),. 
27a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27a80 20 20 20 20 20 20 20 20 22 77 69 6e 46 75 6c 6c          "winFull
27a90 50 61 74 68 6e 61 6d 65 32 22 2c 20 7a 52 65 6c  Pathname2", zRel
27aa0 61 74 69 76 65 29 3b 0a 20 20 20 20 7d 0a 20 20  ative);.    }.  
27ab0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
27ac0 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
27ad0 7a 4f 75 74 20 3d 20 77 69 6e 55 6e 69 63 6f 64  zOut = winUnicod
27ae0 65 54 6f 55 74 66 38 28 7a 54 65 6d 70 29 3b 0a  eToUtf8(zTemp);.
27af0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
27b00 28 7a 54 65 6d 70 29 3b 0a 20 20 7d 0a 23 69 66  (zTemp);.  }.#if
27b10 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  def SQLITE_WIN32
27b20 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65  _HAS_ANSI.  else
27b30 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 65 6d  {.    char *zTem
27b40 70 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 6f  p;.    nByte = o
27b50 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65  sGetFullPathName
27b60 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72  A((char*)zConver
27b70 74 65 64 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  ted, 0, 0, 0);. 
27b80 20 20 20 69 66 28 20 6e 42 79 74 65 3d 3d 30 20     if( nByte==0 
27b90 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
27ba0 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
27bb0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
27bc0 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
27bd0 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c  TE_CANTOPEN_FULL
27be0 50 41 54 48 2c 20 6f 73 47 65 74 4c 61 73 74 45  PATH, osGetLastE
27bf0 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20  rror(),.        
27c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27c10 20 22 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d   "winFullPathnam
27c20 65 33 22 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b  e3", zRelative);
27c30 0a 20 20 20 20 7d 0a 20 20 20 20 6e 42 79 74 65  .    }.    nByte
27c40 20 2b 3d 20 33 3b 0a 20 20 20 20 7a 54 65 6d 70   += 3;.    zTemp
27c50 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
27c60 5a 65 72 6f 28 20 6e 42 79 74 65 2a 73 69 7a 65  Zero( nByte*size
27c70 6f 66 28 7a 54 65 6d 70 5b 30 5d 29 20 29 3b 0a  of(zTemp[0]) );.
27c80 20 20 20 20 69 66 28 20 7a 54 65 6d 70 3d 3d 30      if( zTemp==0
27c90 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
27ca0 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
27cb0 64 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  d);.      return
27cc0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
27cd0 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  MEM;.    }.    n
27ce0 42 79 74 65 20 3d 20 6f 73 47 65 74 46 75 6c 6c  Byte = osGetFull
27cf0 50 61 74 68 4e 61 6d 65 41 28 28 63 68 61 72 2a  PathNameA((char*
27d00 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 6e 42 79  )zConverted, nBy
27d10 74 65 2c 20 7a 54 65 6d 70 2c 20 30 29 3b 0a 20  te, zTemp, 0);. 
27d20 20 20 20 69 66 28 20 6e 42 79 74 65 3d 3d 30 20     if( nByte==0 
27d30 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
27d40 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
27d50 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
27d60 5f 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20  _free(zTemp);.  
27d70 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f      return winLo
27d80 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41  gError(SQLITE_CA
27d90 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48 2c  NTOPEN_FULLPATH,
27da0 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
27db0 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
27dc0 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
27dd0 46 75 6c 6c 50 61 74 68 6e 61 6d 65 34 22 2c 20  FullPathname4", 
27de0 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 20 20  zRelative);.    
27df0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  }.    sqlite3_fr
27e00 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
27e10 20 20 20 20 7a 4f 75 74 20 3d 20 73 71 6c 69 74      zOut = sqlit
27e20 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f  e3_win32_mbcs_to
27e30 5f 75 74 66 38 28 7a 54 65 6d 70 29 3b 0a 20 20  _utf8(zTemp);.  
27e40 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
27e50 54 65 6d 70 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  Temp);.  }.#endi
27e60 66 0a 20 20 69 66 28 20 7a 4f 75 74 20 29 7b 0a  f.  if( zOut ){.
27e70 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
27e80 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20  intf(MIN(nFull, 
27e90 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
27ea0 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 22 2c 20  ), zFull, "%s", 
27eb0 7a 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  zOut);.    sqlit
27ec0 65 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20  e3_free(zOut);. 
27ed0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
27ee0 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _OK;.  }else{.  
27ef0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
27f00 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  IOERR_NOMEM;.  }
27f10 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 69 66 6e 64  .#endif.}..#ifnd
27f20 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c  ef SQLITE_OMIT_L
27f30 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 2f 2a  OAD_EXTENSION./*
27f40 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65 73 20 66  .** Interfaces f
27f50 6f 72 20 6f 70 65 6e 69 6e 67 20 61 20 73 68 61  or opening a sha
27f60 72 65 64 20 6c 69 62 72 61 72 79 2c 20 66 69 6e  red library, fin
27f70 64 69 6e 67 20 65 6e 74 72 79 20 70 6f 69 6e 74  ding entry point
27f80 73 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20  s.** within the 
27f90 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20  shared library, 
27fa0 61 6e 64 20 63 6c 6f 73 69 6e 67 20 74 68 65 20  and closing the 
27fb0 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2e 0a  shared library..
27fc0 2a 2f 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61  */./*.** Interfa
27fd0 63 65 73 20 66 6f 72 20 6f 70 65 6e 69 6e 67 20  ces for opening 
27fe0 61 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79  a shared library
27ff0 2c 20 66 69 6e 64 69 6e 67 20 65 6e 74 72 79 20  , finding entry 
28000 70 6f 69 6e 74 73 0a 2a 2a 20 77 69 74 68 69 6e  points.** within
28010 20 74 68 65 20 73 68 61 72 65 64 20 6c 69 62 72   the shared libr
28020 61 72 79 2c 20 61 6e 64 20 63 6c 6f 73 69 6e 67  ary, and closing
28030 20 74 68 65 20 73 68 61 72 65 64 20 6c 69 62 72   the shared libr
28040 61 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ary..*/.static v
28050 6f 69 64 20 2a 77 69 6e 44 6c 4f 70 65 6e 28 73  oid *winDlOpen(s
28060 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
28070 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  , const char *zF
28080 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 48 41 4e 44  ilename){.  HAND
28090 4c 45 20 68 3b 0a 20 20 76 6f 69 64 20 2a 7a 43  LE h;.  void *zC
280a0 6f 6e 76 65 72 74 65 64 20 3d 20 77 69 6e 43 6f  onverted = winCo
280b0 6e 76 65 72 74 46 72 6f 6d 55 74 66 38 46 69 6c  nvertFromUtf8Fil
280c0 65 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29  ename(zFilename)
280d0 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
280e0 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 69 66  ETER(pVfs);.  if
280f0 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20  ( zConverted==0 
28100 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
28110 0a 20 20 7d 0a 20 20 69 66 28 20 6f 73 49 73 4e  .  }.  if( osIsN
28120 54 28 29 20 29 7b 0a 23 69 66 20 53 51 4c 49 54  T() ){.#if SQLIT
28130 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 68  E_OS_WINRT.    h
28140 20 3d 20 6f 73 4c 6f 61 64 50 61 63 6b 61 67 65   = osLoadPackage
28150 64 4c 69 62 72 61 72 79 28 28 4c 50 43 57 53 54  dLibrary((LPCWST
28160 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 30 29  R)zConverted, 0)
28170 3b 0a 23 65 6c 73 65 0a 20 20 20 20 68 20 3d 20  ;.#else.    h = 
28180 6f 73 4c 6f 61 64 4c 69 62 72 61 72 79 57 28 28  osLoadLibraryW((
28190 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74  LPCWSTR)zConvert
281a0 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  ed);.#endif.  }.
281b0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49  #ifdef SQLITE_WI
281c0 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65  N32_HAS_ANSI.  e
281d0 6c 73 65 7b 0a 20 20 20 20 68 20 3d 20 6f 73 4c  lse{.    h = osL
281e0 6f 61 64 4c 69 62 72 61 72 79 41 28 28 63 68 61  oadLibraryA((cha
281f0 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  r*)zConverted);.
28200 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c    }.#endif.  sql
28210 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65  ite3_free(zConve
28220 72 74 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  rted);.  return 
28230 28 76 6f 69 64 2a 29 68 3b 0a 7d 0a 73 74 61 74  (void*)h;.}.stat
28240 69 63 20 76 6f 69 64 20 77 69 6e 44 6c 45 72 72  ic void winDlErr
28250 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  or(sqlite3_vfs *
28260 70 56 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20  pVfs, int nBuf, 
28270 63 68 61 72 20 2a 7a 42 75 66 4f 75 74 29 7b 0a  char *zBufOut){.
28280 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
28290 45 52 28 70 56 66 73 29 3b 0a 20 20 77 69 6e 47  ER(pVfs);.  winG
282a0 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67 28 6f  etLastErrorMsg(o
282b0 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c  sGetLastError(),
282c0 20 6e 42 75 66 2c 20 7a 42 75 66 4f 75 74 29 3b   nBuf, zBufOut);
282d0 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 28  .}.static void (
282e0 2a 77 69 6e 44 6c 53 79 6d 28 73 71 6c 69 74 65  *winDlSym(sqlite
282f0 33 5f 76 66 73 20 2a 70 56 66 73 2c 76 6f 69 64  3_vfs *pVfs,void
28300 20 2a 70 48 2c 63 6f 6e 73 74 20 63 68 61 72 20   *pH,const char 
28310 2a 7a 53 79 6d 29 29 28 76 6f 69 64 29 7b 0a 20  *zSym))(void){. 
28320 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
28330 52 28 70 56 66 73 29 3b 0a 20 20 72 65 74 75 72  R(pVfs);.  retur
28340 6e 20 28 76 6f 69 64 28 2a 29 28 76 6f 69 64 29  n (void(*)(void)
28350 29 6f 73 47 65 74 50 72 6f 63 41 64 64 72 65 73  )osGetProcAddres
28360 73 41 28 28 48 41 4e 44 4c 45 29 70 48 2c 20 7a  sA((HANDLE)pH, z
28370 53 79 6d 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  Sym);.}.static v
28380 6f 69 64 20 77 69 6e 44 6c 43 6c 6f 73 65 28 73  oid winDlClose(s
28390 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
283a0 2c 20 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65 29  , void *pHandle)
283b0 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
283c0 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 6f 73  ETER(pVfs);.  os
283d0 46 72 65 65 4c 69 62 72 61 72 79 28 28 48 41 4e  FreeLibrary((HAN
283e0 44 4c 45 29 70 48 61 6e 64 6c 65 29 3b 0a 7d 0a  DLE)pHandle);.}.
283f0 23 65 6c 73 65 20 2f 2a 20 69 66 20 53 51 4c 49  #else /* if SQLI
28400 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54  TE_OMIT_LOAD_EXT
28410 45 4e 53 49 4f 4e 20 69 73 20 64 65 66 69 6e 65  ENSION is define
28420 64 3a 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20  d: */.  #define 
28430 77 69 6e 44 6c 4f 70 65 6e 20 20 30 0a 20 20 23  winDlOpen  0.  #
28440 64 65 66 69 6e 65 20 77 69 6e 44 6c 45 72 72 6f  define winDlErro
28450 72 20 30 0a 20 20 23 64 65 66 69 6e 65 20 77 69  r 0.  #define wi
28460 6e 44 6c 53 79 6d 20 20 20 30 0a 20 20 23 64 65  nDlSym   0.  #de
28470 66 69 6e 65 20 77 69 6e 44 6c 43 6c 6f 73 65 20  fine winDlClose 
28480 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  0.#endif.../*.**
28490 20 57 72 69 74 65 20 75 70 20 74 6f 20 6e 42 75   Write up to nBu
284a0 66 20 62 79 74 65 73 20 6f 66 20 72 61 6e 64 6f  f bytes of rando
284b0 6d 6e 65 73 73 20 69 6e 74 6f 20 7a 42 75 66 2e  mness into zBuf.
284c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
284d0 69 6e 52 61 6e 64 6f 6d 6e 65 73 73 28 73 71 6c  inRandomness(sql
284e0 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
284f0 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a  int nBuf, char *
28500 7a 42 75 66 29 7b 0a 20 20 69 6e 74 20 6e 20 3d  zBuf){.  int n =
28510 20 30 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   0;.  UNUSED_PAR
28520 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 23 69  AMETER(pVfs);.#i
28530 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
28540 5f 54 45 53 54 29 0a 20 20 6e 20 3d 20 6e 42 75  _TEST).  n = nBu
28550 66 3b 0a 20 20 6d 65 6d 73 65 74 28 7a 42 75 66  f;.  memset(zBuf
28560 2c 20 30 2c 20 6e 42 75 66 29 3b 0a 23 65 6c 73  , 0, nBuf);.#els
28570 65 0a 20 20 69 66 28 20 73 69 7a 65 6f 66 28 53  e.  if( sizeof(S
28580 59 53 54 45 4d 54 49 4d 45 29 3c 3d 6e 42 75 66  YSTEMTIME)<=nBuf
28590 2d 6e 20 29 7b 0a 20 20 20 20 53 59 53 54 45 4d  -n ){.    SYSTEM
285a0 54 49 4d 45 20 78 3b 0a 20 20 20 20 6f 73 47 65  TIME x;.    osGe
285b0 74 53 79 73 74 65 6d 54 69 6d 65 28 26 78 29 3b  tSystemTime(&x);
285c0 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75  .    memcpy(&zBu
285d0 66 5b 6e 5d 2c 20 26 78 2c 20 73 69 7a 65 6f 66  f[n], &x, sizeof
285e0 28 78 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73  (x));.    n += s
285f0 69 7a 65 6f 66 28 78 29 3b 0a 20 20 7d 0a 20 20  izeof(x);.  }.  
28600 69 66 28 20 73 69 7a 65 6f 66 28 44 57 4f 52 44  if( sizeof(DWORD
28610 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20  )<=nBuf-n ){.   
28620 20 44 57 4f 52 44 20 70 69 64 20 3d 20 6f 73 47   DWORD pid = osG
28630 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
28640 49 64 28 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  Id();.    memcpy
28650 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 70 69 64 2c  (&zBuf[n], &pid,
28660 20 73 69 7a 65 6f 66 28 70 69 64 29 29 3b 0a 20   sizeof(pid));. 
28670 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 70     n += sizeof(p
28680 69 64 29 3b 0a 20 20 7d 0a 23 69 66 20 53 51 4c  id);.  }.#if SQL
28690 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 69  ITE_OS_WINRT.  i
286a0 66 28 20 73 69 7a 65 6f 66 28 55 4c 4f 4e 47 4c  f( sizeof(ULONGL
286b0 4f 4e 47 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a  ONG)<=nBuf-n ){.
286c0 20 20 20 20 55 4c 4f 4e 47 4c 4f 4e 47 20 63 6e      ULONGLONG cn
286d0 74 20 3d 20 6f 73 47 65 74 54 69 63 6b 43 6f 75  t = osGetTickCou
286e0 6e 74 36 34 28 29 3b 0a 20 20 20 20 6d 65 6d 63  nt64();.    memc
286f0 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 63 6e  py(&zBuf[n], &cn
28700 74 2c 20 73 69 7a 65 6f 66 28 63 6e 74 29 29 3b  t, sizeof(cnt));
28710 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66  .    n += sizeof
28720 28 63 6e 74 29 3b 0a 20 20 7d 0a 23 65 6c 73 65  (cnt);.  }.#else
28730 0a 20 20 69 66 28 20 73 69 7a 65 6f 66 28 44 57  .  if( sizeof(DW
28740 4f 52 44 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a  ORD)<=nBuf-n ){.
28750 20 20 20 20 44 57 4f 52 44 20 63 6e 74 20 3d 20      DWORD cnt = 
28760 6f 73 47 65 74 54 69 63 6b 43 6f 75 6e 74 28 29  osGetTickCount()
28770 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42  ;.    memcpy(&zB
28780 75 66 5b 6e 5d 2c 20 26 63 6e 74 2c 20 73 69 7a  uf[n], &cnt, siz
28790 65 6f 66 28 63 6e 74 29 29 3b 0a 20 20 20 20 6e  eof(cnt));.    n
287a0 20 2b 3d 20 73 69 7a 65 6f 66 28 63 6e 74 29 3b   += sizeof(cnt);
287b0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
287c0 28 20 73 69 7a 65 6f 66 28 4c 41 52 47 45 5f 49  ( sizeof(LARGE_I
287d0 4e 54 45 47 45 52 29 3c 3d 6e 42 75 66 2d 6e 20  NTEGER)<=nBuf-n 
287e0 29 7b 0a 20 20 20 20 4c 41 52 47 45 5f 49 4e 54  ){.    LARGE_INT
287f0 45 47 45 52 20 69 3b 0a 20 20 20 20 6f 73 51 75  EGER i;.    osQu
28800 65 72 79 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f  eryPerformanceCo
28810 75 6e 74 65 72 28 26 69 29 3b 0a 20 20 20 20 6d  unter(&i);.    m
28820 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20  emcpy(&zBuf[n], 
28830 26 69 2c 20 73 69 7a 65 6f 66 28 69 29 29 3b 0a  &i, sizeof(i));.
28840 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28      n += sizeof(
28850 69 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  i);.  }.#endif. 
28860 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a 2f   return n;.}.../
28870 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20 61  *.** Sleep for a
28880 20 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e 20 20   little while.  
28890 52 65 74 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e  Return the amoun
288a0 74 20 6f 66 20 74 69 6d 65 20 73 6c 65 70 74 2e  t of time slept.
288b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
288c0 69 6e 53 6c 65 65 70 28 73 71 6c 69 74 65 33 5f  inSleep(sqlite3_
288d0 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6d  vfs *pVfs, int m
288e0 69 63 72 6f 73 65 63 29 7b 0a 20 20 73 71 6c 69  icrosec){.  sqli
288f0 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28  te3_win32_sleep(
28900 28 6d 69 63 72 6f 73 65 63 2b 39 39 39 29 2f 31  (microsec+999)/1
28910 30 30 30 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  000);.  UNUSED_P
28920 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a  ARAMETER(pVfs);.
28930 20 20 72 65 74 75 72 6e 20 28 28 6d 69 63 72 6f    return ((micro
28940 73 65 63 2b 39 39 39 29 2f 31 30 30 30 29 2a 31  sec+999)/1000)*1
28950 30 30 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  000;.}../*.** Th
28960 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69  e following vari
28970 61 62 6c 65 2c 20 69 66 20 73 65 74 20 74 6f 20  able, if set to 
28980 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65  a non-zero value
28990 2c 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64  , is interpreted
289a0 20 61 73 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65   as.** the numbe
289b0 72 20 6f 66 20 73 65 63 6f 6e 64 73 20 73 69 6e  r of seconds sin
289c0 63 65 20 31 39 37 30 20 61 6e 64 20 69 73 20 75  ce 1970 and is u
289d0 73 65 64 20 74 6f 20 73 65 74 20 74 68 65 20 72  sed to set the r
289e0 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 73 71 6c 69  esult of.** sqli
289f0 74 65 33 4f 73 43 75 72 72 65 6e 74 54 69 6d 65  te3OsCurrentTime
28a00 28 29 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e  () during testin
28a10 67 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  g..*/.#ifdef SQL
28a20 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c  ITE_TEST.int sql
28a30 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d  ite3_current_tim
28a40 65 20 3d 20 30 3b 20 20 2f 2a 20 46 61 6b 65 20  e = 0;  /* Fake 
28a50 73 79 73 74 65 6d 20 74 69 6d 65 20 69 6e 20 73  system time in s
28a60 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 31 39 37  econds since 197
28a70 30 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a  0. */.#endif../*
28a80 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 75 72  .** Find the cur
28a90 72 65 6e 74 20 74 69 6d 65 20 28 69 6e 20 55 6e  rent time (in Un
28aa0 69 76 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61  iversal Coordina
28ab0 74 65 64 20 54 69 6d 65 29 2e 20 20 57 72 69 74  ted Time).  Writ
28ac0 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 0a 2a 2a  e into *piNow.**
28ad0 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d   the current tim
28ae0 65 20 61 6e 64 20 64 61 74 65 20 61 73 20 61 20  e and date as a 
28af0 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62 65  Julian Day numbe
28b00 72 20 74 69 6d 65 73 20 38 36 5f 34 30 30 5f 30  r times 86_400_0
28b10 30 30 2e 20 20 49 6e 0a 2a 2a 20 6f 74 68 65 72  00.  In.** other
28b20 20 77 6f 72 64 73 2c 20 77 72 69 74 65 20 69 6e   words, write in
28b30 74 6f 20 2a 70 69 4e 6f 77 20 74 68 65 20 6e 75  to *piNow the nu
28b40 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63  mber of millisec
28b50 6f 6e 64 73 20 73 69 6e 63 65 20 74 68 65 20 4a  onds since the J
28b60 75 6c 69 61 6e 0a 2a 2a 20 65 70 6f 63 68 20 6f  ulian.** epoch o
28b70 66 20 6e 6f 6f 6e 20 69 6e 20 47 72 65 65 6e 77  f noon in Greenw
28b80 69 63 68 20 6f 6e 20 4e 6f 76 65 6d 62 65 72 20  ich on November 
28b90 32 34 2c 20 34 37 31 34 20 42 2e 43 20 61 63 63  24, 4714 B.C acc
28ba0 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 0a 2a 2a  ording to the.**
28bb0 20 70 72 6f 6c 65 70 74 69 63 20 47 72 65 67 6f   proleptic Grego
28bc0 72 69 61 6e 20 63 61 6c 65 6e 64 61 72 2e 0a 2a  rian calendar..*
28bd0 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c  *.** On success,
28be0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
28bf0 4b 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  K.  Return SQLIT
28c00 45 5f 45 52 52 4f 52 20 69 66 20 74 68 65 20 74  E_ERROR if the t
28c10 69 6d 65 20 61 6e 64 20 64 61 74 65 20 0a 2a 2a  ime and date .**
28c20 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64   cannot be found
28c30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
28c40 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 49 6e  winCurrentTimeIn
28c50 74 36 34 28 73 71 6c 69 74 65 33 5f 76 66 73 20  t64(sqlite3_vfs 
28c60 2a 70 56 66 73 2c 20 73 71 6c 69 74 65 33 5f 69  *pVfs, sqlite3_i
28c70 6e 74 36 34 20 2a 70 69 4e 6f 77 29 7b 0a 20 20  nt64 *piNow){.  
28c80 2f 2a 20 46 49 4c 45 54 49 4d 45 20 73 74 72 75  /* FILETIME stru
28c90 63 74 75 72 65 20 69 73 20 61 20 36 34 2d 62 69  cture is a 64-bi
28ca0 74 20 76 61 6c 75 65 20 72 65 70 72 65 73 65 6e  t value represen
28cb0 74 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20  ting the number 
28cc0 6f 66 20 0a 20 20 20 20 20 31 30 30 2d 6e 61 6e  of .     100-nan
28cd0 6f 73 65 63 6f 6e 64 20 69 6e 74 65 72 76 61 6c  osecond interval
28ce0 73 20 73 69 6e 63 65 20 4a 61 6e 75 61 72 79 20  s since January 
28cf0 31 2c 20 31 36 30 31 20 28 3d 20 4a 44 20 32 33  1, 1601 (= JD 23
28d00 30 35 38 31 33 2e 35 29 2e 20 0a 20 20 2a 2f 0a  05813.5). .  */.
28d10 20 20 46 49 4c 45 54 49 4d 45 20 66 74 3b 0a 20    FILETIME ft;. 
28d20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71   static const sq
28d30 6c 69 74 65 33 5f 69 6e 74 36 34 20 77 69 6e 46  lite3_int64 winF
28d40 69 6c 65 74 69 6d 65 45 70 6f 63 68 20 3d 20 32  iletimeEpoch = 2
28d50 33 30 35 38 31 33 35 2a 28 73 71 6c 69 74 65 33  3058135*(sqlite3
28d60 5f 69 6e 74 36 34 29 38 36 34 30 30 30 30 3b 0a  _int64)8640000;.
28d70 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
28d80 53 54 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  ST.  static cons
28d90 74 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  t sqlite3_int64 
28da0 75 6e 69 78 45 70 6f 63 68 20 3d 20 32 34 34 30  unixEpoch = 2440
28db0 35 38 37 35 2a 28 73 71 6c 69 74 65 33 5f 69 6e  5875*(sqlite3_in
28dc0 74 36 34 29 38 36 34 30 30 30 30 3b 0a 23 65 6e  t64)8640000;.#en
28dd0 64 69 66 0a 20 20 2f 2a 20 32 5e 33 32 20 2d 20  dif.  /* 2^32 - 
28de0 74 6f 20 61 76 6f 69 64 20 75 73 65 20 6f 66 20  to avoid use of 
28df0 4c 4c 20 61 6e 64 20 77 61 72 6e 69 6e 67 73 20  LL and warnings 
28e00 69 6e 20 67 63 63 20 2a 2f 0a 20 20 73 74 61 74  in gcc */.  stat
28e10 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
28e20 5f 69 6e 74 36 34 20 6d 61 78 33 32 42 69 74 56  _int64 max32BitV
28e30 61 6c 75 65 20 3d 20 0a 20 20 20 20 20 20 28 73  alue = .      (s
28e40 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 32 30 30  qlite3_int64)200
28e50 30 30 30 30 30 30 30 20 2b 20 28 73 71 6c 69 74  0000000 + (sqlit
28e60 65 33 5f 69 6e 74 36 34 29 32 30 30 30 30 30 30  e3_int64)2000000
28e70 30 30 30 20 2b 0a 20 20 20 20 20 20 28 73 71 6c  000 +.      (sql
28e80 69 74 65 33 5f 69 6e 74 36 34 29 32 39 34 39 36  ite3_int64)29496
28e90 37 32 39 36 3b 0a 0a 23 69 66 20 53 51 4c 49 54  7296;..#if SQLIT
28ea0 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 53 59 53  E_OS_WINCE.  SYS
28eb0 54 45 4d 54 49 4d 45 20 74 69 6d 65 3b 0a 20 20  TEMTIME time;.  
28ec0 6f 73 47 65 74 53 79 73 74 65 6d 54 69 6d 65 28  osGetSystemTime(
28ed0 26 74 69 6d 65 29 3b 0a 20 20 2f 2a 20 69 66 20  &time);.  /* if 
28ee0 53 79 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65  SystemTimeToFile
28ef0 54 69 6d 65 28 29 20 66 61 69 6c 73 2c 20 69 74  Time() fails, it
28f00 20 72 65 74 75 72 6e 73 20 7a 65 72 6f 2e 20 2a   returns zero. *
28f10 2f 0a 20 20 69 66 20 28 21 6f 73 53 79 73 74 65  /.  if (!osSyste
28f20 6d 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65 28  mTimeToFileTime(
28f30 26 74 69 6d 65 2c 26 66 74 29 29 7b 0a 20 20 20  &time,&ft)){.   
28f40 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
28f50 52 52 4f 52 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a  RROR;.  }.#else.
28f60 20 20 6f 73 47 65 74 53 79 73 74 65 6d 54 69 6d    osGetSystemTim
28f70 65 41 73 46 69 6c 65 54 69 6d 65 28 20 26 66 74  eAsFileTime( &ft
28f80 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2a 70   );.#endif..  *p
28f90 69 4e 6f 77 20 3d 20 77 69 6e 46 69 6c 65 74 69  iNow = winFileti
28fa0 6d 65 45 70 6f 63 68 20 2b 0a 20 20 20 20 20 20  meEpoch +.      
28fb0 20 20 20 20 20 20 28 28 28 28 73 71 6c 69 74 65        ((((sqlite
28fc0 33 5f 69 6e 74 36 34 29 66 74 2e 64 77 48 69 67  3_int64)ft.dwHig
28fd0 68 44 61 74 65 54 69 6d 65 29 2a 6d 61 78 33 32  hDateTime)*max32
28fe0 42 69 74 56 61 6c 75 65 29 20 2b 20 0a 20 20 20  BitValue) + .   
28ff0 20 20 20 20 20 20 20 20 20 20 20 20 28 73 71 6c              (sql
29000 69 74 65 33 5f 69 6e 74 36 34 29 66 74 2e 64 77  ite3_int64)ft.dw
29010 4c 6f 77 44 61 74 65 54 69 6d 65 29 2f 28 73 71  LowDateTime)/(sq
29020 6c 69 74 65 33 5f 69 6e 74 36 34 29 31 30 30 30  lite3_int64)1000
29030 30 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  0;..#ifdef SQLIT
29040 45 5f 54 45 53 54 0a 20 20 69 66 28 20 73 71 6c  E_TEST.  if( sql
29050 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d  ite3_current_tim
29060 65 20 29 7b 0a 20 20 20 20 2a 70 69 4e 6f 77 20  e ){.    *piNow 
29070 3d 20 31 30 30 30 2a 28 73 71 6c 69 74 65 33 5f  = 1000*(sqlite3_
29080 69 6e 74 36 34 29 73 71 6c 69 74 65 33 5f 63 75  int64)sqlite3_cu
29090 72 72 65 6e 74 5f 74 69 6d 65 20 2b 20 75 6e 69  rrent_time + uni
290a0 78 45 70 6f 63 68 3b 0a 20 20 7d 0a 23 65 6e 64  xEpoch;.  }.#end
290b0 69 66 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  if.  UNUSED_PARA
290c0 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 72  METER(pVfs);.  r
290d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
290e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74  .}../*.** Find t
290f0 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20  he current time 
29100 28 69 6e 20 55 6e 69 76 65 72 73 61 6c 20 43 6f  (in Universal Co
29110 6f 72 64 69 6e 61 74 65 64 20 54 69 6d 65 29 2e  ordinated Time).
29120 20 20 57 72 69 74 65 20 74 68 65 0a 2a 2a 20 63    Write the.** c
29130 75 72 72 65 6e 74 20 74 69 6d 65 20 61 6e 64 20  urrent time and 
29140 64 61 74 65 20 61 73 20 61 20 4a 75 6c 69 61 6e  date as a Julian
29150 20 44 61 79 20 6e 75 6d 62 65 72 20 69 6e 74 6f   Day number into
29160 20 2a 70 72 4e 6f 77 20 61 6e 64 0a 2a 2a 20 72   *prNow and.** r
29170 65 74 75 72 6e 20 30 2e 20 20 52 65 74 75 72 6e  eturn 0.  Return
29180 20 31 20 69 66 20 74 68 65 20 74 69 6d 65 20 61   1 if the time a
29190 6e 64 20 64 61 74 65 20 63 61 6e 6e 6f 74 20 62  nd date cannot b
291a0 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74  e found..*/.stat
291b0 69 63 20 69 6e 74 20 77 69 6e 43 75 72 72 65 6e  ic int winCurren
291c0 74 54 69 6d 65 28 73 71 6c 69 74 65 33 5f 76 66  tTime(sqlite3_vf
291d0 73 20 2a 70 56 66 73 2c 20 64 6f 75 62 6c 65 20  s *pVfs, double 
291e0 2a 70 72 4e 6f 77 29 7b 0a 20 20 69 6e 74 20 72  *prNow){.  int r
291f0 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  c;.  sqlite3_int
29200 36 34 20 69 3b 0a 20 20 72 63 20 3d 20 77 69 6e  64 i;.  rc = win
29210 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34  CurrentTimeInt64
29220 28 70 56 66 73 2c 20 26 69 29 3b 0a 20 20 69 66  (pVfs, &i);.  if
29230 28 20 21 72 63 20 29 7b 0a 20 20 20 20 2a 70 72  ( !rc ){.    *pr
29240 4e 6f 77 20 3d 20 69 2f 38 36 34 30 30 30 30 30  Now = i/86400000
29250 2e 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  .0;.  }.  return
29260 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
29270 65 20 69 64 65 61 20 69 73 20 74 68 61 74 20 74  e idea is that t
29280 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 6f 72  his function wor
29290 6b 73 20 6c 69 6b 65 20 61 20 63 6f 6d 62 69 6e  ks like a combin
292a0 61 74 69 6f 6e 20 6f 66 0a 2a 2a 20 47 65 74 4c  ation of.** GetL
292b0 61 73 74 45 72 72 6f 72 28 29 20 61 6e 64 20 46  astError() and F
292c0 6f 72 6d 61 74 4d 65 73 73 61 67 65 28 29 20 6f  ormatMessage() o
292d0 6e 20 57 69 6e 64 6f 77 73 20 28 6f 72 20 65 72  n Windows (or er
292e0 72 6e 6f 20 61 6e 64 0a 2a 2a 20 73 74 72 65 72  rno and.** strer
292f0 72 6f 72 5f 72 28 29 20 6f 6e 20 55 6e 69 78 29  ror_r() on Unix)
29300 2e 20 41 66 74 65 72 20 61 6e 20 65 72 72 6f 72  . After an error
29310 20 69 73 20 72 65 74 75 72 6e 65 64 20 62 79 20   is returned by 
29320 61 6e 20 4f 53 0a 2a 2a 20 66 75 6e 63 74 69 6f  an OS.** functio
29330 6e 2c 20 53 51 4c 69 74 65 20 63 61 6c 6c 73 20  n, SQLite calls 
29340 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69  this function wi
29350 74 68 20 7a 42 75 66 20 70 6f 69 6e 74 69 6e 67  th zBuf pointing
29360 20 74 6f 0a 2a 2a 20 61 20 62 75 66 66 65 72 20   to.** a buffer 
29370 6f 66 20 6e 42 75 66 20 62 79 74 65 73 2e 20 54  of nBuf bytes. T
29380 68 65 20 4f 53 20 6c 61 79 65 72 20 73 68 6f 75  he OS layer shou
29390 6c 64 20 70 6f 70 75 6c 61 74 65 20 74 68 65 0a  ld populate the.
293a0 2a 2a 20 62 75 66 66 65 72 20 77 69 74 68 20 61  ** buffer with a
293b0 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20   nul-terminated 
293c0 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 20 65 72  UTF-8 encoded er
293d0 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 64  ror message.** d
293e0 65 73 63 72 69 62 69 6e 67 20 74 68 65 20 6c 61  escribing the la
293f0 73 74 20 49 4f 20 65 72 72 6f 72 20 74 6f 20 68  st IO error to h
29400 61 76 65 20 6f 63 63 75 72 72 65 64 20 77 69 74  ave occurred wit
29410 68 69 6e 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a  hin the calling.
29420 2a 2a 20 74 68 72 65 61 64 2e 0a 2a 2a 0a 2a 2a  ** thread..**.**
29430 20 49 66 20 74 68 65 20 65 72 72 6f 72 20 6d 65   If the error me
29440 73 73 61 67 65 20 69 73 20 74 6f 6f 20 6c 61 72  ssage is too lar
29450 67 65 20 66 6f 72 20 74 68 65 20 73 75 70 70 6c  ge for the suppl
29460 69 65 64 20 62 75 66 66 65 72 2c 0a 2a 2a 20 69  ied buffer,.** i
29470 74 20 73 68 6f 75 6c 64 20 62 65 20 74 72 75 6e  t should be trun
29480 63 61 74 65 64 2e 20 54 68 65 20 72 65 74 75 72  cated. The retur
29490 6e 20 76 61 6c 75 65 20 6f 66 20 78 47 65 74 4c  n value of xGetL
294a0 61 73 74 45 72 72 6f 72 0a 2a 2a 20 69 73 20 7a  astError.** is z
294b0 65 72 6f 20 69 66 20 74 68 65 20 65 72 72 6f 72  ero if the error
294c0 20 6d 65 73 73 61 67 65 20 66 69 74 73 20 69 6e   message fits in
294d0 20 74 68 65 20 62 75 66 66 65 72 2c 20 6f 72 20   the buffer, or 
294e0 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20 6f 74 68 65  non-zero.** othe
294f0 72 77 69 73 65 20 28 69 66 20 74 68 65 20 6d 65  rwise (if the me
29500 73 73 61 67 65 20 77 61 73 20 74 72 75 6e 63 61  ssage was trunca
29510 74 65 64 29 2e 20 49 66 20 6e 6f 6e 2d 7a 65 72  ted). If non-zer
29520 6f 20 69 73 20 72 65 74 75 72 6e 65 64 2c 0a 2a  o is returned,.*
29530 2a 20 74 68 65 6e 20 69 74 20 69 73 20 6e 6f 74  * then it is not
29540 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 69 6e   necessary to in
29550 63 6c 75 64 65 20 74 68 65 20 6e 75 6c 2d 74 65  clude the nul-te
29560 72 6d 69 6e 61 74 6f 72 20 63 68 61 72 61 63 74  rminator charact
29570 65 72 0a 2a 2a 20 69 6e 20 74 68 65 20 6f 75 74  er.** in the out
29580 70 75 74 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a  put buffer..**.*
29590 2a 20 4e 6f 74 20 73 75 70 70 6c 79 69 6e 67 20  * Not supplying 
295a0 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
295b0 20 77 69 6c 6c 20 68 61 76 65 20 6e 6f 20 61 64   will have no ad
295c0 76 65 72 73 65 20 65 66 66 65 63 74 0a 2a 2a 20  verse effect.** 
295d0 6f 6e 20 53 51 4c 69 74 65 2e 20 49 74 20 69 73  on SQLite. It is
295e0 20 66 69 6e 65 20 74 6f 20 68 61 76 65 20 61 6e   fine to have an
295f0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
29600 74 68 61 74 20 6e 65 76 65 72 0a 2a 2a 20 72 65  that never.** re
29610 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20 6d  turns an error m
29620 65 73 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  essage:.**.**   
29630 69 6e 74 20 78 47 65 74 4c 61 73 74 45 72 72 6f  int xGetLastErro
29640 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  r(sqlite3_vfs *p
29650 56 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63  Vfs, int nBuf, c
29660 68 61 72 20 2a 7a 42 75 66 29 7b 0a 2a 2a 20 20  har *zBuf){.**  
29670 20 20 20 61 73 73 65 72 74 28 7a 42 75 66 5b 30     assert(zBuf[0
29680 5d 3d 3d 27 5c 30 27 29 3b 0a 2a 2a 20 20 20 20  ]=='\0');.**    
29690 20 72 65 74 75 72 6e 20 30 3b 0a 2a 2a 20 20 20   return 0;.**   
296a0 7d 0a 2a 2a 0a 2a 2a 20 48 6f 77 65 76 65 72 20  }.**.** However 
296b0 69 66 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  if an error mess
296c0 61 67 65 20 69 73 20 73 75 70 70 6c 69 65 64 2c  age is supplied,
296d0 20 69 74 20 77 69 6c 6c 20 62 65 20 69 6e 63 6f   it will be inco
296e0 72 70 6f 72 61 74 65 64 0a 2a 2a 20 62 79 20 73  rporated.** by s
296f0 71 6c 69 74 65 20 69 6e 74 6f 20 74 68 65 20 65  qlite into the e
29700 72 72 6f 72 20 6d 65 73 73 61 67 65 20 61 76 61  rror message ava
29710 69 6c 61 62 6c 65 20 74 6f 20 74 68 65 20 75 73  ilable to the us
29720 65 72 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69  er using.** sqli
29730 74 65 33 5f 65 72 72 6d 73 67 28 29 2c 20 70 6f  te3_errmsg(), po
29740 73 73 69 62 6c 79 20 6d 61 6b 69 6e 67 20 49 4f  ssibly making IO
29750 20 65 72 72 6f 72 73 20 65 61 73 69 65 72 20 74   errors easier t
29760 6f 20 64 65 62 75 67 2e 0a 2a 2f 0a 73 74 61 74  o debug..*/.stat
29770 69 63 20 69 6e 74 20 77 69 6e 47 65 74 4c 61 73  ic int winGetLas
29780 74 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76  tError(sqlite3_v
29790 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42  fs *pVfs, int nB
297a0 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b  uf, char *zBuf){
297b0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
297c0 54 45 52 28 70 56 66 73 29 3b 0a 20 20 72 65 74  TER(pVfs);.  ret
297d0 75 72 6e 20 77 69 6e 47 65 74 4c 61 73 74 45 72  urn winGetLastEr
297e0 72 6f 72 4d 73 67 28 6f 73 47 65 74 4c 61 73 74  rorMsg(osGetLast
297f0 45 72 72 6f 72 28 29 2c 20 6e 42 75 66 2c 20 7a  Error(), nBuf, z
29800 42 75 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  Buf);.}../*.** I
29810 6e 69 74 69 61 6c 69 7a 65 20 61 6e 64 20 64 65  nitialize and de
29820 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6f  initialize the o
29830 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
29840 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 69 6e  interface..*/.in
29850 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f 69 6e 69  t sqlite3_os_ini
29860 74 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69  t(void){.  stati
29870 63 20 73 71 6c 69 74 65 33 5f 76 66 73 20 77 69  c sqlite3_vfs wi
29880 6e 56 66 73 20 3d 20 7b 0a 20 20 20 20 33 2c 20  nVfs = {.    3, 
29890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
298a0 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f    /* iVersion */
298b0 0a 20 20 20 20 73 69 7a 65 6f 66 28 77 69 6e 46  .    sizeof(winF
298c0 69 6c 65 29 2c 20 20 20 20 20 2f 2a 20 73 7a 4f  ile),     /* szO
298d0 73 46 69 6c 65 20 2a 2f 0a 20 20 20 20 53 51 4c  sFile */.    SQL
298e0 49 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 50 41  ITE_WIN32_MAX_PA
298f0 54 48 5f 42 59 54 45 53 2c 20 2f 2a 20 6d 78 50  TH_BYTES, /* mxP
29900 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 30  athname */.    0
29910 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
29920 20 20 20 20 2f 2a 20 70 4e 65 78 74 20 2a 2f 0a      /* pNext */.
29930 20 20 20 20 22 77 69 6e 33 32 22 2c 20 20 20 20      "win32",    
29940 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 4e 61 6d           /* zNam
29950 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20  e */.    0,     
29960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29970 20 70 41 70 70 44 61 74 61 20 2a 2f 0a 20 20 20   pAppData */.   
29980 20 77 69 6e 4f 70 65 6e 2c 20 20 20 20 20 20 20   winOpen,       
29990 20 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2a        /* xOpen *
299a0 2f 0a 20 20 20 20 77 69 6e 44 65 6c 65 74 65 2c  /.    winDelete,
299b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44             /* xD
299c0 65 6c 65 74 65 20 2a 2f 0a 20 20 20 20 77 69 6e  elete */.    win
299d0 41 63 63 65 73 73 2c 20 20 20 20 20 20 20 20 20  Access,         
299e0 20 20 2f 2a 20 78 41 63 63 65 73 73 20 2a 2f 0a    /* xAccess */.
299f0 20 20 20 20 77 69 6e 46 75 6c 6c 50 61 74 68 6e      winFullPathn
29a00 61 6d 65 2c 20 20 20 20 20 2f 2a 20 78 46 75 6c  ame,     /* xFul
29a10 6c 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20  lPathname */.   
29a20 20 77 69 6e 44 6c 4f 70 65 6e 2c 20 20 20 20 20   winDlOpen,     
29a30 20 20 20 20 20 20 2f 2a 20 78 44 6c 4f 70 65 6e        /* xDlOpen
29a40 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 45 72 72   */.    winDlErr
29a50 6f 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  or,          /* 
29a60 78 44 6c 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20  xDlError */.    
29a70 77 69 6e 44 6c 53 79 6d 2c 20 20 20 20 20 20 20  winDlSym,       
29a80 20 20 20 20 20 2f 2a 20 78 44 6c 53 79 6d 20 2a       /* xDlSym *
29a90 2f 0a 20 20 20 20 77 69 6e 44 6c 43 6c 6f 73 65  /.    winDlClose
29aa0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44  ,          /* xD
29ab0 6c 43 6c 6f 73 65 20 2a 2f 0a 20 20 20 20 77 69  lClose */.    wi
29ac0 6e 52 61 6e 64 6f 6d 6e 65 73 73 2c 20 20 20 20  nRandomness,    
29ad0 20 20 20 2f 2a 20 78 52 61 6e 64 6f 6d 6e 65 73     /* xRandomnes
29ae0 73 20 2a 2f 0a 20 20 20 20 77 69 6e 53 6c 65 65  s */.    winSlee
29af0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
29b00 20 78 53 6c 65 65 70 20 2a 2f 0a 20 20 20 20 77   xSleep */.    w
29b10 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 2c 20 20  inCurrentTime,  
29b20 20 20 20 20 2f 2a 20 78 43 75 72 72 65 6e 74 54      /* xCurrentT
29b30 69 6d 65 20 2a 2f 0a 20 20 20 20 77 69 6e 47 65  ime */.    winGe
29b40 74 4c 61 73 74 45 72 72 6f 72 2c 20 20 20 20 20  tLastError,     
29b50 2f 2a 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72  /* xGetLastError
29b60 20 2a 2f 0a 20 20 20 20 77 69 6e 43 75 72 72 65   */.    winCurre
29b70 6e 74 54 69 6d 65 49 6e 74 36 34 2c 20 2f 2a 20  ntTimeInt64, /* 
29b80 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36  xCurrentTimeInt6
29b90 34 20 2a 2f 0a 20 20 20 20 77 69 6e 53 65 74 53  4 */.    winSetS
29ba0 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20 20 2f 2a  ystemCall,    /*
29bb0 20 78 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 20   xSetSystemCall 
29bc0 2a 2f 0a 20 20 20 20 77 69 6e 47 65 74 53 79 73  */.    winGetSys
29bd0 74 65 6d 43 61 6c 6c 2c 20 20 20 20 2f 2a 20 78  temCall,    /* x
29be0 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f  GetSystemCall */
29bf0 0a 20 20 20 20 77 69 6e 4e 65 78 74 53 79 73 74  .    winNextSyst
29c00 65 6d 43 61 6c 6c 2c 20 20 20 2f 2a 20 78 4e 65  emCall,   /* xNe
29c10 78 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a  xtSystemCall */.
29c20 20 20 7d 3b 0a 23 69 66 20 64 65 66 69 6e 65 64    };.#if defined
29c30 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
29c40 53 5f 57 49 44 45 29 0a 20 20 73 74 61 74 69 63  S_WIDE).  static
29c50 20 73 71 6c 69 74 65 33 5f 76 66 73 20 77 69 6e   sqlite3_vfs win
29c60 4c 6f 6e 67 50 61 74 68 56 66 73 20 3d 20 7b 0a  LongPathVfs = {.
29c70 20 20 20 20 33 2c 20 20 20 20 20 20 20 20 20 20      3,          
29c80 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72           /* iVer
29c90 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 73 69 7a 65  sion */.    size
29ca0 6f 66 28 77 69 6e 46 69 6c 65 29 2c 20 20 20 20  of(winFile),    
29cb0 20 2f 2a 20 73 7a 4f 73 46 69 6c 65 20 2a 2f 0a   /* szOsFile */.
29cc0 20 20 20 20 53 51 4c 49 54 45 5f 57 49 4e 4e 54      SQLITE_WINNT
29cd0 5f 4d 41 58 5f 50 41 54 48 5f 42 59 54 45 53 2c  _MAX_PATH_BYTES,
29ce0 20 2f 2a 20 6d 78 50 61 74 68 6e 61 6d 65 20 2a   /* mxPathname *
29cf0 2f 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20 20  /.    0,        
29d00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 4e             /* pN
29d10 65 78 74 20 2a 2f 0a 20 20 20 20 22 77 69 6e 33  ext */.    "win3
29d20 32 2d 6c 6f 6e 67 70 61 74 68 22 2c 20 20 20 20  2-longpath",    
29d30 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 20 20  /* zName */.    
29d40 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
29d50 20 20 20 20 20 2f 2a 20 70 41 70 70 44 61 74 61       /* pAppData
29d60 20 2a 2f 0a 20 20 20 20 77 69 6e 4f 70 65 6e 2c   */.    winOpen,
29d70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29d80 78 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 77 69 6e  xOpen */.    win
29d90 44 65 6c 65 74 65 2c 20 20 20 20 20 20 20 20 20  Delete,         
29da0 20 20 2f 2a 20 78 44 65 6c 65 74 65 20 2a 2f 0a    /* xDelete */.
29db0 20 20 20 20 77 69 6e 41 63 63 65 73 73 2c 20 20      winAccess,  
29dc0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 41 63 63           /* xAcc
29dd0 65 73 73 20 2a 2f 0a 20 20 20 20 77 69 6e 46 75  ess */.    winFu
29de0 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 20 20 20 20  llPathname,     
29df0 2f 2a 20 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65  /* xFullPathname
29e00 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 4f 70 65   */.    winDlOpe
29e10 6e 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  n,           /* 
29e20 78 44 6c 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 77  xDlOpen */.    w
29e30 69 6e 44 6c 45 72 72 6f 72 2c 20 20 20 20 20 20  inDlError,      
29e40 20 20 20 20 2f 2a 20 78 44 6c 45 72 72 6f 72 20      /* xDlError 
29e50 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 53 79 6d 2c  */.    winDlSym,
29e60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
29e70 44 6c 53 79 6d 20 2a 2f 0a 20 20 20 20 77 69 6e  DlSym */.    win
29e80 44 6c 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20  DlClose,        
29e90 20 20 2f 2a 20 78 44 6c 43 6c 6f 73 65 20 2a 2f    /* xDlClose */
29ea0 0a 20 20 20 20 77 69 6e 52 61 6e 64 6f 6d 6e 65  .    winRandomne
29eb0 73 73 2c 20 20 20 20 20 20 20 2f 2a 20 78 52 61  ss,       /* xRa
29ec0 6e 64 6f 6d 6e 65 73 73 20 2a 2f 0a 20 20 20 20  ndomness */.    
29ed0 77 69 6e 53 6c 65 65 70 2c 20 20 20 20 20 20 20  winSleep,       
29ee0 20 20 20 20 20 2f 2a 20 78 53 6c 65 65 70 20 2a       /* xSleep *
29ef0 2f 0a 20 20 20 20 77 69 6e 43 75 72 72 65 6e 74  /.    winCurrent
29f00 54 69 6d 65 2c 20 20 20 20 20 20 2f 2a 20 78 43  Time,      /* xC
29f10 75 72 72 65 6e 74 54 69 6d 65 20 2a 2f 0a 20 20  urrentTime */.  
29f20 20 20 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f    winGetLastErro
29f30 72 2c 20 20 20 20 20 2f 2a 20 78 47 65 74 4c 61  r,     /* xGetLa
29f40 73 74 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20 77  stError */.    w
29f50 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74  inCurrentTimeInt
29f60 36 34 2c 20 2f 2a 20 78 43 75 72 72 65 6e 74 54  64, /* xCurrentT
29f70 69 6d 65 49 6e 74 36 34 20 2a 2f 0a 20 20 20 20  imeInt64 */.    
29f80 77 69 6e 53 65 74 53 79 73 74 65 6d 43 61 6c 6c  winSetSystemCall
29f90 2c 20 20 20 20 2f 2a 20 78 53 65 74 53 79 73 74  ,    /* xSetSyst
29fa0 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20 20 77 69  emCall */.    wi
29fb0 6e 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20  nGetSystemCall, 
29fc0 20 20 20 2f 2a 20 78 47 65 74 53 79 73 74 65 6d     /* xGetSystem
29fd0 43 61 6c 6c 20 2a 2f 0a 20 20 20 20 77 69 6e 4e  Call */.    winN
29fe0 65 78 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20  extSystemCall,  
29ff0 20 2f 2a 20 78 4e 65 78 74 53 79 73 74 65 6d 43   /* xNextSystemC
2a000 61 6c 6c 20 2a 2f 0a 20 20 7d 3b 0a 23 65 6e 64  all */.  };.#end
2a010 69 66 0a 0a 20 20 2f 2a 20 44 6f 75 62 6c 65 2d  if..  /* Double-
2a020 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 61  check that the a
2a030 53 79 73 63 61 6c 6c 5b 5d 20 61 72 72 61 79 20  Syscall[] array 
2a040 68 61 73 20 62 65 65 6e 20 63 6f 6e 73 74 72 75  has been constru
2a050 63 74 65 64 0a 20 20 2a 2a 20 63 6f 72 72 65 63  cted.  ** correc
2a060 74 6c 79 2e 20 20 53 65 65 20 74 69 63 6b 65 74  tly.  See ticket
2a070 20 5b 62 62 33 61 38 36 65 38 39 30 63 38 65 39   [bb3a86e890c8e9
2a080 36 61 62 5d 20 2a 2f 0a 20 20 61 73 73 65 72 74  6ab] */.  assert
2a090 28 20 41 72 72 61 79 53 69 7a 65 28 61 53 79 73  ( ArraySize(aSys
2a0a0 63 61 6c 6c 29 3d 3d 37 36 20 29 3b 0a 0a 20 20  call)==76 );..  
2a0b0 2f 2a 20 67 65 74 20 6d 65 6d 6f 72 79 20 6d 61  /* get memory ma
2a0c0 70 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 67 72 61  p allocation gra
2a0d0 6e 75 6c 61 72 69 74 79 20 2a 2f 0a 20 20 6d 65  nularity */.  me
2a0e0 6d 73 65 74 28 26 77 69 6e 53 79 73 49 6e 66 6f  mset(&winSysInfo
2a0f0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 53 59 53 54  , 0, sizeof(SYST
2a100 45 4d 5f 49 4e 46 4f 29 29 3b 0a 23 69 66 20 53  EM_INFO));.#if S
2a110 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
2a120 20 6f 73 47 65 74 4e 61 74 69 76 65 53 79 73 74   osGetNativeSyst
2a130 65 6d 49 6e 66 6f 28 26 77 69 6e 53 79 73 49 6e  emInfo(&winSysIn
2a140 66 6f 29 3b 0a 23 65 6c 73 65 0a 20 20 6f 73 47  fo);.#else.  osG
2a150 65 74 53 79 73 74 65 6d 49 6e 66 6f 28 26 77 69  etSystemInfo(&wi
2a160 6e 53 79 73 49 6e 66 6f 29 3b 0a 23 65 6e 64 69  nSysInfo);.#endi
2a170 66 0a 20 20 61 73 73 65 72 74 28 20 77 69 6e 53  f.  assert( winS
2a180 79 73 49 6e 66 6f 2e 64 77 41 6c 6c 6f 63 61 74  ysInfo.dwAllocat
2a190 69 6f 6e 47 72 61 6e 75 6c 61 72 69 74 79 3e 30  ionGranularity>0
2a1a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77 69   );.  assert( wi
2a1b0 6e 53 79 73 49 6e 66 6f 2e 64 77 50 61 67 65 53  nSysInfo.dwPageS
2a1c0 69 7a 65 3e 30 20 29 3b 0a 0a 20 20 73 71 6c 69  ize>0 );..  sqli
2a1d0 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72  te3_vfs_register
2a1e0 28 26 77 69 6e 56 66 73 2c 20 31 29 3b 0a 0a 23  (&winVfs, 1);..#
2a1f0 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
2a200 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45  E_WIN32_HAS_WIDE
2a210 29 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  ).  sqlite3_vfs_
2a220 72 65 67 69 73 74 65 72 28 26 77 69 6e 4c 6f 6e  register(&winLon
2a230 67 50 61 74 68 56 66 73 2c 20 30 29 3b 0a 23 65  gPathVfs, 0);.#e
2a240 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 53  ndif..  return S
2a250 51 4c 49 54 45 5f 4f 4b 3b 20 0a 7d 0a 0a 69 6e  QLITE_OK; .}..in
2a260 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f 65 6e 64  t sqlite3_os_end
2a270 28 76 6f 69 64 29 7b 20 0a 23 69 66 20 53 51 4c  (void){ .#if SQL
2a280 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 69  ITE_OS_WINRT.  i
2a290 66 28 20 73 6c 65 65 70 4f 62 6a 21 3d 4e 55 4c  f( sleepObj!=NUL
2a2a0 4c 20 29 7b 0a 20 20 20 20 6f 73 43 6c 6f 73 65  L ){.    osClose
2a2b0 48 61 6e 64 6c 65 28 73 6c 65 65 70 4f 62 6a 29  Handle(sleepObj)
2a2c0 3b 0a 20 20 20 20 73 6c 65 65 70 4f 62 6a 20 3d  ;.    sleepObj =
2a2d0 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 23 65 6e 64 69   NULL;.  }.#endi
2a2e0 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  f.  return SQLIT
2a2f0 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20  E_OK;.}..#endif 
2a300 2f 2a 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  /* SQLITE_OS_WIN
2a310 20 2a 2f 0a                                       */.