/ Hex Artifact Content
Login

Artifact 99a5668c207bee7fae238209a3043c03b6050056:


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 44  ->hHeap ){.    D
b120: 57 4f 52 44 20 64 77 49 6e 69 74 69 61 6c 53 69  WORD dwInitialSi
b130: 7a 65 20 3d 20 53 51 4c 49 54 45 5f 57 49 4e 33  ze = SQLITE_WIN3
b140: 32 5f 48 45 41 50 5f 49 4e 49 54 5f 53 49 5a 45  2_HEAP_INIT_SIZE
b150: 3b 0a 20 20 20 20 44 57 4f 52 44 20 64 77 4d 61  ;.    DWORD dwMa
b160: 78 69 6d 75 6d 53 69 7a 65 20 3d 20 28 44 57 4f  ximumSize = (DWO
b170: 52 44 29 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  RD)sqlite3Global
b180: 43 6f 6e 66 69 67 2e 6e 48 65 61 70 3b 0a 20 20  Config.nHeap;.  
b190: 20 20 69 66 28 20 64 77 4d 61 78 69 6d 75 6d 53    if( dwMaximumS
b1a0: 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ize==0 ){.      
b1b0: 64 77 4d 61 78 69 6d 75 6d 53 69 7a 65 20 3d 20  dwMaximumSize = 
b1c0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
b1d0: 50 5f 4d 41 58 5f 53 49 5a 45 3b 0a 20 20 20 20  P_MAX_SIZE;.    
b1e0: 7d 65 6c 73 65 20 69 66 28 20 64 77 49 6e 69 74  }else if( dwInit
b1f0: 69 61 6c 53 69 7a 65 3e 64 77 4d 61 78 69 6d 75  ialSize>dwMaximu
b200: 6d 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 64  mSize ){.      d
b210: 77 49 6e 69 74 69 61 6c 53 69 7a 65 20 3d 20 64  wInitialSize = d
b220: 77 4d 61 78 69 6d 75 6d 53 69 7a 65 3b 0a 20 20  wMaximumSize;.  
b230: 20 20 7d 0a 20 20 20 20 70 57 69 6e 4d 65 6d 44    }.    pWinMemD
b240: 61 74 61 2d 3e 68 48 65 61 70 20 3d 20 6f 73 48  ata->hHeap = osH
b250: 65 61 70 43 72 65 61 74 65 28 53 51 4c 49 54 45  eapCreate(SQLITE
b260: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47  _WIN32_HEAP_FLAG
b270: 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  S,.             
b280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b290: 20 20 20 20 20 20 20 20 20 64 77 49 6e 69 74 69           dwIniti
b2a0: 61 6c 53 69 7a 65 2c 20 64 77 4d 61 78 69 6d 75  alSize, dwMaximu
b2b0: 6d 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20  mSize);.    if( 
b2c0: 21 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48  !pWinMemData->hH
b2d0: 65 61 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  eap ){.      sql
b2e0: 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
b2f0: 4e 4f 4d 45 4d 2c 0a 20 20 20 20 20 20 20 20 20  NOMEM,.         
b300: 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65 61 70   "failed to Heap
b310: 43 72 65 61 74 65 20 28 25 6c 75 29 2c 20 66 6c  Create (%lu), fl
b320: 61 67 73 3d 25 75 2c 20 69 6e 69 74 53 69 7a 65  ags=%u, initSize
b330: 3d 25 6c 75 2c 20 6d 61 78 53 69 7a 65 3d 25 6c  =%lu, maxSize=%l
b340: 75 22 2c 0a 20 20 20 20 20 20 20 20 20 20 6f 73  u",.          os
b350: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20  GetLastError(), 
b360: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
b370: 50 5f 46 4c 41 47 53 2c 20 64 77 49 6e 69 74 69  P_FLAGS, dwIniti
b380: 61 6c 53 69 7a 65 2c 0a 20 20 20 20 20 20 20 20  alSize,.        
b390: 20 20 64 77 4d 61 78 69 6d 75 6d 53 69 7a 65 29    dwMaximumSize)
b3a0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
b3b0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
b3c0: 20 7d 0a 20 20 20 20 70 57 69 6e 4d 65 6d 44 61   }.    pWinMemDa
b3d0: 74 61 2d 3e 62 4f 77 6e 65 64 20 3d 20 54 52 55  ta->bOwned = TRU
b3e0: 45 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  E;.    assert( p
b3f0: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e  WinMemData->bOwn
b400: 65 64 20 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a  ed );.  }.#else.
b410: 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68    pWinMemData->h
b420: 48 65 61 70 20 3d 20 6f 73 47 65 74 50 72 6f 63  Heap = osGetProc
b430: 65 73 73 48 65 61 70 28 29 3b 0a 20 20 69 66 28  essHeap();.  if(
b440: 20 21 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68   !pWinMemData->h
b450: 48 65 61 70 20 29 7b 0a 20 20 20 20 73 71 6c 69  Heap ){.    sqli
b460: 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e  te3_log(SQLITE_N
b470: 4f 4d 45 4d 2c 0a 20 20 20 20 20 20 20 20 22 66  OMEM,.        "f
b480: 61 69 6c 65 64 20 74 6f 20 47 65 74 50 72 6f 63  ailed to GetProc
b490: 65 73 73 48 65 61 70 20 28 25 6c 75 29 22 2c 20  essHeap (%lu)", 
b4a0: 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
b4b0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
b4c0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
b4d0: 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62    pWinMemData->b
b4e0: 4f 77 6e 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20  Owned = FALSE;. 
b4f0: 20 61 73 73 65 72 74 28 20 21 70 57 69 6e 4d 65   assert( !pWinMe
b500: 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20 29 3b  mData->bOwned );
b510: 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74  .#endif.  assert
b520: 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68  ( pWinMemData->h
b530: 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61 73 73  Heap!=0 );.  ass
b540: 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61 74 61  ert( pWinMemData
b550: 2d 3e 68 48 65 61 70 21 3d 49 4e 56 41 4c 49 44  ->hHeap!=INVALID
b560: 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b  _HANDLE_VALUE );
b570: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
b580: 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64  WINRT && defined
b590: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41  (SQLITE_WIN32_MA
b5a0: 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a 20  LLOC_VALIDATE). 
b5b0: 20 61 73 73 65 72 74 28 20 6f 73 48 65 61 70 56   assert( osHeapV
b5c0: 61 6c 69 64 61 74 65 28 70 57 69 6e 4d 65 6d 44  alidate(pWinMemD
b5d0: 61 74 61 2d 3e 68 48 65 61 70 2c 20 53 51 4c 49  ata->hHeap, SQLI
b5e0: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c  TE_WIN32_HEAP_FL
b5f0: 41 47 53 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23 65  AGS, NULL) );.#e
b600: 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51  ndif.  return SQ
b610: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
b620: 2a 20 44 65 69 6e 69 74 69 61 6c 69 7a 65 20 74  * Deinitialize t
b630: 68 69 73 20 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a 73  his module..*/.s
b640: 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 4d 65  tatic void winMe
b650: 6d 53 68 75 74 64 6f 77 6e 28 76 6f 69 64 20 2a  mShutdown(void *
b660: 70 41 70 70 44 61 74 61 29 7b 0a 20 20 77 69 6e  pAppData){.  win
b670: 4d 65 6d 44 61 74 61 20 2a 70 57 69 6e 4d 65 6d  MemData *pWinMem
b680: 44 61 74 61 20 3d 20 28 77 69 6e 4d 65 6d 44 61  Data = (winMemDa
b690: 74 61 20 2a 29 70 41 70 70 44 61 74 61 3b 0a 0a  ta *)pAppData;..
b6a0: 20 20 69 66 28 20 21 70 57 69 6e 4d 65 6d 44 61    if( !pWinMemDa
b6b0: 74 61 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61  ta ) return;.  a
b6c0: 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61  ssert( pWinMemDa
b6d0: 74 61 2d 3e 6d 61 67 69 63 31 3d 3d 57 49 4e 4d  ta->magic1==WINM
b6e0: 45 4d 5f 4d 41 47 49 43 31 20 29 3b 0a 20 20 61  EM_MAGIC1 );.  a
b6f0: 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61  ssert( pWinMemDa
b700: 74 61 2d 3e 6d 61 67 69 63 32 3d 3d 57 49 4e 4d  ta->magic2==WINM
b710: 45 4d 5f 4d 41 47 49 43 32 20 29 3b 0a 0a 20 20  EM_MAGIC2 );..  
b720: 69 66 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d  if( pWinMemData-
b730: 3e 68 48 65 61 70 20 29 7b 0a 20 20 20 20 61 73  >hHeap ){.    as
b740: 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61 74  sert( pWinMemDat
b750: 61 2d 3e 68 48 65 61 70 21 3d 49 4e 56 41 4c 49  a->hHeap!=INVALI
b760: 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29  D_HANDLE_VALUE )
b770: 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ;.#if !SQLITE_OS
b780: 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65  _WINRT && define
b790: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d  d(SQLITE_WIN32_M
b7a0: 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a  ALLOC_VALIDATE).
b7b0: 20 20 20 20 61 73 73 65 72 74 28 20 6f 73 48 65      assert( osHe
b7c0: 61 70 56 61 6c 69 64 61 74 65 28 70 57 69 6e 4d  apValidate(pWinM
b7d0: 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 2c 20 53  emData->hHeap, S
b7e0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
b7f0: 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c 29 20 29 3b  _FLAGS, NULL) );
b800: 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
b810: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f 77  pWinMemData->bOw
b820: 6e 65 64 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ned ){.      if(
b830: 20 21 6f 73 48 65 61 70 44 65 73 74 72 6f 79 28   !osHeapDestroy(
b840: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65  pWinMemData->hHe
b850: 61 70 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ap) ){.        s
b860: 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
b870: 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64  E_NOMEM, "failed
b880: 20 74 6f 20 48 65 61 70 44 65 73 74 72 6f 79 20   to HeapDestroy 
b890: 28 25 6c 75 29 2c 20 68 65 61 70 3d 25 70 22 2c  (%lu), heap=%p",
b8a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b8b0: 20 20 20 20 20 6f 73 47 65 74 4c 61 73 74 45 72       osGetLastEr
b8c0: 72 6f 72 28 29 2c 20 28 76 6f 69 64 2a 29 70 57  ror(), (void*)pW
b8d0: 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70  inMemData->hHeap
b8e0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
b8f0: 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f   pWinMemData->bO
b900: 77 6e 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20  wned = FALSE;.  
b910: 20 20 7d 0a 20 20 20 20 70 57 69 6e 4d 65 6d 44    }.    pWinMemD
b920: 61 74 61 2d 3e 68 48 65 61 70 20 3d 20 4e 55 4c  ata->hHeap = NUL
b930: 4c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  L;.  }.}../*.** 
b940: 50 6f 70 75 6c 61 74 65 20 74 68 65 20 6c 6f 77  Populate the low
b950: 2d 6c 65 76 65 6c 20 6d 65 6d 6f 72 79 20 61 6c  -level memory al
b960: 6c 6f 63 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f  location functio
b970: 6e 20 70 6f 69 6e 74 65 72 73 20 69 6e 0a 2a 2a  n pointers in.**
b980: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
b990: 6e 66 69 67 2e 6d 20 77 69 74 68 20 70 6f 69 6e  nfig.m with poin
b9a0: 74 65 72 73 20 74 6f 20 74 68 65 20 72 6f 75 74  ters to the rout
b9b0: 69 6e 65 73 20 69 6e 20 74 68 69 73 20 66 69 6c  ines in this fil
b9c0: 65 2e 20 54 68 65 0a 2a 2a 20 61 72 67 75 6d 65  e. The.** argume
b9d0: 6e 74 73 20 73 70 65 63 69 66 79 20 74 68 65 20  nts specify the 
b9e0: 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72 79 20  block of memory 
b9f0: 74 6f 20 6d 61 6e 61 67 65 2e 0a 2a 2a 0a 2a 2a  to manage..**.**
ba00: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
ba10: 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62 79 20   only called by 
ba20: 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 29  sqlite3_config()
ba30: 2c 20 61 6e 64 20 74 68 65 72 65 66 6f 72 65 0a  , and therefore.
ba40: 2a 2a 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72  ** is not requir
ba50: 65 64 20 74 6f 20 62 65 20 74 68 72 65 61 64 73  ed to be threads
ba60: 61 66 65 20 28 69 74 20 69 73 20 6e 6f 74 29 2e  afe (it is not).
ba70: 0a 2a 2f 0a 63 6f 6e 73 74 20 73 71 6c 69 74 65  .*/.const sqlite
ba80: 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 2a 73  3_mem_methods *s
ba90: 71 6c 69 74 65 33 4d 65 6d 47 65 74 57 69 6e 33  qlite3MemGetWin3
baa0: 32 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69  2(void){.  stati
bab0: 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  c const sqlite3_
bac0: 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 77 69 6e 4d  mem_methods winM
bad0: 65 6d 4d 65 74 68 6f 64 73 20 3d 20 7b 0a 20 20  emMethods = {.  
bae0: 20 20 77 69 6e 4d 65 6d 4d 61 6c 6c 6f 63 2c 0a    winMemMalloc,.
baf0: 20 20 20 20 77 69 6e 4d 65 6d 46 72 65 65 2c 0a      winMemFree,.
bb00: 20 20 20 20 77 69 6e 4d 65 6d 52 65 61 6c 6c 6f      winMemReallo
bb10: 63 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 53 69 7a  c,.    winMemSiz
bb20: 65 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 52 6f 75  e,.    winMemRou
bb30: 6e 64 75 70 2c 0a 20 20 20 20 77 69 6e 4d 65 6d  ndup,.    winMem
bb40: 49 6e 69 74 2c 0a 20 20 20 20 77 69 6e 4d 65 6d  Init,.    winMem
bb50: 53 68 75 74 64 6f 77 6e 2c 0a 20 20 20 20 26 77  Shutdown,.    &w
bb60: 69 6e 5f 6d 65 6d 5f 64 61 74 61 0a 20 20 7d 3b  in_mem_data.  };
bb70: 0a 20 20 72 65 74 75 72 6e 20 26 77 69 6e 4d 65  .  return &winMe
bb80: 6d 4d 65 74 68 6f 64 73 3b 0a 7d 0a 0a 76 6f 69  mMethods;.}..voi
bb90: 64 20 73 71 6c 69 74 65 33 4d 65 6d 53 65 74 44  d sqlite3MemSetD
bba0: 65 66 61 75 6c 74 28 76 6f 69 64 29 7b 0a 20 20  efault(void){.  
bbb0: 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53  sqlite3_config(S
bbc0: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 41 4c  QLITE_CONFIG_MAL
bbd0: 4c 4f 43 2c 20 73 71 6c 69 74 65 33 4d 65 6d 47  LOC, sqlite3MemG
bbe0: 65 74 57 69 6e 33 32 28 29 29 3b 0a 7d 0a 23 65  etWin32());.}.#e
bbf0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 57  ndif /* SQLITE_W
bc00: 49 4e 33 32 5f 4d 41 4c 4c 4f 43 20 2a 2f 0a 0a  IN32_MALLOC */..
bc10: 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20  /*.** Convert a 
bc20: 55 54 46 2d 38 20 73 74 72 69 6e 67 20 74 6f 20  UTF-8 string to 
bc30: 4d 69 63 72 6f 73 6f 66 74 20 55 6e 69 63 6f 64  Microsoft Unicod
bc40: 65 20 28 55 54 46 2d 31 36 3f 29 2e 20 0a 2a 2a  e (UTF-16?). .**
bc50: 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  .** Space to hol
bc60: 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73  d the returned s
bc70: 74 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65  tring is obtaine
bc80: 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 0a 2a  d from malloc..*
bc90: 2f 0a 73 74 61 74 69 63 20 4c 50 57 53 54 52 20  /.static LPWSTR 
bca0: 77 69 6e 55 74 66 38 54 6f 55 6e 69 63 6f 64 65  winUtf8ToUnicode
bcb0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69  (const char *zFi
bcc0: 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 6e  lename){.  int n
bcd0: 43 68 61 72 3b 0a 20 20 4c 50 57 53 54 52 20 7a  Char;.  LPWSTR z
bce0: 57 69 64 65 46 69 6c 65 6e 61 6d 65 3b 0a 0a 20  WideFilename;.. 
bcf0: 20 6e 43 68 61 72 20 3d 20 6f 73 4d 75 6c 74 69   nChar = osMulti
bd00: 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 28 43  ByteToWideChar(C
bd10: 50 5f 55 54 46 38 2c 20 30 2c 20 7a 46 69 6c 65  P_UTF8, 0, zFile
bd20: 6e 61 6d 65 2c 20 2d 31 2c 20 4e 55 4c 4c 2c 20  name, -1, NULL, 
bd30: 30 29 3b 0a 20 20 69 66 28 20 6e 43 68 61 72 3d  0);.  if( nChar=
bd40: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
bd50: 20 30 3b 0a 20 20 7d 0a 20 20 7a 57 69 64 65 46   0;.  }.  zWideF
bd60: 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ilename = sqlite
bd70: 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 43 68  3MallocZero( nCh
bd80: 61 72 2a 73 69 7a 65 6f 66 28 7a 57 69 64 65 46  ar*sizeof(zWideF
bd90: 69 6c 65 6e 61 6d 65 5b 30 5d 29 20 29 3b 0a 20  ilename[0]) );. 
bda0: 20 69 66 28 20 7a 57 69 64 65 46 69 6c 65 6e 61   if( zWideFilena
bdb0: 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  me==0 ){.    ret
bdc0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 43 68  urn 0;.  }.  nCh
bdd0: 61 72 20 3d 20 6f 73 4d 75 6c 74 69 42 79 74 65  ar = osMultiByte
bde0: 54 6f 57 69 64 65 43 68 61 72 28 43 50 5f 55 54  ToWideChar(CP_UT
bdf0: 46 38 2c 20 30 2c 20 7a 46 69 6c 65 6e 61 6d 65  F8, 0, zFilename
be00: 2c 20 2d 31 2c 20 7a 57 69 64 65 46 69 6c 65 6e  , -1, zWideFilen
be10: 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
be20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be30: 20 20 20 20 20 6e 43 68 61 72 29 3b 0a 20 20 69       nChar);.  i
be40: 66 28 20 6e 43 68 61 72 3d 3d 30 20 29 7b 0a 20  f( nChar==0 ){. 
be50: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
be60: 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 29 3b 0a  zWideFilename);.
be70: 20 20 20 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d      zWideFilenam
be80: 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  e = 0;.  }.  ret
be90: 75 72 6e 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d  urn zWideFilenam
bea0: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76  e;.}../*.** Conv
beb0: 65 72 74 20 4d 69 63 72 6f 73 6f 66 74 20 55 6e  ert Microsoft Un
bec0: 69 63 6f 64 65 20 74 6f 20 55 54 46 2d 38 2e 20  icode to UTF-8. 
bed0: 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74   Space to hold t
bee0: 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69  he returned stri
bef0: 6e 67 20 69 73 0a 2a 2a 20 6f 62 74 61 69 6e 65  ng is.** obtaine
bf00: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d  d from sqlite3_m
bf10: 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61 74  alloc()..*/.stat
bf20: 69 63 20 63 68 61 72 20 2a 77 69 6e 55 6e 69 63  ic char *winUnic
bf30: 6f 64 65 54 6f 55 74 66 38 28 4c 50 43 57 53 54  odeToUtf8(LPCWST
bf40: 52 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 29  R zWideFilename)
bf50: 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20  {.  int nByte;. 
bf60: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
bf70: 3b 0a 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73 57  ;..  nByte = osW
bf80: 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79  ideCharToMultiBy
bf90: 74 65 28 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a  te(CP_UTF8, 0, z
bfa0: 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c 20 2d 31  WideFilename, -1
bfb0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  , 0, 0, 0, 0);. 
bfc0: 20 69 66 28 20 6e 42 79 74 65 20 3d 3d 20 30 20   if( nByte == 0 
bfd0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
bfe0: 0a 20 20 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d 65  .  }.  zFilename
bff0: 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
c000: 5a 65 72 6f 28 20 6e 42 79 74 65 20 29 3b 0a 20  Zero( nByte );. 
c010: 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d   if( zFilename==
c020: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
c030: 30 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d  0;.  }.  nByte =
c040: 20 6f 73 57 69 64 65 43 68 61 72 54 6f 4d 75 6c   osWideCharToMul
c050: 74 69 42 79 74 65 28 43 50 5f 55 54 46 38 2c 20  tiByte(CP_UTF8, 
c060: 30 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65  0, zWideFilename
c070: 2c 20 2d 31 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  , -1, zFilename,
c080: 20 6e 42 79 74 65 2c 0a 20 20 20 20 20 20 20 20   nByte,.        
c090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c0a0: 20 20 20 20 20 20 20 20 30 2c 20 30 29 3b 0a 20          0, 0);. 
c0b0: 20 69 66 28 20 6e 42 79 74 65 20 3d 3d 20 30 20   if( nByte == 0 
c0c0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
c0d0: 72 65 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  ree(zFilename);.
c0e0: 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20      zFilename = 
c0f0: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
c100: 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a  zFilename;.}../*
c110: 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 6e 20 41  .** Convert an A
c120: 4e 53 49 20 73 74 72 69 6e 67 20 74 6f 20 4d 69  NSI string to Mi
c130: 63 72 6f 73 6f 66 74 20 55 6e 69 63 6f 64 65 2c  crosoft Unicode,
c140: 20 62 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a   based on the.**
c150: 20 63 75 72 72 65 6e 74 20 63 6f 64 65 70 61 67   current codepag
c160: 65 20 73 65 74 74 69 6e 67 73 20 66 6f 72 20 66  e settings for f
c170: 69 6c 65 20 61 70 69 73 2e 0a 2a 2a 20 0a 2a 2a  ile apis..** .**
c180: 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74   Space to hold t
c190: 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69  he returned stri
c1a0: 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a  ng is obtained.*
c1b0: 2a 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d  * from sqlite3_m
c1c0: 61 6c 6c 6f 63 2e 0a 2a 2f 0a 73 74 61 74 69 63  alloc..*/.static
c1d0: 20 4c 50 57 53 54 52 20 77 69 6e 4d 62 63 73 54   LPWSTR winMbcsT
c1e0: 6f 55 6e 69 63 6f 64 65 28 63 6f 6e 73 74 20 63  oUnicode(const c
c1f0: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b  har *zFilename){
c200: 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20  .  int nByte;.  
c210: 4c 50 57 53 54 52 20 7a 4d 62 63 73 46 69 6c 65  LPWSTR zMbcsFile
c220: 6e 61 6d 65 3b 0a 20 20 69 6e 74 20 63 6f 64 65  name;.  int code
c230: 70 61 67 65 20 3d 20 6f 73 41 72 65 46 69 6c 65  page = osAreFile
c240: 41 70 69 73 41 4e 53 49 28 29 20 3f 20 43 50 5f  ApisANSI() ? CP_
c250: 41 43 50 20 3a 20 43 50 5f 4f 45 4d 43 50 3b 0a  ACP : CP_OEMCP;.
c260: 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73 4d 75 6c  .  nByte = osMul
c270: 74 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 72  tiByteToWideChar
c280: 28 63 6f 64 65 70 61 67 65 2c 20 30 2c 20 7a 46  (codepage, 0, zF
c290: 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 4e 55 4c  ilename, -1, NUL
c2a0: 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  L,.             
c2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c2c0: 20 20 20 30 29 2a 73 69 7a 65 6f 66 28 57 43 48     0)*sizeof(WCH
c2d0: 41 52 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65  AR);.  if( nByte
c2e0: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
c2f0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 4d 62 63 73  n 0;.  }.  zMbcs
c300: 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74  Filename = sqlit
c310: 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42  e3MallocZero( nB
c320: 79 74 65 2a 73 69 7a 65 6f 66 28 7a 4d 62 63 73  yte*sizeof(zMbcs
c330: 46 69 6c 65 6e 61 6d 65 5b 30 5d 29 20 29 3b 0a  Filename[0]) );.
c340: 20 20 69 66 28 20 7a 4d 62 63 73 46 69 6c 65 6e    if( zMbcsFilen
c350: 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ame==0 ){.    re
c360: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 42  turn 0;.  }.  nB
c370: 79 74 65 20 3d 20 6f 73 4d 75 6c 74 69 42 79 74  yte = osMultiByt
c380: 65 54 6f 57 69 64 65 43 68 61 72 28 63 6f 64 65  eToWideChar(code
c390: 70 61 67 65 2c 20 30 2c 20 7a 46 69 6c 65 6e 61  page, 0, zFilena
c3a0: 6d 65 2c 20 2d 31 2c 20 7a 4d 62 63 73 46 69 6c  me, -1, zMbcsFil
c3b0: 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20  ename,.         
c3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c3d0: 20 20 20 20 20 20 20 6e 42 79 74 65 29 3b 0a 20         nByte);. 
c3e0: 20 69 66 28 20 6e 42 79 74 65 3d 3d 30 20 29 7b   if( nByte==0 ){
c3f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
c400: 65 28 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 29  e(zMbcsFilename)
c410: 3b 0a 20 20 20 20 7a 4d 62 63 73 46 69 6c 65 6e  ;.    zMbcsFilen
c420: 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  ame = 0;.  }.  r
c430: 65 74 75 72 6e 20 7a 4d 62 63 73 46 69 6c 65 6e  eturn zMbcsFilen
c440: 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  ame;.}../*.** Co
c450: 6e 76 65 72 74 20 4d 69 63 72 6f 73 6f 66 74 20  nvert Microsoft 
c460: 55 6e 69 63 6f 64 65 20 74 6f 20 6d 75 6c 74 69  Unicode to multi
c470: 2d 62 79 74 65 20 63 68 61 72 61 63 74 65 72 20  -byte character 
c480: 73 74 72 69 6e 67 2c 20 62 61 73 65 64 20 6f 6e  string, based on
c490: 20 74 68 65 0a 2a 2a 20 75 73 65 72 27 73 20 41   the.** user's A
c4a0: 4e 53 49 20 63 6f 64 65 70 61 67 65 2e 0a 2a 2a  NSI codepage..**
c4b0: 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  .** Space to hol
c4c0: 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73  d the returned s
c4d0: 74 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65  tring is obtaine
c4e0: 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65  d from.** sqlite
c4f0: 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 73  3_malloc()..*/.s
c500: 74 61 74 69 63 20 63 68 61 72 20 2a 77 69 6e 55  tatic char *winU
c510: 6e 69 63 6f 64 65 54 6f 4d 62 63 73 28 4c 50 43  nicodeToMbcs(LPC
c520: 57 53 54 52 20 7a 57 69 64 65 46 69 6c 65 6e 61  WSTR zWideFilena
c530: 6d 65 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65  me){.  int nByte
c540: 3b 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  ;.  char *zFilen
c550: 61 6d 65 3b 0a 20 20 69 6e 74 20 63 6f 64 65 70  ame;.  int codep
c560: 61 67 65 20 3d 20 6f 73 41 72 65 46 69 6c 65 41  age = osAreFileA
c570: 70 69 73 41 4e 53 49 28 29 20 3f 20 43 50 5f 41  pisANSI() ? CP_A
c580: 43 50 20 3a 20 43 50 5f 4f 45 4d 43 50 3b 0a 0a  CP : CP_OEMCP;..
c590: 20 20 6e 42 79 74 65 20 3d 20 6f 73 57 69 64 65    nByte = osWide
c5a0: 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 28  CharToMultiByte(
c5b0: 63 6f 64 65 70 61 67 65 2c 20 30 2c 20 7a 57 69  codepage, 0, zWi
c5c0: 64 65 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20  deFilename, -1, 
c5d0: 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 69  0, 0, 0, 0);.  i
c5e0: 66 28 20 6e 42 79 74 65 20 3d 3d 20 30 20 29 7b  f( nByte == 0 ){
c5f0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
c600: 20 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d   }.  zFilename =
c610: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
c620: 72 6f 28 20 6e 42 79 74 65 20 29 3b 0a 20 20 69  ro( nByte );.  i
c630: 66 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20  f( zFilename==0 
c640: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
c650: 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20 6f  .  }.  nByte = o
c660: 73 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69  sWideCharToMulti
c670: 42 79 74 65 28 63 6f 64 65 70 61 67 65 2c 20 30  Byte(codepage, 0
c680: 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c  , zWideFilename,
c690: 20 2d 31 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a   -1, zFilename,.
c6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c6c0: 6e 42 79 74 65 2c 20 30 2c 20 30 29 3b 0a 20 20  nByte, 0, 0);.  
c6d0: 69 66 28 20 6e 42 79 74 65 20 3d 3d 20 30 20 29  if( nByte == 0 )
c6e0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
c6f0: 65 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  ee(zFilename);. 
c700: 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 30     zFilename = 0
c710: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ;.  }.  return z
c720: 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a  Filename;.}../*.
c730: 2a 2a 20 43 6f 6e 76 65 72 74 20 6d 75 6c 74 69  ** Convert multi
c740: 62 79 74 65 20 63 68 61 72 61 63 74 65 72 20 73  byte character s
c750: 74 72 69 6e 67 20 74 6f 20 55 54 46 2d 38 2e 20  tring to UTF-8. 
c760: 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74   Space to hold t
c770: 68 65 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 73  he.** returned s
c780: 74 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65  tring is obtaine
c790: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d  d from sqlite3_m
c7a0: 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 63 68 61 72  alloc()..*/.char
c7b0: 20 2a 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f   *sqlite3_win32_
c7c0: 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28 63 6f 6e  mbcs_to_utf8(con
c7d0: 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
c7e0: 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 46 69  me){.  char *zFi
c7f0: 6c 65 6e 61 6d 65 55 74 66 38 3b 0a 20 20 4c 50  lenameUtf8;.  LP
c800: 57 53 54 52 20 7a 54 6d 70 57 69 64 65 3b 0a 0a  WSTR zTmpWide;..
c810: 20 20 7a 54 6d 70 57 69 64 65 20 3d 20 77 69 6e    zTmpWide = win
c820: 4d 62 63 73 54 6f 55 6e 69 63 6f 64 65 28 7a 46  MbcsToUnicode(zF
c830: 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ilename);.  if( 
c840: 7a 54 6d 70 57 69 64 65 3d 3d 30 20 29 7b 0a 20  zTmpWide==0 ){. 
c850: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
c860: 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 55 74 66 38  .  zFilenameUtf8
c870: 20 3d 20 77 69 6e 55 6e 69 63 6f 64 65 54 6f 55   = winUnicodeToU
c880: 74 66 38 28 7a 54 6d 70 57 69 64 65 29 3b 0a 20  tf8(zTmpWide);. 
c890: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54   sqlite3_free(zT
c8a0: 6d 70 57 69 64 65 29 3b 0a 20 20 72 65 74 75 72  mpWide);.  retur
c8b0: 6e 20 7a 46 69 6c 65 6e 61 6d 65 55 74 66 38 3b  n zFilenameUtf8;
c8c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  .}../*.** Conver
c8d0: 74 20 55 54 46 2d 38 20 74 6f 20 6d 75 6c 74 69  t UTF-8 to multi
c8e0: 62 79 74 65 20 63 68 61 72 61 63 74 65 72 20 73  byte character s
c8f0: 74 72 69 6e 67 2e 20 20 53 70 61 63 65 20 74 6f  tring.  Space to
c900: 20 68 6f 6c 64 20 74 68 65 20 0a 2a 2a 20 72 65   hold the .** re
c910: 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73  turned string is
c920: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
c930: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e  qlite3_malloc().
c940: 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65  .*/.char *sqlite
c950: 33 5f 77 69 6e 33 32 5f 75 74 66 38 5f 74 6f 5f  3_win32_utf8_to_
c960: 6d 62 63 73 28 63 6f 6e 73 74 20 63 68 61 72 20  mbcs(const char 
c970: 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 63  *zFilename){.  c
c980: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 4d 62  har *zFilenameMb
c990: 63 73 3b 0a 20 20 4c 50 57 53 54 52 20 7a 54 6d  cs;.  LPWSTR zTm
c9a0: 70 57 69 64 65 3b 0a 0a 20 20 7a 54 6d 70 57 69  pWide;..  zTmpWi
c9b0: 64 65 20 3d 20 77 69 6e 55 74 66 38 54 6f 55 6e  de = winUtf8ToUn
c9c0: 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29  icode(zFilename)
c9d0: 3b 0a 20 20 69 66 28 20 7a 54 6d 70 57 69 64 65  ;.  if( zTmpWide
c9e0: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
c9f0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c 65  n 0;.  }.  zFile
ca00: 6e 61 6d 65 4d 62 63 73 20 3d 20 77 69 6e 55 6e  nameMbcs = winUn
ca10: 69 63 6f 64 65 54 6f 4d 62 63 73 28 7a 54 6d 70  icodeToMbcs(zTmp
ca20: 57 69 64 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Wide);.  sqlite3
ca30: 5f 66 72 65 65 28 7a 54 6d 70 57 69 64 65 29 3b  _free(zTmpWide);
ca40: 0a 20 20 72 65 74 75 72 6e 20 7a 46 69 6c 65 6e  .  return zFilen
ca50: 61 6d 65 4d 62 63 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  ameMbcs;.}../*.*
ca60: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
ca70: 73 65 74 73 20 74 68 65 20 64 61 74 61 20 64 69  sets the data di
ca80: 72 65 63 74 6f 72 79 20 6f 72 20 74 68 65 20 74  rectory or the t
ca90: 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f  emporary directo
caa0: 72 79 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 74  ry based on.** t
cab0: 68 65 20 70 72 6f 76 69 64 65 64 20 61 72 67 75  he provided argu
cac0: 6d 65 6e 74 73 2e 20 20 54 68 65 20 74 79 70 65  ments.  The type
cad0: 20 61 72 67 75 6d 65 6e 74 20 6d 75 73 74 20 62   argument must b
cae0: 65 20 31 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  e 1 in order to 
caf0: 73 65 74 20 74 68 65 0a 2a 2a 20 64 61 74 61 20  set the.** data 
cb00: 64 69 72 65 63 74 6f 72 79 20 6f 72 20 32 20 69  directory or 2 i
cb10: 6e 20 6f 72 64 65 72 20 74 6f 20 73 65 74 20 74  n order to set t
cb20: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72  he temporary dir
cb30: 65 63 74 6f 72 79 2e 20 20 54 68 65 20 7a 56 61  ectory.  The zVa
cb40: 6c 75 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20  lue.** argument 
cb50: 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  is the name of t
cb60: 68 65 20 64 69 72 65 63 74 6f 72 79 20 74 6f 20  he directory to 
cb70: 75 73 65 2e 20 20 54 68 65 20 72 65 74 75 72 6e  use.  The return
cb80: 20 76 61 6c 75 65 20 77 69 6c 6c 20 62 65 0a 2a   value will be.*
cb90: 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73  * SQLITE_OK if s
cba0: 75 63 63 65 73 73 66 75 6c 2e 0a 2a 2f 0a 69 6e  uccessful..*/.in
cbb0: 74 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  t sqlite3_win32_
cbc0: 73 65 74 5f 64 69 72 65 63 74 6f 72 79 28 44 57  set_directory(DW
cbd0: 4f 52 44 20 74 79 70 65 2c 20 4c 50 43 57 53 54  ORD type, LPCWST
cbe0: 52 20 7a 56 61 6c 75 65 29 7b 0a 20 20 63 68 61  R zValue){.  cha
cbf0: 72 20 2a 2a 70 70 44 69 72 65 63 74 6f 72 79 20  r **ppDirectory 
cc00: 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 0;.#ifndef SQL
cc10: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49  ITE_OMIT_AUTOINI
cc20: 54 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c  T.  int rc = sql
cc30: 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28  ite3_initialize(
cc40: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
cc50: 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a  turn rc;.#endif.
cc60: 20 20 69 66 28 20 74 79 70 65 3d 3d 53 51 4c 49    if( type==SQLI
cc70: 54 45 5f 57 49 4e 33 32 5f 44 41 54 41 5f 44 49  TE_WIN32_DATA_DI
cc80: 52 45 43 54 4f 52 59 5f 54 59 50 45 20 29 7b 0a  RECTORY_TYPE ){.
cc90: 20 20 20 20 70 70 44 69 72 65 63 74 6f 72 79 20      ppDirectory 
cca0: 3d 20 26 73 71 6c 69 74 65 33 5f 64 61 74 61 5f  = &sqlite3_data_
ccb0: 64 69 72 65 63 74 6f 72 79 3b 0a 20 20 7d 65 6c  directory;.  }el
ccc0: 73 65 20 69 66 28 20 74 79 70 65 3d 3d 53 51 4c  se if( type==SQL
ccd0: 49 54 45 5f 57 49 4e 33 32 5f 54 45 4d 50 5f 44  ITE_WIN32_TEMP_D
cce0: 49 52 45 43 54 4f 52 59 5f 54 59 50 45 20 29 7b  IRECTORY_TYPE ){
ccf0: 0a 20 20 20 20 70 70 44 69 72 65 63 74 6f 72 79  .    ppDirectory
cd00: 20 3d 20 26 73 71 6c 69 74 65 33 5f 74 65 6d 70   = &sqlite3_temp
cd10: 5f 64 69 72 65 63 74 6f 72 79 3b 0a 20 20 7d 0a  _directory;.  }.
cd20: 20 20 61 73 73 65 72 74 28 20 21 70 70 44 69 72    assert( !ppDir
cd30: 65 63 74 6f 72 79 20 7c 7c 20 74 79 70 65 3d 3d  ectory || type==
cd40: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 41 54  SQLITE_WIN32_DAT
cd50: 41 5f 44 49 52 45 43 54 4f 52 59 5f 54 59 50 45  A_DIRECTORY_TYPE
cd60: 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 74 79  .          || ty
cd70: 70 65 3d 3d 53 51 4c 49 54 45 5f 57 49 4e 33 32  pe==SQLITE_WIN32
cd80: 5f 54 45 4d 50 5f 44 49 52 45 43 54 4f 52 59 5f  _TEMP_DIRECTORY_
cd90: 54 59 50 45 0a 20 20 29 3b 0a 20 20 61 73 73 65  TYPE.  );.  asse
cda0: 72 74 28 20 21 70 70 44 69 72 65 63 74 6f 72 79  rt( !ppDirectory
cdb0: 20 7c 7c 20 73 71 6c 69 74 65 33 4d 65 6d 64 65   || sqlite3Memde
cdc0: 62 75 67 48 61 73 54 79 70 65 28 2a 70 70 44 69  bugHasType(*ppDi
cdd0: 72 65 63 74 6f 72 79 2c 20 4d 45 4d 54 59 50 45  rectory, MEMTYPE
cde0: 5f 48 45 41 50 29 20 29 3b 0a 20 20 69 66 28 20  _HEAP) );.  if( 
cdf0: 70 70 44 69 72 65 63 74 6f 72 79 20 29 7b 0a 20  ppDirectory ){. 
ce00: 20 20 20 63 68 61 72 20 2a 7a 56 61 6c 75 65 55     char *zValueU
ce10: 74 66 38 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  tf8 = 0;.    if(
ce20: 20 7a 56 61 6c 75 65 20 26 26 20 7a 56 61 6c 75   zValue && zValu
ce30: 65 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 7a 56  e[0] ){.      zV
ce40: 61 6c 75 65 55 74 66 38 20 3d 20 77 69 6e 55 6e  alueUtf8 = winUn
ce50: 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 56 61 6c  icodeToUtf8(zVal
ce60: 75 65 29 3b 0a 20 20 20 20 20 20 69 66 20 28 20  ue);.      if ( 
ce70: 7a 56 61 6c 75 65 55 74 66 38 3d 3d 30 20 29 7b  zValueUtf8==0 ){
ce80: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
ce90: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
cea0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
ceb0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 2a 70 70  sqlite3_free(*pp
cec0: 44 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 20 20  Directory);.    
ced0: 2a 70 70 44 69 72 65 63 74 6f 72 79 20 3d 20 7a  *ppDirectory = z
cee0: 56 61 6c 75 65 55 74 66 38 3b 0a 20 20 20 20 72  ValueUtf8;.    r
cef0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
cf00: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
cf10: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f  LITE_ERROR;.}../
cf20: 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20  *.** The return 
cf30: 76 61 6c 75 65 20 6f 66 20 77 69 6e 47 65 74 4c  value of winGetL
cf40: 61 73 74 45 72 72 6f 72 4d 73 67 0a 2a 2a 20 69  astErrorMsg.** i
cf50: 73 20 7a 65 72 6f 20 69 66 20 74 68 65 20 65 72  s zero if the er
cf60: 72 6f 72 20 6d 65 73 73 61 67 65 20 66 69 74 73  ror message fits
cf70: 20 69 6e 20 74 68 65 20 62 75 66 66 65 72 2c 20   in the buffer, 
cf80: 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20 6f  or non-zero.** o
cf90: 74 68 65 72 77 69 73 65 20 28 69 66 20 74 68 65  therwise (if the
cfa0: 20 6d 65 73 73 61 67 65 20 77 61 73 20 74 72 75   message was tru
cfb0: 6e 63 61 74 65 64 29 2e 0a 2a 2f 0a 73 74 61 74  ncated)..*/.stat
cfc0: 69 63 20 69 6e 74 20 77 69 6e 47 65 74 4c 61 73  ic int winGetLas
cfd0: 74 45 72 72 6f 72 4d 73 67 28 44 57 4f 52 44 20  tErrorMsg(DWORD 
cfe0: 6c 61 73 74 45 72 72 6e 6f 2c 20 69 6e 74 20 6e  lastErrno, int n
cff0: 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29  Buf, char *zBuf)
d000: 7b 0a 20 20 2f 2a 20 46 6f 72 6d 61 74 4d 65 73  {.  /* FormatMes
d010: 73 61 67 65 20 72 65 74 75 72 6e 73 20 30 20 6f  sage returns 0 o
d020: 6e 20 66 61 69 6c 75 72 65 2e 20 20 4f 74 68 65  n failure.  Othe
d030: 72 77 69 73 65 20 69 74 0a 20 20 2a 2a 20 72 65  rwise it.  ** re
d040: 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72  turns the number
d050: 20 6f 66 20 54 43 48 41 52 73 20 77 72 69 74 74   of TCHARs writt
d060: 65 6e 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74  en to the output
d070: 0a 20 20 2a 2a 20 62 75 66 66 65 72 2c 20 65 78  .  ** buffer, ex
d080: 63 6c 75 64 69 6e 67 20 74 68 65 20 74 65 72 6d  cluding the term
d090: 69 6e 61 74 69 6e 67 20 6e 75 6c 6c 20 63 68 61  inating null cha
d0a0: 72 2e 0a 20 20 2a 2f 0a 20 20 44 57 4f 52 44 20  r..  */.  DWORD 
d0b0: 64 77 4c 65 6e 20 3d 20 30 3b 0a 20 20 63 68 61  dwLen = 0;.  cha
d0c0: 72 20 2a 7a 4f 75 74 20 3d 20 30 3b 0a 0a 20 20  r *zOut = 0;..  
d0d0: 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a  if( osIsNT() ){.
d0e0: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
d0f0: 4e 52 54 0a 20 20 20 20 57 43 48 41 52 20 7a 54  NRT.    WCHAR zT
d100: 65 6d 70 57 69 64 65 5b 53 51 4c 49 54 45 5f 57  empWide[SQLITE_W
d110: 49 4e 33 32 5f 4d 41 58 5f 45 52 52 4d 53 47 5f  IN32_MAX_ERRMSG_
d120: 43 48 41 52 53 2b 31 5d 3b 0a 20 20 20 20 64 77  CHARS+1];.    dw
d130: 4c 65 6e 20 3d 20 6f 73 46 6f 72 6d 61 74 4d 65  Len = osFormatMe
d140: 73 73 61 67 65 57 28 46 4f 52 4d 41 54 5f 4d 45  ssageW(FORMAT_ME
d150: 53 53 41 47 45 5f 46 52 4f 4d 5f 53 59 53 54 45  SSAGE_FROM_SYSTE
d160: 4d 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  M |.            
d170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d180: 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f   FORMAT_MESSAGE_
d190: 49 47 4e 4f 52 45 5f 49 4e 53 45 52 54 53 2c 0a  IGNORE_INSERTS,.
d1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c               NUL
d1c0: 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  L,.             
d1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d1e0: 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  lastErrno,.     
d1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d200: 20 20 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20          0,.     
d210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d220: 20 20 20 20 20 20 20 20 7a 54 65 6d 70 57 69 64          zTempWid
d230: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
d240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d250: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 58  SQLITE_WIN32_MAX
d260: 5f 45 52 52 4d 53 47 5f 43 48 41 52 53 2c 0a 20  _ERRMSG_CHARS,. 
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 20 20 20 30 29 3b 0a              0);.
d290: 23 65 6c 73 65 0a 20 20 20 20 4c 50 57 53 54 52  #else.    LPWSTR
d2a0: 20 7a 54 65 6d 70 57 69 64 65 20 3d 20 4e 55 4c   zTempWide = NUL
d2b0: 4c 3b 0a 20 20 20 20 64 77 4c 65 6e 20 3d 20 6f  L;.    dwLen = o
d2c0: 73 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 57 28  sFormatMessageW(
d2d0: 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 41  FORMAT_MESSAGE_A
d2e0: 4c 4c 4f 43 41 54 45 5f 42 55 46 46 45 52 20 7c  LLOCATE_BUFFER |
d2f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 46 4f                FO
d310: 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 46 52 4f  RMAT_MESSAGE_FRO
d320: 4d 5f 53 59 53 54 45 4d 20 7c 0a 20 20 20 20 20  M_SYSTEM |.     
d330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d340: 20 20 20 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d          FORMAT_M
d350: 45 53 53 41 47 45 5f 49 47 4e 4f 52 45 5f 49 4e  ESSAGE_IGNORE_IN
d360: 53 45 52 54 53 2c 0a 20 20 20 20 20 20 20 20 20  SERTS,.         
d370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d380: 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20      NULL,.      
d390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d3a0: 20 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f         lastErrno
d3b0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
d3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
d3d0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
d3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
d3f0: 4c 50 57 53 54 52 29 20 26 7a 54 65 6d 70 57 69  LPWSTR) &zTempWi
d400: 64 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  de,.            
d410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d420: 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
d430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d440: 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20   0);.#endif.    
d450: 69 66 28 20 64 77 4c 65 6e 20 3e 20 30 20 29 7b  if( dwLen > 0 ){
d460: 0a 20 20 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61  .      /* alloca
d470: 74 65 20 61 20 62 75 66 66 65 72 20 61 6e 64 20  te a buffer and 
d480: 63 6f 6e 76 65 72 74 20 74 6f 20 55 54 46 38 20  convert to UTF8 
d490: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
d4a0: 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
d4b0: 63 28 29 3b 0a 20 20 20 20 20 20 7a 4f 75 74 20  c();.      zOut 
d4c0: 3d 20 77 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74  = winUnicodeToUt
d4d0: 66 38 28 7a 54 65 6d 70 57 69 64 65 29 3b 0a 20  f8(zTempWide);. 
d4e0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42       sqlite3EndB
d4f0: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 23  enignMalloc();.#
d500: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
d510: 4e 52 54 0a 20 20 20 20 20 20 2f 2a 20 66 72 65  NRT.      /* fre
d520: 65 20 74 68 65 20 73 79 73 74 65 6d 20 62 75 66  e the system buf
d530: 66 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  fer allocated by
d540: 20 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 20 2a   FormatMessage *
d550: 2f 0a 20 20 20 20 20 20 6f 73 4c 6f 63 61 6c 46  /.      osLocalF
d560: 72 65 65 28 7a 54 65 6d 70 57 69 64 65 29 3b 0a  ree(zTempWide);.
d570: 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d  #endif.    }.  }
d580: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57  .#ifdef SQLITE_W
d590: 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20  IN32_HAS_ANSI.  
d5a0: 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a  else{.    char *
d5b0: 7a 54 65 6d 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20  zTemp = NULL;.  
d5c0: 20 20 64 77 4c 65 6e 20 3d 20 6f 73 46 6f 72 6d    dwLen = osForm
d5d0: 61 74 4d 65 73 73 61 67 65 41 28 46 4f 52 4d 41  atMessageA(FORMA
d5e0: 54 5f 4d 45 53 53 41 47 45 5f 41 4c 4c 4f 43 41  T_MESSAGE_ALLOCA
d5f0: 54 45 5f 42 55 46 46 45 52 20 7c 0a 20 20 20 20  TE_BUFFER |.    
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 46 4f 52 4d 41 54 5f           FORMAT_
d620: 4d 45 53 53 41 47 45 5f 46 52 4f 4d 5f 53 59 53  MESSAGE_FROM_SYS
d630: 54 45 4d 20 7c 0a 20 20 20 20 20 20 20 20 20 20  TEM |.          
d640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d650: 20 20 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47     FORMAT_MESSAG
d660: 45 5f 49 47 4e 4f 52 45 5f 49 4e 53 45 52 54 53  E_IGNORE_INSERTS
d670: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
d680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4e                 N
d690: 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ULL,.           
d6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d6b0: 20 20 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20    lastErrno,.   
d6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d6d0: 20 20 20 20 20 20 20 20 20 20 30 2c 0a 20 20 20            0,.   
d6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d6f0: 20 20 20 20 20 20 20 20 20 20 28 4c 50 53 54 52            (LPSTR
d700: 29 20 26 7a 54 65 6d 70 2c 0a 20 20 20 20 20 20  ) &zTemp,.      
d710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d720: 20 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20         0,.      
d730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d740: 20 20 20 20 20 20 20 30 29 3b 0a 20 20 20 20 69         0);.    i
d750: 66 28 20 64 77 4c 65 6e 20 3e 20 30 20 29 7b 0a  f( dwLen > 0 ){.
d760: 20 20 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74        /* allocat
d770: 65 20 61 20 62 75 66 66 65 72 20 61 6e 64 20 63  e a buffer and c
d780: 6f 6e 76 65 72 74 20 74 6f 20 55 54 46 38 20 2a  onvert to UTF8 *
d790: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  /.      sqlite3B
d7a0: 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
d7b0: 28 29 3b 0a 20 20 20 20 20 20 7a 4f 75 74 20 3d  ();.      zOut =
d7c0: 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d   sqlite3_win32_m
d7d0: 62 63 73 5f 74 6f 5f 75 74 66 38 28 7a 54 65 6d  bcs_to_utf8(zTem
d7e0: 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  p);.      sqlite
d7f0: 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
d800: 28 29 3b 0a 20 20 20 20 20 20 2f 2a 20 66 72 65  ();.      /* fre
d810: 65 20 74 68 65 20 73 79 73 74 65 6d 20 62 75 66  e the system buf
d820: 66 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  fer allocated by
d830: 20 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 20 2a   FormatMessage *
d840: 2f 0a 20 20 20 20 20 20 6f 73 4c 6f 63 61 6c 46  /.      osLocalF
d850: 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20  ree(zTemp);.    
d860: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  }.  }.#endif.  i
d870: 66 28 20 30 20 3d 3d 20 64 77 4c 65 6e 20 29 7b  f( 0 == dwLen ){
d880: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
d890: 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75 66  rintf(nBuf, zBuf
d8a0: 2c 20 22 4f 73 45 72 72 6f 72 20 30 78 25 6c 78  , "OsError 0x%lx
d8b0: 20 28 25 6c 75 29 22 2c 20 6c 61 73 74 45 72 72   (%lu)", lastErr
d8c0: 6e 6f 2c 20 6c 61 73 74 45 72 72 6e 6f 29 3b 0a  no, lastErrno);.
d8d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
d8e0: 63 6f 70 79 20 61 20 6d 61 78 69 6d 75 6d 20 6f  copy a maximum o
d8f0: 66 20 6e 42 75 66 20 63 68 61 72 73 20 74 6f 20  f nBuf chars to 
d900: 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 2a 2f  output buffer */
d910: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
d920: 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75 66  rintf(nBuf, zBuf
d930: 2c 20 22 25 73 22 2c 20 7a 4f 75 74 29 3b 0a 20  , "%s", zOut);. 
d940: 20 20 20 2f 2a 20 66 72 65 65 20 74 68 65 20 55     /* free the U
d950: 54 46 38 20 62 75 66 66 65 72 20 2a 2f 0a 20 20  TF8 buffer */.  
d960: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
d970: 4f 75 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Out);.  }.  retu
d980: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a  rn 0;.}../*.**.*
d990: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
d9a0: 2d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 41 74 4c  - winLogErrorAtL
d9b0: 69 6e 65 28 29 20 2d 20 69 73 20 6f 6e 6c 79 20  ine() - is only 
d9c0: 65 76 65 72 20 63 61 6c 6c 65 64 20 76 69 61 20  ever called via 
d9d0: 74 68 65 20 6d 61 63 72 6f 0a 2a 2a 20 77 69 6e  the macro.** win
d9e0: 4c 6f 67 45 72 72 6f 72 28 29 2e 0a 2a 2a 0a 2a  LogError()..**.*
d9f0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
da00: 73 20 69 6e 76 6f 6b 65 64 20 61 66 74 65 72 20  s invoked after 
da10: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
da20: 69 6e 20 61 6e 20 4f 53 20 66 75 6e 63 74 69 6f  in an OS functio
da30: 6e 2e 0a 2a 2a 20 49 74 20 6c 6f 67 73 20 61 20  n..** It logs a 
da40: 6d 65 73 73 61 67 65 20 75 73 69 6e 67 20 73 71  message using sq
da50: 6c 69 74 65 33 5f 6c 6f 67 28 29 20 63 6f 6e 74  lite3_log() cont
da60: 61 69 6e 69 6e 67 20 74 68 65 20 63 75 72 72 65  aining the curre
da70: 6e 74 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 65  nt value of.** e
da80: 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 2c 20 69  rror code and, i
da90: 66 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 65 20  f possible, the 
daa0: 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 65  human-readable e
dab0: 71 75 69 76 61 6c 65 6e 74 20 66 72 6f 6d 20 0a  quivalent from .
dac0: 2a 2a 20 46 6f 72 6d 61 74 4d 65 73 73 61 67 65  ** FormatMessage
dad0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73  ..**.** The firs
dae0: 74 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65  t argument passe
daf0: 64 20 74 6f 20 74 68 65 20 6d 61 63 72 6f 20 73  d to the macro s
db00: 68 6f 75 6c 64 20 62 65 20 74 68 65 20 65 72 72  hould be the err
db10: 6f 72 20 63 6f 64 65 20 74 68 61 74 0a 2a 2a 20  or code that.** 
db20: 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
db30: 20 74 6f 20 53 51 4c 69 74 65 20 28 65 2e 67 2e   to SQLite (e.g.
db40: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45   SQLITE_IOERR_DE
db50: 4c 45 54 45 2c 20 53 51 4c 49 54 45 5f 43 41 4e  LETE, SQLITE_CAN
db60: 54 4f 50 45 4e 29 2e 20 0a 2a 2a 20 54 68 65 20  TOPEN). .** The 
db70: 74 77 6f 20 73 75 62 73 65 71 75 65 6e 74 20 61  two subsequent a
db80: 72 67 75 6d 65 6e 74 73 20 73 68 6f 75 6c 64 20  rguments should 
db90: 62 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  be the name of t
dba0: 68 65 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20 74  he OS function t
dbb0: 68 61 74 0a 2a 2a 20 66 61 69 6c 65 64 20 61 6e  hat.** failed an
dbc0: 64 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64  d the associated
dbd0: 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 70 61 74   file-system pat
dbe0: 68 2c 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a 23 64  h, if any..*/.#d
dbf0: 65 66 69 6e 65 20 77 69 6e 4c 6f 67 45 72 72 6f  efine winLogErro
dc00: 72 28 61 2c 62 2c 63 2c 64 29 20 20 20 77 69 6e  r(a,b,c,d)   win
dc10: 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 61  LogErrorAtLine(a
dc20: 2c 62 2c 63 2c 64 2c 5f 5f 4c 49 4e 45 5f 5f 29  ,b,c,d,__LINE__)
dc30: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4c  .static int winL
dc40: 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 0a 20  ogErrorAtLine(. 
dc50: 20 69 6e 74 20 65 72 72 63 6f 64 65 2c 20 20 20   int errcode,   
dc60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc70: 20 2f 2a 20 53 51 4c 69 74 65 20 65 72 72 6f 72   /* SQLite error
dc80: 20 63 6f 64 65 20 2a 2f 0a 20 20 44 57 4f 52 44   code */.  DWORD
dc90: 20 6c 61 73 74 45 72 72 6e 6f 2c 20 20 20 20 20   lastErrno,     
dca0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 69             /* Wi
dcb0: 6e 33 32 20 6c 61 73 74 20 65 72 72 6f 72 20 2a  n32 last error *
dcc0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
dcd0: 7a 46 75 6e 63 2c 20 20 20 20 20 20 20 20 20 20  zFunc,          
dce0: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 4f      /* Name of O
dcf0: 53 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20  S function that 
dd00: 66 61 69 6c 65 64 20 2a 2f 0a 20 20 63 6f 6e 73  failed */.  cons
dd10: 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20  t char *zPath,  
dd20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
dd30: 69 6c 65 20 70 61 74 68 20 61 73 73 6f 63 69 61  ile path associa
dd40: 74 65 64 20 77 69 74 68 20 65 72 72 6f 72 20 2a  ted with error *
dd50: 2f 0a 20 20 69 6e 74 20 69 4c 69 6e 65 20 20 20  /.  int iLine   
dd60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd70: 20 20 20 20 2f 2a 20 53 6f 75 72 63 65 20 6c 69      /* Source li
dd80: 6e 65 20 6e 75 6d 62 65 72 20 77 68 65 72 65 20  ne number where 
dd90: 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 2a  error occurred *
dda0: 2f 0a 29 7b 0a 20 20 63 68 61 72 20 7a 4d 73 67  /.){.  char zMsg
ddb0: 5b 35 30 30 5d 3b 20 20 20 20 20 20 20 20 20 20  [500];          
ddc0: 20 20 20 20 20 20 20 2f 2a 20 48 75 6d 61 6e 20         /* Human 
ddd0: 72 65 61 64 61 62 6c 65 20 65 72 72 6f 72 20 74  readable error t
dde0: 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  ext */.  int i; 
ddf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de00: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
de10: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 7a   counter */..  z
de20: 4d 73 67 5b 30 5d 20 3d 20 30 3b 0a 20 20 77 69  Msg[0] = 0;.  wi
de30: 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67  nGetLastErrorMsg
de40: 28 6c 61 73 74 45 72 72 6e 6f 2c 20 73 69 7a 65  (lastErrno, size
de50: 6f 66 28 7a 4d 73 67 29 2c 20 7a 4d 73 67 29 3b  of(zMsg), zMsg);
de60: 0a 20 20 61 73 73 65 72 74 28 20 65 72 72 63 6f  .  assert( errco
de70: 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  de!=SQLITE_OK );
de80: 0a 20 20 69 66 28 20 7a 50 61 74 68 3d 3d 30 20  .  if( zPath==0 
de90: 29 20 7a 50 61 74 68 20 3d 20 22 22 3b 0a 20 20  ) zPath = "";.  
dea0: 66 6f 72 28 69 3d 30 3b 20 7a 4d 73 67 5b 69 5d  for(i=0; zMsg[i]
deb0: 20 26 26 20 7a 4d 73 67 5b 69 5d 21 3d 27 5c 72   && zMsg[i]!='\r
dec0: 27 20 26 26 20 7a 4d 73 67 5b 69 5d 21 3d 27 5c  ' && zMsg[i]!='\
ded0: 6e 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 7a 4d 73  n'; i++){}.  zMs
dee0: 67 5b 69 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69  g[i] = 0;.  sqli
def0: 74 65 33 5f 6c 6f 67 28 65 72 72 63 6f 64 65 2c  te3_log(errcode,
df00: 0a 20 20 20 20 20 20 22 6f 73 5f 77 69 6e 2e 63  .      "os_win.c
df10: 3a 25 64 3a 20 28 25 6c 75 29 20 25 73 28 25 73  :%d: (%lu) %s(%s
df20: 29 20 2d 20 25 73 22 2c 0a 20 20 20 20 20 20 69  ) - %s",.      i
df30: 4c 69 6e 65 2c 20 6c 61 73 74 45 72 72 6e 6f 2c  Line, lastErrno,
df40: 20 7a 46 75 6e 63 2c 20 7a 50 61 74 68 2c 20 7a   zFunc, zPath, z
df50: 4d 73 67 0a 20 20 29 3b 0a 0a 20 20 72 65 74 75  Msg.  );..  retu
df60: 72 6e 20 65 72 72 63 6f 64 65 3b 0a 7d 0a 0a 2f  rn errcode;.}../
df70: 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72 20  *.** The number 
df80: 6f 66 20 74 69 6d 65 73 20 74 68 61 74 20 61 20  of times that a 
df90: 52 65 61 64 46 69 6c 65 28 29 2c 20 57 72 69 74  ReadFile(), Writ
dfa0: 65 46 69 6c 65 28 29 2c 20 61 6e 64 20 44 65 6c  eFile(), and Del
dfb0: 65 74 65 46 69 6c 65 28 29 0a 2a 2a 20 77 69 6c  eteFile().** wil
dfc0: 6c 20 62 65 20 72 65 74 72 69 65 64 20 66 6f 6c  l be retried fol
dfd0: 6c 6f 77 69 6e 67 20 61 20 6c 6f 63 6b 69 6e 67  lowing a locking
dfe0: 20 65 72 72 6f 72 20 2d 20 70 72 6f 62 61 62 6c   error - probabl
dff0: 79 20 63 61 75 73 65 64 20 62 79 20 0a 2a 2a 20  y caused by .** 
e000: 61 6e 74 69 76 69 72 75 73 20 73 6f 66 74 77 61  antivirus softwa
e010: 72 65 2e 20 20 41 6c 73 6f 20 74 68 65 20 69 6e  re.  Also the in
e020: 69 74 69 61 6c 20 64 65 6c 61 79 20 62 65 66 6f  itial delay befo
e030: 72 65 20 74 68 65 20 66 69 72 73 74 20 72 65 74  re the first ret
e040: 72 79 2e 0a 2a 2a 20 54 68 65 20 64 65 6c 61 79  ry..** The delay
e050: 20 69 6e 63 72 65 61 73 65 73 20 6c 69 6e 65 61   increases linea
e060: 72 6c 79 20 77 69 74 68 20 65 61 63 68 20 72 65  rly with each re
e070: 74 72 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  try..*/.#ifndef 
e080: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45  SQLITE_WIN32_IOE
e090: 52 52 5f 52 45 54 52 59 0a 23 20 64 65 66 69 6e  RR_RETRY.# defin
e0a0: 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49  e SQLITE_WIN32_I
e0b0: 4f 45 52 52 5f 52 45 54 52 59 20 31 30 0a 23 65  OERR_RETRY 10.#e
e0c0: 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c  ndif.#ifndef SQL
e0d0: 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f  ITE_WIN32_IOERR_
e0e0: 52 45 54 52 59 5f 44 45 4c 41 59 0a 23 20 64 65  RETRY_DELAY.# de
e0f0: 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33  fine SQLITE_WIN3
e100: 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 5f 44 45  2_IOERR_RETRY_DE
e110: 4c 41 59 20 32 35 0a 23 65 6e 64 69 66 0a 73 74  LAY 25.#endif.st
e120: 61 74 69 63 20 69 6e 74 20 77 69 6e 49 6f 65 72  atic int winIoer
e130: 72 52 65 74 72 79 20 3d 20 53 51 4c 49 54 45 5f  rRetry = SQLITE_
e140: 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52  WIN32_IOERR_RETR
e150: 59 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  Y;.static int wi
e160: 6e 49 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79  nIoerrRetryDelay
e170: 20 3d 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f   = SQLITE_WIN32_
e180: 49 4f 45 52 52 5f 52 45 54 52 59 5f 44 45 4c 41  IOERR_RETRY_DELA
e190: 59 3b 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 20 52  Y;../*.** If a R
e1a0: 65 61 64 46 69 6c 65 28 29 20 6f 72 20 57 72 69  eadFile() or Wri
e1b0: 74 65 46 69 6c 65 28 29 20 65 72 72 6f 72 20 6f  teFile() error o
e1c0: 63 63 75 72 73 2c 20 69 6e 76 6f 6b 65 20 74 68  ccurs, invoke th
e1d0: 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 74 6f  is routine.** to
e1e0: 20 73 65 65 20 69 66 20 69 74 20 73 68 6f 75 6c   see if it shoul
e1f0: 64 20 62 65 20 72 65 74 72 69 65 64 2e 20 20 52  d be retried.  R
e200: 65 74 75 72 6e 20 54 52 55 45 20 74 6f 20 72 65  eturn TRUE to re
e210: 74 72 79 2e 20 20 52 65 74 75 72 6e 20 46 41 4c  try.  Return FAL
e220: 53 45 0a 2a 2a 20 74 6f 20 67 69 76 65 20 75 70  SE.** to give up
e230: 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72 2e 0a   with an error..
e240: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
e250: 6e 52 65 74 72 79 49 6f 65 72 72 28 69 6e 74 20  nRetryIoerr(int 
e260: 2a 70 6e 52 65 74 72 79 2c 20 44 57 4f 52 44 20  *pnRetry, DWORD 
e270: 2a 70 45 72 72 6f 72 29 7b 0a 20 20 44 57 4f 52  *pError){.  DWOR
e280: 44 20 65 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  D e = osGetLastE
e290: 72 72 6f 72 28 29 3b 0a 20 20 69 66 28 20 2a 70  rror();.  if( *p
e2a0: 6e 52 65 74 72 79 3e 3d 77 69 6e 49 6f 65 72 72  nRetry>=winIoerr
e2b0: 52 65 74 72 79 20 29 7b 0a 20 20 20 20 69 66 28  Retry ){.    if(
e2c0: 20 70 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20   pError ){.     
e2d0: 20 2a 70 45 72 72 6f 72 20 3d 20 65 3b 0a 20 20   *pError = e;.  
e2e0: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 30    }.    return 0
e2f0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 65 3d 3d 45  ;.  }.  if( e==E
e300: 52 52 4f 52 5f 41 43 43 45 53 53 5f 44 45 4e 49  RROR_ACCESS_DENI
e310: 45 44 20 7c 7c 0a 20 20 20 20 20 20 65 3d 3d 45  ED ||.      e==E
e320: 52 52 4f 52 5f 4c 4f 43 4b 5f 56 49 4f 4c 41 54  RROR_LOCK_VIOLAT
e330: 49 4f 4e 20 7c 7c 0a 20 20 20 20 20 20 65 3d 3d  ION ||.      e==
e340: 45 52 52 4f 52 5f 53 48 41 52 49 4e 47 5f 56 49  ERROR_SHARING_VI
e350: 4f 4c 41 54 49 4f 4e 20 29 7b 0a 20 20 20 20 73  OLATION ){.    s
e360: 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65  qlite3_win32_sle
e370: 65 70 28 77 69 6e 49 6f 65 72 72 52 65 74 72 79  ep(winIoerrRetry
e380: 44 65 6c 61 79 2a 28 31 2b 2a 70 6e 52 65 74 72  Delay*(1+*pnRetr
e390: 79 29 29 3b 0a 20 20 20 20 2b 2b 2a 70 6e 52 65  y));.    ++*pnRe
e3a0: 74 72 79 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  try;.    return 
e3b0: 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 72  1;.  }.  if( pEr
e3c0: 72 6f 72 20 29 7b 0a 20 20 20 20 2a 70 45 72 72  ror ){.    *pErr
e3d0: 6f 72 20 3d 20 65 3b 0a 20 20 7d 0a 20 20 72 65  or = e;.  }.  re
e3e0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
e3f0: 20 4c 6f 67 20 61 20 49 2f 4f 20 65 72 72 6f 72   Log a I/O error
e400: 20 72 65 74 72 79 20 65 70 69 73 6f 64 65 2e 0a   retry episode..
e410: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
e420: 69 6e 4c 6f 67 49 6f 65 72 72 28 69 6e 74 20 6e  inLogIoerr(int n
e430: 52 65 74 72 79 29 7b 0a 20 20 69 66 28 20 6e 52  Retry){.  if( nR
e440: 65 74 72 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  etry ){.    sqli
e450: 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 49  te3_log(SQLITE_I
e460: 4f 45 52 52 2c 20 0a 20 20 20 20 20 20 22 64 65  OERR, .      "de
e470: 6c 61 79 65 64 20 25 64 6d 73 20 66 6f 72 20 6c  layed %dms for l
e480: 6f 63 6b 2f 73 68 61 72 69 6e 67 20 63 6f 6e 66  ock/sharing conf
e490: 6c 69 63 74 22 2c 0a 20 20 20 20 20 20 77 69 6e  lict",.      win
e4a0: 49 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79 2a  IoerrRetryDelay*
e4b0: 6e 52 65 74 72 79 2a 28 6e 52 65 74 72 79 2b 31  nRetry*(nRetry+1
e4c0: 29 2f 32 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d  )/2.    );.  }.}
e4d0: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
e4e0: 57 49 4e 43 45 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  WINCE./*********
e4f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e500: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e510: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e520: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e530: 0a 2a 2a 20 54 68 69 73 20 73 65 63 74 69 6f 6e  .** This section
e540: 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65 20 66   contains code f
e550: 6f 72 20 57 69 6e 43 45 20 6f 6e 6c 79 2e 0a 2a  or WinCE only..*
e560: 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  /.#if !defined(S
e570: 51 4c 49 54 45 5f 4d 53 56 43 5f 4c 4f 43 41 4c  QLITE_MSVC_LOCAL
e580: 54 49 4d 45 5f 41 50 49 29 20 7c 7c 20 21 53 51  TIME_API) || !SQ
e590: 4c 49 54 45 5f 4d 53 56 43 5f 4c 4f 43 41 4c 54  LITE_MSVC_LOCALT
e5a0: 49 4d 45 5f 41 50 49 0a 2f 2a 0a 2a 2a 20 54 68  IME_API./*.** Th
e5b0: 65 20 4d 53 56 43 20 43 52 54 20 6f 6e 20 57 69  e MSVC CRT on Wi
e5c0: 6e 64 6f 77 73 20 43 45 20 6d 61 79 20 6e 6f 74  ndows CE may not
e5d0: 20 68 61 76 65 20 61 20 6c 6f 63 61 6c 74 69 6d   have a localtim
e5e0: 65 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 53  e() function.  S
e5f0: 6f 0a 2a 2a 20 63 72 65 61 74 65 20 61 20 73 75  o.** create a su
e600: 62 73 74 69 74 75 74 65 2e 0a 2a 2f 0a 23 69 6e  bstitute..*/.#in
e610: 63 6c 75 64 65 20 3c 74 69 6d 65 2e 68 3e 0a 73  clude <time.h>.s
e620: 74 72 75 63 74 20 74 6d 20 2a 5f 5f 63 64 65 63  truct tm *__cdec
e630: 6c 20 6c 6f 63 61 6c 74 69 6d 65 28 63 6f 6e 73  l localtime(cons
e640: 74 20 74 69 6d 65 5f 74 20 2a 74 29 0a 7b 0a 20  t time_t *t).{. 
e650: 20 73 74 61 74 69 63 20 73 74 72 75 63 74 20 74   static struct t
e660: 6d 20 79 3b 0a 20 20 46 49 4c 45 54 49 4d 45 20  m y;.  FILETIME 
e670: 75 54 6d 2c 20 6c 54 6d 3b 0a 20 20 53 59 53 54  uTm, lTm;.  SYST
e680: 45 4d 54 49 4d 45 20 70 54 6d 3b 0a 20 20 73 71  EMTIME pTm;.  sq
e690: 6c 69 74 65 33 5f 69 6e 74 36 34 20 74 36 34 3b  lite3_int64 t64;
e6a0: 0a 20 20 74 36 34 20 3d 20 2a 74 3b 0a 20 20 74  .  t64 = *t;.  t
e6b0: 36 34 20 3d 20 28 74 36 34 20 2b 20 31 31 36 34  64 = (t64 + 1164
e6c0: 34 34 37 33 36 30 30 29 2a 31 30 30 30 30 30 30  4473600)*1000000
e6d0: 30 3b 0a 20 20 75 54 6d 2e 64 77 4c 6f 77 44 61  0;.  uTm.dwLowDa
e6e0: 74 65 54 69 6d 65 20 3d 20 28 44 57 4f 52 44 29  teTime = (DWORD)
e6f0: 28 74 36 34 20 26 20 30 78 46 46 46 46 46 46 46  (t64 & 0xFFFFFFF
e700: 46 29 3b 0a 20 20 75 54 6d 2e 64 77 48 69 67 68  F);.  uTm.dwHigh
e710: 44 61 74 65 54 69 6d 65 3d 20 28 44 57 4f 52 44  DateTime= (DWORD
e720: 29 28 74 36 34 20 3e 3e 20 33 32 29 3b 0a 20 20  )(t64 >> 32);.  
e730: 6f 73 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63 61  osFileTimeToLoca
e740: 6c 46 69 6c 65 54 69 6d 65 28 26 75 54 6d 2c 26  lFileTime(&uTm,&
e750: 6c 54 6d 29 3b 0a 20 20 6f 73 46 69 6c 65 54 69  lTm);.  osFileTi
e760: 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 28 26  meToSystemTime(&
e770: 6c 54 6d 2c 26 70 54 6d 29 3b 0a 20 20 79 2e 74  lTm,&pTm);.  y.t
e780: 6d 5f 79 65 61 72 20 3d 20 70 54 6d 2e 77 59 65  m_year = pTm.wYe
e790: 61 72 20 2d 20 31 39 30 30 3b 0a 20 20 79 2e 74  ar - 1900;.  y.t
e7a0: 6d 5f 6d 6f 6e 20 3d 20 70 54 6d 2e 77 4d 6f 6e  m_mon = pTm.wMon
e7b0: 74 68 20 2d 20 31 3b 0a 20 20 79 2e 74 6d 5f 77  th - 1;.  y.tm_w
e7c0: 64 61 79 20 3d 20 70 54 6d 2e 77 44 61 79 4f 66  day = pTm.wDayOf
e7d0: 57 65 65 6b 3b 0a 20 20 79 2e 74 6d 5f 6d 64 61  Week;.  y.tm_mda
e7e0: 79 20 3d 20 70 54 6d 2e 77 44 61 79 3b 0a 20 20  y = pTm.wDay;.  
e7f0: 79 2e 74 6d 5f 68 6f 75 72 20 3d 20 70 54 6d 2e  y.tm_hour = pTm.
e800: 77 48 6f 75 72 3b 0a 20 20 79 2e 74 6d 5f 6d 69  wHour;.  y.tm_mi
e810: 6e 20 3d 20 70 54 6d 2e 77 4d 69 6e 75 74 65 3b  n = pTm.wMinute;
e820: 0a 20 20 79 2e 74 6d 5f 73 65 63 20 3d 20 70 54  .  y.tm_sec = pT
e830: 6d 2e 77 53 65 63 6f 6e 64 3b 0a 20 20 72 65 74  m.wSecond;.  ret
e840: 75 72 6e 20 26 79 3b 0a 7d 0a 23 65 6e 64 69 66  urn &y;.}.#endif
e850: 0a 0a 23 64 65 66 69 6e 65 20 48 41 4e 44 4c 45  ..#define HANDLE
e860: 5f 54 4f 5f 57 49 4e 46 49 4c 45 28 61 29 20 28  _TO_WINFILE(a) (
e870: 77 69 6e 46 69 6c 65 2a 29 26 28 28 63 68 61 72  winFile*)&((char
e880: 2a 29 61 29 5b 2d 28 69 6e 74 29 6f 66 66 73 65  *)a)[-(int)offse
e890: 74 6f 66 28 77 69 6e 46 69 6c 65 2c 68 29 5d 0a  tof(winFile,h)].
e8a0: 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61  ./*.** Acquire a
e8b0: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 68 61 6e   lock on the han
e8c0: 64 6c 65 20 68 0a 2a 2f 0a 73 74 61 74 69 63 20  dle h.*/.static 
e8d0: 76 6f 69 64 20 77 69 6e 63 65 4d 75 74 65 78 41  void winceMutexA
e8e0: 63 71 75 69 72 65 28 48 41 4e 44 4c 45 20 68 29  cquire(HANDLE h)
e8f0: 7b 0a 20 20 20 44 57 4f 52 44 20 64 77 45 72 72  {.   DWORD dwErr
e900: 3b 0a 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 64  ;.   do {.     d
e910: 77 45 72 72 20 3d 20 6f 73 57 61 69 74 46 6f 72  wErr = osWaitFor
e920: 53 69 6e 67 6c 65 4f 62 6a 65 63 74 28 68 2c 20  SingleObject(h, 
e930: 49 4e 46 49 4e 49 54 45 29 3b 0a 20 20 20 7d 20  INFINITE);.   } 
e940: 77 68 69 6c 65 20 28 64 77 45 72 72 20 21 3d 20  while (dwErr != 
e950: 57 41 49 54 5f 4f 42 4a 45 43 54 5f 30 20 26 26  WAIT_OBJECT_0 &&
e960: 20 64 77 45 72 72 20 21 3d 20 57 41 49 54 5f 41   dwErr != WAIT_A
e970: 42 41 4e 44 4f 4e 45 44 29 3b 0a 7d 0a 2f 2a 0a  BANDONED);.}./*.
e980: 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 6c 6f 63  ** Release a loc
e990: 6b 20 61 63 71 75 69 72 65 64 20 62 79 20 77 69  k acquired by wi
e9a0: 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72 65 28  nceMutexAcquire(
e9b0: 29 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 77 69 6e  ).*/.#define win
e9c0: 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28 68  ceMutexRelease(h
e9d0: 29 20 52 65 6c 65 61 73 65 4d 75 74 65 78 28 68  ) ReleaseMutex(h
e9e0: 29 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  )../*.** Create 
e9f0: 74 68 65 20 6d 75 74 65 78 20 61 6e 64 20 73 68  the mutex and sh
ea00: 61 72 65 64 20 6d 65 6d 6f 72 79 20 75 73 65 64  ared memory used
ea10: 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 69 6e 20   for locking in 
ea20: 74 68 65 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63  the file.** desc
ea30: 72 69 70 74 6f 72 20 70 46 69 6c 65 0a 2a 2f 0a  riptor pFile.*/.
ea40: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 63 65  static int wince
ea50: 43 72 65 61 74 65 4c 6f 63 6b 28 63 6f 6e 73 74  CreateLock(const
ea60: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
ea70: 2c 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65  , winFile *pFile
ea80: 29 7b 0a 20 20 4c 50 57 53 54 52 20 7a 54 6f 6b  ){.  LPWSTR zTok
ea90: 3b 0a 20 20 4c 50 57 53 54 52 20 7a 4e 61 6d 65  ;.  LPWSTR zName
eaa0: 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72  ;.  DWORD lastEr
eab0: 72 6e 6f 3b 0a 20 20 42 4f 4f 4c 20 62 4c 6f 67  rno;.  BOOL bLog
eac0: 67 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20 42  ged = FALSE;.  B
ead0: 4f 4f 4c 20 62 49 6e 69 74 20 3d 20 54 52 55 45  OOL bInit = TRUE
eae0: 3b 0a 0a 20 20 7a 4e 61 6d 65 20 3d 20 77 69 6e  ;..  zName = win
eaf0: 55 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a 46  Utf8ToUnicode(zF
eb00: 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ilename);.  if( 
eb10: 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  zName==0 ){.    
eb20: 2f 2a 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  /* out of memory
eb30: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
eb40: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
eb50: 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69  M;.  }..  /* Ini
eb60: 74 69 61 6c 69 7a 65 20 74 68 65 20 6c 6f 63 61  tialize the loca
eb70: 6c 20 6c 6f 63 6b 64 61 74 61 20 2a 2f 0a 20 20  l lockdata */.  
eb80: 6d 65 6d 73 65 74 28 26 70 46 69 6c 65 2d 3e 6c  memset(&pFile->l
eb90: 6f 63 61 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28  ocal, 0, sizeof(
eba0: 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 29 29 3b 0a  pFile->local));.
ebb0: 0a 20 20 2f 2a 20 52 65 70 6c 61 63 65 20 74 68  .  /* Replace th
ebc0: 65 20 62 61 63 6b 73 6c 61 73 68 65 73 20 66 72  e backslashes fr
ebd0: 6f 6d 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20  om the filename 
ebe0: 61 6e 64 20 6c 6f 77 65 72 63 61 73 65 20 69 74  and lowercase it
ebf0: 0a 20 20 2a 2a 20 74 6f 20 64 65 72 69 76 65 20  .  ** to derive 
ec00: 61 20 6d 75 74 65 78 20 6e 61 6d 65 2e 20 2a 2f  a mutex name. */
ec10: 0a 20 20 7a 54 6f 6b 20 3d 20 6f 73 43 68 61 72  .  zTok = osChar
ec20: 4c 6f 77 65 72 57 28 7a 4e 61 6d 65 29 3b 0a 20  LowerW(zName);. 
ec30: 20 66 6f 72 20 28 3b 2a 7a 54 6f 6b 3b 7a 54 6f   for (;*zTok;zTo
ec40: 6b 2b 2b 29 7b 0a 20 20 20 20 69 66 20 28 2a 7a  k++){.    if (*z
ec50: 54 6f 6b 20 3d 3d 20 27 5c 5c 27 29 20 2a 7a 54  Tok == '\\') *zT
ec60: 6f 6b 20 3d 20 27 5f 27 3b 0a 20 20 7d 0a 0a 20  ok = '_';.  }.. 
ec70: 20 2f 2a 20 43 72 65 61 74 65 2f 6f 70 65 6e 20   /* Create/open 
ec80: 74 68 65 20 6e 61 6d 65 64 20 6d 75 74 65 78 20  the named mutex 
ec90: 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e 68 4d 75 74  */.  pFile->hMut
eca0: 65 78 20 3d 20 6f 73 43 72 65 61 74 65 4d 75 74  ex = osCreateMut
ecb0: 65 78 57 28 4e 55 4c 4c 2c 20 46 41 4c 53 45 2c  exW(NULL, FALSE,
ecc0: 20 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 20 28 21   zName);.  if (!
ecd0: 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 7b 0a  pFile->hMutex){.
ece0: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
ecf0: 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
ed00: 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 73 71 6c  Error();.    sql
ed10: 69 74 65 33 5f 66 72 65 65 28 7a 4e 61 6d 65 29  ite3_free(zName)
ed20: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e  ;.    return win
ed30: 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
ed40: 49 4f 45 52 52 2c 20 70 46 69 6c 65 2d 3e 6c 61  IOERR, pFile->la
ed50: 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
ed60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ed70: 22 77 69 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b  "winceCreateLock
ed80: 31 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  1", zFilename);.
ed90: 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72    }..  /* Acquir
eda0: 65 20 74 68 65 20 6d 75 74 65 78 20 62 65 66 6f  e the mutex befo
edb0: 72 65 20 63 6f 6e 74 69 6e 75 69 6e 67 20 2a 2f  re continuing */
edc0: 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71  .  winceMutexAcq
edd0: 75 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74  uire(pFile->hMut
ede0: 65 78 29 3b 0a 20 20 0a 20 20 2f 2a 20 53 69 6e  ex);.  .  /* Sin
edf0: 63 65 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20  ce the names of 
ee00: 6e 61 6d 65 64 20 6d 75 74 65 78 65 73 2c 20 73  named mutexes, s
ee10: 65 6d 61 70 68 6f 72 65 73 2c 20 66 69 6c 65 20  emaphores, file 
ee20: 6d 61 70 70 69 6e 67 73 20 65 74 63 20 61 72 65  mappings etc are
ee30: 20 0a 20 20 2a 2a 20 63 61 73 65 2d 73 65 6e 73   .  ** case-sens
ee40: 69 74 69 76 65 2c 20 74 61 6b 65 20 61 64 76 61  itive, take adva
ee50: 6e 74 61 67 65 20 6f 66 20 74 68 61 74 20 62 79  ntage of that by
ee60: 20 75 70 70 65 72 63 61 73 69 6e 67 20 74 68 65   uppercasing the
ee70: 20 6d 75 74 65 78 20 6e 61 6d 65 0a 20 20 2a 2a   mutex name.  **
ee80: 20 61 6e 64 20 75 73 69 6e 67 20 74 68 61 74 20   and using that 
ee90: 61 73 20 74 68 65 20 73 68 61 72 65 64 20 66 69  as the shared fi
eea0: 6c 65 6d 61 70 70 69 6e 67 20 6e 61 6d 65 2e 0a  lemapping name..
eeb0: 20 20 2a 2f 0a 20 20 6f 73 43 68 61 72 55 70 70    */.  osCharUpp
eec0: 65 72 57 28 7a 4e 61 6d 65 29 3b 0a 20 20 70 46  erW(zName);.  pF
eed0: 69 6c 65 2d 3e 68 53 68 61 72 65 64 20 3d 20 6f  ile->hShared = o
eee0: 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69  sCreateFileMappi
eef0: 6e 67 57 28 49 4e 56 41 4c 49 44 5f 48 41 4e 44  ngW(INVALID_HAND
ef00: 4c 45 5f 56 41 4c 55 45 2c 20 4e 55 4c 4c 2c 0a  LE_VALUE, NULL,.
ef10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef30: 20 20 20 20 20 20 20 20 50 41 47 45 5f 52 45 41          PAGE_REA
ef40: 44 57 52 49 54 45 2c 20 30 2c 20 73 69 7a 65 6f  DWRITE, 0, sizeo
ef50: 66 28 77 69 6e 63 65 4c 6f 63 6b 29 2c 0a 20 20  f(winceLock),.  
ef60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef80: 20 20 20 20 20 20 7a 4e 61 6d 65 29 3b 20 20 0a        zName);  .
ef90: 0a 20 20 2f 2a 20 53 65 74 20 61 20 66 6c 61 67  .  /* Set a flag
efa0: 20 74 68 61 74 20 69 6e 64 69 63 61 74 65 73 20   that indicates 
efb0: 77 65 27 72 65 20 74 68 65 20 66 69 72 73 74 20  we're the first 
efc0: 74 6f 20 63 72 65 61 74 65 20 74 68 65 20 6d 65  to create the me
efd0: 6d 6f 72 79 20 73 6f 20 69 74 20 0a 20 20 2a 2a  mory so it .  **
efe0: 20 6d 75 73 74 20 62 65 20 7a 65 72 6f 2d 69 6e   must be zero-in
eff0: 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 6c  itialized */.  l
f000: 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
f010: 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 69  LastError();.  i
f020: 66 20 28 6c 61 73 74 45 72 72 6e 6f 20 3d 3d 20  f (lastErrno == 
f030: 45 52 52 4f 52 5f 41 4c 52 45 41 44 59 5f 45 58  ERROR_ALREADY_EX
f040: 49 53 54 53 29 7b 0a 20 20 20 20 62 49 6e 69 74  ISTS){.    bInit
f050: 20 3d 20 46 41 4c 53 45 3b 0a 20 20 7d 0a 0a 20   = FALSE;.  }.. 
f060: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4e   sqlite3_free(zN
f070: 61 6d 65 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 77  ame);..  /* If w
f080: 65 20 73 75 63 63 65 65 64 65 64 20 69 6e 20 6d  e succeeded in m
f090: 61 6b 69 6e 67 20 74 68 65 20 73 68 61 72 65 64  aking the shared
f0a0: 20 6d 65 6d 6f 72 79 20 68 61 6e 64 6c 65 2c 20   memory handle, 
f0b0: 6d 61 70 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28  map it. */.  if(
f0c0: 20 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 20   pFile->hShared 
f0d0: 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 73 68  ){.    pFile->sh
f0e0: 61 72 65 64 20 3d 20 28 77 69 6e 63 65 4c 6f 63  ared = (winceLoc
f0f0: 6b 2a 29 6f 73 4d 61 70 56 69 65 77 4f 66 46 69  k*)osMapViewOfFi
f100: 6c 65 28 70 46 69 6c 65 2d 3e 68 53 68 61 72 65  le(pFile->hShare
f110: 64 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  d, .            
f120: 20 46 49 4c 45 5f 4d 41 50 5f 52 45 41 44 7c 46   FILE_MAP_READ|F
f130: 49 4c 45 5f 4d 41 50 5f 57 52 49 54 45 2c 20 30  ILE_MAP_WRITE, 0
f140: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 69 6e 63  , 0, sizeof(winc
f150: 65 4c 6f 63 6b 29 29 3b 0a 20 20 20 20 2f 2a 20  eLock));.    /* 
f160: 49 66 20 6d 61 70 70 69 6e 67 20 66 61 69 6c 65  If mapping faile
f170: 64 2c 20 63 6c 6f 73 65 20 74 68 65 20 73 68 61  d, close the sha
f180: 72 65 64 20 6d 65 6d 6f 72 79 20 68 61 6e 64 6c  red memory handl
f190: 65 20 61 6e 64 20 65 72 61 73 65 20 69 74 20 2a  e and erase it *
f1a0: 2f 0a 20 20 20 20 69 66 28 20 21 70 46 69 6c 65  /.    if( !pFile
f1b0: 2d 3e 73 68 61 72 65 64 20 29 7b 0a 20 20 20 20  ->shared ){.    
f1c0: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
f1d0: 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
f1e0: 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 77 69 6e  ror();.      win
f1f0: 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
f200: 49 4f 45 52 52 2c 20 70 46 69 6c 65 2d 3e 6c 61  IOERR, pFile->la
f210: 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
f220: 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 63             "winc
f230: 65 43 72 65 61 74 65 4c 6f 63 6b 32 22 2c 20 7a  eCreateLock2", z
f240: 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Filename);.     
f250: 20 62 4c 6f 67 67 65 64 20 3d 20 54 52 55 45 3b   bLogged = TRUE;
f260: 0a 20 20 20 20 20 20 6f 73 43 6c 6f 73 65 48 61  .      osCloseHa
f270: 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 53 68 61  ndle(pFile->hSha
f280: 72 65 64 29 3b 0a 20 20 20 20 20 20 70 46 69 6c  red);.      pFil
f290: 65 2d 3e 68 53 68 61 72 65 64 20 3d 20 4e 55 4c  e->hShared = NUL
f2a0: 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  L;.    }.  }..  
f2b0: 2f 2a 20 49 66 20 73 68 61 72 65 64 20 6d 65 6d  /* If shared mem
f2c0: 6f 72 79 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  ory could not be
f2d0: 20 63 72 65 61 74 65 64 2c 20 74 68 65 6e 20 63   created, then c
f2e0: 6c 6f 73 65 20 74 68 65 20 6d 75 74 65 78 20 61  lose the mutex a
f2f0: 6e 64 20 66 61 69 6c 20 2a 2f 0a 20 20 69 66 28  nd fail */.  if(
f300: 20 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 3d   pFile->hShared=
f310: 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28  =NULL ){.    if(
f320: 20 21 62 4c 6f 67 67 65 64 20 29 7b 0a 20 20 20   !bLogged ){.   
f330: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
f340: 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b  rno = lastErrno;
f350: 0a 20 20 20 20 20 20 77 69 6e 4c 6f 67 45 72 72  .      winLogErr
f360: 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c  or(SQLITE_IOERR,
f370: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
f380: 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
f390: 20 20 20 20 20 22 77 69 6e 63 65 43 72 65 61 74       "winceCreat
f3a0: 65 4c 6f 63 6b 33 22 2c 20 7a 46 69 6c 65 6e 61  eLock3", zFilena
f3b0: 6d 65 29 3b 0a 20 20 20 20 20 20 62 4c 6f 67 67  me);.      bLogg
f3c0: 65 64 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d  ed = TRUE;.    }
f3d0: 0a 20 20 20 20 77 69 6e 63 65 4d 75 74 65 78 52  .    winceMutexR
f3e0: 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d  elease(pFile->hM
f3f0: 75 74 65 78 29 3b 0a 20 20 20 20 6f 73 43 6c 6f  utex);.    osClo
f400: 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e  seHandle(pFile->
f410: 68 4d 75 74 65 78 29 3b 0a 20 20 20 20 70 46 69  hMutex);.    pFi
f420: 6c 65 2d 3e 68 4d 75 74 65 78 20 3d 20 4e 55 4c  le->hMutex = NUL
f430: 4c 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  L;.    return SQ
f440: 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a  LITE_IOERR;.  }.
f450: 20 20 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69    .  /* Initiali
f460: 7a 65 20 74 68 65 20 73 68 61 72 65 64 20 6d 65  ze the shared me
f470: 6d 6f 72 79 20 69 66 20 77 65 27 72 65 20 73 75  mory if we're su
f480: 70 70 6f 73 65 64 20 74 6f 20 2a 2f 0a 20 20 69  pposed to */.  i
f490: 66 28 20 62 49 6e 69 74 20 29 7b 0a 20 20 20 20  f( bInit ){.    
f4a0: 6d 65 6d 73 65 74 28 70 46 69 6c 65 2d 3e 73 68  memset(pFile->sh
f4b0: 61 72 65 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28  ared, 0, sizeof(
f4c0: 77 69 6e 63 65 4c 6f 63 6b 29 29 3b 0a 20 20 7d  winceLock));.  }
f4d0: 0a 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 52 65  ..  winceMutexRe
f4e0: 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75  lease(pFile->hMu
f4f0: 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  tex);.  return S
f500: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
f510: 2a 2a 20 44 65 73 74 72 6f 79 20 74 68 65 20 70  ** Destroy the p
f520: 61 72 74 20 6f 66 20 77 69 6e 46 69 6c 65 20 74  art of winFile t
f530: 68 61 74 20 64 65 61 6c 73 20 77 69 74 68 20 77  hat deals with w
f540: 69 6e 63 65 20 6c 6f 63 6b 73 0a 2a 2f 0a 73 74  ince locks.*/.st
f550: 61 74 69 63 20 76 6f 69 64 20 77 69 6e 63 65 44  atic void winceD
f560: 65 73 74 72 6f 79 4c 6f 63 6b 28 77 69 6e 46 69  estroyLock(winFi
f570: 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 66  le *pFile){.  if
f580: 20 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29   (pFile->hMutex)
f590: 7b 0a 20 20 20 20 2f 2a 20 41 63 71 75 69 72 65  {.    /* Acquire
f5a0: 20 74 68 65 20 6d 75 74 65 78 20 2a 2f 0a 20 20   the mutex */.  
f5b0: 20 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71 75    winceMutexAcqu
f5c0: 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65  ire(pFile->hMute
f5d0: 78 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20  x);..    /* The 
f5e0: 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 73  following blocks
f5f0: 20 73 68 6f 75 6c 64 20 70 72 6f 62 61 62 6c 79   should probably
f600: 20 61 73 73 65 72 74 20 69 6e 20 64 65 62 75 67   assert in debug
f610: 20 6d 6f 64 65 2c 20 62 75 74 20 74 68 65 79 0a   mode, but they.
f620: 20 20 20 20 20 20 20 61 72 65 20 74 6f 20 63 6c         are to cl
f630: 65 61 6e 75 70 20 69 6e 20 63 61 73 65 20 61 6e  eanup in case an
f640: 79 20 6c 6f 63 6b 73 20 72 65 6d 61 69 6e 65 64  y locks remained
f650: 20 6f 70 65 6e 20 2a 2f 0a 20 20 20 20 69 66 20   open */.    if 
f660: 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52  (pFile->local.nR
f670: 65 61 64 65 72 73 29 7b 0a 20 20 20 20 20 20 70  eaders){.      p
f680: 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 6e 52  File->shared->nR
f690: 65 61 64 65 72 73 20 2d 2d 3b 0a 20 20 20 20 7d  eaders --;.    }
f6a0: 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  .    if (pFile->
f6b0: 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76 65 64 29  local.bReserved)
f6c0: 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73  {.      pFile->s
f6d0: 68 61 72 65 64 2d 3e 62 52 65 73 65 72 76 65 64  hared->bReserved
f6e0: 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a   = FALSE;.    }.
f6f0: 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c      if (pFile->l
f700: 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67 29 7b 0a  ocal.bPending){.
f710: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61        pFile->sha
f720: 72 65 64 2d 3e 62 50 65 6e 64 69 6e 67 20 3d 20  red->bPending = 
f730: 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 20 20 20  FALSE;.    }.   
f740: 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61   if (pFile->loca
f750: 6c 2e 62 45 78 63 6c 75 73 69 76 65 29 7b 0a 20  l.bExclusive){. 
f760: 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72       pFile->shar
f770: 65 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d  ed->bExclusive =
f780: 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 0a 20   FALSE;.    }.. 
f790: 20 20 20 2f 2a 20 44 65 2d 72 65 66 65 72 65 6e     /* De-referen
f7a0: 63 65 20 61 6e 64 20 63 6c 6f 73 65 20 6f 75 72  ce and close our
f7b0: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 68 61   copy of the sha
f7c0: 72 65 64 20 6d 65 6d 6f 72 79 20 68 61 6e 64 6c  red memory handl
f7d0: 65 20 2a 2f 0a 20 20 20 20 6f 73 55 6e 6d 61 70  e */.    osUnmap
f7e0: 56 69 65 77 4f 66 46 69 6c 65 28 70 46 69 6c 65  ViewOfFile(pFile
f7f0: 2d 3e 73 68 61 72 65 64 29 3b 0a 20 20 20 20 6f  ->shared);.    o
f800: 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 69  sCloseHandle(pFi
f810: 6c 65 2d 3e 68 53 68 61 72 65 64 29 3b 0a 0a 20  le->hShared);.. 
f820: 20 20 20 2f 2a 20 44 6f 6e 65 20 77 69 74 68 20     /* Done with 
f830: 74 68 65 20 6d 75 74 65 78 20 2a 2f 0a 20 20 20  the mutex */.   
f840: 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c 65 61   winceMutexRelea
f850: 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78  se(pFile->hMutex
f860: 29 3b 20 20 20 20 0a 20 20 20 20 6f 73 43 6c 6f  );    .    osClo
f870: 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e  seHandle(pFile->
f880: 68 4d 75 74 65 78 29 3b 0a 20 20 20 20 70 46 69  hMutex);.    pFi
f890: 6c 65 2d 3e 68 4d 75 74 65 78 20 3d 20 4e 55 4c  le->hMutex = NUL
f8a0: 4c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 0a 2a 2a  L;.  }.}../* .**
f8b0: 20 41 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69   An implementati
f8c0: 6f 6e 20 6f 66 20 74 68 65 20 4c 6f 63 6b 46 69  on of the LockFi
f8d0: 6c 65 28 29 20 41 50 49 20 6f 66 20 57 69 6e 64  le() API of Wind
f8e0: 6f 77 73 20 66 6f 72 20 43 45 0a 2a 2f 0a 73 74  ows for CE.*/.st
f8f0: 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 63 65 4c  atic BOOL winceL
f900: 6f 63 6b 46 69 6c 65 28 0a 20 20 4c 50 48 41 4e  ockFile(.  LPHAN
f910: 44 4c 45 20 70 68 46 69 6c 65 2c 0a 20 20 44 57  DLE phFile,.  DW
f920: 4f 52 44 20 64 77 46 69 6c 65 4f 66 66 73 65 74  ORD dwFileOffset
f930: 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 64 77 46  Low,.  DWORD dwF
f940: 69 6c 65 4f 66 66 73 65 74 48 69 67 68 2c 0a 20  ileOffsetHigh,. 
f950: 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66   DWORD nNumberOf
f960: 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 2c 0a  BytesToLockLow,.
f970: 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f    DWORD nNumberO
f980: 66 42 79 74 65 73 54 6f 4c 6f 63 6b 48 69 67 68  fBytesToLockHigh
f990: 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70  .){.  winFile *p
f9a0: 46 69 6c 65 20 3d 20 48 41 4e 44 4c 45 5f 54 4f  File = HANDLE_TO
f9b0: 5f 57 49 4e 46 49 4c 45 28 70 68 46 69 6c 65 29  _WINFILE(phFile)
f9c0: 3b 0a 20 20 42 4f 4f 4c 20 62 52 65 74 75 72 6e  ;.  BOOL bReturn
f9d0: 20 3d 20 46 41 4c 53 45 3b 0a 0a 20 20 55 4e 55   = FALSE;..  UNU
f9e0: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 77  SED_PARAMETER(dw
f9f0: 46 69 6c 65 4f 66 66 73 65 74 48 69 67 68 29 3b  FileOffsetHigh);
fa00: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
fa10: 54 45 52 28 6e 4e 75 6d 62 65 72 4f 66 42 79 74  TER(nNumberOfByt
fa20: 65 73 54 6f 4c 6f 63 6b 48 69 67 68 29 3b 0a 0a  esToLockHigh);..
fa30: 20 20 69 66 20 28 21 70 46 69 6c 65 2d 3e 68 4d    if (!pFile->hM
fa40: 75 74 65 78 29 20 72 65 74 75 72 6e 20 54 52 55  utex) return TRU
fa50: 45 3b 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 41  E;.  winceMutexA
fa60: 63 71 75 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d  cquire(pFile->hM
fa70: 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 57 61 6e  utex);..  /* Wan
fa80: 74 69 6e 67 20 61 6e 20 65 78 63 6c 75 73 69 76  ting an exclusiv
fa90: 65 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 69 66 20  e lock? */.  if 
faa0: 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77  (dwFileOffsetLow
fab0: 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45   == (DWORD)SHARE
fac0: 44 5f 46 49 52 53 54 0a 20 20 20 20 20 20 20 26  D_FIRST.       &
fad0: 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  & nNumberOfBytes
fae0: 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 28 44 57  ToLockLow == (DW
faf0: 4f 52 44 29 53 48 41 52 45 44 5f 53 49 5a 45 29  ORD)SHARED_SIZE)
fb00: 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d  {.    if (pFile-
fb10: 3e 73 68 61 72 65 64 2d 3e 6e 52 65 61 64 65 72  >shared->nReader
fb20: 73 20 3d 3d 20 30 20 26 26 20 70 46 69 6c 65 2d  s == 0 && pFile-
fb30: 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75 73  >shared->bExclus
fb40: 69 76 65 20 3d 3d 20 30 29 7b 0a 20 20 20 20 20  ive == 0){.     
fb50: 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d    pFile->shared-
fb60: 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 20 54 52  >bExclusive = TR
fb70: 55 45 3b 0a 20 20 20 20 20 20 20 70 46 69 6c 65  UE;.       pFile
fb80: 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69  ->local.bExclusi
fb90: 76 65 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20  ve = TRUE;.     
fba0: 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45    bReturn = TRUE
fbb0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
fbc0: 2a 20 57 61 6e 74 20 61 20 72 65 61 64 2d 6f 6e  * Want a read-on
fbd0: 6c 79 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 65 6c  ly lock? */.  el
fbe0: 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66  se if (dwFileOff
fbf0: 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44  setLow == (DWORD
fc00: 29 53 48 41 52 45 44 5f 46 49 52 53 54 20 26 26  )SHARED_FIRST &&
fc10: 0a 20 20 20 20 20 20 20 20 20 20 20 6e 4e 75 6d  .           nNum
fc20: 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b  berOfBytesToLock
fc30: 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20 69  Low == 1){.    i
fc40: 66 20 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64  f (pFile->shared
fc50: 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 3d 20  ->bExclusive == 
fc60: 30 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  0){.      pFile-
fc70: 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 20  >local.nReaders 
fc80: 2b 2b 3b 0a 20 20 20 20 20 20 69 66 20 28 70 46  ++;.      if (pF
fc90: 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64  ile->local.nRead
fca0: 65 72 73 20 3d 3d 20 31 29 7b 0a 20 20 20 20 20  ers == 1){.     
fcb0: 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64     pFile->shared
fcc0: 2d 3e 6e 52 65 61 64 65 72 73 20 2b 2b 3b 0a 20  ->nReaders ++;. 
fcd0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 52 65       }.      bRe
fce0: 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20  turn = TRUE;.   
fcf0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 61 6e   }.  }..  /* Wan
fd00: 74 20 61 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b  t a pending lock
fd10: 3f 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20 28  ? */.  else if (
fd20: 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20  dwFileOffsetLow 
fd30: 3d 3d 20 28 44 57 4f 52 44 29 50 45 4e 44 49 4e  == (DWORD)PENDIN
fd40: 47 5f 42 59 54 45 0a 20 20 20 20 20 20 20 20 20  G_BYTE.         
fd50: 20 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79    && nNumberOfBy
fd60: 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20  tesToLockLow == 
fd70: 31 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f  1){.    /* If no
fd80: 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 20 68 61   pending lock ha
fd90: 73 20 62 65 65 6e 20 61 63 71 75 69 72 65 64 2c  s been acquired,
fda0: 20 74 68 65 6e 20 61 63 71 75 69 72 65 20 69 74   then acquire it
fdb0: 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 46 69 6c   */.    if (pFil
fdc0: 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e 64  e->shared->bPend
fdd0: 69 6e 67 20 3d 3d 20 30 29 20 7b 0a 20 20 20 20  ing == 0) {.    
fde0: 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d    pFile->shared-
fdf0: 3e 62 50 65 6e 64 69 6e 67 20 3d 20 54 52 55 45  >bPending = TRUE
fe00: 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  ;.      pFile->l
fe10: 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67 20 3d 20  ocal.bPending = 
fe20: 54 52 55 45 3b 0a 20 20 20 20 20 20 62 52 65 74  TRUE;.      bRet
fe30: 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20  urn = TRUE;.    
fe40: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 61 6e 74  }.  }..  /* Want
fe50: 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b   a reserved lock
fe60: 3f 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20 28  ? */.  else if (
fe70: 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20  dwFileOffsetLow 
fe80: 3d 3d 20 28 44 57 4f 52 44 29 52 45 53 45 52 56  == (DWORD)RESERV
fe90: 45 44 5f 42 59 54 45 0a 20 20 20 20 20 20 20 20  ED_BYTE.        
fea0: 20 20 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42     && nNumberOfB
feb0: 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d  ytesToLockLow ==
fec0: 20 31 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69   1){.    if (pFi
fed0: 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52 65 73  le->shared->bRes
fee0: 65 72 76 65 64 20 3d 3d 20 30 29 20 7b 0a 20 20  erved == 0) {.  
fef0: 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65      pFile->share
ff00: 64 2d 3e 62 52 65 73 65 72 76 65 64 20 3d 20 54  d->bReserved = T
ff10: 52 55 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65  RUE;.      pFile
ff20: 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76 65  ->local.bReserve
ff30: 64 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20  d = TRUE;.      
ff40: 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a  bReturn = TRUE;.
ff50: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 77 69 6e      }.  }..  win
ff60: 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28 70  ceMutexRelease(p
ff70: 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20  File->hMutex);. 
ff80: 20 72 65 74 75 72 6e 20 62 52 65 74 75 72 6e 3b   return bReturn;
ff90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6d 70  .}../*.** An imp
ffa0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
ffb0: 68 65 20 55 6e 6c 6f 63 6b 46 69 6c 65 20 41 50  he UnlockFile AP
ffc0: 49 20 6f 66 20 57 69 6e 64 6f 77 73 20 66 6f 72  I of Windows for
ffd0: 20 43 45 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f   CE.*/.static BO
ffe0: 4f 4c 20 77 69 6e 63 65 55 6e 6c 6f 63 6b 46 69  OL winceUnlockFi
fff0: 6c 65 28 0a 20 20 4c 50 48 41 4e 44 4c 45 20 70  le(.  LPHANDLE p
10000 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20 64  hFile,.  DWORD d
10010 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 2c 0a  wFileOffsetLow,.
10020 20 20 44 57 4f 52 44 20 64 77 46 69 6c 65 4f 66    DWORD dwFileOf
10030 66 73 65 74 48 69 67 68 2c 0a 20 20 44 57 4f 52  fsetHigh,.  DWOR
10040 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  D nNumberOfBytes
10050 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 2c 0a 20 20 44  ToUnlockLow,.  D
10060 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79  WORD nNumberOfBy
10070 74 65 73 54 6f 55 6e 6c 6f 63 6b 48 69 67 68 0a  tesToUnlockHigh.
10080 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46  ){.  winFile *pF
10090 69 6c 65 20 3d 20 48 41 4e 44 4c 45 5f 54 4f 5f  ile = HANDLE_TO_
100a0 57 49 4e 46 49 4c 45 28 70 68 46 69 6c 65 29 3b  WINFILE(phFile);
100b0 0a 20 20 42 4f 4f 4c 20 62 52 65 74 75 72 6e 20  .  BOOL bReturn 
100c0 3d 20 46 41 4c 53 45 3b 0a 0a 20 20 55 4e 55 53  = FALSE;..  UNUS
100d0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 77 46  ED_PARAMETER(dwF
100e0 69 6c 65 4f 66 66 73 65 74 48 69 67 68 29 3b 0a  ileOffsetHigh);.
100f0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
10100 45 52 28 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65  ER(nNumberOfByte
10110 73 54 6f 55 6e 6c 6f 63 6b 48 69 67 68 29 3b 0a  sToUnlockHigh);.
10120 0a 20 20 69 66 20 28 21 70 46 69 6c 65 2d 3e 68  .  if (!pFile->h
10130 4d 75 74 65 78 29 20 72 65 74 75 72 6e 20 54 52  Mutex) return TR
10140 55 45 3b 0a 20 20 77 69 6e 63 65 4d 75 74 65 78  UE;.  winceMutex
10150 41 63 71 75 69 72 65 28 70 46 69 6c 65 2d 3e 68  Acquire(pFile->h
10160 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 52 65  Mutex);..  /* Re
10170 6c 65 61 73 69 6e 67 20 61 20 72 65 61 64 65 72  leasing a reader
10180 20 6c 6f 63 6b 20 6f 72 20 61 6e 20 65 78 63 6c   lock or an excl
10190 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20  usive lock */.  
101a0 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74  if (dwFileOffset
101b0 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48  Low == (DWORD)SH
101c0 41 52 45 44 5f 46 49 52 53 54 29 7b 0a 20 20 20  ARED_FIRST){.   
101d0 20 2f 2a 20 44 69 64 20 77 65 20 68 61 76 65 20   /* Did we have 
101e0 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
101f0 6b 3f 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 46  k? */.    if (pF
10200 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c  ile->local.bExcl
10210 75 73 69 76 65 29 7b 0a 20 20 20 20 20 20 61 73  usive){.      as
10220 73 65 72 74 28 6e 4e 75 6d 62 65 72 4f 66 42 79  sert(nNumberOfBy
10230 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d  tesToUnlockLow =
10240 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f  = (DWORD)SHARED_
10250 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 70 46 69  SIZE);.      pFi
10260 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75  le->local.bExclu
10270 73 69 76 65 20 3d 20 46 41 4c 53 45 3b 0a 20 20  sive = FALSE;.  
10280 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65      pFile->share
10290 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 20  d->bExclusive = 
102a0 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 62 52 65  FALSE;.      bRe
102b0 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20  turn = TRUE;.   
102c0 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 69 64 20 77   }..    /* Did w
102d0 65 20 6a 75 73 74 20 68 61 76 65 20 61 20 72 65  e just have a re
102e0 61 64 65 72 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20  ader lock? */.  
102f0 20 20 65 6c 73 65 20 69 66 20 28 70 46 69 6c 65    else if (pFile
10300 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73  ->local.nReaders
10310 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
10320 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f  nNumberOfBytesTo
10330 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 28 44 57  UnlockLow == (DW
10340 4f 52 44 29 53 48 41 52 45 44 5f 53 49 5a 45 0a  ORD)SHARED_SIZE.
10350 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
10360 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f  nNumberOfBytesTo
10370 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 3b  UnlockLow == 1);
10380 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f  .      pFile->lo
10390 63 61 6c 2e 6e 52 65 61 64 65 72 73 20 2d 2d 3b  cal.nReaders --;
103a0 0a 20 20 20 20 20 20 69 66 20 28 70 46 69 6c 65  .      if (pFile
103b0 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73  ->local.nReaders
103c0 20 3d 3d 20 30 29 0a 20 20 20 20 20 20 7b 0a 20   == 0).      {. 
103d0 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68         pFile->sh
103e0 61 72 65 64 2d 3e 6e 52 65 61 64 65 72 73 20 2d  ared->nReaders -
103f0 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  -;.      }.     
10400 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b   bReturn = TRUE;
10410 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
10420 20 52 65 6c 65 61 73 69 6e 67 20 61 20 70 65 6e   Releasing a pen
10430 64 69 6e 67 20 6c 6f 63 6b 20 2a 2f 0a 20 20 65  ding lock */.  e
10440 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66  lse if (dwFileOf
10450 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52  fsetLow == (DWOR
10460 44 29 50 45 4e 44 49 4e 47 5f 42 59 54 45 0a 20  D)PENDING_BYTE. 
10470 20 20 20 20 20 20 20 20 20 20 26 26 20 6e 4e 75            && nNu
10480 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c  mberOfBytesToUnl
10490 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20  ockLow == 1){.  
104a0 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63    if (pFile->loc
104b0 61 6c 2e 62 50 65 6e 64 69 6e 67 29 7b 0a 20 20  al.bPending){.  
104c0 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c      pFile->local
104d0 2e 62 50 65 6e 64 69 6e 67 20 3d 20 46 41 4c 53  .bPending = FALS
104e0 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  E;.      pFile->
104f0 73 68 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e 67  shared->bPending
10500 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20   = FALSE;.      
10510 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a  bReturn = TRUE;.
10520 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 52      }.  }.  /* R
10530 65 6c 65 61 73 69 6e 67 20 61 20 72 65 73 65 72  eleasing a reser
10540 76 65 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 65 6c  ved lock */.  el
10550 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66  se if (dwFileOff
10560 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44  setLow == (DWORD
10570 29 52 45 53 45 52 56 45 44 5f 42 59 54 45 0a 20  )RESERVED_BYTE. 
10580 20 20 20 20 20 20 20 20 20 20 26 26 20 6e 4e 75            && nNu
10590 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c  mberOfBytesToUnl
105a0 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20  ockLow == 1){.  
105b0 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63    if (pFile->loc
105c0 61 6c 2e 62 52 65 73 65 72 76 65 64 29 20 7b 0a  al.bReserved) {.
105d0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63        pFile->loc
105e0 61 6c 2e 62 52 65 73 65 72 76 65 64 20 3d 20 46  al.bReserved = F
105f0 41 4c 53 45 3b 0a 20 20 20 20 20 20 70 46 69 6c  ALSE;.      pFil
10600 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52 65 73 65  e->shared->bRese
10610 72 76 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20  rved = FALSE;.  
10620 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52      bReturn = TR
10630 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  UE;.    }.  }.. 
10640 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c 65 61   winceMutexRelea
10650 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78  se(pFile->hMutex
10660 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 52 65 74  );.  return bRet
10670 75 72 6e 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 45 6e 64  urn;.}./*.** End
10680 20 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c 20   of the special 
10690 63 6f 64 65 20 66 6f 72 20 77 69 6e 63 65 0a 2a  code for wince.*
106a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
106b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
106c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
106d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
106e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 65  ************/.#e
106f0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
10700 53 5f 57 49 4e 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a  S_WINCE */../*.*
10710 2a 20 4c 6f 63 6b 20 61 20 66 69 6c 65 20 72 65  * Lock a file re
10720 67 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  gion..*/.static 
10730 42 4f 4f 4c 20 77 69 6e 4c 6f 63 6b 46 69 6c 65  BOOL winLockFile
10740 28 0a 20 20 4c 50 48 41 4e 44 4c 45 20 70 68 46  (.  LPHANDLE phF
10750 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20 66 6c 61  ile,.  DWORD fla
10760 67 73 2c 0a 20 20 44 57 4f 52 44 20 6f 66 66 73  gs,.  DWORD offs
10770 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6f  etLow,.  DWORD o
10780 66 66 73 65 74 48 69 67 68 2c 0a 20 20 44 57 4f  ffsetHigh,.  DWO
10790 52 44 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 0a  RD numBytesLow,.
107a0 20 20 44 57 4f 52 44 20 6e 75 6d 42 79 74 65 73    DWORD numBytes
107b0 48 69 67 68 0a 29 7b 0a 23 69 66 20 53 51 4c 49  High.){.#if SQLI
107c0 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 2f 2a  TE_OS_WINCE.  /*
107d0 0a 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 69 6e 64  .  ** NOTE: Wind
107e0 6f 77 73 20 43 45 20 69 73 20 68 61 6e 64 6c 65  ows CE is handle
107f0 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20 68 65  d differently he
10800 72 65 20 64 75 65 20 69 74 73 20 6c 61 63 6b 20  re due its lack 
10810 6f 66 20 74 68 65 20 57 69 6e 33 32 0a 20 20 2a  of the Win32.  *
10820 2a 20 20 20 20 20 20 20 41 50 49 20 4c 6f 63 6b  *       API Lock
10830 46 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74  File..  */.  ret
10840 75 72 6e 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c  urn winceLockFil
10850 65 28 70 68 46 69 6c 65 2c 20 6f 66 66 73 65 74  e(phFile, offset
10860 4c 6f 77 2c 20 6f 66 66 73 65 74 48 69 67 68 2c  Low, offsetHigh,
10870 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10880 20 20 20 20 20 20 20 20 6e 75 6d 42 79 74 65 73          numBytes
10890 4c 6f 77 2c 20 6e 75 6d 42 79 74 65 73 48 69 67  Low, numBytesHig
108a0 68 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28 20  h);.#else.  if( 
108b0 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 20 20 20  osIsNT() ){.    
108c0 4f 56 45 52 4c 41 50 50 45 44 20 6f 76 6c 70 3b  OVERLAPPED ovlp;
108d0 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 6f 76 6c  .    memset(&ovl
108e0 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4f 56 45  p, 0, sizeof(OVE
108f0 52 4c 41 50 50 45 44 29 29 3b 0a 20 20 20 20 6f  RLAPPED));.    o
10900 76 6c 70 2e 4f 66 66 73 65 74 20 3d 20 6f 66 66  vlp.Offset = off
10910 73 65 74 4c 6f 77 3b 0a 20 20 20 20 6f 76 6c 70  setLow;.    ovlp
10920 2e 4f 66 66 73 65 74 48 69 67 68 20 3d 20 6f 66  .OffsetHigh = of
10930 66 73 65 74 48 69 67 68 3b 0a 20 20 20 20 72 65  fsetHigh;.    re
10940 74 75 72 6e 20 6f 73 4c 6f 63 6b 46 69 6c 65 45  turn osLockFileE
10950 78 28 2a 70 68 46 69 6c 65 2c 20 66 6c 61 67 73  x(*phFile, flags
10960 2c 20 30 2c 20 6e 75 6d 42 79 74 65 73 4c 6f 77  , 0, numBytesLow
10970 2c 20 6e 75 6d 42 79 74 65 73 48 69 67 68 2c 20  , numBytesHigh, 
10980 26 6f 76 6c 70 29 3b 0a 20 20 7d 65 6c 73 65 7b  &ovlp);.  }else{
10990 0a 20 20 20 20 72 65 74 75 72 6e 20 6f 73 4c 6f  .    return osLo
109a0 63 6b 46 69 6c 65 28 2a 70 68 46 69 6c 65 2c 20  ckFile(*phFile, 
109b0 6f 66 66 73 65 74 4c 6f 77 2c 20 6f 66 66 73 65  offsetLow, offse
109c0 74 48 69 67 68 2c 20 6e 75 6d 42 79 74 65 73 4c  tHigh, numBytesL
109d0 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ow,.            
109e0 20 20 20 20 20 20 20 20 20 20 6e 75 6d 42 79 74            numByt
109f0 65 73 48 69 67 68 29 3b 0a 20 20 7d 0a 23 65 6e  esHigh);.  }.#en
10a00 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c  dif.}../*.** Unl
10a10 6f 63 6b 20 61 20 66 69 6c 65 20 72 65 67 69 6f  ock a file regio
10a20 6e 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 42 4f  n.. */.static BO
10a30 4f 4c 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65  OL winUnlockFile
10a40 28 0a 20 20 4c 50 48 41 4e 44 4c 45 20 70 68 46  (.  LPHANDLE phF
10a50 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20 6f 66 66  ile,.  DWORD off
10a60 73 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20  setLow,.  DWORD 
10a70 6f 66 66 73 65 74 48 69 67 68 2c 0a 20 20 44 57  offsetHigh,.  DW
10a80 4f 52 44 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c  ORD numBytesLow,
10a90 0a 20 20 44 57 4f 52 44 20 6e 75 6d 42 79 74 65  .  DWORD numByte
10aa0 73 48 69 67 68 0a 29 7b 0a 23 69 66 20 53 51 4c  sHigh.){.#if SQL
10ab0 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 2f  ITE_OS_WINCE.  /
10ac0 2a 0a 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 69 6e  *.  ** NOTE: Win
10ad0 64 6f 77 73 20 43 45 20 69 73 20 68 61 6e 64 6c  dows CE is handl
10ae0 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20 68  ed differently h
10af0 65 72 65 20 64 75 65 20 69 74 73 20 6c 61 63 6b  ere due its lack
10b00 20 6f 66 20 74 68 65 20 57 69 6e 33 32 0a 20 20   of the Win32.  
10b10 2a 2a 20 20 20 20 20 20 20 41 50 49 20 55 6e 6c  **       API Unl
10b20 6f 63 6b 46 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  ockFile..  */.  
10b30 72 65 74 75 72 6e 20 77 69 6e 63 65 55 6e 6c 6f  return winceUnlo
10b40 63 6b 46 69 6c 65 28 70 68 46 69 6c 65 2c 20 6f  ckFile(phFile, o
10b50 66 66 73 65 74 4c 6f 77 2c 20 6f 66 66 73 65 74  ffsetLow, offset
10b60 48 69 67 68 2c 0a 20 20 20 20 20 20 20 20 20 20  High,.          
10b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
10b80 75 6d 42 79 74 65 73 4c 6f 77 2c 20 6e 75 6d 42  umBytesLow, numB
10b90 79 74 65 73 48 69 67 68 29 3b 0a 23 65 6c 73 65  ytesHigh);.#else
10ba0 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20  .  if( osIsNT() 
10bb0 29 7b 0a 20 20 20 20 4f 56 45 52 4c 41 50 50 45  ){.    OVERLAPPE
10bc0 44 20 6f 76 6c 70 3b 0a 20 20 20 20 6d 65 6d 73  D ovlp;.    mems
10bd0 65 74 28 26 6f 76 6c 70 2c 20 30 2c 20 73 69 7a  et(&ovlp, 0, siz
10be0 65 6f 66 28 4f 56 45 52 4c 41 50 50 45 44 29 29  eof(OVERLAPPED))
10bf0 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66 66 73 65  ;.    ovlp.Offse
10c00 74 20 3d 20 6f 66 66 73 65 74 4c 6f 77 3b 0a 20  t = offsetLow;. 
10c10 20 20 20 6f 76 6c 70 2e 4f 66 66 73 65 74 48 69     ovlp.OffsetHi
10c20 67 68 20 3d 20 6f 66 66 73 65 74 48 69 67 68 3b  gh = offsetHigh;
10c30 0a 20 20 20 20 72 65 74 75 72 6e 20 6f 73 55 6e  .    return osUn
10c40 6c 6f 63 6b 46 69 6c 65 45 78 28 2a 70 68 46 69  lockFileEx(*phFi
10c50 6c 65 2c 20 30 2c 20 6e 75 6d 42 79 74 65 73 4c  le, 0, numBytesL
10c60 6f 77 2c 20 6e 75 6d 42 79 74 65 73 48 69 67 68  ow, numBytesHigh
10c70 2c 20 26 6f 76 6c 70 29 3b 0a 20 20 7d 65 6c 73  , &ovlp);.  }els
10c80 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6f 73  e{.    return os
10c90 55 6e 6c 6f 63 6b 46 69 6c 65 28 2a 70 68 46 69  UnlockFile(*phFi
10ca0 6c 65 2c 20 6f 66 66 73 65 74 4c 6f 77 2c 20 6f  le, offsetLow, o
10cb0 66 66 73 65 74 48 69 67 68 2c 20 6e 75 6d 42 79  ffsetHigh, numBy
10cc0 74 65 73 4c 6f 77 2c 0a 20 20 20 20 20 20 20 20  tesLow,.        
10cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ce0 6e 75 6d 42 79 74 65 73 48 69 67 68 29 3b 0a 20  numBytesHigh);. 
10cf0 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 2a   }.#endif.}../**
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 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54  ***********.** T
10d50 68 65 20 6e 65 78 74 20 67 72 6f 75 70 20 6f 66  he next group of
10d60 20 72 6f 75 74 69 6e 65 73 20 69 6d 70 6c 65 6d   routines implem
10d70 65 6e 74 20 74 68 65 20 49 2f 4f 20 6d 65 74 68  ent the I/O meth
10d80 6f 64 73 20 73 70 65 63 69 66 69 65 64 0a 2a 2a  ods specified.**
10d90 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 33 5f   by the sqlite3_
10da0 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
10db0 74 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  t..*************
10dc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10dd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10de0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10df0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10e00 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 20 4d  */../*.** Some M
10e10 69 63 72 6f 73 6f 66 74 20 63 6f 6d 70 69 6c 65  icrosoft compile
10e20 72 73 20 6c 61 63 6b 20 74 68 69 73 20 64 65 66  rs lack this def
10e30 69 6e 69 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e  inition..*/.#ifn
10e40 64 65 66 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f  def INVALID_SET_
10e50 46 49 4c 45 5f 50 4f 49 4e 54 45 52 0a 23 20 64  FILE_POINTER.# d
10e60 65 66 69 6e 65 20 49 4e 56 41 4c 49 44 5f 53 45  efine INVALID_SE
10e70 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 20 28  T_FILE_POINTER (
10e80 28 44 57 4f 52 44 29 2d 31 29 0a 23 65 6e 64 69  (DWORD)-1).#endi
10e90 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  f../*.** Move th
10ea0 65 20 63 75 72 72 65 6e 74 20 70 6f 73 69 74 69  e current positi
10eb0 6f 6e 20 6f 66 20 74 68 65 20 66 69 6c 65 20 68  on of the file h
10ec0 61 6e 64 6c 65 20 70 61 73 73 65 64 20 61 73 20  andle passed as 
10ed0 74 68 65 20 66 69 72 73 74 20 0a 2a 2a 20 61 72  the first .** ar
10ee0 67 75 6d 65 6e 74 20 74 6f 20 6f 66 66 73 65 74  gument to offset
10ef0 20 69 4f 66 66 73 65 74 20 77 69 74 68 69 6e 20   iOffset within 
10f00 74 68 65 20 66 69 6c 65 2e 20 49 66 20 73 75 63  the file. If suc
10f10 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e 20  cessful, return 
10f20 30 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  0. .** Otherwise
10f30 2c 20 73 65 74 20 70 46 69 6c 65 2d 3e 6c 61 73  , set pFile->las
10f40 74 45 72 72 6e 6f 20 61 6e 64 20 72 65 74 75 72  tErrno and retur
10f50 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a 73  n non-zero..*/.s
10f60 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 65 65  tatic int winSee
10f70 6b 46 69 6c 65 28 77 69 6e 46 69 6c 65 20 2a 70  kFile(winFile *p
10f80 46 69 6c 65 2c 20 73 71 6c 69 74 65 33 5f 69 6e  File, sqlite3_in
10f90 74 36 34 20 69 4f 66 66 73 65 74 29 7b 0a 23 69  t64 iOffset){.#i
10fa0 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
10fb0 52 54 0a 20 20 4c 4f 4e 47 20 75 70 70 65 72 42  RT.  LONG upperB
10fc0 69 74 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  its;            
10fd0 20 20 20 20 20 2f 2a 20 4d 6f 73 74 20 73 69 67       /* Most sig
10fe0 2e 20 33 32 20 62 69 74 73 20 6f 66 20 6e 65 77  . 32 bits of new
10ff0 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 4c 4f 4e   offset */.  LON
11000 47 20 6c 6f 77 65 72 42 69 74 73 3b 20 20 20 20  G lowerBits;    
11010 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11020 4c 65 61 73 74 20 73 69 67 2e 20 33 32 20 62 69  Least sig. 32 bi
11030 74 73 20 6f 66 20 6e 65 77 20 6f 66 66 73 65 74  ts of new offset
11040 20 2a 2f 0a 20 20 44 57 4f 52 44 20 64 77 52 65   */.  DWORD dwRe
11050 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
11060 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72        /* Value r
11070 65 74 75 72 6e 65 64 20 62 79 20 53 65 74 46 69  eturned by SetFi
11080 6c 65 50 6f 69 6e 74 65 72 28 29 20 2a 2f 0a 20  lePointer() */. 
11090 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f   DWORD lastErrno
110a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
110b0 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e   /* Value return
110c0 65 64 20 62 79 20 47 65 74 4c 61 73 74 45 72 72  ed by GetLastErr
110d0 6f 72 28 29 20 2a 2f 0a 0a 20 20 4f 53 54 52 41  or() */..  OSTRA
110e0 43 45 28 28 22 53 45 45 4b 20 66 69 6c 65 3d 25  CE(("SEEK file=%
110f0 70 2c 20 6f 66 66 73 65 74 3d 25 6c 6c 64 5c 6e  p, offset=%lld\n
11100 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 69 4f 66  ", pFile->h, iOf
11110 66 73 65 74 29 29 3b 0a 0a 20 20 75 70 70 65 72  fset));..  upper
11120 42 69 74 73 20 3d 20 28 4c 4f 4e 47 29 28 28 69  Bits = (LONG)((i
11130 4f 66 66 73 65 74 3e 3e 33 32 29 20 26 20 30 78  Offset>>32) & 0x
11140 37 66 66 66 66 66 66 66 29 3b 0a 20 20 6c 6f 77  7fffffff);.  low
11150 65 72 42 69 74 73 20 3d 20 28 4c 4f 4e 47 29 28  erBits = (LONG)(
11160 69 4f 66 66 73 65 74 20 26 20 30 78 66 66 66 66  iOffset & 0xffff
11170 66 66 66 66 29 3b 0a 0a 20 20 2f 2a 20 41 50 49  ffff);..  /* API
11180 20 6f 64 64 69 74 79 3a 20 49 66 20 73 75 63 63   oddity: If succ
11190 65 73 73 66 75 6c 2c 20 53 65 74 46 69 6c 65 50  essful, SetFileP
111a0 6f 69 6e 74 65 72 28 29 20 72 65 74 75 72 6e 73  ointer() returns
111b0 20 61 20 64 77 6f 72 64 20 0a 20 20 2a 2a 20 63   a dword .  ** c
111c0 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6c 6f  ontaining the lo
111d0 77 65 72 20 33 32 2d 62 69 74 73 20 6f 66 20 74  wer 32-bits of t
111e0 68 65 20 6e 65 77 20 66 69 6c 65 2d 6f 66 66 73  he new file-offs
111f0 65 74 2e 20 4f 72 2c 20 69 66 20 69 74 20 66 61  et. Or, if it fa
11200 69 6c 73 2c 0a 20 20 2a 2a 20 69 74 20 72 65 74  ils,.  ** it ret
11210 75 72 6e 73 20 49 4e 56 41 4c 49 44 5f 53 45 54  urns INVALID_SET
11220 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 2e 20 48  _FILE_POINTER. H
11230 6f 77 65 76 65 72 20 61 63 63 6f 72 64 69 6e 67  owever according
11240 20 74 6f 20 4d 53 44 4e 2c 20 0a 20 20 2a 2a 20   to MSDN, .  ** 
11250 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45  INVALID_SET_FILE
11260 5f 50 4f 49 4e 54 45 52 20 6d 61 79 20 61 6c 73  _POINTER may als
11270 6f 20 62 65 20 61 20 76 61 6c 69 64 20 6e 65 77  o be a valid new
11280 20 6f 66 66 73 65 74 2e 20 53 6f 20 74 6f 20 64   offset. So to d
11290 65 74 65 72 6d 69 6e 65 20 0a 20 20 2a 2a 20 77  etermine .  ** w
112a0 68 65 74 68 65 72 20 61 6e 20 65 72 72 6f 72 20  hether an error 
112b0 68 61 73 20 61 63 74 75 61 6c 6c 79 20 6f 63 63  has actually occ
112c0 75 72 72 65 64 2c 20 69 74 20 69 73 20 61 6c 73  urred, it is als
112d0 6f 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 63  o necessary to c
112e0 61 6c 6c 20 0a 20 20 2a 2a 20 47 65 74 4c 61 73  all .  ** GetLas
112f0 74 45 72 72 6f 72 28 29 2e 0a 20 20 2a 2f 0a 20  tError()..  */. 
11300 20 64 77 52 65 74 20 3d 20 6f 73 53 65 74 46 69   dwRet = osSetFi
11310 6c 65 50 6f 69 6e 74 65 72 28 70 46 69 6c 65 2d  lePointer(pFile-
11320 3e 68 2c 20 6c 6f 77 65 72 42 69 74 73 2c 20 26  >h, lowerBits, &
11330 75 70 70 65 72 42 69 74 73 2c 20 46 49 4c 45 5f  upperBits, FILE_
11340 42 45 47 49 4e 29 3b 0a 0a 20 20 69 66 28 20 28  BEGIN);..  if( (
11350 64 77 52 65 74 3d 3d 49 4e 56 41 4c 49 44 5f 53  dwRet==INVALID_S
11360 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 0a  ET_FILE_POINTER.
11370 20 20 20 20 20 20 26 26 20 28 28 6c 61 73 74 45        && ((lastE
11380 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
11390 45 72 72 6f 72 28 29 29 21 3d 4e 4f 5f 45 52 52  Error())!=NO_ERR
113a0 4f 52 29 29 20 29 7b 0a 20 20 20 20 70 46 69 6c  OR)) ){.    pFil
113b0 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c  e->lastErrno = l
113c0 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 77 69  astErrno;.    wi
113d0 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
113e0 5f 49 4f 45 52 52 5f 53 45 45 4b 2c 20 70 46 69  _IOERR_SEEK, pFi
113f0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20  le->lastErrno,. 
11400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
11410 77 69 6e 53 65 65 6b 46 69 6c 65 22 2c 20 70 46  winSeekFile", pF
11420 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  ile->zPath);.   
11430 20 4f 53 54 52 41 43 45 28 28 22 53 45 45 4b 20   OSTRACE(("SEEK 
11440 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49  file=%p, rc=SQLI
11450 54 45 5f 49 4f 45 52 52 5f 53 45 45 4b 5c 6e 22  TE_IOERR_SEEK\n"
11460 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
11470 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
11480 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 45 45  .  OSTRACE(("SEE
11490 4b 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51  K file=%p, rc=SQ
114a0 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c  LITE_OK\n", pFil
114b0 65 2d 3e 68 29 29 3b 0a 20 20 72 65 74 75 72 6e  e->h));.  return
114c0 20 30 3b 0a 23 65 6c 73 65 0a 20 20 2f 2a 0a 20   0;.#else.  /*. 
114d0 20 2a 2a 20 53 61 6d 65 20 61 73 20 61 62 6f 76   ** Same as abov
114e0 65 2c 20 65 78 63 65 70 74 20 74 68 61 74 20 74  e, except that t
114f0 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  his implementati
11500 6f 6e 20 77 6f 72 6b 73 20 66 6f 72 20 57 69 6e  on works for Win
11510 52 54 2e 0a 20 20 2a 2f 0a 0a 20 20 4c 41 52 47  RT..  */..  LARG
11520 45 5f 49 4e 54 45 47 45 52 20 78 3b 20 20 20 20  E_INTEGER x;    
11530 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
11540 68 65 20 6e 65 77 20 6f 66 66 73 65 74 20 2a 2f  he new offset */
11550 0a 20 20 42 4f 4f 4c 20 62 52 65 74 3b 20 20 20  .  BOOL bRet;   
11560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11570 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75     /* Value retu
11580 72 6e 65 64 20 62 79 20 53 65 74 46 69 6c 65 50  rned by SetFileP
11590 6f 69 6e 74 65 72 45 78 28 29 20 2a 2f 0a 0a 20  ointerEx() */.. 
115a0 20 78 2e 51 75 61 64 50 61 72 74 20 3d 20 69 4f   x.QuadPart = iO
115b0 66 66 73 65 74 3b 0a 20 20 62 52 65 74 20 3d 20  ffset;.  bRet = 
115c0 6f 73 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72  osSetFilePointer
115d0 45 78 28 70 46 69 6c 65 2d 3e 68 2c 20 78 2c 20  Ex(pFile->h, x, 
115e0 30 2c 20 46 49 4c 45 5f 42 45 47 49 4e 29 3b 0a  0, FILE_BEGIN);.
115f0 0a 20 20 69 66 28 21 62 52 65 74 29 7b 0a 20 20  .  if(!bRet){.  
11600 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
11610 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
11620 72 6f 72 28 29 3b 0a 20 20 20 20 77 69 6e 4c 6f  ror();.    winLo
11630 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
11640 45 52 52 5f 53 45 45 4b 2c 20 70 46 69 6c 65 2d  ERR_SEEK, pFile-
11650 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20  >lastErrno,.    
11660 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
11670 53 65 65 6b 46 69 6c 65 22 2c 20 70 46 69 6c 65  SeekFile", pFile
11680 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 4f 53  ->zPath);.    OS
11690 54 52 41 43 45 28 28 22 53 45 45 4b 20 66 69 6c  TRACE(("SEEK fil
116a0 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%p, rc=SQLITE_
116b0 49 4f 45 52 52 5f 53 45 45 4b 5c 6e 22 2c 20 70  IOERR_SEEK\n", p
116c0 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72  File->h));.    r
116d0 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20  eturn 1;.  }..  
116e0 4f 53 54 52 41 43 45 28 28 22 53 45 45 4b 20 66  OSTRACE(("SEEK f
116f0 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  ile=%p, rc=SQLIT
11700 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  E_OK\n", pFile->
11710 68 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  h));.  return 0;
11720 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 69 66 20 53  .#endif.}..#if S
11730 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
11740 49 5a 45 3e 30 0a 2f 2a 20 46 6f 72 77 61 72 64  IZE>0./* Forward
11750 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 56   references to V
11760 46 53 20 68 65 6c 70 65 72 20 6d 65 74 68 6f 64  FS helper method
11770 73 20 75 73 65 64 20 66 6f 72 20 6d 65 6d 6f 72  s used for memor
11780 79 20 6d 61 70 70 65 64 20 66 69 6c 65 73 20 2a  y mapped files *
11790 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
117a0 4d 61 70 66 69 6c 65 28 77 69 6e 46 69 6c 65 2a  Mapfile(winFile*
117b0 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  , sqlite3_int64)
117c0 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  ;.static int win
117d0 55 6e 6d 61 70 66 69 6c 65 28 77 69 6e 46 69 6c  Unmapfile(winFil
117e0 65 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  e*);.#endif../*.
117f0 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e  ** Close a file.
11800 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 72 65 70  .**.** It is rep
11810 6f 72 74 65 64 20 74 68 61 74 20 61 6e 20 61 74  orted that an at
11820 74 65 6d 70 74 20 74 6f 20 63 6c 6f 73 65 20 61  tempt to close a
11830 20 68 61 6e 64 6c 65 20 6d 69 67 68 74 20 73 6f   handle might so
11840 6d 65 74 69 6d 65 73 0a 2a 2a 20 66 61 69 6c 2e  metimes.** fail.
11850 20 20 54 68 69 73 20 69 73 20 61 20 76 65 72 79    This is a very
11860 20 75 6e 72 65 61 73 6f 6e 61 62 6c 65 20 72 65   unreasonable re
11870 73 75 6c 74 2c 20 62 75 74 20 57 69 6e 64 6f 77  sult, but Window
11880 73 20 69 73 20 6e 6f 74 6f 72 69 6f 75 73 0a 2a  s is notorious.*
11890 2a 20 66 6f 72 20 62 65 69 6e 67 20 75 6e 72 65  * for being unre
118a0 61 73 6f 6e 61 62 6c 65 20 73 6f 20 49 20 64 6f  asonable so I do
118b0 20 6e 6f 74 20 64 6f 75 62 74 20 74 68 61 74 20   not doubt that 
118c0 69 74 20 6d 69 67 68 74 20 68 61 70 70 65 6e 2e  it might happen.
118d0 20 20 49 66 0a 2a 2a 20 74 68 65 20 63 6c 6f 73    If.** the clos
118e0 65 20 66 61 69 6c 73 2c 20 77 65 20 70 61 75 73  e fails, we paus
118f0 65 20 66 6f 72 20 31 30 30 20 6d 69 6c 6c 69 73  e for 100 millis
11900 65 63 6f 6e 64 73 20 61 6e 64 20 74 72 79 20 61  econds and try a
11910 67 61 69 6e 2e 20 20 41 73 0a 2a 2a 20 6d 61 6e  gain.  As.** man
11920 79 20 61 73 20 4d 58 5f 43 4c 4f 53 45 5f 41 54  y as MX_CLOSE_AT
11930 54 45 4d 50 54 20 61 74 74 65 6d 70 74 73 20 74  TEMPT attempts t
11940 6f 20 63 6c 6f 73 65 20 74 68 65 20 68 61 6e 64  o close the hand
11950 6c 65 20 61 72 65 20 6d 61 64 65 20 62 65 66 6f  le are made befo
11960 72 65 0a 2a 2a 20 67 69 76 69 6e 67 20 75 70 20  re.** giving up 
11970 61 6e 64 20 72 65 74 75 72 6e 69 6e 67 20 61 6e  and returning an
11980 20 65 72 72 6f 72 2e 0a 2a 2f 0a 23 64 65 66 69   error..*/.#defi
11990 6e 65 20 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 45  ne MX_CLOSE_ATTE
119a0 4d 50 54 20 33 0a 73 74 61 74 69 63 20 69 6e 74  MPT 3.static int
119b0 20 77 69 6e 43 6c 6f 73 65 28 73 71 6c 69 74 65   winClose(sqlite
119c0 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 69  3_file *id){.  i
119d0 6e 74 20 72 63 2c 20 63 6e 74 20 3d 20 30 3b 0a  nt rc, cnt = 0;.
119e0 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65    winFile *pFile
119f0 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b   = (winFile*)id;
11a00 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 21 3d  ..  assert( id!=
11a10 30 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  0 );.#ifndef SQL
11a20 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 61  ITE_OMIT_WAL.  a
11a30 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 70 53  ssert( pFile->pS
11a40 68 6d 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a  hm==0 );.#endif.
11a50 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
11a60 3e 68 21 3d 4e 55 4c 4c 20 26 26 20 70 46 69 6c  >h!=NULL && pFil
11a70 65 2d 3e 68 21 3d 49 4e 56 41 4c 49 44 5f 48 41  e->h!=INVALID_HA
11a80 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 20 20  NDLE_VALUE );.  
11a90 4f 53 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20  OSTRACE(("CLOSE 
11aa0 66 69 6c 65 3d 25 70 5c 6e 22 2c 20 70 46 69 6c  file=%p\n", pFil
11ab0 65 2d 3e 68 29 29 3b 0a 0a 23 69 66 20 53 51 4c  e->h));..#if SQL
11ac0 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
11ad0 45 3e 30 0a 20 20 77 69 6e 55 6e 6d 61 70 66 69  E>0.  winUnmapfi
11ae0 6c 65 28 70 46 69 6c 65 29 3b 0a 23 65 6e 64 69  le(pFile);.#endi
11af0 66 0a 0a 20 20 64 6f 7b 0a 20 20 20 20 72 63 20  f..  do{.    rc 
11b00 3d 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28  = osCloseHandle(
11b10 70 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 20 20 2f  pFile->h);.    /
11b20 2a 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f  * SimulateIOErro
11b30 72 28 20 72 63 3d 30 3b 20 63 6e 74 3d 4d 58 5f  r( rc=0; cnt=MX_
11b40 43 4c 4f 53 45 5f 41 54 54 45 4d 50 54 3b 20 29  CLOSE_ATTEMPT; )
11b50 3b 20 2a 2f 0a 20 20 7d 77 68 69 6c 65 28 20 72  ; */.  }while( r
11b60 63 3d 3d 30 20 26 26 20 2b 2b 63 6e 74 20 3c 20  c==0 && ++cnt < 
11b70 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d 50 54  MX_CLOSE_ATTEMPT
11b80 20 26 26 20 28 73 71 6c 69 74 65 33 5f 77 69 6e   && (sqlite3_win
11b90 33 32 5f 73 6c 65 65 70 28 31 30 30 29 2c 20 31  32_sleep(100), 1
11ba0 29 20 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  ) );.#if SQLITE_
11bb0 4f 53 5f 57 49 4e 43 45 0a 23 64 65 66 69 6e 65  OS_WINCE.#define
11bc0 20 57 49 4e 43 45 5f 44 45 4c 45 54 49 4f 4e 5f   WINCE_DELETION_
11bd0 41 54 54 45 4d 50 54 53 20 33 0a 20 20 77 69 6e  ATTEMPTS 3.  win
11be0 63 65 44 65 73 74 72 6f 79 4c 6f 63 6b 28 70 46  ceDestroyLock(pF
11bf0 69 6c 65 29 3b 0a 20 20 69 66 28 20 70 46 69 6c  ile);.  if( pFil
11c00 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73  e->zDeleteOnClos
11c10 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 63 6e 74  e ){.    int cnt
11c20 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28   = 0;.    while(
11c30 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 44 65  .           osDe
11c40 6c 65 74 65 46 69 6c 65 57 28 70 46 69 6c 65 2d  leteFileW(pFile-
11c50 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 29  >zDeleteOnClose)
11c60 3d 3d 30 0a 20 20 20 20 20 20 20 20 26 26 20 6f  ==0.        && o
11c70 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74  sGetFileAttribut
11c80 65 73 57 28 70 46 69 6c 65 2d 3e 7a 44 65 6c 65  esW(pFile->zDele
11c90 74 65 4f 6e 43 6c 6f 73 65 29 21 3d 30 78 66 66  teOnClose)!=0xff
11ca0 66 66 66 66 66 66 20 0a 20 20 20 20 20 20 20 20  ffffff .        
11cb0 26 26 20 63 6e 74 2b 2b 20 3c 20 57 49 4e 43 45  && cnt++ < WINCE
11cc0 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d 50  _DELETION_ATTEMP
11cd0 54 53 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  TS.    ){.      
11ce0 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73   sqlite3_win32_s
11cf0 6c 65 65 70 28 31 30 30 29 3b 20 20 2f 2a 20 57  leep(100);  /* W
11d00 61 69 74 20 61 20 6c 69 74 74 6c 65 20 62 65 66  ait a little bef
11d10 6f 72 65 20 74 72 79 69 6e 67 20 61 67 61 69 6e  ore trying again
11d20 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 73 71   */.    }.    sq
11d30 6c 69 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65  lite3_free(pFile
11d40 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65  ->zDeleteOnClose
11d50 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
11d60 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 70 46  if( rc ){.    pF
11d70 69 6c 65 2d 3e 68 20 3d 20 4e 55 4c 4c 3b 0a 20  ile->h = NULL;. 
11d80 20 7d 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72   }.  OpenCounter
11d90 28 2d 31 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  (-1);.  OSTRACE(
11da0 28 22 43 4c 4f 53 45 20 66 69 6c 65 3d 25 70 2c  ("CLOSE file=%p,
11db0 20 72 63 3d 25 73 5c 6e 22 2c 20 70 46 69 6c 65   rc=%s\n", pFile
11dc0 2d 3e 68 2c 20 72 63 20 3f 20 22 6f 6b 22 20 3a  ->h, rc ? "ok" :
11dd0 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 72   "failed"));.  r
11de0 65 74 75 72 6e 20 72 63 20 3f 20 53 51 4c 49 54  eturn rc ? SQLIT
11df0 45 5f 4f 4b 0a 20 20 20 20 20 20 20 20 20 20 20  E_OK.           
11e00 20 3a 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53   : winLogError(S
11e10 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53  QLITE_IOERR_CLOS
11e20 45 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f  E, osGetLastErro
11e30 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  r(),.           
11e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
11e50 77 69 6e 43 6c 6f 73 65 22 2c 20 70 46 69 6c 65  winClose", pFile
11e60 2d 3e 7a 50 61 74 68 29 3b 0a 7d 0a 0a 2f 2a 0a  ->zPath);.}../*.
11e70 2a 2a 20 52 65 61 64 20 64 61 74 61 20 66 72 6f  ** Read data fro
11e80 6d 20 61 20 66 69 6c 65 20 69 6e 74 6f 20 61 20  m a file into a 
11e90 62 75 66 66 65 72 2e 20 20 52 65 74 75 72 6e 20  buffer.  Return 
11ea0 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 61 6c 6c  SQLITE_OK if all
11eb0 0a 2a 2a 20 62 79 74 65 73 20 77 65 72 65 20 72  .** bytes were r
11ec0 65 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ead successfully
11ed0 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4f 45 52   and SQLITE_IOER
11ee0 52 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f  R if anything go
11ef0 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 0a 2a 2f 0a  es.** wrong..*/.
11f00 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 52 65  static int winRe
11f10 61 64 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  ad(.  sqlite3_fi
11f20 6c 65 20 2a 69 64 2c 20 20 20 20 20 20 20 20 20  le *id,         
11f30 20 2f 2a 20 46 69 6c 65 20 74 6f 20 72 65 61 64   /* File to read
11f40 20 66 72 6f 6d 20 2a 2f 0a 20 20 76 6f 69 64 20   from */.  void 
11f50 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 20  *pBuf,          
11f60 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 63        /* Write c
11f70 6f 6e 74 65 6e 74 20 69 6e 74 6f 20 74 68 69 73  ontent into this
11f80 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74   buffer */.  int
11f90 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20   amt,           
11fa0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
11fb0 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 72 65  r of bytes to re
11fc0 61 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ad */.  sqlite3_
11fd0 69 6e 74 36 34 20 6f 66 66 73 65 74 20 20 20 20  int64 offset    
11fe0 20 20 20 2f 2a 20 42 65 67 69 6e 20 72 65 61 64     /* Begin read
11ff0 69 6e 67 20 61 74 20 74 68 69 73 20 6f 66 66 73  ing at this offs
12000 65 74 20 2a 2f 0a 29 7b 0a 23 69 66 20 21 53 51  et */.){.#if !SQ
12010 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
12020 4f 56 45 52 4c 41 50 50 45 44 20 6f 76 65 72 6c  OVERLAPPED overl
12030 61 70 70 65 64 3b 20 20 20 20 20 20 20 20 20 20  apped;          
12040 2f 2a 20 54 68 65 20 6f 66 66 73 65 74 20 66 6f  /* The offset fo
12050 72 20 52 65 61 64 46 69 6c 65 2e 20 2a 2f 0a 23  r ReadFile. */.#
12060 65 6e 64 69 66 0a 20 20 77 69 6e 46 69 6c 65 20  endif.  winFile 
12070 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c  *pFile = (winFil
12080 65 2a 29 69 64 3b 20 20 2f 2a 20 66 69 6c 65 20  e*)id;  /* file 
12090 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 44 57 4f 52  handle */.  DWOR
120a0 44 20 6e 52 65 61 64 3b 20 20 20 20 20 20 20 20  D nRead;        
120b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
120c0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61  umber of bytes a
120d0 63 74 75 61 6c 6c 79 20 72 65 61 64 20 66 72 6f  ctually read fro
120e0 6d 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  m file */.  int 
120f0 6e 52 65 74 72 79 20 3d 20 30 3b 20 20 20 20 20  nRetry = 0;     
12100 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
12110 75 6d 62 65 72 20 6f 66 20 72 65 74 72 79 73 20  umber of retrys 
12120 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64  */..  assert( id
12130 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
12140 20 61 6d 74 3e 30 20 29 3b 0a 20 20 61 73 73 65   amt>0 );.  asse
12150 72 74 28 20 6f 66 66 73 65 74 3e 3d 30 20 29 3b  rt( offset>=0 );
12160 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
12170 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45  or(return SQLITE
12180 5f 49 4f 45 52 52 5f 52 45 41 44 29 3b 0a 20 20  _IOERR_READ);.  
12190 4f 53 54 52 41 43 45 28 28 22 52 45 41 44 20 66  OSTRACE(("READ f
121a0 69 6c 65 3d 25 70 2c 20 62 75 66 66 65 72 3d 25  ile=%p, buffer=%
121b0 70 2c 20 61 6d 6f 75 6e 74 3d 25 64 2c 20 6f 66  p, amount=%d, of
121c0 66 73 65 74 3d 25 6c 6c 64 2c 20 6c 6f 63 6b 3d  fset=%lld, lock=
121d0 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
121e0 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70 42 75 66    pFile->h, pBuf
121f0 2c 20 61 6d 74 2c 20 6f 66 66 73 65 74 2c 20 70  , amt, offset, p
12200 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29  File->locktype))
12210 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  ;..#if SQLITE_MA
12220 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
12230 2f 2a 20 44 65 61 6c 20 77 69 74 68 20 61 73 20  /* Deal with as 
12240 6d 75 63 68 20 6f 66 20 74 68 69 73 20 72 65 61  much of this rea
12250 64 20 72 65 71 75 65 73 74 20 61 73 20 70 6f 73  d request as pos
12260 73 69 62 6c 65 20 62 79 20 74 72 61 6e 73 66 65  sible by transfe
12270 72 69 6e 67 0a 20 20 2a 2a 20 64 61 74 61 20 66  ring.  ** data f
12280 72 6f 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20 6d  rom the memory m
12290 61 70 70 69 6e 67 20 75 73 69 6e 67 20 6d 65 6d  apping using mem
122a0 63 70 79 28 29 2e 20 20 2a 2f 0a 20 20 69 66 28  cpy().  */.  if(
122b0 20 6f 66 66 73 65 74 3c 70 46 69 6c 65 2d 3e 6d   offset<pFile->m
122c0 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 69  mapSize ){.    i
122d0 66 28 20 6f 66 66 73 65 74 2b 61 6d 74 20 3c 3d  f( offset+amt <=
122e0 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65   pFile->mmapSize
122f0 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   ){.      memcpy
12300 28 70 42 75 66 2c 20 26 28 28 75 38 20 2a 29 28  (pBuf, &((u8 *)(
12310 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f  pFile->pMapRegio
12320 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20 61 6d 74  n))[offset], amt
12330 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  );.      OSTRACE
12340 28 28 22 52 45 41 44 2d 4d 4d 41 50 20 66 69 6c  (("READ-MMAP fil
12350 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%p, rc=SQLITE_
12360 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29  OK\n", pFile->h)
12370 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
12380 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
12390 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
123a0 6e 43 6f 70 79 20 3d 20 28 69 6e 74 29 28 70 46  nCopy = (int)(pF
123b0 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 2d 20  ile->mmapSize - 
123c0 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 6d  offset);.      m
123d0 65 6d 63 70 79 28 70 42 75 66 2c 20 26 28 28 75  emcpy(pBuf, &((u
123e0 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70  8 *)(pFile->pMap
123f0 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d  Region))[offset]
12400 2c 20 6e 43 6f 70 79 29 3b 0a 20 20 20 20 20 20  , nCopy);.      
12410 70 42 75 66 20 3d 20 26 28 28 75 38 20 2a 29 70  pBuf = &((u8 *)p
12420 42 75 66 29 5b 6e 43 6f 70 79 5d 3b 0a 20 20 20  Buf)[nCopy];.   
12430 20 20 20 61 6d 74 20 2d 3d 20 6e 43 6f 70 79 3b     amt -= nCopy;
12440 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d  .      offset +=
12450 20 6e 43 6f 70 79 3b 0a 20 20 20 20 7d 0a 20 20   nCopy;.    }.  
12460 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51  }.#endif..#if SQ
12470 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
12480 69 66 28 20 77 69 6e 53 65 65 6b 46 69 6c 65 28  if( winSeekFile(
12490 70 46 69 6c 65 2c 20 6f 66 66 73 65 74 29 20 29  pFile, offset) )
124a0 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  {.    OSTRACE(("
124b0 52 45 41 44 20 66 69 6c 65 3d 25 70 2c 20 72 63  READ file=%p, rc
124c0 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 5c 6e 22 2c  =SQLITE_FULL\n",
124d0 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20   pFile->h));.   
124e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46   return SQLITE_F
124f0 55 4c 4c 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65  ULL;.  }.  while
12500 28 20 21 6f 73 52 65 61 64 46 69 6c 65 28 70 46  ( !osReadFile(pF
12510 69 6c 65 2d 3e 68 2c 20 70 42 75 66 2c 20 61 6d  ile->h, pBuf, am
12520 74 2c 20 26 6e 52 65 61 64 2c 20 30 29 20 29 7b  t, &nRead, 0) ){
12530 0a 23 65 6c 73 65 0a 20 20 6d 65 6d 73 65 74 28  .#else.  memset(
12540 26 6f 76 65 72 6c 61 70 70 65 64 2c 20 30 2c 20  &overlapped, 0, 
12550 73 69 7a 65 6f 66 28 4f 56 45 52 4c 41 50 50 45  sizeof(OVERLAPPE
12560 44 29 29 3b 0a 20 20 6f 76 65 72 6c 61 70 70 65  D));.  overlappe
12570 64 2e 4f 66 66 73 65 74 20 3d 20 28 4c 4f 4e 47  d.Offset = (LONG
12580 29 28 6f 66 66 73 65 74 20 26 20 30 78 66 66 66  )(offset & 0xfff
12590 66 66 66 66 66 29 3b 0a 20 20 6f 76 65 72 6c 61  fffff);.  overla
125a0 70 70 65 64 2e 4f 66 66 73 65 74 48 69 67 68 20  pped.OffsetHigh 
125b0 3d 20 28 4c 4f 4e 47 29 28 28 6f 66 66 73 65 74  = (LONG)((offset
125c0 3e 3e 33 32 29 20 26 20 30 78 37 66 66 66 66 66  >>32) & 0x7fffff
125d0 66 66 29 3b 0a 20 20 77 68 69 6c 65 28 20 21 6f  ff);.  while( !o
125e0 73 52 65 61 64 46 69 6c 65 28 70 46 69 6c 65 2d  sReadFile(pFile-
125f0 3e 68 2c 20 70 42 75 66 2c 20 61 6d 74 2c 20 26  >h, pBuf, amt, &
12600 6e 52 65 61 64 2c 20 26 6f 76 65 72 6c 61 70 70  nRead, &overlapp
12610 65 64 29 20 26 26 0a 20 20 20 20 20 20 20 20 20  ed) &&.         
12620 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
12630 21 3d 45 52 52 4f 52 5f 48 41 4e 44 4c 45 5f 45  !=ERROR_HANDLE_E
12640 4f 46 20 29 7b 0a 23 65 6e 64 69 66 0a 20 20 20  OF ){.#endif.   
12650 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f   DWORD lastErrno
12660 3b 0a 20 20 20 20 69 66 28 20 77 69 6e 52 65 74  ;.    if( winRet
12670 72 79 49 6f 65 72 72 28 26 6e 52 65 74 72 79 2c  ryIoerr(&nRetry,
12680 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 20 63   &lastErrno) ) c
12690 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 46 69  ontinue;.    pFi
126a0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
126b0 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 4f  lastErrno;.    O
126c0 53 54 52 41 43 45 28 28 22 52 45 41 44 20 66 69  STRACE(("READ fi
126d0 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
126e0 5f 49 4f 45 52 52 5f 52 45 41 44 5c 6e 22 2c 20  _IOERR_READ\n", 
126f0 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20  pFile->h));.    
12700 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72  return winLogErr
12710 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
12720 52 45 41 44 2c 20 70 46 69 6c 65 2d 3e 6c 61 73  READ, pFile->las
12730 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
12740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
12750 77 69 6e 52 65 61 64 22 2c 20 70 46 69 6c 65 2d  winRead", pFile-
12760 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 20 20 77  >zPath);.  }.  w
12770 69 6e 4c 6f 67 49 6f 65 72 72 28 6e 52 65 74 72  inLogIoerr(nRetr
12780 79 29 3b 0a 20 20 69 66 28 20 6e 52 65 61 64 3c  y);.  if( nRead<
12790 28 44 57 4f 52 44 29 61 6d 74 20 29 7b 0a 20 20  (DWORD)amt ){.  
127a0 20 20 2f 2a 20 55 6e 72 65 61 64 20 70 61 72 74    /* Unread part
127b0 73 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20  s of the buffer 
127c0 6d 75 73 74 20 62 65 20 7a 65 72 6f 2d 66 69 6c  must be zero-fil
127d0 6c 65 64 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65  led */.    memse
127e0 74 28 26 28 28 63 68 61 72 2a 29 70 42 75 66 29  t(&((char*)pBuf)
127f0 5b 6e 52 65 61 64 5d 2c 20 30 2c 20 61 6d 74 2d  [nRead], 0, amt-
12800 6e 52 65 61 64 29 3b 0a 20 20 20 20 4f 53 54 52  nRead);.    OSTR
12810 41 43 45 28 28 22 52 45 41 44 20 66 69 6c 65 3d  ACE(("READ file=
12820 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f  %p, rc=SQLITE_IO
12830 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 5c 6e  ERR_SHORT_READ\n
12840 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20  ", pFile->h));. 
12850 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
12860 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
12870 44 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43  D;.  }..  OSTRAC
12880 45 28 28 22 52 45 41 44 20 66 69 6c 65 3d 25 70  E(("READ file=%p
12890 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e  , rc=SQLITE_OK\n
128a0 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20  ", pFile->h));. 
128b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
128c0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  K;.}../*.** Writ
128d0 65 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75  e data from a bu
128e0 66 66 65 72 20 69 6e 74 6f 20 61 20 66 69 6c 65  ffer into a file
128f0 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
12900 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 0a 2a  _OK on success.*
12910 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20  * or some other 
12920 65 72 72 6f 72 20 63 6f 64 65 20 6f 6e 20 66 61  error code on fa
12930 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  ilure..*/.static
12940 20 69 6e 74 20 77 69 6e 57 72 69 74 65 28 0a 20   int winWrite(. 
12950 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69   sqlite3_file *i
12960 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
12970 20 2f 2a 20 46 69 6c 65 20 74 6f 20 77 72 69 74   /* File to writ
12980 65 20 69 6e 74 6f 20 2a 2f 0a 20 20 63 6f 6e 73  e into */.  cons
12990 74 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20  t void *pBuf,   
129a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
129b0 68 65 20 62 79 74 65 73 20 74 6f 20 62 65 20 77  he bytes to be w
129c0 72 69 74 74 65 6e 20 2a 2f 0a 20 20 69 6e 74 20  ritten */.  int 
129d0 61 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  amt,            
129e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
129f0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
12a00 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20 73 71 6c  o write */.  sql
12a10 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65  ite3_int64 offse
12a20 74 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t            /* 
12a30 4f 66 66 73 65 74 20 69 6e 74 6f 20 74 68 65 20  Offset into the 
12a40 66 69 6c 65 20 74 6f 20 62 65 67 69 6e 20 77 72  file to begin wr
12a50 69 74 69 6e 67 20 61 74 20 2a 2f 0a 29 7b 0a 20  iting at */.){. 
12a60 20 69 6e 74 20 72 63 20 3d 20 30 3b 20 20 20 20   int rc = 0;    
12a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12a80 20 2f 2a 20 54 72 75 65 20 69 66 20 65 72 72 6f   /* True if erro
12a90 72 20 68 61 73 20 6f 63 63 75 72 72 65 64 2c 20  r has occurred, 
12aa0 65 6c 73 65 20 66 61 6c 73 65 20 2a 2f 0a 20 20  else false */.  
12ab0 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  winFile *pFile =
12ac0 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 20 20   (winFile*)id;  
12ad0 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 2a  /* File handle *
12ae0 2f 0a 20 20 69 6e 74 20 6e 52 65 74 72 79 20 3d  /.  int nRetry =
12af0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
12b00 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
12b10 20 72 65 74 72 69 65 73 20 2a 2f 0a 0a 20 20 61   retries */..  a
12b20 73 73 65 72 74 28 20 61 6d 74 3e 30 20 29 3b 0a  ssert( amt>0 );.
12b30 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
12b40 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  );.  SimulateIOE
12b50 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49  rror(return SQLI
12b60 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 29 3b  TE_IOERR_WRITE);
12b70 0a 20 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66  .  SimulateDiskf
12b80 75 6c 6c 45 72 72 6f 72 28 72 65 74 75 72 6e 20  ullError(return 
12b90 53 51 4c 49 54 45 5f 46 55 4c 4c 29 3b 0a 0a 20  SQLITE_FULL);.. 
12ba0 20 4f 53 54 52 41 43 45 28 28 22 57 52 49 54 45   OSTRACE(("WRITE
12bb0 20 66 69 6c 65 3d 25 70 2c 20 62 75 66 66 65 72   file=%p, buffer
12bc0 3d 25 70 2c 20 61 6d 6f 75 6e 74 3d 25 64 2c 20  =%p, amount=%d, 
12bd0 6f 66 66 73 65 74 3d 25 6c 6c 64 2c 20 6c 6f 63  offset=%lld, loc
12be0 6b 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  k=%d\n",.       
12bf0 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70 42      pFile->h, pB
12c00 75 66 2c 20 61 6d 74 2c 20 6f 66 66 73 65 74 2c  uf, amt, offset,
12c10 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
12c20 29 29 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  ));..#if SQLITE_
12c30 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
12c40 20 20 2f 2a 20 44 65 61 6c 20 77 69 74 68 20 61    /* Deal with a
12c50 73 20 6d 75 63 68 20 6f 66 20 74 68 69 73 20 77  s much of this w
12c60 72 69 74 65 20 72 65 71 75 65 73 74 20 61 73 20  rite request as 
12c70 70 6f 73 73 69 62 6c 65 20 62 79 20 74 72 61 6e  possible by tran
12c80 73 66 65 72 69 6e 67 0a 20 20 2a 2a 20 64 61 74  sfering.  ** dat
12c90 61 20 66 72 6f 6d 20 74 68 65 20 6d 65 6d 6f 72  a from the memor
12ca0 79 20 6d 61 70 70 69 6e 67 20 75 73 69 6e 67 20  y mapping using 
12cb0 6d 65 6d 63 70 79 28 29 2e 20 20 2a 2f 0a 20 20  memcpy().  */.  
12cc0 69 66 28 20 6f 66 66 73 65 74 3c 70 46 69 6c 65  if( offset<pFile
12cd0 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20  ->mmapSize ){.  
12ce0 20 20 69 66 28 20 6f 66 66 73 65 74 2b 61 6d 74    if( offset+amt
12cf0 20 3c 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53   <= pFile->mmapS
12d00 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  ize ){.      mem
12d10 63 70 79 28 26 28 28 75 38 20 2a 29 28 70 46 69  cpy(&((u8 *)(pFi
12d20 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29  le->pMapRegion))
12d30 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75 66 2c 20  [offset], pBuf, 
12d40 61 6d 74 29 3b 0a 20 20 20 20 20 20 4f 53 54 52  amt);.      OSTR
12d50 41 43 45 28 28 22 57 52 49 54 45 2d 4d 4d 41 50  ACE(("WRITE-MMAP
12d60 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c   file=%p, rc=SQL
12d70 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65  ITE_OK\n", pFile
12d80 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74  ->h));.      ret
12d90 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
12da0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
12db0 69 6e 74 20 6e 43 6f 70 79 20 3d 20 28 69 6e 74  int nCopy = (int
12dc0 29 28 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a  )(pFile->mmapSiz
12dd0 65 20 2d 20 6f 66 66 73 65 74 29 3b 0a 20 20 20  e - offset);.   
12de0 20 20 20 6d 65 6d 63 70 79 28 26 28 28 75 38 20     memcpy(&((u8 
12df0 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65  *)(pFile->pMapRe
12e00 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20  gion))[offset], 
12e10 70 42 75 66 2c 20 6e 43 6f 70 79 29 3b 0a 20 20  pBuf, nCopy);.  
12e20 20 20 20 20 70 42 75 66 20 3d 20 26 28 28 75 38      pBuf = &((u8
12e30 20 2a 29 70 42 75 66 29 5b 6e 43 6f 70 79 5d 3b   *)pBuf)[nCopy];
12e40 0a 20 20 20 20 20 20 61 6d 74 20 2d 3d 20 6e 43  .      amt -= nC
12e50 6f 70 79 3b 0a 20 20 20 20 20 20 6f 66 66 73 65  opy;.      offse
12e60 74 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20  t += nCopy;.    
12e70 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  }.  }.#endif..#i
12e80 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
12e90 45 0a 20 20 72 63 20 3d 20 77 69 6e 53 65 65 6b  E.  rc = winSeek
12ea0 46 69 6c 65 28 70 46 69 6c 65 2c 20 6f 66 66 73  File(pFile, offs
12eb0 65 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30  et);.  if( rc==0
12ec0 20 29 7b 0a 23 65 6c 73 65 0a 20 20 7b 0a 23 65   ){.#else.  {.#e
12ed0 6e 64 69 66 0a 23 69 66 20 21 53 51 4c 49 54 45  ndif.#if !SQLITE
12ee0 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20 4f 56  _OS_WINCE.    OV
12ef0 45 52 4c 41 50 50 45 44 20 6f 76 65 72 6c 61 70  ERLAPPED overlap
12f00 70 65 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  ped;        /* T
12f10 68 65 20 6f 66 66 73 65 74 20 66 6f 72 20 57 72  he offset for Wr
12f20 69 74 65 46 69 6c 65 2e 20 2a 2f 0a 23 65 6e 64  iteFile. */.#end
12f30 69 66 0a 20 20 20 20 75 38 20 2a 61 52 65 6d 20  if.    u8 *aRem 
12f40 3d 20 28 75 38 20 2a 29 70 42 75 66 3b 20 20 20  = (u8 *)pBuf;   
12f50 20 20 20 20 20 2f 2a 20 44 61 74 61 20 79 65 74       /* Data yet
12f60 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 2a   to be written *
12f70 2f 0a 20 20 20 20 69 6e 74 20 6e 52 65 6d 20 3d  /.    int nRem =
12f80 20 61 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20   amt;           
12f90 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
12fa0 20 62 79 74 65 73 20 79 65 74 20 74 6f 20 62 65   bytes yet to be
12fb0 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 20 20   written */.    
12fc0 44 57 4f 52 44 20 6e 57 72 69 74 65 3b 20 20 20  DWORD nWrite;   
12fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12fe0 20 42 79 74 65 73 20 77 72 69 74 74 65 6e 20 62   Bytes written b
12ff0 79 20 65 61 63 68 20 57 72 69 74 65 46 69 6c 65  y each WriteFile
13000 28 29 20 63 61 6c 6c 20 2a 2f 0a 20 20 20 20 44  () call */.    D
13010 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 20 3d  WORD lastErrno =
13020 20 4e 4f 5f 45 52 52 4f 52 3b 20 20 20 2f 2a 20   NO_ERROR;   /* 
13030 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  Value returned b
13040 79 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  y GetLastError()
13050 20 2a 2f 0a 0a 23 69 66 20 21 53 51 4c 49 54 45   */..#if !SQLITE
13060 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20 6d 65  _OS_WINCE.    me
13070 6d 73 65 74 28 26 6f 76 65 72 6c 61 70 70 65 64  mset(&overlapped
13080 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4f 56 45 52  , 0, sizeof(OVER
13090 4c 41 50 50 45 44 29 29 3b 0a 20 20 20 20 6f 76  LAPPED));.    ov
130a0 65 72 6c 61 70 70 65 64 2e 4f 66 66 73 65 74 20  erlapped.Offset 
130b0 3d 20 28 4c 4f 4e 47 29 28 6f 66 66 73 65 74 20  = (LONG)(offset 
130c0 26 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a 20  & 0xffffffff);. 
130d0 20 20 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66     overlapped.Of
130e0 66 73 65 74 48 69 67 68 20 3d 20 28 4c 4f 4e 47  fsetHigh = (LONG
130f0 29 28 28 6f 66 66 73 65 74 3e 3e 33 32 29 20 26  )((offset>>32) &
13100 20 30 78 37 66 66 66 66 66 66 66 29 3b 0a 23 65   0x7fffffff);.#e
13110 6e 64 69 66 0a 0a 20 20 20 20 77 68 69 6c 65 28  ndif..    while(
13120 20 6e 52 65 6d 3e 30 20 29 7b 0a 23 69 66 20 53   nRem>0 ){.#if S
13130 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20  QLITE_OS_WINCE. 
13140 20 20 20 20 20 69 66 28 20 21 6f 73 57 72 69 74       if( !osWrit
13150 65 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20  eFile(pFile->h, 
13160 61 52 65 6d 2c 20 6e 52 65 6d 2c 20 26 6e 57 72  aRem, nRem, &nWr
13170 69 74 65 2c 20 30 29 20 29 7b 0a 23 65 6c 73 65  ite, 0) ){.#else
13180 0a 20 20 20 20 20 20 69 66 28 20 21 6f 73 57 72  .      if( !osWr
13190 69 74 65 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68  iteFile(pFile->h
131a0 2c 20 61 52 65 6d 2c 20 6e 52 65 6d 2c 20 26 6e  , aRem, nRem, &n
131b0 57 72 69 74 65 2c 20 26 6f 76 65 72 6c 61 70 70  Write, &overlapp
131c0 65 64 29 20 29 7b 0a 23 65 6e 64 69 66 0a 20 20  ed) ){.#endif.  
131d0 20 20 20 20 20 20 69 66 28 20 77 69 6e 52 65 74        if( winRet
131e0 72 79 49 6f 65 72 72 28 26 6e 52 65 74 72 79 2c  ryIoerr(&nRetry,
131f0 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 20 63   &lastErrno) ) c
13200 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
13210 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
13220 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 57        assert( nW
13230 72 69 74 65 3d 3d 30 20 7c 7c 20 6e 57 72 69 74  rite==0 || nWrit
13240 65 3c 3d 28 44 57 4f 52 44 29 6e 52 65 6d 20 29  e<=(DWORD)nRem )
13250 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 57 72 69  ;.      if( nWri
13260 74 65 3d 3d 30 20 7c 7c 20 6e 57 72 69 74 65 3e  te==0 || nWrite>
13270 28 44 57 4f 52 44 29 6e 52 65 6d 20 29 7b 0a 20  (DWORD)nRem ){. 
13280 20 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f         lastErrno
13290 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
132a0 72 28 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  r();.        bre
132b0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 20  ak;.      }.#if 
132c0 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45  !SQLITE_OS_WINCE
132d0 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d  .      offset +=
132e0 20 6e 57 72 69 74 65 3b 0a 20 20 20 20 20 20 6f   nWrite;.      o
132f0 76 65 72 6c 61 70 70 65 64 2e 4f 66 66 73 65 74  verlapped.Offset
13300 20 3d 20 28 4c 4f 4e 47 29 28 6f 66 66 73 65 74   = (LONG)(offset
13310 20 26 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a   & 0xffffffff);.
13320 20 20 20 20 20 20 6f 76 65 72 6c 61 70 70 65 64        overlapped
13330 2e 4f 66 66 73 65 74 48 69 67 68 20 3d 20 28 4c  .OffsetHigh = (L
13340 4f 4e 47 29 28 28 6f 66 66 73 65 74 3e 3e 33 32  ONG)((offset>>32
13350 29 20 26 20 30 78 37 66 66 66 66 66 66 66 29 3b  ) & 0x7fffffff);
13360 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 61 52  .#endif.      aR
13370 65 6d 20 2b 3d 20 6e 57 72 69 74 65 3b 0a 20 20  em += nWrite;.  
13380 20 20 20 20 6e 52 65 6d 20 2d 3d 20 6e 57 72 69      nRem -= nWri
13390 74 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  te;.    }.    if
133a0 28 20 6e 52 65 6d 3e 30 20 29 7b 0a 20 20 20 20  ( nRem>0 ){.    
133b0 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
133c0 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a  no = lastErrno;.
133d0 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
133e0 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72    }.  }..  if( r
133f0 63 20 29 7b 0a 20 20 20 20 69 66 28 20 20 20 28  c ){.    if(   (
13400 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
13410 6f 3d 3d 45 52 52 4f 52 5f 48 41 4e 44 4c 45 5f  o==ERROR_HANDLE_
13420 44 49 53 4b 5f 46 55 4c 4c 20 29 0a 20 20 20 20  DISK_FULL ).    
13430 20 20 20 7c 7c 20 28 20 70 46 69 6c 65 2d 3e 6c     || ( pFile->l
13440 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f  astErrno==ERROR_
13450 44 49 53 4b 5f 46 55 4c 4c 20 29 29 7b 0a 20 20  DISK_FULL )){.  
13460 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 57 52      OSTRACE(("WR
13470 49 54 45 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  ITE file=%p, rc=
13480 53 51 4c 49 54 45 5f 46 55 4c 4c 5c 6e 22 2c 20  SQLITE_FULL\n", 
13490 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20  pFile->h));.    
134a0 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45    return winLogE
134b0 72 72 6f 72 28 53 51 4c 49 54 45 5f 46 55 4c 4c  rror(SQLITE_FULL
134c0 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  , pFile->lastErr
134d0 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
134e0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
134f0 6e 57 72 69 74 65 31 22 2c 20 70 46 69 6c 65 2d  nWrite1", pFile-
13500 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20  >zPath);.    }. 
13510 20 20 20 4f 53 54 52 41 43 45 28 28 22 57 52 49     OSTRACE(("WRI
13520 54 45 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53  TE file=%p, rc=S
13530 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54  QLITE_IOERR_WRIT
13540 45 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29  E\n", pFile->h))
13550 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e  ;.    return win
13560 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
13570 49 4f 45 52 52 5f 57 52 49 54 45 2c 20 70 46 69  IOERR_WRITE, pFi
13580 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20  le->lastErrno,. 
13590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
135a0 20 20 20 20 20 20 22 77 69 6e 57 72 69 74 65 32        "winWrite2
135b0 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
135c0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77  ;.  }else{.    w
135d0 69 6e 4c 6f 67 49 6f 65 72 72 28 6e 52 65 74 72  inLogIoerr(nRetr
135e0 79 29 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43  y);.  }.  OSTRAC
135f0 45 28 28 22 57 52 49 54 45 20 66 69 6c 65 3d 25  E(("WRITE file=%
13600 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c  p, rc=SQLITE_OK\
13610 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  n", pFile->h));.
13620 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
13630 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75  OK;.}../*.** Tru
13640 6e 63 61 74 65 20 61 6e 20 6f 70 65 6e 20 66 69  ncate an open fi
13650 6c 65 20 74 6f 20 61 20 73 70 65 63 69 66 69 65  le to a specifie
13660 64 20 73 69 7a 65 0a 2a 2f 0a 73 74 61 74 69 63  d size.*/.static
13670 20 69 6e 74 20 77 69 6e 54 72 75 6e 63 61 74 65   int winTruncate
13680 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
13690 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  d, sqlite3_int64
136a0 20 6e 42 79 74 65 29 7b 0a 20 20 77 69 6e 46 69   nByte){.  winFi
136b0 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e  le *pFile = (win
136c0 46 69 6c 65 2a 29 69 64 3b 20 20 2f 2a 20 46 69  File*)id;  /* Fi
136d0 6c 65 20 68 61 6e 64 6c 65 20 6f 62 6a 65 63 74  le handle object
136e0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
136f0 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
13700 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
13710 63 6f 64 65 20 66 6f 72 20 74 68 69 73 20 66 75  code for this fu
13720 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 44 57 4f 52  nction */.  DWOR
13730 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 0a 20 20  D lastErrno;..  
13740 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
13750 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
13760 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45  or(return SQLITE
13770 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 29  _IOERR_TRUNCATE)
13780 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 52  ;.  OSTRACE(("TR
13790 55 4e 43 41 54 45 20 66 69 6c 65 3d 25 70 2c 20  UNCATE file=%p, 
137a0 73 69 7a 65 3d 25 6c 6c 64 2c 20 6c 6f 63 6b 3d  size=%lld, lock=
137b0 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
137c0 20 20 70 46 69 6c 65 2d 3e 68 2c 20 6e 42 79 74    pFile->h, nByt
137d0 65 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  e, pFile->lockty
137e0 70 65 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  pe));..  /* If t
137f0 68 65 20 75 73 65 72 20 68 61 73 20 63 6f 6e 66  he user has conf
13800 69 67 75 72 65 64 20 61 20 63 68 75 6e 6b 2d 73  igured a chunk-s
13810 69 7a 65 20 66 6f 72 20 74 68 69 73 20 66 69 6c  ize for this fil
13820 65 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a  e, truncate the.
13830 20 20 2a 2a 20 66 69 6c 65 20 73 6f 20 74 68 61    ** file so tha
13840 74 20 69 74 20 63 6f 6e 73 69 73 74 73 20 6f 66  t it consists of
13850 20 61 6e 20 69 6e 74 65 67 65 72 20 6e 75 6d 62   an integer numb
13860 65 72 20 6f 66 20 63 68 75 6e 6b 73 20 28 69 2e  er of chunks (i.
13870 65 2e 20 74 68 65 0a 20 20 2a 2a 20 61 63 74 75  e. the.  ** actu
13880 61 6c 20 66 69 6c 65 20 73 69 7a 65 20 61 66 74  al file size aft
13890 65 72 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e  er the operation
138a0 20 6d 61 79 20 62 65 20 6c 61 72 67 65 72 20 74   may be larger t
138b0 68 61 6e 20 74 68 65 20 72 65 71 75 65 73 74 65  han the requeste
138c0 64 0a 20 20 2a 2a 20 73 69 7a 65 29 2e 0a 20 20  d.  ** size)..  
138d0 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
138e0 73 7a 43 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20  szChunk>0 ){.   
138f0 20 6e 42 79 74 65 20 3d 20 28 28 6e 42 79 74 65   nByte = ((nByte
13900 20 2b 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e   + pFile->szChun
13910 6b 20 2d 20 31 29 2f 70 46 69 6c 65 2d 3e 73 7a  k - 1)/pFile->sz
13920 43 68 75 6e 6b 29 20 2a 20 70 46 69 6c 65 2d 3e  Chunk) * pFile->
13930 73 7a 43 68 75 6e 6b 3b 0a 20 20 7d 0a 0a 20 20  szChunk;.  }..  
13940 2f 2a 20 53 65 74 45 6e 64 4f 66 46 69 6c 65 28  /* SetEndOfFile(
13950 29 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65  ) returns non-ze
13960 72 6f 20 77 68 65 6e 20 73 75 63 63 65 73 73 66  ro when successf
13970 75 6c 2c 20 6f 72 20 7a 65 72 6f 20 77 68 65 6e  ul, or zero when
13980 20 69 74 20 66 61 69 6c 73 2e 20 2a 2f 0a 20 20   it fails. */.  
13990 69 66 28 20 77 69 6e 53 65 65 6b 46 69 6c 65 28  if( winSeekFile(
139a0 70 46 69 6c 65 2c 20 6e 42 79 74 65 29 20 29 7b  pFile, nByte) ){
139b0 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67  .    rc = winLog
139c0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
139d0 52 52 5f 54 52 55 4e 43 41 54 45 2c 20 70 46 69  RR_TRUNCATE, pFi
139e0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20  le->lastErrno,. 
139f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a00 20 20 20 20 22 77 69 6e 54 72 75 6e 63 61 74 65      "winTruncate
13a10 31 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  1", pFile->zPath
13a20 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 30  );.  }else if( 0
13a30 3d 3d 6f 73 53 65 74 45 6e 64 4f 66 46 69 6c 65  ==osSetEndOfFile
13a40 28 70 46 69 6c 65 2d 3e 68 29 20 26 26 0a 20 20  (pFile->h) &&.  
13a50 20 20 20 20 20 20 20 20 20 20 28 28 6c 61 73 74            ((last
13a60 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
13a70 74 45 72 72 6f 72 28 29 29 21 3d 45 52 52 4f 52  tError())!=ERROR
13a80 5f 55 53 45 52 5f 4d 41 50 50 45 44 5f 46 49 4c  _USER_MAPPED_FIL
13a90 45 29 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  E) ){.    pFile-
13aa0 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73  >lastErrno = las
13ab0 74 45 72 72 6e 6f 3b 0a 20 20 20 20 72 63 20 3d  tErrno;.    rc =
13ac0 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
13ad0 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41  ITE_IOERR_TRUNCA
13ae0 54 45 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  TE, pFile->lastE
13af0 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
13b00 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 54             "winT
13b10 72 75 6e 63 61 74 65 32 22 2c 20 70 46 69 6c 65  runcate2", pFile
13b20 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 0a 23  ->zPath);.  }..#
13b30 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
13b40 41 50 5f 53 49 5a 45 3e 30 0a 20 20 2f 2a 20 49  AP_SIZE>0.  /* I
13b50 66 20 74 68 65 20 66 69 6c 65 20 77 61 73 20 74  f the file was t
13b60 72 75 6e 63 61 74 65 64 20 74 6f 20 61 20 73 69  runcated to a si
13b70 7a 65 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  ze smaller than 
13b80 74 68 65 20 63 75 72 72 65 6e 74 6c 79 0a 20 20  the currently.  
13b90 2a 2a 20 6d 61 70 70 65 64 20 72 65 67 69 6f 6e  ** mapped region
13ba0 2c 20 72 65 64 75 63 65 20 74 68 65 20 65 66 66  , reduce the eff
13bb0 65 63 74 69 76 65 20 6d 61 70 70 69 6e 67 20 73  ective mapping s
13bc0 69 7a 65 20 61 73 20 77 65 6c 6c 2e 20 53 51 4c  ize as well. SQL
13bd0 69 74 65 20 77 69 6c 6c 0a 20 20 2a 2a 20 75 73  ite will.  ** us
13be0 65 20 72 65 61 64 28 29 20 61 6e 64 20 77 72 69  e read() and wri
13bf0 74 65 28 29 20 74 6f 20 61 63 63 65 73 73 20 64  te() to access d
13c00 61 74 61 20 62 65 79 6f 6e 64 20 74 68 69 73 20  ata beyond this 
13c10 70 6f 69 6e 74 20 66 72 6f 6d 20 6e 6f 77 20 6f  point from now o
13c20 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46  n..  */.  if( pF
13c30 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20  ile->pMapRegion 
13c40 26 26 20 6e 42 79 74 65 3c 70 46 69 6c 65 2d 3e  && nByte<pFile->
13c50 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20  mmapSize ){.    
13c60 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20  pFile->mmapSize 
13c70 3d 20 6e 42 79 74 65 3b 0a 20 20 7d 0a 23 65 6e  = nByte;.  }.#en
13c80 64 69 66 0a 0a 20 20 4f 53 54 52 41 43 45 28 28  dif..  OSTRACE((
13c90 22 54 52 55 4e 43 41 54 45 20 66 69 6c 65 3d 25  "TRUNCATE file=%
13ca0 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 20 70 46 69  p, rc=%s\n", pFi
13cb0 6c 65 2d 3e 68 2c 20 73 71 6c 69 74 65 33 45 72  le->h, sqlite3Er
13cc0 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 72  rName(rc)));.  r
13cd0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
13ce0 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
13cf0 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20  /*.** Count the 
13d00 6e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 73 79  number of fullsy
13d10 6e 63 73 20 61 6e 64 20 6e 6f 72 6d 61 6c 20 73  ncs and normal s
13d20 79 6e 63 73 2e 20 20 54 68 69 73 20 69 73 20 75  yncs.  This is u
13d30 73 65 64 20 74 6f 20 74 65 73 74 0a 2a 2a 20 74  sed to test.** t
13d40 68 61 74 20 73 79 6e 63 73 20 61 6e 64 20 66 75  hat syncs and fu
13d50 6c 6c 73 79 6e 63 73 20 61 72 65 20 6f 63 63 75  llsyncs are occu
13d60 72 69 6e 67 20 61 74 20 74 68 65 20 72 69 67 68  ring at the righ
13d70 74 20 74 69 6d 65 73 2e 0a 2a 2f 0a 69 6e 74 20  t times..*/.int 
13d80 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75  sqlite3_sync_cou
13d90 6e 74 20 3d 20 30 3b 0a 69 6e 74 20 73 71 6c 69  nt = 0;.int sqli
13da0 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75  te3_fullsync_cou
13db0 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  nt = 0;.#endif..
13dc0 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
13dd0 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 61 20  all writes to a 
13de0 70 61 72 74 69 63 75 6c 61 72 20 66 69 6c 65 20  particular file 
13df0 61 72 65 20 63 6f 6d 6d 69 74 74 65 64 20 74 6f  are committed to
13e00 20 64 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63   disk..*/.static
13e10 20 69 6e 74 20 77 69 6e 53 79 6e 63 28 73 71 6c   int winSync(sql
13e20 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
13e30 6e 74 20 66 6c 61 67 73 29 7b 0a 23 69 66 6e 64  nt flags){.#ifnd
13e40 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  ef SQLITE_NO_SYN
13e50 43 0a 20 20 2f 2a 0a 20 20 2a 2a 20 55 73 65 64  C.  /*.  ** Used
13e60 20 6f 6e 6c 79 20 77 68 65 6e 20 53 51 4c 49 54   only when SQLIT
13e70 45 5f 4e 4f 5f 53 59 4e 43 20 69 73 20 6e 6f 74  E_NO_SYNC is not
13e80 20 64 65 66 69 6e 65 64 2e 0a 20 20 20 2a 2f 0a   defined..   */.
13e90 20 20 42 4f 4f 4c 20 72 63 3b 0a 23 65 6e 64 69    BOOL rc;.#endi
13ea0 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  f.#if !defined(N
13eb0 44 45 42 55 47 29 20 7c 7c 20 21 64 65 66 69 6e  DEBUG) || !defin
13ec0 65 64 28 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  ed(SQLITE_NO_SYN
13ed0 43 29 20 7c 7c 20 5c 0a 20 20 20 20 28 64 65 66  C) || \.    (def
13ee0 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54  ined(SQLITE_TEST
13ef0 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  ) && defined(SQL
13f00 49 54 45 5f 44 45 42 55 47 29 29 0a 20 20 2f 2a  ITE_DEBUG)).  /*
13f10 0a 20 20 2a 2a 20 55 73 65 64 20 77 68 65 6e 20  .  ** Used when 
13f20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 69  SQLITE_NO_SYNC i
13f30 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 20 61 6e  s not defined an
13f40 64 20 62 79 20 74 68 65 20 61 73 73 65 72 74 28  d by the assert(
13f50 29 20 61 6e 64 2f 6f 72 0a 20 20 2a 2a 20 4f 53  ) and/or.  ** OS
13f60 54 52 41 43 45 28 29 20 6d 61 63 72 6f 73 2e 0a  TRACE() macros..
13f70 20 20 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 20     */.  winFile 
13f80 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c  *pFile = (winFil
13f90 65 2a 29 69 64 3b 0a 23 65 6c 73 65 0a 20 20 55  e*)id;.#else.  U
13fa0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
13fb0 69 64 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61  id);.#endif..  a
13fc0 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
13fd0 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
13fe0 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 53 59  one of SQLITE_SY
13ff0 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 46 55 4c  NC_NORMAL or FUL
14000 4c 20 77 61 73 20 70 61 73 73 65 64 20 2a 2f 0a  L was passed */.
14010 20 20 61 73 73 65 72 74 28 28 66 6c 61 67 73 26    assert((flags&
14020 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59  0x0F)==SQLITE_SY
14030 4e 43 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20 20  NC_NORMAL.      
14040 7c 7c 20 28 66 6c 61 67 73 26 30 78 30 46 29 3d  || (flags&0x0F)=
14050 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c  =SQLITE_SYNC_FUL
14060 4c 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 55 6e 69  L.  );..  /* Uni
14070 78 20 63 61 6e 6e 6f 74 2c 20 62 75 74 20 73 6f  x cannot, but so
14080 6d 65 20 73 79 73 74 65 6d 73 20 6d 61 79 20 72  me systems may r
14090 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c  eturn SQLITE_FUL
140a0 4c 20 66 72 6f 6d 20 68 65 72 65 2e 20 54 68 69  L from here. Thi
140b0 73 0a 20 20 2a 2a 20 6c 69 6e 65 20 69 73 20 74  s.  ** line is t
140c0 6f 20 74 65 73 74 20 74 68 61 74 20 64 6f 69 6e  o test that doin
140d0 67 20 73 6f 20 64 6f 65 73 20 6e 6f 74 20 63 61  g so does not ca
140e0 75 73 65 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73  use any problems
140f0 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74  ..  */.  Simulat
14100 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28 20  eDiskfullError( 
14110 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55  return SQLITE_FU
14120 4c 4c 20 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45  LL );..  OSTRACE
14130 28 28 22 53 59 4e 43 20 66 69 6c 65 3d 25 70 2c  (("SYNC file=%p,
14140 20 66 6c 61 67 73 3d 25 78 2c 20 6c 6f 63 6b 3d   flags=%x, lock=
14150 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
14160 20 20 70 46 69 6c 65 2d 3e 68 2c 20 66 6c 61 67    pFile->h, flag
14170 73 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  s, pFile->lockty
14180 70 65 29 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  pe));..#ifndef S
14190 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 55 4e 55  QLITE_TEST.  UNU
141a0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66 6c  SED_PARAMETER(fl
141b0 61 67 73 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66  ags);.#else.  if
141c0 28 20 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d  ( (flags&0x0F)==
141d0 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c  SQLITE_SYNC_FULL
141e0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
141f0 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b  fullsync_count++
14200 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
14210 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65  sync_count++;.#e
14220 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 77 65  ndif..  /* If we
14230 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 74   compiled with t
14240 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  he SQLITE_NO_SYN
14250 43 20 66 6c 61 67 2c 20 74 68 65 6e 20 73 79 6e  C flag, then syn
14260 63 69 6e 67 20 69 73 20 61 0a 20 20 2a 2a 20 6e  cing is a.  ** n
14270 6f 2d 6f 70 0a 20 20 2a 2f 0a 23 69 66 64 65 66  o-op.  */.#ifdef
14280 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a   SQLITE_NO_SYNC.
14290 20 20 4f 53 54 52 41 43 45 28 28 22 53 59 4e 43    OSTRACE(("SYNC
142a0 2d 4e 4f 50 20 66 69 6c 65 3d 25 70 2c 20 72 63  -NOP file=%p, rc
142b0 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70  =SQLITE_OK\n", p
142c0 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 72 65 74  File->h));.  ret
142d0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23  urn SQLITE_OK;.#
142e0 65 6c 73 65 0a 20 20 72 63 20 3d 20 6f 73 46 6c  else.  rc = osFl
142f0 75 73 68 46 69 6c 65 42 75 66 66 65 72 73 28 70  ushFileBuffers(p
14300 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 53 69 6d 75  File->h);.  Simu
14310 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d  lateIOError( rc=
14320 46 41 4c 53 45 20 29 3b 0a 20 20 69 66 28 20 72  FALSE );.  if( r
14330 63 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45  c ){.    OSTRACE
14340 28 28 22 53 59 4e 43 20 66 69 6c 65 3d 25 70 2c  (("SYNC file=%p,
14350 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22   rc=SQLITE_OK\n"
14360 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
14370 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
14380 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OK;.  }else{.   
14390 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
143a0 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
143b0 6f 72 28 29 3b 0a 20 20 20 20 4f 53 54 52 41 43  or();.    OSTRAC
143c0 45 28 28 22 53 59 4e 43 20 66 69 6c 65 3d 25 70  E(("SYNC file=%p
143d0 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52  , rc=SQLITE_IOER
143e0 52 5f 46 53 59 4e 43 5c 6e 22 2c 20 70 46 69 6c  R_FSYNC\n", pFil
143f0 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75  e->h));.    retu
14400 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53  rn winLogError(S
14410 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e  QLITE_IOERR_FSYN
14420 43 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  C, pFile->lastEr
14430 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
14440 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
14450 53 79 6e 63 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  Sync", pFile->zP
14460 61 74 68 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ath);.  }.#endif
14470 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d  .}../*.** Determ
14480 69 6e 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ine the current 
14490 73 69 7a 65 20 6f 66 20 61 20 66 69 6c 65 20 69  size of a file i
144a0 6e 20 62 79 74 65 73 0a 2a 2f 0a 73 74 61 74 69  n bytes.*/.stati
144b0 63 20 69 6e 74 20 77 69 6e 46 69 6c 65 53 69 7a  c int winFileSiz
144c0 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
144d0 69 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  id, sqlite3_int6
144e0 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20 77 69 6e  4 *pSize){.  win
144f0 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77  File *pFile = (w
14500 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e  inFile*)id;.  in
14510 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
14520 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 21  ;..  assert( id!
14530 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
14540 70 53 69 7a 65 21 3d 30 20 29 3b 0a 20 20 53 69  pSize!=0 );.  Si
14550 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65  mulateIOError(re
14560 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
14570 52 5f 46 53 54 41 54 29 3b 0a 20 20 4f 53 54 52  R_FSTAT);.  OSTR
14580 41 43 45 28 28 22 53 49 5a 45 20 66 69 6c 65 3d  ACE(("SIZE file=
14590 25 70 2c 20 70 53 69 7a 65 3d 25 70 5c 6e 22 2c  %p, pSize=%p\n",
145a0 20 70 46 69 6c 65 2d 3e 68 2c 20 70 53 69 7a 65   pFile->h, pSize
145b0 29 29 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  ));..#if SQLITE_
145c0 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 0a 20 20 20  OS_WINRT.  {.   
145d0 20 46 49 4c 45 5f 53 54 41 4e 44 41 52 44 5f 49   FILE_STANDARD_I
145e0 4e 46 4f 20 69 6e 66 6f 3b 0a 20 20 20 20 69 66  NFO info;.    if
145f0 28 20 6f 73 47 65 74 46 69 6c 65 49 6e 66 6f 72  ( osGetFileInfor
14600 6d 61 74 69 6f 6e 42 79 48 61 6e 64 6c 65 45 78  mationByHandleEx
14610 28 70 46 69 6c 65 2d 3e 68 2c 20 46 69 6c 65 53  (pFile->h, FileS
14620 74 61 6e 64 61 72 64 49 6e 66 6f 2c 0a 20 20 20  tandardInfo,.   
14630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14650 20 20 26 69 6e 66 6f 2c 20 73 69 7a 65 6f 66 28    &info, sizeof(
14660 69 6e 66 6f 29 29 20 29 7b 0a 20 20 20 20 20 20  info)) ){.      
14670 2a 70 53 69 7a 65 20 3d 20 69 6e 66 6f 2e 45 6e  *pSize = info.En
14680 64 4f 66 46 69 6c 65 2e 51 75 61 64 50 61 72 74  dOfFile.QuadPart
14690 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
146a0 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
146b0 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
146c0 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 72 63  rror();.      rc
146d0 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53   = winLogError(S
146e0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41  QLITE_IOERR_FSTA
146f0 54 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  T, pFile->lastEr
14700 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
14710 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
14720 46 69 6c 65 53 69 7a 65 22 2c 20 70 46 69 6c 65  FileSize", pFile
14730 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a  ->zPath);.    }.
14740 20 20 7d 0a 23 65 6c 73 65 0a 20 20 7b 0a 20 20    }.#else.  {.  
14750 20 20 44 57 4f 52 44 20 75 70 70 65 72 42 69 74    DWORD upperBit
14760 73 3b 0a 20 20 20 20 44 57 4f 52 44 20 6c 6f 77  s;.    DWORD low
14770 65 72 42 69 74 73 3b 0a 20 20 20 20 44 57 4f 52  erBits;.    DWOR
14780 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 0a 20 20  D lastErrno;..  
14790 20 20 6c 6f 77 65 72 42 69 74 73 20 3d 20 6f 73    lowerBits = os
147a0 47 65 74 46 69 6c 65 53 69 7a 65 28 70 46 69 6c  GetFileSize(pFil
147b0 65 2d 3e 68 2c 20 26 75 70 70 65 72 42 69 74 73  e->h, &upperBits
147c0 29 3b 0a 20 20 20 20 2a 70 53 69 7a 65 20 3d 20  );.    *pSize = 
147d0 28 28 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  (((sqlite3_int64
147e0 29 75 70 70 65 72 42 69 74 73 29 3c 3c 33 32 29  )upperBits)<<32)
147f0 20 2b 20 6c 6f 77 65 72 42 69 74 73 3b 0a 20 20   + lowerBits;.  
14800 20 20 69 66 28 20 20 20 28 6c 6f 77 65 72 42 69    if(   (lowerBi
14810 74 73 20 3d 3d 20 49 4e 56 41 4c 49 44 5f 46 49  ts == INVALID_FI
14820 4c 45 5f 53 49 5a 45 29 0a 20 20 20 20 20 20 20  LE_SIZE).       
14830 26 26 20 28 28 6c 61 73 74 45 72 72 6e 6f 20 3d  && ((lastErrno =
14840 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
14850 29 29 21 3d 4e 4f 5f 45 52 52 4f 52 29 20 29 7b  ))!=NO_ERROR) ){
14860 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  .      pFile->la
14870 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72  stErrno = lastEr
14880 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  rno;.      rc = 
14890 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
148a0 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 2c 20  TE_IOERR_FSTAT, 
148b0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
148c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
148d0 20 20 20 20 20 20 20 20 20 22 77 69 6e 46 69 6c           "winFil
148e0 65 53 69 7a 65 22 2c 20 70 46 69 6c 65 2d 3e 7a  eSize", pFile->z
148f0 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Path);.    }.  }
14900 0a 23 65 6e 64 69 66 0a 20 20 4f 53 54 52 41 43  .#endif.  OSTRAC
14910 45 28 28 22 53 49 5a 45 20 66 69 6c 65 3d 25 70  E(("SIZE file=%p
14920 2c 20 70 53 69 7a 65 3d 25 70 2c 20 2a 70 53 69  , pSize=%p, *pSi
14930 7a 65 3d 25 6c 6c 64 2c 20 72 63 3d 25 73 5c 6e  ze=%lld, rc=%s\n
14940 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46  ",.           pF
14950 69 6c 65 2d 3e 68 2c 20 70 53 69 7a 65 2c 20 2a  ile->h, pSize, *
14960 70 53 69 7a 65 2c 20 73 71 6c 69 74 65 33 45 72  pSize, sqlite3Er
14970 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 72  rName(rc)));.  r
14980 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
14990 2a 2a 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c  ** LOCKFILE_FAIL
149a0 5f 49 4d 4d 45 44 49 41 54 45 4c 59 20 69 73 20  _IMMEDIATELY is 
149b0 75 6e 64 65 66 69 6e 65 64 20 6f 6e 20 73 6f 6d  undefined on som
149c0 65 20 57 69 6e 64 6f 77 73 20 73 79 73 74 65 6d  e Windows system
149d0 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4c 4f  s..*/.#ifndef LO
149e0 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45  CKFILE_FAIL_IMME
149f0 44 49 41 54 45 4c 59 0a 23 20 64 65 66 69 6e 65  DIATELY.# define
14a00 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49   LOCKFILE_FAIL_I
14a10 4d 4d 45 44 49 41 54 45 4c 59 20 31 0a 23 65 6e  MMEDIATELY 1.#en
14a20 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 4c 4f 43  dif..#ifndef LOC
14a30 4b 46 49 4c 45 5f 45 58 43 4c 55 53 49 56 45 5f  KFILE_EXCLUSIVE_
14a40 4c 4f 43 4b 0a 23 20 64 65 66 69 6e 65 20 4c 4f  LOCK.# define LO
14a50 43 4b 46 49 4c 45 5f 45 58 43 4c 55 53 49 56 45  CKFILE_EXCLUSIVE
14a60 5f 4c 4f 43 4b 20 32 0a 23 65 6e 64 69 66 0a 0a  _LOCK 2.#endif..
14a70 2f 2a 0a 2a 2a 20 48 69 73 74 6f 72 69 63 61 6c  /*.** Historical
14a80 6c 79 2c 20 53 51 4c 69 74 65 20 68 61 73 20 75  ly, SQLite has u
14a90 73 65 64 20 62 6f 74 68 20 74 68 65 20 4c 6f 63  sed both the Loc
14aa0 6b 46 69 6c 65 20 61 6e 64 20 4c 6f 63 6b 46 69  kFile and LockFi
14ab0 6c 65 45 78 20 66 75 6e 63 74 69 6f 6e 73 2e 0a  leEx functions..
14ac0 2a 2a 20 57 68 65 6e 20 74 68 65 20 4c 6f 63 6b  ** When the Lock
14ad0 46 69 6c 65 20 66 75 6e 63 74 69 6f 6e 20 77 61  File function wa
14ae0 73 20 75 73 65 64 2c 20 69 74 20 77 61 73 20 61  s used, it was a
14af0 6c 77 61 79 73 20 65 78 70 65 63 74 65 64 20 74  lways expected t
14b00 6f 20 66 61 69 6c 0a 2a 2a 20 69 6d 6d 65 64 69  o fail.** immedi
14b10 61 74 65 6c 79 20 69 66 20 74 68 65 20 6c 6f 63  ately if the loc
14b20 6b 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 6f  k could not be o
14b30 62 74 61 69 6e 65 64 2e 20 20 41 6c 73 6f 2c 20  btained.  Also, 
14b40 69 74 20 61 6c 77 61 79 73 20 65 78 70 65 63 74  it always expect
14b50 65 64 20 74 6f 0a 2a 2a 20 6f 62 74 61 69 6e 20  ed to.** obtain 
14b60 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
14b70 6b 2e 20 20 54 68 65 73 65 20 66 6c 61 67 73 20  k.  These flags 
14b80 61 72 65 20 75 73 65 64 20 77 69 74 68 20 74 68  are used with th
14b90 65 20 4c 6f 63 6b 46 69 6c 65 45 78 20 66 75 6e  e LockFileEx fun
14ba0 63 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 72 65 66  ction.** and ref
14bb0 6c 65 63 74 20 74 68 6f 73 65 20 65 78 70 65 63  lect those expec
14bc0 74 61 74 69 6f 6e 73 3b 20 74 68 65 72 65 66 6f  tations; therefo
14bd0 72 65 2c 20 74 68 65 79 20 73 68 6f 75 6c 64 20  re, they should 
14be0 6e 6f 74 20 62 65 20 63 68 61 6e 67 65 64 2e 0a  not be changed..
14bf0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
14c00 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53  E_LOCKFILE_FLAGS
14c10 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  .# define SQLITE
14c20 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53 20  _LOCKFILE_FLAGS 
14c30 20 20 28 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c    (LOCKFILE_FAIL
14c40 5f 49 4d 4d 45 44 49 41 54 45 4c 59 20 7c 20 5c  _IMMEDIATELY | \
14c50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c70 20 20 20 4c 4f 43 4b 46 49 4c 45 5f 45 58 43 4c     LOCKFILE_EXCL
14c80 55 53 49 56 45 5f 4c 4f 43 4b 29 0a 23 65 6e 64  USIVE_LOCK).#end
14c90 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 75 72 72 65 6e  if../*.** Curren
14ca0 74 6c 79 2c 20 53 51 4c 69 74 65 20 6e 65 76 65  tly, SQLite neve
14cb0 72 20 63 61 6c 6c 73 20 74 68 65 20 4c 6f 63 6b  r calls the Lock
14cc0 46 69 6c 65 45 78 20 66 75 6e 63 74 69 6f 6e 20  FileEx function 
14cd0 77 69 74 68 6f 75 74 20 77 61 6e 74 69 6e 67 20  without wanting 
14ce0 74 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 66  the.** call to f
14cf0 61 69 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ail immediately 
14d00 69 66 20 74 68 65 20 6c 6f 63 6b 20 63 61 6e 6e  if the lock cann
14d10 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2e 0a  ot be obtained..
14d20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
14d30 45 5f 4c 4f 43 4b 46 49 4c 45 45 58 5f 46 4c 41  E_LOCKFILEEX_FLA
14d40 47 53 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49  GS.# define SQLI
14d50 54 45 5f 4c 4f 43 4b 46 49 4c 45 45 58 5f 46 4c  TE_LOCKFILEEX_FL
14d60 41 47 53 20 28 4c 4f 43 4b 46 49 4c 45 5f 46 41  AGS (LOCKFILE_FA
14d70 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 29 0a  IL_IMMEDIATELY).
14d80 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 63  #endif../*.** Ac
14d90 71 75 69 72 65 20 61 20 72 65 61 64 65 72 20 6c  quire a reader l
14da0 6f 63 6b 2e 0a 2a 2a 20 44 69 66 66 65 72 65 6e  ock..** Differen
14db0 74 20 41 50 49 20 72 6f 75 74 69 6e 65 73 20 61  t API routines a
14dc0 72 65 20 63 61 6c 6c 65 64 20 64 65 70 65 6e 64  re called depend
14dd0 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f  ing on whether o
14de0 72 20 6e 6f 74 20 74 68 69 73 0a 2a 2a 20 69 73  r not this.** is
14df0 20 57 69 6e 39 78 20 6f 72 20 57 69 6e 4e 54 2e   Win9x or WinNT.
14e00 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
14e10 69 6e 47 65 74 52 65 61 64 4c 6f 63 6b 28 77 69  inGetReadLock(wi
14e20 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20  nFile *pFile){. 
14e30 20 69 6e 74 20 72 65 73 3b 0a 20 20 4f 53 54 52   int res;.  OSTR
14e40 41 43 45 28 28 22 52 45 41 44 2d 4c 4f 43 4b 20  ACE(("READ-LOCK 
14e50 66 69 6c 65 3d 25 70 2c 20 6c 6f 63 6b 3d 25 64  file=%p, lock=%d
14e60 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 70  \n", pFile->h, p
14e70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29  File->locktype))
14e80 3b 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29  ;.  if( osIsNT()
14e90 20 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f   ){.#if SQLITE_O
14ea0 53 5f 57 49 4e 43 45 0a 20 20 20 20 2f 2a 0a 20  S_WINCE.    /*. 
14eb0 20 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 69 6e 64     ** NOTE: Wind
14ec0 6f 77 73 20 43 45 20 69 73 20 68 61 6e 64 6c 65  ows CE is handle
14ed0 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20 68 65  d differently he
14ee0 72 65 20 64 75 65 20 69 74 73 20 6c 61 63 6b 20  re due its lack 
14ef0 6f 66 20 74 68 65 20 57 69 6e 33 32 0a 20 20 20  of the Win32.   
14f00 20 2a 2a 20 20 20 20 20 20 20 41 50 49 20 4c 6f   **       API Lo
14f10 63 6b 46 69 6c 65 45 78 2e 0a 20 20 20 20 2a 2f  ckFileEx..    */
14f20 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e 63 65  .    res = wince
14f30 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d  LockFile(&pFile-
14f40 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54  >h, SHARED_FIRST
14f50 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 23 65 6c 73  , 0, 1, 0);.#els
14f60 65 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e 4c  e.    res = winL
14f70 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e  ockFile(&pFile->
14f80 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49  h, SQLITE_LOCKFI
14f90 4c 45 45 58 5f 46 4c 41 47 53 2c 20 53 48 41 52  LEEX_FLAGS, SHAR
14fa0 45 44 5f 46 49 52 53 54 2c 20 30 2c 0a 20 20 20  ED_FIRST, 0,.   
14fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14fc0 20 20 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20     SHARED_SIZE, 
14fd0 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23  0);.#endif.  }.#
14fe0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  ifdef SQLITE_WIN
14ff0 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c  32_HAS_ANSI.  el
15000 73 65 7b 0a 20 20 20 20 69 6e 74 20 6c 6b 3b 0a  se{.    int lk;.
15010 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64      sqlite3_rand
15020 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 6c 6b  omness(sizeof(lk
15030 29 2c 20 26 6c 6b 29 3b 0a 20 20 20 20 70 46 69  ), &lk);.    pFi
15040 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79  le->sharedLockBy
15050 74 65 20 3d 20 28 73 68 6f 72 74 29 28 28 6c 6b  te = (short)((lk
15060 20 26 20 30 78 37 66 66 66 66 66 66 66 29 25 28   & 0x7fffffff)%(
15070 53 48 41 52 45 44 5f 53 49 5a 45 20 2d 20 31 29  SHARED_SIZE - 1)
15080 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e  );.    res = win
15090 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d  LockFile(&pFile-
150a0 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46  >h, SQLITE_LOCKF
150b0 49 4c 45 5f 46 4c 41 47 53 2c 0a 20 20 20 20 20  ILE_FLAGS,.     
150c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
150d0 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b 70 46   SHARED_FIRST+pF
150e0 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42  ile->sharedLockB
150f0 79 74 65 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20  yte, 0, 1, 0);. 
15100 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
15110 72 65 73 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20  res == 0 ){.    
15120 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
15130 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
15140 72 28 29 3b 0a 20 20 20 20 2f 2a 20 4e 6f 20 6e  r();.    /* No n
15150 65 65 64 20 74 6f 20 6c 6f 67 20 61 20 66 61 69  eed to log a fai
15160 6c 75 72 65 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a  lure to lock */.
15170 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22    }.  OSTRACE(("
15180 52 45 41 44 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25  READ-LOCK file=%
15190 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 20 70 46 69  p, rc=%s\n", pFi
151a0 6c 65 2d 3e 68 2c 20 73 71 6c 69 74 65 33 45 72  le->h, sqlite3Er
151b0 72 4e 61 6d 65 28 72 65 73 29 29 29 3b 0a 20 20  rName(res)));.  
151c0 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f  return res;.}../
151d0 2a 0a 2a 2a 20 55 6e 64 6f 20 61 20 72 65 61 64  *.** Undo a read
151e0 6c 6f 63 6b 0a 2a 2f 0a 73 74 61 74 69 63 20 69  lock.*/.static i
151f0 6e 74 20 77 69 6e 55 6e 6c 6f 63 6b 52 65 61 64  nt winUnlockRead
15200 4c 6f 63 6b 28 77 69 6e 46 69 6c 65 20 2a 70 46  Lock(winFile *pF
15210 69 6c 65 29 7b 0a 20 20 69 6e 74 20 72 65 73 3b  ile){.  int res;
15220 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72  .  DWORD lastErr
15230 6e 6f 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  no;.  OSTRACE(("
15240 52 45 41 44 2d 55 4e 4c 4f 43 4b 20 66 69 6c 65  READ-UNLOCK file
15250 3d 25 70 2c 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c  =%p, lock=%d\n",
15260 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65   pFile->h, pFile
15270 2d 3e 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 20 20  ->locktype));.  
15280 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a  if( osIsNT() ){.
15290 20 20 20 20 72 65 73 20 3d 20 77 69 6e 55 6e 6c      res = winUnl
152a0 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e  ockFile(&pFile->
152b0 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c  h, SHARED_FIRST,
152c0 20 30 2c 20 53 48 41 52 45 44 5f 53 49 5a 45 2c   0, SHARED_SIZE,
152d0 20 30 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20   0);.  }.#ifdef 
152e0 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
152f0 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20  _ANSI.  else{.  
15300 20 20 72 65 73 20 3d 20 77 69 6e 55 6e 6c 6f 63    res = winUnloc
15310 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c  kFile(&pFile->h,
15320 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b 70 46   SHARED_FIRST+pF
15330 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42  ile->sharedLockB
15340 79 74 65 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20  yte, 0, 1, 0);. 
15350 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
15360 72 65 73 3d 3d 30 20 26 26 20 28 28 6c 61 73 74  res==0 && ((last
15370 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
15380 74 45 72 72 6f 72 28 29 29 21 3d 45 52 52 4f 52  tError())!=ERROR
15390 5f 4e 4f 54 5f 4c 4f 43 4b 45 44 29 20 29 7b 0a  _NOT_LOCKED) ){.
153a0 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
153b0 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f  rrno = lastErrno
153c0 3b 0a 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f  ;.    winLogErro
153d0 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  r(SQLITE_IOERR_U
153e0 4e 4c 4f 43 4b 2c 20 70 46 69 6c 65 2d 3e 6c 61  NLOCK, pFile->la
153f0 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
15400 20 20 20 20 20 20 20 20 20 22 77 69 6e 55 6e 6c           "winUnl
15410 6f 63 6b 52 65 61 64 4c 6f 63 6b 22 2c 20 70 46  ockReadLock", pF
15420 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d  ile->zPath);.  }
15430 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52 45 41  .  OSTRACE(("REA
15440 44 2d 55 4e 4c 4f 43 4b 20 66 69 6c 65 3d 25 70  D-UNLOCK file=%p
15450 2c 20 72 63 3d 25 73 5c 6e 22 2c 20 70 46 69 6c  , rc=%s\n", pFil
15460 65 2d 3e 68 2c 20 73 71 6c 69 74 65 33 45 72 72  e->h, sqlite3Err
15470 4e 61 6d 65 28 72 65 73 29 29 29 3b 0a 20 20 72  Name(res)));.  r
15480 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a  eturn res;.}../*
15490 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c  .** Lock the fil
154a0 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20  e with the lock 
154b0 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72  specified by par
154c0 61 6d 65 74 65 72 20 6c 6f 63 6b 74 79 70 65 20  ameter locktype 
154d0 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20  - one.** of the 
154e0 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
154f0 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44 5f       (1) SHARED_
15500 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20  LOCK.**     (2) 
15510 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a  RESERVED_LOCK.**
15520 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47       (3) PENDING
15530 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29  _LOCK.**     (4)
15540 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a   EXCLUSIVE_LOCK.
15550 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20  **.** Sometimes 
15560 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20  when requesting 
15570 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20  one lock state, 
15580 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20  additional lock 
15590 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e  states.** are in
155a0 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65 65  serted in betwee
155b0 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20  n.  The locking 
155c0 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e  might fail on on
155d0 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a  e of the later.*
155e0 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65  * transitions le
155f0 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73  aving the lock s
15600 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20 66  tate different f
15610 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61 72  rom what it star
15620 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c  ted but.** still
15630 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f   short of its go
15640 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  al.  The followi
15650 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20 74  ng chart shows t
15660 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72  he allowed.** tr
15670 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68  ansitions and th
15680 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72  e inserted inter
15690 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a  mediate states:.
156a0 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45  **.**    UNLOCKE
156b0 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20  D -> SHARED.**  
156c0 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45    SHARED -> RESE
156d0 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  RVED.**    SHARE
156e0 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
156f0 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
15700 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50    RESERVED -> (P
15710 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
15720 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49  SIVE.**    PENDI
15730 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  NG -> EXCLUSIVE.
15740 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
15750 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63  ne will only inc
15760 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 54  rease a lock.  T
15770 68 65 20 77 69 6e 55 6e 6c 6f 63 6b 28 29 20 72  he winUnlock() r
15780 6f 75 74 69 6e 65 0a 2a 2a 20 65 72 61 73 65 73  outine.** erases
15790 20 61 6c 6c 20 6c 6f 63 6b 73 20 61 74 20 6f 6e   all locks at on
157a0 63 65 20 61 6e 64 20 72 65 74 75 72 6e 73 20 75  ce and returns u
157b0 73 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f  s immediately to
157c0 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 30   locking level 0
157d0 2e 0a 2a 2a 20 49 74 20 69 73 20 6e 6f 74 20 70  ..** It is not p
157e0 6f 73 73 69 62 6c 65 20 74 6f 20 6c 6f 77 65 72  ossible to lower
157f0 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
15800 65 6c 20 6f 6e 65 20 73 74 65 70 20 61 74 20 61  el one step at a
15810 20 74 69 6d 65 2e 20 20 59 6f 75 0a 2a 2a 20 6d   time.  You.** m
15820 75 73 74 20 67 6f 20 73 74 72 61 69 67 68 74 20  ust go straight 
15830 74 6f 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  to locking level
15840 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e   0..*/.static in
15850 74 20 77 69 6e 4c 6f 63 6b 28 73 71 6c 69 74 65  t winLock(sqlite
15860 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
15870 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74  locktype){.  int
15880 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
15890 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
158a0 64 65 20 66 72 6f 6d 20 73 75 62 72 6f 75 74 69  de from subrouti
158b0 6e 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73  nes */.  int res
158c0 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20   = 1;           
158d0 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20 61 20 57  /* Result of a W
158e0 69 6e 64 6f 77 73 20 6c 6f 63 6b 20 63 61 6c 6c  indows lock call
158f0 20 2a 2f 0a 20 20 69 6e 74 20 6e 65 77 4c 6f 63   */.  int newLoc
15900 6b 74 79 70 65 3b 20 20 20 20 20 20 20 2f 2a 20  ktype;       /* 
15910 53 65 74 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  Set pFile->lockt
15920 79 70 65 20 74 6f 20 74 68 69 73 20 76 61 6c 75  ype to this valu
15930 65 20 62 65 66 6f 72 65 20 65 78 69 74 69 6e 67  e before exiting
15940 20 2a 2f 0a 20 20 69 6e 74 20 67 6f 74 50 65 6e   */.  int gotPen
15950 64 69 6e 67 4c 6f 63 6b 20 3d 20 30 3b 2f 2a 20  dingLock = 0;/* 
15960 54 72 75 65 20 69 66 20 77 65 20 61 63 71 75 69  True if we acqui
15970 72 65 64 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f  red a PENDING lo
15980 63 6b 20 74 68 69 73 20 74 69 6d 65 20 2a 2f 0a  ck this time */.
15990 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65    winFile *pFile
159a0 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b   = (winFile*)id;
159b0 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72  .  DWORD lastErr
159c0 6e 6f 20 3d 20 4e 4f 5f 45 52 52 4f 52 3b 0a 0a  no = NO_ERROR;..
159d0 20 20 61 73 73 65 72 74 28 20 69 64 21 3d 30 20    assert( id!=0 
159e0 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c  );.  OSTRACE(("L
159f0 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6f 6c 64  OCK file=%p, old
15a00 4c 6f 63 6b 3d 25 64 28 25 64 29 2c 20 6e 65 77  Lock=%d(%d), new
15a10 4c 6f 63 6b 3d 25 64 5c 6e 22 2c 0a 20 20 20 20  Lock=%d\n",.    
15a20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c         pFile->h,
15a30 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
15a40 2c 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c  , pFile->sharedL
15a50 6f 63 6b 42 79 74 65 2c 20 6c 6f 63 6b 74 79 70  ockByte, locktyp
15a60 65 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  e));..  /* If th
15a70 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61  ere is already a
15a80 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20 74 79   lock of this ty
15a90 70 65 20 6f 72 20 6d 6f 72 65 20 72 65 73 74 72  pe or more restr
15aa0 69 63 74 69 76 65 20 6f 6e 20 74 68 65 0a 20 20  ictive on the.  
15ab0 2a 2a 20 4f 73 46 69 6c 65 2c 20 64 6f 20 6e 6f  ** OsFile, do no
15ac0 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65  thing. Don't use
15ad0 20 74 68 65 20 65 6e 64 5f 6c 6f 63 6b 3a 20 65   the end_lock: e
15ae0 78 69 74 20 70 61 74 68 2c 20 61 73 0a 20 20 2a  xit path, as.  *
15af0 2a 20 73 71 6c 69 74 65 33 4f 73 45 6e 74 65 72  * sqlite3OsEnter
15b00 4d 75 74 65 78 28 29 20 68 61 73 6e 27 74 20 62  Mutex() hasn't b
15b10 65 65 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a  een called yet..
15b20 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65    */.  if( pFile
15b30 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 6c 6f 63 6b  ->locktype>=lock
15b40 74 79 70 65 20 29 7b 0a 20 20 20 20 4f 53 54 52  type ){.    OSTR
15b50 41 43 45 28 28 22 4c 4f 43 4b 2d 48 45 4c 44 20  ACE(("LOCK-HELD 
15b60 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49  file=%p, rc=SQLI
15b70 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d  TE_OK\n", pFile-
15b80 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  >h));.    return
15b90 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
15ba0 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
15bb0 74 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75  the locking sequ
15bc0 65 6e 63 65 20 69 73 20 63 6f 72 72 65 63 74 0a  ence is correct.
15bd0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
15be0 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d  File->locktype!=
15bf0 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 6c 6f 63 6b 74  NO_LOCK || lockt
15c00 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype==SHARED_LOCK
15c10 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f   );.  assert( lo
15c20 63 6b 74 79 70 65 21 3d 50 45 4e 44 49 4e 47 5f  cktype!=PENDING_
15c30 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
15c40 28 20 6c 6f 63 6b 74 79 70 65 21 3d 52 45 53 45  ( locktype!=RESE
15c50 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69  RVED_LOCK || pFi
15c60 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53 48  le->locktype==SH
15c70 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20  ARED_LOCK );..  
15c80 2f 2a 20 4c 6f 63 6b 20 74 68 65 20 50 45 4e 44  /* Lock the PEND
15c90 49 4e 47 5f 4c 4f 43 4b 20 62 79 74 65 20 69 66  ING_LOCK byte if
15ca0 20 77 65 20 6e 65 65 64 20 74 6f 20 61 63 71 75   we need to acqu
15cb0 69 72 65 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f  ire a PENDING lo
15cc0 63 6b 20 6f 72 0a 20 20 2a 2a 20 61 20 53 48 41  ck or.  ** a SHA
15cd0 52 45 44 20 6c 6f 63 6b 2e 20 20 49 66 20 77 65  RED lock.  If we
15ce0 20 61 72 65 20 61 63 71 75 69 72 69 6e 67 20 61   are acquiring a
15cf0 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68   SHARED lock, th
15d00 65 20 61 63 71 75 69 73 69 74 69 6f 6e 20 6f 66  e acquisition of
15d10 0a 20 20 2a 2a 20 74 68 65 20 50 45 4e 44 49 4e  .  ** the PENDIN
15d20 47 5f 4c 4f 43 4b 20 62 79 74 65 20 69 73 20 74  G_LOCK byte is t
15d30 65 6d 70 6f 72 61 72 79 2e 0a 20 20 2a 2f 0a 20  emporary..  */. 
15d40 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 70   newLocktype = p
15d50 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a  File->locktype;.
15d60 20 20 69 66 28 20 20 20 28 70 46 69 6c 65 2d 3e    if(   (pFile->
15d70 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43  locktype==NO_LOC
15d80 4b 29 0a 20 20 20 20 20 7c 7c 20 28 20 20 20 28  K).     || (   (
15d90 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53  locktype==EXCLUS
15da0 49 56 45 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20  IVE_LOCK).      
15db0 20 20 20 26 26 20 28 70 46 69 6c 65 2d 3e 6c 6f     && (pFile->lo
15dc0 63 6b 74 79 70 65 3d 3d 52 45 53 45 52 56 45 44  cktype==RESERVED
15dd0 5f 4c 4f 43 4b 29 29 0a 20 20 29 7b 0a 20 20 20  _LOCK)).  ){.   
15de0 20 69 6e 74 20 63 6e 74 20 3d 20 33 3b 0a 20 20   int cnt = 3;.  
15df0 20 20 77 68 69 6c 65 28 20 63 6e 74 2d 2d 3e 30    while( cnt-->0
15e00 20 26 26 20 28 72 65 73 20 3d 20 77 69 6e 4c 6f   && (res = winLo
15e10 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68  ckFile(&pFile->h
15e20 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c  , SQLITE_LOCKFIL
15e30 45 5f 46 4c 41 47 53 2c 0a 20 20 20 20 20 20 20  E_FLAGS,.       
15e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e60 20 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20    PENDING_BYTE, 
15e70 30 2c 20 31 2c 20 30 29 29 3d 3d 30 20 29 7b 0a  0, 1, 0))==0 ){.
15e80 20 20 20 20 20 20 2f 2a 20 54 72 79 20 33 20 74        /* Try 3 t
15e90 69 6d 65 73 20 74 6f 20 67 65 74 20 74 68 65 20  imes to get the 
15ea0 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 2e 20 20 54  pending lock.  T
15eb0 68 69 73 20 69 73 20 6e 65 65 64 65 64 20 74 6f  his is needed to
15ec0 20 77 6f 72 6b 0a 20 20 20 20 20 20 2a 2a 20 61   work.      ** a
15ed0 72 6f 75 6e 64 20 70 72 6f 62 6c 65 6d 73 20 63  round problems c
15ee0 61 75 73 65 64 20 62 79 20 69 6e 64 65 78 69 6e  aused by indexin
15ef0 67 20 61 6e 64 2f 6f 72 20 61 6e 74 69 2d 76 69  g and/or anti-vi
15f00 72 75 73 20 73 6f 66 74 77 61 72 65 20 6f 6e 0a  rus software on.
15f10 20 20 20 20 20 20 2a 2a 20 57 69 6e 64 6f 77 73        ** Windows
15f20 20 73 79 73 74 65 6d 73 2e 0a 20 20 20 20 20 20   systems..      
15f30 2a 2a 20 49 66 20 79 6f 75 20 61 72 65 20 75 73  ** If you are us
15f40 69 6e 67 20 74 68 69 73 20 63 6f 64 65 20 61 73  ing this code as
15f50 20 61 20 6d 6f 64 65 6c 20 66 6f 72 20 61 6c 74   a model for alt
15f60 65 72 6e 61 74 69 76 65 20 56 46 53 65 73 2c 20  ernative VFSes, 
15f70 64 6f 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20  do not.      ** 
15f80 63 6f 70 79 20 74 68 69 73 20 72 65 74 72 79 20  copy this retry 
15f90 6c 6f 67 69 63 2e 20 20 49 74 20 69 73 20 61 20  logic.  It is a 
15fa0 68 61 63 6b 20 69 6e 74 65 6e 64 65 64 20 66 6f  hack intended fo
15fb0 72 20 57 69 6e 64 6f 77 73 20 6f 6e 6c 79 2e 0a  r Windows only..
15fc0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 4f        */.      O
15fd0 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 2d 50 45  STRACE(("LOCK-PE
15fe0 4e 44 49 4e 47 2d 46 41 49 4c 20 66 69 6c 65 3d  NDING-FAIL file=
15ff0 25 70 2c 20 63 6f 75 6e 74 3d 25 64 2c 20 72 63  %p, count=%d, rc
16000 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%s\n",.        
16010 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c         pFile->h,
16020 20 63 6e 74 2c 20 73 71 6c 69 74 65 33 45 72 72   cnt, sqlite3Err
16030 4e 61 6d 65 28 72 65 73 29 29 29 3b 0a 20 20 20  Name(res)));.   
16040 20 20 20 69 66 28 20 63 6e 74 20 29 20 73 71 6c     if( cnt ) sql
16050 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70  ite3_win32_sleep
16060 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67  (1);.    }.    g
16070 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20  otPendingLock = 
16080 72 65 73 3b 0a 20 20 20 20 69 66 28 20 21 72 65  res;.    if( !re
16090 73 20 29 7b 0a 20 20 20 20 20 20 6c 61 73 74 45  s ){.      lastE
160a0 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
160b0 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 7d 0a 20  Error();.    }. 
160c0 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72 65   }..  /* Acquire
160d0 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 0a 20   a shared lock. 
160e0 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79   */.  if( lockty
160f0 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe==SHARED_LOCK 
16100 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20 61 73  && res ){.    as
16110 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63  sert( pFile->loc
16120 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29  ktype==NO_LOCK )
16130 3b 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e 47  ;.    res = winG
16140 65 74 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65  etReadLock(pFile
16150 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73 20 29  );.    if( res )
16160 7b 0a 20 20 20 20 20 20 6e 65 77 4c 6f 63 6b 74  {.      newLockt
16170 79 70 65 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43  ype = SHARED_LOC
16180 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  K;.    }else{.  
16190 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20      lastErrno = 
161a0 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
161b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
161c0 2a 20 41 63 71 75 69 72 65 20 61 20 52 45 53 45  * Acquire a RESE
161d0 52 56 45 44 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20  RVED lock.  */. 
161e0 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 52   if( locktype==R
161f0 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20  ESERVED_LOCK && 
16200 72 65 73 20 29 7b 0a 20 20 20 20 61 73 73 65 72  res ){.    asser
16210 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  t( pFile->lockty
16220 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe==SHARED_LOCK 
16230 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e  );.    res = win
16240 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d  LockFile(&pFile-
16250 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46  >h, SQLITE_LOCKF
16260 49 4c 45 5f 46 4c 41 47 53 2c 20 52 45 53 45 52  ILE_FLAGS, RESER
16270 56 45 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20  VED_BYTE, 0, 1, 
16280 30 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73 20  0);.    if( res 
16290 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c 6f 63 6b  ){.      newLock
162a0 74 79 70 65 20 3d 20 52 45 53 45 52 56 45 44 5f  type = RESERVED_
162b0 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  LOCK;.    }else{
162c0 0a 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f  .      lastErrno
162d0 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
162e0 72 28 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  r();.    }.  }..
162f0 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20 50    /* Acquire a P
16300 45 4e 44 49 4e 47 20 6c 6f 63 6b 0a 20 20 2a 2f  ENDING lock.  */
16310 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d  .  if( locktype=
16320 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
16330 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20 6e 65  && res ){.    ne
16340 77 4c 6f 63 6b 74 79 70 65 20 3d 20 50 45 4e 44  wLocktype = PEND
16350 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20 67 6f  ING_LOCK;.    go
16360 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20 30  tPendingLock = 0
16370 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75  ;.  }..  /* Acqu
16380 69 72 65 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ire an EXCLUSIVE
16390 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28   lock.  */.  if(
163a0 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55   locktype==EXCLU
163b0 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 72 65 73  SIVE_LOCK && res
163c0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
163d0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e  pFile->locktype>
163e0 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
163f0 20 20 20 20 72 65 73 20 3d 20 77 69 6e 55 6e 6c      res = winUnl
16400 6f 63 6b 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c  ockReadLock(pFil
16410 65 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 77 69  e);.    res = wi
16420 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65  nLockFile(&pFile
16430 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  ->h, SQLITE_LOCK
16440 46 49 4c 45 5f 46 4c 41 47 53 2c 20 53 48 41 52  FILE_FLAGS, SHAR
16450 45 44 5f 46 49 52 53 54 2c 20 30 2c 0a 20 20 20  ED_FIRST, 0,.   
16460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16470 20 20 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20     SHARED_SIZE, 
16480 30 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73 20  0);.    if( res 
16490 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c 6f 63 6b  ){.      newLock
164a0 74 79 70 65 20 3d 20 45 58 43 4c 55 53 49 56 45  type = EXCLUSIVE
164b0 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65  _LOCK;.    }else
164c0 7b 0a 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e  {.      lastErrn
164d0 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
164e0 6f 72 28 29 3b 0a 20 20 20 20 20 20 77 69 6e 47  or();.      winG
164f0 65 74 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65  etReadLock(pFile
16500 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
16510 2f 2a 20 49 66 20 77 65 20 61 72 65 20 68 6f 6c  /* If we are hol
16520 64 69 6e 67 20 61 20 50 45 4e 44 49 4e 47 20 6c  ding a PENDING l
16530 6f 63 6b 20 74 68 61 74 20 6f 75 67 68 74 20 74  ock that ought t
16540 6f 20 62 65 20 72 65 6c 65 61 73 65 64 2c 20 74  o be released, t
16550 68 65 6e 0a 20 20 2a 2a 20 72 65 6c 65 61 73 65  hen.  ** release
16560 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20   it now..  */.  
16570 69 66 28 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f  if( gotPendingLo
16580 63 6b 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d  ck && locktype==
16590 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SHARED_LOCK ){. 
165a0 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65     winUnlockFile
165b0 28 26 70 46 69 6c 65 2d 3e 68 2c 20 50 45 4e 44  (&pFile->h, PEND
165c0 49 4e 47 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20  ING_BYTE, 0, 1, 
165d0 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70  0);.  }..  /* Up
165e0 64 61 74 65 20 74 68 65 20 73 74 61 74 65 20 6f  date the state o
165f0 66 20 74 68 65 20 6c 6f 63 6b 20 68 61 73 20 68  f the lock has h
16600 65 6c 64 20 69 6e 20 74 68 65 20 66 69 6c 65 20  eld in the file 
16610 64 65 73 63 72 69 70 74 6f 72 20 74 68 65 6e 0a  descriptor then.
16620 20 20 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20    ** return the 
16630 61 70 70 72 6f 70 72 69 61 74 65 20 72 65 73 75  appropriate resu
16640 6c 74 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20  lt code..  */.  
16650 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20 72  if( res ){.    r
16660 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
16670 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c   }else{.    pFil
16680 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c  e->lastErrno = l
16690 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 72 63  astErrno;.    rc
166a0 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
166b0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f      OSTRACE(("LO
166c0 43 4b 2d 46 41 49 4c 20 66 69 6c 65 3d 25 70 2c  CK-FAIL file=%p,
166d0 20 77 61 6e 74 65 64 3d 25 64 2c 20 67 6f 74 3d   wanted=%d, got=
166e0 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
166f0 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f      pFile->h, lo
16700 63 6b 74 79 70 65 2c 20 6e 65 77 4c 6f 63 6b 74  cktype, newLockt
16710 79 70 65 29 29 3b 0a 20 20 7d 0a 20 20 70 46 69  ype));.  }.  pFi
16720 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 28  le->locktype = (
16730 75 38 29 6e 65 77 4c 6f 63 6b 74 79 70 65 3b 0a  u8)newLocktype;.
16740 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b    OSTRACE(("LOCK
16750 20 66 69 6c 65 3d 25 70 2c 20 6c 6f 63 6b 3d 25   file=%p, lock=%
16760 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20  d, rc=%s\n",.   
16770 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68          pFile->h
16780 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  , pFile->locktyp
16790 65 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d  e, sqlite3ErrNam
167a0 65 28 72 63 29 29 29 3b 0a 20 20 72 65 74 75 72  e(rc)));.  retur
167b0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
167c0 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63  his routine chec
167d0 6b 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ks if there is a
167e0 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68   RESERVED lock h
167f0 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69  eld on the speci
16800 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20  fied.** file by 
16810 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65  this or any othe
16820 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75  r process. If su
16830 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c  ch a lock is hel
16840 64 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e  d, return.** non
16850 2d 7a 65 72 6f 2c 20 6f 74 68 65 72 77 69 73 65  -zero, otherwise
16860 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63   zero..*/.static
16870 20 69 6e 74 20 77 69 6e 43 68 65 63 6b 52 65 73   int winCheckRes
16880 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65  ervedLock(sqlite
16890 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
168a0 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74  *pResOut){.  int
168b0 20 72 63 3b 0a 20 20 77 69 6e 46 69 6c 65 20 2a   rc;.  winFile *
168c0 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65  pFile = (winFile
168d0 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74  *)id;..  Simulat
168e0 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
168f0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48   SQLITE_IOERR_CH
16900 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b  ECKRESERVEDLOCK;
16910 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22   );.  OSTRACE(("
16920 54 45 53 54 2d 57 52 2d 4c 4f 43 4b 20 66 69 6c  TEST-WR-LOCK fil
16930 65 3d 25 70 2c 20 70 52 65 73 4f 75 74 3d 25 70  e=%p, pResOut=%p
16940 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 70  \n", pFile->h, p
16950 52 65 73 4f 75 74 29 29 3b 0a 0a 20 20 61 73 73  ResOut));..  ass
16960 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20  ert( id!=0 );.  
16970 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  if( pFile->lockt
16980 79 70 65 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ype>=RESERVED_LO
16990 43 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 31  CK ){.    rc = 1
169a0 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  ;.    OSTRACE(("
169b0 54 45 53 54 2d 57 52 2d 4c 4f 43 4b 20 66 69 6c  TEST-WR-LOCK fil
169c0 65 3d 25 70 2c 20 72 63 3d 25 64 20 28 6c 6f 63  e=%p, rc=%d (loc
169d0 61 6c 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  al)\n", pFile->h
169e0 2c 20 72 63 29 29 3b 0a 20 20 7d 65 6c 73 65 7b  , rc));.  }else{
169f0 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 63  .    rc = winLoc
16a00 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c  kFile(&pFile->h,
16a10 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45   SQLITE_LOCKFILE
16a20 45 58 5f 46 4c 41 47 53 2c 52 45 53 45 52 56 45  EX_FLAGS,RESERVE
16a30 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29  D_BYTE, 0, 1, 0)
16a40 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
16a50 20 20 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 46        winUnlockF
16a60 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 52  ile(&pFile->h, R
16a70 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 30 2c  ESERVED_BYTE, 0,
16a80 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20   1, 0);.    }.  
16a90 20 20 72 63 20 3d 20 21 72 63 3b 0a 20 20 20 20    rc = !rc;.    
16aa0 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 2d 57  OSTRACE(("TEST-W
16ab0 52 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20  R-LOCK file=%p, 
16ac0 72 63 3d 25 64 20 28 72 65 6d 6f 74 65 29 5c 6e  rc=%d (remote)\n
16ad0 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 29  ", pFile->h, rc)
16ae0 29 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 4f 75  );.  }.  *pResOu
16af0 74 20 3d 20 72 63 3b 0a 20 20 4f 53 54 52 41 43  t = rc;.  OSTRAC
16b00 45 28 28 22 54 45 53 54 2d 57 52 2d 4c 4f 43 4b  E(("TEST-WR-LOCK
16b10 20 66 69 6c 65 3d 25 70 2c 20 70 52 65 73 4f 75   file=%p, pResOu
16b20 74 3d 25 70 2c 20 2a 70 52 65 73 4f 75 74 3d 25  t=%p, *pResOut=%
16b30 64 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c  d, rc=SQLITE_OK\
16b40 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  n",.           p
16b50 46 69 6c 65 2d 3e 68 2c 20 70 52 65 73 4f 75 74  File->h, pResOut
16b60 2c 20 2a 70 52 65 73 4f 75 74 29 29 3b 0a 20 20  , *pResOut));.  
16b70 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
16b80 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72  ;.}../*.** Lower
16b90 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
16ba0 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72  el on file descr
16bb0 69 70 74 6f 72 20 69 64 20 74 6f 20 6c 6f 63 6b  iptor id to lock
16bc0 74 79 70 65 2e 20 20 6c 6f 63 6b 74 79 70 65 0a  type.  locktype.
16bd0 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65  ** must be eithe
16be0 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41  r NO_LOCK or SHA
16bf0 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20  RED_LOCK..**.** 
16c00 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  If the locking l
16c10 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65  evel of the file
16c20 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61   descriptor is a
16c30 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c  lready at or bel
16c40 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73  ow.** the reques
16c50 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  ted locking leve
16c60 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  l, this routine 
16c70 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
16c80 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  * It is not poss
16c90 69 62 6c 65 20 66 6f 72 20 74 68 69 73 20 72 6f  ible for this ro
16ca0 75 74 69 6e 65 20 74 6f 20 66 61 69 6c 20 69 66  utine to fail if
16cb0 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
16cc0 6d 65 6e 74 0a 2a 2a 20 69 73 20 4e 4f 5f 4c 4f  ment.** is NO_LO
16cd0 43 4b 2e 20 20 49 66 20 74 68 65 20 73 65 63 6f  CK.  If the seco
16ce0 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 53  nd argument is S
16cf0 48 41 52 45 44 5f 4c 4f 43 4b 20 74 68 65 6e 20  HARED_LOCK then 
16d00 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
16d10 6d 69 67 68 74 20 72 65 74 75 72 6e 20 53 51 4c  might return SQL
16d20 49 54 45 5f 49 4f 45 52 52 3b 0a 2a 2f 0a 73 74  ITE_IOERR;.*/.st
16d30 61 74 69 63 20 69 6e 74 20 77 69 6e 55 6e 6c 6f  atic int winUnlo
16d40 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
16d50 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70  *id, int locktyp
16d60 65 29 7b 0a 20 20 69 6e 74 20 74 79 70 65 3b 0a  e){.  int type;.
16d70 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65    winFile *pFile
16d80 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b   = (winFile*)id;
16d90 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
16da0 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28  TE_OK;.  assert(
16db0 20 70 46 69 6c 65 21 3d 30 20 29 3b 0a 20 20 61   pFile!=0 );.  a
16dc0 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 3c  ssert( locktype<
16dd0 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
16de0 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f    OSTRACE(("UNLO
16df0 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6f 6c 64 4c  CK file=%p, oldL
16e00 6f 63 6b 3d 25 64 28 25 64 29 2c 20 6e 65 77 4c  ock=%d(%d), newL
16e10 6f 63 6b 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  ock=%d\n",.     
16e20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20        pFile->h, 
16e30 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c  pFile->locktype,
16e40 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f   pFile->sharedLo
16e50 63 6b 42 79 74 65 2c 20 6c 6f 63 6b 74 79 70 65  ckByte, locktype
16e60 29 29 3b 0a 20 20 74 79 70 65 20 3d 20 70 46 69  ));.  type = pFi
16e70 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20 20  le->locktype;.  
16e80 69 66 28 20 74 79 70 65 3e 3d 45 58 43 4c 55 53  if( type>=EXCLUS
16e90 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  IVE_LOCK ){.    
16ea0 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70  winUnlockFile(&p
16eb0 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f  File->h, SHARED_
16ec0 46 49 52 53 54 2c 20 30 2c 20 53 48 41 52 45 44  FIRST, 0, SHARED
16ed0 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20 20 20 69  _SIZE, 0);.    i
16ee0 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41  f( locktype==SHA
16ef0 52 45 44 5f 4c 4f 43 4b 20 26 26 20 21 77 69 6e  RED_LOCK && !win
16f00 47 65 74 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c  GetReadLock(pFil
16f10 65 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  e) ){.      /* T
16f20 68 69 73 20 73 68 6f 75 6c 64 20 6e 65 76 65 72  his should never
16f30 20 68 61 70 70 65 6e 2e 20 20 57 65 20 73 68 6f   happen.  We sho
16f40 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20 61 62  uld always be ab
16f50 6c 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 72  le to.      ** r
16f60 65 61 63 71 75 69 72 65 20 74 68 65 20 72 65 61  eacquire the rea
16f70 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20  d lock */.      
16f80 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72  rc = winLogError
16f90 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e  (SQLITE_IOERR_UN
16fa0 4c 4f 43 4b 2c 20 6f 73 47 65 74 4c 61 73 74 45  LOCK, osGetLastE
16fb0 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20  rror(),.        
16fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
16fd0 77 69 6e 55 6e 6c 6f 63 6b 22 2c 20 70 46 69 6c  winUnlock", pFil
16fe0 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d  e->zPath);.    }
16ff0 0a 20 20 7d 0a 20 20 69 66 28 20 74 79 70 65 3e  .  }.  if( type>
17000 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29  =RESERVED_LOCK )
17010 7b 0a 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 46  {.    winUnlockF
17020 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 52  ile(&pFile->h, R
17030 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 30 2c  ESERVED_BYTE, 0,
17040 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66   1, 0);.  }.  if
17050 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c  ( locktype==NO_L
17060 4f 43 4b 20 26 26 20 74 79 70 65 3e 3d 53 48 41  OCK && type>=SHA
17070 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
17080 77 69 6e 55 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63  winUnlockReadLoc
17090 6b 28 70 46 69 6c 65 29 3b 0a 20 20 7d 0a 20 20  k(pFile);.  }.  
170a0 69 66 28 20 74 79 70 65 3e 3d 50 45 4e 44 49 4e  if( type>=PENDIN
170b0 47 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 77 69  G_LOCK ){.    wi
170c0 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69  nUnlockFile(&pFi
170d0 6c 65 2d 3e 68 2c 20 50 45 4e 44 49 4e 47 5f 42  le->h, PENDING_B
170e0 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20  YTE, 0, 1, 0);. 
170f0 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b   }.  pFile->lock
17100 74 79 70 65 20 3d 20 28 75 38 29 6c 6f 63 6b 74  type = (u8)lockt
17110 79 70 65 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  ype;.  OSTRACE((
17120 22 55 4e 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c  "UNLOCK file=%p,
17130 20 6c 6f 63 6b 3d 25 64 2c 20 72 63 3d 25 73 5c   lock=%d, rc=%s\
17140 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  n",.           p
17150 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e  File->h, pFile->
17160 6c 6f 63 6b 74 79 70 65 2c 20 73 71 6c 69 74 65  locktype, sqlite
17170 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a  3ErrName(rc)));.
17180 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
17190 2f 2a 0a 2a 2a 20 49 66 20 2a 70 41 72 67 20 69  /*.** If *pArg i
171a0 73 20 69 6e 69 74 69 74 69 61 6c 6c 79 20 6e 65  s inititially ne
171b0 67 61 74 69 76 65 20 74 68 65 6e 20 74 68 69 73  gative then this
171c0 20 69 73 20 61 20 71 75 65 72 79 2e 20 20 53 65   is a query.  Se
171d0 74 20 2a 70 41 72 67 20 74 6f 0a 2a 2a 20 31 20  t *pArg to.** 1 
171e0 6f 72 20 30 20 64 65 70 65 6e 64 69 6e 67 20 6f  or 0 depending o
171f0 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  n whether or not
17200 20 62 69 74 20 6d 61 73 6b 20 6f 66 20 70 46 69   bit mask of pFi
17210 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 69 73  le->ctrlFlags is
17220 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a   set..**.** If *
17230 70 41 72 67 20 69 73 20 30 20 6f 72 20 31 2c 20  pArg is 0 or 1, 
17240 74 68 65 6e 20 63 6c 65 61 72 20 6f 72 20 73 65  then clear or se
17250 74 20 74 68 65 20 6d 61 73 6b 20 62 69 74 20 6f  t the mask bit o
17260 66 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61  f pFile->ctrlFla
17270 67 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  gs..*/.static vo
17280 69 64 20 77 69 6e 4d 6f 64 65 42 69 74 28 77 69  id winModeBit(wi
17290 6e 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 75 6e  nFile *pFile, un
172a0 73 69 67 6e 65 64 20 63 68 61 72 20 6d 61 73 6b  signed char mask
172b0 2c 20 69 6e 74 20 2a 70 41 72 67 29 7b 0a 20 20  , int *pArg){.  
172c0 69 66 28 20 2a 70 41 72 67 3c 30 20 29 7b 0a 20  if( *pArg<0 ){. 
172d0 20 20 20 2a 70 41 72 67 20 3d 20 28 70 46 69 6c     *pArg = (pFil
172e0 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 6d  e->ctrlFlags & m
172f0 61 73 6b 29 21 3d 30 3b 0a 20 20 7d 65 6c 73 65  ask)!=0;.  }else
17300 20 69 66 28 20 28 2a 70 41 72 67 29 3d 3d 30 20   if( (*pArg)==0 
17310 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74  ){.    pFile->ct
17320 72 6c 46 6c 61 67 73 20 26 3d 20 7e 6d 61 73 6b  rlFlags &= ~mask
17330 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
17340 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20  File->ctrlFlags 
17350 7c 3d 20 6d 61 73 6b 3b 0a 20 20 7d 0a 7d 0a 0a  |= mask;.  }.}..
17360 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
17370 65 6e 63 65 73 20 74 6f 20 56 46 53 20 68 65 6c  ences to VFS hel
17380 70 65 72 20 6d 65 74 68 6f 64 73 20 75 73 65 64  per methods used
17390 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66   for temporary f
173a0 69 6c 65 73 20 2a 2f 0a 73 74 61 74 69 63 20 69  iles */.static i
173b0 6e 74 20 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d  nt winGetTempnam
173c0 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 2c  e(sqlite3_vfs *,
173d0 20 63 68 61 72 20 2a 2a 29 3b 0a 73 74 61 74 69   char **);.stati
173e0 63 20 69 6e 74 20 77 69 6e 49 73 44 69 72 28 63  c int winIsDir(c
173f0 6f 6e 73 74 20 76 6f 69 64 20 2a 29 3b 0a 73 74  onst void *);.st
17400 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 49 73 44  atic BOOL winIsD
17410 72 69 76 65 4c 65 74 74 65 72 41 6e 64 43 6f 6c  riveLetterAndCol
17420 6f 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  on(const char *)
17430 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 74 72 6f 6c  ;../*.** Control
17440 20 61 6e 64 20 71 75 65 72 79 20 6f 66 20 74 68   and query of th
17450 65 20 6f 70 65 6e 20 66 69 6c 65 20 68 61 6e 64  e open file hand
17460 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
17470 74 20 77 69 6e 46 69 6c 65 43 6f 6e 74 72 6f 6c  t winFileControl
17480 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
17490 64 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20  d, int op, void 
174a0 2a 70 41 72 67 29 7b 0a 20 20 77 69 6e 46 69 6c  *pArg){.  winFil
174b0 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46  e *pFile = (winF
174c0 69 6c 65 2a 29 69 64 3b 0a 20 20 4f 53 54 52 41  ile*)id;.  OSTRA
174d0 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d  CE(("FCNTL file=
174e0 25 70 2c 20 6f 70 3d 25 64 2c 20 70 41 72 67 3d  %p, op=%d, pArg=
174f0 25 70 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %p\n", pFile->h,
17500 20 6f 70 2c 20 70 41 72 67 29 29 3b 0a 20 20 73   op, pArg));.  s
17510 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20  witch( op ){.   
17520 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
17530 54 4c 5f 4c 4f 43 4b 53 54 41 54 45 3a 20 7b 0a  TL_LOCKSTATE: {.
17540 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72        *(int*)pAr
17550 67 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  g = pFile->lockt
17560 79 70 65 3b 0a 20 20 20 20 20 20 4f 53 54 52 41  ype;.      OSTRA
17570 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d  CE(("FCNTL file=
17580 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b  %p, rc=SQLITE_OK
17590 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  \n", pFile->h));
175a0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
175b0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
175c0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4c     case SQLITE_L
175d0 41 53 54 5f 45 52 52 4e 4f 3a 20 7b 0a 20 20 20  AST_ERRNO: {.   
175e0 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d     *(int*)pArg =
175f0 20 28 69 6e 74 29 70 46 69 6c 65 2d 3e 6c 61 73   (int)pFile->las
17600 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 4f 53  tErrno;.      OS
17610 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69  TRACE(("FCNTL fi
17620 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
17630 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  _OK\n", pFile->h
17640 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
17650 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
17660 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
17670 45 5f 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49  E_FCNTL_CHUNK_SI
17680 5a 45 3a 20 7b 0a 20 20 20 20 20 20 70 46 69 6c  ZE: {.      pFil
17690 65 2d 3e 73 7a 43 68 75 6e 6b 20 3d 20 2a 28 69  e->szChunk = *(i
176a0 6e 74 20 2a 29 70 41 72 67 3b 0a 20 20 20 20 20  nt *)pArg;.     
176b0 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c   OSTRACE(("FCNTL
176c0 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c   file=%p, rc=SQL
176d0 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65  ITE_OK\n", pFile
176e0 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74  ->h));.      ret
176f0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
17700 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
17710 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f  LITE_FCNTL_SIZE_
17720 48 49 4e 54 3a 20 7b 0a 20 20 20 20 20 20 69 66  HINT: {.      if
17730 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b  ( pFile->szChunk
17740 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  >0 ){.        sq
17750 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 6c 64 53  lite3_int64 oldS
17760 7a 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  z;.        int r
17770 63 20 3d 20 77 69 6e 46 69 6c 65 53 69 7a 65 28  c = winFileSize(
17780 69 64 2c 20 26 6f 6c 64 53 7a 29 3b 0a 20 20 20  id, &oldSz);.   
17790 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
177a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
177b0 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
177c0 34 20 6e 65 77 53 7a 20 3d 20 2a 28 73 71 6c 69  4 newSz = *(sqli
177d0 74 65 33 5f 69 6e 74 36 34 2a 29 70 41 72 67 3b  te3_int64*)pArg;
177e0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e  .          if( n
177f0 65 77 53 7a 3e 6f 6c 64 53 7a 20 29 7b 0a 20 20  ewSz>oldSz ){.  
17800 20 20 20 20 20 20 20 20 20 20 53 69 6d 75 6c 61            Simula
17810 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28  teIOErrorBenign(
17820 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  1);.            
17830 72 63 20 3d 20 77 69 6e 54 72 75 6e 63 61 74 65  rc = winTruncate
17840 28 69 64 2c 20 6e 65 77 53 7a 29 3b 0a 20 20 20  (id, newSz);.   
17850 20 20 20 20 20 20 20 20 20 53 69 6d 75 6c 61 74           Simulat
17860 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30  eIOErrorBenign(0
17870 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
17880 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
17890 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c   OSTRACE(("FCNTL
178a0 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c   file=%p, rc=%s\
178b0 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 73 71  n", pFile->h, sq
178c0 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29  lite3ErrName(rc)
178d0 29 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ));.        retu
178e0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
178f0 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46       OSTRACE(("F
17900 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63  CNTL file=%p, rc
17910 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70  =SQLITE_OK\n", p
17920 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20  File->h));.     
17930 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
17940 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
17950 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50  e SQLITE_FCNTL_P
17960 45 52 53 49 53 54 5f 57 41 4c 3a 20 7b 0a 20 20  ERSIST_WAL: {.  
17970 20 20 20 20 77 69 6e 4d 6f 64 65 42 69 74 28 70      winModeBit(p
17980 46 69 6c 65 2c 20 57 49 4e 46 49 4c 45 5f 50 45  File, WINFILE_PE
17990 52 53 49 53 54 5f 57 41 4c 2c 20 28 69 6e 74 2a  RSIST_WAL, (int*
179a0 29 70 41 72 67 29 3b 0a 20 20 20 20 20 20 4f 53  )pArg);.      OS
179b0 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69  TRACE(("FCNTL fi
179c0 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
179d0 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  _OK\n", pFile->h
179e0 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
179f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
17a00 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
17a10 45 5f 46 43 4e 54 4c 5f 50 4f 57 45 52 53 41 46  E_FCNTL_POWERSAF
17a20 45 5f 4f 56 45 52 57 52 49 54 45 3a 20 7b 0a 20  E_OVERWRITE: {. 
17a30 20 20 20 20 20 77 69 6e 4d 6f 64 65 42 69 74 28       winModeBit(
17a40 70 46 69 6c 65 2c 20 57 49 4e 46 49 4c 45 5f 50  pFile, WINFILE_P
17a50 53 4f 57 2c 20 28 69 6e 74 2a 29 70 41 72 67 29  SOW, (int*)pArg)
17a60 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  ;.      OSTRACE(
17a70 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c  ("FCNTL file=%p,
17a80 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22   rc=SQLITE_OK\n"
17a90 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
17aa0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
17ab0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
17ac0 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
17ad0 4c 5f 56 46 53 4e 41 4d 45 3a 20 7b 0a 20 20 20  L_VFSNAME: {.   
17ae0 20 20 20 2a 28 63 68 61 72 2a 2a 29 70 41 72 67     *(char**)pArg
17af0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
17b00 74 66 28 22 77 69 6e 33 32 22 29 3b 0a 20 20 20  tf("win32");.   
17b10 20 20 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e     OSTRACE(("FCN
17b20 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53  TL file=%p, rc=S
17b30 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69  QLITE_OK\n", pFi
17b40 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72  le->h));.      r
17b50 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
17b60 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
17b70 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 57 49 4e  SQLITE_FCNTL_WIN
17b80 33 32 5f 41 56 5f 52 45 54 52 59 3a 20 7b 0a 20  32_AV_RETRY: {. 
17b90 20 20 20 20 20 69 6e 74 20 2a 61 20 3d 20 28 69       int *a = (i
17ba0 6e 74 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20  nt*)pArg;.      
17bb0 69 66 28 20 61 5b 30 5d 3e 30 20 29 7b 0a 20 20  if( a[0]>0 ){.  
17bc0 20 20 20 20 20 20 77 69 6e 49 6f 65 72 72 52 65        winIoerrRe
17bd0 74 72 79 20 3d 20 61 5b 30 5d 3b 0a 20 20 20 20  try = a[0];.    
17be0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
17bf0 20 61 5b 30 5d 20 3d 20 77 69 6e 49 6f 65 72 72   a[0] = winIoerr
17c00 52 65 74 72 79 3b 0a 20 20 20 20 20 20 7d 0a 20  Retry;.      }. 
17c10 20 20 20 20 20 69 66 28 20 61 5b 31 5d 3e 30 20       if( a[1]>0 
17c20 29 7b 0a 20 20 20 20 20 20 20 20 77 69 6e 49 6f  ){.        winIo
17c30 65 72 72 52 65 74 72 79 44 65 6c 61 79 20 3d 20  errRetryDelay = 
17c40 61 5b 31 5d 3b 0a 20 20 20 20 20 20 7d 65 6c 73  a[1];.      }els
17c50 65 7b 0a 20 20 20 20 20 20 20 20 61 5b 31 5d 20  e{.        a[1] 
17c60 3d 20 77 69 6e 49 6f 65 72 72 52 65 74 72 79 44  = winIoerrRetryD
17c70 65 6c 61 79 3b 0a 20 20 20 20 20 20 7d 0a 20 20  elay;.      }.  
17c80 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46 43      OSTRACE(("FC
17c90 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  NTL file=%p, rc=
17ca0 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46  SQLITE_OK\n", pF
17cb0 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20  ile->h));.      
17cc0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
17cd0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
17ce0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 54 45   SQLITE_FCNTL_TE
17cf0 4d 50 46 49 4c 45 4e 41 4d 45 3a 20 7b 0a 20 20  MPFILENAME: {.  
17d00 20 20 20 20 63 68 61 72 20 2a 7a 54 46 69 6c 65      char *zTFile
17d10 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20   = 0;.      int 
17d20 72 63 20 3d 20 77 69 6e 47 65 74 54 65 6d 70 6e  rc = winGetTempn
17d30 61 6d 65 28 70 46 69 6c 65 2d 3e 70 56 66 73 2c  ame(pFile->pVfs,
17d40 20 26 7a 54 46 69 6c 65 29 3b 0a 20 20 20 20 20   &zTFile);.     
17d50 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
17d60 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 28  OK ){.        *(
17d70 63 68 61 72 2a 2a 29 70 41 72 67 20 3d 20 7a 54  char**)pArg = zT
17d80 46 69 6c 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  File;.      }.  
17d90 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46 43      OSTRACE(("FC
17da0 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  NTL file=%p, rc=
17db0 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %s\n", pFile->h,
17dc0 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28   sqlite3ErrName(
17dd0 72 63 29 29 29 3b 0a 20 20 20 20 20 20 72 65 74  rc)));.      ret
17de0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 23 69  urn rc;.    }.#i
17df0 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
17e00 50 5f 53 49 5a 45 3e 30 0a 20 20 20 20 63 61 73  P_SIZE>0.    cas
17e10 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d  e SQLITE_FCNTL_M
17e20 4d 41 50 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20  MAP_SIZE: {.    
17e30 20 20 69 36 34 20 6e 65 77 4c 69 6d 69 74 20 3d    i64 newLimit =
17e40 20 2a 28 69 36 34 2a 29 70 41 72 67 3b 0a 20 20   *(i64*)pArg;.  
17e50 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c      int rc = SQL
17e60 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69 66  ITE_OK;.      if
17e70 28 20 6e 65 77 4c 69 6d 69 74 3e 73 71 6c 69 74  ( newLimit>sqlit
17e80 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
17e90 78 4d 6d 61 70 20 29 7b 0a 20 20 20 20 20 20 20  xMmap ){.       
17ea0 20 6e 65 77 4c 69 6d 69 74 20 3d 20 73 71 6c 69   newLimit = sqli
17eb0 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
17ec0 6d 78 4d 6d 61 70 3b 0a 20 20 20 20 20 20 7d 0a  mxMmap;.      }.
17ed0 20 20 20 20 20 20 2a 28 69 36 34 2a 29 70 41 72        *(i64*)pAr
17ee0 67 20 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53  g = pFile->mmapS
17ef0 69 7a 65 4d 61 78 3b 0a 20 20 20 20 20 20 69 66  izeMax;.      if
17f00 28 20 6e 65 77 4c 69 6d 69 74 3e 3d 30 20 26 26  ( newLimit>=0 &&
17f10 20 6e 65 77 4c 69 6d 69 74 21 3d 70 46 69 6c 65   newLimit!=pFile
17f20 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 26 26  ->mmapSizeMax &&
17f30 20 70 46 69 6c 65 2d 3e 6e 46 65 74 63 68 4f 75   pFile->nFetchOu
17f40 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
17f50 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d  pFile->mmapSizeM
17f60 61 78 20 3d 20 6e 65 77 4c 69 6d 69 74 3b 0a 20  ax = newLimit;. 
17f70 20 20 20 20 20 20 20 69 66 28 20 70 46 69 6c 65         if( pFile
17f80 2d 3e 6d 6d 61 70 53 69 7a 65 3e 30 20 29 7b 0a  ->mmapSize>0 ){.
17f90 20 20 20 20 20 20 20 20 20 20 77 69 6e 55 6e 6d            winUnm
17fa0 61 70 66 69 6c 65 28 70 46 69 6c 65 29 3b 0a 20  apfile(pFile);. 
17fb0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 69           rc = wi
17fc0 6e 4d 61 70 66 69 6c 65 28 70 46 69 6c 65 2c 20  nMapfile(pFile, 
17fd0 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  -1);.        }. 
17fe0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 4f 53 54       }.      OST
17ff0 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c  RACE(("FCNTL fil
18000 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 20  e=%p, rc=%s\n", 
18010 70 46 69 6c 65 2d 3e 68 2c 20 73 71 6c 69 74 65  pFile->h, sqlite
18020 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a  3ErrName(rc)));.
18030 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
18040 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
18050 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 46 43  }.  OSTRACE(("FC
18060 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  NTL file=%p, rc=
18070 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 5c  SQLITE_NOTFOUND\
18080 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  n", pFile->h));.
18090 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
180a0 4e 4f 54 46 4f 55 4e 44 3b 0a 7d 0a 0a 2f 2a 0a  NOTFOUND;.}../*.
180b0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 65  ** Return the se
180c0 63 74 6f 72 20 73 69 7a 65 20 69 6e 20 62 79 74  ctor size in byt
180d0 65 73 20 6f 66 20 74 68 65 20 75 6e 64 65 72 6c  es of the underl
180e0 79 69 6e 67 20 62 6c 6f 63 6b 20 64 65 76 69 63  ying block devic
180f0 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73 70 65  e for.** the spe
18100 63 69 66 69 65 64 20 66 69 6c 65 2e 20 54 68 69  cified file. Thi
18110 73 20 69 73 20 61 6c 6d 6f 73 74 20 61 6c 77 61  s is almost alwa
18120 79 73 20 35 31 32 20 62 79 74 65 73 2c 20 62 75  ys 512 bytes, bu
18130 74 20 6d 61 79 20 62 65 0a 2a 2a 20 6c 61 72 67  t may be.** larg
18140 65 72 20 66 6f 72 20 73 6f 6d 65 20 64 65 76 69  er for some devi
18150 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74  ces..**.** SQLit
18160 65 20 63 6f 64 65 20 61 73 73 75 6d 65 73 20 74  e code assumes t
18170 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e  his function can
18180 6e 6f 74 20 66 61 69 6c 2e 20 49 74 20 61 6c 73  not fail. It als
18190 6f 20 61 73 73 75 6d 65 73 20 74 68 61 74 0a 2a  o assumes that.*
181a0 2a 20 69 66 20 74 77 6f 20 66 69 6c 65 73 20 61  * if two files a
181b0 72 65 20 63 72 65 61 74 65 64 20 69 6e 20 74 68  re created in th
181c0 65 20 73 61 6d 65 20 66 69 6c 65 2d 73 79 73 74  e same file-syst
181d0 65 6d 20 64 69 72 65 63 74 6f 72 79 20 28 69 2e  em directory (i.
181e0 65 2e 0a 2a 2a 20 61 20 64 61 74 61 62 61 73 65  e..** a database
181f0 20 61 6e 64 20 69 74 73 20 6a 6f 75 72 6e 61 6c   and its journal
18200 20 66 69 6c 65 29 20 74 68 61 74 20 74 68 65 20   file) that the 
18210 73 65 63 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c  sector size will
18220 20 62 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20   be the.** same 
18230 66 6f 72 20 62 6f 74 68 2e 0a 2a 2f 0a 73 74 61  for both..*/.sta
18240 74 69 63 20 69 6e 74 20 77 69 6e 53 65 63 74 6f  tic int winSecto
18250 72 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69  rSize(sqlite3_fi
18260 6c 65 20 2a 69 64 29 7b 0a 20 20 28 76 6f 69 64  le *id){.  (void
18270 29 69 64 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  )id;.  return SQ
18280 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 45 43  LITE_DEFAULT_SEC
18290 54 4f 52 5f 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a  TOR_SIZE;.}../*.
182a0 2a 2a 20 52 65 74 75 72 6e 20 61 20 76 65 63 74  ** Return a vect
182b0 6f 72 20 6f 66 20 64 65 76 69 63 65 20 63 68 61  or of device cha
182c0 72 61 63 74 65 72 69 73 74 69 63 73 2e 0a 2a 2f  racteristics..*/
182d0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 44  .static int winD
182e0 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
182f0 74 69 63 73 28 73 71 6c 69 74 65 33 5f 66 69 6c  tics(sqlite3_fil
18300 65 20 2a 69 64 29 7b 0a 20 20 77 69 6e 46 69 6c  e *id){.  winFil
18310 65 20 2a 70 20 3d 20 28 77 69 6e 46 69 6c 65 2a  e *p = (winFile*
18320 29 69 64 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  )id;.  return SQ
18330 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44 45 4c  LITE_IOCAP_UNDEL
18340 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e  ETABLE_WHEN_OPEN
18350 20 7c 0a 20 20 20 20 20 20 20 20 20 28 28 70 2d   |.         ((p-
18360 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 57 49 4e  >ctrlFlags & WIN
18370 46 49 4c 45 5f 50 53 4f 57 29 3f 53 51 4c 49 54  FILE_PSOW)?SQLIT
18380 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53 41 46  E_IOCAP_POWERSAF
18390 45 5f 4f 56 45 52 57 52 49 54 45 3a 30 29 3b 0a  E_OVERWRITE:0);.
183a0 7d 0a 0a 2f 2a 20 0a 2a 2a 20 57 69 6e 64 6f 77  }../* .** Window
183b0 73 20 77 69 6c 6c 20 6f 6e 6c 79 20 6c 65 74 20  s will only let 
183c0 79 6f 75 20 63 72 65 61 74 65 20 66 69 6c 65 20  you create file 
183d0 76 69 65 77 20 6d 61 70 70 69 6e 67 73 0a 2a 2a  view mappings.**
183e0 20 6f 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73   on allocation s
183f0 69 7a 65 20 67 72 61 6e 75 6c 61 72 69 74 79 20  ize granularity 
18400 62 6f 75 6e 64 61 72 69 65 73 2e 0a 2a 2a 20 44  boundaries..** D
18410 75 72 69 6e 67 20 73 71 6c 69 74 65 33 5f 6f 73  uring sqlite3_os
18420 5f 69 6e 69 74 28 29 20 77 65 20 64 6f 20 61 20  _init() we do a 
18430 47 65 74 53 79 73 74 65 6d 49 6e 66 6f 28 29 0a  GetSystemInfo().
18440 2a 2a 20 74 6f 20 67 65 74 20 74 68 65 20 67 72  ** to get the gr
18450 61 6e 75 6c 61 72 69 74 79 20 73 69 7a 65 2e 0a  anularity size..
18460 2a 2f 0a 53 59 53 54 45 4d 5f 49 4e 46 4f 20 77  */.SYSTEM_INFO w
18470 69 6e 53 79 73 49 6e 66 6f 3b 0a 0a 23 69 66 6e  inSysInfo;..#ifn
18480 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
18490 57 41 4c 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65  WAL../*.** Helpe
184a0 72 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 6f  r functions to o
184b0 62 74 61 69 6e 20 61 6e 64 20 72 65 6c 69 6e 71  btain and relinq
184c0 75 69 73 68 20 74 68 65 20 67 6c 6f 62 61 6c 20  uish the global 
184d0 6d 75 74 65 78 2e 20 54 68 65 0a 2a 2a 20 67 6c  mutex. The.** gl
184e0 6f 62 61 6c 20 6d 75 74 65 78 20 69 73 20 75 73  obal mutex is us
184f0 65 64 20 74 6f 20 70 72 6f 74 65 63 74 20 74 68  ed to protect th
18500 65 20 77 69 6e 4c 6f 63 6b 49 6e 66 6f 20 6f 62  e winLockInfo ob
18510 6a 65 63 74 73 20 75 73 65 64 20 62 79 20 0a 2a  jects used by .*
18520 2a 20 74 68 69 73 20 66 69 6c 65 2c 20 61 6c 6c  * this file, all
18530 20 6f 66 20 77 68 69 63 68 20 6d 61 79 20 62 65   of which may be
18540 20 73 68 61 72 65 64 20 62 79 20 6d 75 6c 74 69   shared by multi
18550 70 6c 65 20 74 68 72 65 61 64 73 2e 0a 2a 2a 0a  ple threads..**.
18560 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 77 69 6e 53  ** Function winS
18570 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 69 73  hmMutexHeld() is
18580 20 75 73 65 64 20 74 6f 20 61 73 73 65 72 74 28   used to assert(
18590 29 20 74 68 61 74 20 74 68 65 20 67 6c 6f 62 61  ) that the globa
185a0 6c 20 6d 75 74 65 78 20 0a 2a 2a 20 69 73 20 68  l mutex .** is h
185b0 65 6c 64 20 77 68 65 6e 20 72 65 71 75 69 72 65  eld when require
185c0 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  d. This function
185d0 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 61 73   is only used as
185e0 20 70 61 72 74 20 6f 66 20 61 73 73 65 72 74 28   part of assert(
185f0 29 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73  ) .** statements
18600 2e 20 65 2e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 77  . e.g..**.**   w
18610 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28  inShmEnterMutex(
18620 29 0a 2a 2a 20 20 20 20 20 61 73 73 65 72 74 28  ).**     assert(
18630 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64   winShmMutexHeld
18640 28 29 20 29 3b 0a 2a 2a 20 20 20 77 69 6e 53 68  () );.**   winSh
18650 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 0a 2a 2f  mLeaveMutex().*/
18660 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e  .static void win
18670 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 76 6f  ShmEnterMutex(vo
18680 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  id){.  sqlite3_m
18690 75 74 65 78 5f 65 6e 74 65 72 28 73 71 6c 69 74  utex_enter(sqlit
186a0 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
186b0 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
186c0 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 73 74 61  _MASTER));.}.sta
186d0 74 69 63 20 76 6f 69 64 20 77 69 6e 53 68 6d 4c  tic void winShmL
186e0 65 61 76 65 4d 75 74 65 78 28 76 6f 69 64 29 7b  eaveMutex(void){
186f0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
18700 5f 6c 65 61 76 65 28 73 71 6c 69 74 65 33 4d 75  _leave(sqlite3Mu
18710 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
18720 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53  MUTEX_STATIC_MAS
18730 54 45 52 29 29 3b 0a 7d 0a 23 69 66 64 65 66 20  TER));.}.#ifdef 
18740 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 73 74 61  SQLITE_DEBUG.sta
18750 74 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 4d 75  tic int winShmMu
18760 74 65 78 48 65 6c 64 28 76 6f 69 64 29 20 7b 0a  texHeld(void) {.
18770 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
18780 5f 6d 75 74 65 78 5f 68 65 6c 64 28 73 71 6c 69  _mutex_held(sqli
18790 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
187a0 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
187b0 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 23 65  C_MASTER));.}.#e
187c0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65  ndif../*.** Obje
187d0 63 74 20 75 73 65 64 20 74 6f 20 72 65 70 72 65  ct used to repre
187e0 73 65 6e 74 20 61 20 73 69 6e 67 6c 65 20 66 69  sent a single fi
187f0 6c 65 20 6f 70 65 6e 65 64 20 61 6e 64 20 6d 6d  le opened and mm
18800 61 70 70 65 64 20 74 6f 20 70 72 6f 76 69 64 65  apped to provide
18810 0a 2a 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  .** shared memor
18820 79 2e 20 20 57 68 65 6e 20 6d 75 6c 74 69 70 6c  y.  When multipl
18830 65 20 74 68 72 65 61 64 73 20 61 6c 6c 20 72 65  e threads all re
18840 66 65 72 65 6e 63 65 20 74 68 65 20 73 61 6d 65  ference the same
18850 0a 2a 2a 20 6c 6f 67 2d 73 75 6d 6d 61 72 79 2c  .** log-summary,
18860 20 65 61 63 68 20 74 68 72 65 61 64 20 68 61 73   each thread has
18870 20 69 74 73 20 6f 77 6e 20 77 69 6e 46 69 6c 65   its own winFile
18880 20 6f 62 6a 65 63 74 2c 20 62 75 74 20 74 68 65   object, but the
18890 79 20 61 6c 6c 0a 2a 2a 20 70 6f 69 6e 74 20 74  y all.** point t
188a0 6f 20 61 20 73 69 6e 67 6c 65 20 69 6e 73 74 61  o a single insta
188b0 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62 6a 65  nce of this obje
188c0 63 74 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  ct.  In other wo
188d0 72 64 73 2c 20 65 61 63 68 0a 2a 2a 20 6c 6f 67  rds, each.** log
188e0 2d 73 75 6d 6d 61 72 79 20 69 73 20 6f 70 65 6e  -summary is open
188f0 65 64 20 6f 6e 6c 79 20 6f 6e 63 65 20 70 65 72  ed only once per
18900 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   process..**.** 
18910 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28  winShmMutexHeld(
18920 29 20 6d 75 73 74 20 62 65 20 74 72 75 65 20 77  ) must be true w
18930 68 65 6e 20 63 72 65 61 74 69 6e 67 20 6f 72 20  hen creating or 
18940 64 65 73 74 72 6f 79 69 6e 67 0a 2a 2a 20 74 68  destroying.** th
18950 69 73 20 6f 62 6a 65 63 74 20 6f 72 20 77 68 69  is object or whi
18960 6c 65 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72  le reading or wr
18970 69 74 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77  iting the follow
18980 69 6e 67 20 66 69 65 6c 64 73 3a 0a 2a 2a 0a 2a  ing fields:.**.*
18990 2a 20 20 20 20 20 20 6e 52 65 66 0a 2a 2a 20 20  *      nRef.**  
189a0 20 20 20 20 70 4e 65 78 74 20 0a 2a 2a 0a 2a 2a      pNext .**.**
189b0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   The following f
189c0 69 65 6c 64 73 20 61 72 65 20 72 65 61 64 2d 6f  ields are read-o
189d0 6e 6c 79 20 61 66 74 65 72 20 74 68 65 20 6f 62  nly after the ob
189e0 6a 65 63 74 20 69 73 20 63 72 65 61 74 65 64 3a  ject is created:
189f0 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20 20 66 69 64  .** .**      fid
18a00 0a 2a 2a 20 20 20 20 20 20 7a 46 69 6c 65 6e 61  .**      zFilena
18a10 6d 65 0a 2a 2a 0a 2a 2a 20 45 69 74 68 65 72 20  me.**.** Either 
18a20 77 69 6e 53 68 6d 4e 6f 64 65 2e 6d 75 74 65 78  winShmNode.mutex
18a30 20 6d 75 73 74 20 62 65 20 68 65 6c 64 20 6f 72   must be held or
18a40 20 77 69 6e 53 68 6d 4e 6f 64 65 2e 6e 52 65 66   winShmNode.nRef
18a50 3d 3d 30 20 61 6e 64 0a 2a 2a 20 77 69 6e 53 68  ==0 and.** winSh
18a60 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 69 73 20  mMutexHeld() is 
18a70 74 72 75 65 20 77 68 65 6e 20 72 65 61 64 69 6e  true when readin
18a80 67 20 6f 72 20 77 72 69 74 69 6e 67 20 61 6e 79  g or writing any
18a90 20 6f 74 68 65 72 20 66 69 65 6c 64 0a 2a 2a 20   other field.** 
18aa0 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72  in this structur
18ab0 65 2e 0a 2a 2a 0a 2a 2f 0a 73 74 72 75 63 74 20  e..**.*/.struct 
18ac0 77 69 6e 53 68 6d 4e 6f 64 65 20 7b 0a 20 20 73  winShmNode {.  s
18ad0 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75  qlite3_mutex *mu
18ae0 74 65 78 3b 20 20 20 20 20 20 2f 2a 20 4d 75 74  tex;      /* Mut
18af0 65 78 20 74 6f 20 61 63 63 65 73 73 20 74 68 69  ex to access thi
18b00 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 68  s object */.  ch
18b10 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20  ar *zFilename;  
18b20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
18b30 20 6f 66 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a   of the file */.
18b40 20 20 77 69 6e 46 69 6c 65 20 68 46 69 6c 65 3b    winFile hFile;
18b50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18b60 46 69 6c 65 20 68 61 6e 64 6c 65 20 66 72 6f 6d  File handle from
18b70 20 77 69 6e 4f 70 65 6e 20 2a 2f 0a 0a 20 20 69   winOpen */..  i
18b80 6e 74 20 73 7a 52 65 67 69 6f 6e 3b 20 20 20 20  nt szRegion;    
18b90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
18ba0 65 20 6f 66 20 73 68 61 72 65 64 2d 6d 65 6d 6f  e of shared-memo
18bb0 72 79 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20  ry regions */.  
18bc0 69 6e 74 20 6e 52 65 67 69 6f 6e 3b 20 20 20 20  int nRegion;    
18bd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
18be0 7a 65 20 6f 66 20 61 72 72 61 79 20 61 70 52 65  ze of array apRe
18bf0 67 69 6f 6e 20 2a 2f 0a 20 20 73 74 72 75 63 74  gion */.  struct
18c00 20 53 68 6d 52 65 67 69 6f 6e 20 7b 0a 20 20 20   ShmRegion {.   
18c10 20 48 41 4e 44 4c 45 20 68 4d 61 70 3b 20 20 20   HANDLE hMap;   
18c20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
18c30 65 20 68 61 6e 64 6c 65 20 66 72 6f 6d 20 43 72  e handle from Cr
18c40 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 20  eateFileMapping 
18c50 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 4d 61  */.    void *pMa
18c60 70 3b 0a 20 20 7d 20 2a 61 52 65 67 69 6f 6e 3b  p;.  } *aRegion;
18c70 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72  .  DWORD lastErr
18c80 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  no;           /*
18c90 20 54 68 65 20 57 69 6e 64 6f 77 73 20 65 72 72   The Windows err
18ca0 6e 6f 20 66 72 6f 6d 20 74 68 65 20 6c 61 73 74  no from the last
18cb0 20 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a 0a 20   I/O error */.. 
18cc0 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20   int nRef;      
18cd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
18ce0 75 6d 62 65 72 20 6f 66 20 77 69 6e 53 68 6d 20  umber of winShm 
18cf0 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e 67  objects pointing
18d00 20 74 6f 20 74 68 69 73 20 2a 2f 0a 20 20 77 69   to this */.  wi
18d10 6e 53 68 6d 20 2a 70 46 69 72 73 74 3b 20 20 20  nShm *pFirst;   
18d20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20           /* All 
18d30 77 69 6e 53 68 6d 20 6f 62 6a 65 63 74 73 20 70  winShm objects p
18d40 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 69 73 20  ointing to this 
18d50 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20  */.  winShmNode 
18d60 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20  *pNext;         
18d70 2f 2a 20 4e 65 78 74 20 69 6e 20 6c 69 73 74 20  /* Next in list 
18d80 6f 66 20 61 6c 6c 20 77 69 6e 53 68 6d 4e 6f 64  of all winShmNod
18d90 65 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 23 69 66  e objects */.#if
18da0 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
18db0 0a 20 20 75 38 20 6e 65 78 74 53 68 6d 49 64 3b  .  u8 nextShmId;
18dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18dd0 20 4e 65 78 74 20 61 76 61 69 6c 61 62 6c 65 20   Next available 
18de0 77 69 6e 53 68 6d 2e 69 64 20 76 61 6c 75 65 20  winShm.id value 
18df0 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a  */.#endif.};../*
18e00 0a 2a 2a 20 41 20 67 6c 6f 62 61 6c 20 61 72 72  .** A global arr
18e10 61 79 20 6f 66 20 61 6c 6c 20 77 69 6e 53 68 6d  ay of all winShm
18e20 4e 6f 64 65 20 6f 62 6a 65 63 74 73 2e 0a 2a 2a  Node objects..**
18e30 0a 2a 2a 20 54 68 65 20 77 69 6e 53 68 6d 4d 75  .** The winShmMu
18e40 74 65 78 48 65 6c 64 28 29 20 6d 75 73 74 20 62  texHeld() must b
18e50 65 20 74 72 75 65 20 77 68 69 6c 65 20 72 65 61  e true while rea
18e60 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20  ding or writing 
18e70 74 68 69 73 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74  this list..*/.st
18e80 61 74 69 63 20 77 69 6e 53 68 6d 4e 6f 64 65 20  atic winShmNode 
18e90 2a 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 20  *winShmNodeList 
18ea0 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 53 74 72 75  = 0;../*.** Stru
18eb0 63 74 75 72 65 20 75 73 65 64 20 69 6e 74 65 72  cture used inter
18ec0 6e 61 6c 6c 79 20 62 79 20 74 68 69 73 20 56 46  nally by this VF
18ed0 53 20 74 6f 20 72 65 63 6f 72 64 20 74 68 65 20  S to record the 
18ee0 73 74 61 74 65 20 6f 66 20 61 6e 0a 2a 2a 20 6f  state of an.** o
18ef0 70 65 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  pen shared memor
18f00 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a  y connection..**
18f10 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
18f20 67 20 66 69 65 6c 64 73 20 61 72 65 20 69 6e 69  g fields are ini
18f30 74 69 61 6c 69 7a 65 64 20 77 68 65 6e 20 74 68  tialized when th
18f40 69 73 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65  is object is cre
18f50 61 74 65 64 20 61 6e 64 0a 2a 2a 20 61 72 65 20  ated and.** are 
18f60 72 65 61 64 2d 6f 6e 6c 79 20 74 68 65 72 65 61  read-only therea
18f70 66 74 65 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 77  fter:.**.**    w
18f80 69 6e 53 68 6d 2e 70 53 68 6d 4e 6f 64 65 0a 2a  inShm.pShmNode.*
18f90 2a 20 20 20 20 77 69 6e 53 68 6d 2e 69 64 0a 2a  *    winShm.id.*
18fa0 2a 0a 2a 2a 20 41 6c 6c 20 6f 74 68 65 72 20 66  *.** All other f
18fb0 69 65 6c 64 73 20 61 72 65 20 72 65 61 64 2f 77  ields are read/w
18fc0 72 69 74 65 2e 20 20 54 68 65 20 77 69 6e 53 68  rite.  The winSh
18fd0 6d 2e 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  m.pShmNode->mute
18fe0 78 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 2a  x must be held.*
18ff0 2a 20 77 68 69 6c 65 20 61 63 63 65 73 73 69 6e  * while accessin
19000 67 20 61 6e 79 20 72 65 61 64 2f 77 72 69 74 65  g any read/write
19010 20 66 69 65 6c 64 73 2e 0a 2a 2f 0a 73 74 72 75   fields..*/.stru
19020 63 74 20 77 69 6e 53 68 6d 20 7b 0a 20 20 77 69  ct winShm {.  wi
19030 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f  nShmNode *pShmNo
19040 64 65 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20  de;      /* The 
19050 75 6e 64 65 72 6c 79 69 6e 67 20 77 69 6e 53 68  underlying winSh
19060 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 2a 2f 0a  mNode object */.
19070 20 20 77 69 6e 53 68 6d 20 2a 70 4e 65 78 74 3b    winShm *pNext;
19080 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19090 4e 65 78 74 20 77 69 6e 53 68 6d 20 77 69 74 68  Next winShm with
190a0 20 74 68 65 20 73 61 6d 65 20 77 69 6e 53 68 6d   the same winShm
190b0 4e 6f 64 65 20 2a 2f 0a 20 20 75 38 20 68 61 73  Node */.  u8 has
190c0 4d 75 74 65 78 3b 20 20 20 20 20 20 20 20 20 20  Mutex;          
190d0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
190e0 68 6f 6c 64 69 6e 67 20 74 68 65 20 77 69 6e 53  holding the winS
190f0 68 6d 4e 6f 64 65 20 6d 75 74 65 78 20 2a 2f 0a  hmNode mutex */.
19100 20 20 75 31 36 20 73 68 61 72 65 64 4d 61 73 6b    u16 sharedMask
19110 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
19120 4d 61 73 6b 20 6f 66 20 73 68 61 72 65 64 20 6c  Mask of shared l
19130 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75  ocks held */.  u
19140 31 36 20 65 78 63 6c 4d 61 73 6b 3b 20 20 20 20  16 exclMask;    
19150 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
19160 6b 20 6f 66 20 65 78 63 6c 75 73 69 76 65 20 6c  k of exclusive l
19170 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 23 69 66  ocks held */.#if
19180 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
19190 0a 20 20 75 38 20 69 64 3b 20 20 20 20 20 20 20  .  u8 id;       
191a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
191b0 20 49 64 20 6f 66 20 74 68 69 73 20 63 6f 6e 6e   Id of this conn
191c0 65 63 74 69 6f 6e 20 77 69 74 68 20 69 74 73 20  ection with its 
191d0 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 23 65  winShmNode */.#e
191e0 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43  ndif.};../*.** C
191f0 6f 6e 73 74 61 6e 74 73 20 75 73 65 64 20 66 6f  onstants used fo
19200 72 20 6c 6f 63 6b 69 6e 67 0a 2a 2f 0a 23 64 65  r locking.*/.#de
19210 66 69 6e 65 20 57 49 4e 5f 53 48 4d 5f 42 41 53  fine WIN_SHM_BAS
19220 45 20 20 20 28 28 32 32 2b 53 51 4c 49 54 45 5f  E   ((22+SQLITE_
19230 53 48 4d 5f 4e 4c 4f 43 4b 29 2a 34 29 20 20 20  SHM_NLOCK)*4)   
19240 20 20 20 20 20 2f 2a 20 66 69 72 73 74 20 6c 6f       /* first lo
19250 63 6b 20 62 79 74 65 20 2a 2f 0a 23 64 65 66 69  ck byte */.#defi
19260 6e 65 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 20 20  ne WIN_SHM_DMS  
19270 20 20 28 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2b    (WIN_SHM_BASE+
19280 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b  SQLITE_SHM_NLOCK
19290 29 20 20 2f 2a 20 64 65 61 64 6d 61 6e 20 73 77  )  /* deadman sw
192a0 69 74 63 68 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41  itch */../*.** A
192b0 70 70 6c 79 20 61 64 76 69 73 6f 72 79 20 6c 6f  pply advisory lo
192c0 63 6b 73 20 66 6f 72 20 61 6c 6c 20 6e 20 62 79  cks for all n by
192d0 74 65 73 20 62 65 67 69 6e 6e 69 6e 67 20 61 74  tes beginning at
192e0 20 6f 66 73 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e   ofst..*/.#defin
192f0 65 20 5f 53 48 4d 5f 55 4e 4c 43 4b 20 20 31 0a  e _SHM_UNLCK  1.
19300 23 64 65 66 69 6e 65 20 5f 53 48 4d 5f 52 44 4c  #define _SHM_RDL
19310 43 4b 20 20 32 0a 23 64 65 66 69 6e 65 20 5f 53  CK  2.#define _S
19320 48 4d 5f 57 52 4c 43 4b 20 20 33 0a 73 74 61 74  HM_WRLCK  3.stat
19330 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 53 79 73  ic int winShmSys
19340 74 65 6d 4c 6f 63 6b 28 0a 20 20 77 69 6e 53 68  temLock(.  winSh
19350 6d 4e 6f 64 65 20 2a 70 46 69 6c 65 2c 20 20 20  mNode *pFile,   
19360 20 2f 2a 20 41 70 70 6c 79 20 6c 6f 63 6b 73 20   /* Apply locks 
19370 74 6f 20 74 68 69 73 20 6f 70 65 6e 20 73 68 61  to this open sha
19380 72 65 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65  red-memory segme
19390 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 6f 63 6b  nt */.  int lock
193a0 54 79 70 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  Type,         /*
193b0 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20 5f 53 48   _SHM_UNLCK, _SH
193c0 4d 5f 52 44 4c 43 4b 2c 20 6f 72 20 5f 53 48 4d  M_RDLCK, or _SHM
193d0 5f 57 52 4c 43 4b 20 2a 2f 0a 20 20 69 6e 74 20  _WRLCK */.  int 
193e0 6f 66 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  ofst,           
193f0 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 66    /* Offset to f
19400 69 72 73 74 20 62 79 74 65 20 74 6f 20 62 65 20  irst byte to be 
19410 6c 6f 63 6b 65 64 2f 75 6e 6c 6f 63 6b 65 64 20  locked/unlocked 
19420 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 20  */.  int nByte  
19430 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
19440 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f  mber of bytes to
19450 20 6c 6f 63 6b 20 6f 72 20 75 6e 6c 6f 63 6b 20   lock or unlock 
19460 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
19470 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
19480 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66 6f 72   Result code for
19490 6d 20 4c 6f 63 6b 2f 55 6e 6c 6f 63 6b 46 69 6c  m Lock/UnlockFil
194a0 65 45 78 28 29 20 2a 2f 0a 0a 20 20 2f 2a 20 41  eEx() */..  /* A
194b0 63 63 65 73 73 20 74 6f 20 74 68 65 20 77 69 6e  ccess to the win
194c0 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 69  ShmNode object i
194d0 73 20 73 65 72 69 61 6c 69 7a 65 64 20 62 79 20  s serialized by 
194e0 74 68 65 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20  the caller */.  
194f0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
19500 6d 75 74 65 78 5f 68 65 6c 64 28 70 46 69 6c 65  mutex_held(pFile
19510 2d 3e 6d 75 74 65 78 29 20 7c 7c 20 70 46 69 6c  ->mutex) || pFil
19520 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a 20  e->nRef==0 );.. 
19530 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4c   OSTRACE(("SHM-L
19540 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6c 6f 63  OCK file=%p, loc
19550 6b 3d 25 64 2c 20 6f 66 66 73 65 74 3d 25 64 2c  k=%d, offset=%d,
19560 20 73 69 7a 65 3d 25 64 5c 6e 22 2c 0a 20 20 20   size=%d\n",.   
19570 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68          pFile->h
19580 46 69 6c 65 2e 68 2c 20 6c 6f 63 6b 54 79 70 65  File.h, lockType
19590 2c 20 6f 66 73 74 2c 20 6e 42 79 74 65 29 29 3b  , ofst, nByte));
195a0 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73 65 2f 41  ..  /* Release/A
195b0 63 71 75 69 72 65 20 74 68 65 20 73 79 73 74 65  cquire the syste
195c0 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b 20 2a 2f 0a  m-level lock */.
195d0 20 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d    if( lockType==
195e0 5f 53 48 4d 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20  _SHM_UNLCK ){.  
195f0 20 20 72 63 20 3d 20 77 69 6e 55 6e 6c 6f 63 6b    rc = winUnlock
19600 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 46 69  File(&pFile->hFi
19610 6c 65 2e 68 2c 20 6f 66 73 74 2c 20 30 2c 20 6e  le.h, ofst, 0, n
19620 42 79 74 65 2c 20 30 29 3b 0a 20 20 7d 65 6c 73  Byte, 0);.  }els
19630 65 7b 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61  e{.    /* Initia
19640 6c 69 7a 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67  lize the locking
19650 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20   parameters */. 
19660 20 20 20 44 57 4f 52 44 20 64 77 46 6c 61 67 73     DWORD dwFlags
19670 20 3d 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c   = LOCKFILE_FAIL
19680 5f 49 4d 4d 45 44 49 41 54 45 4c 59 3b 0a 20 20  _IMMEDIATELY;.  
19690 20 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 20 3d    if( lockType =
196a0 3d 20 5f 53 48 4d 5f 57 52 4c 43 4b 20 29 20 64  = _SHM_WRLCK ) d
196b0 77 46 6c 61 67 73 20 7c 3d 20 4c 4f 43 4b 46 49  wFlags |= LOCKFI
196c0 4c 45 5f 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  LE_EXCLUSIVE_LOC
196d0 4b 3b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4c  K;.    rc = winL
196e0 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e  ockFile(&pFile->
196f0 68 46 69 6c 65 2e 68 2c 20 64 77 46 6c 61 67 73  hFile.h, dwFlags
19700 2c 20 6f 66 73 74 2c 20 30 2c 20 6e 42 79 74 65  , ofst, 0, nByte
19710 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 69  , 0);.  }.  .  i
19720 66 28 20 72 63 21 3d 20 30 20 29 7b 0a 20 20 20  f( rc!= 0 ){.   
19730 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
19740 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46  .  }else{.    pF
19750 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
19760 20 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72    osGetLastError
19770 28 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  ();.    rc = SQL
19780 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a 20  ITE_BUSY;.  }.. 
19790 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4c   OSTRACE(("SHM-L
197a0 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 66 75 6e  OCK file=%p, fun
197b0 63 3d 25 73 2c 20 65 72 72 6e 6f 3d 25 6c 75 2c  c=%s, errno=%lu,
197c0 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20   rc=%s\n",.     
197d0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 46 69        pFile->hFi
197e0 6c 65 2e 68 2c 20 28 6c 6f 63 6b 54 79 70 65 20  le.h, (lockType 
197f0 3d 3d 20 5f 53 48 4d 5f 55 4e 4c 43 4b 29 20 3f  == _SHM_UNLCK) ?
19800 20 22 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 22   "winUnlockFile"
19810 20 3a 0a 20 20 20 20 20 20 20 20 20 20 20 22 77   :.           "w
19820 69 6e 4c 6f 63 6b 46 69 6c 65 22 2c 20 70 46 69  inLockFile", pFi
19830 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 20 73  le->lastErrno, s
19840 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63  qlite3ErrName(rc
19850 29 29 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72  )));..  return r
19860 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  c;.}../* Forward
19870 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 56   references to V
19880 46 53 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 73 74  FS methods */.st
19890 61 74 69 63 20 69 6e 74 20 77 69 6e 4f 70 65 6e  atic int winOpen
198a0 28 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c 63 6f  (sqlite3_vfs*,co
198b0 6e 73 74 20 63 68 61 72 2a 2c 73 71 6c 69 74 65  nst char*,sqlite
198c0 33 5f 66 69 6c 65 2a 2c 69 6e 74 2c 69 6e 74 2a  3_file*,int,int*
198d0 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  );.static int wi
198e0 6e 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 5f  nDelete(sqlite3_
198f0 76 66 73 20 2a 2c 63 6f 6e 73 74 20 63 68 61 72  vfs *,const char
19900 2a 2c 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50  *,int);../*.** P
19910 75 72 67 65 20 74 68 65 20 77 69 6e 53 68 6d 4e  urge the winShmN
19920 6f 64 65 4c 69 73 74 20 6c 69 73 74 20 6f 66 20  odeList list of 
19930 61 6c 6c 20 65 6e 74 72 69 65 73 20 77 69 74 68  all entries with
19940 20 77 69 6e 53 68 6d 4e 6f 64 65 2e 6e 52 65 66   winShmNode.nRef
19950 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ==0..**.** This 
19960 69 73 20 6e 6f 74 20 61 20 56 46 53 20 73 68 61  is not a VFS sha
19970 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 74 68 6f  red-memory metho
19980 64 3b 20 69 74 20 69 73 20 61 20 75 74 69 6c 69  d; it is a utili
19990 74 79 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  ty function call
199a0 65 64 0a 2a 2a 20 62 79 20 56 46 53 20 73 68 61  ed.** by VFS sha
199b0 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 74 68 6f  red-memory metho
199c0 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ds..*/.static vo
199d0 69 64 20 77 69 6e 53 68 6d 50 75 72 67 65 28 73  id winShmPurge(s
199e0 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
199f0 2c 20 69 6e 74 20 64 65 6c 65 74 65 46 6c 61 67  , int deleteFlag
19a00 29 7b 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20  ){.  winShmNode 
19a10 2a 2a 70 70 3b 0a 20 20 77 69 6e 53 68 6d 4e 6f  **pp;.  winShmNo
19a20 64 65 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28  de *p;.  assert(
19a30 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64   winShmMutexHeld
19a40 28 29 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  () );.  OSTRACE(
19a50 28 22 53 48 4d 2d 50 55 52 47 45 20 70 69 64 3d  ("SHM-PURGE pid=
19a60 25 6c 75 2c 20 64 65 6c 65 74 65 46 6c 61 67 3d  %lu, deleteFlag=
19a70 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
19a80 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72    osGetCurrentPr
19a90 6f 63 65 73 73 49 64 28 29 2c 20 64 65 6c 65 74  ocessId(), delet
19aa0 65 46 6c 61 67 29 29 3b 0a 20 20 70 70 20 3d 20  eFlag));.  pp = 
19ab0 26 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 3b  &winShmNodeList;
19ac0 0a 20 20 77 68 69 6c 65 28 20 28 70 20 3d 20 2a  .  while( (p = *
19ad0 70 70 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66  pp)!=0 ){.    if
19ae0 28 20 70 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a  ( p->nRef==0 ){.
19af0 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
19b00 20 20 20 69 66 28 20 70 2d 3e 6d 75 74 65 78 20     if( p->mutex 
19b10 29 7b 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  ){ sqlite3_mutex
19b20 5f 66 72 65 65 28 70 2d 3e 6d 75 74 65 78 29 3b  _free(p->mutex);
19b30 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30   }.      for(i=0
19b40 3b 20 69 3c 70 2d 3e 6e 52 65 67 69 6f 6e 3b 20  ; i<p->nRegion; 
19b50 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 42 4f  i++){.        BO
19b60 4f 4c 20 62 52 63 20 3d 20 6f 73 55 6e 6d 61 70  OL bRc = osUnmap
19b70 56 69 65 77 4f 66 46 69 6c 65 28 70 2d 3e 61 52  ViewOfFile(p->aR
19b80 65 67 69 6f 6e 5b 69 5d 2e 70 4d 61 70 29 3b 0a  egion[i].pMap);.
19b90 20 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28          OSTRACE(
19ba0 28 22 53 48 4d 2d 50 55 52 47 45 2d 55 4e 4d 41  ("SHM-PURGE-UNMA
19bb0 50 20 70 69 64 3d 25 6c 75 2c 20 72 65 67 69 6f  P pid=%lu, regio
19bc0 6e 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a  n=%d, rc=%s\n",.
19bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19be0 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
19bf0 63 65 73 73 49 64 28 29 2c 20 69 2c 20 62 52 63  cessId(), i, bRc
19c00 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65   ? "ok" : "faile
19c10 64 22 29 29 3b 0a 20 20 20 20 20 20 20 20 55 4e  d"));.        UN
19c20 55 53 45 44 5f 56 41 52 49 41 42 4c 45 5f 56 41  USED_VARIABLE_VA
19c30 4c 55 45 28 62 52 63 29 3b 0a 20 20 20 20 20 20  LUE(bRc);.      
19c40 20 20 62 52 63 20 3d 20 6f 73 43 6c 6f 73 65 48    bRc = osCloseH
19c50 61 6e 64 6c 65 28 70 2d 3e 61 52 65 67 69 6f 6e  andle(p->aRegion
19c60 5b 69 5d 2e 68 4d 61 70 29 3b 0a 20 20 20 20 20  [i].hMap);.     
19c70 20 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d     OSTRACE(("SHM
19c80 2d 50 55 52 47 45 2d 43 4c 4f 53 45 20 70 69 64  -PURGE-CLOSE pid
19c90 3d 25 6c 75 2c 20 72 65 67 69 6f 6e 3d 25 64 2c  =%lu, region=%d,
19ca0 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20   rc=%s\n",.     
19cb0 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65              osGe
19cc0 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
19cd0 64 28 29 2c 20 69 2c 20 62 52 63 20 3f 20 22 6f  d(), i, bRc ? "o
19ce0 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b  k" : "failed"));
19cf0 0a 20 20 20 20 20 20 20 20 55 4e 55 53 45 44 5f  .        UNUSED_
19d00 56 41 52 49 41 42 4c 45 5f 56 41 4c 55 45 28 62  VARIABLE_VALUE(b
19d10 52 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Rc);.      }.   
19d20 20 20 20 69 66 28 20 70 2d 3e 68 46 69 6c 65 2e     if( p->hFile.
19d30 68 21 3d 4e 55 4c 4c 20 26 26 20 70 2d 3e 68 46  h!=NULL && p->hF
19d40 69 6c 65 2e 68 21 3d 49 4e 56 41 4c 49 44 5f 48  ile.h!=INVALID_H
19d50 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 7b 0a 20  ANDLE_VALUE ){. 
19d60 20 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49         SimulateI
19d70 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b  OErrorBenign(1);
19d80 0a 20 20 20 20 20 20 20 20 77 69 6e 43 6c 6f 73  .        winClos
19d90 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  e((sqlite3_file 
19da0 2a 29 26 70 2d 3e 68 46 69 6c 65 29 3b 0a 20 20  *)&p->hFile);.  
19db0 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
19dc0 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a  ErrorBenign(0);.
19dd0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
19de0 28 20 64 65 6c 65 74 65 46 6c 61 67 20 29 7b 0a  ( deleteFlag ){.
19df0 20 20 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65          Simulate
19e00 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29  IOErrorBenign(1)
19e10 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
19e20 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
19e30 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20 77 69  oc();.        wi
19e40 6e 44 65 6c 65 74 65 28 70 56 66 73 2c 20 70 2d  nDelete(pVfs, p-
19e50 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 30 29 3b 0a  >zFilename, 0);.
19e60 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
19e70 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
19e80 3b 0a 20 20 20 20 20 20 20 20 53 69 6d 75 6c 61  ;.        Simula
19e90 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28  teIOErrorBenign(
19ea0 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
19eb0 20 20 2a 70 70 20 3d 20 70 2d 3e 70 4e 65 78 74    *pp = p->pNext
19ec0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
19ed0 66 72 65 65 28 70 2d 3e 61 52 65 67 69 6f 6e 29  free(p->aRegion)
19ee0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
19ef0 66 72 65 65 28 70 29 3b 0a 20 20 20 20 7d 65 6c  free(p);.    }el
19f00 73 65 7b 0a 20 20 20 20 20 20 70 70 20 3d 20 26  se{.      pp = &
19f10 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a  p->pNext;.    }.
19f20 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65    }.}../*.** Ope
19f30 6e 20 74 68 65 20 73 68 61 72 65 64 2d 6d 65 6d  n the shared-mem
19f40 6f 72 79 20 61 72 65 61 20 61 73 73 6f 63 69 61  ory area associa
19f50 74 65 64 20 77 69 74 68 20 64 61 74 61 62 61 73  ted with databas
19f60 65 20 66 69 6c 65 20 70 44 62 46 64 2e 0a 2a 2a  e file pDbFd..**
19f70 0a 2a 2a 20 57 68 65 6e 20 6f 70 65 6e 69 6e 67  .** When opening
19f80 20 61 20 6e 65 77 20 73 68 61 72 65 64 2d 6d 65   a new shared-me
19f90 6d 6f 72 79 20 66 69 6c 65 2c 20 69 66 20 6e 6f  mory file, if no
19fa0 20 6f 74 68 65 72 20 69 6e 73 74 61 6e 63 65 73   other instances
19fb0 20 6f 66 20 74 68 61 74 0a 2a 2a 20 66 69 6c 65   of that.** file
19fc0 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 6f   are currently o
19fd0 70 65 6e 2c 20 69 6e 20 74 68 69 73 20 70 72 6f  pen, in this pro
19fe0 63 65 73 73 20 6f 72 20 69 6e 20 6f 74 68 65 72  cess or in other
19ff0 20 70 72 6f 63 65 73 73 65 73 2c 20 74 68 65 6e   processes, then
1a000 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20 6d 75 73  .** the file mus
1a010 74 20 62 65 20 74 72 75 6e 63 61 74 65 64 20 74  t be truncated t
1a020 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68 20 6f 72  o zero length or
1a030 20 68 61 76 65 20 69 74 73 20 68 65 61 64 65 72   have its header
1a040 20 63 6c 65 61 72 65 64 2e 0a 2a 2f 0a 73 74 61   cleared..*/.sta
1a050 74 69 63 20 69 6e 74 20 77 69 6e 4f 70 65 6e 53  tic int winOpenS
1a060 68 61 72 65 64 4d 65 6d 6f 72 79 28 77 69 6e 46  haredMemory(winF
1a070 69 6c 65 20 2a 70 44 62 46 64 29 7b 0a 20 20 73  ile *pDbFd){.  s
1a080 74 72 75 63 74 20 77 69 6e 53 68 6d 20 2a 70 3b  truct winShm *p;
1a090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a0a0 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74    /* The connect
1a0b0 69 6f 6e 20 74 6f 20 62 65 20 6f 70 65 6e 65 64  ion to be opened
1a0c0 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 77 69 6e   */.  struct win
1a0d0 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64  ShmNode *pShmNod
1a0e0 65 20 3d 20 30 3b 20 20 20 2f 2a 20 54 68 65 20  e = 0;   /* The 
1a0f0 75 6e 64 65 72 6c 79 69 6e 67 20 6d 6d 61 70 70  underlying mmapp
1a100 65 64 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  ed file */.  int
1a110 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
1a120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a130 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a  /* Result code *
1a140 2f 0a 20 20 73 74 72 75 63 74 20 77 69 6e 53 68  /.  struct winSh
1a150 6d 4e 6f 64 65 20 2a 70 4e 65 77 3b 20 20 20 20  mNode *pNew;    
1a160 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 6c 79 20         /* Newly 
1a170 61 6c 6c 6f 63 61 74 65 64 20 77 69 6e 53 68 6d  allocated winShm
1a180 4e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e  Node */.  int nN
1a190 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
1a1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a1b0 53 69 7a 65 20 6f 66 20 7a 4e 61 6d 65 20 69 6e  Size of zName in
1a1c0 20 62 79 74 65 73 20 2a 2f 0a 0a 20 20 61 73 73   bytes */..  ass
1a1d0 65 72 74 28 20 70 44 62 46 64 2d 3e 70 53 68 6d  ert( pDbFd->pShm
1a1e0 3d 3d 30 20 29 3b 20 20 20 20 2f 2a 20 4e 6f 74  ==0 );    /* Not
1a1f0 20 70 72 65 76 69 6f 75 73 6c 79 20 6f 70 65 6e   previously open
1a200 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  ed */..  /* Allo
1a210 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 74  cate space for t
1a220 68 65 20 6e 65 77 20 73 71 6c 69 74 65 33 5f 73  he new sqlite3_s
1a230 68 6d 20 6f 62 6a 65 63 74 2e 20 20 41 6c 73 6f  hm object.  Also
1a240 20 73 70 65 63 75 6c 61 74 69 76 65 6c 79 0a 20   speculatively. 
1a250 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 20 73 70 61   ** allocate spa
1a260 63 65 20 66 6f 72 20 61 20 6e 65 77 20 77 69 6e  ce for a new win
1a270 53 68 6d 4e 6f 64 65 20 61 6e 64 20 66 69 6c 65  ShmNode and file
1a280 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 70 20 3d  name..  */.  p =
1a290 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
1a2a0 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70 29 20 29  ro( sizeof(*p) )
1a2b0 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
1a2c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
1a2d0 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 6e 4e 61 6d  RR_NOMEM;.  nNam
1a2e0 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  e = sqlite3Strle
1a2f0 6e 33 30 28 70 44 62 46 64 2d 3e 7a 50 61 74 68  n30(pDbFd->zPath
1a300 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  );.  pNew = sqli
1a310 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73  te3MallocZero( s
1a320 69 7a 65 6f 66 28 2a 70 53 68 6d 4e 6f 64 65 29  izeof(*pShmNode)
1a330 20 2b 20 6e 4e 61 6d 65 20 2b 20 31 37 20 29 3b   + nName + 17 );
1a340 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
1a350 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
1a360 65 65 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72  ee(p);.    retur
1a370 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  n SQLITE_IOERR_N
1a380 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 4e 65 77  OMEM;.  }.  pNew
1a390 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 28 63  ->zFilename = (c
1a3a0 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20  har*)&pNew[1];. 
1a3b0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
1a3c0 66 28 6e 4e 61 6d 65 2b 31 35 2c 20 70 4e 65 77  f(nName+15, pNew
1a3d0 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 25 73  ->zFilename, "%s
1a3e0 2d 73 68 6d 22 2c 20 70 44 62 46 64 2d 3e 7a 50  -shm", pDbFd->zP
1a3f0 61 74 68 29 3b 0a 20 20 73 71 6c 69 74 65 33 46  ath);.  sqlite3F
1a400 69 6c 65 53 75 66 66 69 78 33 28 70 44 62 46 64  ileSuffix3(pDbFd
1a410 2d 3e 7a 50 61 74 68 2c 20 70 4e 65 77 2d 3e 7a  ->zPath, pNew->z
1a420 46 69 6c 65 6e 61 6d 65 29 3b 20 0a 0a 20 20 2f  Filename); ..  /
1a430 2a 20 4c 6f 6f 6b 20 74 6f 20 73 65 65 20 69 66  * Look to see if
1a440 20 74 68 65 72 65 20 69 73 20 61 6e 20 65 78 69   there is an exi
1a450 73 74 69 6e 67 20 77 69 6e 53 68 6d 4e 6f 64 65  sting winShmNode
1a460 20 74 68 61 74 20 63 61 6e 20 62 65 20 75 73 65   that can be use
1a470 64 2e 0a 20 20 2a 2a 20 49 66 20 6e 6f 20 6d 61  d..  ** If no ma
1a480 74 63 68 69 6e 67 20 77 69 6e 53 68 6d 4e 6f 64  tching winShmNod
1a490 65 20 63 75 72 72 65 6e 74 6c 79 20 65 78 69 73  e currently exis
1a4a0 74 73 2c 20 63 72 65 61 74 65 20 61 20 6e 65 77  ts, create a new
1a4b0 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 77 69 6e   one..  */.  win
1a4c0 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  ShmEnterMutex();
1a4d0 0a 20 20 66 6f 72 28 70 53 68 6d 4e 6f 64 65 20  .  for(pShmNode 
1a4e0 3d 20 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74  = winShmNodeList
1a4f0 3b 20 70 53 68 6d 4e 6f 64 65 3b 20 70 53 68 6d  ; pShmNode; pShm
1a500 4e 6f 64 65 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70  Node=pShmNode->p
1a510 4e 65 78 74 29 7b 0a 20 20 20 20 2f 2a 20 54 42  Next){.    /* TB
1a520 44 20 6e 65 65 64 20 74 6f 20 63 6f 6d 65 20 75  D need to come u
1a530 70 20 77 69 74 68 20 62 65 74 74 65 72 20 6d 61  p with better ma
1a540 74 63 68 20 68 65 72 65 2e 20 20 50 65 72 68 61  tch here.  Perha
1a550 70 73 0a 20 20 20 20 2a 2a 20 75 73 65 20 46 49  ps.    ** use FI
1a560 4c 45 5f 49 44 5f 42 4f 54 48 5f 44 49 52 5f 49  LE_ID_BOTH_DIR_I
1a570 4e 46 4f 20 53 74 72 75 63 74 75 72 65 2e 0a 20  NFO Structure.. 
1a580 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71     */.    if( sq
1a590 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 53 68  lite3StrICmp(pSh
1a5a0 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65  mNode->zFilename
1a5b0 2c 20 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d  , pNew->zFilenam
1a5c0 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  e)==0 ) break;. 
1a5d0 20 7d 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64   }.  if( pShmNod
1a5e0 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
1a5f0 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 7d  _free(pNew);.  }
1a600 65 6c 73 65 7b 0a 20 20 20 20 70 53 68 6d 4e 6f  else{.    pShmNo
1a610 64 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 70  de = pNew;.    p
1a620 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 28 28 77  New = 0;.    ((w
1a630 69 6e 46 69 6c 65 2a 29 28 26 70 53 68 6d 4e 6f  inFile*)(&pShmNo
1a640 64 65 2d 3e 68 46 69 6c 65 29 29 2d 3e 68 20 3d  de->hFile))->h =
1a650 20 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f   INVALID_HANDLE_
1a660 56 41 4c 55 45 3b 0a 20 20 20 20 70 53 68 6d 4e  VALUE;.    pShmN
1a670 6f 64 65 2d 3e 70 4e 65 78 74 20 3d 20 77 69 6e  ode->pNext = win
1a680 53 68 6d 4e 6f 64 65 4c 69 73 74 3b 0a 20 20 20  ShmNodeList;.   
1a690 20 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 20   winShmNodeList 
1a6a0 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20 20  = pShmNode;..   
1a6b0 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78   pShmNode->mutex
1a6c0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78   = sqlite3_mutex
1a6d0 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  _alloc(SQLITE_MU
1a6e0 54 45 58 5f 46 41 53 54 29 3b 0a 20 20 20 20 69  TEX_FAST);.    i
1a6f0 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  f( pShmNode->mut
1a700 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  ex==0 ){.      r
1a710 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
1a720 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f  _NOMEM;.      go
1a730 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b  to shm_open_err;
1a740 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d  .    }..    rc =
1a750 20 77 69 6e 4f 70 65 6e 28 70 44 62 46 64 2d 3e   winOpen(pDbFd->
1a760 70 56 66 73 2c 0a 20 20 20 20 20 20 20 20 20 20  pVfs,.          
1a770 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d         pShmNode-
1a780 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20 20  >zFilename,     
1a790 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
1a7a0 6f 66 20 74 68 65 20 66 69 6c 65 20 28 55 54 46  of the file (UTF
1a7b0 2d 38 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  -8) */.         
1a7c0 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33          (sqlite3
1a7d0 5f 66 69 6c 65 2a 29 26 70 53 68 6d 4e 6f 64 65  _file*)&pShmNode
1a7e0 2d 3e 68 46 69 6c 65 2c 20 20 2f 2a 20 46 69 6c  ->hFile,  /* Fil
1a7f0 65 20 68 61 6e 64 6c 65 20 68 65 72 65 20 2a 2f  e handle here */
1a800 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1a810 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41    SQLITE_OPEN_WA
1a820 4c 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  L | SQLITE_OPEN_
1a830 52 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49  READWRITE | SQLI
1a840 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c 0a  TE_OPEN_CREATE,.
1a850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a860 20 30 29 3b 0a 20 20 20 20 69 66 28 20 53 51 4c   0);.    if( SQL
1a870 49 54 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20  ITE_OK!=rc ){.  
1a880 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65      goto shm_ope
1a890 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20  n_err;.    }..  
1a8a0 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
1a8b0 65 20 69 66 20 61 6e 6f 74 68 65 72 20 70 72 6f  e if another pro
1a8c0 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20  cess is holding 
1a8d0 74 68 65 20 64 65 61 64 2d 6d 61 6e 20 73 77 69  the dead-man swi
1a8e0 74 63 68 2e 0a 20 20 20 20 2a 2a 20 49 66 20 6e  tch..    ** If n
1a8f0 6f 74 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65  ot, truncate the
1a900 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20 6c 65   file to zero le
1a910 6e 67 74 68 2e 20 0a 20 20 20 20 2a 2f 0a 20 20  ngth. .    */.  
1a920 20 20 69 66 28 20 77 69 6e 53 68 6d 53 79 73 74    if( winShmSyst
1a930 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c  emLock(pShmNode,
1a940 20 5f 53 48 4d 5f 57 52 4c 43 4b 2c 20 57 49 4e   _SHM_WRLCK, WIN
1a950 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3d 3d 53 51  _SHM_DMS, 1)==SQ
1a960 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1a970 20 72 63 20 3d 20 77 69 6e 54 72 75 6e 63 61 74   rc = winTruncat
1a980 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  e((sqlite3_file 
1a990 2a 29 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69  *)&pShmNode->hFi
1a9a0 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  le, 0);.      if
1a9b0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1a9c0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1a9d0 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
1a9e0 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4f 50 45 4e  TE_IOERR_SHMOPEN
1a9f0 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  , osGetLastError
1aa00 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  (),.            
1aa10 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
1aa20 6e 4f 70 65 6e 53 68 6d 22 2c 20 70 44 62 46 64  nOpenShm", pDbFd
1aa30 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20  ->zPath);.      
1aa40 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
1aa50 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1aa60 0a 20 20 20 20 20 20 77 69 6e 53 68 6d 53 79 73  .      winShmSys
1aa70 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65  temLock(pShmNode
1aa80 2c 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20 57 49  , _SHM_UNLCK, WI
1aa90 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20  N_SHM_DMS, 1);. 
1aaa0 20 20 20 20 20 72 63 20 3d 20 77 69 6e 53 68 6d       rc = winShm
1aab0 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e  SystemLock(pShmN
1aac0 6f 64 65 2c 20 5f 53 48 4d 5f 52 44 4c 43 4b 2c  ode, _SHM_RDLCK,
1aad0 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31 29   WIN_SHM_DMS, 1)
1aae0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1aaf0 72 63 20 29 20 67 6f 74 6f 20 73 68 6d 5f 6f 70  rc ) goto shm_op
1ab00 65 6e 5f 65 72 72 3b 0a 20 20 7d 0a 0a 20 20 2f  en_err;.  }..  /
1ab10 2a 20 4d 61 6b 65 20 74 68 65 20 6e 65 77 20 63  * Make the new c
1ab20 6f 6e 6e 65 63 74 69 6f 6e 20 61 20 63 68 69 6c  onnection a chil
1ab30 64 20 6f 66 20 74 68 65 20 77 69 6e 53 68 6d 4e  d of the winShmN
1ab40 6f 64 65 20 2a 2f 0a 20 20 70 2d 3e 70 53 68 6d  ode */.  p->pShm
1ab50 4e 6f 64 65 20 3d 20 70 53 68 6d 4e 6f 64 65 3b  Node = pShmNode;
1ab60 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
1ab70 45 42 55 47 0a 20 20 70 2d 3e 69 64 20 3d 20 70  EBUG.  p->id = p
1ab80 53 68 6d 4e 6f 64 65 2d 3e 6e 65 78 74 53 68 6d  ShmNode->nextShm
1ab90 49 64 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 70  Id++;.#endif.  p
1aba0 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2b 2b 3b  ShmNode->nRef++;
1abb0 0a 20 20 70 44 62 46 64 2d 3e 70 53 68 6d 20 3d  .  pDbFd->pShm =
1abc0 20 70 3b 0a 20 20 77 69 6e 53 68 6d 4c 65 61 76   p;.  winShmLeav
1abd0 65 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f 2a 20  eMutex();..  /* 
1abe0 54 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  The reference co
1abf0 75 6e 74 20 6f 6e 20 70 53 68 6d 4e 6f 64 65 20  unt on pShmNode 
1ac00 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
1ac10 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 75 6e 64   incremented und
1ac20 65 72 0a 20 20 2a 2a 20 74 68 65 20 63 6f 76 65  er.  ** the cove
1ac30 72 20 6f 66 20 74 68 65 20 77 69 6e 53 68 6d 45  r of the winShmE
1ac40 6e 74 65 72 4d 75 74 65 78 28 29 20 6d 75 74 65  nterMutex() mute
1ac50 78 20 61 6e 64 20 74 68 65 20 70 6f 69 6e 74 65  x and the pointe
1ac60 72 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20  r from the.  ** 
1ac70 6e 65 77 20 28 73 74 72 75 63 74 20 77 69 6e 53  new (struct winS
1ac80 68 6d 29 20 6f 62 6a 65 63 74 20 74 6f 20 74 68  hm) object to th
1ac90 65 20 70 53 68 6d 4e 6f 64 65 20 68 61 73 20 62  e pShmNode has b
1aca0 65 65 6e 20 73 65 74 2e 20 41 6c 6c 20 74 68 61  een set. All tha
1acb0 74 20 69 73 0a 20 20 2a 2a 20 6c 65 66 74 20 74  t is.  ** left t
1acc0 6f 20 64 6f 20 69 73 20 74 6f 20 6c 69 6e 6b 20  o do is to link 
1acd0 74 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 69  the new object i
1ace0 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c  nto the linked l
1acf0 69 73 74 20 73 74 61 72 74 69 6e 67 0a 20 20 2a  ist starting.  *
1ad00 2a 20 61 74 20 70 53 68 6d 4e 6f 64 65 2d 3e 70  * at pShmNode->p
1ad10 46 69 72 73 74 2e 20 54 68 69 73 20 6d 75 73 74  First. This must
1ad20 20 62 65 20 64 6f 6e 65 20 77 68 69 6c 65 20 68   be done while h
1ad30 6f 6c 64 69 6e 67 20 74 68 65 20 70 53 68 6d 4e  olding the pShmN
1ad40 6f 64 65 2d 3e 6d 75 74 65 78 20 0a 20 20 2a 2a  ode->mutex .  **
1ad50 20 6d 75 74 65 78 2e 0a 20 20 2a 2f 0a 20 20 73   mutex..  */.  s
1ad60 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
1ad70 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  er(pShmNode->mut
1ad80 65 78 29 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20  ex);.  p->pNext 
1ad90 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72  = pShmNode->pFir
1ada0 73 74 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e  st;.  pShmNode->
1adb0 70 46 69 72 73 74 20 3d 20 70 3b 0a 20 20 73 71  pFirst = p;.  sq
1adc0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
1add0 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  e(pShmNode->mute
1ade0 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  x);.  return SQL
1adf0 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75  ITE_OK;..  /* Ju
1ae00 6d 70 20 68 65 72 65 20 6f 6e 20 61 6e 79 20 65  mp here on any e
1ae10 72 72 6f 72 20 2a 2f 0a 73 68 6d 5f 6f 70 65 6e  rror */.shm_open
1ae20 5f 65 72 72 3a 0a 20 20 77 69 6e 53 68 6d 53 79  _err:.  winShmSy
1ae30 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64  stemLock(pShmNod
1ae40 65 2c 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20 57  e, _SHM_UNLCK, W
1ae50 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a  IN_SHM_DMS, 1);.
1ae60 20 20 77 69 6e 53 68 6d 50 75 72 67 65 28 70 44    winShmPurge(pD
1ae70 62 46 64 2d 3e 70 56 66 73 2c 20 30 29 3b 20 20  bFd->pVfs, 0);  
1ae80 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c      /* This call
1ae90 20 66 72 65 65 73 20 70 53 68 6d 4e 6f 64 65 20   frees pShmNode 
1aea0 69 66 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20  if required */. 
1aeb0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
1aec0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
1aed0 28 70 4e 65 77 29 3b 0a 20 20 77 69 6e 53 68 6d  (pNew);.  winShm
1aee0 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
1aef0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1af00 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63 6f 6e 6e  .** Close a conn
1af10 65 63 74 69 6f 6e 20 74 6f 20 73 68 61 72 65 64  ection to shared
1af20 2d 6d 65 6d 6f 72 79 2e 20 20 44 65 6c 65 74 65  -memory.  Delete
1af30 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
1af40 0a 2a 2a 20 73 74 6f 72 61 67 65 20 69 66 20 64  .** storage if d
1af50 65 6c 65 74 65 46 6c 61 67 20 69 73 20 74 72 75  eleteFlag is tru
1af60 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1af70 20 77 69 6e 53 68 6d 55 6e 6d 61 70 28 0a 20 20   winShmUnmap(.  
1af80 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
1af90 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61  ,          /* Da
1afa0 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 20 73  tabase holding s
1afb0 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a  hared memory */.
1afc0 20 20 69 6e 74 20 64 65 6c 65 74 65 46 6c 61 67    int deleteFlag
1afd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1afe0 44 65 6c 65 74 65 20 61 66 74 65 72 20 63 6c 6f  Delete after clo
1aff0 73 69 6e 67 20 69 66 20 74 72 75 65 20 2a 2f 0a  sing if true */.
1b000 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 44  ){.  winFile *pD
1b010 62 46 64 3b 20 20 20 20 20 20 20 2f 2a 20 44 61  bFd;       /* Da
1b020 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 20 73  tabase holding s
1b030 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 2a 2f 0a  hared-memory */.
1b040 20 20 77 69 6e 53 68 6d 20 2a 70 3b 20 20 20 20    winShm *p;    
1b050 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
1b060 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65 20  onnection to be 
1b070 63 6c 6f 73 65 64 20 2a 2f 0a 20 20 77 69 6e 53  closed */.  winS
1b080 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65  hmNode *pShmNode
1b090 3b 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79  ; /* The underly
1b0a0 69 6e 67 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  ing shared-memor
1b0b0 79 20 66 69 6c 65 20 2a 2f 0a 20 20 77 69 6e 53  y file */.  winS
1b0c0 68 6d 20 2a 2a 70 70 3b 20 20 20 20 20 20 20 20  hm **pp;        
1b0d0 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
1b0e0 20 6f 76 65 72 20 73 69 62 6c 69 6e 67 20 63 6f   over sibling co
1b0f0 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20  nnections */..  
1b100 70 44 62 46 64 20 3d 20 28 77 69 6e 46 69 6c 65  pDbFd = (winFile
1b110 2a 29 66 64 3b 0a 20 20 70 20 3d 20 70 44 62 46  *)fd;.  p = pDbF
1b120 64 2d 3e 70 53 68 6d 3b 0a 20 20 69 66 28 20 70  d->pShm;.  if( p
1b130 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
1b140 49 54 45 5f 4f 4b 3b 0a 20 20 70 53 68 6d 4e 6f  ITE_OK;.  pShmNo
1b150 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65  de = p->pShmNode
1b160 3b 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 63  ;..  /* Remove c
1b170 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 66 72 6f 6d  onnection p from
1b180 20 74 68 65 20 73 65 74 20 6f 66 20 63 6f 6e 6e   the set of conn
1b190 65 63 74 69 6f 6e 73 20 61 73 73 6f 63 69 61 74  ections associat
1b1a0 65 64 0a 20 20 2a 2a 20 77 69 74 68 20 70 53 68  ed.  ** with pSh
1b1b0 6d 4e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74  mNode */.  sqlit
1b1c0 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70  e3_mutex_enter(p
1b1d0 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b  ShmNode->mutex);
1b1e0 0a 20 20 66 6f 72 28 70 70 3d 26 70 53 68 6d 4e  .  for(pp=&pShmN
1b1f0 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 28 2a 70  ode->pFirst; (*p
1b200 70 29 21 3d 70 3b 20 70 70 20 3d 20 26 28 2a 70  p)!=p; pp = &(*p
1b210 70 29 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20 2a  p)->pNext){}.  *
1b220 70 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 0a  pp = p->pNext;..
1b230 20 20 2f 2a 20 46 72 65 65 20 74 68 65 20 63 6f    /* Free the co
1b240 6e 6e 65 63 74 69 6f 6e 20 70 20 2a 2f 0a 20 20  nnection p */.  
1b250 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
1b260 0a 20 20 70 44 62 46 64 2d 3e 70 53 68 6d 20 3d  .  pDbFd->pShm =
1b270 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   0;.  sqlite3_mu
1b280 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f  tex_leave(pShmNo
1b290 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 0a 20 20 2f  de->mutex);..  /
1b2a0 2a 20 49 66 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  * If pShmNode->n
1b2b0 52 65 66 20 68 61 73 20 72 65 61 63 68 65 64 20  Ref has reached 
1b2c0 30 2c 20 74 68 65 6e 20 63 6c 6f 73 65 20 74 68  0, then close th
1b2d0 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a 20 20 2a  e underlying.  *
1b2e0 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  * shared-memory 
1b2f0 66 69 6c 65 2c 20 74 6f 6f 20 2a 2f 0a 20 20 77  file, too */.  w
1b300 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28  inShmEnterMutex(
1b310 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68  );.  assert( pSh
1b320 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3e 30 20 29 3b  mNode->nRef>0 );
1b330 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  .  pShmNode->nRe
1b340 66 2d 2d 3b 0a 20 20 69 66 28 20 70 53 68 6d 4e  f--;.  if( pShmN
1b350 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a  ode->nRef==0 ){.
1b360 20 20 20 20 77 69 6e 53 68 6d 50 75 72 67 65 28      winShmPurge(
1b370 70 44 62 46 64 2d 3e 70 56 66 73 2c 20 64 65 6c  pDbFd->pVfs, del
1b380 65 74 65 46 6c 61 67 29 3b 0a 20 20 7d 0a 20 20  eteFlag);.  }.  
1b390 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65 78  winShmLeaveMutex
1b3a0 28 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51  ();..  return SQ
1b3b0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
1b3c0 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6c 6f 63  * Change the loc
1b3d0 6b 20 73 74 61 74 65 20 66 6f 72 20 61 20 73 68  k state for a sh
1b3e0 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d  ared-memory segm
1b3f0 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ent..*/.static i
1b400 6e 74 20 77 69 6e 53 68 6d 4c 6f 63 6b 28 0a 20  nt winShmLock(. 
1b410 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66   sqlite3_file *f
1b420 64 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  d,          /* D
1b430 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 6f 6c  atabase file hol
1b440 64 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20  ding the shared 
1b450 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74 20  memory */.  int 
1b460 6f 66 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  ofst,           
1b470 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
1b480 6c 6f 63 6b 20 74 6f 20 61 63 71 75 69 72 65 20  lock to acquire 
1b490 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20  or release */.  
1b4a0 69 6e 74 20 6e 2c 20 20 20 20 20 20 20 20 20 20  int n,          
1b4b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1b4c0 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20 74 6f  mber of locks to
1b4d0 20 61 63 71 75 69 72 65 20 6f 72 20 72 65 6c 65   acquire or rele
1b4e0 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ase */.  int fla
1b4f0 67 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20  gs              
1b500 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64      /* What to d
1b510 6f 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20  o with the lock 
1b520 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20  */.){.  winFile 
1b530 2a 70 44 62 46 64 20 3d 20 28 77 69 6e 46 69 6c  *pDbFd = (winFil
1b540 65 2a 29 66 64 3b 20 20 20 20 20 20 20 20 2f 2a  e*)fd;        /*
1b550 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 68 6f 6c 64   Connection hold
1b560 69 6e 67 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  ing shared memor
1b570 79 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70  y */.  winShm *p
1b580 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 20   = pDbFd->pShm; 
1b590 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b5a0 54 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  The shared memor
1b5b0 79 20 62 65 69 6e 67 20 6c 6f 63 6b 65 64 20 2a  y being locked *
1b5c0 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70 58 3b 20  /.  winShm *pX; 
1b5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b5e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
1b5f0 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 61 6c   looping over al
1b600 6c 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 20 20  l siblings */.  
1b610 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d  winShmNode *pShm
1b620 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f  Node = p->pShmNo
1b630 64 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  de;.  int rc = S
1b640 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
1b650 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1b660 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20  esult code */.  
1b670 75 31 36 20 6d 61 73 6b 3b 20 20 20 20 20 20 20  u16 mask;       
1b680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b690 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
1b6a0 20 6c 6f 63 6b 73 20 74 6f 20 74 61 6b 65 20 6f   locks to take o
1b6b0 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 0a 20 20  r release */..  
1b6c0 61 73 73 65 72 74 28 20 6f 66 73 74 3e 3d 30 20  assert( ofst>=0 
1b6d0 26 26 20 6f 66 73 74 2b 6e 3c 3d 53 51 4c 49 54  && ofst+n<=SQLIT
1b6e0 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a 20  E_SHM_NLOCK );. 
1b6f0 20 61 73 73 65 72 74 28 20 6e 3e 3d 31 20 29 3b   assert( n>=1 );
1b700 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73  .  assert( flags
1b710 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f  ==(SQLITE_SHM_LO
1b720 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f  CK | SQLITE_SHM_
1b730 53 48 41 52 45 44 29 0a 20 20 20 20 20 20 20 7c  SHARED).       |
1b740 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45  | flags==(SQLITE
1b750 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49  _SHM_LOCK | SQLI
1b760 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45  TE_SHM_EXCLUSIVE
1b770 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67  ).       || flag
1b780 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55  s==(SQLITE_SHM_U
1b790 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53  NLOCK | SQLITE_S
1b7a0 48 4d 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20  HM_SHARED).     
1b7b0 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c    || flags==(SQL
1b7c0 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c  ITE_SHM_UNLOCK |
1b7d0 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c   SQLITE_SHM_EXCL
1b7e0 55 53 49 56 45 29 20 29 3b 0a 20 20 61 73 73 65  USIVE) );.  asse
1b7f0 72 74 28 20 6e 3d 3d 31 20 7c 7c 20 28 66 6c 61  rt( n==1 || (fla
1b800 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f  gs & SQLITE_SHM_
1b810 45 58 43 4c 55 53 49 56 45 29 21 3d 30 20 29 3b  EXCLUSIVE)!=0 );
1b820 0a 0a 20 20 6d 61 73 6b 20 3d 20 28 75 31 36 29  ..  mask = (u16)
1b830 28 28 31 55 3c 3c 28 6f 66 73 74 2b 6e 29 29 20  ((1U<<(ofst+n)) 
1b840 2d 20 28 31 55 3c 3c 6f 66 73 74 29 29 3b 0a 20  - (1U<<ofst));. 
1b850 20 61 73 73 65 72 74 28 20 6e 3e 31 20 7c 7c 20   assert( n>1 || 
1b860 6d 61 73 6b 3d 3d 28 31 3c 3c 6f 66 73 74 29 20  mask==(1<<ofst) 
1b870 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  );.  sqlite3_mut
1b880 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64  ex_enter(pShmNod
1b890 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28  e->mutex);.  if(
1b8a0 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f   flags & SQLITE_
1b8b0 53 48 4d 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20  SHM_UNLOCK ){.  
1b8c0 20 20 75 31 36 20 61 6c 6c 4d 61 73 6b 20 3d 20    u16 allMask = 
1b8d0 30 3b 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f  0; /* Mask of lo
1b8e0 63 6b 73 20 68 65 6c 64 20 62 79 20 73 69 62 6c  cks held by sibl
1b8f0 69 6e 67 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  ings */..    /* 
1b900 53 65 65 20 69 66 20 61 6e 79 20 73 69 62 6c 69  See if any sibli
1b910 6e 67 73 20 68 6f 6c 64 20 74 68 69 73 20 73 61  ngs hold this sa
1b920 6d 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 66  me lock */.    f
1b930 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e  or(pX=pShmNode->
1b940 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70  pFirst; pX; pX=p
1b950 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  X->pNext){.     
1b960 20 69 66 28 20 70 58 3d 3d 70 20 29 20 63 6f 6e   if( pX==p ) con
1b970 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 61 73 73  tinue;.      ass
1b980 65 72 74 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61  ert( (pX->exclMa
1b990 73 6b 20 26 20 28 70 2d 3e 65 78 63 6c 4d 61 73  sk & (p->exclMas
1b9a0 6b 7c 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 29  k|p->sharedMask)
1b9b0 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 6c  )==0 );.      al
1b9c0 6c 4d 61 73 6b 20 7c 3d 20 70 58 2d 3e 73 68 61  lMask |= pX->sha
1b9d0 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a  redMask;.    }..
1b9e0 20 20 20 20 2f 2a 20 55 6e 6c 6f 63 6b 20 74 68      /* Unlock th
1b9f0 65 20 73 79 73 74 65 6d 2d 6c 65 76 65 6c 20 6c  e system-level l
1ba00 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28 20  ocks */.    if( 
1ba10 28 6d 61 73 6b 20 26 20 61 6c 6c 4d 61 73 6b 29  (mask & allMask)
1ba20 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
1ba30 3d 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f  = winShmSystemLo
1ba40 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48  ck(pShmNode, _SH
1ba50 4d 5f 55 4e 4c 43 4b 2c 20 6f 66 73 74 2b 57 49  M_UNLCK, ofst+WI
1ba60 4e 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a  N_SHM_BASE, n);.
1ba70 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1ba80 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1ba90 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55  .    }..    /* U
1baa0 6e 64 6f 20 74 68 65 20 6c 6f 63 61 6c 20 6c 6f  ndo the local lo
1bab0 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 72  cks */.    if( r
1bac0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1bad0 20 20 20 20 20 20 70 2d 3e 65 78 63 6c 4d 61 73        p->exclMas
1bae0 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20  k &= ~mask;.    
1baf0 20 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20    p->sharedMask 
1bb00 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d 20  &= ~mask;.    } 
1bb10 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61  .  }else if( fla
1bb20 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f  gs & SQLITE_SHM_
1bb30 53 48 41 52 45 44 20 29 7b 0a 20 20 20 20 75 31  SHARED ){.    u1
1bb40 36 20 61 6c 6c 53 68 61 72 65 64 20 3d 20 30 3b  6 allShared = 0;
1bb50 20 20 2f 2a 20 55 6e 69 6f 6e 20 6f 66 20 6c 6f    /* Union of lo
1bb60 63 6b 73 20 68 65 6c 64 20 62 79 20 63 6f 6e 6e  cks held by conn
1bb70 65 63 74 69 6f 6e 73 20 6f 74 68 65 72 20 74 68  ections other th
1bb80 61 6e 20 22 70 22 20 2a 2f 0a 0a 20 20 20 20 2f  an "p" */..    /
1bb90 2a 20 46 69 6e 64 20 6f 75 74 20 77 68 69 63 68  * Find out which
1bba0 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 61 72   shared locks ar
1bbb0 65 20 61 6c 72 65 61 64 79 20 68 65 6c 64 20 62  e already held b
1bbc0 79 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63  y sibling connec
1bbd0 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20 49 66  tions..    ** If
1bbe0 20 61 6e 79 20 73 69 62 6c 69 6e 67 20 61 6c 72   any sibling alr
1bbf0 65 61 64 79 20 68 6f 6c 64 73 20 61 6e 20 65 78  eady holds an ex
1bc00 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20 67 6f  clusive lock, go
1bc10 20 61 68 65 61 64 20 61 6e 64 20 72 65 74 75 72   ahead and retur
1bc20 6e 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f  n.    ** SQLITE_
1bc30 42 55 53 59 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  BUSY..    */.   
1bc40 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65   for(pX=pShmNode
1bc50 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58  ->pFirst; pX; pX
1bc60 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  =pX->pNext){.   
1bc70 20 20 20 69 66 28 20 28 70 58 2d 3e 65 78 63 6c     if( (pX->excl
1bc80 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20  Mask & mask)!=0 
1bc90 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1bca0 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
1bcb0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1bcc0 20 20 7d 0a 20 20 20 20 20 20 61 6c 6c 53 68 61    }.      allSha
1bcd0 72 65 64 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65  red |= pX->share
1bce0 64 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  dMask;.    }..  
1bcf0 20 20 2f 2a 20 47 65 74 20 73 68 61 72 65 64 20    /* Get shared 
1bd00 6c 6f 63 6b 73 20 61 74 20 74 68 65 20 73 79 73  locks at the sys
1bd10 74 65 6d 20 6c 65 76 65 6c 2c 20 69 66 20 6e 65  tem level, if ne
1bd20 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 20 20 69  cessary */.    i
1bd30 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1bd40 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 61   ){.      if( (a
1bd50 6c 6c 53 68 61 72 65 64 20 26 20 6d 61 73 6b 29  llShared & mask)
1bd60 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
1bd70 63 20 3d 20 77 69 6e 53 68 6d 53 79 73 74 65 6d  c = winShmSystem
1bd80 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f  Lock(pShmNode, _
1bd90 53 48 4d 5f 52 44 4c 43 4b 2c 20 6f 66 73 74 2b  SHM_RDLCK, ofst+
1bda0 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29  WIN_SHM_BASE, n)
1bdb0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1bdc0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
1bdd0 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
1bde0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74     }..    /* Get
1bdf0 20 74 68 65 20 6c 6f 63 61 6c 20 73 68 61 72 65   the local share
1be00 64 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69  d locks */.    i
1be10 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1be20 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 73 68 61   ){.      p->sha
1be30 72 65 64 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b  redMask |= mask;
1be40 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
1be50 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65      /* Make sure
1be60 20 6e 6f 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e   no sibling conn
1be70 65 63 74 69 6f 6e 73 20 68 6f 6c 64 20 6c 6f 63  ections hold loc
1be80 6b 73 20 74 68 61 74 20 77 69 6c 6c 20 62 6c 6f  ks that will blo
1be90 63 6b 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 6c  ck this.    ** l
1bea0 6f 63 6b 2e 20 20 49 66 20 61 6e 79 20 64 6f 2c  ock.  If any do,
1beb0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
1bec0 55 53 59 20 72 69 67 68 74 20 61 77 61 79 2e 0a  USY right away..
1bed0 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70      */.    for(p
1bee0 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72  X=pShmNode->pFir
1bef0 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70  st; pX; pX=pX->p
1bf00 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28  Next){.      if(
1bf10 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26   (pX->exclMask &
1bf20 20 6d 61 73 6b 29 21 3d 30 20 7c 7c 20 28 70 58   mask)!=0 || (pX
1bf30 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 20 6d  ->sharedMask & m
1bf40 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ask)!=0 ){.     
1bf50 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
1bf60 55 53 59 3b 0a 20 20 20 20 20 20 20 20 62 72 65  USY;.        bre
1bf70 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
1bf80 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 47 65 74 20  }.  .    /* Get 
1bf90 74 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f  the exclusive lo
1bfa0 63 6b 73 20 61 74 20 74 68 65 20 73 79 73 74 65  cks at the syste
1bfb0 6d 20 6c 65 76 65 6c 2e 20 20 54 68 65 6e 20 69  m level.  Then i
1bfc0 66 20 73 75 63 63 65 73 73 66 75 6c 0a 20 20 20  f successful.   
1bfd0 20 2a 2a 20 61 6c 73 6f 20 6d 61 72 6b 20 74 68   ** also mark th
1bfe0 65 20 6c 6f 63 61 6c 20 63 6f 6e 6e 65 63 74 69  e local connecti
1bff0 6f 6e 20 61 73 20 62 65 69 6e 67 20 6c 6f 63 6b  on as being lock
1c000 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
1c010 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1c020 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77   ){.      rc = w
1c030 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28  inShmSystemLock(
1c040 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 57  pShmNode, _SHM_W
1c050 52 4c 43 4b 2c 20 6f 66 73 74 2b 57 49 4e 5f 53  RLCK, ofst+WIN_S
1c060 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20  HM_BASE, n);.   
1c070 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1c080 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1c090 61 73 73 65 72 74 28 20 28 70 2d 3e 73 68 61 72  assert( (p->shar
1c0a0 65 64 4d 61 73 6b 20 26 20 6d 61 73 6b 29 3d 3d  edMask & mask)==
1c0b0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  0 );.        p->
1c0c0 65 78 63 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b  exclMask |= mask
1c0d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1c0e0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
1c0f0 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f  tex_leave(pShmNo
1c100 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 4f 53  de->mutex);.  OS
1c110 54 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b  TRACE(("SHM-LOCK
1c120 20 70 69 64 3d 25 6c 75 2c 20 69 64 3d 25 64 2c   pid=%lu, id=%d,
1c130 20 73 68 61 72 65 64 4d 61 73 6b 3d 25 30 33 78   sharedMask=%03x
1c140 2c 20 65 78 63 6c 4d 61 73 6b 3d 25 30 33 78 2c  , exclMask=%03x,
1c150 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20   rc=%s\n",.     
1c160 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65        osGetCurre
1c170 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70  ntProcessId(), p
1c180 2d 3e 69 64 2c 20 70 2d 3e 73 68 61 72 65 64 4d  ->id, p->sharedM
1c190 61 73 6b 2c 20 70 2d 3e 65 78 63 6c 4d 61 73 6b  ask, p->exclMask
1c1a0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  ,.           sql
1c1b0 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29  ite3ErrName(rc))
1c1c0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1c1d0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  }../*.** Impleme
1c1e0 6e 74 20 61 20 6d 65 6d 6f 72 79 20 62 61 72 72  nt a memory barr
1c1f0 69 65 72 20 6f 72 20 6d 65 6d 6f 72 79 20 66 65  ier or memory fe
1c200 6e 63 65 20 6f 6e 20 73 68 61 72 65 64 20 6d 65  nce on shared me
1c210 6d 6f 72 79 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 6c  mory.  .**.** Al
1c220 6c 20 6c 6f 61 64 73 20 61 6e 64 20 73 74 6f 72  l loads and stor
1c230 65 73 20 62 65 67 75 6e 20 62 65 66 6f 72 65 20  es begun before 
1c240 74 68 65 20 62 61 72 72 69 65 72 20 6d 75 73 74  the barrier must
1c250 20 63 6f 6d 70 6c 65 74 65 20 62 65 66 6f 72 65   complete before
1c260 0a 2a 2a 20 61 6e 79 20 6c 6f 61 64 20 6f 72 20  .** any load or 
1c270 73 74 6f 72 65 20 62 65 67 75 6e 20 61 66 74 65  store begun afte
1c280 72 20 74 68 65 20 62 61 72 72 69 65 72 2e 0a 2a  r the barrier..*
1c290 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69  /.static void wi
1c2a0 6e 53 68 6d 42 61 72 72 69 65 72 28 0a 20 20 73  nShmBarrier(.  s
1c2b0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 20  qlite3_file *fd 
1c2c0 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
1c2d0 62 61 73 65 20 68 6f 6c 64 69 6e 67 20 74 68 65  base holding the
1c2e0 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a   shared memory *
1c2f0 2f 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  /.){.  UNUSED_PA
1c300 52 41 4d 45 54 45 52 28 66 64 29 3b 0a 20 20 2f  RAMETER(fd);.  /
1c310 2a 20 4d 65 6d 6f 72 79 42 61 72 72 69 65 72 28  * MemoryBarrier(
1c320 29 3b 20 2f 2f 20 64 6f 65 73 20 6e 6f 74 20 77  ); // does not w
1c330 6f 72 6b 20 2d 2d 20 64 6f 20 6e 6f 74 20 6b 6e  ork -- do not kn
1c340 6f 77 20 77 68 79 20 6e 6f 74 20 2a 2f 0a 20 20  ow why not */.  
1c350 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78  winShmEnterMutex
1c360 28 29 3b 0a 20 20 77 69 6e 53 68 6d 4c 65 61 76  ();.  winShmLeav
1c370 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 0a 2f 2a 0a  eMutex();.}../*.
1c380 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1c390 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62   is called to ob
1c3a0 74 61 69 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  tain a pointer t
1c3b0 6f 20 72 65 67 69 6f 6e 20 69 52 65 67 69 6f 6e  o region iRegion
1c3c0 20 6f 66 20 74 68 65 20 0a 2a 2a 20 73 68 61 72   of the .** shar
1c3d0 65 64 2d 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69  ed-memory associ
1c3e0 61 74 65 64 20 77 69 74 68 20 74 68 65 20 64 61  ated with the da
1c3f0 74 61 62 61 73 65 20 66 69 6c 65 20 66 64 2e 20  tabase file fd. 
1c400 53 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65  Shared-memory re
1c410 67 69 6f 6e 73 20 0a 2a 2a 20 61 72 65 20 6e 75  gions .** are nu
1c420 6d 62 65 72 65 64 20 73 74 61 72 74 69 6e 67 20  mbered starting 
1c430 66 72 6f 6d 20 7a 65 72 6f 2e 20 45 61 63 68 20  from zero. Each 
1c440 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65  shared-memory re
1c450 67 69 6f 6e 20 69 73 20 73 7a 52 65 67 69 6f 6e  gion is szRegion
1c460 20 0a 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69   .** bytes in si
1c470 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ze..**.** If an 
1c480 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e  error occurs, an
1c490 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
1c4a0 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 20  eturned and *pp 
1c4b0 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a  is set to NULL..
1c4c0 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
1c4d0 20 69 66 20 74 68 65 20 69 73 57 72 69 74 65 20   if the isWrite 
1c4e0 70 61 72 61 6d 65 74 65 72 20 69 73 20 30 20 61  parameter is 0 a
1c4f0 6e 64 20 74 68 65 20 72 65 71 75 65 73 74 65 64  nd the requested
1c500 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 0a 2a   shared-memory.*
1c510 2a 20 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74  * region has not
1c520 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
1c530 28 62 79 20 61 6e 79 20 63 6c 69 65 6e 74 2c 20  (by any client, 
1c540 69 6e 63 6c 75 64 69 6e 67 20 6f 6e 65 20 72 75  including one ru
1c550 6e 6e 69 6e 67 20 69 6e 20 61 0a 2a 2a 20 73 65  nning in a.** se
1c560 70 61 72 61 74 65 20 70 72 6f 63 65 73 73 29 2c  parate process),
1c570 20 74 68 65 6e 20 2a 70 70 20 69 73 20 73 65 74   then *pp is set
1c580 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 53 51 4c   to NULL and SQL
1c590 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
1c5a0 20 49 66 20 0a 2a 2a 20 69 73 57 72 69 74 65 20   If .** isWrite 
1c5b0 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64 20  is non-zero and 
1c5c0 74 68 65 20 72 65 71 75 65 73 74 65 64 20 73 68  the requested sh
1c5d0 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69  ared-memory regi
1c5e0 6f 6e 20 68 61 73 20 6e 6f 74 20 79 65 74 20 0a  on has not yet .
1c5f0 2a 2a 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  ** been allocate
1c600 64 2c 20 69 74 20 69 73 20 61 6c 6c 6f 63 61 74  d, it is allocat
1c610 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
1c620 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ion..**.** If th
1c630 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  e shared-memory 
1c640 72 65 67 69 6f 6e 20 68 61 73 20 61 6c 72 65 61  region has alrea
1c650 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  dy been allocate
1c660 64 20 6f 72 20 69 73 20 61 6c 6c 6f 63 61 74 65  d or is allocate
1c670 64 20 62 79 0a 2a 2a 20 74 68 69 73 20 63 61 6c  d by.** this cal
1c680 6c 20 61 73 20 64 65 73 63 72 69 62 65 64 20 61  l as described a
1c690 62 6f 76 65 2c 20 74 68 65 6e 20 69 74 20 69 73  bove, then it is
1c6a0 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 74 68 69   mapped into thi
1c6b0 73 20 70 72 6f 63 65 73 73 65 73 20 0a 2a 2a 20  s processes .** 
1c6c0 61 64 64 72 65 73 73 20 73 70 61 63 65 20 28 69  address space (i
1c6d0 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65  f it is not alre
1c6e0 61 64 79 29 2c 20 2a 70 70 20 69 73 20 73 65 74  ady), *pp is set
1c6f0 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
1c700 20 6d 61 70 70 65 64 20 0a 2a 2a 20 6d 65 6d 6f   mapped .** memo
1c710 72 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b  ry and SQLITE_OK
1c720 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
1c730 61 74 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 4d  atic int winShmM
1c740 61 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  ap(.  sqlite3_fi
1c750 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20  le *fd,         
1c760 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20        /* Handle 
1c770 6f 70 65 6e 20 6f 6e 20 64 61 74 61 62 61 73 65  open on database
1c780 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69   file */.  int i
1c790 52 65 67 69 6f 6e 2c 20 20 20 20 20 20 20 20 20  Region,         
1c7a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1c7b0 67 69 6f 6e 20 74 6f 20 72 65 74 72 69 65 76 65  gion to retrieve
1c7c0 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 52 65 67 69   */.  int szRegi
1c7d0 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  on,             
1c7e0 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
1c7f0 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e   regions */.  in
1c800 74 20 69 73 57 72 69 74 65 2c 20 20 20 20 20 20  t isWrite,      
1c810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c820 20 54 72 75 65 20 74 6f 20 65 78 74 65 6e 64 20   True to extend 
1c830 66 69 6c 65 20 69 66 20 6e 65 63 65 73 73 61 72  file if necessar
1c840 79 20 2a 2f 0a 20 20 76 6f 69 64 20 76 6f 6c 61  y */.  void vola
1c850 74 69 6c 65 20 2a 2a 70 70 20 20 20 20 20 20 20  tile **pp       
1c860 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d         /* OUT: M
1c870 61 70 70 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a  apped memory */.
1c880 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 44  ){.  winFile *pD
1c890 62 46 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29  bFd = (winFile*)
1c8a0 66 64 3b 0a 20 20 77 69 6e 53 68 6d 20 2a 70 20  fd;.  winShm *p 
1c8b0 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20  = pDbFd->pShm;. 
1c8c0 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68   winShmNode *pSh
1c8d0 6d 4e 6f 64 65 3b 0a 20 20 69 6e 74 20 72 63 20  mNode;.  int rc 
1c8e0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
1c8f0 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20 72 63  if( !p ){.    rc
1c900 20 3d 20 77 69 6e 4f 70 65 6e 53 68 61 72 65 64   = winOpenShared
1c910 4d 65 6d 6f 72 79 28 70 44 62 46 64 29 3b 0a 20  Memory(pDbFd);. 
1c920 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1c930 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
1c940 3b 0a 20 20 20 20 70 20 3d 20 70 44 62 46 64 2d  ;.    p = pDbFd-
1c950 3e 70 53 68 6d 3b 0a 20 20 7d 0a 20 20 70 53 68  >pShm;.  }.  pSh
1c960 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e  mNode = p->pShmN
1c970 6f 64 65 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f  ode;..  sqlite3_
1c980 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d  mutex_enter(pShm
1c990 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  Node->mutex);.  
1c9a0 61 73 73 65 72 74 28 20 73 7a 52 65 67 69 6f 6e  assert( szRegion
1c9b0 3d 3d 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65  ==pShmNode->szRe
1c9c0 67 69 6f 6e 20 7c 7c 20 70 53 68 6d 4e 6f 64 65  gion || pShmNode
1c9d0 2d 3e 6e 52 65 67 69 6f 6e 3d 3d 30 20 29 3b 0a  ->nRegion==0 );.
1c9e0 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d  .  if( pShmNode-
1c9f0 3e 6e 52 65 67 69 6f 6e 3c 3d 69 52 65 67 69 6f  >nRegion<=iRegio
1ca00 6e 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  n ){.    struct 
1ca10 53 68 6d 52 65 67 69 6f 6e 20 2a 61 70 4e 65 77  ShmRegion *apNew
1ca20 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
1ca30 65 77 20 61 52 65 67 69 6f 6e 5b 5d 20 61 72 72  ew aRegion[] arr
1ca40 61 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42  ay */.    int nB
1ca50 79 74 65 20 3d 20 28 69 52 65 67 69 6f 6e 2b 31  yte = (iRegion+1
1ca60 29 2a 73 7a 52 65 67 69 6f 6e 3b 20 20 2f 2a 20  )*szRegion;  /* 
1ca70 4d 69 6e 69 6d 75 6d 20 72 65 71 75 69 72 65 64  Minimum required
1ca80 20 66 69 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20   file size */.  
1ca90 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
1caa0 73 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  sz;             
1cab0 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
1cac0 73 69 7a 65 20 6f 66 20 77 61 6c 2d 69 6e 64 65  size of wal-inde
1cad0 78 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 70  x file */..    p
1cae0 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f  ShmNode->szRegio
1caf0 6e 20 3d 20 73 7a 52 65 67 69 6f 6e 3b 0a 0a 20  n = szRegion;.. 
1cb00 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73     /* The reques
1cb10 74 65 64 20 72 65 67 69 6f 6e 20 69 73 20 6e 6f  ted region is no
1cb20 74 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 74 68  t mapped into th
1cb30 69 73 20 70 72 6f 63 65 73 73 65 73 20 61 64 64  is processes add
1cb40 72 65 73 73 20 73 70 61 63 65 2e 0a 20 20 20 20  ress space..    
1cb50 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  ** Check to see 
1cb60 69 66 20 69 74 20 68 61 73 20 62 65 65 6e 20 61  if it has been a
1cb70 6c 6c 6f 63 61 74 65 64 20 28 69 2e 65 2e 20 69  llocated (i.e. i
1cb80 66 20 74 68 65 20 77 61 6c 2d 69 6e 64 65 78 20  f the wal-index 
1cb90 66 69 6c 65 20 69 73 0a 20 20 20 20 2a 2a 20 6c  file is.    ** l
1cba0 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 63  arge enough to c
1cbb0 6f 6e 74 61 69 6e 20 74 68 65 20 72 65 71 75 65  ontain the reque
1cbc0 73 74 65 64 20 72 65 67 69 6f 6e 29 2e 0a 20 20  sted region)..  
1cbd0 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 77 69    */.    rc = wi
1cbe0 6e 46 69 6c 65 53 69 7a 65 28 28 73 71 6c 69 74  nFileSize((sqlit
1cbf0 65 33 5f 66 69 6c 65 20 2a 29 26 70 53 68 6d 4e  e3_file *)&pShmN
1cc00 6f 64 65 2d 3e 68 46 69 6c 65 2c 20 26 73 7a 29  ode->hFile, &sz)
1cc10 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
1cc20 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1cc30 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f   rc = winLogErro
1cc40 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  r(SQLITE_IOERR_S
1cc50 48 4d 53 49 5a 45 2c 20 6f 73 47 65 74 4c 61 73  HMSIZE, osGetLas
1cc60 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20  tError(),.      
1cc70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cc80 20 22 77 69 6e 53 68 6d 4d 61 70 31 22 2c 20 70   "winShmMap1", p
1cc90 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  DbFd->zPath);.  
1cca0 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65      goto shmpage
1ccb0 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  _out;.    }..   
1ccc0 20 69 66 28 20 73 7a 3c 6e 42 79 74 65 20 29 7b   if( sz<nByte ){
1ccd0 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65  .      /* The re
1cce0 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72  quested memory r
1ccf0 65 67 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 65  egion does not e
1cd00 78 69 73 74 2e 20 49 66 20 69 73 57 72 69 74 65  xist. If isWrite
1cd10 20 69 73 20 73 65 74 20 74 6f 0a 20 20 20 20 20   is set to.     
1cd20 20 2a 2a 20 7a 65 72 6f 2c 20 65 78 69 74 20 65   ** zero, exit e
1cd30 61 72 6c 79 2e 20 2a 70 70 20 77 69 6c 6c 20 62  arly. *pp will b
1cd40 65 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e  e set to NULL an
1cd50 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
1cd60 72 6e 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  rned..      **. 
1cd70 20 20 20 20 20 2a 2a 20 41 6c 74 65 72 6e 61 74       ** Alternat
1cd80 69 76 65 6c 79 2c 20 69 66 20 69 73 57 72 69 74  ively, if isWrit
1cd90 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 75  e is non-zero, u
1cda0 73 65 20 66 74 72 75 6e 63 61 74 65 28 29 20 74  se ftruncate() t
1cdb0 6f 20 61 6c 6c 6f 63 61 74 65 0a 20 20 20 20 20  o allocate.     
1cdc0 20 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65   ** the requeste
1cdd0 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 2e  d memory region.
1cde0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1cdf0 69 66 28 20 21 69 73 57 72 69 74 65 20 29 20 67  if( !isWrite ) g
1ce00 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b  oto shmpage_out;
1ce10 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 54  .      rc = winT
1ce20 72 75 6e 63 61 74 65 28 28 73 71 6c 69 74 65 33  runcate((sqlite3
1ce30 5f 66 69 6c 65 20 2a 29 26 70 53 68 6d 4e 6f 64  _file *)&pShmNod
1ce40 65 2d 3e 68 46 69 6c 65 2c 20 6e 42 79 74 65 29  e->hFile, nByte)
1ce50 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
1ce60 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1ce70 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67       rc = winLog
1ce80 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
1ce90 52 52 5f 53 48 4d 53 49 5a 45 2c 20 6f 73 47 65  RR_SHMSIZE, osGe
1cea0 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20  tLastError(),.  
1ceb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cec0 20 20 20 20 20 20 20 22 77 69 6e 53 68 6d 4d 61         "winShmMa
1ced0 70 32 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74  p2", pDbFd->zPat
1cee0 68 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  h);.        goto
1cef0 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20   shmpage_out;.  
1cf00 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
1cf10 20 2f 2a 20 4d 61 70 20 74 68 65 20 72 65 71 75   /* Map the requ
1cf20 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72 65 67  ested memory reg
1cf30 69 6f 6e 20 69 6e 74 6f 20 74 68 69 73 20 70 72  ion into this pr
1cf40 6f 63 65 73 73 65 73 20 61 64 64 72 65 73 73 20  ocesses address 
1cf50 73 70 61 63 65 2e 20 2a 2f 0a 20 20 20 20 61 70  space. */.    ap
1cf60 4e 65 77 20 3d 20 28 73 74 72 75 63 74 20 53 68  New = (struct Sh
1cf70 6d 52 65 67 69 6f 6e 20 2a 29 73 71 6c 69 74 65  mRegion *)sqlite
1cf80 33 5f 72 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20  3_realloc(.     
1cf90 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65     pShmNode->aRe
1cfa0 67 69 6f 6e 2c 20 28 69 52 65 67 69 6f 6e 2b 31  gion, (iRegion+1
1cfb0 29 2a 73 69 7a 65 6f 66 28 61 70 4e 65 77 5b 30  )*sizeof(apNew[0
1cfc0 5d 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66  ]).    );.    if
1cfd0 28 20 21 61 70 4e 65 77 20 29 7b 0a 20 20 20 20  ( !apNew ){.    
1cfe0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
1cff0 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ERR_NOMEM;.     
1d000 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75   goto shmpage_ou
1d010 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 68  t;.    }.    pSh
1d020 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 20 3d  mNode->aRegion =
1d030 20 61 70 4e 65 77 3b 0a 0a 20 20 20 20 77 68 69   apNew;..    whi
1d040 6c 65 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  le( pShmNode->nR
1d050 65 67 69 6f 6e 3c 3d 69 52 65 67 69 6f 6e 20 29  egion<=iRegion )
1d060 7b 0a 20 20 20 20 20 20 48 41 4e 44 4c 45 20 68  {.      HANDLE h
1d070 4d 61 70 20 3d 20 4e 55 4c 4c 3b 20 20 20 20 20  Map = NULL;     
1d080 20 20 20 20 2f 2a 20 66 69 6c 65 2d 6d 61 70 70      /* file-mapp
1d090 69 6e 67 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ing handle */.  
1d0a0 20 20 20 20 76 6f 69 64 20 2a 70 4d 61 70 20 3d      void *pMap =
1d0b0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1d0c0 2f 2a 20 4d 61 70 70 65 64 20 6d 65 6d 6f 72 79  /* Mapped memory
1d0d0 20 72 65 67 69 6f 6e 20 2a 2f 0a 20 20 20 20 20   region */.     
1d0e0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
1d0f0 49 4e 52 54 0a 20 20 20 20 20 20 68 4d 61 70 20  INRT.      hMap 
1d100 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61  = osCreateFileMa
1d110 70 70 69 6e 67 46 72 6f 6d 41 70 70 28 70 53 68  ppingFromApp(pSh
1d120 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2e 68 2c 0a  mNode->hFile.h,.
1d130 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 20            NULL, 
1d140 50 41 47 45 5f 52 45 41 44 57 52 49 54 45 2c 20  PAGE_READWRITE, 
1d150 6e 42 79 74 65 2c 20 4e 55 4c 4c 0a 20 20 20 20  nByte, NULL.    
1d160 20 20 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e    );.#elif defin
1d170 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
1d180 48 41 53 5f 57 49 44 45 29 0a 20 20 20 20 20 20  HAS_WIDE).      
1d190 68 4d 61 70 20 3d 20 6f 73 43 72 65 61 74 65 46  hMap = osCreateF
1d1a0 69 6c 65 4d 61 70 70 69 6e 67 57 28 70 53 68 6d  ileMappingW(pShm
1d1b0 4e 6f 64 65 2d 3e 68 46 69 6c 65 2e 68 2c 20 0a  Node->hFile.h, .
1d1c0 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 20            NULL, 
1d1d0 50 41 47 45 5f 52 45 41 44 57 52 49 54 45 2c 20  PAGE_READWRITE, 
1d1e0 30 2c 20 6e 42 79 74 65 2c 20 4e 55 4c 4c 0a 20  0, nByte, NULL. 
1d1f0 20 20 20 20 20 29 3b 0a 23 65 6c 69 66 20 64 65       );.#elif de
1d200 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
1d210 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 20  32_HAS_ANSI).   
1d220 20 20 20 68 4d 61 70 20 3d 20 6f 73 43 72 65 61     hMap = osCrea
1d230 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 41 28 70  teFileMappingA(p
1d240 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2e 68  ShmNode->hFile.h
1d250 2c 20 0a 20 20 20 20 20 20 20 20 20 20 4e 55 4c  , .          NUL
1d260 4c 2c 20 50 41 47 45 5f 52 45 41 44 57 52 49 54  L, PAGE_READWRIT
1d270 45 2c 20 30 2c 20 6e 42 79 74 65 2c 20 4e 55 4c  E, 0, nByte, NUL
1d280 4c 0a 20 20 20 20 20 20 29 3b 0a 23 65 6e 64 69  L.      );.#endi
1d290 66 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  f.      OSTRACE(
1d2a0 28 22 53 48 4d 2d 4d 41 50 2d 43 52 45 41 54 45  ("SHM-MAP-CREATE
1d2b0 20 70 69 64 3d 25 6c 75 2c 20 72 65 67 69 6f 6e   pid=%lu, region
1d2c0 3d 25 64 2c 20 73 69 7a 65 3d 25 64 2c 20 72 63  =%d, size=%d, rc
1d2d0 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%s\n",.        
1d2e0 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72         osGetCurr
1d2f0 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
1d300 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f  pShmNode->nRegio
1d310 6e 2c 20 6e 42 79 74 65 2c 0a 20 20 20 20 20 20  n, nByte,.      
1d320 20 20 20 20 20 20 20 20 20 68 4d 61 70 20 3f 20           hMap ? 
1d330 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29  "ok" : "failed")
1d340 29 3b 0a 20 20 20 20 20 20 69 66 28 20 68 4d 61  );.      if( hMa
1d350 70 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  p ){.        int
1d360 20 69 4f 66 66 73 65 74 20 3d 20 70 53 68 6d 4e   iOffset = pShmN
1d370 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2a 73 7a 52  ode->nRegion*szR
1d380 65 67 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20 69  egion;.        i
1d390 6e 74 20 69 4f 66 66 73 65 74 53 68 69 66 74 20  nt iOffsetShift 
1d3a0 3d 20 69 4f 66 66 73 65 74 20 25 20 77 69 6e 53  = iOffset % winS
1d3b0 79 73 49 6e 66 6f 2e 64 77 41 6c 6c 6f 63 61 74  ysInfo.dwAllocat
1d3c0 69 6f 6e 47 72 61 6e 75 6c 61 72 69 74 79 3b 0a  ionGranularity;.
1d3d0 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
1d3e0 4e 52 54 0a 20 20 20 20 20 20 20 20 70 4d 61 70  NRT.        pMap
1d3f0 20 3d 20 6f 73 4d 61 70 56 69 65 77 4f 66 46 69   = osMapViewOfFi
1d400 6c 65 46 72 6f 6d 41 70 70 28 68 4d 61 70 2c 20  leFromApp(hMap, 
1d410 46 49 4c 45 5f 4d 41 50 5f 57 52 49 54 45 20 7c  FILE_MAP_WRITE |
1d420 20 46 49 4c 45 5f 4d 41 50 5f 52 45 41 44 2c 0a   FILE_MAP_READ,.
1d430 20 20 20 20 20 20 20 20 20 20 20 20 69 4f 66 66              iOff
1d440 73 65 74 20 2d 20 69 4f 66 66 73 65 74 53 68 69  set - iOffsetShi
1d450 66 74 2c 20 73 7a 52 65 67 69 6f 6e 20 2b 20 69  ft, szRegion + i
1d460 4f 66 66 73 65 74 53 68 69 66 74 0a 20 20 20 20  OffsetShift.    
1d470 20 20 20 20 29 3b 0a 23 65 6c 73 65 0a 20 20 20      );.#else.   
1d480 20 20 20 20 20 70 4d 61 70 20 3d 20 6f 73 4d 61       pMap = osMa
1d490 70 56 69 65 77 4f 66 46 69 6c 65 28 68 4d 61 70  pViewOfFile(hMap
1d4a0 2c 20 46 49 4c 45 5f 4d 41 50 5f 57 52 49 54 45  , FILE_MAP_WRITE
1d4b0 20 7c 20 46 49 4c 45 5f 4d 41 50 5f 52 45 41 44   | FILE_MAP_READ
1d4c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 30 2c  ,.            0,
1d4d0 20 69 4f 66 66 73 65 74 20 2d 20 69 4f 66 66 73   iOffset - iOffs
1d4e0 65 74 53 68 69 66 74 2c 20 73 7a 52 65 67 69 6f  etShift, szRegio
1d4f0 6e 20 2b 20 69 4f 66 66 73 65 74 53 68 69 66 74  n + iOffsetShift
1d500 0a 20 20 20 20 20 20 20 20 29 3b 0a 23 65 6e 64  .        );.#end
1d510 69 66 0a 20 20 20 20 20 20 20 20 4f 53 54 52 41  if.        OSTRA
1d520 43 45 28 28 22 53 48 4d 2d 4d 41 50 2d 4d 41 50  CE(("SHM-MAP-MAP
1d530 20 70 69 64 3d 25 6c 75 2c 20 72 65 67 69 6f 6e   pid=%lu, region
1d540 3d 25 64 2c 20 6f 66 66 73 65 74 3d 25 64 2c 20  =%d, offset=%d, 
1d550 73 69 7a 65 3d 25 64 2c 20 72 63 3d 25 73 5c 6e  size=%d, rc=%s\n
1d560 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1d570 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74      osGetCurrent
1d580 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 53 68  ProcessId(), pSh
1d590 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2c 20  mNode->nRegion, 
1d5a0 69 4f 66 66 73 65 74 2c 0a 20 20 20 20 20 20 20  iOffset,.       
1d5b0 20 20 20 20 20 20 20 20 20 20 73 7a 52 65 67 69            szRegi
1d5c0 6f 6e 2c 20 70 4d 61 70 20 3f 20 22 6f 6b 22 20  on, pMap ? "ok" 
1d5d0 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20  : "failed"));.  
1d5e0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1d5f0 21 70 4d 61 70 20 29 7b 0a 20 20 20 20 20 20 20  !pMap ){.       
1d600 20 70 53 68 6d 4e 6f 64 65 2d 3e 6c 61 73 74 45   pShmNode->lastE
1d610 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
1d620 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 20  Error();.       
1d630 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f   rc = winLogErro
1d640 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  r(SQLITE_IOERR_S
1d650 48 4d 4d 41 50 2c 20 70 53 68 6d 4e 6f 64 65 2d  HMMAP, pShmNode-
1d660 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20  >lastErrno,.    
1d670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d680 20 20 20 20 20 22 77 69 6e 53 68 6d 4d 61 70 33       "winShmMap3
1d690 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29  ", pDbFd->zPath)
1d6a0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 68 4d  ;.        if( hM
1d6b0 61 70 20 29 20 6f 73 43 6c 6f 73 65 48 61 6e 64  ap ) osCloseHand
1d6c0 6c 65 28 68 4d 61 70 29 3b 0a 20 20 20 20 20 20  le(hMap);.      
1d6d0 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f    goto shmpage_o
1d6e0 75 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ut;.      }..   
1d6f0 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65     pShmNode->aRe
1d700 67 69 6f 6e 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e  gion[pShmNode->n
1d710 52 65 67 69 6f 6e 5d 2e 70 4d 61 70 20 3d 20 70  Region].pMap = p
1d720 4d 61 70 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e  Map;.      pShmN
1d730 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 5b 70 53 68  ode->aRegion[pSh
1d740 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 5d 2e  mNode->nRegion].
1d750 68 4d 61 70 20 3d 20 68 4d 61 70 3b 0a 20 20 20  hMap = hMap;.   
1d760 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65     pShmNode->nRe
1d770 67 69 6f 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  gion++;.    }.  
1d780 7d 0a 0a 73 68 6d 70 61 67 65 5f 6f 75 74 3a 0a  }..shmpage_out:.
1d790 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e    if( pShmNode->
1d7a0 6e 52 65 67 69 6f 6e 3e 69 52 65 67 69 6f 6e 20  nRegion>iRegion 
1d7b0 29 7b 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 73  ){.    int iOffs
1d7c0 65 74 20 3d 20 69 52 65 67 69 6f 6e 2a 73 7a 52  et = iRegion*szR
1d7d0 65 67 69 6f 6e 3b 0a 20 20 20 20 69 6e 74 20 69  egion;.    int i
1d7e0 4f 66 66 73 65 74 53 68 69 66 74 20 3d 20 69 4f  OffsetShift = iO
1d7f0 66 66 73 65 74 20 25 20 77 69 6e 53 79 73 49 6e  ffset % winSysIn
1d800 66 6f 2e 64 77 41 6c 6c 6f 63 61 74 69 6f 6e 47  fo.dwAllocationG
1d810 72 61 6e 75 6c 61 72 69 74 79 3b 0a 20 20 20 20  ranularity;.    
1d820 63 68 61 72 20 2a 70 20 3d 20 28 63 68 61 72 20  char *p = (char 
1d830 2a 29 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67  *)pShmNode->aReg
1d840 69 6f 6e 5b 69 52 65 67 69 6f 6e 5d 2e 70 4d 61  ion[iRegion].pMa
1d850 70 3b 0a 20 20 20 20 2a 70 70 20 3d 20 28 76 6f  p;.    *pp = (vo
1d860 69 64 20 2a 29 26 70 5b 69 4f 66 66 73 65 74 53  id *)&p[iOffsetS
1d870 68 69 66 74 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  hift];.  }else{.
1d880 20 20 20 20 2a 70 70 20 3d 20 30 3b 0a 20 20 7d      *pp = 0;.  }
1d890 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1d8a0 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d  _leave(pShmNode-
1d8b0 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
1d8c0 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23  n rc;.}..#else.#
1d8d0 20 64 65 66 69 6e 65 20 77 69 6e 53 68 6d 4d 61   define winShmMa
1d8e0 70 20 20 20 20 20 30 0a 23 20 64 65 66 69 6e 65  p     0.# define
1d8f0 20 77 69 6e 53 68 6d 4c 6f 63 6b 20 20 20 20 30   winShmLock    0
1d900 0a 23 20 64 65 66 69 6e 65 20 77 69 6e 53 68 6d  .# define winShm
1d910 42 61 72 72 69 65 72 20 30 0a 23 20 64 65 66 69  Barrier 0.# defi
1d920 6e 65 20 77 69 6e 53 68 6d 55 6e 6d 61 70 20 20  ne winShmUnmap  
1d930 20 30 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66   0.#endif /* #if
1d940 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1d950 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43  _WAL */../*.** C
1d960 6c 65 61 6e 73 20 75 70 20 74 68 65 20 6d 61 70  leans up the map
1d970 70 65 64 20 72 65 67 69 6f 6e 20 6f 66 20 74 68  ped region of th
1d980 65 20 73 70 65 63 69 66 69 65 64 20 66 69 6c 65  e specified file
1d990 2c 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a 23 69 66  , if any..*/.#if
1d9a0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
1d9b0 5f 53 49 5a 45 3e 30 0a 73 74 61 74 69 63 20 69  _SIZE>0.static i
1d9c0 6e 74 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28  nt winUnmapfile(
1d9d0 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b  winFile *pFile){
1d9e0 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
1d9f0 21 3d 30 20 29 3b 0a 20 20 4f 53 54 52 41 43 45  !=0 );.  OSTRACE
1da00 28 28 22 55 4e 4d 41 50 2d 46 49 4c 45 20 70 69  (("UNMAP-FILE pi
1da10 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c  d=%lu, pFile=%p,
1da20 20 68 4d 61 70 3d 25 70 2c 20 70 4d 61 70 52 65   hMap=%p, pMapRe
1da30 67 69 6f 6e 3d 25 70 2c 20 22 0a 20 20 20 20 20  gion=%p, ".     
1da40 20 20 20 20 20 20 22 6d 6d 61 70 53 69 7a 65 3d        "mmapSize=
1da50 25 6c 6c 64 2c 20 6d 6d 61 70 53 69 7a 65 41 63  %lld, mmapSizeAc
1da60 74 75 61 6c 3d 25 6c 6c 64 2c 20 6d 6d 61 70 53  tual=%lld, mmapS
1da70 69 7a 65 4d 61 78 3d 25 6c 6c 64 5c 6e 22 2c 0a  izeMax=%lld\n",.
1da80 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74             osGet
1da90 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
1daa0 28 29 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c 65  (), pFile, pFile
1dab0 2d 3e 68 4d 61 70 2c 20 70 46 69 6c 65 2d 3e 70  ->hMap, pFile->p
1dac0 4d 61 70 52 65 67 69 6f 6e 2c 0a 20 20 20 20 20  MapRegion,.     
1dad0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61        pFile->mma
1dae0 70 53 69 7a 65 2c 20 70 46 69 6c 65 2d 3e 6d 6d  pSize, pFile->mm
1daf0 61 70 53 69 7a 65 41 63 74 75 61 6c 2c 20 70 46  apSizeActual, pF
1db00 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78  ile->mmapSizeMax
1db10 29 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d  ));.  if( pFile-
1db20 3e 70 4d 61 70 52 65 67 69 6f 6e 20 29 7b 0a 20  >pMapRegion ){. 
1db30 20 20 20 69 66 28 20 21 6f 73 55 6e 6d 61 70 56     if( !osUnmapV
1db40 69 65 77 4f 66 46 69 6c 65 28 70 46 69 6c 65 2d  iewOfFile(pFile-
1db50 3e 70 4d 61 70 52 65 67 69 6f 6e 29 20 29 7b 0a  >pMapRegion) ){.
1db60 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
1db70 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
1db80 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20  stError();.     
1db90 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4d 41 50   OSTRACE(("UNMAP
1dba0 2d 46 49 4c 45 20 70 69 64 3d 25 6c 75 2c 20 70  -FILE pid=%lu, p
1dbb0 46 69 6c 65 3d 25 70 2c 20 70 4d 61 70 52 65 67  File=%p, pMapReg
1dbc0 69 6f 6e 3d 25 70 2c 20 22 0a 20 20 20 20 20 20  ion=%p, ".      
1dbd0 20 20 20 20 20 20 20 20 20 22 72 63 3d 53 51 4c           "rc=SQL
1dbe0 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 5c 6e  ITE_IOERR_MMAP\n
1dbf0 22 2c 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50  ", osGetCurrentP
1dc00 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c  rocessId(), pFil
1dc10 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
1dc20 20 20 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67    pFile->pMapReg
1dc30 69 6f 6e 29 29 3b 0a 20 20 20 20 20 20 72 65 74  ion));.      ret
1dc40 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  urn winLogError(
1dc50 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41  SQLITE_IOERR_MMA
1dc60 50 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  P, pFile->lastEr
1dc70 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
1dc80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
1dc90 69 6e 55 6e 6d 61 70 66 69 6c 65 31 22 2c 20 70  inUnmapfile1", p
1dca0 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
1dcb0 20 20 7d 0a 20 20 20 20 70 46 69 6c 65 2d 3e 70    }.    pFile->p
1dcc0 4d 61 70 52 65 67 69 6f 6e 20 3d 20 30 3b 0a 20  MapRegion = 0;. 
1dcd0 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69     pFile->mmapSi
1dce0 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 46 69 6c  ze = 0;.    pFil
1dcf0 65 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61  e->mmapSizeActua
1dd00 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  l = 0;.  }.  if(
1dd10 20 70 46 69 6c 65 2d 3e 68 4d 61 70 21 3d 4e 55   pFile->hMap!=NU
1dd20 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28 20 21 6f  LL ){.    if( !o
1dd30 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 69  sCloseHandle(pFi
1dd40 6c 65 2d 3e 68 4d 61 70 29 20 29 7b 0a 20 20 20  le->hMap) ){.   
1dd50 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
1dd60 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
1dd70 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 4f 53  rror();.      OS
1dd80 54 52 41 43 45 28 28 22 55 4e 4d 41 50 2d 46 49  TRACE(("UNMAP-FI
1dd90 4c 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c  LE pid=%lu, pFil
1dda0 65 3d 25 70 2c 20 68 4d 61 70 3d 25 70 2c 20 72  e=%p, hMap=%p, r
1ddb0 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d  c=SQLITE_IOERR_M
1ddc0 4d 41 50 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  MAP\n",.        
1ddd0 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72         osGetCurr
1dde0 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
1ddf0 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 4d  pFile, pFile->hM
1de00 61 70 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ap));.      retu
1de10 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53  rn winLogError(S
1de20 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50  QLITE_IOERR_MMAP
1de30 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  , pFile->lastErr
1de40 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
1de50 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
1de60 6e 55 6e 6d 61 70 66 69 6c 65 32 22 2c 20 70 46  nUnmapfile2", pF
1de70 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  ile->zPath);.   
1de80 20 7d 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68 4d   }.    pFile->hM
1de90 61 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 20  ap = NULL;.  }. 
1dea0 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4d 41 50   OSTRACE(("UNMAP
1deb0 2d 46 49 4c 45 20 70 69 64 3d 25 6c 75 2c 20 70  -FILE pid=%lu, p
1dec0 46 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49  File=%p, rc=SQLI
1ded0 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20  TE_OK\n",.      
1dee0 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e       osGetCurren
1def0 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46  tProcessId(), pF
1df00 69 6c 65 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  ile));.  return 
1df10 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
1df20 0a 2a 2a 20 4d 65 6d 6f 72 79 20 6d 61 70 20 6f  .** Memory map o
1df30 72 20 72 65 6d 61 70 20 74 68 65 20 66 69 6c 65  r remap the file
1df40 20 6f 70 65 6e 65 64 20 62 79 20 66 69 6c 65 2d   opened by file-
1df50 64 65 73 63 72 69 70 74 6f 72 20 70 46 64 20 28  descriptor pFd (
1df60 69 66 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 69  if the file.** i
1df70 73 20 61 6c 72 65 61 64 79 20 6d 61 70 70 65 64  s already mapped
1df80 2c 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 6d  , the existing m
1df90 61 70 70 69 6e 67 20 69 73 20 72 65 70 6c 61 63  apping is replac
1dfa0 65 64 20 62 79 20 74 68 65 20 6e 65 77 29 2e 20  ed by the new). 
1dfb0 4f 72 2c 20 69 66 20 0a 2a 2a 20 74 68 65 72 65  Or, if .** there
1dfc0 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
1dfd0 61 20 6d 61 70 70 69 6e 67 20 66 6f 72 20 74 68  a mapping for th
1dfe0 69 73 20 66 69 6c 65 2c 20 61 6e 64 20 74 68 65  is file, and the
1dff0 72 65 20 61 72 65 20 73 74 69 6c 6c 20 0a 2a 2a  re are still .**
1e000 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 78 46 65   outstanding xFe
1e010 74 63 68 28 29 20 72 65 66 65 72 65 6e 63 65 73  tch() references
1e020 20 74 6f 20 69 74 2c 20 74 68 69 73 20 66 75 6e   to it, this fun
1e030 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
1e040 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d  ..**.** If param
1e050 65 74 65 72 20 6e 42 79 74 65 20 69 73 20 6e 6f  eter nByte is no
1e060 6e 2d 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e  n-negative, then
1e070 20 69 74 20 69 73 20 74 68 65 20 72 65 71 75 65   it is the reque
1e080 73 74 65 64 20 73 69 7a 65 20 6f 66 20 0a 2a 2a  sted size of .**
1e090 20 74 68 65 20 6d 61 70 70 69 6e 67 20 74 6f 20   the mapping to 
1e0a0 63 72 65 61 74 65 2e 20 4f 74 68 65 72 77 69 73  create. Otherwis
1e0b0 65 2c 20 69 66 20 6e 42 79 74 65 20 69 73 20 6c  e, if nByte is l
1e0c0 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74  ess than zero, t
1e0d0 68 65 6e 20 74 68 65 20 0a 2a 2a 20 72 65 71 75  hen the .** requ
1e0e0 65 73 74 65 64 20 73 69 7a 65 20 69 73 20 74 68  ested size is th
1e0f0 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69  e size of the fi
1e100 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 54 68 65 20  le on disk. The 
1e110 61 63 74 75 61 6c 20 73 69 7a 65 20 6f 66 20 74  actual size of t
1e120 68 65 0a 2a 2a 20 63 72 65 61 74 65 64 20 6d 61  he.** created ma
1e130 70 70 69 6e 67 20 69 73 20 65 69 74 68 65 72 20  pping is either 
1e140 74 68 65 20 72 65 71 75 65 73 74 65 64 20 73 69  the requested si
1e150 7a 65 20 6f 72 20 74 68 65 20 76 61 6c 75 65 20  ze or the value 
1e160 63 6f 6e 66 69 67 75 72 65 64 20 0a 2a 2a 20 75  configured .** u
1e170 73 69 6e 67 20 53 51 4c 49 54 45 5f 46 43 4e 54  sing SQLITE_FCNT
1e180 4c 5f 4d 4d 41 50 5f 53 49 5a 45 2c 20 77 68 69  L_MMAP_SIZE, whi
1e190 63 68 65 76 65 72 20 69 73 20 73 6d 61 6c 6c 65  chever is smalle
1e1a0 72 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f  r..**.** SQLITE_
1e1b0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  OK is returned i
1e1c0 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  f no error occur
1e1d0 73 20 28 65 76 65 6e 20 69 66 20 74 68 65 20 6d  s (even if the m
1e1e0 61 70 70 69 6e 67 20 69 73 20 6e 6f 74 0a 2a 2a  apping is not.**
1e1f0 20 72 65 63 72 65 61 74 65 64 20 61 73 20 61 20   recreated as a 
1e200 72 65 73 75 6c 74 20 6f 66 20 6f 75 74 73 74 61  result of outsta
1e210 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73  nding references
1e220 29 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65  ) or an SQLite e
1e230 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 6f 74 68  rror.** code oth
1e240 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  erwise..*/.stati
1e250 63 20 69 6e 74 20 77 69 6e 4d 61 70 66 69 6c 65  c int winMapfile
1e260 28 77 69 6e 46 69 6c 65 20 2a 70 46 64 2c 20 73  (winFile *pFd, s
1e270 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 42 79  qlite3_int64 nBy
1e280 74 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69  te){.  sqlite3_i
1e290 6e 74 36 34 20 6e 4d 61 70 20 3d 20 6e 42 79 74  nt64 nMap = nByt
1e2a0 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  e;.  int rc;..  
1e2b0 61 73 73 65 72 74 28 20 6e 4d 61 70 3e 3d 30 20  assert( nMap>=0 
1e2c0 7c 7c 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75  || pFd->nFetchOu
1e2d0 74 3d 3d 30 20 29 3b 0a 20 20 4f 53 54 52 41 43  t==0 );.  OSTRAC
1e2e0 45 28 28 22 4d 41 50 2d 46 49 4c 45 20 70 69 64  E(("MAP-FILE pid
1e2f0 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20  =%lu, pFile=%p, 
1e300 73 69 7a 65 3d 25 6c 6c 64 5c 6e 22 2c 0a 20 20  size=%lld\n",.  
1e310 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
1e320 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
1e330 2c 20 70 46 64 2c 20 6e 42 79 74 65 29 29 3b 0a  , pFd, nByte));.
1e340 0a 20 20 69 66 28 20 70 46 64 2d 3e 6e 46 65 74  .  if( pFd->nFet
1e350 63 68 4f 75 74 3e 30 20 29 20 72 65 74 75 72 6e  chOut>0 ) return
1e360 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69   SQLITE_OK;..  i
1e370 66 28 20 6e 4d 61 70 3c 30 20 29 7b 0a 20 20 20  f( nMap<0 ){.   
1e380 20 72 63 20 3d 20 77 69 6e 46 69 6c 65 53 69 7a   rc = winFileSiz
1e390 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  e((sqlite3_file*
1e3a0 29 70 46 64 2c 20 26 6e 4d 61 70 29 3b 0a 20 20  )pFd, &nMap);.  
1e3b0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
1e3c0 20 20 4f 53 54 52 41 43 45 28 28 22 4d 41 50 2d    OSTRACE(("MAP-
1e3d0 46 49 4c 45 20 70 69 64 3d 25 6c 75 2c 20 70 46  FILE pid=%lu, pF
1e3e0 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  ile=%p, rc=SQLIT
1e3f0 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 5c 6e 22  E_IOERR_FSTAT\n"
1e400 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1e410 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
1e420 63 65 73 73 49 64 28 29 2c 20 70 46 64 29 29 3b  cessId(), pFd));
1e430 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1e440 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54  LITE_IOERR_FSTAT
1e450 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
1e460 28 20 6e 4d 61 70 3e 70 46 64 2d 3e 6d 6d 61 70  ( nMap>pFd->mmap
1e470 53 69 7a 65 4d 61 78 20 29 7b 0a 20 20 20 20 6e  SizeMax ){.    n
1e480 4d 61 70 20 3d 20 70 46 64 2d 3e 6d 6d 61 70 53  Map = pFd->mmapS
1e490 69 7a 65 4d 61 78 3b 0a 20 20 7d 0a 20 20 6e 4d  izeMax;.  }.  nM
1e4a0 61 70 20 26 3d 20 7e 28 73 71 6c 69 74 65 33 5f  ap &= ~(sqlite3_
1e4b0 69 6e 74 36 34 29 28 77 69 6e 53 79 73 49 6e 66  int64)(winSysInf
1e4c0 6f 2e 64 77 50 61 67 65 53 69 7a 65 20 2d 20 31  o.dwPageSize - 1
1e4d0 29 3b 0a 20 0a 20 20 69 66 28 20 6e 4d 61 70 3d  );. .  if( nMap=
1e4e0 3d 30 20 26 26 20 70 46 64 2d 3e 6d 6d 61 70 53  =0 && pFd->mmapS
1e4f0 69 7a 65 3e 30 20 29 7b 0a 20 20 20 20 77 69 6e  ize>0 ){.    win
1e500 55 6e 6d 61 70 66 69 6c 65 28 70 46 64 29 3b 0a  Unmapfile(pFd);.
1e510 20 20 7d 0a 20 20 69 66 28 20 6e 4d 61 70 21 3d    }.  if( nMap!=
1e520 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b  pFd->mmapSize ){
1e530 0a 20 20 20 20 76 6f 69 64 20 2a 70 4e 65 77 20  .    void *pNew 
1e540 3d 20 30 3b 0a 20 20 20 20 44 57 4f 52 44 20 70  = 0;.    DWORD p
1e550 72 6f 74 65 63 74 20 3d 20 50 41 47 45 5f 52 45  rotect = PAGE_RE
1e560 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 44 57 4f 52  ADONLY;.    DWOR
1e570 44 20 66 6c 61 67 73 20 3d 20 46 49 4c 45 5f 4d  D flags = FILE_M
1e580 41 50 5f 52 45 41 44 3b 0a 0a 20 20 20 20 77 69  AP_READ;..    wi
1e590 6e 55 6e 6d 61 70 66 69 6c 65 28 70 46 64 29 3b  nUnmapfile(pFd);
1e5a0 0a 20 20 20 20 69 66 28 20 28 70 46 64 2d 3e 63  .    if( (pFd->c
1e5b0 74 72 6c 46 6c 61 67 73 20 26 20 57 49 4e 46 49  trlFlags & WINFI
1e5c0 4c 45 5f 52 44 4f 4e 4c 59 29 3d 3d 30 20 29 7b  LE_RDONLY)==0 ){
1e5d0 0a 20 20 20 20 20 20 70 72 6f 74 65 63 74 20 3d  .      protect =
1e5e0 20 50 41 47 45 5f 52 45 41 44 57 52 49 54 45 3b   PAGE_READWRITE;
1e5f0 0a 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20  .      flags |= 
1e600 46 49 4c 45 5f 4d 41 50 5f 57 52 49 54 45 3b 0a  FILE_MAP_WRITE;.
1e610 20 20 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45      }.#if SQLITE
1e620 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 70 46  _OS_WINRT.    pF
1e630 64 2d 3e 68 4d 61 70 20 3d 20 6f 73 43 72 65 61  d->hMap = osCrea
1e640 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 46 72 6f  teFileMappingFro
1e650 6d 41 70 70 28 70 46 64 2d 3e 68 2c 20 4e 55 4c  mApp(pFd->h, NUL
1e660 4c 2c 20 70 72 6f 74 65 63 74 2c 20 6e 4d 61 70  L, protect, nMap
1e670 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6c 69 66 20 64  , NULL);.#elif d
1e680 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
1e690 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20  N32_HAS_WIDE).  
1e6a0 20 20 70 46 64 2d 3e 68 4d 61 70 20 3d 20 6f 73    pFd->hMap = os
1e6b0 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e  CreateFileMappin
1e6c0 67 57 28 70 46 64 2d 3e 68 2c 20 4e 55 4c 4c 2c  gW(pFd->h, NULL,
1e6d0 20 70 72 6f 74 65 63 74 2c 0a 20 20 20 20 20 20   protect,.      
1e6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e6f0 20 20 20 20 20 20 20 20 20 20 28 44 57 4f 52 44            (DWORD
1e700 29 28 28 6e 4d 61 70 3e 3e 33 32 29 20 26 20 30  )((nMap>>32) & 0
1e710 78 66 66 66 66 66 66 66 66 29 2c 0a 20 20 20 20  xffffffff),.    
1e720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e730 20 20 20 20 20 20 20 20 20 20 20 20 28 44 57 4f              (DWO
1e740 52 44 29 28 6e 4d 61 70 20 26 20 30 78 66 66 66  RD)(nMap & 0xfff
1e750 66 66 66 66 66 29 2c 20 4e 55 4c 4c 29 3b 0a 23  fffff), NULL);.#
1e760 65 6c 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  elif defined(SQL
1e770 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
1e780 53 49 29 0a 20 20 20 20 70 46 64 2d 3e 68 4d 61  SI).    pFd->hMa
1e790 70 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65  p = osCreateFile
1e7a0 4d 61 70 70 69 6e 67 41 28 70 46 64 2d 3e 68 2c  MappingA(pFd->h,
1e7b0 20 4e 55 4c 4c 2c 20 70 72 6f 74 65 63 74 2c 0a   NULL, protect,.
1e7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e7e0 28 44 57 4f 52 44 29 28 28 6e 4d 61 70 3e 3e 33  (DWORD)((nMap>>3
1e7f0 32 29 20 26 20 30 78 66 66 66 66 66 66 66 66 29  2) & 0xffffffff)
1e800 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1e810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e820 20 20 28 44 57 4f 52 44 29 28 6e 4d 61 70 20 26    (DWORD)(nMap &
1e830 20 30 78 66 66 66 66 66 66 66 66 29 2c 20 4e 55   0xffffffff), NU
1e840 4c 4c 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  LL);.#endif.    
1e850 69 66 28 20 70 46 64 2d 3e 68 4d 61 70 3d 3d 4e  if( pFd->hMap==N
1e860 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 70 46 64  ULL ){.      pFd
1e870 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73  ->lastErrno = os
1e880 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
1e890 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f        rc = winLo
1e8a0 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
1e8b0 45 52 52 5f 4d 4d 41 50 2c 20 70 46 64 2d 3e 6c  ERR_MMAP, pFd->l
1e8c0 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
1e8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e8e0 20 22 77 69 6e 4d 61 70 66 69 6c 65 31 22 2c 20   "winMapfile1", 
1e8f0 70 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  pFd->zPath);.   
1e900 20 20 20 2f 2a 20 4c 6f 67 20 74 68 65 20 65 72     /* Log the er
1e910 72 6f 72 2c 20 62 75 74 20 63 6f 6e 74 69 6e 75  ror, but continu
1e920 65 20 6e 6f 72 6d 61 6c 20 6f 70 65 72 61 74 69  e normal operati
1e930 6f 6e 20 75 73 69 6e 67 20 78 52 65 61 64 2f 78  on using xRead/x
1e940 57 72 69 74 65 20 2a 2f 0a 20 20 20 20 20 20 4f  Write */.      O
1e950 53 54 52 41 43 45 28 28 22 4d 41 50 2d 46 49 4c  STRACE(("MAP-FIL
1e960 45 2d 43 52 45 41 54 45 20 70 69 64 3d 25 6c 75  E-CREATE pid=%lu
1e970 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d 25  , pFile=%p, rc=%
1e980 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
1e990 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e       osGetCurren
1e9a0 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46  tProcessId(), pF
1e9b0 64 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d  d, sqlite3ErrNam
1e9c0 65 28 72 63 29 29 29 3b 0a 20 20 20 20 20 20 72  e(rc)));.      r
1e9d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1e9e0 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
1e9f0 74 28 20 28 6e 4d 61 70 20 25 20 77 69 6e 53 79  t( (nMap % winSy
1ea00 73 49 6e 66 6f 2e 64 77 50 61 67 65 53 69 7a 65  sInfo.dwPageSize
1ea10 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  )==0 );.    asse
1ea20 72 74 28 20 73 69 7a 65 6f 66 28 53 49 5a 45 5f  rt( sizeof(SIZE_
1ea30 54 29 3d 3d 73 69 7a 65 6f 66 28 73 71 6c 69 74  T)==sizeof(sqlit
1ea40 65 33 5f 69 6e 74 36 34 29 20 7c 7c 20 6e 4d 61  e3_int64) || nMa
1ea50 70 3c 3d 30 78 66 66 66 66 66 66 66 66 20 29 3b  p<=0xffffffff );
1ea60 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
1ea70 49 4e 52 54 0a 20 20 20 20 70 4e 65 77 20 3d 20  INRT.    pNew = 
1ea80 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 46  osMapViewOfFileF
1ea90 72 6f 6d 41 70 70 28 70 46 64 2d 3e 68 4d 61 70  romApp(pFd->hMap
1eaa0 2c 20 66 6c 61 67 73 2c 20 30 2c 20 28 53 49 5a  , flags, 0, (SIZ
1eab0 45 5f 54 29 6e 4d 61 70 29 3b 0a 23 65 6c 73 65  E_T)nMap);.#else
1eac0 0a 20 20 20 20 70 4e 65 77 20 3d 20 6f 73 4d 61  .    pNew = osMa
1ead0 70 56 69 65 77 4f 66 46 69 6c 65 28 70 46 64 2d  pViewOfFile(pFd-
1eae0 3e 68 4d 61 70 2c 20 66 6c 61 67 73 2c 20 30 2c  >hMap, flags, 0,
1eaf0 20 30 2c 20 28 53 49 5a 45 5f 54 29 6e 4d 61 70   0, (SIZE_T)nMap
1eb00 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66  );.#endif.    if
1eb10 28 20 70 4e 65 77 3d 3d 4e 55 4c 4c 20 29 7b 0a  ( pNew==NULL ){.
1eb20 20 20 20 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e        osCloseHan
1eb30 64 6c 65 28 70 46 64 2d 3e 68 4d 61 70 29 3b 0a  dle(pFd->hMap);.
1eb40 20 20 20 20 20 20 70 46 64 2d 3e 68 4d 61 70 20        pFd->hMap 
1eb50 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 70 46  = NULL;.      pF
1eb60 64 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f  d->lastErrno = o
1eb70 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b  sGetLastError();
1eb80 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c  .      rc = winL
1eb90 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
1eba0 4f 45 52 52 5f 4d 4d 41 50 2c 20 70 46 64 2d 3e  OERR_MMAP, pFd->
1ebb0 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  lastErrno,.     
1ebc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ebd0 20 20 22 77 69 6e 4d 61 70 66 69 6c 65 32 22 2c    "winMapfile2",
1ebe0 20 70 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20   pFd->zPath);.  
1ebf0 20 20 20 20 2f 2a 20 4c 6f 67 20 74 68 65 20 65      /* Log the e
1ec00 72 72 6f 72 2c 20 62 75 74 20 63 6f 6e 74 69 6e  rror, but contin
1ec10 75 65 20 6e 6f 72 6d 61 6c 20 6f 70 65 72 61 74  ue normal operat
1ec20 69 6f 6e 20 75 73 69 6e 67 20 78 52 65 61 64 2f  ion using xRead/
1ec30 78 57 72 69 74 65 20 2a 2f 0a 20 20 20 20 20 20  xWrite */.      
1ec40 4f 53 54 52 41 43 45 28 28 22 4d 41 50 2d 46 49  OSTRACE(("MAP-FI
1ec50 4c 45 2d 4d 41 50 20 70 69 64 3d 25 6c 75 2c 20  LE-MAP pid=%lu, 
1ec60 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c  pFile=%p, rc=%s\
1ec70 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
1ec80 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50     osGetCurrentP
1ec90 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 64 2c  rocessId(), pFd,
1eca0 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28   sqlite3ErrName(
1ecb0 72 63 29 29 29 3b 0a 20 20 20 20 20 20 72 65 74  rc)));.      ret
1ecc0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1ecd0 20 20 20 7d 0a 20 20 20 20 70 46 64 2d 3e 70 4d     }.    pFd->pM
1ece0 61 70 52 65 67 69 6f 6e 20 3d 20 70 4e 65 77 3b  apRegion = pNew;
1ecf0 0a 20 20 20 20 70 46 64 2d 3e 6d 6d 61 70 53 69  .    pFd->mmapSi
1ed00 7a 65 20 3d 20 6e 4d 61 70 3b 0a 20 20 20 20 70  ze = nMap;.    p
1ed10 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75  Fd->mmapSizeActu
1ed20 61 6c 20 3d 20 6e 4d 61 70 3b 0a 20 20 7d 0a 0a  al = nMap;.  }..
1ed30 20 20 4f 53 54 52 41 43 45 28 28 22 4d 41 50 2d    OSTRACE(("MAP-
1ed40 46 49 4c 45 20 70 69 64 3d 25 6c 75 2c 20 70 46  FILE pid=%lu, pF
1ed50 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  ile=%p, rc=SQLIT
1ed60 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20  E_OK\n",.       
1ed70 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74      osGetCurrent
1ed80 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 64  ProcessId(), pFd
1ed90 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ));.  return SQL
1eda0 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
1edb0 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d   /* SQLITE_MAX_M
1edc0 4d 41 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a 2f  MAP_SIZE>0 */../
1edd0 2a 0a 2a 2a 20 49 66 20 70 6f 73 73 69 62 6c 65  *.** If possible
1ede0 2c 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  , return a point
1edf0 65 72 20 74 6f 20 61 20 6d 61 70 70 69 6e 67 20  er to a mapping 
1ee00 6f 66 20 66 69 6c 65 20 66 64 20 73 74 61 72 74  of file fd start
1ee10 69 6e 67 20 61 74 20 6f 66 66 73 65 74 0a 2a 2a  ing at offset.**
1ee20 20 69 4f 66 66 2e 20 54 68 65 20 6d 61 70 70 69   iOff. The mappi
1ee30 6e 67 20 6d 75 73 74 20 62 65 20 76 61 6c 69 64  ng must be valid
1ee40 20 66 6f 72 20 61 74 20 6c 65 61 73 74 20 6e 41   for at least nA
1ee50 6d 74 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  mt bytes..**.** 
1ee60 49 66 20 73 75 63 68 20 61 20 70 6f 69 6e 74 65  If such a pointe
1ee70 72 20 63 61 6e 20 62 65 20 6f 62 74 61 69 6e 65  r can be obtaine
1ee80 64 2c 20 73 74 6f 72 65 20 69 74 20 69 6e 20 2a  d, store it in *
1ee90 70 70 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  pp and return SQ
1eea0 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 4f 72 2c 20  LITE_OK..** Or, 
1eeb0 69 66 20 6f 6e 65 20 63 61 6e 6e 6f 74 20 62 75  if one cannot bu
1eec0 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  t no error occur
1eed0 73 2c 20 73 65 74 20 2a 70 70 20 74 6f 20 30 20  s, set *pp to 0 
1eee0 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
1eef0 45 5f 4f 4b 2e 0a 2a 2a 20 46 69 6e 61 6c 6c 79  E_OK..** Finally
1ef00 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20 64 6f  , if an error do
1ef10 65 73 20 6f 63 63 75 72 2c 20 72 65 74 75 72 6e  es occur, return
1ef20 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
1ef30 20 63 6f 64 65 2e 20 54 68 65 20 66 69 6e 61 6c   code. The final
1ef40 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 2a 70 70  .** value of *pp
1ef50 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20 69 6e   is undefined in
1ef60 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a   this case..**.*
1ef70 2a 20 49 66 20 74 68 69 73 20 66 75 6e 63 74 69  * If this functi
1ef80 6f 6e 20 64 6f 65 73 20 72 65 74 75 72 6e 20 61  on does return a
1ef90 20 70 6f 69 6e 74 65 72 2c 20 74 68 65 20 63 61   pointer, the ca
1efa0 6c 6c 65 72 20 6d 75 73 74 20 65 76 65 6e 74 75  ller must eventu
1efb0 61 6c 6c 79 20 0a 2a 2a 20 72 65 6c 65 61 73 65  ally .** release
1efc0 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 62   the reference b
1efd0 79 20 63 61 6c 6c 69 6e 67 20 77 69 6e 55 6e 66  y calling winUnf
1efe0 65 74 63 68 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  etch()..*/.stati
1eff0 63 20 69 6e 74 20 77 69 6e 46 65 74 63 68 28 73  c int winFetch(s
1f000 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c  qlite3_file *fd,
1f010 20 69 36 34 20 69 4f 66 66 2c 20 69 6e 74 20 6e   i64 iOff, int n
1f020 41 6d 74 2c 20 76 6f 69 64 20 2a 2a 70 70 29 7b  Amt, void **pp){
1f030 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
1f040 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 77 69  MMAP_SIZE>0.  wi
1f050 6e 46 69 6c 65 20 2a 70 46 64 20 3d 20 28 77 69  nFile *pFd = (wi
1f060 6e 46 69 6c 65 2a 29 66 64 3b 20 20 20 2f 2a 20  nFile*)fd;   /* 
1f070 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64  The underlying d
1f080 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
1f090 23 65 6e 64 69 66 0a 20 20 2a 70 70 20 3d 20 30  #endif.  *pp = 0
1f0a0 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 46  ;..  OSTRACE(("F
1f0b0 45 54 43 48 20 70 69 64 3d 25 6c 75 2c 20 70 46  ETCH pid=%lu, pF
1f0c0 69 6c 65 3d 25 70 2c 20 6f 66 66 73 65 74 3d 25  ile=%p, offset=%
1f0d0 6c 6c 64 2c 20 61 6d 6f 75 6e 74 3d 25 64 2c 20  lld, amount=%d, 
1f0e0 70 70 3d 25 70 5c 6e 22 2c 0a 20 20 20 20 20 20  pp=%p\n",.      
1f0f0 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e       osGetCurren
1f100 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 66 64  tProcessId(), fd
1f110 2c 20 69 4f 66 66 2c 20 6e 41 6d 74 2c 20 70 70  , iOff, nAmt, pp
1f120 29 29 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  ));..#if SQLITE_
1f130 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
1f140 20 20 69 66 28 20 70 46 64 2d 3e 6d 6d 61 70 53    if( pFd->mmapS
1f150 69 7a 65 4d 61 78 3e 30 20 29 7b 0a 20 20 20 20  izeMax>0 ){.    
1f160 69 66 28 20 70 46 64 2d 3e 70 4d 61 70 52 65 67  if( pFd->pMapReg
1f170 69 6f 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ion==0 ){.      
1f180 69 6e 74 20 72 63 20 3d 20 77 69 6e 4d 61 70 66  int rc = winMapf
1f190 69 6c 65 28 70 46 64 2c 20 2d 31 29 3b 0a 20 20  ile(pFd, -1);.  
1f1a0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1f1b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1f1c0 20 4f 53 54 52 41 43 45 28 28 22 46 45 54 43 48   OSTRACE(("FETCH
1f1d0 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d   pid=%lu, pFile=
1f1e0 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20  %p, rc=%s\n",.  
1f1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
1f200 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
1f210 73 73 49 64 28 29 2c 20 70 46 64 2c 20 73 71 6c  ssId(), pFd, sql
1f220 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29  ite3ErrName(rc))
1f230 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
1f240 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
1f250 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46 64 2d    }.    if( pFd-
1f260 3e 6d 6d 61 70 53 69 7a 65 20 3e 3d 20 69 4f 66  >mmapSize >= iOf
1f270 66 2b 6e 41 6d 74 20 29 7b 0a 20 20 20 20 20 20  f+nAmt ){.      
1f280 2a 70 70 20 3d 20 26 28 28 75 38 20 2a 29 70 46  *pp = &((u8 *)pF
1f290 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 5b 69  d->pMapRegion)[i
1f2a0 4f 66 66 5d 3b 0a 20 20 20 20 20 20 70 46 64 2d  Off];.      pFd-
1f2b0 3e 6e 46 65 74 63 68 4f 75 74 2b 2b 3b 0a 20 20  >nFetchOut++;.  
1f2c0 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
1f2d0 20 20 4f 53 54 52 41 43 45 28 28 22 46 45 54 43    OSTRACE(("FETC
1f2e0 48 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65  H pid=%lu, pFile
1f2f0 3d 25 70 2c 20 70 70 3d 25 70 2c 20 2a 70 70 3d  =%p, pp=%p, *pp=
1f300 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b  %p, rc=SQLITE_OK
1f310 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
1f320 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
1f330 65 73 73 49 64 28 29 2c 20 66 64 2c 20 70 70 2c  essId(), fd, pp,
1f340 20 2a 70 70 29 29 3b 0a 20 20 72 65 74 75 72 6e   *pp));.  return
1f350 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
1f360 2a 0a 2a 2a 20 49 66 20 74 68 65 20 74 68 69 72  *.** If the thir
1f370 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f  d argument is no
1f380 6e 2d 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69  n-NULL, then thi
1f390 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 6c 65 61  s function relea
1f3a0 73 65 73 20 61 20 0a 2a 2a 20 72 65 66 65 72 65  ses a .** refere
1f3b0 6e 63 65 20 6f 62 74 61 69 6e 65 64 20 62 79 20  nce obtained by 
1f3c0 61 6e 20 65 61 72 6c 69 65 72 20 63 61 6c 6c 20  an earlier call 
1f3d0 74 6f 20 77 69 6e 46 65 74 63 68 28 29 2e 20 54  to winFetch(). T
1f3e0 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 61 72 67  he second.** arg
1f3f0 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20  ument passed to 
1f400 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 75  this function mu
1f410 73 74 20 62 65 20 74 68 65 20 73 61 6d 65 20 61  st be the same a
1f420 73 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  s the correspond
1f430 69 6e 67 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20  ing.** argument 
1f440 74 68 61 74 20 77 61 73 20 70 61 73 73 65 64 20  that was passed 
1f450 74 6f 20 74 68 65 20 77 69 6e 46 65 74 63 68 28  to the winFetch(
1f460 29 20 69 6e 76 6f 63 61 74 69 6f 6e 2e 20 0a 2a  ) invocation. .*
1f470 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65 20  *.** Or, if the 
1f480 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 20 69  third argument i
1f490 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69  s NULL, then thi
1f4a0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 62 65  s function is be
1f4b0 69 6e 67 20 63 61 6c 6c 65 64 20 0a 2a 2a 20 74  ing called .** t
1f4c0 6f 20 69 6e 66 6f 72 6d 20 74 68 65 20 56 46 53  o inform the VFS
1f4d0 20 6c 61 79 65 72 20 74 68 61 74 2c 20 61 63 63   layer that, acc
1f4e0 6f 72 64 69 6e 67 20 74 6f 20 50 4f 53 49 58 2c  ording to POSIX,
1f4f0 20 61 6e 79 20 65 78 69 73 74 69 6e 67 20 6d 61   any existing ma
1f500 70 70 69 6e 67 20 0a 2a 2a 20 6d 61 79 20 6e 6f  pping .** may no
1f510 77 20 62 65 20 69 6e 76 61 6c 69 64 20 61 6e 64  w be invalid and
1f520 20 73 68 6f 75 6c 64 20 62 65 20 75 6e 6d 61 70   should be unmap
1f530 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ped..*/.static i
1f540 6e 74 20 77 69 6e 55 6e 66 65 74 63 68 28 73 71  nt winUnfetch(sq
1f550 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20  lite3_file *fd, 
1f560 69 36 34 20 69 4f 66 66 2c 20 76 6f 69 64 20 2a  i64 iOff, void *
1f570 70 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  p){.#if SQLITE_M
1f580 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20  AX_MMAP_SIZE>0. 
1f590 20 77 69 6e 46 69 6c 65 20 2a 70 46 64 20 3d 20   winFile *pFd = 
1f5a0 28 77 69 6e 46 69 6c 65 2a 29 66 64 3b 20 20 20  (winFile*)fd;   
1f5b0 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e  /* The underlyin
1f5c0 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  g database file 
1f5d0 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 70 3d 3d 30  */..  /* If p==0
1f5e0 20 28 75 6e 6d 61 70 20 74 68 65 20 65 6e 74 69   (unmap the enti
1f5f0 72 65 20 66 69 6c 65 29 20 74 68 65 6e 20 74 68  re file) then th
1f600 65 72 65 20 6d 75 73 74 20 62 65 20 6e 6f 20 6f  ere must be no o
1f610 75 74 73 74 61 6e 64 69 6e 67 20 0a 20 20 2a 2a  utstanding .  **
1f620 20 78 46 65 74 63 68 20 72 65 66 65 72 65 6e 63   xFetch referenc
1f630 65 73 2e 20 4f 72 2c 20 69 66 20 70 21 3d 30 20  es. Or, if p!=0 
1f640 28 6d 65 61 6e 69 6e 67 20 69 74 20 69 73 20 61  (meaning it is a
1f650 6e 20 78 46 65 74 63 68 20 72 65 66 65 72 65 6e  n xFetch referen
1f660 63 65 29 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 74  ce),.  ** then t
1f670 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 74 20  here must be at 
1f680 6c 65 61 73 74 20 6f 6e 65 20 6f 75 74 73 74 61  least one outsta
1f690 6e 64 69 6e 67 2e 20 20 2a 2f 0a 20 20 61 73 73  nding.  */.  ass
1f6a0 65 72 74 28 20 28 70 3d 3d 30 29 3d 3d 28 70 46  ert( (p==0)==(pF
1f6b0 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30 29  d->nFetchOut==0)
1f6c0 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 21 3d   );..  /* If p!=
1f6d0 30 2c 20 69 74 20 6d 75 73 74 20 6d 61 74 63 68  0, it must match
1f6e0 20 74 68 65 20 69 4f 66 66 20 76 61 6c 75 65 2e   the iOff value.
1f6f0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 3d   */.  assert( p=
1f700 3d 30 20 7c 7c 20 70 3d 3d 26 28 28 75 38 20 2a  =0 || p==&((u8 *
1f710 29 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e  )pFd->pMapRegion
1f720 29 5b 69 4f 66 66 5d 20 29 3b 0a 0a 20 20 4f 53  )[iOff] );..  OS
1f730 54 52 41 43 45 28 28 22 55 4e 46 45 54 43 48 20  TRACE(("UNFETCH 
1f740 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25  pid=%lu, pFile=%
1f750 70 2c 20 6f 66 66 73 65 74 3d 25 6c 6c 64 2c 20  p, offset=%lld, 
1f760 70 3d 25 70 5c 6e 22 2c 0a 20 20 20 20 20 20 20  p=%p\n",.       
1f770 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74      osGetCurrent
1f780 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 64  ProcessId(), pFd
1f790 2c 20 69 4f 66 66 2c 20 70 29 29 3b 0a 0a 20 20  , iOff, p));..  
1f7a0 69 66 28 20 70 20 29 7b 0a 20 20 20 20 70 46 64  if( p ){.    pFd
1f7b0 2d 3e 6e 46 65 74 63 68 4f 75 74 2d 2d 3b 0a 20  ->nFetchOut--;. 
1f7c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 46   }else{.    /* F
1f7d0 49 58 4d 45 3a 20 20 49 66 20 57 69 6e 64 6f 77  IXME:  If Window
1f7e0 73 20 74 72 75 6c 79 20 61 6c 77 61 79 73 20 70  s truly always p
1f7f0 72 65 76 65 6e 74 73 20 74 72 75 6e 63 61 74 69  revents truncati
1f800 6e 67 20 6f 72 20 64 65 6c 65 74 69 6e 67 20 61  ng or deleting a
1f810 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 77 68 69  .    ** file whi
1f820 6c 65 20 61 20 6d 61 70 70 69 6e 67 20 69 73 20  le a mapping is 
1f830 68 65 6c 64 2c 20 74 68 65 6e 20 74 68 65 20 66  held, then the f
1f840 6f 6c 6c 6f 77 69 6e 67 20 77 69 6e 55 6e 6d 61  ollowing winUnma
1f850 70 66 69 6c 65 28 29 20 63 61 6c 6c 0a 20 20 20  pfile() call.   
1f860 20 2a 2a 20 69 73 20 75 6e 6e 65 63 65 73 73 61   ** is unnecessa
1f870 72 79 20 63 61 6e 20 63 61 6e 20 62 65 20 6f 6d  ry can can be om
1f880 69 74 74 65 64 20 2d 20 70 6f 74 65 6e 74 69 61  itted - potentia
1f890 6c 6c 79 20 69 6d 70 72 6f 76 69 6e 67 0a 20 20  lly improving.  
1f8a0 20 20 2a 2a 20 70 65 72 66 6f 72 6d 61 6e 63 65    ** performance
1f8b0 2e 20 20 2a 2f 0a 20 20 20 20 77 69 6e 55 6e 6d  .  */.    winUnm
1f8c0 61 70 66 69 6c 65 28 70 46 64 29 3b 0a 20 20 7d  apfile(pFd);.  }
1f8d0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 64 2d  ..  assert( pFd-
1f8e0 3e 6e 46 65 74 63 68 4f 75 74 3e 3d 30 20 29 3b  >nFetchOut>=0 );
1f8f0 0a 23 65 6e 64 69 66 0a 0a 20 20 4f 53 54 52 41  .#endif..  OSTRA
1f900 43 45 28 28 22 55 4e 46 45 54 43 48 20 70 69 64  CE(("UNFETCH pid
1f910 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20  =%lu, pFile=%p, 
1f920 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c  rc=SQLITE_OK\n",
1f930 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65  .           osGe
1f940 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
1f950 64 28 29 2c 20 66 64 29 29 3b 0a 20 20 72 65 74  d(), fd));.  ret
1f960 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1f970 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20 65 6e 64  ../*.** Here end
1f980 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
1f990 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 73 71 6c 69  tion of all sqli
1f9a0 74 65 33 5f 66 69 6c 65 20 6d 65 74 68 6f 64 73  te3_file methods
1f9b0 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ..**.***********
1f9c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
1f9d0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 4d 65 74  sqlite3_file Met
1f9e0 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  hods ***********
1f9f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1fa00 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
1fa10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1fa20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1fa30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1fa40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1fa50 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ***/../*.** This
1fa60 20 76 65 63 74 6f 72 20 64 65 66 69 6e 65 73 20   vector defines 
1fa70 61 6c 6c 20 74 68 65 20 6d 65 74 68 6f 64 73 20  all the methods 
1fa80 74 68 61 74 20 63 61 6e 20 6f 70 65 72 61 74 65  that can operate
1fa90 20 6f 6e 20 61 6e 0a 2a 2a 20 73 71 6c 69 74 65   on an.** sqlite
1faa0 33 5f 66 69 6c 65 20 66 6f 72 20 77 69 6e 33 32  3_file for win32
1fab0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
1fac0 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  t sqlite3_io_met
1fad0 68 6f 64 73 20 77 69 6e 49 6f 4d 65 74 68 6f 64  hods winIoMethod
1fae0 20 3d 20 7b 0a 20 20 33 2c 20 20 20 20 20 20 20   = {.  3,       
1faf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb00 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69         /* iVersi
1fb10 6f 6e 20 2a 2f 0a 20 20 77 69 6e 43 6c 6f 73 65  on */.  winClose
1fb20 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1fb30 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73          /* xClos
1fb40 65 20 2a 2f 0a 20 20 77 69 6e 52 65 61 64 2c 20  e */.  winRead, 
1fb50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb60 20 20 20 20 20 20 20 2f 2a 20 78 52 65 61 64 20         /* xRead 
1fb70 2a 2f 0a 20 20 77 69 6e 57 72 69 74 65 2c 20 20  */.  winWrite,  
1fb80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb90 20 20 20 20 20 2f 2a 20 78 57 72 69 74 65 20 2a       /* xWrite *
1fba0 2f 0a 20 20 77 69 6e 54 72 75 6e 63 61 74 65 2c  /.  winTruncate,
1fbb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fbc0 20 20 20 20 2f 2a 20 78 54 72 75 6e 63 61 74 65      /* xTruncate
1fbd0 20 2a 2f 0a 20 20 77 69 6e 53 79 6e 63 2c 20 20   */.  winSync,  
1fbe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fbf0 20 20 20 20 20 20 2f 2a 20 78 53 79 6e 63 20 2a        /* xSync *
1fc00 2f 0a 20 20 77 69 6e 46 69 6c 65 53 69 7a 65 2c  /.  winFileSize,
1fc10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fc20 20 20 20 20 2f 2a 20 78 46 69 6c 65 53 69 7a 65      /* xFileSize
1fc30 20 2a 2f 0a 20 20 77 69 6e 4c 6f 63 6b 2c 20 20   */.  winLock,  
1fc40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fc50 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 2a        /* xLock *
1fc60 2f 0a 20 20 77 69 6e 55 6e 6c 6f 63 6b 2c 20 20  /.  winUnlock,  
1fc70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fc80 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 2a      /* xUnlock *
1fc90 2f 0a 20 20 77 69 6e 43 68 65 63 6b 52 65 73 65  /.  winCheckRese
1fca0 72 76 65 64 4c 6f 63 6b 2c 20 20 20 20 20 20 20  rvedLock,       
1fcb0 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73      /* xCheckRes
1fcc0 65 72 76 65 64 4c 6f 63 6b 20 2a 2f 0a 20 20 77  ervedLock */.  w
1fcd0 69 6e 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c 20 20  inFileControl,  
1fce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1fcf0 2a 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 20 2a  * xFileControl *
1fd00 2f 0a 20 20 77 69 6e 53 65 63 74 6f 72 53 69 7a  /.  winSectorSiz
1fd10 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
1fd20 20 20 20 20 2f 2a 20 78 53 65 63 74 6f 72 53 69      /* xSectorSi
1fd30 7a 65 20 2a 2f 0a 20 20 77 69 6e 44 65 76 69 63  ze */.  winDevic
1fd40 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
1fd50 2c 20 20 20 20 20 20 20 2f 2a 20 78 44 65 76 69  ,       /* xDevi
1fd60 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
1fd70 73 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4d 61 70  s */.  winShmMap
1fd80 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1fd90 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61         /* xShmMa
1fda0 70 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4c 6f 63  p */.  winShmLoc
1fdb0 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
1fdc0 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4c 6f         /* xShmLo
1fdd0 63 6b 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 42 61  ck */.  winShmBa
1fde0 72 72 69 65 72 2c 20 20 20 20 20 20 20 20 20 20  rrier,          
1fdf0 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 42          /* xShmB
1fe00 61 72 72 69 65 72 20 2a 2f 0a 20 20 77 69 6e 53  arrier */.  winS
1fe10 68 6d 55 6e 6d 61 70 2c 20 20 20 20 20 20 20 20  hmUnmap,        
1fe20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1fe30 53 68 6d 55 6e 6d 61 70 20 2a 2f 0a 20 20 77 69  ShmUnmap */.  wi
1fe40 6e 46 65 74 63 68 2c 20 20 20 20 20 20 20 20 20  nFetch,         
1fe50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1fe60 20 78 46 65 74 63 68 20 2a 2f 0a 20 20 77 69 6e   xFetch */.  win
1fe70 55 6e 66 65 74 63 68 20 20 20 20 20 20 20 20 20  Unfetch         
1fe80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1fe90 78 55 6e 66 65 74 63 68 20 2a 2f 0a 7d 3b 0a 0a  xUnfetch */.};..
1fea0 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
1feb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1fec0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1fed0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1fee0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
1fef0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ff00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 73 71 6c 69 74  ********** sqlit
1ff10 65 33 5f 76 66 73 20 6d 65 74 68 6f 64 73 20 2a  e3_vfs methods *
1ff20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ff30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ***********.**.*
1ff40 2a 20 54 68 69 73 20 64 69 76 69 73 69 6f 6e 20  * This division 
1ff50 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 69 6d 70  contains the imp
1ff60 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 6d  lementation of m
1ff70 65 74 68 6f 64 73 20 6f 6e 20 74 68 65 0a 2a 2a  ethods on the.**
1ff80 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6f 62 6a   sqlite3_vfs obj
1ff90 65 63 74 2e 0a 2a 2f 0a 0a 23 69 66 20 64 65 66  ect..*/..#if def
1ffa0 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29  ined(__CYGWIN__)
1ffb0 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61  ./*.** Convert a
1ffc0 20 66 69 6c 65 6e 61 6d 65 20 66 72 6f 6d 20 77   filename from w
1ffd0 68 61 74 65 76 65 72 20 74 68 65 20 75 6e 64 65  hatever the unde
1ffe0 72 6c 79 69 6e 67 20 6f 70 65 72 61 74 69 6e 67  rlying operating
1fff0 20 73 79 73 74 65 6d 0a 2a 2a 20 73 75 70 70 6f   system.** suppo
20000 72 74 73 20 66 6f 72 20 66 69 6c 65 6e 61 6d 65  rts for filename
20010 73 20 69 6e 74 6f 20 55 54 46 2d 38 2e 20 20 53  s into UTF-8.  S
20020 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  pace to hold the
20030 20 72 65 73 75 6c 74 20 69 73 0a 2a 2a 20 6f 62   result is.** ob
20040 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c  tained from mall
20050 6f 63 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66  oc and must be f
20060 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  reed by the call
20070 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  ing function..*/
20080 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 77 69  .static char *wi
20090 6e 43 6f 6e 76 65 72 74 54 6f 55 74 66 38 46 69  nConvertToUtf8Fi
200a0 6c 65 6e 61 6d 65 28 63 6f 6e 73 74 20 76 6f 69  lename(const voi
200b0 64 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20  d *zFilename){. 
200c0 20 63 68 61 72 20 2a 7a 43 6f 6e 76 65 72 74 65   char *zConverte
200d0 64 20 3d 20 30 3b 0a 20 20 69 66 28 20 6f 73 49  d = 0;.  if( osI
200e0 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 7a 43 6f  sNT() ){.    zCo
200f0 6e 76 65 72 74 65 64 20 3d 20 77 69 6e 55 6e 69  nverted = winUni
20100 63 6f 64 65 54 6f 55 74 66 38 28 7a 46 69 6c 65  codeToUtf8(zFile
20110 6e 61 6d 65 29 3b 0a 20 20 7d 0a 23 69 66 64 65  name);.  }.#ifde
20120 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  f SQLITE_WIN32_H
20130 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a  AS_ANSI.  else{.
20140 20 20 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d      zConverted =
20150 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d   sqlite3_win32_m
20160 62 63 73 5f 74 6f 5f 75 74 66 38 28 7a 46 69 6c  bcs_to_utf8(zFil
20170 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 23 65 6e 64  ename);.  }.#end
20180 69 66 0a 20 20 2f 2a 20 63 61 6c 6c 65 72 20 77  if.  /* caller w
20190 69 6c 6c 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f  ill handle out o
201a0 66 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 72 65  f memory */.  re
201b0 74 75 72 6e 20 7a 43 6f 6e 76 65 72 74 65 64 3b  turn zConverted;
201c0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
201d0 20 43 6f 6e 76 65 72 74 20 61 20 55 54 46 2d 38   Convert a UTF-8
201e0 20 66 69 6c 65 6e 61 6d 65 20 69 6e 74 6f 20 77   filename into w
201f0 68 61 74 65 76 65 72 20 66 6f 72 6d 20 74 68 65  hatever form the
20200 20 75 6e 64 65 72 6c 79 69 6e 67 0a 2a 2a 20 6f   underlying.** o
20210 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
20220 77 61 6e 74 73 20 66 69 6c 65 6e 61 6d 65 73 20  wants filenames 
20230 69 6e 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f  in.  Space to ho
20240 6c 64 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a  ld the result.**
20250 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   is obtained fro
20260 6d 20 6d 61 6c 6c 6f 63 20 61 6e 64 20 6d 75 73  m malloc and mus
20270 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68  t be freed by th
20280 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e  e calling.** fun
20290 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
202a0 20 76 6f 69 64 20 2a 77 69 6e 43 6f 6e 76 65 72   void *winConver
202b0 74 46 72 6f 6d 55 74 66 38 46 69 6c 65 6e 61 6d  tFromUtf8Filenam
202c0 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  e(const char *zF
202d0 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 76 6f 69 64  ilename){.  void
202e0 20 2a 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 30   *zConverted = 0
202f0 3b 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29  ;.  if( osIsNT()
20300 20 29 7b 0a 20 20 20 20 7a 43 6f 6e 76 65 72 74   ){.    zConvert
20310 65 64 20 3d 20 77 69 6e 55 74 66 38 54 6f 55 6e  ed = winUtf8ToUn
20320 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29  icode(zFilename)
20330 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c  ;.  }.#ifdef SQL
20340 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
20350 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 7a  SI.  else{.    z
20360 43 6f 6e 76 65 72 74 65 64 20 3d 20 73 71 6c 69  Converted = sqli
20370 74 65 33 5f 77 69 6e 33 32 5f 75 74 66 38 5f 74  te3_win32_utf8_t
20380 6f 5f 6d 62 63 73 28 7a 46 69 6c 65 6e 61 6d 65  o_mbcs(zFilename
20390 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
203a0 2f 2a 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 68  /* caller will h
203b0 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20 6d 65 6d  andle out of mem
203c0 6f 72 79 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ory */.  return 
203d0 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 7d 0a 0a 2f  zConverted;.}../
203e0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
203f0 6f 6e 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a  on returns non-z
20400 65 72 6f 20 69 66 20 74 68 65 20 73 70 65 63 69  ero if the speci
20410 66 69 65 64 20 55 54 46 2d 38 20 73 74 72 69 6e  fied UTF-8 strin
20420 67 20 62 75 66 66 65 72 0a 2a 2a 20 65 6e 64 73  g buffer.** ends
20430 20 77 69 74 68 20 61 20 64 69 72 65 63 74 6f 72   with a director
20440 79 20 73 65 70 61 72 61 74 6f 72 20 63 68 61 72  y separator char
20450 61 63 74 65 72 20 6f 72 20 6f 6e 65 20 77 61 73  acter or one was
20460 20 73 75 63 63 65 73 73 66 75 6c 6c 79 0a 2a 2a   successfully.**
20470 20 61 64 64 65 64 20 74 6f 20 69 74 2e 0a 2a 2f   added to it..*/
20480 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d  .static int winM
20490 61 6b 65 45 6e 64 49 6e 44 69 72 53 65 70 28 69  akeEndInDirSep(i
204a0 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a  nt nBuf, char *z
204b0 42 75 66 29 7b 0a 20 20 69 66 28 20 7a 42 75 66  Buf){.  if( zBuf
204c0 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 4c 65 6e   ){.    int nLen
204d0 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
204e0 33 30 28 7a 42 75 66 29 3b 0a 20 20 20 20 69 66  30(zBuf);.    if
204f0 28 20 6e 4c 65 6e 3e 30 20 29 7b 0a 20 20 20 20  ( nLen>0 ){.    
20500 20 20 69 66 28 20 77 69 6e 49 73 44 69 72 53 65    if( winIsDirSe
20510 70 28 7a 42 75 66 5b 6e 4c 65 6e 2d 31 5d 29 20  p(zBuf[nLen-1]) 
20520 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
20530 6e 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  n 1;.      }else
20540 20 69 66 28 20 6e 4c 65 6e 2b 31 3c 6e 42 75 66   if( nLen+1<nBuf
20550 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 42 75 66   ){.        zBuf
20560 5b 6e 4c 65 6e 5d 20 3d 20 77 69 6e 47 65 74 44  [nLen] = winGetD
20570 69 72 53 65 70 28 29 3b 0a 20 20 20 20 20 20 20  irSep();.       
20580 20 7a 42 75 66 5b 6e 4c 65 6e 2b 31 5d 20 3d 20   zBuf[nLen+1] = 
20590 27 5c 30 27 3b 0a 20 20 20 20 20 20 20 20 72 65  '\0';.        re
205a0 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a  turn 1;.      }.
205b0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
205c0 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn 0;.}../*.** C
205d0 72 65 61 74 65 20 61 20 74 65 6d 70 6f 72 61 72  reate a temporar
205e0 79 20 66 69 6c 65 20 6e 61 6d 65 20 61 6e 64 20  y file name and 
205f0 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
20600 69 6e 67 20 70 6f 69 6e 74 65 72 20 69 6e 74 6f  ing pointer into
20610 20 70 7a 42 75 66 2e 0a 2a 2a 20 54 68 65 20 70   pzBuf..** The p
20620 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20  ointer returned 
20630 69 6e 20 70 7a 42 75 66 20 6d 75 73 74 20 62 65  in pzBuf must be
20640 20 66 72 65 65 64 20 76 69 61 20 73 71 6c 69 74   freed via sqlit
20650 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a 73 74  e3_free()..*/.st
20660 61 74 69 63 20 69 6e 74 20 77 69 6e 47 65 74 54  atic int winGetT
20670 65 6d 70 6e 61 6d 65 28 73 71 6c 69 74 65 33 5f  empname(sqlite3_
20680 76 66 73 20 2a 70 56 66 73 2c 20 63 68 61 72 20  vfs *pVfs, char 
20690 2a 2a 70 7a 42 75 66 29 7b 0a 20 20 73 74 61 74  **pzBuf){.  stat
206a0 69 63 20 63 68 61 72 20 7a 43 68 61 72 73 5b 5d  ic char zChars[]
206b0 20 3d 0a 20 20 20 20 22 61 62 63 64 65 66 67 68   =.    "abcdefgh
206c0 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78  ijklmnopqrstuvwx
206d0 79 7a 22 0a 20 20 20 20 22 41 42 43 44 45 46 47  yz".    "ABCDEFG
206e0 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57  HIJKLMNOPQRSTUVW
206f0 58 59 5a 22 0a 20 20 20 20 22 30 31 32 33 34 35  XYZ".    "012345
20700 36 37 38 39 22 3b 0a 20 20 73 69 7a 65 5f 74 20  6789";.  size_t 
20710 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e 50 72 65  i, j;.  int nPre
20720 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
20730 33 30 28 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46  30(SQLITE_TEMP_F
20740 49 4c 45 5f 50 52 45 46 49 58 29 3b 0a 20 20 69  ILE_PREFIX);.  i
20750 6e 74 20 6e 4d 61 78 2c 20 6e 42 75 66 2c 20 6e  nt nMax, nBuf, n
20760 44 69 72 2c 20 6e 4c 65 6e 3b 0a 20 20 63 68 61  Dir, nLen;.  cha
20770 72 20 2a 7a 42 75 66 3b 0a 0a 20 20 2f 2a 20 49  r *zBuf;..  /* I
20780 74 27 73 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c  t's odd to simul
20790 61 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20  ate an io-error 
207a0 68 65 72 65 2c 20 62 75 74 20 72 65 61 6c 6c 79  here, but really
207b0 20 74 68 69 73 20 69 73 20 6a 75 73 74 0a 20 20   this is just.  
207c0 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 69 6f 2d  ** using the io-
207d0 65 72 72 6f 72 20 69 6e 66 72 61 73 74 72 75 63  error infrastruc
207e0 74 75 72 65 20 74 6f 20 74 65 73 74 20 74 68 61  ture to test tha
207f0 74 20 53 51 4c 69 74 65 20 68 61 6e 64 6c 65 73  t SQLite handles
20800 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74   this.  ** funct
20810 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 0a 20 20  ion failing. .  
20820 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  */.  SimulateIOE
20830 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
20840 49 54 45 5f 49 4f 45 52 52 20 29 3b 0a 0a 20 20  ITE_IOERR );..  
20850 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 74 65  /* Allocate a te
20860 6d 70 6f 72 61 72 79 20 62 75 66 66 65 72 20 74  mporary buffer t
20870 6f 20 73 74 6f 72 65 20 74 68 65 20 66 75 6c 6c  o store the full
20880 79 20 71 75 61 6c 69 66 69 65 64 20 66 69 6c 65  y qualified file
20890 0a 20 20 2a 2a 20 6e 61 6d 65 20 66 6f 72 20 74  .  ** name for t
208a0 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  he temporary fil
208b0 65 2e 20 20 49 66 20 74 68 69 73 20 66 61 69 6c  e.  If this fail
208c0 73 2c 20 77 65 20 63 61 6e 6e 6f 74 20 63 6f 6e  s, we cannot con
208d0 74 69 6e 75 65 2e 0a 20 20 2a 2f 0a 20 20 6e 4d  tinue..  */.  nM
208e0 61 78 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74  ax = pVfs->mxPat
208f0 68 6e 61 6d 65 3b 20 6e 42 75 66 20 3d 20 6e 4d  hname; nBuf = nM
20900 61 78 20 2b 20 32 3b 0a 20 20 7a 42 75 66 20 3d  ax + 2;.  zBuf =
20910 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
20920 72 6f 28 20 6e 42 75 66 20 29 3b 0a 20 20 69 66  ro( nBuf );.  if
20930 28 20 21 7a 42 75 66 20 29 7b 0a 20 20 20 20 4f  ( !zBuf ){.    O
20940 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49  STRACE(("TEMP-FI
20950 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45  LENAME rc=SQLITE
20960 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29  _IOERR_NOMEM\n")
20970 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
20980 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
20990 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 67 75  ;.  }..  /* Figu
209a0 72 65 20 6f 75 74 20 74 68 65 20 65 66 66 65 63  re out the effec
209b0 74 69 76 65 20 74 65 6d 70 6f 72 61 72 79 20 64  tive temporary d
209c0 69 72 65 63 74 6f 72 79 2e 20 20 46 69 72 73 74  irectory.  First
209d0 2c 20 63 68 65 63 6b 20 69 66 20 6f 6e 65 0a 20  , check if one. 
209e0 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 65 78 70   ** has been exp
209f0 6c 69 63 69 74 6c 79 20 73 65 74 20 62 79 20 74  licitly set by t
20a00 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 3b 20  he application; 
20a10 6f 74 68 65 72 77 69 73 65 2c 20 75 73 65 20 74  otherwise, use t
20a20 68 65 20 6f 6e 65 0a 20 20 2a 2a 20 63 6f 6e 66  he one.  ** conf
20a30 69 67 75 72 65 64 20 62 79 20 74 68 65 20 6f 70  igured by the op
20a40 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 2e 0a  erating system..
20a50 20 20 2a 2f 0a 20 20 6e 44 69 72 20 3d 20 6e 4d    */.  nDir = nM
20a60 61 78 20 2d 20 28 6e 50 72 65 20 2b 20 31 35 29  ax - (nPre + 15)
20a70 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 44 69 72  ;.  assert( nDir
20a80 3e 30 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  >0 );.  if( sqli
20a90 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f  te3_temp_directo
20aa0 72 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 44  ry ){.    int nD
20ab0 69 72 4c 65 6e 20 3d 20 73 71 6c 69 74 65 33 53  irLen = sqlite3S
20ac0 74 72 6c 65 6e 33 30 28 73 71 6c 69 74 65 33 5f  trlen30(sqlite3_
20ad0 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 29 3b  temp_directory);
20ae0 0a 20 20 20 20 69 66 28 20 6e 44 69 72 4c 65 6e  .    if( nDirLen
20af0 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  >0 ){.      if( 
20b00 21 77 69 6e 49 73 44 69 72 53 65 70 28 73 71 6c  !winIsDirSep(sql
20b10 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74  ite3_temp_direct
20b20 6f 72 79 5b 6e 44 69 72 4c 65 6e 2d 31 5d 29 20  ory[nDirLen-1]) 
20b30 29 7b 0a 20 20 20 20 20 20 20 20 6e 44 69 72 4c  ){.        nDirL
20b40 65 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  en++;.      }.  
20b50 20 20 20 20 69 66 28 20 6e 44 69 72 4c 65 6e 3e      if( nDirLen>
20b60 6e 44 69 72 20 29 7b 0a 20 20 20 20 20 20 20 20  nDir ){.        
20b70 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75  sqlite3_free(zBu
20b80 66 29 3b 0a 20 20 20 20 20 20 20 20 4f 53 54 52  f);.        OSTR
20b90 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e  ACE(("TEMP-FILEN
20ba0 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 45 52  AME rc=SQLITE_ER
20bb0 52 4f 52 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20  ROR\n"));.      
20bc0 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45    return winLogE
20bd0 72 72 6f 72 28 53 51 4c 49 54 45 5f 45 52 52 4f  rror(SQLITE_ERRO
20be0 52 2c 20 30 2c 20 22 77 69 6e 47 65 74 54 65 6d  R, 0, "winGetTem
20bf0 70 6e 61 6d 65 31 22 2c 20 30 29 3b 0a 20 20 20  pname1", 0);.   
20c00 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
20c10 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4d 61 78  e3_snprintf(nMax
20c20 2c 20 7a 42 75 66 2c 20 22 25 73 22 2c 20 73 71  , zBuf, "%s", sq
20c30 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63  lite3_temp_direc
20c40 74 6f 72 79 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  tory);.    }.  }
20c50 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 43  .#if defined(__C
20c60 59 47 57 49 4e 5f 5f 29 0a 20 20 65 6c 73 65 7b  YGWIN__).  else{
20c70 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
20c80 74 20 63 68 61 72 20 2a 61 7a 44 69 72 73 5b 5d  t char *azDirs[]
20c90 20 3d 20 7b 0a 20 20 20 20 20 20 20 30 2c 20 2f   = {.       0, /
20ca0 2a 20 67 65 74 65 6e 76 28 22 53 51 4c 49 54 45  * getenv("SQLITE
20cb0 5f 54 4d 50 44 49 52 22 29 20 2a 2f 0a 20 20 20  _TMPDIR") */.   
20cc0 20 20 20 20 30 2c 20 2f 2a 20 67 65 74 65 6e 76      0, /* getenv
20cd0 28 22 54 4d 50 44 49 52 22 29 20 2a 2f 0a 20 20  ("TMPDIR") */.  
20ce0 20 20 20 20 20 30 2c 20 2f 2a 20 67 65 74 65 6e       0, /* geten
20cf0 76 28 22 54 4d 50 22 29 20 2a 2f 0a 20 20 20 20  v("TMP") */.    
20d00 20 20 20 30 2c 20 2f 2a 20 67 65 74 65 6e 76 28     0, /* getenv(
20d10 22 54 45 4d 50 22 29 20 2a 2f 0a 20 20 20 20 20  "TEMP") */.     
20d20 20 20 30 2c 20 2f 2a 20 67 65 74 65 6e 76 28 22    0, /* getenv("
20d30 55 53 45 52 50 52 4f 46 49 4c 45 22 29 20 2a 2f  USERPROFILE") */
20d40 0a 20 20 20 20 20 20 20 22 2f 76 61 72 2f 74 6d  .       "/var/tm
20d50 70 22 2c 0a 20 20 20 20 20 20 20 22 2f 75 73 72  p",.       "/usr
20d60 2f 74 6d 70 22 2c 0a 20 20 20 20 20 20 20 22 2f  /tmp",.       "/
20d70 74 6d 70 22 2c 0a 20 20 20 20 20 20 20 22 2e 22  tmp",.       "."
20d80 2c 0a 20 20 20 20 20 20 20 30 20 20 20 20 20 20  ,.       0      
20d90 20 20 2f 2a 20 4c 69 73 74 20 74 65 72 6d 69 6e    /* List termin
20da0 61 74 6f 72 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20  ator */.    };. 
20db0 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20     unsigned int 
20dc0 69 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  i;.    const cha
20dd0 72 20 2a 7a 44 69 72 20 3d 20 30 3b 0a 0a 20 20  r *zDir = 0;..  
20de0 20 20 69 66 28 20 21 61 7a 44 69 72 73 5b 30 5d    if( !azDirs[0]
20df0 20 29 20 61 7a 44 69 72 73 5b 30 5d 20 3d 20 67   ) azDirs[0] = g
20e00 65 74 65 6e 76 28 22 53 51 4c 49 54 45 5f 54 4d  etenv("SQLITE_TM
20e10 50 44 49 52 22 29 3b 0a 20 20 20 20 69 66 28 20  PDIR");.    if( 
20e20 21 61 7a 44 69 72 73 5b 31 5d 20 29 20 61 7a 44  !azDirs[1] ) azD
20e30 69 72 73 5b 31 5d 20 3d 20 67 65 74 65 6e 76 28  irs[1] = getenv(
20e40 22 54 4d 50 44 49 52 22 29 3b 0a 20 20 20 20 69  "TMPDIR");.    i
20e50 66 28 20 21 61 7a 44 69 72 73 5b 32 5d 20 29 20  f( !azDirs[2] ) 
20e60 61 7a 44 69 72 73 5b 32 5d 20 3d 20 67 65 74 65  azDirs[2] = gete
20e70 6e 76 28 22 54 4d 50 22 29 3b 0a 20 20 20 20 69  nv("TMP");.    i
20e80 66 28 20 21 61 7a 44 69 72 73 5b 33 5d 20 29 20  f( !azDirs[3] ) 
20e90 61 7a 44 69 72 73 5b 33 5d 20 3d 20 67 65 74 65  azDirs[3] = gete
20ea0 6e 76 28 22 54 45 4d 50 22 29 3b 0a 20 20 20 20  nv("TEMP");.    
20eb0 69 66 28 20 21 61 7a 44 69 72 73 5b 34 5d 20 29  if( !azDirs[4] )
20ec0 20 61 7a 44 69 72 73 5b 34 5d 20 3d 20 67 65 74   azDirs[4] = get
20ed0 65 6e 76 28 22 55 53 45 52 50 52 4f 46 49 4c 45  env("USERPROFILE
20ee0 22 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  ");.    for(i=0;
20ef0 20 69 3c 73 69 7a 65 6f 66 28 61 7a 44 69 72 73   i<sizeof(azDirs
20f00 29 2f 73 69 7a 65 6f 66 28 61 7a 44 69 72 73 5b  )/sizeof(azDirs[
20f10 30 5d 29 3b 20 7a 44 69 72 3d 61 7a 44 69 72 73  0]); zDir=azDirs
20f20 5b 69 2b 2b 5d 29 7b 0a 20 20 20 20 20 20 76 6f  [i++]){.      vo
20f30 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 0a  id *zConverted;.
20f40 20 20 20 20 20 20 69 66 28 20 7a 44 69 72 3d 3d        if( zDir==
20f50 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
20f60 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61      /* If the pa
20f70 74 68 20 73 74 61 72 74 73 20 77 69 74 68 20 61  th starts with a
20f80 20 64 72 69 76 65 20 6c 65 74 74 65 72 20 66 6f   drive letter fo
20f90 6c 6c 6f 77 65 64 20 62 79 20 74 68 65 20 63 6f  llowed by the co
20fa0 6c 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 63 68 61  lon.      ** cha
20fb0 72 61 63 74 65 72 2c 20 61 73 73 75 6d 65 20 69  racter, assume i
20fc0 74 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 6e  t is already a n
20fd0 61 74 69 76 65 20 57 69 6e 33 32 20 70 61 74 68  ative Win32 path
20fe0 3b 20 6f 74 68 65 72 77 69 73 65 2c 0a 20 20 20  ; otherwise,.   
20ff0 20 20 20 2a 2a 20 69 74 20 6d 75 73 74 20 62 65     ** it must be
21000 20 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 61 20   converted to a 
21010 6e 61 74 69 76 65 20 57 69 6e 33 32 20 70 61 74  native Win32 pat
21020 68 20 76 69 61 20 74 68 65 20 43 79 67 77 69 6e  h via the Cygwin
21030 20 41 50 49 0a 20 20 20 20 20 20 2a 2a 20 70 72   API.      ** pr
21040 69 6f 72 20 74 6f 20 75 73 69 6e 67 20 69 74 2e  ior to using it.
21050 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
21060 69 66 28 20 77 69 6e 49 73 44 72 69 76 65 4c 65  if( winIsDriveLe
21070 74 74 65 72 41 6e 64 43 6f 6c 6f 6e 28 7a 44 69  tterAndColon(zDi
21080 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 43  r) ){.        zC
21090 6f 6e 76 65 72 74 65 64 20 3d 20 77 69 6e 43 6f  onverted = winCo
210a0 6e 76 65 72 74 46 72 6f 6d 55 74 66 38 46 69 6c  nvertFromUtf8Fil
210b0 65 6e 61 6d 65 28 7a 44 69 72 29 3b 0a 20 20 20  ename(zDir);.   
210c0 20 20 20 20 20 69 66 28 20 21 7a 43 6f 6e 76 65       if( !zConve
210d0 72 74 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20  rted ){.        
210e0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
210f0 42 75 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Buf);.          
21100 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46  OSTRACE(("TEMP-F
21110 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54  ILENAME rc=SQLIT
21120 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22  E_IOERR_NOMEM\n"
21130 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  ));.          re
21140 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
21150 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  R_NOMEM;.       
21160 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 77   }.        if( w
21170 69 6e 49 73 44 69 72 28 7a 43 6f 6e 76 65 72 74  inIsDir(zConvert
21180 65 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ed) ){.         
21190 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
211a0 66 28 6e 4d 61 78 2c 20 7a 42 75 66 2c 20 22 25  f(nMax, zBuf, "%
211b0 73 22 2c 20 7a 44 69 72 29 3b 0a 20 20 20 20 20  s", zDir);.     
211c0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
211d0 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
211e0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
211f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
21200 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
21210 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
21220 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
21230 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 73 71   zConverted = sq
21240 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
21250 20 6e 4d 61 78 2b 31 20 29 3b 0a 20 20 20 20 20   nMax+1 );.     
21260 20 20 20 69 66 28 20 21 7a 43 6f 6e 76 65 72 74     if( !zConvert
21270 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ed ){.          
21280 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75  sqlite3_free(zBu
21290 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 4f 53  f);.          OS
212a0 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c  TRACE(("TEMP-FIL
212b0 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f  ENAME rc=SQLITE_
212c0 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29  IOERR_NOMEM\n"))
212d0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
212e0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
212f0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 7d  NOMEM;.        }
21300 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 79 67  .        if( cyg
21310 77 69 6e 5f 63 6f 6e 76 5f 70 61 74 68 28 0a 20  win_conv_path(. 
21320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
21330 73 49 73 4e 54 28 29 20 3f 20 43 43 50 5f 50 4f  sIsNT() ? CCP_PO
21340 53 49 58 5f 54 4f 5f 57 49 4e 5f 57 20 3a 20 43  SIX_TO_WIN_W : C
21350 43 50 5f 50 4f 53 49 58 5f 54 4f 5f 57 49 4e 5f  CP_POSIX_TO_WIN_
21360 41 2c 20 7a 44 69 72 2c 0a 20 20 20 20 20 20 20  A, zDir,.       
21370 20 20 20 20 20 20 20 20 20 7a 43 6f 6e 76 65 72           zConver
21380 74 65 64 2c 20 6e 4d 61 78 2b 31 29 3c 30 20 29  ted, nMax+1)<0 )
21390 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
213a0 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
213b0 74 65 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ted);.          
213c0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75  sqlite3_free(zBu
213d0 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 4f 53  f);.          OS
213e0 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c  TRACE(("TEMP-FIL
213f0 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f  ENAME rc=SQLITE_
21400 49 4f 45 52 52 5f 43 4f 4e 56 50 41 54 48 5c 6e  IOERR_CONVPATH\n
21410 22 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  "));.          r
21420 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f  eturn winLogErro
21430 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  r(SQLITE_IOERR_C
21440 4f 4e 56 50 41 54 48 2c 20 28 44 57 4f 52 44 29  ONVPATH, (DWORD)
21450 65 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  errno,.         
21460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21470 20 20 20 20 22 77 69 6e 47 65 74 54 65 6d 70 6e      "winGetTempn
21480 61 6d 65 32 22 2c 20 7a 44 69 72 29 3b 0a 20 20  ame2", zDir);.  
21490 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
214a0 69 66 28 20 77 69 6e 49 73 44 69 72 28 7a 43 6f  if( winIsDir(zCo
214b0 6e 76 65 72 74 65 64 29 20 29 7b 0a 20 20 20 20  nverted) ){.    
214c0 20 20 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73        /* At this
214d0 20 70 6f 69 6e 74 2c 20 77 65 20 6b 6e 6f 77 20   point, we know 
214e0 74 68 65 20 63 61 6e 64 69 64 61 74 65 20 64 69  the candidate di
214f0 72 65 63 74 6f 72 79 20 65 78 69 73 74 73 20 61  rectory exists a
21500 6e 64 20 73 68 6f 75 6c 64 0a 20 20 20 20 20 20  nd should.      
21510 20 20 20 20 2a 2a 20 62 65 20 75 73 65 64 2e 20      ** be used. 
21520 20 48 6f 77 65 76 65 72 2c 20 77 65 20 6d 61 79   However, we may
21530 20 6e 65 65 64 20 74 6f 20 63 6f 6e 76 65 72 74   need to convert
21540 20 74 68 65 20 73 74 72 69 6e 67 20 63 6f 6e 74   the string cont
21550 61 69 6e 69 6e 67 0a 20 20 20 20 20 20 20 20 20  aining.         
21560 20 2a 2a 20 69 74 73 20 6e 61 6d 65 20 69 6e 74   ** its name int
21570 6f 20 55 54 46 2d 38 20 28 69 2e 65 2e 20 69 66  o UTF-8 (i.e. if
21580 20 69 74 20 69 73 20 55 54 46 2d 31 36 20 72 69   it is UTF-16 ri
21590 67 68 74 20 6e 6f 77 29 2e 0a 20 20 20 20 20 20  ght now)..      
215a0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
215b0 20 63 68 61 72 20 2a 7a 55 74 66 38 20 3d 20 77   char *zUtf8 = w
215c0 69 6e 43 6f 6e 76 65 72 74 54 6f 55 74 66 38 46  inConvertToUtf8F
215d0 69 6c 65 6e 61 6d 65 28 7a 43 6f 6e 76 65 72 74  ilename(zConvert
215e0 65 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ed);.          i
215f0 66 28 20 21 7a 55 74 66 38 20 29 7b 0a 20 20 20  f( !zUtf8 ){.   
21600 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
21610 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
21620 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
21630 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66  qlite3_free(zBuf
21640 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 4f  );.            O
21650 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49  STRACE(("TEMP-FI
21660 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45  LENAME rc=SQLITE
21670 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29  _IOERR_NOMEM\n")
21680 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
21690 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
216a0 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  RR_NOMEM;.      
216b0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
216c0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
216d0 28 6e 4d 61 78 2c 20 7a 42 75 66 2c 20 22 25 73  (nMax, zBuf, "%s
216e0 22 2c 20 7a 55 74 66 38 29 3b 0a 20 20 20 20 20  ", zUtf8);.     
216f0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
21700 65 28 7a 55 74 66 38 29 3b 0a 20 20 20 20 20 20  e(zUtf8);.      
21710 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
21720 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
21730 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
21740 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
21750 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
21760 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20  onverted);.     
21770 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c   }.    }.  }.#el
21780 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
21790 4e 52 54 20 26 26 20 21 64 65 66 69 6e 65 64 28  NRT && !defined(
217a0 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20 65 6c  __CYGWIN__).  el
217b0 73 65 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20  se if( osIsNT() 
217c0 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 75  ){.    char *zMu
217d0 6c 74 69 3b 0a 20 20 20 20 4c 50 57 53 54 52 20  lti;.    LPWSTR 
217e0 7a 57 69 64 65 50 61 74 68 20 3d 20 73 71 6c 69  zWidePath = sqli
217f0 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e  te3MallocZero( n
21800 4d 61 78 2a 73 69 7a 65 6f 66 28 57 43 48 41 52  Max*sizeof(WCHAR
21810 29 20 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 57  ) );.    if( !zW
21820 69 64 65 50 61 74 68 20 29 7b 0a 20 20 20 20 20  idePath ){.     
21830 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42   sqlite3_free(zB
21840 75 66 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41  uf);.      OSTRA
21850 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41  CE(("TEMP-FILENA
21860 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45  ME rc=SQLITE_IOE
21870 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20  RR_NOMEM\n"));. 
21880 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
21890 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a  TE_IOERR_NOMEM;.
218a0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 73      }.    if( os
218b0 47 65 74 54 65 6d 70 50 61 74 68 57 28 6e 4d 61  GetTempPathW(nMa
218c0 78 2c 20 7a 57 69 64 65 50 61 74 68 29 3d 3d 30  x, zWidePath)==0
218d0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
218e0 33 5f 66 72 65 65 28 7a 57 69 64 65 50 61 74 68  3_free(zWidePath
218f0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
21900 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20  _free(zBuf);.   
21910 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d     OSTRACE(("TEM
21920 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51  P-FILENAME rc=SQ
21930 4c 49 54 45 5f 49 4f 45 52 52 5f 47 45 54 54 45  LITE_IOERR_GETTE
21940 4d 50 50 41 54 48 5c 6e 22 29 29 3b 0a 20 20 20  MPPATH\n"));.   
21950 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67     return winLog
21960 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
21970 52 52 5f 47 45 54 54 45 4d 50 50 41 54 48 2c 20  RR_GETTEMPPATH, 
21980 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
21990 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
219a0 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 47             "winG
219b0 65 74 54 65 6d 70 6e 61 6d 65 32 22 2c 20 30 29  etTempname2", 0)
219c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4d 75 6c  ;.    }.    zMul
219d0 74 69 20 3d 20 77 69 6e 55 6e 69 63 6f 64 65 54  ti = winUnicodeT
219e0 6f 55 74 66 38 28 7a 57 69 64 65 50 61 74 68 29  oUtf8(zWidePath)
219f0 3b 0a 20 20 20 20 69 66 28 20 7a 4d 75 6c 74 69  ;.    if( zMulti
21a00 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
21a10 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4d 61 78 2c  3_snprintf(nMax,
21a20 20 7a 42 75 66 2c 20 22 25 73 22 2c 20 7a 4d 75   zBuf, "%s", zMu
21a30 6c 74 69 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  lti);.      sqli
21a40 74 65 33 5f 66 72 65 65 28 7a 4d 75 6c 74 69 29  te3_free(zMulti)
21a50 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
21a60 66 72 65 65 28 7a 57 69 64 65 50 61 74 68 29 3b  free(zWidePath);
21a70 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
21a80 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
21a90 57 69 64 65 50 61 74 68 29 3b 0a 20 20 20 20 20  WidePath);.     
21aa0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42   sqlite3_free(zB
21ab0 75 66 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41  uf);.      OSTRA
21ac0 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41  CE(("TEMP-FILENA
21ad0 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45  ME rc=SQLITE_IOE
21ae0 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20  RR_NOMEM\n"));. 
21af0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
21b00 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a  TE_IOERR_NOMEM;.
21b10 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66 64 65 66      }.  }.#ifdef
21b20 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41   SQLITE_WIN32_HA
21b30 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20  S_ANSI.  else{. 
21b40 20 20 20 63 68 61 72 20 2a 7a 55 74 66 38 3b 0a     char *zUtf8;.
21b50 20 20 20 20 63 68 61 72 20 2a 7a 4d 62 63 73 50      char *zMbcsP
21b60 61 74 68 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  ath = sqlite3Mal
21b70 6c 6f 63 5a 65 72 6f 28 20 6e 4d 61 78 20 29 3b  locZero( nMax );
21b80 0a 20 20 20 20 69 66 28 20 21 7a 4d 62 63 73 50  .    if( !zMbcsP
21b90 61 74 68 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ath ){.      sql
21ba0 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b  ite3_free(zBuf);
21bb0 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
21bc0 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72  "TEMP-FILENAME r
21bd0 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  c=SQLITE_IOERR_N
21be0 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 20  OMEM\n"));.     
21bf0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
21c00 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  OERR_NOMEM;.    
21c10 7d 0a 20 20 20 20 69 66 28 20 6f 73 47 65 74 54  }.    if( osGetT
21c20 65 6d 70 50 61 74 68 41 28 6e 4d 61 78 2c 20 7a  empPathA(nMax, z
21c30 4d 62 63 73 50 61 74 68 29 3d 3d 30 20 29 7b 0a  MbcsPath)==0 ){.
21c40 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
21c50 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20  ee(zBuf);.      
21c60 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46  OSTRACE(("TEMP-F
21c70 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54  ILENAME rc=SQLIT
21c80 45 5f 49 4f 45 52 52 5f 47 45 54 54 45 4d 50 50  E_IOERR_GETTEMPP
21c90 41 54 48 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20  ATH\n"));.      
21ca0 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72  return winLogErr
21cb0 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
21cc0 47 45 54 54 45 4d 50 50 41 54 48 2c 20 6f 73 47  GETTEMPPATH, osG
21cd0 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20  etLastError(),. 
21ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21cf0 20 20 20 20 20 20 20 20 22 77 69 6e 47 65 74 54          "winGetT
21d00 65 6d 70 6e 61 6d 65 33 22 2c 20 30 29 3b 0a 20  empname3", 0);. 
21d10 20 20 20 7d 0a 20 20 20 20 7a 55 74 66 38 20 3d     }.    zUtf8 =
21d20 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d   sqlite3_win32_m
21d30 62 63 73 5f 74 6f 5f 75 74 66 38 28 7a 4d 62 63  bcs_to_utf8(zMbc
21d40 73 50 61 74 68 29 3b 0a 20 20 20 20 69 66 28 20  sPath);.    if( 
21d50 7a 55 74 66 38 20 29 7b 0a 20 20 20 20 20 20 73  zUtf8 ){.      s
21d60 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
21d70 6e 4d 61 78 2c 20 7a 42 75 66 2c 20 22 25 73 22  nMax, zBuf, "%s"
21d80 2c 20 7a 55 74 66 38 29 3b 0a 20 20 20 20 20 20  , zUtf8);.      
21d90 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 55 74  sqlite3_free(zUt
21da0 66 38 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  f8);.    }else{.
21db0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
21dc0 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20  ee(zBuf);.      
21dd0 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46  OSTRACE(("TEMP-F
21de0 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54  ILENAME rc=SQLIT
21df0 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22  E_IOERR_NOMEM\n"
21e00 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
21e10 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
21e20 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  MEM;.    }.  }.#
21e30 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
21e40 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 20 2a  WIN32_HAS_ANSI *
21e50 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c  /.#endif /* !SQL
21e60 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 2a 2f 0a  ITE_OS_WINRT */.
21e70 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43 68 65 63 6b  .  /*.  ** Check
21e80 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
21e90 65 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65  e temporary dire
21ea0 63 74 6f 72 79 20 65 6e 64 73 20 77 69 74 68 20  ctory ends with 
21eb0 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 0a 20  an appropriate. 
21ec0 20 2a 2a 20 73 65 70 61 72 61 74 6f 72 2e 20 20   ** separator.  
21ed0 49 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 61  If it does not a
21ee0 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20  nd there is not 
21ef0 65 6e 6f 75 67 68 20 73 70 61 63 65 20 6c 65 66  enough space lef
21f00 74 20 74 6f 20 61 64 64 0a 20 20 2a 2a 20 6f 6e  t to add.  ** on
21f10 65 2c 20 66 61 69 6c 2e 0a 20 20 2a 2f 0a 20 20  e, fail..  */.  
21f20 69 66 28 20 21 77 69 6e 4d 61 6b 65 45 6e 64 49  if( !winMakeEndI
21f30 6e 44 69 72 53 65 70 28 6e 44 69 72 2b 31 2c 20  nDirSep(nDir+1, 
21f40 7a 42 75 66 29 20 29 7b 0a 20 20 20 20 73 71 6c  zBuf) ){.    sql
21f50 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b  ite3_free(zBuf);
21f60 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54  .    OSTRACE(("T
21f70 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d  EMP-FILENAME rc=
21f80 53 51 4c 49 54 45 5f 45 52 52 4f 52 5c 6e 22 29  SQLITE_ERROR\n")
21f90 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 77 69  );.    return wi
21fa0 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
21fb0 5f 45 52 52 4f 52 2c 20 30 2c 20 22 77 69 6e 47  _ERROR, 0, "winG
21fc0 65 74 54 65 6d 70 6e 61 6d 65 34 22 2c 20 30 29  etTempname4", 0)
21fd0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
21fe0 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   Check that the 
21ff0 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 69 73  output buffer is
22000 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 66 6f   large enough fo
22010 72 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  r the temporary 
22020 66 69 6c 65 20 0a 20 20 2a 2a 20 6e 61 6d 65 20  file .  ** name 
22030 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  in the following
22040 20 66 6f 72 6d 61 74 3a 0a 20 20 2a 2a 0a 20 20   format:.  **.  
22050 2a 2a 20 20 20 22 3c 74 65 6d 70 6f 72 61 72 79  **   "<temporary
22060 5f 64 69 72 65 63 74 6f 72 79 3e 2f 65 74 69 6c  _directory>/etil
22070 71 73 5f 58 58 58 58 58 58 58 58 58 58 58 58 58  qs_XXXXXXXXXXXXX
22080 58 58 5c 30 5c 30 22 0a 20 20 2a 2a 0a 20 20 2a  XX\0\0".  **.  *
22090 2a 20 49 66 20 6e 6f 74 2c 20 72 65 74 75 72 6e  * If not, return
220a0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 20 20   SQLITE_ERROR.  
220b0 54 68 65 20 6e 75 6d 62 65 72 20 31 37 20 69 73  The number 17 is
220c0 20 75 73 65 64 20 68 65 72 65 20 69 6e 20 6f 72   used here in or
220d0 64 65 72 20 74 6f 0a 20 20 2a 2a 20 61 63 63 6f  der to.  ** acco
220e0 75 6e 74 20 66 6f 72 20 74 68 65 20 73 70 61 63  unt for the spac
220f0 65 20 75 73 65 64 20 62 79 20 74 68 65 20 31 35  e used by the 15
22100 20 63 68 61 72 61 63 74 65 72 20 72 61 6e 64 6f   character rando
22110 6d 20 73 75 66 66 69 78 20 61 6e 64 20 74 68 65  m suffix and the
22120 0a 20 20 2a 2a 20 74 77 6f 20 74 72 61 69 6c 69  .  ** two traili
22130 6e 67 20 4e 55 4c 20 63 68 61 72 61 63 74 65 72  ng NUL character
22140 73 2e 20 20 54 68 65 20 66 69 6e 61 6c 20 64 69  s.  The final di
22150 72 65 63 74 6f 72 79 20 73 65 70 61 72 61 74 6f  rectory separato
22160 72 20 63 68 61 72 61 63 74 65 72 0a 20 20 2a 2a  r character.  **
22170 20 68 61 73 20 61 6c 72 65 61 64 79 20 61 64 64   has already add
22180 65 64 20 69 66 20 69 74 20 77 61 73 20 6e 6f 74  ed if it was not
22190 20 61 6c 72 65 61 64 79 20 70 72 65 73 65 6e 74   already present
221a0 2e 0a 20 20 2a 2f 0a 20 20 6e 4c 65 6e 20 3d 20  ..  */.  nLen = 
221b0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
221c0 7a 42 75 66 29 3b 0a 20 20 69 66 28 20 28 6e 4c  zBuf);.  if( (nL
221d0 65 6e 20 2b 20 6e 50 72 65 20 2b 20 31 37 29 20  en + nPre + 17) 
221e0 3e 20 6e 42 75 66 20 29 7b 0a 20 20 20 20 73 71  > nBuf ){.    sq
221f0 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29  lite3_free(zBuf)
22200 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  ;.    OSTRACE(("
22210 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63  TEMP-FILENAME rc
22220 3d 53 51 4c 49 54 45 5f 45 52 52 4f 52 5c 6e 22  =SQLITE_ERROR\n"
22230 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 77  ));.    return w
22240 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
22250 45 5f 45 52 52 4f 52 2c 20 30 2c 20 22 77 69 6e  E_ERROR, 0, "win
22260 47 65 74 54 65 6d 70 6e 61 6d 65 35 22 2c 20 30  GetTempname5", 0
22270 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65  );.  }..  sqlite
22280 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2d  3_snprintf(nBuf-
22290 31 36 2d 6e 4c 65 6e 2c 20 7a 42 75 66 2b 6e 4c  16-nLen, zBuf+nL
222a0 65 6e 2c 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f  en, SQLITE_TEMP_
222b0 46 49 4c 45 5f 50 52 45 46 49 58 29 3b 0a 0a 20  FILE_PREFIX);.. 
222c0 20 6a 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c   j = sqlite3Strl
222d0 65 6e 33 30 28 7a 42 75 66 29 3b 0a 20 20 73 71  en30(zBuf);.  sq
222e0 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73  lite3_randomness
222f0 28 31 35 2c 20 26 7a 42 75 66 5b 6a 5d 29 3b 0a  (15, &zBuf[j]);.
22300 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31 35 3b    for(i=0; i<15;
22310 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20   i++, j++){.    
22320 7a 42 75 66 5b 6a 5d 20 3d 20 28 63 68 61 72 29  zBuf[j] = (char)
22330 7a 43 68 61 72 73 5b 20 28 28 75 6e 73 69 67 6e  zChars[ ((unsign
22340 65 64 20 63 68 61 72 29 7a 42 75 66 5b 6a 5d 29  ed char)zBuf[j])
22350 25 28 73 69 7a 65 6f 66 28 7a 43 68 61 72 73 29  %(sizeof(zChars)
22360 2d 31 29 20 5d 3b 0a 20 20 7d 0a 20 20 7a 42 75  -1) ];.  }.  zBu
22370 66 5b 6a 5d 20 3d 20 30 3b 0a 20 20 7a 42 75 66  f[j] = 0;.  zBuf
22380 5b 6a 2b 31 5d 20 3d 20 30 3b 0a 20 20 2a 70 7a  [j+1] = 0;.  *pz
22390 42 75 66 20 3d 20 7a 42 75 66 3b 0a 0a 20 20 4f  Buf = zBuf;..  O
223a0 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49  STRACE(("TEMP-FI
223b0 4c 45 4e 41 4d 45 20 6e 61 6d 65 3d 25 73 2c 20  LENAME name=%s, 
223c0 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c  rc=SQLITE_OK\n",
223d0 20 7a 42 75 66 29 29 3b 0a 20 20 72 65 74 75 72   zBuf));.  retur
223e0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
223f0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
22400 45 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 66  E if the named f
22410 69 6c 65 20 69 73 20 72 65 61 6c 6c 79 20 61 20  ile is really a 
22420 64 69 72 65 63 74 6f 72 79 2e 20 20 52 65 74 75  directory.  Retu
22430 72 6e 20 66 61 6c 73 65 20 69 66 0a 2a 2a 20 69  rn false if.** i
22440 74 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 6f  t is something o
22450 74 68 65 72 20 74 68 61 6e 20 61 20 64 69 72 65  ther than a dire
22460 63 74 6f 72 79 2c 20 6f 72 20 69 66 20 74 68 65  ctory, or if the
22470 72 65 20 69 73 20 61 6e 79 20 6b 69 6e 64 20 6f  re is any kind o
22480 66 20 6d 65 6d 6f 72 79 0a 2a 2a 20 61 6c 6c 6f  f memory.** allo
22490 63 61 74 69 6f 6e 20 66 61 69 6c 75 72 65 2e 0a  cation failure..
224a0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
224b0 6e 49 73 44 69 72 28 63 6f 6e 73 74 20 76 6f 69  nIsDir(const voi
224c0 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 29 7b 0a  d *zConverted){.
224d0 20 20 44 57 4f 52 44 20 61 74 74 72 3b 0a 20 20    DWORD attr;.  
224e0 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 44 57  int rc = 0;.  DW
224f0 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 0a  ORD lastErrno;..
22500 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29    if( osIsNT() )
22510 7b 0a 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20  {.    int cnt = 
22520 30 3b 0a 20 20 20 20 57 49 4e 33 32 5f 46 49 4c  0;.    WIN32_FIL
22530 45 5f 41 54 54 52 49 42 55 54 45 5f 44 41 54 41  E_ATTRIBUTE_DATA
22540 20 73 41 74 74 72 44 61 74 61 3b 0a 20 20 20 20   sAttrData;.    
22550 6d 65 6d 73 65 74 28 26 73 41 74 74 72 44 61 74  memset(&sAttrDat
22560 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 41 74  a, 0, sizeof(sAt
22570 74 72 44 61 74 61 29 29 3b 0a 20 20 20 20 77 68  trData));.    wh
22580 69 6c 65 28 20 21 28 72 63 20 3d 20 6f 73 47 65  ile( !(rc = osGe
22590 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 45  tFileAttributesE
225a0 78 57 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e  xW((LPCWSTR)zCon
225b0 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20  verted,.        
225c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
225d0 20 20 20 20 20 47 65 74 46 69 6c 65 45 78 49 6e       GetFileExIn
225e0 66 6f 53 74 61 6e 64 61 72 64 2c 0a 20 20 20 20  foStandard,.    
225f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22600 20 20 20 20 20 20 20 20 20 26 73 41 74 74 72 44           &sAttrD
22610 61 74 61 29 29 20 26 26 20 77 69 6e 52 65 74 72  ata)) && winRetr
22620 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c 61  yIoerr(&cnt, &la
22630 73 74 45 72 72 6e 6f 29 20 29 7b 7d 0a 20 20 20  stErrno) ){}.   
22640 20 69 66 28 20 21 72 63 20 29 7b 0a 20 20 20 20   if( !rc ){.    
22650 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 49    return 0; /* I
22660 6e 76 61 6c 69 64 20 6e 61 6d 65 3f 20 2a 2f 0a  nvalid name? */.
22670 20 20 20 20 7d 0a 20 20 20 20 61 74 74 72 20 3d      }.    attr =
22680 20 73 41 74 74 72 44 61 74 61 2e 64 77 46 69 6c   sAttrData.dwFil
22690 65 41 74 74 72 69 62 75 74 65 73 3b 0a 23 69 66  eAttributes;.#if
226a0 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
226b0 3d 3d 30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ==0.  }else{.   
226c0 20 61 74 74 72 20 3d 20 6f 73 47 65 74 46 69 6c   attr = osGetFil
226d0 65 41 74 74 72 69 62 75 74 65 73 41 28 28 63 68  eAttributesA((ch
226e0 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ar*)zConverted);
226f0 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 72 65  .#endif.  }.  re
22700 74 75 72 6e 20 28 61 74 74 72 21 3d 49 4e 56 41  turn (attr!=INVA
22710 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55  LID_FILE_ATTRIBU
22720 54 45 53 29 20 26 26 20 28 61 74 74 72 26 46 49  TES) && (attr&FI
22730 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 44 49 52  LE_ATTRIBUTE_DIR
22740 45 43 54 4f 52 59 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ECTORY);.}../*.*
22750 2a 20 4f 70 65 6e 20 61 20 66 69 6c 65 2e 0a 2a  * Open a file..*
22760 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
22770 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f  Open(.  sqlite3_
22780 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20  vfs *pVfs,      
22790 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 67 65 74    /* Used to get
227a0 20 6d 61 78 69 6d 75 6d 20 70 61 74 68 20 6e 61   maximum path na
227b0 6d 65 20 6c 65 6e 67 74 68 20 2a 2f 0a 20 20 63  me length */.  c
227c0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
227d0 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  ,        /* Name
227e0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 28 55 54   of the file (UT
227f0 46 2d 38 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65  F-8) */.  sqlite
22800 33 5f 66 69 6c 65 20 2a 69 64 2c 20 20 20 20 20  3_file *id,     
22810 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
22820 20 53 51 4c 69 74 65 20 66 69 6c 65 20 68 61 6e   SQLite file han
22830 64 6c 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  dle here */.  in
22840 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20  t flags,        
22850 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20          /* Open 
22860 6d 6f 64 65 20 66 6c 61 67 73 20 2a 2f 0a 20 20  mode flags */.  
22870 69 6e 74 20 2a 70 4f 75 74 46 6c 61 67 73 20 20  int *pOutFlags  
22880 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61            /* Sta
22890 74 75 73 20 72 65 74 75 72 6e 20 66 6c 61 67 73  tus return flags
228a0 20 2a 2f 0a 29 7b 0a 20 20 48 41 4e 44 4c 45 20   */.){.  HANDLE 
228b0 68 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45  h;.  DWORD lastE
228c0 72 72 6e 6f 20 3d 20 30 3b 0a 20 20 44 57 4f 52  rrno = 0;.  DWOR
228d0 44 20 64 77 44 65 73 69 72 65 64 41 63 63 65 73  D dwDesiredAcces
228e0 73 3b 0a 20 20 44 57 4f 52 44 20 64 77 53 68 61  s;.  DWORD dwSha
228f0 72 65 4d 6f 64 65 3b 0a 20 20 44 57 4f 52 44 20  reMode;.  DWORD 
22900 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73  dwCreationDispos
22910 69 74 69 6f 6e 3b 0a 20 20 44 57 4f 52 44 20 64  ition;.  DWORD d
22920 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75  wFlagsAndAttribu
22930 74 65 73 20 3d 20 30 3b 0a 23 69 66 20 53 51 4c  tes = 0;.#if SQL
22940 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 69  ITE_OS_WINCE.  i
22950 6e 74 20 69 73 54 65 6d 70 20 3d 20 30 3b 0a 23  nt isTemp = 0;.#
22960 65 6e 64 69 66 0a 20 20 77 69 6e 46 69 6c 65 20  endif.  winFile 
22970 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c  *pFile = (winFil
22980 65 2a 29 69 64 3b 0a 20 20 76 6f 69 64 20 2a 7a  e*)id;.  void *z
22990 43 6f 6e 76 65 72 74 65 64 3b 20 20 20 20 20 20  Converted;      
229a0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 6e          /* Filen
229b0 61 6d 65 20 69 6e 20 4f 53 20 65 6e 63 6f 64 69  ame in OS encodi
229c0 6e 67 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ng */.  const ch
229d0 61 72 20 2a 7a 55 74 66 38 4e 61 6d 65 20 3d 20  ar *zUtf8Name = 
229e0 7a 4e 61 6d 65 3b 20 2f 2a 20 46 69 6c 65 6e 61  zName; /* Filena
229f0 6d 65 20 69 6e 20 55 54 46 2d 38 20 65 6e 63 6f  me in UTF-8 enco
22a00 64 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 63 6e  ding */.  int cn
22a10 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20  t = 0;..  /* If 
22a20 61 72 67 75 6d 65 6e 74 20 7a 50 61 74 68 20 69  argument zPath i
22a30 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  s a NULL pointer
22a40 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
22a50 69 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 6f  is required to o
22a60 70 65 6e 0a 20 20 2a 2a 20 61 20 74 65 6d 70 6f  pen.  ** a tempo
22a70 72 61 72 79 20 66 69 6c 65 2e 20 55 73 65 20 74  rary file. Use t
22a80 68 69 73 20 62 75 66 66 65 72 20 74 6f 20 73 74  his buffer to st
22a90 6f 72 65 20 74 68 65 20 66 69 6c 65 20 6e 61 6d  ore the file nam
22aa0 65 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 63 68 61  e in..  */.  cha
22ab0 72 20 2a 7a 54 6d 70 6e 61 6d 65 20 3d 20 30 3b  r *zTmpname = 0;
22ac0 20 2f 2a 20 46 6f 72 20 74 65 6d 70 6f 72 61 72   /* For temporar
22ad0 79 20 66 69 6c 65 6e 61 6d 65 2c 20 69 66 20 6e  y filename, if n
22ae0 65 63 65 73 73 61 72 79 2e 20 2a 2f 0a 0a 20 20  ecessary. */..  
22af0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
22b00 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  OK;            /
22b10 2a 20 46 75 6e 63 74 69 6f 6e 20 52 65 74 75 72  * Function Retur
22b20 6e 20 43 6f 64 65 20 2a 2f 0a 23 69 66 20 21 64  n Code */.#if !d
22b30 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 7c  efined(NDEBUG) |
22b40 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  | SQLITE_OS_WINC
22b50 45 0a 20 20 69 6e 74 20 65 54 79 70 65 20 3d 20  E.  int eType = 
22b60 66 6c 61 67 73 26 30 78 46 46 46 46 46 46 30 30  flags&0xFFFFFF00
22b70 3b 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 66 69  ;  /* Type of fi
22b80 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 23 65  le to open */.#e
22b90 6e 64 69 66 0a 0a 20 20 69 6e 74 20 69 73 45 78  ndif..  int isEx
22ba0 63 6c 75 73 69 76 65 20 20 3d 20 28 66 6c 61 67  clusive  = (flag
22bb0 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
22bc0 45 58 43 4c 55 53 49 56 45 29 3b 0a 20 20 69 6e  EXCLUSIVE);.  in
22bd0 74 20 69 73 44 65 6c 65 74 65 20 20 20 20 20 3d  t isDelete     =
22be0 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
22bf0 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c  _OPEN_DELETEONCL
22c00 4f 53 45 29 3b 0a 20 20 69 6e 74 20 69 73 43 72  OSE);.  int isCr
22c10 65 61 74 65 20 20 20 20 20 3d 20 28 66 6c 61 67  eate     = (flag
22c20 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
22c30 43 52 45 41 54 45 29 3b 0a 20 20 69 6e 74 20 69  CREATE);.  int i
22c40 73 52 65 61 64 6f 6e 6c 79 20 20 20 3d 20 28 66  sReadonly   = (f
22c50 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
22c60 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20  EN_READONLY);.  
22c70 69 6e 74 20 69 73 52 65 61 64 57 72 69 74 65 20  int isReadWrite 
22c80 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49   = (flags & SQLI
22c90 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
22ca0 45 29 3b 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45  E);..#ifndef NDE
22cb0 42 55 47 0a 20 20 69 6e 74 20 69 73 4f 70 65 6e  BUG.  int isOpen
22cc0 4a 6f 75 72 6e 61 6c 20 3d 20 28 69 73 43 72 65  Journal = (isCre
22cd0 61 74 65 20 26 26 20 28 0a 20 20 20 20 20 20 20  ate && (.       
22ce0 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
22cf0 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e  PEN_MASTER_JOURN
22d00 41 4c 20 0a 20 20 20 20 20 7c 7c 20 65 54 79 70  AL .     || eTyp
22d10 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e==SQLITE_OPEN_M
22d20 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20  AIN_JOURNAL .   
22d30 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
22d40 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 29  TE_OPEN_WAL.  ))
22d50 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 4f 53 54 52  ;.#endif..  OSTR
22d60 41 43 45 28 28 22 4f 50 45 4e 20 6e 61 6d 65 3d  ACE(("OPEN name=
22d70 25 73 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66 6c  %s, pFile=%p, fl
22d80 61 67 73 3d 25 78 2c 20 70 4f 75 74 46 6c 61 67  ags=%x, pOutFlag
22d90 73 3d 25 70 5c 6e 22 2c 0a 20 20 20 20 20 20 20  s=%p\n",.       
22da0 20 20 20 20 7a 55 74 66 38 4e 61 6d 65 2c 20 69      zUtf8Name, i
22db0 64 2c 20 66 6c 61 67 73 2c 20 70 4f 75 74 46 6c  d, flags, pOutFl
22dc0 61 67 73 29 29 3b 0a 0a 20 20 2f 2a 20 43 68 65  ags));..  /* Che
22dd0 63 6b 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ck the following
22de0 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20   statements are 
22df0 74 72 75 65 3a 20 0a 20 20 2a 2a 0a 20 20 2a 2a  true: .  **.  **
22e00 20 20 20 28 61 29 20 45 78 61 63 74 6c 79 20 6f     (a) Exactly o
22e10 6e 65 20 6f 66 20 74 68 65 20 52 45 41 44 57 52  ne of the READWR
22e20 49 54 45 20 61 6e 64 20 52 45 41 44 4f 4e 4c 59  ITE and READONLY
22e30 20 66 6c 61 67 73 20 6d 75 73 74 20 62 65 20 73   flags must be s
22e40 65 74 2c 20 61 6e 64 20 0a 20 20 2a 2a 20 20 20  et, and .  **   
22e50 28 62 29 20 69 66 20 43 52 45 41 54 45 20 69 73  (b) if CREATE is
22e60 20 73 65 74 2c 20 74 68 65 6e 20 52 45 41 44 57   set, then READW
22e70 52 49 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62  RITE must also b
22e80 65 20 73 65 74 2c 20 61 6e 64 0a 20 20 2a 2a 20  e set, and.  ** 
22e90 20 20 28 63 29 20 69 66 20 45 58 43 4c 55 53 49    (c) if EXCLUSI
22ea0 56 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  VE is set, then 
22eb0 43 52 45 41 54 45 20 6d 75 73 74 20 61 6c 73 6f  CREATE must also
22ec0 20 62 65 20 73 65 74 2e 0a 20 20 2a 2a 20 20 20   be set..  **   
22ed0 28 64 29 20 69 66 20 44 45 4c 45 54 45 4f 4e 43  (d) if DELETEONC
22ee0 4c 4f 53 45 20 69 73 20 73 65 74 2c 20 74 68 65  LOSE is set, the
22ef0 6e 20 43 52 45 41 54 45 20 6d 75 73 74 20 61 6c  n CREATE must al
22f00 73 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a 2f 0a  so be set..  */.
22f10 20 20 61 73 73 65 72 74 28 28 69 73 52 65 61 64    assert((isRead
22f20 6f 6e 6c 79 3d 3d 30 20 7c 7c 20 69 73 52 65 61  only==0 || isRea
22f30 64 57 72 69 74 65 3d 3d 30 29 20 26 26 20 28 69  dWrite==0) && (i
22f40 73 52 65 61 64 57 72 69 74 65 20 7c 7c 20 69 73  sReadWrite || is
22f50 52 65 61 64 6f 6e 6c 79 29 29 3b 0a 20 20 61 73  Readonly));.  as
22f60 73 65 72 74 28 69 73 43 72 65 61 74 65 3d 3d 30  sert(isCreate==0
22f70 20 7c 7c 20 69 73 52 65 61 64 57 72 69 74 65 29   || isReadWrite)
22f80 3b 0a 20 20 61 73 73 65 72 74 28 69 73 45 78 63  ;.  assert(isExc
22f90 6c 75 73 69 76 65 3d 3d 30 20 7c 7c 20 69 73 43  lusive==0 || isC
22fa0 72 65 61 74 65 29 3b 0a 20 20 61 73 73 65 72 74  reate);.  assert
22fb0 28 69 73 44 65 6c 65 74 65 3d 3d 30 20 7c 7c 20  (isDelete==0 || 
22fc0 69 73 43 72 65 61 74 65 29 3b 0a 0a 20 20 2f 2a  isCreate);..  /*
22fd0 20 54 68 65 20 6d 61 69 6e 20 44 42 2c 20 6d 61   The main DB, ma
22fe0 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 57 41 4c 20  in journal, WAL 
22ff0 66 69 6c 65 20 61 6e 64 20 6d 61 73 74 65 72 20  file and master 
23000 6a 6f 75 72 6e 61 6c 20 61 72 65 20 6e 65 76 65  journal are neve
23010 72 20 0a 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69  r .  ** automati
23020 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 2e 20 4e  cally deleted. N
23030 6f 72 20 61 72 65 20 74 68 65 79 20 65 76 65 72  or are they ever
23040 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   temporary files
23050 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
23060 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e  (!isDelete && zN
23070 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53  ame) || eType!=S
23080 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
23090 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  DB );.  assert( 
230a0 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e  (!isDelete && zN
230b0 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53  ame) || eType!=S
230c0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
230d0 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 61 73 73  JOURNAL );.  ass
230e0 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20  ert( (!isDelete 
230f0 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79  && zName) || eTy
23100 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe!=SQLITE_OPEN_
23110 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 29  MASTER_JOURNAL )
23120 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21 69 73  ;.  assert( (!is
23130 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29  Delete && zName)
23140 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54   || eType!=SQLIT
23150 45 5f 4f 50 45 4e 5f 57 41 4c 20 29 3b 0a 0a 20  E_OPEN_WAL );.. 
23160 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74 20   /* Assert that 
23170 74 68 65 20 75 70 70 65 72 20 6c 61 79 65 72 20  the upper layer 
23180 68 61 73 20 73 65 74 20 6f 6e 65 20 6f 66 20 74  has set one of t
23190 68 65 20 22 66 69 6c 65 2d 74 79 70 65 22 20 66  he "file-type" f
231a0 6c 61 67 73 2e 20 2a 2f 0a 20 20 61 73 73 65 72  lags. */.  asser
231b0 74 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  t( eType==SQLITE
231c0 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 20 20  _OPEN_MAIN_DB   
231d0 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c     || eType==SQL
231e0 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42  ITE_OPEN_TEMP_DB
231f0 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70   .       || eTyp
23200 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e==SQLITE_OPEN_M
23210 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20 65  AIN_JOURNAL || e
23220 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
23230 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20 0a  N_TEMP_JOURNAL .
23240 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d         || eType=
23250 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42  =SQLITE_OPEN_SUB
23260 4a 4f 55 52 4e 41 4c 20 20 20 7c 7c 20 65 54 79  JOURNAL   || eTy
23270 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
23280 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a  MASTER_JOURNAL .
23290 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d         || eType=
232a0 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41  =SQLITE_OPEN_TRA
232b0 4e 53 49 45 4e 54 5f 44 42 20 7c 7c 20 65 54 79  NSIENT_DB || eTy
232c0 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
232d0 57 41 4c 0a 20 20 29 3b 0a 0a 20 20 61 73 73 65  WAL.  );..  asse
232e0 72 74 28 20 70 46 69 6c 65 21 3d 30 20 29 3b 0a  rt( pFile!=0 );.
232f0 20 20 6d 65 6d 73 65 74 28 70 46 69 6c 65 2c 20    memset(pFile, 
23300 30 2c 20 73 69 7a 65 6f 66 28 77 69 6e 46 69 6c  0, sizeof(winFil
23310 65 29 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 68 20  e));.  pFile->h 
23320 3d 20 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  = INVALID_HANDLE
23330 5f 56 41 4c 55 45 3b 0a 0a 23 69 66 20 53 51 4c  _VALUE;..#if SQL
23340 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 69  ITE_OS_WINRT.  i
23350 66 28 20 21 7a 55 74 66 38 4e 61 6d 65 20 26 26  f( !zUtf8Name &&
23360 20 21 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64   !sqlite3_temp_d
23370 69 72 65 63 74 6f 72 79 20 29 7b 0a 20 20 20 20  irectory ){.    
23380 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49  sqlite3_log(SQLI
23390 54 45 5f 45 52 52 4f 52 2c 0a 20 20 20 20 20 20  TE_ERROR,.      
233a0 20 20 22 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f    "sqlite3_temp_
233b0 64 69 72 65 63 74 6f 72 79 20 76 61 72 69 61 62  directory variab
233c0 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 73 65 74  le should be set
233d0 20 66 6f 72 20 57 69 6e 52 54 22 29 3b 0a 20 20   for WinRT");.  
233e0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49  }.#endif..  /* I
233f0 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
23400 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75  ument to this fu
23410 6e 63 74 69 6f 6e 20 69 73 20 4e 55 4c 4c 2c 20  nction is NULL, 
23420 67 65 6e 65 72 61 74 65 20 61 20 0a 20 20 2a 2a  generate a .  **
23430 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
23440 6e 61 6d 65 20 74 6f 20 75 73 65 20 0a 20 20 2a  name to use .  *
23450 2f 0a 20 20 69 66 28 20 21 7a 55 74 66 38 4e 61  /.  if( !zUtf8Na
23460 6d 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  me ){.    assert
23470 28 20 69 73 44 65 6c 65 74 65 20 26 26 20 21 69  ( isDelete && !i
23480 73 4f 70 65 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a  sOpenJournal );.
23490 20 20 20 20 72 63 20 3d 20 77 69 6e 47 65 74 54      rc = winGetT
234a0 65 6d 70 6e 61 6d 65 28 70 56 66 73 2c 20 26 7a  empname(pVfs, &z
234b0 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66  Tmpname);.    if
234c0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
234d0 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  ){.      OSTRACE
234e0 28 28 22 4f 50 45 4e 20 6e 61 6d 65 3d 25 73 2c  (("OPEN name=%s,
234f0 20 72 63 3d 25 73 22 2c 20 7a 55 74 66 38 4e 61   rc=%s", zUtf8Na
23500 6d 65 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61  me, sqlite3ErrNa
23510 6d 65 28 72 63 29 29 29 3b 0a 20 20 20 20 20 20  me(rc)));.      
23520 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
23530 0a 20 20 20 20 7a 55 74 66 38 4e 61 6d 65 20 3d  .    zUtf8Name =
23540 20 7a 54 6d 70 6e 61 6d 65 3b 0a 20 20 7d 0a 0a   zTmpname;.  }..
23550 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69    /* Database fi
23560 6c 65 6e 61 6d 65 73 20 61 72 65 20 64 6f 75 62  lenames are doub
23570 6c 65 2d 7a 65 72 6f 20 74 65 72 6d 69 6e 61 74  le-zero terminat
23580 65 64 20 69 66 20 74 68 65 79 20 61 72 65 20 6e  ed if they are n
23590 6f 74 0a 20 20 2a 2a 20 55 52 49 73 20 77 69 74  ot.  ** URIs wit
235a0 68 20 70 61 72 61 6d 65 74 65 72 73 2e 20 20 48  h parameters.  H
235b0 65 6e 63 65 2c 20 74 68 65 79 20 63 61 6e 20 61  ence, they can a
235c0 6c 77 61 79 73 20 62 65 20 70 61 73 73 65 64 20  lways be passed 
235d0 69 6e 74 6f 0a 20 20 2a 2a 20 73 71 6c 69 74 65  into.  ** sqlite
235e0 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28  3_uri_parameter(
235f0 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  )..  */.  assert
23600 28 20 28 65 54 79 70 65 21 3d 53 51 4c 49 54 45  ( (eType!=SQLITE
23610 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 20 7c  _OPEN_MAIN_DB) |
23620 7c 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  | (flags & SQLIT
23630 45 5f 4f 50 45 4e 5f 55 52 49 29 20 7c 7c 0a 20  E_OPEN_URI) ||. 
23640 20 20 20 20 20 20 7a 55 74 66 38 4e 61 6d 65 5b        zUtf8Name[
23650 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
23660 7a 55 74 66 38 4e 61 6d 65 29 2b 31 5d 3d 3d 30  zUtf8Name)+1]==0
23670 20 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 76 65 72   );..  /* Conver
23680 74 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 74  t the filename t
23690 6f 20 74 68 65 20 73 79 73 74 65 6d 20 65 6e 63  o the system enc
236a0 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20 7a 43 6f 6e  oding. */.  zCon
236b0 76 65 72 74 65 64 20 3d 20 77 69 6e 43 6f 6e 76  verted = winConv
236c0 65 72 74 46 72 6f 6d 55 74 66 38 46 69 6c 65 6e  ertFromUtf8Filen
236d0 61 6d 65 28 7a 55 74 66 38 4e 61 6d 65 29 3b 0a  ame(zUtf8Name);.
236e0 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64    if( zConverted
236f0 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
23700 65 33 5f 66 72 65 65 28 7a 54 6d 70 6e 61 6d 65  e3_free(zTmpname
23710 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  );.    OSTRACE((
23720 22 4f 50 45 4e 20 6e 61 6d 65 3d 25 73 2c 20 72  "OPEN name=%s, r
23730 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  c=SQLITE_IOERR_N
23740 4f 4d 45 4d 22 2c 20 7a 55 74 66 38 4e 61 6d 65  OMEM", zUtf8Name
23750 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ));.    return S
23760 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
23770 4d 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 77 69  M;.  }..  if( wi
23780 6e 49 73 44 69 72 28 7a 43 6f 6e 76 65 72 74 65  nIsDir(zConverte
23790 64 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  d) ){.    sqlite
237a0 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
237b0 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  d);.    sqlite3_
237c0 66 72 65 65 28 7a 54 6d 70 6e 61 6d 65 29 3b 0a  free(zTmpname);.
237d0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50      OSTRACE(("OP
237e0 45 4e 20 6e 61 6d 65 3d 25 73 2c 20 72 63 3d 53  EN name=%s, rc=S
237f0 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 49  QLITE_CANTOPEN_I
23800 53 44 49 52 22 2c 20 7a 55 74 66 38 4e 61 6d 65  SDIR", zUtf8Name
23810 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ));.    return S
23820 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 49  QLITE_CANTOPEN_I
23830 53 44 49 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  SDIR;.  }..  if(
23840 20 69 73 52 65 61 64 57 72 69 74 65 20 29 7b 0a   isReadWrite ){.
23850 20 20 20 20 64 77 44 65 73 69 72 65 64 41 63 63      dwDesiredAcc
23860 65 73 73 20 3d 20 47 45 4e 45 52 49 43 5f 52 45  ess = GENERIC_RE
23870 41 44 20 7c 20 47 45 4e 45 52 49 43 5f 57 52 49  AD | GENERIC_WRI
23880 54 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  TE;.  }else{.   
23890 20 64 77 44 65 73 69 72 65 64 41 63 63 65 73 73   dwDesiredAccess
238a0 20 3d 20 47 45 4e 45 52 49 43 5f 52 45 41 44 3b   = GENERIC_READ;
238b0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 51 4c 49 54  .  }..  /* SQLIT
238c0 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45  E_OPEN_EXCLUSIVE
238d0 20 69 73 20 75 73 65 64 20 74 6f 20 6d 61 6b 65   is used to make
238e0 20 73 75 72 65 20 74 68 61 74 20 61 20 6e 65 77   sure that a new
238f0 20 66 69 6c 65 20 69 73 20 0a 20 20 2a 2a 20 63   file is .  ** c
23900 72 65 61 74 65 64 2e 20 53 51 4c 69 74 65 20 64  reated. SQLite d
23910 6f 65 73 6e 27 74 20 75 73 65 20 69 74 20 74 6f  oesn't use it to
23920 20 69 6e 64 69 63 61 74 65 20 22 65 78 63 6c 75   indicate "exclu
23930 73 69 76 65 20 61 63 63 65 73 73 22 20 0a 20 20  sive access" .  
23940 2a 2a 20 61 73 20 69 74 20 69 73 20 75 73 75 61  ** as it is usua
23950 6c 6c 79 20 75 6e 64 65 72 73 74 6f 6f 64 2e 0a  lly understood..
23960 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 45 78 63    */.  if( isExc
23970 6c 75 73 69 76 65 20 29 7b 0a 20 20 20 20 2f 2a  lusive ){.    /*
23980 20 43 72 65 61 74 65 73 20 61 20 6e 65 77 20 66   Creates a new f
23990 69 6c 65 2c 20 6f 6e 6c 79 20 69 66 20 69 74 20  ile, only if it 
239a0 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  does not already
239b0 20 65 78 69 73 74 2e 20 2a 2f 0a 20 20 20 20 2f   exist. */.    /
239c0 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 65 78  * If the file ex
239d0 69 73 74 73 2c 20 69 74 20 66 61 69 6c 73 2e 20  ists, it fails. 
239e0 2a 2f 0a 20 20 20 20 64 77 43 72 65 61 74 69 6f  */.    dwCreatio
239f0 6e 44 69 73 70 6f 73 69 74 69 6f 6e 20 3d 20 43  nDisposition = C
23a00 52 45 41 54 45 5f 4e 45 57 3b 0a 20 20 7d 65 6c  REATE_NEW;.  }el
23a10 73 65 20 69 66 28 20 69 73 43 72 65 61 74 65 20  se if( isCreate 
23a20 29 7b 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 65  ){.    /* Open e
23a30 78 69 73 74 69 6e 67 20 66 69 6c 65 2c 20 6f 72  xisting file, or
23a40 20 63 72 65 61 74 65 20 69 66 20 69 74 20 64 6f   create if it do
23a50 65 73 6e 27 74 20 65 78 69 73 74 20 2a 2f 0a 20  esn't exist */. 
23a60 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73     dwCreationDis
23a70 70 6f 73 69 74 69 6f 6e 20 3d 20 4f 50 45 4e 5f  position = OPEN_
23a80 41 4c 57 41 59 53 3b 0a 20 20 7d 65 6c 73 65 7b  ALWAYS;.  }else{
23a90 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 73 20 61 20  .    /* Opens a 
23aa0 66 69 6c 65 2c 20 6f 6e 6c 79 20 69 66 20 69 74  file, only if it
23ab0 20 65 78 69 73 74 73 2e 20 2a 2f 0a 20 20 20 20   exists. */.    
23ac0 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73  dwCreationDispos
23ad0 69 74 69 6f 6e 20 3d 20 4f 50 45 4e 5f 45 58 49  ition = OPEN_EXI
23ae0 53 54 49 4e 47 3b 0a 20 20 7d 0a 0a 20 20 64 77  STING;.  }..  dw
23af0 53 68 61 72 65 4d 6f 64 65 20 3d 20 46 49 4c 45  ShareMode = FILE
23b00 5f 53 48 41 52 45 5f 52 45 41 44 20 7c 20 46 49  _SHARE_READ | FI
23b10 4c 45 5f 53 48 41 52 45 5f 57 52 49 54 45 3b 0a  LE_SHARE_WRITE;.
23b20 0a 20 20 69 66 28 20 69 73 44 65 6c 65 74 65 20  .  if( isDelete 
23b30 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  ){.#if SQLITE_OS
23b40 5f 57 49 4e 43 45 0a 20 20 20 20 64 77 46 6c 61  _WINCE.    dwFla
23b50 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 20  gsAndAttributes 
23b60 3d 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  = FILE_ATTRIBUTE
23b70 5f 48 49 44 44 45 4e 3b 0a 20 20 20 20 69 73 54  _HIDDEN;.    isT
23b80 65 6d 70 20 3d 20 31 3b 0a 23 65 6c 73 65 0a 20  emp = 1;.#else. 
23b90 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74     dwFlagsAndAtt
23ba0 72 69 62 75 74 65 73 20 3d 20 46 49 4c 45 5f 41  ributes = FILE_A
23bb0 54 54 52 49 42 55 54 45 5f 54 45 4d 50 4f 52 41  TTRIBUTE_TEMPORA
23bc0 52 59 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  RY.             
23bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23be0 20 20 7c 20 46 49 4c 45 5f 41 54 54 52 49 42 55    | FILE_ATTRIBU
23bf0 54 45 5f 48 49 44 44 45 4e 0a 20 20 20 20 20 20  TE_HIDDEN.      
23c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c10 20 20 20 20 20 20 20 20 20 7c 20 46 49 4c 45 5f           | FILE_
23c20 46 4c 41 47 5f 44 45 4c 45 54 45 5f 4f 4e 5f 43  FLAG_DELETE_ON_C
23c30 4c 4f 53 45 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  LOSE;.#endif.  }
23c40 65 6c 73 65 7b 0a 20 20 20 20 64 77 46 6c 61 67  else{.    dwFlag
23c50 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 20 3d  sAndAttributes =
23c60 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f   FILE_ATTRIBUTE_
23c70 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20 2f 2a  NORMAL;.  }.  /*
23c80 20 52 65 70 6f 72 74 73 20 66 72 6f 6d 20 74 68   Reports from th
23c90 65 20 69 6e 74 65 72 6e 65 74 20 61 72 65 20 74  e internet are t
23ca0 68 61 74 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  hat performance 
23cb0 69 73 20 61 6c 77 61 79 73 0a 20 20 2a 2a 20 62  is always.  ** b
23cc0 65 74 74 65 72 20 69 66 20 46 49 4c 45 5f 46 4c  etter if FILE_FL
23cd0 41 47 5f 52 41 4e 44 4f 4d 5f 41 43 43 45 53 53  AG_RANDOM_ACCESS
23ce0 20 69 73 20 75 73 65 64 2e 20 20 54 69 63 6b 65   is used.  Ticke
23cf0 74 20 23 32 36 39 39 2e 20 2a 2f 0a 23 69 66 20  t #2699. */.#if 
23d00 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
23d10 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72    dwFlagsAndAttr
23d20 69 62 75 74 65 73 20 7c 3d 20 46 49 4c 45 5f 46  ibutes |= FILE_F
23d30 4c 41 47 5f 52 41 4e 44 4f 4d 5f 41 43 43 45 53  LAG_RANDOM_ACCES
23d40 53 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28  S;.#endif..  if(
23d50 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 23 69 66   osIsNT() ){.#if
23d60 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
23d70 0a 20 20 20 20 43 52 45 41 54 45 46 49 4c 45 32  .    CREATEFILE2
23d80 5f 45 58 54 45 4e 44 45 44 5f 50 41 52 41 4d 45  _EXTENDED_PARAME
23d90 54 45 52 53 20 65 78 74 65 6e 64 65 64 50 61 72  TERS extendedPar
23da0 61 6d 65 74 65 72 73 3b 0a 20 20 20 20 65 78 74  ameters;.    ext
23db0 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73 2e  endedParameters.
23dc0 64 77 53 69 7a 65 20 3d 20 73 69 7a 65 6f 66 28  dwSize = sizeof(
23dd0 43 52 45 41 54 45 46 49 4c 45 32 5f 45 58 54 45  CREATEFILE2_EXTE
23de0 4e 44 45 44 5f 50 41 52 41 4d 45 54 45 52 53 29  NDED_PARAMETERS)
23df0 3b 0a 20 20 20 20 65 78 74 65 6e 64 65 64 50 61  ;.    extendedPa
23e00 72 61 6d 65 74 65 72 73 2e 64 77 46 69 6c 65 41  rameters.dwFileA
23e10 74 74 72 69 62 75 74 65 73 20 3d 0a 20 20 20 20  ttributes =.    
23e20 20 20 20 20 20 20 20 20 64 77 46 6c 61 67 73 41          dwFlagsA
23e30 6e 64 41 74 74 72 69 62 75 74 65 73 20 26 20 46  ndAttributes & F
23e40 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 4d 41  ILE_ATTRIBUTE_MA
23e50 53 4b 3b 0a 20 20 20 20 65 78 74 65 6e 64 65 64  SK;.    extended
23e60 50 61 72 61 6d 65 74 65 72 73 2e 64 77 46 69 6c  Parameters.dwFil
23e70 65 46 6c 61 67 73 20 3d 20 64 77 46 6c 61 67 73  eFlags = dwFlags
23e80 41 6e 64 41 74 74 72 69 62 75 74 65 73 20 26 20  AndAttributes & 
23e90 46 49 4c 45 5f 46 4c 41 47 5f 4d 41 53 4b 3b 0a  FILE_FLAG_MASK;.
23ea0 20 20 20 20 65 78 74 65 6e 64 65 64 50 61 72 61      extendedPara
23eb0 6d 65 74 65 72 73 2e 64 77 53 65 63 75 72 69 74  meters.dwSecurit
23ec0 79 51 6f 73 46 6c 61 67 73 20 3d 20 53 45 43 55  yQosFlags = SECU
23ed0 52 49 54 59 5f 41 4e 4f 4e 59 4d 4f 55 53 3b 0a  RITY_ANONYMOUS;.
23ee0 20 20 20 20 65 78 74 65 6e 64 65 64 50 61 72 61      extendedPara
23ef0 6d 65 74 65 72 73 2e 6c 70 53 65 63 75 72 69 74  meters.lpSecurit
23f00 79 41 74 74 72 69 62 75 74 65 73 20 3d 20 4e 55  yAttributes = NU
23f10 4c 4c 3b 0a 20 20 20 20 65 78 74 65 6e 64 65 64  LL;.    extended
23f20 50 61 72 61 6d 65 74 65 72 73 2e 68 54 65 6d 70  Parameters.hTemp
23f30 6c 61 74 65 46 69 6c 65 20 3d 20 4e 55 4c 4c 3b  lateFile = NULL;
23f40 0a 20 20 20 20 77 68 69 6c 65 28 20 28 68 20 3d  .    while( (h =
23f50 20 6f 73 43 72 65 61 74 65 46 69 6c 65 32 28 28   osCreateFile2((
23f60 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74  LPCWSTR)zConvert
23f70 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ed,.            
23f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23f90 20 20 64 77 44 65 73 69 72 65 64 41 63 63 65 73    dwDesiredAcces
23fa0 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s,.             
23fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23fc0 20 64 77 53 68 61 72 65 4d 6f 64 65 2c 0a 20 20   dwShareMode,.  
23fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23fe0 20 20 20 20 20 20 20 20 20 20 20 20 64 77 43 72              dwCr
23ff0 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f  eationDispositio
24000 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n,.             
24010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24020 20 26 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65   &extendedParame
24030 74 65 72 73 29 29 3d 3d 49 4e 56 41 4c 49 44 5f  ters))==INVALID_
24040 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 26 26 0a  HANDLE_VALUE &&.
24050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 69                wi
24070 6e 52 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74  nRetryIoerr(&cnt
24080 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b  , &lastErrno) ){
24090 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
240a0 2f 2a 20 4e 6f 6f 70 20 2a 2f 0a 20 20 20 20 7d  /* Noop */.    }
240b0 0a 23 65 6c 73 65 0a 20 20 20 20 77 68 69 6c 65  .#else.    while
240c0 28 20 28 68 20 3d 20 6f 73 43 72 65 61 74 65 46  ( (h = osCreateF
240d0 69 6c 65 57 28 28 4c 50 43 57 53 54 52 29 7a 43  ileW((LPCWSTR)zC
240e0 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20  onverted,.      
240f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24100 20 20 20 20 20 20 20 20 64 77 44 65 73 69 72 65          dwDesire
24110 64 41 63 63 65 73 73 2c 0a 20 20 20 20 20 20 20  dAccess,.       
24120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24130 20 20 20 20 20 20 20 64 77 53 68 61 72 65 4d 6f         dwShareMo
24140 64 65 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20  de, NULL,.      
24150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24160 20 20 20 20 20 20 20 20 64 77 43 72 65 61 74 69          dwCreati
24170 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 2c 0a 20  onDisposition,. 
24180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24190 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77 46               dwF
241a0 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65  lagsAndAttribute
241b0 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s,.             
241c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
241d0 20 4e 55 4c 4c 29 29 3d 3d 49 4e 56 41 4c 49 44   NULL))==INVALID
241e0 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 26 26  _HANDLE_VALUE &&
241f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
24200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
24210 69 6e 52 65 74 72 79 49 6f 65 72 72 28 26 63 6e  inRetryIoerr(&cn
24220 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29  t, &lastErrno) )
24230 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
24240 20 2f 2a 20 4e 6f 6f 70 20 2a 2f 0a 20 20 20 20   /* Noop */.    
24250 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 69 66  }.#endif.  }.#if
24260 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  def SQLITE_WIN32
24270 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65  _HAS_ANSI.  else
24280 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 68 20  {.    while( (h 
24290 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65 41 28  = osCreateFileA(
242a0 28 4c 50 43 53 54 52 29 7a 43 6f 6e 76 65 72 74  (LPCSTR)zConvert
242b0 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ed,.            
242c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
242d0 20 20 64 77 44 65 73 69 72 65 64 41 63 63 65 73    dwDesiredAcces
242e0 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s,.             
242f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24300 20 64 77 53 68 61 72 65 4d 6f 64 65 2c 20 4e 55   dwShareMode, NU
24310 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  LL,.            
24320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24330 20 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70    dwCreationDisp
24340 6f 73 69 74 69 6f 6e 2c 0a 20 20 20 20 20 20 20  osition,.       
24350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24360 20 20 20 20 20 20 20 64 77 46 6c 61 67 73 41 6e         dwFlagsAn
24370 64 41 74 74 72 69 62 75 74 65 73 2c 0a 20 20 20  dAttributes,.   
24380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24390 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 29             NULL)
243a0 29 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c  )==INVALID_HANDL
243b0 45 5f 56 41 4c 55 45 20 26 26 0a 20 20 20 20 20  E_VALUE &&.     
243c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
243d0 20 20 20 20 20 20 20 20 20 77 69 6e 52 65 74 72           winRetr
243e0 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c 61  yIoerr(&cnt, &la
243f0 73 74 45 72 72 6e 6f 29 20 29 7b 0a 20 20 20 20  stErrno) ){.    
24400 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f             /* No
24410 6f 70 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a  op */.    }.  }.
24420 23 65 6e 64 69 66 0a 20 20 77 69 6e 4c 6f 67 49  #endif.  winLogI
24430 6f 65 72 72 28 63 6e 74 29 3b 0a 0a 20 20 4f 53  oerr(cnt);..  OS
24440 54 52 41 43 45 28 28 22 4f 50 45 4e 20 66 69 6c  TRACE(("OPEN fil
24450 65 3d 25 70 2c 20 6e 61 6d 65 3d 25 73 2c 20 61  e=%p, name=%s, a
24460 63 63 65 73 73 3d 25 6c 78 2c 20 72 63 3d 25 73  ccess=%lx, rc=%s
24470 5c 6e 22 2c 20 68 2c 20 7a 55 74 66 38 4e 61 6d  \n", h, zUtf8Nam
24480 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 64 77  e,.           dw
24490 44 65 73 69 72 65 64 41 63 63 65 73 73 2c 20 28  DesiredAccess, (
244a0 68 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c  h==INVALID_HANDL
244b0 45 5f 56 41 4c 55 45 29 20 3f 20 22 66 61 69 6c  E_VALUE) ? "fail
244c0 65 64 22 20 3a 20 22 6f 6b 22 29 29 3b 0a 0a 20  ed" : "ok"));.. 
244d0 20 69 66 28 20 68 3d 3d 49 4e 56 41 4c 49 44 5f   if( h==INVALID_
244e0 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 7b 0a  HANDLE_VALUE ){.
244f0 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
24500 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f  rrno = lastErrno
24510 3b 0a 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f  ;.    winLogErro
24520 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  r(SQLITE_CANTOPE
24530 4e 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  N, pFile->lastEr
24540 72 6e 6f 2c 20 22 77 69 6e 4f 70 65 6e 22 2c 20  rno, "winOpen", 
24550 7a 55 74 66 38 4e 61 6d 65 29 3b 0a 20 20 20 20  zUtf8Name);.    
24560 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
24570 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 73 71  nverted);.    sq
24580 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 6d 70 6e  lite3_free(zTmpn
24590 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 69 73  ame);.    if( is
245a0 52 65 61 64 57 72 69 74 65 20 26 26 20 21 69 73  ReadWrite && !is
245b0 45 78 63 6c 75 73 69 76 65 20 29 7b 0a 20 20 20  Exclusive ){.   
245c0 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4f 70 65     return winOpe
245d0 6e 28 70 56 66 73 2c 20 7a 4e 61 6d 65 2c 20 69  n(pVfs, zName, i
245e0 64 2c 20 0a 20 20 20 20 20 20 20 20 20 28 28 66  d, .         ((f
245f0 6c 61 67 73 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  lags|SQLITE_OPEN
24600 5f 52 45 41 44 4f 4e 4c 59 29 20 26 0a 20 20 20  _READONLY) &.   
24610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24620 20 20 7e 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f    ~(SQLITE_OPEN_
24630 43 52 45 41 54 45 7c 53 51 4c 49 54 45 5f 4f 50  CREATE|SQLITE_OP
24640 45 4e 5f 52 45 41 44 57 52 49 54 45 29 29 2c 0a  EN_READWRITE)),.
24650 20 20 20 20 20 20 20 20 20 70 4f 75 74 46 6c 61           pOutFla
24660 67 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  gs);.    }else{.
24670 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
24680 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50  ITE_CANTOPEN_BKP
24690 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  T;.    }.  }..  
246a0 69 66 28 20 70 4f 75 74 46 6c 61 67 73 20 29 7b  if( pOutFlags ){
246b0 0a 20 20 20 20 69 66 28 20 69 73 52 65 61 64 57  .    if( isReadW
246c0 72 69 74 65 20 29 7b 0a 20 20 20 20 20 20 2a 70  rite ){.      *p
246d0 4f 75 74 46 6c 61 67 73 20 3d 20 53 51 4c 49 54  OutFlags = SQLIT
246e0 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
246f0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
24700 20 20 20 2a 70 4f 75 74 46 6c 61 67 73 20 3d 20     *pOutFlags = 
24710 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
24720 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ONLY;.    }.  }.
24730 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45  .  OSTRACE(("OPE
24740 4e 20 66 69 6c 65 3d 25 70 2c 20 6e 61 6d 65 3d  N file=%p, name=
24750 25 73 2c 20 61 63 63 65 73 73 3d 25 6c 78 2c 20  %s, access=%lx, 
24760 70 4f 75 74 46 6c 61 67 73 3d 25 70 2c 20 2a 70  pOutFlags=%p, *p
24770 4f 75 74 46 6c 61 67 73 3d 25 64 2c 20 22 0a 20  OutFlags=%d, ". 
24780 20 20 20 20 20 20 20 20 20 20 22 72 63 3d 25 73            "rc=%s
24790 5c 6e 22 2c 20 68 2c 20 7a 55 74 66 38 4e 61 6d  \n", h, zUtf8Nam
247a0 65 2c 20 64 77 44 65 73 69 72 65 64 41 63 63 65  e, dwDesiredAcce
247b0 73 73 2c 20 70 4f 75 74 46 6c 61 67 73 2c 20 70  ss, pOutFlags, p
247c0 4f 75 74 46 6c 61 67 73 20 3f 0a 20 20 20 20 20  OutFlags ?.     
247d0 20 20 20 20 20 20 2a 70 4f 75 74 46 6c 61 67 73        *pOutFlags
247e0 20 3a 20 30 2c 20 28 68 3d 3d 49 4e 56 41 4c 49   : 0, (h==INVALI
247f0 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 29 20  D_HANDLE_VALUE) 
24800 3f 20 22 66 61 69 6c 65 64 22 20 3a 20 22 6f 6b  ? "failed" : "ok
24810 22 29 29 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45  "));..#if SQLITE
24820 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 69 66 28 20  _OS_WINCE.  if( 
24830 69 73 52 65 61 64 57 72 69 74 65 20 26 26 20 65  isReadWrite && e
24840 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
24850 4e 5f 4d 41 49 4e 5f 44 42 0a 20 20 20 20 20 20  N_MAIN_DB.      
24860 20 26 26 20 28 72 63 20 3d 20 77 69 6e 63 65 43   && (rc = winceC
24870 72 65 61 74 65 4c 6f 63 6b 28 7a 4e 61 6d 65 2c  reateLock(zName,
24880 20 70 46 69 6c 65 29 29 21 3d 53 51 4c 49 54 45   pFile))!=SQLITE
24890 5f 4f 4b 0a 20 20 29 7b 0a 20 20 20 20 6f 73 43  _OK.  ){.    osC
248a0 6c 6f 73 65 48 61 6e 64 6c 65 28 68 29 3b 0a 20  loseHandle(h);. 
248b0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
248c0 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20  zConverted);.   
248d0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54   sqlite3_free(zT
248e0 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20 4f 53 54  mpname);.    OST
248f0 52 41 43 45 28 28 22 4f 50 45 4e 2d 43 45 2d 4c  RACE(("OPEN-CE-L
24900 4f 43 4b 20 6e 61 6d 65 3d 25 73 2c 20 72 63 3d  OCK name=%s, rc=
24910 25 73 5c 6e 22 2c 20 7a 4e 61 6d 65 2c 20 73 71  %s\n", zName, sq
24920 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29  lite3ErrName(rc)
24930 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  ));.    return r
24940 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 54  c;.  }.  if( isT
24950 65 6d 70 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  emp ){.    pFile
24960 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65  ->zDeleteOnClose
24970 20 3d 20 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20   = zConverted;. 
24980 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
24990 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
249a0 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
249b0 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66    }..  sqlite3_f
249c0 72 65 65 28 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20  ree(zTmpname);. 
249d0 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20   pFile->pMethod 
249e0 3d 20 26 77 69 6e 49 6f 4d 65 74 68 6f 64 3b 0a  = &winIoMethod;.
249f0 20 20 70 46 69 6c 65 2d 3e 70 56 66 73 20 3d 20    pFile->pVfs = 
24a00 70 56 66 73 3b 0a 20 20 70 46 69 6c 65 2d 3e 68  pVfs;.  pFile->h
24a10 20 3d 20 68 3b 0a 20 20 69 66 28 20 69 73 52 65   = h;.  if( isRe
24a20 61 64 6f 6e 6c 79 20 29 7b 0a 20 20 20 20 70 46  adonly ){.    pF
24a30 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c  ile->ctrlFlags |
24a40 3d 20 57 49 4e 46 49 4c 45 5f 52 44 4f 4e 4c 59  = WINFILE_RDONLY
24a50 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  ;.  }.  if( sqli
24a60 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28  te3_uri_boolean(
24a70 7a 4e 61 6d 65 2c 20 22 70 73 6f 77 22 2c 20 53  zName, "psow", S
24a80 51 4c 49 54 45 5f 50 4f 57 45 52 53 41 46 45 5f  QLITE_POWERSAFE_
24a90 4f 56 45 52 57 52 49 54 45 29 20 29 7b 0a 20 20  OVERWRITE) ){.  
24aa0 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61    pFile->ctrlFla
24ab0 67 73 20 7c 3d 20 57 49 4e 46 49 4c 45 5f 50 53  gs |= WINFILE_PS
24ac0 4f 57 3b 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d  OW;.  }.  pFile-
24ad0 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 4e 4f 5f  >lastErrno = NO_
24ae0 45 52 52 4f 52 3b 0a 20 20 70 46 69 6c 65 2d 3e  ERROR;.  pFile->
24af0 7a 50 61 74 68 20 3d 20 7a 4e 61 6d 65 3b 0a 23  zPath = zName;.#
24b00 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
24b10 41 50 5f 53 49 5a 45 3e 30 0a 20 20 70 46 69 6c  AP_SIZE>0.  pFil
24b20 65 2d 3e 68 4d 61 70 20 3d 20 4e 55 4c 4c 3b 0a  e->hMap = NULL;.
24b30 20 20 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67    pFile->pMapReg
24b40 69 6f 6e 20 3d 20 30 3b 0a 20 20 70 46 69 6c 65  ion = 0;.  pFile
24b50 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d 20 30 3b 0a  ->mmapSize = 0;.
24b60 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a    pFile->mmapSiz
24b70 65 41 63 74 75 61 6c 20 3d 20 30 3b 0a 20 20 70  eActual = 0;.  p
24b80 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61  File->mmapSizeMa
24b90 78 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  x = sqlite3Globa
24ba0 6c 43 6f 6e 66 69 67 2e 73 7a 4d 6d 61 70 3b 0a  lConfig.szMmap;.
24bb0 23 65 6e 64 69 66 0a 0a 20 20 4f 70 65 6e 43 6f  #endif..  OpenCo
24bc0 75 6e 74 65 72 28 2b 31 29 3b 0a 20 20 72 65 74  unter(+1);.  ret
24bd0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
24be0 20 44 65 6c 65 74 65 20 74 68 65 20 6e 61 6d 65   Delete the name
24bf0 64 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  d file..**.** No
24c00 74 65 20 74 68 61 74 20 57 69 6e 64 6f 77 73 20  te that Windows 
24c10 64 6f 65 73 20 6e 6f 74 20 61 6c 6c 6f 77 20 61  does not allow a
24c20 20 66 69 6c 65 20 74 6f 20 62 65 20 64 65 6c 65   file to be dele
24c30 74 65 64 20 69 66 20 73 6f 6d 65 20 6f 74 68 65  ted if some othe
24c40 72 0a 2a 2a 20 70 72 6f 63 65 73 73 20 68 61 73  r.** process has
24c50 20 69 74 20 6f 70 65 6e 2e 20 20 53 6f 6d 65 74   it open.  Somet
24c60 69 6d 65 73 20 61 20 76 69 72 75 73 20 73 63 61  imes a virus sca
24c70 6e 6e 65 72 20 6f 72 20 69 6e 64 65 78 69 6e 67  nner or indexing
24c80 20 70 72 6f 67 72 61 6d 0a 2a 2a 20 77 69 6c 6c   program.** will
24c90 20 6f 70 65 6e 20 61 20 6a 6f 75 72 6e 61 6c 20   open a journal 
24ca0 66 69 6c 65 20 73 68 6f 72 74 6c 79 20 61 66 74  file shortly aft
24cb0 65 72 20 69 74 20 69 73 20 63 72 65 61 74 65 64  er it is created
24cc0 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 64 6f 0a   in order to do.
24cd0 2a 2a 20 77 68 61 74 65 76 65 72 20 69 74 20 64  ** whatever it d
24ce0 6f 65 73 2e 20 20 57 68 69 6c 65 20 74 68 69 73  oes.  While this
24cf0 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69   other process i
24d00 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 0a 2a 2a  s holding the.**
24d10 20 66 69 6c 65 20 6f 70 65 6e 2c 20 77 65 20 77   file open, we w
24d20 69 6c 6c 20 62 65 20 75 6e 61 62 6c 65 20 74 6f  ill be unable to
24d30 20 64 65 6c 65 74 65 20 69 74 2e 20 20 54 6f 20   delete it.  To 
24d40 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 69 73  work around this
24d50 0a 2a 2a 20 70 72 6f 62 6c 65 6d 2c 20 77 65 20  .** problem, we 
24d60 64 65 6c 61 79 20 31 30 30 20 6d 69 6c 6c 69 73  delay 100 millis
24d70 65 63 6f 6e 64 73 20 61 6e 64 20 74 72 79 20 74  econds and try t
24d80 6f 20 64 65 6c 65 74 65 20 61 67 61 69 6e 2e 20  o delete again. 
24d90 20 55 70 0a 2a 2a 20 74 6f 20 4d 58 5f 44 45 4c   Up.** to MX_DEL
24da0 45 54 49 4f 4e 5f 41 54 54 45 4d 50 54 73 20 64  ETION_ATTEMPTs d
24db0 65 6c 65 74 69 6f 6e 20 61 74 74 65 6d 70 74 73  eletion attempts
24dc0 20 61 72 65 20 72 75 6e 20 62 65 66 6f 72 65 20   are run before 
24dd0 67 69 76 69 6e 67 0a 2a 2a 20 75 70 20 61 6e 64  giving.** up and
24de0 20 72 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72   returning an er
24df0 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ror..*/.static i
24e00 6e 74 20 77 69 6e 44 65 6c 65 74 65 28 0a 20 20  nt winDelete(.  
24e10 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
24e20 73 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  s,          /* N
24e30 6f 74 20 75 73 65 64 20 6f 6e 20 77 69 6e 33 32  ot used on win32
24e40 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
24e50 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20   *zFilename,    
24e60 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c    /* Name of fil
24e70 65 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20  e to delete */. 
24e80 20 69 6e 74 20 73 79 6e 63 44 69 72 20 20 20 20   int syncDir    
24e90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24ea0 4e 6f 74 20 75 73 65 64 20 6f 6e 20 77 69 6e 33  Not used on win3
24eb0 32 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 63 6e  2 */.){.  int cn
24ec0 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b  t = 0;.  int rc;
24ed0 0a 20 20 44 57 4f 52 44 20 61 74 74 72 3b 0a 20  .  DWORD attr;. 
24ee0 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f   DWORD lastErrno
24ef0 20 3d 20 30 3b 0a 20 20 76 6f 69 64 20 2a 7a 43   = 0;.  void *zC
24f00 6f 6e 76 65 72 74 65 64 3b 0a 20 20 55 4e 55 53  onverted;.  UNUS
24f10 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66  ED_PARAMETER(pVf
24f20 73 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  s);.  UNUSED_PAR
24f30 41 4d 45 54 45 52 28 73 79 6e 63 44 69 72 29 3b  AMETER(syncDir);
24f40 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ..  SimulateIOEr
24f50 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54  ror(return SQLIT
24f60 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 29 3b  E_IOERR_DELETE);
24f70 0a 20 20 4f 53 54 52 41 43 45 28 28 22 44 45 4c  .  OSTRACE(("DEL
24f80 45 54 45 20 6e 61 6d 65 3d 25 73 2c 20 73 79 6e  ETE name=%s, syn
24f90 63 44 69 72 3d 25 64 5c 6e 22 2c 20 7a 46 69 6c  cDir=%d\n", zFil
24fa0 65 6e 61 6d 65 2c 20 73 79 6e 63 44 69 72 29 29  ename, syncDir))
24fb0 3b 0a 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64 20  ;..  zConverted 
24fc0 3d 20 77 69 6e 43 6f 6e 76 65 72 74 46 72 6f 6d  = winConvertFrom
24fd0 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 46 69  Utf8Filename(zFi
24fe0 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a  lename);.  if( z
24ff0 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a  Converted==0 ){.
25000 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 44 45      OSTRACE(("DE
25010 4c 45 54 45 20 6e 61 6d 65 3d 25 73 2c 20 72 63  LETE name=%s, rc
25020 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f  =SQLITE_IOERR_NO
25030 4d 45 4d 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d  MEM\n", zFilenam
25040 65 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  e));.    return 
25050 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
25060 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 73  EM;.  }.  if( os
25070 49 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 64 6f  IsNT() ){.    do
25080 20 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53   {.#if SQLITE_OS
25090 5f 57 49 4e 52 54 0a 20 20 20 20 20 20 57 49 4e  _WINRT.      WIN
250a0 33 32 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54  32_FILE_ATTRIBUT
250b0 45 5f 44 41 54 41 20 73 41 74 74 72 44 61 74 61  E_DATA sAttrData
250c0 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26  ;.      memset(&
250d0 73 41 74 74 72 44 61 74 61 2c 20 30 2c 20 73 69  sAttrData, 0, si
250e0 7a 65 6f 66 28 73 41 74 74 72 44 61 74 61 29 29  zeof(sAttrData))
250f0 3b 0a 20 20 20 20 20 20 69 66 20 28 20 6f 73 47  ;.      if ( osG
25100 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
25110 45 78 57 28 7a 43 6f 6e 76 65 72 74 65 64 2c 20  ExW(zConverted, 
25120 47 65 74 46 69 6c 65 45 78 49 6e 66 6f 53 74 61  GetFileExInfoSta
25130 6e 64 61 72 64 2c 0a 20 20 20 20 20 20 20 20 20  ndard,.         
25140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25150 20 20 20 20 20 20 20 20 20 26 73 41 74 74 72 44           &sAttrD
25160 61 74 61 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ata) ){.        
25170 61 74 74 72 20 3d 20 73 41 74 74 72 44 61 74 61  attr = sAttrData
25180 2e 64 77 46 69 6c 65 41 74 74 72 69 62 75 74 65  .dwFileAttribute
25190 73 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  s;.      }else{.
251a0 20 20 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e          lastErrn
251b0 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
251c0 6f 72 28 29 3b 0a 20 20 20 20 20 20 20 20 69 66  or();.        if
251d0 28 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52  ( lastErrno==ERR
251e0 4f 52 5f 46 49 4c 45 5f 4e 4f 54 5f 46 4f 55 4e  OR_FILE_NOT_FOUN
251f0 44 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 6c 61  D.         || la
25200 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 50  stErrno==ERROR_P
25210 41 54 48 5f 4e 4f 54 5f 46 4f 55 4e 44 20 29 7b  ATH_NOT_FOUND ){
25220 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
25230 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c  SQLITE_IOERR_DEL
25240 45 54 45 5f 4e 4f 45 4e 54 3b 20 2f 2a 20 41 6c  ETE_NOENT; /* Al
25250 72 65 61 64 79 20 67 6f 6e 65 3f 20 2a 2f 0a 20  ready gone? */. 
25260 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
25270 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
25280 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
25290 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65     }.        bre
252a0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6c 73  ak;.      }.#els
252b0 65 0a 20 20 20 20 20 20 61 74 74 72 20 3d 20 6f  e.      attr = o
252c0 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74  sGetFileAttribut
252d0 65 73 57 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  esW(zConverted);
252e0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66  .#endif.      if
252f0 20 28 20 61 74 74 72 3d 3d 49 4e 56 41 4c 49 44   ( attr==INVALID
25300 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53  _FILE_ATTRIBUTES
25310 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 61 73 74   ){.        last
25320 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
25330 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20  tError();.      
25340 20 20 69 66 28 20 6c 61 73 74 45 72 72 6e 6f 3d    if( lastErrno=
25350 3d 45 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54 5f  =ERROR_FILE_NOT_
25360 46 4f 55 4e 44 0a 20 20 20 20 20 20 20 20 20 7c  FOUND.         |
25370 7c 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52  | lastErrno==ERR
25380 4f 52 5f 50 41 54 48 5f 4e 4f 54 5f 46 4f 55 4e  OR_PATH_NOT_FOUN
25390 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  D ){.          r
253a0 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
253b0 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 3b 20 2f  _DELETE_NOENT; /
253c0 2a 20 41 6c 72 65 61 64 79 20 67 6f 6e 65 3f 20  * Already gone? 
253d0 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  */.        }else
253e0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
253f0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
25400 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
25410 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
25420 20 20 20 20 20 20 69 66 20 28 20 61 74 74 72 26        if ( attr&
25430 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 44  FILE_ATTRIBUTE_D
25440 49 52 45 43 54 4f 52 59 20 29 7b 0a 20 20 20 20  IRECTORY ){.    
25450 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
25460 45 52 52 4f 52 3b 20 2f 2a 20 46 69 6c 65 73 20  ERROR; /* Files 
25470 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20  only. */.       
25480 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
25490 20 20 20 20 20 20 69 66 20 28 20 6f 73 44 65 6c        if ( osDel
254a0 65 74 65 46 69 6c 65 57 28 7a 43 6f 6e 76 65 72  eteFileW(zConver
254b0 74 65 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ted) ){.        
254c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
254d0 2f 2a 20 44 65 6c 65 74 65 64 20 4f 4b 2e 20 2a  /* Deleted OK. *
254e0 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  /.        break;
254f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
25500 66 20 28 20 21 77 69 6e 52 65 74 72 79 49 6f 65  f ( !winRetryIoe
25510 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72  rr(&cnt, &lastEr
25520 72 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20  rno) ){.        
25530 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
25540 52 3b 20 2f 2a 20 4e 6f 20 6d 6f 72 65 20 72 65  R; /* No more re
25550 74 72 69 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20  tries. */.      
25560 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
25570 0a 20 20 20 20 7d 20 77 68 69 6c 65 28 31 29 3b  .    } while(1);
25580 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49  .  }.#ifdef SQLI
25590 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
255a0 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 64 6f  I.  else{.    do
255b0 20 7b 0a 20 20 20 20 20 20 61 74 74 72 20 3d 20   {.      attr = 
255c0 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75  osGetFileAttribu
255d0 74 65 73 41 28 7a 43 6f 6e 76 65 72 74 65 64 29  tesA(zConverted)
255e0 3b 0a 20 20 20 20 20 20 69 66 20 28 20 61 74 74  ;.      if ( att
255f0 72 3d 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f  r==INVALID_FILE_
25600 41 54 54 52 49 42 55 54 45 53 20 29 7b 0a 20 20  ATTRIBUTES ){.  
25610 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 20        lastErrno 
25620 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
25630 28 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ();.        if( 
25640 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52  lastErrno==ERROR
25650 5f 46 49 4c 45 5f 4e 4f 54 5f 46 4f 55 4e 44 0a  _FILE_NOT_FOUND.
25660 20 20 20 20 20 20 20 20 20 7c 7c 20 6c 61 73 74           || last
25670 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 50 41 54  Errno==ERROR_PAT
25680 48 5f 4e 4f 54 5f 46 4f 55 4e 44 20 29 7b 0a 20  H_NOT_FOUND ){. 
25690 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
256a0 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54  LITE_IOERR_DELET
256b0 45 5f 4e 4f 45 4e 54 3b 20 2f 2a 20 41 6c 72 65  E_NOENT; /* Alre
256c0 61 64 79 20 67 6f 6e 65 3f 20 2a 2f 0a 20 20 20  ady gone? */.   
256d0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
256e0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
256f0 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  E_ERROR;.       
25700 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b   }.        break
25710 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
25720 69 66 20 28 20 61 74 74 72 26 46 49 4c 45 5f 41  if ( attr&FILE_A
25730 54 54 52 49 42 55 54 45 5f 44 49 52 45 43 54 4f  TTRIBUTE_DIRECTO
25740 52 59 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  RY ){.        rc
25750 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
25760 20 2f 2a 20 46 69 6c 65 73 20 6f 6e 6c 79 2e 20   /* Files only. 
25770 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  */.        break
25780 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
25790 69 66 20 28 20 6f 73 44 65 6c 65 74 65 46 69 6c  if ( osDeleteFil
257a0 65 41 28 7a 43 6f 6e 76 65 72 74 65 64 29 20 29  eA(zConverted) )
257b0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
257c0 51 4c 49 54 45 5f 4f 4b 3b 20 2f 2a 20 44 65 6c  QLITE_OK; /* Del
257d0 65 74 65 64 20 4f 4b 2e 20 2a 2f 0a 20 20 20 20  eted OK. */.    
257e0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
257f0 20 7d 0a 20 20 20 20 20 20 69 66 20 28 20 21 77   }.      if ( !w
25800 69 6e 52 65 74 72 79 49 6f 65 72 72 28 26 63 6e  inRetryIoerr(&cn
25810 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29  t, &lastErrno) )
25820 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
25830 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 2f 2a 20  QLITE_ERROR; /* 
25840 4e 6f 20 6d 6f 72 65 20 72 65 74 72 69 65 73 2e  No more retries.
25850 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61   */.        brea
25860 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
25870 20 77 68 69 6c 65 28 31 29 3b 0a 20 20 7d 0a 23   while(1);.  }.#
25880 65 6e 64 69 66 0a 20 20 69 66 28 20 72 63 20 26  endif.  if( rc &
25890 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45  & rc!=SQLITE_IOE
258a0 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 20  RR_DELETE_NOENT 
258b0 29 7b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4c  ){.    rc = winL
258c0 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
258d0 4f 45 52 52 5f 44 45 4c 45 54 45 2c 20 6c 61 73  OERR_DELETE, las
258e0 74 45 72 72 6e 6f 2c 20 22 77 69 6e 44 65 6c 65  tErrno, "winDele
258f0 74 65 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b  te", zFilename);
25900 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 69  .  }else{.    wi
25910 6e 4c 6f 67 49 6f 65 72 72 28 63 6e 74 29 3b 0a  nLogIoerr(cnt);.
25920 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
25930 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
25940 20 20 4f 53 54 52 41 43 45 28 28 22 44 45 4c 45    OSTRACE(("DELE
25950 54 45 20 6e 61 6d 65 3d 25 73 2c 20 72 63 3d 25  TE name=%s, rc=%
25960 73 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  s\n", zFilename,
25970 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28   sqlite3ErrName(
25980 72 63 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  rc)));.  return 
25990 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65  rc;.}../*.** Che
259a0 63 6b 20 74 68 65 20 65 78 69 73 74 65 6e 63 65  ck the existence
259b0 20 61 6e 64 20 73 74 61 74 75 73 20 6f 66 20 61   and status of a
259c0 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
259d0 20 69 6e 74 20 77 69 6e 41 63 63 65 73 73 28 0a   int winAccess(.
259e0 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
259f0 56 66 73 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  Vfs,         /* 
25a00 4e 6f 74 20 75 73 65 64 20 6f 6e 20 77 69 6e 33  Not used on win3
25a10 32 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  2 */.  const cha
25a20 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20  r *zFilename,   
25a30 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c    /* Name of fil
25a40 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20  e to check */.  
25a50 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20  int flags,      
25a60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 79             /* Ty
25a70 70 65 20 6f 66 20 74 65 73 74 20 74 6f 20 6d 61  pe of test to ma
25a80 6b 65 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 20  ke on this file 
25a90 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 4f 75  */.  int *pResOu
25aa0 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
25ab0 2f 2a 20 4f 55 54 3a 20 52 65 73 75 6c 74 20 2a  /* OUT: Result *
25ac0 2f 0a 29 7b 0a 20 20 44 57 4f 52 44 20 61 74 74  /.){.  DWORD att
25ad0 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b  r;.  int rc = 0;
25ae0 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72  .  DWORD lastErr
25af0 6e 6f 20 3d 20 30 3b 0a 20 20 76 6f 69 64 20 2a  no = 0;.  void *
25b00 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 55 4e  zConverted;.  UN
25b10 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
25b20 56 66 73 29 3b 0a 0a 20 20 53 69 6d 75 6c 61 74  Vfs);..  Simulat
25b30 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
25b40 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43   SQLITE_IOERR_AC
25b50 43 45 53 53 3b 20 29 3b 0a 20 20 4f 53 54 52 41  CESS; );.  OSTRA
25b60 43 45 28 28 22 41 43 43 45 53 53 20 6e 61 6d 65  CE(("ACCESS name
25b70 3d 25 73 2c 20 66 6c 61 67 73 3d 25 78 2c 20 70  =%s, flags=%x, p
25b80 52 65 73 4f 75 74 3d 25 70 5c 6e 22 2c 0a 20 20  ResOut=%p\n",.  
25b90 20 20 20 20 20 20 20 20 20 7a 46 69 6c 65 6e 61           zFilena
25ba0 6d 65 2c 20 66 6c 61 67 73 2c 20 70 52 65 73 4f  me, flags, pResO
25bb0 75 74 29 29 3b 0a 0a 20 20 7a 43 6f 6e 76 65 72  ut));..  zConver
25bc0 74 65 64 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74  ted = winConvert
25bd0 46 72 6f 6d 55 74 66 38 46 69 6c 65 6e 61 6d 65  FromUtf8Filename
25be0 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69  (zFilename);.  i
25bf0 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30  f( zConverted==0
25c00 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28   ){.    OSTRACE(
25c10 28 22 41 43 43 45 53 53 20 6e 61 6d 65 3d 25 73  ("ACCESS name=%s
25c20 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52  , rc=SQLITE_IOER
25c30 52 5f 4e 4f 4d 45 4d 5c 6e 22 2c 20 7a 46 69 6c  R_NOMEM\n", zFil
25c40 65 6e 61 6d 65 29 29 3b 0a 20 20 20 20 72 65 74  ename));.    ret
25c50 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
25c60 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66  _NOMEM;.  }.  if
25c70 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 20  ( osIsNT() ){.  
25c80 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20    int cnt = 0;. 
25c90 20 20 20 57 49 4e 33 32 5f 46 49 4c 45 5f 41 54     WIN32_FILE_AT
25ca0 54 52 49 42 55 54 45 5f 44 41 54 41 20 73 41 74  TRIBUTE_DATA sAt
25cb0 74 72 44 61 74 61 3b 0a 20 20 20 20 6d 65 6d 73  trData;.    mems
25cc0 65 74 28 26 73 41 74 74 72 44 61 74 61 2c 20 30  et(&sAttrData, 0
25cd0 2c 20 73 69 7a 65 6f 66 28 73 41 74 74 72 44 61  , sizeof(sAttrDa
25ce0 74 61 29 29 3b 0a 20 20 20 20 77 68 69 6c 65 28  ta));.    while(
25cf0 20 21 28 72 63 20 3d 20 6f 73 47 65 74 46 69 6c   !(rc = osGetFil
25d00 65 41 74 74 72 69 62 75 74 65 73 45 78 57 28 28  eAttributesExW((
25d10 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74  LPCWSTR)zConvert
25d20 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ed,.            
25d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25d40 20 47 65 74 46 69 6c 65 45 78 49 6e 66 6f 53 74   GetFileExInfoSt
25d50 61 6e 64 61 72 64 2c 20 0a 20 20 20 20 20 20 20  andard, .       
25d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25d70 20 20 20 20 20 20 26 73 41 74 74 72 44 61 74 61        &sAttrData
25d80 29 29 20 26 26 20 77 69 6e 52 65 74 72 79 49 6f  )) && winRetryIo
25d90 65 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45  err(&cnt, &lastE
25da0 72 72 6e 6f 29 20 29 7b 7d 0a 20 20 20 20 69 66  rrno) ){}.    if
25db0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ( rc ){.      /*
25dc0 20 46 6f 72 20 61 6e 20 53 51 4c 49 54 45 5f 41   For an SQLITE_A
25dd0 43 43 45 53 53 5f 45 58 49 53 54 53 20 71 75 65  CCESS_EXISTS que
25de0 72 79 2c 20 74 72 65 61 74 20 61 20 7a 65 72 6f  ry, treat a zero
25df0 2d 6c 65 6e 67 74 68 20 66 69 6c 65 0a 20 20 20  -length file.   
25e00 20 20 20 2a 2a 20 61 73 20 69 66 20 69 74 20 64     ** as if it d
25e10 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a 20  oes not exist.. 
25e20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
25e30 28 20 20 20 20 66 6c 61 67 73 3d 3d 53 51 4c 49  (    flags==SQLI
25e40 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
25e50 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 73 41  .          && sA
25e60 74 74 72 44 61 74 61 2e 6e 46 69 6c 65 53 69 7a  ttrData.nFileSiz
25e70 65 48 69 67 68 3d 3d 30 20 0a 20 20 20 20 20 20  eHigh==0 .      
25e80 20 20 20 20 26 26 20 73 41 74 74 72 44 61 74 61      && sAttrData
25e90 2e 6e 46 69 6c 65 53 69 7a 65 4c 6f 77 3d 3d 30  .nFileSizeLow==0
25ea0 20 29 7b 0a 20 20 20 20 20 20 20 20 61 74 74 72   ){.        attr
25eb0 20 3d 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f   = INVALID_FILE_
25ec0 41 54 54 52 49 42 55 54 45 53 3b 0a 20 20 20 20  ATTRIBUTES;.    
25ed0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
25ee0 20 61 74 74 72 20 3d 20 73 41 74 74 72 44 61 74   attr = sAttrDat
25ef0 61 2e 64 77 46 69 6c 65 41 74 74 72 69 62 75 74  a.dwFileAttribut
25f00 65 73 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  es;.      }.    
25f10 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 77 69 6e  }else{.      win
25f20 4c 6f 67 49 6f 65 72 72 28 63 6e 74 29 3b 0a 20  LogIoerr(cnt);. 
25f30 20 20 20 20 20 69 66 28 20 6c 61 73 74 45 72 72       if( lastErr
25f40 6e 6f 21 3d 45 52 52 4f 52 5f 46 49 4c 45 5f 4e  no!=ERROR_FILE_N
25f50 4f 54 5f 46 4f 55 4e 44 20 26 26 20 6c 61 73 74  OT_FOUND && last
25f60 45 72 72 6e 6f 21 3d 45 52 52 4f 52 5f 50 41 54  Errno!=ERROR_PAT
25f70 48 5f 4e 4f 54 5f 46 4f 55 4e 44 20 29 7b 0a 20  H_NOT_FOUND ){. 
25f80 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
25f90 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
25fa0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
25fb0 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
25fc0 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 2c  TE_IOERR_ACCESS,
25fd0 20 6c 61 73 74 45 72 72 6e 6f 2c 20 22 77 69 6e   lastErrno, "win
25fe0 41 63 63 65 73 73 22 2c 0a 20 20 20 20 20 20 20  Access",.       
25ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26000 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a      zFilename);.
26010 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
26020 20 20 20 20 20 61 74 74 72 20 3d 20 49 4e 56 41       attr = INVA
26030 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55  LID_FILE_ATTRIBU
26040 54 45 53 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  TES;.      }.   
26050 20 7d 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51   }.  }.#ifdef SQ
26060 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
26070 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20  NSI.  else{.    
26080 61 74 74 72 20 3d 20 6f 73 47 65 74 46 69 6c 65  attr = osGetFile
26090 41 74 74 72 69 62 75 74 65 73 41 28 28 63 68 61  AttributesA((cha
260a0 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  r*)zConverted);.
260b0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c    }.#endif.  sql
260c0 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65  ite3_free(zConve
260d0 72 74 65 64 29 3b 0a 20 20 73 77 69 74 63 68 28  rted);.  switch(
260e0 20 66 6c 61 67 73 20 29 7b 0a 20 20 20 20 63 61   flags ){.    ca
260f0 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  se SQLITE_ACCESS
26100 5f 52 45 41 44 3a 0a 20 20 20 20 63 61 73 65 20  _READ:.    case 
26110 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
26120 49 53 54 53 3a 0a 20 20 20 20 20 20 72 63 20 3d  ISTS:.      rc =
26130 20 61 74 74 72 21 3d 49 4e 56 41 4c 49 44 5f 46   attr!=INVALID_F
26140 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 3b 0a  ILE_ATTRIBUTES;.
26150 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
26160 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43   case SQLITE_ACC
26170 45 53 53 5f 52 45 41 44 57 52 49 54 45 3a 0a 20  ESS_READWRITE:. 
26180 20 20 20 20 20 72 63 20 3d 20 61 74 74 72 21 3d       rc = attr!=
26190 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54  INVALID_FILE_ATT
261a0 52 49 42 55 54 45 53 20 26 26 0a 20 20 20 20 20  RIBUTES &&.     
261b0 20 20 20 20 20 20 20 20 28 61 74 74 72 20 26 20          (attr & 
261c0 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 52  FILE_ATTRIBUTE_R
261d0 45 41 44 4f 4e 4c 59 29 3d 3d 30 3b 0a 20 20 20  EADONLY)==0;.   
261e0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65     break;.    de
261f0 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 61 73 73  fault:.      ass
26200 65 72 74 28 21 22 49 6e 76 61 6c 69 64 20 66 6c  ert(!"Invalid fl
26210 61 67 73 20 61 72 67 75 6d 65 6e 74 22 29 3b 0a  ags argument");.
26220 20 20 7d 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d    }.  *pResOut =
26230 20 72 63 3b 0a 20 20 4f 53 54 52 41 43 45 28 28   rc;.  OSTRACE((
26240 22 41 43 43 45 53 53 20 6e 61 6d 65 3d 25 73 2c  "ACCESS name=%s,
26250 20 70 52 65 73 4f 75 74 3d 25 70 2c 20 2a 70 52   pResOut=%p, *pR
26260 65 73 4f 75 74 3d 25 64 2c 20 72 63 3d 53 51 4c  esOut=%d, rc=SQL
26270 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20  ITE_OK\n",.     
26280 20 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 2c        zFilename,
26290 20 70 52 65 73 4f 75 74 2c 20 2a 70 52 65 73 4f   pResOut, *pResO
262a0 75 74 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ut));.  return S
262b0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
262c0 2a 2a 20 52 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a  ** Returns non-z
262d0 65 72 6f 20 69 66 20 74 68 65 20 73 70 65 63 69  ero if the speci
262e0 66 69 65 64 20 70 61 74 68 20 6e 61 6d 65 20 73  fied path name s
262f0 74 61 72 74 73 20 77 69 74 68 20 61 20 64 72 69  tarts with a dri
26300 76 65 20 6c 65 74 74 65 72 0a 2a 2a 20 66 6f 6c  ve letter.** fol
26310 6c 6f 77 65 64 20 62 79 20 61 20 63 6f 6c 6f 6e  lowed by a colon
26320 20 63 68 61 72 61 63 74 65 72 2e 0a 2a 2f 0a 73   character..*/.s
26330 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 49 73  tatic BOOL winIs
26340 44 72 69 76 65 4c 65 74 74 65 72 41 6e 64 43 6f  DriveLetterAndCo
26350 6c 6f 6e 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  lon(.  const cha
26360 72 20 2a 7a 50 61 74 68 6e 61 6d 65 0a 29 7b 0a  r *zPathname.){.
26370 20 20 72 65 74 75 72 6e 20 28 20 73 71 6c 69 74    return ( sqlit
26380 65 33 49 73 61 6c 70 68 61 28 7a 50 61 74 68 6e  e3Isalpha(zPathn
26390 61 6d 65 5b 30 5d 29 20 26 26 20 7a 50 61 74 68  ame[0]) && zPath
263a0 6e 61 6d 65 5b 31 5d 3d 3d 27 3a 27 20 29 3b 0a  name[1]==':' );.
263b0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 73  }../*.** Returns
263c0 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65   non-zero if the
263d0 20 73 70 65 63 69 66 69 65 64 20 70 61 74 68 20   specified path 
263e0 6e 61 6d 65 20 73 68 6f 75 6c 64 20 62 65 20 75  name should be u
263f0 73 65 64 20 76 65 72 62 61 74 69 6d 2e 20 20 49  sed verbatim.  I
26400 66 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 69 73  f.** non-zero is
26410 20 72 65 74 75 72 6e 65 64 20 66 72 6f 6d 20 74   returned from t
26420 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68  his function, th
26430 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
26440 6f 6e 20 6d 75 73 74 20 73 69 6d 70 6c 79 0a 2a  on must simply.*
26450 2a 20 75 73 65 20 74 68 65 20 70 72 6f 76 69 64  * use the provid
26460 65 64 20 70 61 74 68 20 6e 61 6d 65 20 76 65 72  ed path name ver
26470 62 61 74 69 6d 20 2d 4f 52 2d 20 72 65 73 6f 6c  batim -OR- resol
26480 76 65 20 69 74 20 69 6e 74 6f 20 61 20 66 75 6c  ve it into a ful
26490 6c 20 70 61 74 68 20 6e 61 6d 65 0a 2a 2a 20 75  l path name.** u
264a0 73 69 6e 67 20 74 68 65 20 47 65 74 46 75 6c 6c  sing the GetFull
264b0 50 61 74 68 4e 61 6d 65 20 57 69 6e 33 32 20 41  PathName Win32 A
264c0 50 49 20 66 75 6e 63 74 69 6f 6e 20 28 69 66 20  PI function (if 
264d0 61 76 61 69 6c 61 62 6c 65 29 2e 0a 2a 2f 0a 73  available)..*/.s
264e0 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 49 73  tatic BOOL winIs
264f0 56 65 72 62 61 74 69 6d 50 61 74 68 6e 61 6d 65  VerbatimPathname
26500 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
26510 7a 50 61 74 68 6e 61 6d 65 0a 29 7b 0a 20 20 2f  zPathname.){.  /
26520 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 70 61  *.  ** If the pa
26530 74 68 20 6e 61 6d 65 20 73 74 61 72 74 73 20 77  th name starts w
26540 69 74 68 20 61 20 66 6f 72 77 61 72 64 20 73 6c  ith a forward sl
26550 61 73 68 20 6f 72 20 61 20 62 61 63 6b 73 6c 61  ash or a backsla
26560 73 68 2c 20 69 74 20 69 73 20 65 69 74 68 65 72  sh, it is either
26570 0a 20 20 2a 2a 20 61 20 6c 65 67 61 6c 20 55 4e  .  ** a legal UN
26580 43 20 6e 61 6d 65 2c 20 61 20 76 6f 6c 75 6d 65  C name, a volume
26590 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 2c 20   relative path, 
265a0 6f 72 20 61 6e 20 61 62 73 6f 6c 75 74 65 20 70  or an absolute p
265b0 61 74 68 20 6e 61 6d 65 20 69 6e 20 74 68 65 0a  ath name in the.
265c0 20 20 2a 2a 20 22 55 6e 69 78 22 20 66 6f 72 6d    ** "Unix" form
265d0 61 74 20 6f 6e 20 57 69 6e 64 6f 77 73 2e 20 20  at on Windows.  
265e0 54 68 65 72 65 20 69 73 20 6e 6f 20 65 61 73 79  There is no easy
265f0 20 77 61 79 20 74 6f 20 64 69 66 66 65 72 65 6e   way to differen
26600 74 69 61 74 65 20 62 65 74 77 65 65 6e 0a 20 20  tiate between.  
26610 2a 2a 20 74 68 65 20 66 69 6e 61 6c 20 74 77 6f  ** the final two
26620 20 63 61 73 65 73 3b 20 74 68 65 72 65 66 6f 72   cases; therefor
26630 65 2c 20 77 65 20 72 65 74 75 72 6e 20 74 68 65  e, we return the
26640 20 73 61 66 65 72 20 72 65 74 75 72 6e 20 76 61   safer return va
26650 6c 75 65 20 6f 66 20 54 52 55 45 0a 20 20 2a 2a  lue of TRUE.  **
26660 20 73 6f 20 74 68 61 74 20 63 61 6c 6c 65 72 73   so that callers
26670 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
26680 6e 20 77 69 6c 6c 20 73 69 6d 70 6c 79 20 75 73  n will simply us
26690 65 20 69 74 20 76 65 72 62 61 74 69 6d 2e 0a 20  e it verbatim.. 
266a0 20 2a 2f 0a 20 20 69 66 20 28 20 77 69 6e 49 73   */.  if ( winIs
266b0 44 69 72 53 65 70 28 7a 50 61 74 68 6e 61 6d 65  DirSep(zPathname
266c0 5b 30 5d 29 20 29 7b 0a 20 20 20 20 72 65 74 75  [0]) ){.    retu
266d0 72 6e 20 54 52 55 45 3b 0a 20 20 7d 0a 0a 20 20  rn TRUE;.  }..  
266e0 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 70  /*.  ** If the p
266f0 61 74 68 20 6e 61 6d 65 20 73 74 61 72 74 73 20  ath name starts 
26700 77 69 74 68 20 61 20 6c 65 74 74 65 72 20 61 6e  with a letter an
26710 64 20 61 20 63 6f 6c 6f 6e 20 69 74 20 69 73 20  d a colon it is 
26720 65 69 74 68 65 72 20 61 20 76 6f 6c 75 6d 65 0a  either a volume.
26730 20 20 2a 2a 20 72 65 6c 61 74 69 76 65 20 70 61    ** relative pa
26740 74 68 20 6f 72 20 61 6e 20 61 62 73 6f 6c 75 74  th or an absolut
26750 65 20 70 61 74 68 2e 20 20 43 61 6c 6c 65 72 73  e path.  Callers
26760 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
26770 6e 20 6d 75 73 74 20 6e 6f 74 0a 20 20 2a 2a 20  n must not.  ** 
26780 61 74 74 65 6d 70 74 20 74 6f 20 74 72 65 61 74  attempt to treat
26790 20 69 74 20 61 73 20 61 20 72 65 6c 61 74 69 76   it as a relativ
267a0 65 20 70 61 74 68 20 6e 61 6d 65 20 28 69 2e 65  e path name (i.e
267b0 2e 20 74 68 65 79 20 73 68 6f 75 6c 64 20 73 69  . they should si
267c0 6d 70 6c 79 20 75 73 65 0a 20 20 2a 2a 20 69 74  mply use.  ** it
267d0 20 76 65 72 62 61 74 69 6d 29 2e 0a 20 20 2a 2f   verbatim)..  */
267e0 0a 20 20 69 66 20 28 20 77 69 6e 49 73 44 72 69  .  if ( winIsDri
267f0 76 65 4c 65 74 74 65 72 41 6e 64 43 6f 6c 6f 6e  veLetterAndColon
26800 28 7a 50 61 74 68 6e 61 6d 65 29 20 29 7b 0a 20  (zPathname) ){. 
26810 20 20 20 72 65 74 75 72 6e 20 54 52 55 45 3b 0a     return TRUE;.
26820 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49    }..  /*.  ** I
26830 66 20 77 65 20 67 65 74 20 74 6f 20 74 68 69 73  f we get to this
26840 20 70 6f 69 6e 74 2c 20 74 68 65 20 70 61 74 68   point, the path
26850 20 6e 61 6d 65 20 73 68 6f 75 6c 64 20 61 6c 6d   name should alm
26860 6f 73 74 20 63 65 72 74 61 69 6e 6c 79 20 62 65  ost certainly be
26870 20 61 20 70 75 72 65 6c 79 0a 20 20 2a 2a 20 72   a purely.  ** r
26880 65 6c 61 74 69 76 65 20 6f 6e 65 20 28 69 2e 65  elative one (i.e
26890 2e 20 6e 6f 74 20 61 20 55 4e 43 20 6e 61 6d 65  . not a UNC name
268a0 2c 20 6e 6f 74 20 61 62 73 6f 6c 75 74 65 2c 20  , not absolute, 
268b0 61 6e 64 20 6e 6f 74 20 76 6f 6c 75 6d 65 20 72  and not volume r
268c0 65 6c 61 74 69 76 65 29 2e 0a 20 20 2a 2f 0a 20  elative)..  */. 
268d0 20 72 65 74 75 72 6e 20 46 41 4c 53 45 3b 0a 7d   return FALSE;.}
268e0 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 61 20 72  ../*.** Turn a r
268f0 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65  elative pathname
26900 20 69 6e 74 6f 20 61 20 66 75 6c 6c 20 70 61 74   into a full pat
26910 68 6e 61 6d 65 2e 20 20 57 72 69 74 65 20 74 68  hname.  Write th
26920 65 20 66 75 6c 6c 0a 2a 2a 20 70 61 74 68 6e 61  e full.** pathna
26930 6d 65 20 69 6e 74 6f 20 7a 4f 75 74 5b 5d 2e 20  me into zOut[]. 
26940 20 7a 4f 75 74 5b 5d 20 77 69 6c 6c 20 62 65 20   zOut[] will be 
26950 61 74 20 6c 65 61 73 74 20 70 56 66 73 2d 3e 6d  at least pVfs->m
26960 78 50 61 74 68 6e 61 6d 65 0a 2a 2a 20 62 79 74  xPathname.** byt
26970 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73  es in size..*/.s
26980 74 61 74 69 63 20 69 6e 74 20 77 69 6e 46 75 6c  tatic int winFul
26990 6c 50 61 74 68 6e 61 6d 65 28 0a 20 20 73 71 6c  lPathname(.  sql
269a0 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
269b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
269c0 69 6e 74 65 72 20 74 6f 20 76 66 73 20 6f 62 6a  inter to vfs obj
269d0 65 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ect */.  const c
269e0 68 61 72 20 2a 7a 52 65 6c 61 74 69 76 65 2c 20  har *zRelative, 
269f0 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 73 69 62         /* Possib
26a00 6c 79 20 72 65 6c 61 74 69 76 65 20 69 6e 70 75  ly relative inpu
26a10 74 20 70 61 74 68 20 2a 2f 0a 20 20 69 6e 74 20  t path */.  int 
26a20 6e 46 75 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  nFull,          
26a30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
26a40 65 20 6f 66 20 6f 75 74 70 75 74 20 62 75 66 66  e of output buff
26a50 65 72 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  er in bytes */. 
26a60 20 63 68 61 72 20 2a 7a 46 75 6c 6c 20 20 20 20   char *zFull    
26a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26a80 2a 20 4f 75 74 70 75 74 20 62 75 66 66 65 72 20  * Output buffer 
26a90 2a 2f 0a 29 7b 0a 20 20 0a 23 69 66 20 64 65 66  */.){.  .#if def
26aa0 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29  ined(__CYGWIN__)
26ab0 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
26ac0 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
26ad0 45 5f 45 52 52 4f 52 20 29 3b 0a 20 20 55 4e 55  E_ERROR );.  UNU
26ae0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 46  SED_PARAMETER(nF
26af0 75 6c 6c 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ull);.  assert( 
26b00 6e 46 75 6c 6c 3e 3d 70 56 66 73 2d 3e 6d 78 50  nFull>=pVfs->mxP
26b10 61 74 68 6e 61 6d 65 20 29 3b 0a 20 20 69 66 20  athname );.  if 
26b20 28 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64  ( sqlite3_data_d
26b30 69 72 65 63 74 6f 72 79 20 26 26 20 21 77 69 6e  irectory && !win
26b40 49 73 56 65 72 62 61 74 69 6d 50 61 74 68 6e 61  IsVerbatimPathna
26b50 6d 65 28 7a 52 65 6c 61 74 69 76 65 29 20 29 7b  me(zRelative) ){
26b60 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 4e  .    /*.    ** N
26b70 4f 54 45 3a 20 57 65 20 61 72 65 20 64 65 61 6c  OTE: We are deal
26b80 69 6e 67 20 77 69 74 68 20 61 20 72 65 6c 61 74  ing with a relat
26b90 69 76 65 20 70 61 74 68 20 6e 61 6d 65 20 61 6e  ive path name an
26ba0 64 20 74 68 65 20 64 61 74 61 0a 20 20 20 20 2a  d the data.    *
26bb0 2a 20 20 20 20 20 20 20 64 69 72 65 63 74 6f 72  *       director
26bc0 79 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20  y has been set. 
26bd0 20 54 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20   Therefore, use 
26be0 69 74 20 61 73 20 74 68 65 20 62 61 73 69 73 0a  it as the basis.
26bf0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 66 6f 72      **       for
26c00 20 63 6f 6e 76 65 72 74 69 6e 67 20 74 68 65 20   converting the 
26c10 72 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61  relative path na
26c20 6d 65 20 74 6f 20 61 6e 20 61 62 73 6f 6c 75 74  me to an absolut
26c30 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 6f  e.    **       o
26c40 6e 65 20 62 79 20 70 72 65 70 65 6e 64 69 6e 67  ne by prepending
26c50 20 74 68 65 20 64 61 74 61 20 64 69 72 65 63 74   the data direct
26c60 6f 72 79 20 61 6e 64 20 61 20 73 6c 61 73 68 2e  ory and a slash.
26c70 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 68 61 72  .    */.    char
26c80 20 2a 7a 4f 75 74 20 3d 20 73 71 6c 69 74 65 33   *zOut = sqlite3
26c90 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 70 56 66 73  MallocZero( pVfs
26ca0 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 20 29  ->mxPathname+1 )
26cb0 3b 0a 20 20 20 20 69 66 28 20 21 7a 4f 75 74 20  ;.    if( !zOut 
26cc0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
26cd0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
26ce0 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  EM;.    }.    if
26cf0 28 20 63 79 67 77 69 6e 5f 63 6f 6e 76 5f 70 61  ( cygwin_conv_pa
26d00 74 68 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  th(.            
26d10 28 6f 73 49 73 4e 54 28 29 20 3f 20 43 43 50 5f  (osIsNT() ? CCP_
26d20 50 4f 53 49 58 5f 54 4f 5f 57 49 4e 5f 57 20 3a  POSIX_TO_WIN_W :
26d30 20 43 43 50 5f 50 4f 53 49 58 5f 54 4f 5f 57 49   CCP_POSIX_TO_WI
26d40 4e 5f 41 29 20 7c 0a 20 20 20 20 20 20 20 20 20  N_A) |.         
26d50 20 20 20 43 43 50 5f 52 45 4c 41 54 49 56 45 2c     CCP_RELATIVE,
26d60 20 7a 52 65 6c 61 74 69 76 65 2c 20 7a 4f 75 74   zRelative, zOut
26d70 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  , pVfs->mxPathna
26d80 6d 65 2b 31 29 3c 30 20 29 7b 0a 20 20 20 20 20  me+1)<0 ){.     
26d90 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f   sqlite3_free(zO
26da0 75 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ut);.      retur
26db0 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  n winLogError(SQ
26dc0 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 43 4f  LITE_CANTOPEN_CO
26dd0 4e 56 50 41 54 48 2c 20 28 44 57 4f 52 44 29 65  NVPATH, (DWORD)e
26de0 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
26df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
26e00 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 31  winFullPathname1
26e10 22 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20  ", zRelative);. 
26e20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
26e30 63 68 61 72 20 2a 7a 55 74 66 38 20 3d 20 77 69  char *zUtf8 = wi
26e40 6e 43 6f 6e 76 65 72 74 54 6f 55 74 66 38 46 69  nConvertToUtf8Fi
26e50 6c 65 6e 61 6d 65 28 7a 4f 75 74 29 3b 0a 20 20  lename(zOut);.  
26e60 20 20 20 20 69 66 28 20 21 7a 55 74 66 38 20 29      if( !zUtf8 )
26e70 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
26e80 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20  3_free(zOut);.  
26e90 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
26ea0 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b  ITE_IOERR_NOMEM;
26eb0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
26ec0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
26ed0 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d  MIN(nFull, pVfs-
26ee0 3e 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46  >mxPathname), zF
26ef0 75 6c 6c 2c 20 22 25 73 25 63 25 73 22 2c 0a 20  ull, "%s%c%s",. 
26f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26f10 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64 61        sqlite3_da
26f20 74 61 5f 64 69 72 65 63 74 6f 72 79 2c 20 77 69  ta_directory, wi
26f30 6e 47 65 74 44 69 72 53 65 70 28 29 2c 20 7a 55  nGetDirSep(), zU
26f40 74 66 38 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  tf8);.      sqli
26f50 74 65 33 5f 66 72 65 65 28 7a 55 74 66 38 29 3b  te3_free(zUtf8);
26f60 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
26f70 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20 7d  ree(zOut);.    }
26f80 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68  .  }else{.    ch
26f90 61 72 20 2a 7a 4f 75 74 20 3d 20 73 71 6c 69 74  ar *zOut = sqlit
26fa0 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 70 56  e3MallocZero( pV
26fb0 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
26fc0 20 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 4f 75   );.    if( !zOu
26fd0 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  t ){.      retur
26fe0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  n SQLITE_IOERR_N
26ff0 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  OMEM;.    }.    
27000 69 66 28 20 63 79 67 77 69 6e 5f 63 6f 6e 76 5f  if( cygwin_conv_
27010 70 61 74 68 28 0a 20 20 20 20 20 20 20 20 20 20  path(.          
27020 20 20 28 6f 73 49 73 4e 54 28 29 20 3f 20 43 43    (osIsNT() ? CC
27030 50 5f 50 4f 53 49 58 5f 54 4f 5f 57 49 4e 5f 57  P_POSIX_TO_WIN_W
27040 20 3a 20 43 43 50 5f 50 4f 53 49 58 5f 54 4f 5f   : CCP_POSIX_TO_
27050 57 49 4e 5f 41 29 2c 0a 20 20 20 20 20 20 20 20  WIN_A),.        
27060 20 20 20 20 7a 52 65 6c 61 74 69 76 65 2c 20 7a      zRelative, z
27070 4f 75 74 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74  Out, pVfs->mxPat
27080 68 6e 61 6d 65 2b 31 29 3c 30 20 29 7b 0a 20 20  hname+1)<0 ){.  
27090 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
270a0 28 7a 4f 75 74 29 3b 0a 20 20 20 20 20 20 72 65  (zOut);.      re
270b0 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72  turn winLogError
270c0 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  (SQLITE_CANTOPEN
270d0 5f 43 4f 4e 56 50 41 54 48 2c 20 28 44 57 4f 52  _CONVPATH, (DWOR
270e0 44 29 65 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  D)errno,.       
270f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27100 20 20 22 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61    "winFullPathna
27110 6d 65 32 22 2c 20 7a 52 65 6c 61 74 69 76 65 29  me2", zRelative)
27120 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
27130 20 20 20 63 68 61 72 20 2a 7a 55 74 66 38 20 3d     char *zUtf8 =
27140 20 77 69 6e 43 6f 6e 76 65 72 74 54 6f 55 74 66   winConvertToUtf
27150 38 46 69 6c 65 6e 61 6d 65 28 7a 4f 75 74 29 3b  8Filename(zOut);
27160 0a 20 20 20 20 20 20 69 66 28 20 21 7a 55 74 66  .      if( !zUtf
27170 38 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  8 ){.        sql
27180 69 74 65 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b  ite3_free(zOut);
27190 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
271a0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
271b0 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  EM;.      }.    
271c0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
271d0 74 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70 56  tf(MIN(nFull, pV
271e0 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 29 2c  fs->mxPathname),
271f0 20 7a 46 75 6c 6c 2c 20 22 25 73 22 2c 20 7a 55   zFull, "%s", zU
27200 74 66 38 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  tf8);.      sqli
27210 74 65 33 5f 66 72 65 65 28 7a 55 74 66 38 29 3b  te3_free(zUtf8);
27220 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
27230 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20 7d  ree(zOut);.    }
27240 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
27250 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a  LITE_OK;.#endif.
27260 0a 23 69 66 20 28 53 51 4c 49 54 45 5f 4f 53 5f  .#if (SQLITE_OS_
27270 57 49 4e 43 45 20 7c 7c 20 53 51 4c 49 54 45 5f  WINCE || SQLITE_
27280 4f 53 5f 57 49 4e 52 54 29 20 26 26 20 21 64 65  OS_WINRT) && !de
27290 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f  fined(__CYGWIN__
272a0 29 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ).  SimulateIOEr
272b0 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
272c0 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20 20 2f 2a  TE_ERROR );.  /*
272d0 20 57 69 6e 43 45 20 68 61 73 20 6e 6f 20 63 6f   WinCE has no co
272e0 6e 63 65 70 74 20 6f 66 20 61 20 72 65 6c 61 74  ncept of a relat
272f0 69 76 65 20 70 61 74 68 6e 61 6d 65 2c 20 6f 72  ive pathname, or
27300 20 73 6f 20 49 20 61 6d 20 74 6f 6c 64 2e 20 2a   so I am told. *
27310 2f 0a 20 20 2f 2a 20 57 69 6e 52 54 20 68 61 73  /.  /* WinRT has
27320 20 6e 6f 20 77 61 79 20 74 6f 20 63 6f 6e 76 65   no way to conve
27330 72 74 20 61 20 72 65 6c 61 74 69 76 65 20 70 61  rt a relative pa
27340 74 68 20 74 6f 20 61 6e 20 61 62 73 6f 6c 75 74  th to an absolut
27350 65 20 6f 6e 65 2e 20 2a 2f 0a 20 20 69 66 20 28  e one. */.  if (
27360 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69   sqlite3_data_di
27370 72 65 63 74 6f 72 79 20 26 26 20 21 77 69 6e 49  rectory && !winI
27380 73 56 65 72 62 61 74 69 6d 50 61 74 68 6e 61 6d  sVerbatimPathnam
27390 65 28 7a 52 65 6c 61 74 69 76 65 29 20 29 7b 0a  e(zRelative) ){.
273a0 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 4e 4f      /*.    ** NO
273b0 54 45 3a 20 57 65 20 61 72 65 20 64 65 61 6c 69  TE: We are deali
273c0 6e 67 20 77 69 74 68 20 61 20 72 65 6c 61 74 69  ng with a relati
273d0 76 65 20 70 61 74 68 20 6e 61 6d 65 20 61 6e 64  ve path name and
273e0 20 74 68 65 20 64 61 74 61 0a 20 20 20 20 2a 2a   the data.    **
273f0 20 20 20 20 20 20 20 64 69 72 65 63 74 6f 72 79         directory
27400 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20 20   has been set.  
27410 54 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69  Therefore, use i
27420 74 20 61 73 20 74 68 65 20 62 61 73 69 73 0a 20  t as the basis. 
27430 20 20 20 2a 2a 20 20 20 20 20 20 20 66 6f 72 20     **       for 
27440 63 6f 6e 76 65 72 74 69 6e 67 20 74 68 65 20 72  converting the r
27450 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61 6d  elative path nam
27460 65 20 74 6f 20 61 6e 20 61 62 73 6f 6c 75 74 65  e to an absolute
27470 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 6f 6e  .    **       on
27480 65 20 62 79 20 70 72 65 70 65 6e 64 69 6e 67 20  e by prepending 
27490 74 68 65 20 64 61 74 61 20 64 69 72 65 63 74 6f  the data directo
274a0 72 79 20 61 6e 64 20 61 20 62 61 63 6b 73 6c 61  ry and a backsla
274b0 73 68 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  sh..    */.    s
274c0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
274d0 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d  MIN(nFull, pVfs-
274e0 3e 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46  >mxPathname), zF
274f0 75 6c 6c 2c 20 22 25 73 25 63 25 73 22 2c 0a 20  ull, "%s%c%s",. 
27500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27510 20 20 20 20 73 71 6c 69 74 65 33 5f 64 61 74 61      sqlite3_data
27520 5f 64 69 72 65 63 74 6f 72 79 2c 20 77 69 6e 47  _directory, winG
27530 65 74 44 69 72 53 65 70 28 29 2c 20 7a 52 65 6c  etDirSep(), zRel
27540 61 74 69 76 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  ative);.  }else{
27550 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
27560 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c  rintf(MIN(nFull,
27570 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
27580 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 22 2c  e), zFull, "%s",
27590 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 7d   zRelative);.  }
275a0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
275b0 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66  _OK;.#endif..#if
275c0 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43   !SQLITE_OS_WINC
275d0 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f  E && !SQLITE_OS_
275e0 57 49 4e 52 54 20 26 26 20 21 64 65 66 69 6e 65  WINRT && !define
275f0 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20  d(__CYGWIN__).  
27600 44 57 4f 52 44 20 6e 42 79 74 65 3b 0a 20 20 76  DWORD nByte;.  v
27610 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b  oid *zConverted;
27620 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74 3b 0a 0a  .  char *zOut;..
27630 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70 61 74    /* If this pat
27640 68 20 6e 61 6d 65 20 62 65 67 69 6e 73 20 77 69  h name begins wi
27650 74 68 20 22 2f 58 3a 22 2c 20 77 68 65 72 65 20  th "/X:", where 
27660 22 58 22 20 69 73 20 61 6e 79 20 61 6c 70 68 61  "X" is any alpha
27670 62 65 74 69 63 0a 20 20 2a 2a 20 63 68 61 72 61  betic.  ** chara
27680 63 74 65 72 2c 20 64 69 73 63 61 72 64 20 74 68  cter, discard th
27690 65 20 69 6e 69 74 69 61 6c 20 22 2f 22 20 66 72  e initial "/" fr
276a0 6f 6d 20 74 68 65 20 70 61 74 68 6e 61 6d 65 2e  om the pathname.
276b0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 52 65 6c  .  */.  if( zRel
276c0 61 74 69 76 65 5b 30 5d 3d 3d 27 2f 27 20 26 26  ative[0]=='/' &&
276d0 20 77 69 6e 49 73 44 72 69 76 65 4c 65 74 74 65   winIsDriveLette
276e0 72 41 6e 64 43 6f 6c 6f 6e 28 7a 52 65 6c 61 74  rAndColon(zRelat
276f0 69 76 65 2b 31 29 20 29 7b 0a 20 20 20 20 7a 52  ive+1) ){.    zR
27700 65 6c 61 74 69 76 65 2b 2b 3b 0a 20 20 7d 0a 0a  elative++;.  }..
27710 20 20 2f 2a 20 49 74 27 73 20 6f 64 64 20 74 6f    /* It's odd to
27720 20 73 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d   simulate an io-
27730 65 72 72 6f 72 20 68 65 72 65 2c 20 62 75 74 20  error here, but 
27740 72 65 61 6c 6c 79 20 74 68 69 73 20 69 73 20 6a  really this is j
27750 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74  ust.  ** using t
27760 68 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72  he io-error infr
27770 61 73 74 72 75 63 74 75 72 65 20 74 6f 20 74 65  astructure to te
27780 73 74 20 74 68 61 74 20 53 51 4c 69 74 65 20 68  st that SQLite h
27790 61 6e 64 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a  andles this.  **
277a0 20 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e   function failin
277b0 67 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  g. This function
277c0 20 63 6f 75 6c 64 20 66 61 69 6c 20 69 66 2c 20   could fail if, 
277d0 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65  for example, the
277e0 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 77 6f  .  ** current wo
277f0 72 6b 69 6e 67 20 64 69 72 65 63 74 6f 72 79 20  rking directory 
27800 68 61 73 20 62 65 65 6e 20 75 6e 6c 69 6e 6b 65  has been unlinke
27810 64 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61  d..  */.  Simula
27820 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
27830 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29  n SQLITE_ERROR )
27840 3b 0a 20 20 69 66 20 28 20 73 71 6c 69 74 65 33  ;.  if ( sqlite3
27850 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79 20  _data_directory 
27860 26 26 20 21 77 69 6e 49 73 56 65 72 62 61 74 69  && !winIsVerbati
27870 6d 50 61 74 68 6e 61 6d 65 28 7a 52 65 6c 61 74  mPathname(zRelat
27880 69 76 65 29 20 29 7b 0a 20 20 20 20 2f 2a 0a 20  ive) ){.    /*. 
27890 20 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 65 20 61     ** NOTE: We a
278a0 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20  re dealing with 
278b0 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 20  a relative path 
278c0 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 64 61 74  name and the dat
278d0 61 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 64  a.    **       d
278e0 69 72 65 63 74 6f 72 79 20 68 61 73 20 62 65 65  irectory has bee
278f0 6e 20 73 65 74 2e 20 20 54 68 65 72 65 66 6f 72  n set.  Therefor
27900 65 2c 20 75 73 65 20 69 74 20 61 73 20 74 68 65  e, use it as the
27910 20 62 61 73 69 73 0a 20 20 20 20 2a 2a 20 20 20   basis.    **   
27920 20 20 20 20 66 6f 72 20 63 6f 6e 76 65 72 74 69      for converti
27930 6e 67 20 74 68 65 20 72 65 6c 61 74 69 76 65 20  ng the relative 
27940 70 61 74 68 20 6e 61 6d 65 20 74 6f 20 61 6e 20  path name to an 
27950 61 62 73 6f 6c 75 74 65 0a 20 20 20 20 2a 2a 20  absolute.    ** 
27960 20 20 20 20 20 20 6f 6e 65 20 62 79 20 70 72 65        one by pre
27970 70 65 6e 64 69 6e 67 20 74 68 65 20 64 61 74 61  pending the data
27980 20 64 69 72 65 63 74 6f 72 79 20 61 6e 64 20 61   directory and a
27990 20 62 61 63 6b 73 6c 61 73 68 2e 0a 20 20 20 20   backslash..    
279a0 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  */.    sqlite3_s
279b0 6e 70 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c  nprintf(MIN(nFul
279c0 6c 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  l, pVfs->mxPathn
279d0 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73  ame), zFull, "%s
279e0 25 63 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20  %c%s",.         
279f0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
27a00 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f  te3_data_directo
27a10 72 79 2c 20 77 69 6e 47 65 74 44 69 72 53 65 70  ry, winGetDirSep
27a20 28 29 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a  (), zRelative);.
27a30 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
27a40 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 7a 43 6f 6e  E_OK;.  }.  zCon
27a50 76 65 72 74 65 64 20 3d 20 77 69 6e 43 6f 6e 76  verted = winConv
27a60 65 72 74 46 72 6f 6d 55 74 66 38 46 69 6c 65 6e  ertFromUtf8Filen
27a70 61 6d 65 28 7a 52 65 6c 61 74 69 76 65 29 3b 0a  ame(zRelative);.
27a80 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64    if( zConverted
27a90 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
27aa0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  n SQLITE_IOERR_N
27ab0 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20  OMEM;.  }.  if( 
27ac0 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 20 20 20  osIsNT() ){.    
27ad0 4c 50 57 53 54 52 20 7a 54 65 6d 70 3b 0a 20 20  LPWSTR zTemp;.  
27ae0 20 20 6e 42 79 74 65 20 3d 20 6f 73 47 65 74 46    nByte = osGetF
27af0 75 6c 6c 50 61 74 68 4e 61 6d 65 57 28 28 4c 50  ullPathNameW((LP
27b00 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64  CWSTR)zConverted
27b10 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
27b20 69 66 28 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a  if( nByte==0 ){.
27b30 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
27b40 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
27b50 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e        return win
27b60 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
27b70 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54  CANTOPEN_FULLPAT
27b80 48 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f  H, osGetLastErro
27b90 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  r(),.           
27ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
27bb0 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 31 22  inFullPathname1"
27bc0 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20  , zRelative);.  
27bd0 20 20 7d 0a 20 20 20 20 6e 42 79 74 65 20 2b 3d    }.    nByte +=
27be0 20 33 3b 0a 20 20 20 20 7a 54 65 6d 70 20 3d 20   3;.    zTemp = 
27bf0 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
27c00 6f 28 20 6e 42 79 74 65 2a 73 69 7a 65 6f 66 28  o( nByte*sizeof(
27c10 7a 54 65 6d 70 5b 30 5d 29 20 29 3b 0a 20 20 20  zTemp[0]) );.   
27c20 20 69 66 28 20 7a 54 65 6d 70 3d 3d 30 20 29 7b   if( zTemp==0 ){
27c30 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
27c40 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
27c50 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
27c60 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
27c70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 42 79 74  ;.    }.    nByt
27c80 65 20 3d 20 6f 73 47 65 74 46 75 6c 6c 50 61 74  e = osGetFullPat
27c90 68 4e 61 6d 65 57 28 28 4c 50 43 57 53 54 52 29  hNameW((LPCWSTR)
27ca0 7a 43 6f 6e 76 65 72 74 65 64 2c 20 6e 42 79 74  zConverted, nByt
27cb0 65 2c 20 7a 54 65 6d 70 2c 20 30 29 3b 0a 20 20  e, zTemp, 0);.  
27cc0 20 20 69 66 28 20 6e 42 79 74 65 3d 3d 30 20 29    if( nByte==0 )
27cd0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
27ce0 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
27cf0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
27d00 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20 20  free(zTemp);.   
27d10 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67     return winLog
27d20 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e  Error(SQLITE_CAN
27d30 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48 2c 20  TOPEN_FULLPATH, 
27d40 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
27d50 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
27d60 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 46             "winF
27d70 75 6c 6c 50 61 74 68 6e 61 6d 65 32 22 2c 20 7a  ullPathname2", z
27d80 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 20 20 7d  Relative);.    }
27d90 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
27da0 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
27db0 20 20 20 7a 4f 75 74 20 3d 20 77 69 6e 55 6e 69     zOut = winUni
27dc0 63 6f 64 65 54 6f 55 74 66 38 28 7a 54 65 6d 70  codeToUtf8(zTemp
27dd0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
27de0 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20 7d 0a  ree(zTemp);.  }.
27df0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49  #ifdef SQLITE_WI
27e00 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65  N32_HAS_ANSI.  e
27e10 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  lse{.    char *z
27e20 54 65 6d 70 3b 0a 20 20 20 20 6e 42 79 74 65 20  Temp;.    nByte 
27e30 3d 20 6f 73 47 65 74 46 75 6c 6c 50 61 74 68 4e  = osGetFullPathN
27e40 61 6d 65 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e  ameA((char*)zCon
27e50 76 65 72 74 65 64 2c 20 30 2c 20 30 2c 20 30 29  verted, 0, 0, 0)
27e60 3b 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65 3d  ;.    if( nByte=
27e70 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
27e80 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
27e90 74 65 64 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ted);.      retu
27ea0 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53  rn winLogError(S
27eb0 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46  QLITE_CANTOPEN_F
27ec0 55 4c 4c 50 41 54 48 2c 20 6f 73 47 65 74 4c 61  ULLPATH, osGetLa
27ed0 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20  stError(),.     
27ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27ef0 20 20 20 20 22 77 69 6e 46 75 6c 6c 50 61 74 68      "winFullPath
27f00 6e 61 6d 65 33 22 2c 20 7a 52 65 6c 61 74 69 76  name3", zRelativ
27f10 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 42  e);.    }.    nB
27f20 79 74 65 20 2b 3d 20 33 3b 0a 20 20 20 20 7a 54  yte += 3;.    zT
27f30 65 6d 70 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  emp = sqlite3Mal
27f40 6c 6f 63 5a 65 72 6f 28 20 6e 42 79 74 65 2a 73  locZero( nByte*s
27f50 69 7a 65 6f 66 28 7a 54 65 6d 70 5b 30 5d 29 20  izeof(zTemp[0]) 
27f60 29 3b 0a 20 20 20 20 69 66 28 20 7a 54 65 6d 70  );.    if( zTemp
27f70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
27f80 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65  ite3_free(zConve
27f90 72 74 65 64 29 3b 0a 20 20 20 20 20 20 72 65 74  rted);.      ret
27fa0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
27fb0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
27fc0 20 20 6e 42 79 74 65 20 3d 20 6f 73 47 65 74 46    nByte = osGetF
27fd0 75 6c 6c 50 61 74 68 4e 61 6d 65 41 28 28 63 68  ullPathNameA((ch
27fe0 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20  ar*)zConverted, 
27ff0 6e 42 79 74 65 2c 20 7a 54 65 6d 70 2c 20 30 29  nByte, zTemp, 0)
28000 3b 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65 3d  ;.    if( nByte=
28010 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
28020 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
28030 74 65 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ted);.      sqli
28040 74 65 33 5f 66 72 65 65 28 7a 54 65 6d 70 29 3b  te3_free(zTemp);
28050 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69  .      return wi
28060 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
28070 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 41  _CANTOPEN_FULLPA
28080 54 48 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72  TH, osGetLastErr
28090 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20  or(),.          
280a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
280b0 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 34  winFullPathname4
280c0 22 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20  ", zRelative);. 
280d0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
280e0 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
280f0 29 3b 0a 20 20 20 20 7a 4f 75 74 20 3d 20 73 71  );.    zOut = sq
28100 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73  lite3_win32_mbcs
28110 5f 74 6f 5f 75 74 66 38 28 7a 54 65 6d 70 29 3b  _to_utf8(zTemp);
28120 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
28130 65 28 7a 54 65 6d 70 29 3b 0a 20 20 7d 0a 23 65  e(zTemp);.  }.#e
28140 6e 64 69 66 0a 20 20 69 66 28 20 7a 4f 75 74 20  ndif.  if( zOut 
28150 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ){.    sqlite3_s
28160 6e 70 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c  nprintf(MIN(nFul
28170 6c 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  l, pVfs->mxPathn
28180 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73  ame), zFull, "%s
28190 22 2c 20 7a 4f 75 74 29 3b 0a 20 20 20 20 73 71  ", zOut);.    sq
281a0 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 75 74 29  lite3_free(zOut)
281b0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
281c0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b  ITE_OK;.  }else{
281d0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
281e0 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a  TE_IOERR_NOMEM;.
281f0 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 69    }.#endif.}..#i
28200 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
28210 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  T_LOAD_EXTENSION
28220 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65  ./*.** Interface
28230 73 20 66 6f 72 20 6f 70 65 6e 69 6e 67 20 61 20  s for opening a 
28240 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20  shared library, 
28250 66 69 6e 64 69 6e 67 20 65 6e 74 72 79 20 70 6f  finding entry po
28260 69 6e 74 73 0a 2a 2a 20 77 69 74 68 69 6e 20 74  ints.** within t
28270 68 65 20 73 68 61 72 65 64 20 6c 69 62 72 61 72  he shared librar
28280 79 2c 20 61 6e 64 20 63 6c 6f 73 69 6e 67 20 74  y, and closing t
28290 68 65 20 73 68 61 72 65 64 20 6c 69 62 72 61 72  he shared librar
282a0 79 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 49 6e 74 65  y..*/./*.** Inte
282b0 72 66 61 63 65 73 20 66 6f 72 20 6f 70 65 6e 69  rfaces for openi
282c0 6e 67 20 61 20 73 68 61 72 65 64 20 6c 69 62 72  ng a shared libr
282d0 61 72 79 2c 20 66 69 6e 64 69 6e 67 20 65 6e 74  ary, finding ent
282e0 72 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 77 69 74  ry points.** wit
282f0 68 69 6e 20 74 68 65 20 73 68 61 72 65 64 20 6c  hin the shared l
28300 69 62 72 61 72 79 2c 20 61 6e 64 20 63 6c 6f 73  ibrary, and clos
28310 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6c  ing the shared l
28320 69 62 72 61 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  ibrary..*/.stati
28330 63 20 76 6f 69 64 20 2a 77 69 6e 44 6c 4f 70 65  c void *winDlOpe
28340 6e 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  n(sqlite3_vfs *p
28350 56 66 73 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  Vfs, const char 
28360 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 48  *zFilename){.  H
28370 41 4e 44 4c 45 20 68 3b 0a 20 20 76 6f 69 64 20  ANDLE h;.  void 
28380 2a 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77 69  *zConverted = wi
28390 6e 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66 38  nConvertFromUtf8
283a0 46 69 6c 65 6e 61 6d 65 28 7a 46 69 6c 65 6e 61  Filename(zFilena
283b0 6d 65 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  me);.  UNUSED_PA
283c0 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20  RAMETER(pVfs);. 
283d0 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d   if( zConverted=
283e0 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
283f0 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 73   0;.  }.  if( os
28400 49 73 4e 54 28 29 20 29 7b 0a 23 69 66 20 53 51  IsNT() ){.#if SQ
28410 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
28420 20 20 68 20 3d 20 6f 73 4c 6f 61 64 50 61 63 6b    h = osLoadPack
28430 61 67 65 64 4c 69 62 72 61 72 79 28 28 4c 50 43  agedLibrary((LPC
28440 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c  WSTR)zConverted,
28450 20 30 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 68   0);.#else.    h
28460 20 3d 20 6f 73 4c 6f 61 64 4c 69 62 72 61 72 79   = osLoadLibrary
28470 57 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76  W((LPCWSTR)zConv
28480 65 72 74 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20  erted);.#endif. 
28490 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
284a0 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a  _WIN32_HAS_ANSI.
284b0 20 20 65 6c 73 65 7b 0a 20 20 20 20 68 20 3d 20    else{.    h = 
284c0 6f 73 4c 6f 61 64 4c 69 62 72 61 72 79 41 28 28  osLoadLibraryA((
284d0 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64  char*)zConverted
284e0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
284f0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
28500 6e 76 65 72 74 65 64 29 3b 0a 20 20 72 65 74 75  nverted);.  retu
28510 72 6e 20 28 76 6f 69 64 2a 29 68 3b 0a 7d 0a 73  rn (void*)h;.}.s
28520 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 44 6c  tatic void winDl
28530 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66  Error(sqlite3_vf
28540 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 75  s *pVfs, int nBu
28550 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 4f 75 74  f, char *zBufOut
28560 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
28570 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 77  METER(pVfs);.  w
28580 69 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 4d 73  inGetLastErrorMs
28590 67 28 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  g(osGetLastError
285a0 28 29 2c 20 6e 42 75 66 2c 20 7a 42 75 66 4f 75  (), nBuf, zBufOu
285b0 74 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  t);.}.static voi
285c0 64 20 28 2a 77 69 6e 44 6c 53 79 6d 28 73 71 6c  d (*winDlSym(sql
285d0 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 76  ite3_vfs *pVfs,v
285e0 6f 69 64 20 2a 70 48 2c 63 6f 6e 73 74 20 63 68  oid *pH,const ch
285f0 61 72 20 2a 7a 53 79 6d 29 29 28 76 6f 69 64 29  ar *zSym))(void)
28600 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
28610 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 72 65  ETER(pVfs);.  re
28620 74 75 72 6e 20 28 76 6f 69 64 28 2a 29 28 76 6f  turn (void(*)(vo
28630 69 64 29 29 6f 73 47 65 74 50 72 6f 63 41 64 64  id))osGetProcAdd
28640 72 65 73 73 41 28 28 48 41 4e 44 4c 45 29 70 48  ressA((HANDLE)pH
28650 2c 20 7a 53 79 6d 29 3b 0a 7d 0a 73 74 61 74 69  , zSym);.}.stati
28660 63 20 76 6f 69 64 20 77 69 6e 44 6c 43 6c 6f 73  c void winDlClos
28670 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  e(sqlite3_vfs *p
28680 56 66 73 2c 20 76 6f 69 64 20 2a 70 48 61 6e 64  Vfs, void *pHand
28690 6c 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  le){.  UNUSED_PA
286a0 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20  RAMETER(pVfs);. 
286b0 20 6f 73 46 72 65 65 4c 69 62 72 61 72 79 28 28   osFreeLibrary((
286c0 48 41 4e 44 4c 45 29 70 48 61 6e 64 6c 65 29 3b  HANDLE)pHandle);
286d0 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 53  .}.#else /* if S
286e0 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f  QLITE_OMIT_LOAD_
286f0 45 58 54 45 4e 53 49 4f 4e 20 69 73 20 64 65 66  EXTENSION is def
28700 69 6e 65 64 3a 20 2a 2f 0a 20 20 23 64 65 66 69  ined: */.  #defi
28710 6e 65 20 77 69 6e 44 6c 4f 70 65 6e 20 20 30 0a  ne winDlOpen  0.
28720 20 20 23 64 65 66 69 6e 65 20 77 69 6e 44 6c 45    #define winDlE
28730 72 72 6f 72 20 30 0a 20 20 23 64 65 66 69 6e 65  rror 0.  #define
28740 20 77 69 6e 44 6c 53 79 6d 20 20 20 30 0a 20 20   winDlSym   0.  
28750 23 64 65 66 69 6e 65 20 77 69 6e 44 6c 43 6c 6f  #define winDlClo
28760 73 65 20 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a  se 0.#endif.../*
28770 0a 2a 2a 20 57 72 69 74 65 20 75 70 20 74 6f 20  .** Write up to 
28780 6e 42 75 66 20 62 79 74 65 73 20 6f 66 20 72 61  nBuf bytes of ra
28790 6e 64 6f 6d 6e 65 73 73 20 69 6e 74 6f 20 7a 42  ndomness into zB
287a0 75 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  uf..*/.static in
287b0 74 20 77 69 6e 52 61 6e 64 6f 6d 6e 65 73 73 28  t winRandomness(
287c0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
287d0 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61  s, int nBuf, cha
287e0 72 20 2a 7a 42 75 66 29 7b 0a 20 20 69 6e 74 20  r *zBuf){.  int 
287f0 6e 20 3d 20 30 3b 0a 20 20 55 4e 55 53 45 44 5f  n = 0;.  UNUSED_
28800 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b  PARAMETER(pVfs);
28810 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
28820 49 54 45 5f 54 45 53 54 29 0a 20 20 6e 20 3d 20  ITE_TEST).  n = 
28830 6e 42 75 66 3b 0a 20 20 6d 65 6d 73 65 74 28 7a  nBuf;.  memset(z
28840 42 75 66 2c 20 30 2c 20 6e 42 75 66 29 3b 0a 23  Buf, 0, nBuf);.#
28850 65 6c 73 65 0a 20 20 69 66 28 20 73 69 7a 65 6f  else.  if( sizeo
28860 66 28 53 59 53 54 45 4d 54 49 4d 45 29 3c 3d 6e  f(SYSTEMTIME)<=n
28870 42 75 66 2d 6e 20 29 7b 0a 20 20 20 20 53 59 53  Buf-n ){.    SYS
28880 54 45 4d 54 49 4d 45 20 78 3b 0a 20 20 20 20 6f  TEMTIME x;.    o
28890 73 47 65 74 53 79 73 74 65 6d 54 69 6d 65 28 26  sGetSystemTime(&
288a0 78 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  x);.    memcpy(&
288b0 7a 42 75 66 5b 6e 5d 2c 20 26 78 2c 20 73 69 7a  zBuf[n], &x, siz
288c0 65 6f 66 28 78 29 29 3b 0a 20 20 20 20 6e 20 2b  eof(x));.    n +
288d0 3d 20 73 69 7a 65 6f 66 28 78 29 3b 0a 20 20 7d  = sizeof(x);.  }
288e0 0a 20 20 69 66 28 20 73 69 7a 65 6f 66 28 44 57  .  if( sizeof(DW
288f0 4f 52 44 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a  ORD)<=nBuf-n ){.
28900 20 20 20 20 44 57 4f 52 44 20 70 69 64 20 3d 20      DWORD pid = 
28910 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
28920 65 73 73 49 64 28 29 3b 0a 20 20 20 20 6d 65 6d  essId();.    mem
28930 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 70  cpy(&zBuf[n], &p
28940 69 64 2c 20 73 69 7a 65 6f 66 28 70 69 64 29 29  id, sizeof(pid))
28950 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f  ;.    n += sizeo
28960 66 28 70 69 64 29 3b 0a 20 20 7d 0a 23 69 66 20  f(pid);.  }.#if 
28970 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
28980 20 20 69 66 28 20 73 69 7a 65 6f 66 28 55 4c 4f    if( sizeof(ULO
28990 4e 47 4c 4f 4e 47 29 3c 3d 6e 42 75 66 2d 6e 20  NGLONG)<=nBuf-n 
289a0 29 7b 0a 20 20 20 20 55 4c 4f 4e 47 4c 4f 4e 47  ){.    ULONGLONG
289b0 20 63 6e 74 20 3d 20 6f 73 47 65 74 54 69 63 6b   cnt = osGetTick
289c0 43 6f 75 6e 74 36 34 28 29 3b 0a 20 20 20 20 6d  Count64();.    m
289d0 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20  emcpy(&zBuf[n], 
289e0 26 63 6e 74 2c 20 73 69 7a 65 6f 66 28 63 6e 74  &cnt, sizeof(cnt
289f0 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a  ));.    n += siz
28a00 65 6f 66 28 63 6e 74 29 3b 0a 20 20 7d 0a 23 65  eof(cnt);.  }.#e
28a10 6c 73 65 0a 20 20 69 66 28 20 73 69 7a 65 6f 66  lse.  if( sizeof
28a20 28 44 57 4f 52 44 29 3c 3d 6e 42 75 66 2d 6e 20  (DWORD)<=nBuf-n 
28a30 29 7b 0a 20 20 20 20 44 57 4f 52 44 20 63 6e 74  ){.    DWORD cnt
28a40 20 3d 20 6f 73 47 65 74 54 69 63 6b 43 6f 75 6e   = osGetTickCoun
28a50 74 28 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  t();.    memcpy(
28a60 26 7a 42 75 66 5b 6e 5d 2c 20 26 63 6e 74 2c 20  &zBuf[n], &cnt, 
28a70 73 69 7a 65 6f 66 28 63 6e 74 29 29 3b 0a 20 20  sizeof(cnt));.  
28a80 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 63 6e    n += sizeof(cn
28a90 74 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  t);.  }.#endif. 
28aa0 20 69 66 28 20 73 69 7a 65 6f 66 28 4c 41 52 47   if( sizeof(LARG
28ab0 45 5f 49 4e 54 45 47 45 52 29 3c 3d 6e 42 75 66  E_INTEGER)<=nBuf
28ac0 2d 6e 20 29 7b 0a 20 20 20 20 4c 41 52 47 45 5f  -n ){.    LARGE_
28ad0 49 4e 54 45 47 45 52 20 69 3b 0a 20 20 20 20 6f  INTEGER i;.    o
28ae0 73 51 75 65 72 79 50 65 72 66 6f 72 6d 61 6e 63  sQueryPerformanc
28af0 65 43 6f 75 6e 74 65 72 28 26 69 29 3b 0a 20 20  eCounter(&i);.  
28b00 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e    memcpy(&zBuf[n
28b10 5d 2c 20 26 69 2c 20 73 69 7a 65 6f 66 28 69 29  ], &i, sizeof(i)
28b20 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65  );.    n += size
28b30 6f 66 28 69 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  of(i);.  }.#endi
28b40 66 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  f.  return n;.}.
28b50 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f  ../*.** Sleep fo
28b60 72 20 61 20 6c 69 74 74 6c 65 20 77 68 69 6c 65  r a little while
28b70 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 61 6d  .  Return the am
28b80 6f 75 6e 74 20 6f 66 20 74 69 6d 65 20 73 6c 65  ount of time sle
28b90 70 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  pt..*/.static in
28ba0 74 20 77 69 6e 53 6c 65 65 70 28 73 71 6c 69 74  t winSleep(sqlit
28bb0 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e  e3_vfs *pVfs, in
28bc0 74 20 6d 69 63 72 6f 73 65 63 29 7b 0a 20 20 73  t microsec){.  s
28bd0 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65  qlite3_win32_sle
28be0 65 70 28 28 6d 69 63 72 6f 73 65 63 2b 39 39 39  ep((microsec+999
28bf0 29 2f 31 30 30 30 29 3b 0a 20 20 55 4e 55 53 45  )/1000);.  UNUSE
28c00 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73  D_PARAMETER(pVfs
28c10 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 28 6d 69  );.  return ((mi
28c20 63 72 6f 73 65 63 2b 39 39 39 29 2f 31 30 30 30  crosec+999)/1000
28c30 29 2a 31 30 30 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  )*1000;.}../*.**
28c40 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76   The following v
28c50 61 72 69 61 62 6c 65 2c 20 69 66 20 73 65 74 20  ariable, if set 
28c60 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61  to a non-zero va
28c70 6c 75 65 2c 20 69 73 20 69 6e 74 65 72 70 72 65  lue, is interpre
28c80 74 65 64 20 61 73 0a 2a 2a 20 74 68 65 20 6e 75  ted as.** the nu
28c90 6d 62 65 72 20 6f 66 20 73 65 63 6f 6e 64 73 20  mber of seconds 
28ca0 73 69 6e 63 65 20 31 39 37 30 20 61 6e 64 20 69  since 1970 and i
28cb0 73 20 75 73 65 64 20 74 6f 20 73 65 74 20 74 68  s used to set th
28cc0 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 73  e result of.** s
28cd0 71 6c 69 74 65 33 4f 73 43 75 72 72 65 6e 74 54  qlite3OsCurrentT
28ce0 69 6d 65 28 29 20 64 75 72 69 6e 67 20 74 65 73  ime() during tes
28cf0 74 69 6e 67 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  ting..*/.#ifdef 
28d00 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20  SQLITE_TEST.int 
28d10 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f  sqlite3_current_
28d20 74 69 6d 65 20 3d 20 30 3b 20 20 2f 2a 20 46 61  time = 0;  /* Fa
28d30 6b 65 20 73 79 73 74 65 6d 20 74 69 6d 65 20 69  ke system time i
28d40 6e 20 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20  n seconds since 
28d50 31 39 37 30 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a  1970. */.#endif.
28d60 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20  ./*.** Find the 
28d70 63 75 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e  current time (in
28d80 20 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64   Universal Coord
28d90 69 6e 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57  inated Time).  W
28da0 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77  rite into *piNow
28db0 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20  .** the current 
28dc0 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73  time and date as
28dd0 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75   a Julian Day nu
28de0 6d 62 65 72 20 74 69 6d 65 73 20 38 36 5f 34 30  mber times 86_40
28df0 30 5f 30 30 30 2e 20 20 49 6e 0a 2a 2a 20 6f 74  0_000.  In.** ot
28e00 68 65 72 20 77 6f 72 64 73 2c 20 77 72 69 74 65  her words, write
28e10 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 20 74 68 65   into *piNow the
28e20 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69   number of milli
28e30 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 74 68  seconds since th
28e40 65 20 4a 75 6c 69 61 6e 0a 2a 2a 20 65 70 6f 63  e Julian.** epoc
28e50 68 20 6f 66 20 6e 6f 6f 6e 20 69 6e 20 47 72 65  h of noon in Gre
28e60 65 6e 77 69 63 68 20 6f 6e 20 4e 6f 76 65 6d 62  enwich on Novemb
28e70 65 72 20 32 34 2c 20 34 37 31 34 20 42 2e 43 20  er 24, 4714 B.C 
28e80 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65  according to the
28e90 0a 2a 2a 20 70 72 6f 6c 65 70 74 69 63 20 47 72  .** proleptic Gr
28ea0 65 67 6f 72 69 61 6e 20 63 61 6c 65 6e 64 61 72  egorian calendar
28eb0 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65  ..**.** On succe
28ec0 73 73 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ss, return SQLIT
28ed0 45 5f 4f 4b 2e 20 20 52 65 74 75 72 6e 20 53 51  E_OK.  Return SQ
28ee0 4c 49 54 45 5f 45 52 52 4f 52 20 69 66 20 74 68  LITE_ERROR if th
28ef0 65 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20  e time and date 
28f00 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f  .** cannot be fo
28f10 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  und..*/.static i
28f20 6e 74 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d  nt winCurrentTim
28f30 65 49 6e 74 36 34 28 73 71 6c 69 74 65 33 5f 76  eInt64(sqlite3_v
28f40 66 73 20 2a 70 56 66 73 2c 20 73 71 6c 69 74 65  fs *pVfs, sqlite
28f50 33 5f 69 6e 74 36 34 20 2a 70 69 4e 6f 77 29 7b  3_int64 *piNow){
28f60 0a 20 20 2f 2a 20 46 49 4c 45 54 49 4d 45 20 73  .  /* FILETIME s
28f70 74 72 75 63 74 75 72 65 20 69 73 20 61 20 36 34  tructure is a 64
28f80 2d 62 69 74 20 76 61 6c 75 65 20 72 65 70 72 65  -bit value repre
28f90 73 65 6e 74 69 6e 67 20 74 68 65 20 6e 75 6d 62  senting the numb
28fa0 65 72 20 6f 66 20 0a 20 20 20 20 20 31 30 30 2d  er of .     100-
28fb0 6e 61 6e 6f 73 65 63 6f 6e 64 20 69 6e 74 65 72  nanosecond inter
28fc0 76 61 6c 73 20 73 69 6e 63 65 20 4a 61 6e 75 61  vals since Janua
28fd0 72 79 20 31 2c 20 31 36 30 31 20 28 3d 20 4a 44  ry 1, 1601 (= JD
28fe0 20 32 33 30 35 38 31 33 2e 35 29 2e 20 0a 20 20   2305813.5). .  
28ff0 2a 2f 0a 20 20 46 49 4c 45 54 49 4d 45 20 66 74  */.  FILETIME ft
29000 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
29010 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 77   sqlite3_int64 w
29020 69 6e 46 69 6c 65 74 69 6d 65 45 70 6f 63 68 20  inFiletimeEpoch 
29030 3d 20 32 33 30 35 38 31 33 35 2a 28 73 71 6c 69  = 23058135*(sqli
29040 74 65 33 5f 69 6e 74 36 34 29 38 36 34 30 30 30  te3_int64)864000
29050 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  0;.#ifdef SQLITE
29060 5f 54 45 53 54 0a 20 20 73 74 61 74 69 63 20 63  _TEST.  static c
29070 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6e 74  onst sqlite3_int
29080 36 34 20 75 6e 69 78 45 70 6f 63 68 20 3d 20 32  64 unixEpoch = 2
29090 34 34 30 35 38 37 35 2a 28 73 71 6c 69 74 65 33  4405875*(sqlite3
290a0 5f 69 6e 74 36 34 29 38 36 34 30 30 30 30 3b 0a  _int64)8640000;.
290b0 23 65 6e 64 69 66 0a 20 20 2f 2a 20 32 5e 33 32  #endif.  /* 2^32
290c0 20 2d 20 74 6f 20 61 76 6f 69 64 20 75 73 65 20   - to avoid use 
290d0 6f 66 20 4c 4c 20 61 6e 64 20 77 61 72 6e 69 6e  of LL and warnin
290e0 67 73 20 69 6e 20 67 63 63 20 2a 2f 0a 20 20 73  gs in gcc */.  s
290f0 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
29100 74 65 33 5f 69 6e 74 36 34 20 6d 61 78 33 32 42  te3_int64 max32B
29110 69 74 56 61 6c 75 65 20 3d 20 0a 20 20 20 20 20  itValue = .     
29120 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29   (sqlite3_int64)
29130 32 30 30 30 30 30 30 30 30 30 20 2b 20 28 73 71  2000000000 + (sq
29140 6c 69 74 65 33 5f 69 6e 74 36 34 29 32 30 30 30  lite3_int64)2000
29150 30 30 30 30 30 30 20 2b 0a 20 20 20 20 20 20 28  000000 +.      (
29160 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 32 39  sqlite3_int64)29
29170 34 39 36 37 32 39 36 3b 0a 0a 23 69 66 20 53 51  4967296;..#if SQ
29180 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
29190 53 59 53 54 45 4d 54 49 4d 45 20 74 69 6d 65 3b  SYSTEMTIME time;
291a0 0a 20 20 6f 73 47 65 74 53 79 73 74 65 6d 54 69  .  osGetSystemTi
291b0 6d 65 28 26 74 69 6d 65 29 3b 0a 20 20 2f 2a 20  me(&time);.  /* 
291c0 69 66 20 53 79 73 74 65 6d 54 69 6d 65 54 6f 46  if SystemTimeToF
291d0 69 6c 65 54 69 6d 65 28 29 20 66 61 69 6c 73 2c  ileTime() fails,
291e0 20 69 74 20 72 65 74 75 72 6e 73 20 7a 65 72 6f   it returns zero
291f0 2e 20 2a 2f 0a 20 20 69 66 20 28 21 6f 73 53 79  . */.  if (!osSy
29200 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54 69  stemTimeToFileTi
29210 6d 65 28 26 74 69 6d 65 2c 26 66 74 29 29 7b 0a  me(&time,&ft)){.
29220 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
29230 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 23 65 6c  E_ERROR;.  }.#el
29240 73 65 0a 20 20 6f 73 47 65 74 53 79 73 74 65 6d  se.  osGetSystem
29250 54 69 6d 65 41 73 46 69 6c 65 54 69 6d 65 28 20  TimeAsFileTime( 
29260 26 66 74 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  &ft );.#endif.. 
29270 20 2a 70 69 4e 6f 77 20 3d 20 77 69 6e 46 69 6c   *piNow = winFil
29280 65 74 69 6d 65 45 70 6f 63 68 20 2b 0a 20 20 20  etimeEpoch +.   
29290 20 20 20 20 20 20 20 20 20 28 28 28 28 73 71 6c           ((((sql
292a0 69 74 65 33 5f 69 6e 74 36 34 29 66 74 2e 64 77  ite3_int64)ft.dw
292b0 48 69 67 68 44 61 74 65 54 69 6d 65 29 2a 6d 61  HighDateTime)*ma
292c0 78 33 32 42 69 74 56 61 6c 75 65 29 20 2b 20 0a  x32BitValue) + .
292d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
292e0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 66 74  sqlite3_int64)ft
292f0 2e 64 77 4c 6f 77 44 61 74 65 54 69 6d 65 29 2f  .dwLowDateTime)/
29300 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 31  (sqlite3_int64)1
29310 30 30 30 30 3b 0a 0a 23 69 66 64 65 66 20 53 51  0000;..#ifdef SQ
29320 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20  LITE_TEST.  if( 
29330 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f  sqlite3_current_
29340 74 69 6d 65 20 29 7b 0a 20 20 20 20 2a 70 69 4e  time ){.    *piN
29350 6f 77 20 3d 20 31 30 30 30 2a 28 73 71 6c 69 74  ow = 1000*(sqlit
29360 65 33 5f 69 6e 74 36 34 29 73 71 6c 69 74 65 33  e3_int64)sqlite3
29370 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 2b 20  _current_time + 
29380 75 6e 69 78 45 70 6f 63 68 3b 0a 20 20 7d 0a 23  unixEpoch;.  }.#
29390 65 6e 64 69 66 0a 20 20 55 4e 55 53 45 44 5f 50  endif.  UNUSED_P
293a0 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a  ARAMETER(pVfs);.
293b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
293c0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e  OK;.}../*.** Fin
293d0 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 69  d the current ti
293e0 6d 65 20 28 69 6e 20 55 6e 69 76 65 72 73 61 6c  me (in Universal
293f0 20 43 6f 6f 72 64 69 6e 61 74 65 64 20 54 69 6d   Coordinated Tim
29400 65 29 2e 20 20 57 72 69 74 65 20 74 68 65 0a 2a  e).  Write the.*
29410 2a 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 61  * current time a
29420 6e 64 20 64 61 74 65 20 61 73 20 61 20 4a 75 6c  nd date as a Jul
29430 69 61 6e 20 44 61 79 20 6e 75 6d 62 65 72 20 69  ian Day number i
29440 6e 74 6f 20 2a 70 72 4e 6f 77 20 61 6e 64 0a 2a  nto *prNow and.*
29450 2a 20 72 65 74 75 72 6e 20 30 2e 20 20 52 65 74  * return 0.  Ret
29460 75 72 6e 20 31 20 69 66 20 74 68 65 20 74 69 6d  urn 1 if the tim
29470 65 20 61 6e 64 20 64 61 74 65 20 63 61 6e 6e 6f  e and date canno
29480 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73  t be found..*/.s
29490 74 61 74 69 63 20 69 6e 74 20 77 69 6e 43 75 72  tatic int winCur
294a0 72 65 6e 74 54 69 6d 65 28 73 71 6c 69 74 65 33  rentTime(sqlite3
294b0 5f 76 66 73 20 2a 70 56 66 73 2c 20 64 6f 75 62  _vfs *pVfs, doub
294c0 6c 65 20 2a 70 72 4e 6f 77 29 7b 0a 20 20 69 6e  le *prNow){.  in
294d0 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f  t rc;.  sqlite3_
294e0 69 6e 74 36 34 20 69 3b 0a 20 20 72 63 20 3d 20  int64 i;.  rc = 
294f0 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 49 6e  winCurrentTimeIn
29500 74 36 34 28 70 56 66 73 2c 20 26 69 29 3b 0a 20  t64(pVfs, &i);. 
29510 20 69 66 28 20 21 72 63 20 29 7b 0a 20 20 20 20   if( !rc ){.    
29520 2a 70 72 4e 6f 77 20 3d 20 69 2f 38 36 34 30 30  *prNow = i/86400
29530 30 30 30 2e 30 3b 0a 20 20 7d 0a 20 20 72 65 74  000.0;.  }.  ret
29540 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
29550 20 54 68 65 20 69 64 65 61 20 69 73 20 74 68 61   The idea is tha
29560 74 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  t this function 
29570 77 6f 72 6b 73 20 6c 69 6b 65 20 61 20 63 6f 6d  works like a com
29580 62 69 6e 61 74 69 6f 6e 20 6f 66 0a 2a 2a 20 47  bination of.** G
29590 65 74 4c 61 73 74 45 72 72 6f 72 28 29 20 61 6e  etLastError() an
295a0 64 20 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 28  d FormatMessage(
295b0 29 20 6f 6e 20 57 69 6e 64 6f 77 73 20 28 6f 72  ) on Windows (or
295c0 20 65 72 72 6e 6f 20 61 6e 64 0a 2a 2a 20 73 74   errno and.** st
295d0 72 65 72 72 6f 72 5f 72 28 29 20 6f 6e 20 55 6e  rerror_r() on Un
295e0 69 78 29 2e 20 41 66 74 65 72 20 61 6e 20 65 72  ix). After an er
295f0 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20  ror is returned 
29600 62 79 20 61 6e 20 4f 53 0a 2a 2a 20 66 75 6e 63  by an OS.** func
29610 74 69 6f 6e 2c 20 53 51 4c 69 74 65 20 63 61 6c  tion, SQLite cal
29620 6c 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ls this function
29630 20 77 69 74 68 20 7a 42 75 66 20 70 6f 69 6e 74   with zBuf point
29640 69 6e 67 20 74 6f 0a 2a 2a 20 61 20 62 75 66 66  ing to.** a buff
29650 65 72 20 6f 66 20 6e 42 75 66 20 62 79 74 65 73  er of nBuf bytes
29660 2e 20 54 68 65 20 4f 53 20 6c 61 79 65 72 20 73  . The OS layer s
29670 68 6f 75 6c 64 20 70 6f 70 75 6c 61 74 65 20 74  hould populate t
29680 68 65 0a 2a 2a 20 62 75 66 66 65 72 20 77 69 74  he.** buffer wit
29690 68 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74  h a nul-terminat
296a0 65 64 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64  ed UTF-8 encoded
296b0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a   error message.*
296c0 2a 20 64 65 73 63 72 69 62 69 6e 67 20 74 68 65  * describing the
296d0 20 6c 61 73 74 20 49 4f 20 65 72 72 6f 72 20 74   last IO error t
296e0 6f 20 68 61 76 65 20 6f 63 63 75 72 72 65 64 20  o have occurred 
296f0 77 69 74 68 69 6e 20 74 68 65 20 63 61 6c 6c 69  within the calli
29700 6e 67 0a 2a 2a 20 74 68 72 65 61 64 2e 0a 2a 2a  ng.** thread..**
29710 0a 2a 2a 20 49 66 20 74 68 65 20 65 72 72 6f 72  .** If the error
29720 20 6d 65 73 73 61 67 65 20 69 73 20 74 6f 6f 20   message is too 
29730 6c 61 72 67 65 20 66 6f 72 20 74 68 65 20 73 75  large for the su
29740 70 70 6c 69 65 64 20 62 75 66 66 65 72 2c 0a 2a  pplied buffer,.*
29750 2a 20 69 74 20 73 68 6f 75 6c 64 20 62 65 20 74  * it should be t
29760 72 75 6e 63 61 74 65 64 2e 20 54 68 65 20 72 65  runcated. The re
29770 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 78 47  turn value of xG
29780 65 74 4c 61 73 74 45 72 72 6f 72 0a 2a 2a 20 69  etLastError.** i
29790 73 20 7a 65 72 6f 20 69 66 20 74 68 65 20 65 72  s zero if the er
297a0 72 6f 72 20 6d 65 73 73 61 67 65 20 66 69 74 73  ror message fits
297b0 20 69 6e 20 74 68 65 20 62 75 66 66 65 72 2c 20   in the buffer, 
297c0 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20 6f  or non-zero.** o
297d0 74 68 65 72 77 69 73 65 20 28 69 66 20 74 68 65  therwise (if the
297e0 20 6d 65 73 73 61 67 65 20 77 61 73 20 74 72 75   message was tru
297f0 6e 63 61 74 65 64 29 2e 20 49 66 20 6e 6f 6e 2d  ncated). If non-
29800 7a 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64  zero is returned
29810 2c 0a 2a 2a 20 74 68 65 6e 20 69 74 20 69 73 20  ,.** then it is 
29820 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f  not necessary to
29830 20 69 6e 63 6c 75 64 65 20 74 68 65 20 6e 75 6c   include the nul
29840 2d 74 65 72 6d 69 6e 61 74 6f 72 20 63 68 61 72  -terminator char
29850 61 63 74 65 72 0a 2a 2a 20 69 6e 20 74 68 65 20  acter.** in the 
29860 6f 75 74 70 75 74 20 62 75 66 66 65 72 2e 0a 2a  output buffer..*
29870 2a 0a 2a 2a 20 4e 6f 74 20 73 75 70 70 6c 79 69  *.** Not supplyi
29880 6e 67 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ng an error mess
29890 61 67 65 20 77 69 6c 6c 20 68 61 76 65 20 6e 6f  age will have no
298a0 20 61 64 76 65 72 73 65 20 65 66 66 65 63 74 0a   adverse effect.
298b0 2a 2a 20 6f 6e 20 53 51 4c 69 74 65 2e 20 49 74  ** on SQLite. It
298c0 20 69 73 20 66 69 6e 65 20 74 6f 20 68 61 76 65   is fine to have
298d0 20 61 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69   an implementati
298e0 6f 6e 20 74 68 61 74 20 6e 65 76 65 72 0a 2a 2a  on that never.**
298f0 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f   returns an erro
29900 72 20 6d 65 73 73 61 67 65 3a 0a 2a 2a 0a 2a 2a  r message:.**.**
29910 20 20 20 69 6e 74 20 78 47 65 74 4c 61 73 74 45     int xGetLastE
29920 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73  rror(sqlite3_vfs
29930 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 75 66   *pVfs, int nBuf
29940 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 2a  , char *zBuf){.*
29950 2a 20 20 20 20 20 61 73 73 65 72 74 28 7a 42 75  *     assert(zBu
29960 66 5b 30 5d 3d 3d 27 5c 30 27 29 3b 0a 2a 2a 20  f[0]=='\0');.** 
29970 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 2a 2a      return 0;.**
29980 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 48 6f 77 65 76     }.**.** Howev
29990 65 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6d  er if an error m
299a0 65 73 73 61 67 65 20 69 73 20 73 75 70 70 6c 69  essage is suppli
299b0 65 64 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 69  ed, it will be i
299c0 6e 63 6f 72 70 6f 72 61 74 65 64 0a 2a 2a 20 62  ncorporated.** b
299d0 79 20 73 71 6c 69 74 65 20 69 6e 74 6f 20 74 68  y sqlite into th
299e0 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  e error message 
299f0 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 74 68 65  available to the
29a00 20 75 73 65 72 20 75 73 69 6e 67 0a 2a 2a 20 73   user using.** s
29a10 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 29 2c  qlite3_errmsg(),
29a20 20 70 6f 73 73 69 62 6c 79 20 6d 61 6b 69 6e 67   possibly making
29a30 20 49 4f 20 65 72 72 6f 72 73 20 65 61 73 69 65   IO errors easie
29a40 72 20 74 6f 20 64 65 62 75 67 2e 0a 2a 2f 0a 73  r to debug..*/.s
29a50 74 61 74 69 63 20 69 6e 74 20 77 69 6e 47 65 74  tatic int winGet
29a60 4c 61 73 74 45 72 72 6f 72 28 73 71 6c 69 74 65  LastError(sqlite
29a70 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74  3_vfs *pVfs, int
29a80 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75   nBuf, char *zBu
29a90 66 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  f){.  UNUSED_PAR
29aa0 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20  AMETER(pVfs);.  
29ab0 72 65 74 75 72 6e 20 77 69 6e 47 65 74 4c 61 73  return winGetLas
29ac0 74 45 72 72 6f 72 4d 73 67 28 6f 73 47 65 74 4c  tErrorMsg(osGetL
29ad0 61 73 74 45 72 72 6f 72 28 29 2c 20 6e 42 75 66  astError(), nBuf
29ae0 2c 20 7a 42 75 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  , zBuf);.}../*.*
29af0 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e 64  * Initialize and
29b00 20 64 65 69 6e 69 74 69 61 6c 69 7a 65 20 74 68   deinitialize th
29b10 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  e operating syst
29b20 65 6d 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f  em interface..*/
29b30 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f  .int sqlite3_os_
29b40 69 6e 69 74 28 76 6f 69 64 29 7b 0a 20 20 73 74  init(void){.  st
29b50 61 74 69 63 20 73 71 6c 69 74 65 33 5f 76 66 73  atic sqlite3_vfs
29b60 20 77 69 6e 56 66 73 20 3d 20 7b 0a 20 20 20 20   winVfs = {.    
29b70 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  3,              
29b80 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e       /* iVersion
29b90 20 2a 2f 0a 20 20 20 20 73 69 7a 65 6f 66 28 77   */.    sizeof(w
29ba0 69 6e 46 69 6c 65 29 2c 20 20 20 20 20 2f 2a 20  inFile),     /* 
29bb0 73 7a 4f 73 46 69 6c 65 20 2a 2f 0a 20 20 20 20  szOsFile */.    
29bc0 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 58  SQLITE_WIN32_MAX
29bd0 5f 50 41 54 48 5f 42 59 54 45 53 2c 20 2f 2a 20  _PATH_BYTES, /* 
29be0 6d 78 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20  mxPathname */.  
29bf0 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
29c00 20 20 20 20 20 20 20 2f 2a 20 70 4e 65 78 74 20         /* pNext 
29c10 2a 2f 0a 20 20 20 20 22 77 69 6e 33 32 22 2c 20  */.    "win32", 
29c20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a              /* z
29c30 4e 61 6d 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20  Name */.    0,  
29c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29c50 20 2f 2a 20 70 41 70 70 44 61 74 61 20 2a 2f 0a   /* pAppData */.
29c60 20 20 20 20 77 69 6e 4f 70 65 6e 2c 20 20 20 20      winOpen,    
29c70 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4f 70 65           /* xOpe
29c80 6e 20 2a 2f 0a 20 20 20 20 77 69 6e 44 65 6c 65  n */.    winDele
29c90 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  te,           /*
29ca0 20 78 44 65 6c 65 74 65 20 2a 2f 0a 20 20 20 20   xDelete */.    
29cb0 77 69 6e 41 63 63 65 73 73 2c 20 20 20 20 20 20  winAccess,      
29cc0 20 20 20 20 20 2f 2a 20 78 41 63 63 65 73 73 20       /* xAccess 
29cd0 2a 2f 0a 20 20 20 20 77 69 6e 46 75 6c 6c 50 61  */.    winFullPa
29ce0 74 68 6e 61 6d 65 2c 20 20 20 20 20 2f 2a 20 78  thname,     /* x
29cf0 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 2a 2f 0a  FullPathname */.
29d00 20 20 20 20 77 69 6e 44 6c 4f 70 65 6e 2c 20 20      winDlOpen,  
29d10 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 4f           /* xDlO
29d20 70 65 6e 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c  pen */.    winDl
29d30 45 72 72 6f 72 2c 20 20 20 20 20 20 20 20 20 20  Error,          
29d40 2f 2a 20 78 44 6c 45 72 72 6f 72 20 2a 2f 0a 20  /* xDlError */. 
29d50 20 20 20 77 69 6e 44 6c 53 79 6d 2c 20 20 20 20     winDlSym,    
29d60 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 53 79          /* xDlSy
29d70 6d 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 43 6c  m */.    winDlCl
29d80 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ose,          /*
29d90 20 78 44 6c 43 6c 6f 73 65 20 2a 2f 0a 20 20 20   xDlClose */.   
29da0 20 77 69 6e 52 61 6e 64 6f 6d 6e 65 73 73 2c 20   winRandomness, 
29db0 20 20 20 20 20 20 2f 2a 20 78 52 61 6e 64 6f 6d        /* xRandom
29dc0 6e 65 73 73 20 2a 2f 0a 20 20 20 20 77 69 6e 53  ness */.    winS
29dd0 6c 65 65 70 2c 20 20 20 20 20 20 20 20 20 20 20  leep,           
29de0 20 2f 2a 20 78 53 6c 65 65 70 20 2a 2f 0a 20 20   /* xSleep */.  
29df0 20 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65    winCurrentTime
29e00 2c 20 20 20 20 20 20 2f 2a 20 78 43 75 72 72 65  ,      /* xCurre
29e10 6e 74 54 69 6d 65 20 2a 2f 0a 20 20 20 20 77 69  ntTime */.    wi
29e20 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 2c 20 20  nGetLastError,  
29e30 20 20 20 2f 2a 20 78 47 65 74 4c 61 73 74 45 72     /* xGetLastEr
29e40 72 6f 72 20 2a 2f 0a 20 20 20 20 77 69 6e 43 75  ror */.    winCu
29e50 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 2c 20  rrentTimeInt64, 
29e60 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65 49  /* xCurrentTimeI
29e70 6e 74 36 34 20 2a 2f 0a 20 20 20 20 77 69 6e 53  nt64 */.    winS
29e80 65 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20  etSystemCall,   
29e90 20 2f 2a 20 78 53 65 74 53 79 73 74 65 6d 43 61   /* xSetSystemCa
29ea0 6c 6c 20 2a 2f 0a 20 20 20 20 77 69 6e 47 65 74  ll */.    winGet
29eb0 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20 20 2f  SystemCall,    /
29ec0 2a 20 78 47 65 74 53 79 73 74 65 6d 43 61 6c 6c  * xGetSystemCall
29ed0 20 2a 2f 0a 20 20 20 20 77 69 6e 4e 65 78 74 53   */.    winNextS
29ee0 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20 2f 2a 20  ystemCall,   /* 
29ef0 78 4e 65 78 74 53 79 73 74 65 6d 43 61 6c 6c 20  xNextSystemCall 
29f00 2a 2f 0a 20 20 7d 3b 0a 23 69 66 20 64 65 66 69  */.  };.#if defi
29f10 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
29f20 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 73 74 61  _HAS_WIDE).  sta
29f30 74 69 63 20 73 71 6c 69 74 65 33 5f 76 66 73 20  tic sqlite3_vfs 
29f40 77 69 6e 4c 6f 6e 67 50 61 74 68 56 66 73 20 3d  winLongPathVfs =
29f50 20 7b 0a 20 20 20 20 33 2c 20 20 20 20 20 20 20   {.    3,       
29f60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69              /* i
29f70 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 73  Version */.    s
29f80 69 7a 65 6f 66 28 77 69 6e 46 69 6c 65 29 2c 20  izeof(winFile), 
29f90 20 20 20 20 2f 2a 20 73 7a 4f 73 46 69 6c 65 20      /* szOsFile 
29fa0 2a 2f 0a 20 20 20 20 53 51 4c 49 54 45 5f 57 49  */.    SQLITE_WI
29fb0 4e 4e 54 5f 4d 41 58 5f 50 41 54 48 5f 42 59 54  NNT_MAX_PATH_BYT
29fc0 45 53 2c 20 2f 2a 20 6d 78 50 61 74 68 6e 61 6d  ES, /* mxPathnam
29fd0 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20  e */.    0,     
29fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29ff0 20 70 4e 65 78 74 20 2a 2f 0a 20 20 20 20 22 77   pNext */.    "w
2a000 69 6e 33 32 2d 6c 6f 6e 67 70 61 74 68 22 2c 20  in32-longpath", 
2a010 20 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a 20     /* zName */. 
2a020 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20     0,           
2a030 20 20 20 20 20 20 20 20 2f 2a 20 70 41 70 70 44          /* pAppD
2a040 61 74 61 20 2a 2f 0a 20 20 20 20 77 69 6e 4f 70  ata */.    winOp
2a050 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  en,             
2a060 2f 2a 20 78 4f 70 65 6e 20 2a 2f 0a 20 20 20 20  /* xOpen */.    
2a070 77 69 6e 44 65 6c 65 74 65 2c 20 20 20 20 20 20  winDelete,      
2a080 20 20 20 20 20 2f 2a 20 78 44 65 6c 65 74 65 20       /* xDelete 
2a090 2a 2f 0a 20 20 20 20 77 69 6e 41 63 63 65 73 73  */.    winAccess
2a0a0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78  ,           /* x
2a0b0 41 63 63 65 73 73 20 2a 2f 0a 20 20 20 20 77 69  Access */.    wi
2a0c0 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 20  nFullPathname,  
2a0d0 20 20 20 2f 2a 20 78 46 75 6c 6c 50 61 74 68 6e     /* xFullPathn
2a0e0 61 6d 65 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c  ame */.    winDl
2a0f0 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20  Open,           
2a100 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a 2f 0a 20 20  /* xDlOpen */.  
2a110 20 20 77 69 6e 44 6c 45 72 72 6f 72 2c 20 20 20    winDlError,   
2a120 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 45 72 72         /* xDlErr
2a130 6f 72 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 53  or */.    winDlS
2a140 79 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ym,            /
2a150 2a 20 78 44 6c 53 79 6d 20 2a 2f 0a 20 20 20 20  * xDlSym */.    
2a160 77 69 6e 44 6c 43 6c 6f 73 65 2c 20 20 20 20 20  winDlClose,     
2a170 20 20 20 20 20 2f 2a 20 78 44 6c 43 6c 6f 73 65       /* xDlClose
2a180 20 2a 2f 0a 20 20 20 20 77 69 6e 52 61 6e 64 6f   */.    winRando
2a190 6d 6e 65 73 73 2c 20 20 20 20 20 20 20 2f 2a 20  mness,       /* 
2a1a0 78 52 61 6e 64 6f 6d 6e 65 73 73 20 2a 2f 0a 20  xRandomness */. 
2a1b0 20 20 20 77 69 6e 53 6c 65 65 70 2c 20 20 20 20     winSleep,    
2a1c0 20 20 20 20 20 20 20 20 2f 2a 20 78 53 6c 65 65          /* xSlee
2a1d0 70 20 2a 2f 0a 20 20 20 20 77 69 6e 43 75 72 72  p */.    winCurr
2a1e0 65 6e 74 54 69 6d 65 2c 20 20 20 20 20 20 2f 2a  entTime,      /*
2a1f0 20 78 43 75 72 72 65 6e 74 54 69 6d 65 20 2a 2f   xCurrentTime */
2a200 0a 20 20 20 20 77 69 6e 47 65 74 4c 61 73 74 45  .    winGetLastE
2a210 72 72 6f 72 2c 20 20 20 20 20 2f 2a 20 78 47 65  rror,     /* xGe
2a220 74 4c 61 73 74 45 72 72 6f 72 20 2a 2f 0a 20 20  tLastError */.  
2a230 20 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65    winCurrentTime
2a240 49 6e 74 36 34 2c 20 2f 2a 20 78 43 75 72 72 65  Int64, /* xCurre
2a250 6e 74 54 69 6d 65 49 6e 74 36 34 20 2a 2f 0a 20  ntTimeInt64 */. 
2a260 20 20 20 77 69 6e 53 65 74 53 79 73 74 65 6d 43     winSetSystemC
2a270 61 6c 6c 2c 20 20 20 20 2f 2a 20 78 53 65 74 53  all,    /* xSetS
2a280 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20  ystemCall */.   
2a290 20 77 69 6e 47 65 74 53 79 73 74 65 6d 43 61 6c   winGetSystemCal
2a2a0 6c 2c 20 20 20 20 2f 2a 20 78 47 65 74 53 79 73  l,    /* xGetSys
2a2b0 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20 20 77  temCall */.    w
2a2c0 69 6e 4e 65 78 74 53 79 73 74 65 6d 43 61 6c 6c  inNextSystemCall
2a2d0 2c 20 20 20 2f 2a 20 78 4e 65 78 74 53 79 73 74  ,   /* xNextSyst
2a2e0 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 7d 3b 0a 23  emCall */.  };.#
2a2f0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 6f 75 62  endif..  /* Doub
2a300 6c 65 2d 63 68 65 63 6b 20 74 68 61 74 20 74 68  le-check that th
2a310 65 20 61 53 79 73 63 61 6c 6c 5b 5d 20 61 72 72  e aSyscall[] arr
2a320 61 79 20 68 61 73 20 62 65 65 6e 20 63 6f 6e 73  ay has been cons
2a330 74 72 75 63 74 65 64 0a 20 20 2a 2a 20 63 6f 72  tructed.  ** cor
2a340 72 65 63 74 6c 79 2e 20 20 53 65 65 20 74 69 63  rectly.  See tic
2a350 6b 65 74 20 5b 62 62 33 61 38 36 65 38 39 30 63  ket [bb3a86e890c
2a360 38 65 39 36 61 62 5d 20 2a 2f 0a 20 20 61 73 73  8e96ab] */.  ass
2a370 65 72 74 28 20 41 72 72 61 79 53 69 7a 65 28 61  ert( ArraySize(a
2a380 53 79 73 63 61 6c 6c 29 3d 3d 37 36 20 29 3b 0a  Syscall)==76 );.
2a390 0a 20 20 2f 2a 20 67 65 74 20 6d 65 6d 6f 72 79  .  /* get memory
2a3a0 20 6d 61 70 20 61 6c 6c 6f 63 61 74 69 6f 6e 20   map allocation 
2a3b0 67 72 61 6e 75 6c 61 72 69 74 79 20 2a 2f 0a 20  granularity */. 
2a3c0 20 6d 65 6d 73 65 74 28 26 77 69 6e 53 79 73 49   memset(&winSysI
2a3d0 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 53  nfo, 0, sizeof(S
2a3e0 59 53 54 45 4d 5f 49 4e 46 4f 29 29 3b 0a 23 69  YSTEM_INFO));.#i
2a3f0 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
2a400 54 0a 20 20 6f 73 47 65 74 4e 61 74 69 76 65 53  T.  osGetNativeS
2a410 79 73 74 65 6d 49 6e 66 6f 28 26 77 69 6e 53 79  ystemInfo(&winSy
2a420 73 49 6e 66 6f 29 3b 0a 23 65 6c 73 65 0a 20 20  sInfo);.#else.  
2a430 6f 73 47 65 74 53 79 73 74 65 6d 49 6e 66 6f 28  osGetSystemInfo(
2a440 26 77 69 6e 53 79 73 49 6e 66 6f 29 3b 0a 23 65  &winSysInfo);.#e
2a450 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 77  ndif.  assert( w
2a460 69 6e 53 79 73 49 6e 66 6f 2e 64 77 41 6c 6c 6f  inSysInfo.dwAllo
2a470 63 61 74 69 6f 6e 47 72 61 6e 75 6c 61 72 69 74  cationGranularit
2a480 79 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  y>0 );.  assert(
2a490 20 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77 50 61   winSysInfo.dwPa
2a4a0 67 65 53 69 7a 65 3e 30 20 29 3b 0a 0a 20 20 73  geSize>0 );..  s
2a4b0 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73  qlite3_vfs_regis
2a4c0 74 65 72 28 26 77 69 6e 56 66 73 2c 20 31 29 3b  ter(&winVfs, 1);
2a4d0 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
2a4e0 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57  LITE_WIN32_HAS_W
2a4f0 49 44 45 29 0a 20 20 73 71 6c 69 74 65 33 5f 76  IDE).  sqlite3_v
2a500 66 73 5f 72 65 67 69 73 74 65 72 28 26 77 69 6e  fs_register(&win
2a510 4c 6f 6e 67 50 61 74 68 56 66 73 2c 20 30 29 3b  LongPathVfs, 0);
2a520 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72  .#endif..  retur
2a530 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 0a 7d 0a  n SQLITE_OK; .}.
2a540 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f  .int sqlite3_os_
2a550 65 6e 64 28 76 6f 69 64 29 7b 20 0a 23 69 66 20  end(void){ .#if 
2a560 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
2a570 20 20 69 66 28 20 73 6c 65 65 70 4f 62 6a 21 3d    if( sleepObj!=
2a580 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 6f 73 43 6c  NULL ){.    osCl
2a590 6f 73 65 48 61 6e 64 6c 65 28 73 6c 65 65 70 4f  oseHandle(sleepO
2a5a0 62 6a 29 3b 0a 20 20 20 20 73 6c 65 65 70 4f 62  bj);.    sleepOb
2a5b0 6a 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 23 65  j = NULL;.  }.#e
2a5c0 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51  ndif.  return SQ
2a5d0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64  LITE_OK;.}..#end
2a5e0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 53 5f  if /* SQLITE_OS_
2a5f0 57 49 4e 20 2a 2f 0a                             WIN */.