/ Hex Artifact Content
Login

Artifact f8affe82a8b28990879a564c84d78c51aab4fa90:


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 44 65 66 69 6e 65 20 74 68 65 20  *.** Define the 
06b0: 72 65 71 75 69 72 65 64 20 57 69 6e 64 6f 77 73  required Windows
06c0: 20 53 44 4b 20 76 65 72 73 69 6f 6e 20 63 6f 6e   SDK version con
06d0: 73 74 61 6e 74 73 20 69 66 20 74 68 65 79 20 61  stants if they a
06e0: 72 65 20 6e 6f 74 0a 2a 2a 20 61 6c 72 65 61 64  re not.** alread
06f0: 79 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2f 0a  y available..*/.
0700: 23 69 66 6e 64 65 66 20 4e 54 44 44 49 5f 57 49  #ifndef NTDDI_WI
0710: 4e 38 0a 23 20 20 64 65 66 69 6e 65 20 4e 54 44  N8.#  define NTD
0720: 44 49 5f 57 49 4e 38 20 20 20 20 20 20 20 20 20  DI_WIN8         
0730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
0740: 78 30 36 30 32 30 30 30 30 0a 23 65 6e 64 69 66  x06020000.#endif
0750: 0a 0a 23 69 66 6e 64 65 66 20 4e 54 44 44 49 5f  ..#ifndef NTDDI_
0760: 57 49 4e 42 4c 55 45 0a 23 20 20 64 65 66 69 6e  WINBLUE.#  defin
0770: 65 20 4e 54 44 44 49 5f 57 49 4e 42 4c 55 45 20  e NTDDI_WINBLUE 
0780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0790: 20 20 20 20 30 78 30 36 30 33 30 30 30 30 0a 23      0x06030000.#
07a0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 68 65  endif../*.** Che
07b0: 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
07c0: 20 47 65 74 56 65 72 73 69 6f 6e 45 78 5b 41 57   GetVersionEx[AW
07d0: 5d 20 66 75 6e 63 74 69 6f 6e 73 20 61 72 65 20  ] functions are 
07e0: 64 65 70 72 65 63 61 74 65 64 20 6f 6e 20 74 68  deprecated on th
07f0: 65 0a 2a 2a 20 74 61 72 67 65 74 2e 20 20 47 65  e.** target.  Ge
0800: 74 56 65 72 73 69 6f 6e 45 78 5b 41 57 5d 20 77  tVersionEx[AW] w
0810: 65 72 65 20 66 69 72 73 74 20 64 65 70 72 65 63  ere first deprec
0820: 61 74 65 64 20 69 6e 20 57 69 6e 38 2e 31 2e 20  ated in Win8.1. 
0830: 20 54 68 65 0a 2a 2f 0a 23 69 66 6e 64 65 66 20   The.*/.#ifndef 
0840: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 47 45 54  SQLITE_WIN32_GET
0850: 56 45 52 53 49 4f 4e 45 58 0a 23 20 20 69 66 20  VERSIONEX.#  if 
0860: 64 65 66 69 6e 65 64 28 4e 54 44 44 49 5f 56 45  defined(NTDDI_VE
0870: 52 53 49 4f 4e 29 20 26 26 20 4e 54 44 44 49 5f  RSION) && NTDDI_
0880: 56 45 52 53 49 4f 4e 20 3e 3d 20 4e 54 44 44 49  VERSION >= NTDDI
0890: 5f 57 49 4e 42 4c 55 45 0a 23 20 20 20 20 64 65  _WINBLUE.#    de
08a0: 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33  fine SQLITE_WIN3
08b0: 32 5f 47 45 54 56 45 52 53 49 4f 4e 45 58 20 20  2_GETVERSIONEX  
08c0: 20 30 20 20 20 2f 2a 20 47 65 74 56 65 72 73 69   0   /* GetVersi
08d0: 6f 6e 45 78 28 29 20 69 73 20 64 65 70 72 65 63  onEx() is deprec
08e0: 61 74 65 64 20 2a 2f 0a 23 20 20 65 6c 73 65 0a  ated */.#  else.
08f0: 23 20 20 20 20 64 65 66 69 6e 65 20 53 51 4c 49  #    define SQLI
0900: 54 45 5f 57 49 4e 33 32 5f 47 45 54 56 45 52 53  TE_WIN32_GETVERS
0910: 49 4f 4e 45 58 20 20 20 31 20 20 20 2f 2a 20 47  IONEX   1   /* G
0920: 65 74 56 65 72 73 69 6f 6e 45 78 28 29 20 69 73  etVersionEx() is
0930: 20 63 75 72 72 65 6e 74 20 2a 2f 0a 23 20 20 65   current */.#  e
0940: 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  ndif.#endif../*.
0950: 2a 2a 20 54 68 69 73 20 63 6f 6e 73 74 61 6e 74  ** This constant
0960: 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20   should already 
0970: 62 65 20 64 65 66 69 6e 65 64 20 28 69 6e 20 74  be defined (in t
0980: 68 65 20 22 57 69 6e 44 65 66 2e 68 22 20 53 44  he "WinDef.h" SD
0990: 4b 20 66 69 6c 65 29 2e 0a 2a 2f 0a 23 69 66 6e  K file)..*/.#ifn
09a0: 64 65 66 20 4d 41 58 5f 50 41 54 48 0a 23 20 20  def MAX_PATH.#  
09b0: 64 65 66 69 6e 65 20 4d 41 58 5f 50 41 54 48 20  define MAX_PATH 
09c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09d0: 20 20 20 20 20 28 32 36 30 29 0a 23 65 6e 64 69       (260).#endi
09e0: 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d  f../*.** Maximum
09f0: 20 70 61 74 68 6e 61 6d 65 20 6c 65 6e 67 74 68   pathname length
0a00: 20 28 69 6e 20 63 68 61 72 73 29 20 66 6f 72 20   (in chars) for 
0a10: 57 69 6e 33 32 2e 20 20 54 68 69 73 20 73 68 6f  Win32.  This sho
0a20: 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20 62 65 0a  uld normally be.
0a30: 2a 2a 20 4d 41 58 5f 50 41 54 48 2e 0a 2a 2f 0a  ** MAX_PATH..*/.
0a40: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57  #ifndef SQLITE_W
0a50: 49 4e 33 32 5f 4d 41 58 5f 50 41 54 48 5f 43 48  IN32_MAX_PATH_CH
0a60: 41 52 53 0a 23 20 20 64 65 66 69 6e 65 20 53 51  ARS.#  define SQ
0a70: 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 50  LITE_WIN32_MAX_P
0a80: 41 54 48 5f 43 48 41 52 53 20 20 20 28 4d 41 58  ATH_CHARS   (MAX
0a90: 5f 50 41 54 48 29 0a 23 65 6e 64 69 66 0a 0a 2f  _PATH).#endif../
0aa0: 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 6e 73 74 61  *.** This consta
0ab0: 6e 74 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64  nt should alread
0ac0: 79 20 62 65 20 64 65 66 69 6e 65 64 20 28 69 6e  y be defined (in
0ad0: 20 74 68 65 20 22 57 69 6e 4e 54 2e 68 22 20 53   the "WinNT.h" S
0ae0: 44 4b 20 66 69 6c 65 29 2e 0a 2a 2f 0a 23 69 66  DK file)..*/.#if
0af0: 6e 64 65 66 20 55 4e 49 43 4f 44 45 5f 53 54 52  ndef UNICODE_STR
0b00: 49 4e 47 5f 4d 41 58 5f 43 48 41 52 53 0a 23 20  ING_MAX_CHARS.# 
0b10: 20 64 65 66 69 6e 65 20 55 4e 49 43 4f 44 45 5f   define UNICODE_
0b20: 53 54 52 49 4e 47 5f 4d 41 58 5f 43 48 41 52 53  STRING_MAX_CHARS
0b30: 20 20 20 20 20 20 28 33 32 37 36 37 29 0a 23 65        (32767).#e
0b40: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69  ndif../*.** Maxi
0b50: 6d 75 6d 20 70 61 74 68 6e 61 6d 65 20 6c 65 6e  mum pathname len
0b60: 67 74 68 20 28 69 6e 20 63 68 61 72 73 29 20 66  gth (in chars) f
0b70: 6f 72 20 57 69 6e 4e 54 2e 20 20 54 68 69 73 20  or WinNT.  This 
0b80: 73 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20  should normally 
0b90: 62 65 0a 2a 2a 20 55 4e 49 43 4f 44 45 5f 53 54  be.** UNICODE_ST
0ba0: 52 49 4e 47 5f 4d 41 58 5f 43 48 41 52 53 2e 0a  RING_MAX_CHARS..
0bb0: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
0bc0: 45 5f 57 49 4e 4e 54 5f 4d 41 58 5f 50 41 54 48  E_WINNT_MAX_PATH
0bd0: 5f 43 48 41 52 53 0a 23 20 20 64 65 66 69 6e 65  _CHARS.#  define
0be0: 20 53 51 4c 49 54 45 5f 57 49 4e 4e 54 5f 4d 41   SQLITE_WINNT_MA
0bf0: 58 5f 50 41 54 48 5f 43 48 41 52 53 20 20 20 28  X_PATH_CHARS   (
0c00: 55 4e 49 43 4f 44 45 5f 53 54 52 49 4e 47 5f 4d  UNICODE_STRING_M
0c10: 41 58 5f 43 48 41 52 53 29 0a 23 65 6e 64 69 66  AX_CHARS).#endif
0c20: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20  ../*.** Maximum 
0c30: 70 61 74 68 6e 61 6d 65 20 6c 65 6e 67 74 68 20  pathname length 
0c40: 28 69 6e 20 62 79 74 65 73 29 20 66 6f 72 20 57  (in bytes) for W
0c50: 69 6e 33 32 2e 20 20 54 68 65 20 4d 41 58 5f 50  in32.  The MAX_P
0c60: 41 54 48 20 6d 61 63 72 6f 20 69 73 20 69 6e 0a  ATH macro is in.
0c70: 2a 2a 20 63 68 61 72 61 63 74 65 72 73 2c 20 73  ** characters, s
0c80: 6f 20 77 65 20 61 6c 6c 6f 63 61 74 65 20 34 20  o we allocate 4 
0c90: 62 79 74 65 73 20 70 65 72 20 63 68 61 72 61 63  bytes per charac
0ca0: 74 65 72 20 61 73 73 75 6d 69 6e 67 20 77 6f 72  ter assuming wor
0cb0: 73 74 2d 63 61 73 65 20 6f 66 0a 2a 2a 20 34 2d  st-case of.** 4-
0cc0: 62 79 74 65 73 2d 70 65 72 2d 63 68 61 72 61 63  bytes-per-charac
0cd0: 74 65 72 20 66 6f 72 20 55 54 46 38 2e 0a 2a 2f  ter for UTF8..*/
0ce0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
0cf0: 57 49 4e 33 32 5f 4d 41 58 5f 50 41 54 48 5f 42  WIN32_MAX_PATH_B
0d00: 59 54 45 53 0a 23 20 20 64 65 66 69 6e 65 20 53  YTES.#  define S
0d10: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f  QLITE_WIN32_MAX_
0d20: 50 41 54 48 5f 42 59 54 45 53 20 20 20 28 53 51  PATH_BYTES   (SQ
0d30: 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 50  LITE_WIN32_MAX_P
0d40: 41 54 48 5f 43 48 41 52 53 2a 34 29 0a 23 65 6e  ATH_CHARS*4).#en
0d50: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d  dif../*.** Maxim
0d60: 75 6d 20 70 61 74 68 6e 61 6d 65 20 6c 65 6e 67  um pathname leng
0d70: 74 68 20 28 69 6e 20 62 79 74 65 73 29 20 66 6f  th (in bytes) fo
0d80: 72 20 57 69 6e 4e 54 2e 20 20 54 68 69 73 20 73  r WinNT.  This s
0d90: 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20 62  hould normally b
0da0: 65 0a 2a 2a 20 55 4e 49 43 4f 44 45 5f 53 54 52  e.** UNICODE_STR
0db0: 49 4e 47 5f 4d 41 58 5f 43 48 41 52 53 20 2a 20  ING_MAX_CHARS * 
0dc0: 73 69 7a 65 6f 66 28 57 43 48 41 52 29 2e 0a 2a  sizeof(WCHAR)..*
0dd0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
0de0: 5f 57 49 4e 4e 54 5f 4d 41 58 5f 50 41 54 48 5f  _WINNT_MAX_PATH_
0df0: 42 59 54 45 53 0a 23 20 20 64 65 66 69 6e 65 20  BYTES.#  define 
0e00: 53 51 4c 49 54 45 5f 57 49 4e 4e 54 5f 4d 41 58  SQLITE_WINNT_MAX
0e10: 5f 50 41 54 48 5f 42 59 54 45 53 20 20 20 5c 0a  _PATH_BYTES   \.
0e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e30: 20 20 20 20 20 20 20 20 20 20 20 20 28 73 69 7a              (siz
0e40: 65 6f 66 28 57 43 48 41 52 29 20 2a 20 53 51 4c  eof(WCHAR) * SQL
0e50: 49 54 45 5f 57 49 4e 4e 54 5f 4d 41 58 5f 50 41  ITE_WINNT_MAX_PA
0e60: 54 48 5f 43 48 41 52 53 29 0a 23 65 6e 64 69 66  TH_CHARS).#endif
0e70: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20  ../*.** Maximum 
0e80: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 6c 65  error message le
0e90: 6e 67 74 68 20 28 69 6e 20 63 68 61 72 73 29 20  ngth (in chars) 
0ea0: 66 6f 72 20 57 69 6e 52 54 2e 0a 2a 2f 0a 23 69  for WinRT..*/.#i
0eb0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  fndef SQLITE_WIN
0ec0: 33 32 5f 4d 41 58 5f 45 52 52 4d 53 47 5f 43 48  32_MAX_ERRMSG_CH
0ed0: 41 52 53 0a 23 20 20 64 65 66 69 6e 65 20 53 51  ARS.#  define SQ
0ee0: 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 45  LITE_WIN32_MAX_E
0ef0: 52 52 4d 53 47 5f 43 48 41 52 53 20 28 31 30 32  RRMSG_CHARS (102
0f00: 34 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  4).#endif../*.**
0f10: 20 52 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72   Returns non-zer
0f20: 6f 20 69 66 20 74 68 65 20 63 68 61 72 61 63 74  o if the charact
0f30: 65 72 20 73 68 6f 75 6c 64 20 62 65 20 74 72 65  er should be tre
0f40: 61 74 65 64 20 61 73 20 61 20 64 69 72 65 63 74  ated as a direct
0f50: 6f 72 79 0a 2a 2a 20 73 65 70 61 72 61 74 6f 72  ory.** separator
0f60: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 77 69 6e  ..*/.#ifndef win
0f70: 49 73 44 69 72 53 65 70 0a 23 20 20 64 65 66 69  IsDirSep.#  defi
0f80: 6e 65 20 77 69 6e 49 73 44 69 72 53 65 70 28 61  ne winIsDirSep(a
0f90: 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
0fa0: 20 28 28 28 61 29 20 3d 3d 20 27 2f 27 29 20 7c   (((a) == '/') |
0fb0: 7c 20 28 28 61 29 20 3d 3d 20 27 5c 5c 27 29 29  | ((a) == '\\'))
0fc0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
0fd0: 68 69 73 20 6d 61 63 72 6f 20 69 73 20 75 73 65  his macro is use
0fe0: 64 20 77 68 65 6e 20 61 20 6c 6f 63 61 6c 20 76  d when a local v
0ff0: 61 72 69 61 62 6c 65 20 69 73 20 73 65 74 20 74  ariable is set t
1000: 6f 20 61 20 76 61 6c 75 65 20 74 68 61 74 20 69  o a value that i
1010: 73 0a 2a 2a 20 5b 73 6f 6d 65 74 69 6d 65 73 5d  s.** [sometimes]
1020: 20 6e 6f 74 20 75 73 65 64 20 62 79 20 74 68 65   not used by the
1030: 20 63 6f 64 65 20 28 65 2e 67 2e 20 76 69 61 20   code (e.g. via 
1040: 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 63 6f 6d 70  conditional comp
1050: 69 6c 61 74 69 6f 6e 29 2e 0a 2a 2f 0a 23 69 66  ilation)..*/.#if
1060: 6e 64 65 66 20 55 4e 55 53 45 44 5f 56 41 52 49  ndef UNUSED_VARI
1070: 41 42 4c 45 5f 56 41 4c 55 45 0a 23 20 20 64 65  ABLE_VALUE.#  de
1080: 66 69 6e 65 20 55 4e 55 53 45 44 5f 56 41 52 49  fine UNUSED_VARI
1090: 41 42 4c 45 5f 56 41 4c 55 45 28 78 29 20 20 20  ABLE_VALUE(x)   
10a0: 20 20 20 28 76 6f 69 64 29 28 78 29 0a 23 65 6e     (void)(x).#en
10b0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  dif../*.** Retur
10c0: 6e 73 20 74 68 65 20 63 68 61 72 61 63 74 65 72  ns the character
10d0: 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
10e0: 75 73 65 64 20 61 73 20 74 68 65 20 64 69 72 65  used as the dire
10f0: 63 74 6f 72 79 20 73 65 70 61 72 61 74 6f 72 2e  ctory separator.
1100: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 77 69 6e 47  .*/.#ifndef winG
1110: 65 74 44 69 72 53 65 70 0a 23 20 20 64 65 66 69  etDirSep.#  defi
1120: 6e 65 20 77 69 6e 47 65 74 44 69 72 53 65 70 28  ne winGetDirSep(
1130: 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
1140: 20 27 5c 5c 27 0a 23 65 6e 64 69 66 0a 0a 2f 2a   '\\'.#endif../*
1150: 0a 2a 2a 20 44 6f 20 77 65 20 6e 65 65 64 20 74  .** Do we need t
1160: 6f 20 6d 61 6e 75 61 6c 6c 79 20 64 65 66 69 6e  o manually defin
1170: 65 20 74 68 65 20 57 69 6e 33 32 20 66 69 6c 65  e the Win32 file
1180: 20 6d 61 70 70 69 6e 67 20 41 50 49 73 20 66 6f   mapping APIs fo
1190: 72 20 75 73 65 20 77 69 74 68 20 57 41 4c 0a 2a  r use with WAL.*
11a0: 2a 20 6d 6f 64 65 20 28 65 2e 67 2e 20 74 68 65  * mode (e.g. the
11b0: 73 65 20 41 50 49 73 20 61 72 65 20 61 76 61 69  se APIs are avai
11c0: 6c 61 62 6c 65 20 69 6e 20 74 68 65 20 57 69 6e  lable in the Win
11d0: 64 6f 77 73 20 43 45 20 53 44 4b 3b 20 68 6f 77  dows CE SDK; how
11e0: 65 76 65 72 2c 20 74 68 65 79 0a 2a 2a 20 61 72  ever, they.** ar
11f0: 65 20 6e 6f 74 20 70 72 65 73 65 6e 74 20 69 6e  e not present in
1200: 20 74 68 65 20 68 65 61 64 65 72 20 66 69 6c 65   the header file
1210: 29 3f 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  )?.*/.#if SQLITE
1220: 5f 57 49 4e 33 32 5f 46 49 4c 45 4d 41 50 50 49  _WIN32_FILEMAPPI
1230: 4e 47 5f 41 50 49 20 26 26 20 21 64 65 66 69 6e  NG_API && !defin
1240: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ed(SQLITE_OMIT_W
1250: 41 4c 29 0a 2f 2a 0a 2a 2a 20 54 77 6f 20 6f 66  AL)./*.** Two of
1260: 20 74 68 65 20 66 69 6c 65 20 6d 61 70 70 69 6e   the file mappin
1270: 67 20 41 50 49 73 20 61 72 65 20 64 69 66 66 65  g APIs are diffe
1280: 72 65 6e 74 20 75 6e 64 65 72 20 57 69 6e 52 54  rent under WinRT
1290: 2e 20 20 46 69 67 75 72 65 20 6f 75 74 20 77 68  .  Figure out wh
12a0: 69 63 68 0a 2a 2a 20 73 65 74 20 77 65 20 6e 65  ich.** set we ne
12b0: 65 64 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54  ed..*/.#if SQLIT
12c0: 45 5f 4f 53 5f 57 49 4e 52 54 0a 57 49 4e 42 41  E_OS_WINRT.WINBA
12d0: 53 45 41 50 49 20 48 41 4e 44 4c 45 20 57 49 4e  SEAPI HANDLE WIN
12e0: 41 50 49 20 43 72 65 61 74 65 46 69 6c 65 4d 61  API CreateFileMa
12f0: 70 70 69 6e 67 46 72 6f 6d 41 70 70 28 48 41 4e  ppingFromApp(HAN
1300: 44 4c 45 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c  DLE, \.        L
1310: 50 53 45 43 55 52 49 54 59 5f 41 54 54 52 49 42  PSECURITY_ATTRIB
1320: 55 54 45 53 2c 20 55 4c 4f 4e 47 2c 20 55 4c 4f  UTES, ULONG, ULO
1330: 4e 47 36 34 2c 20 4c 50 43 57 53 54 52 29 3b 0a  NG64, LPCWSTR);.
1340: 0a 57 49 4e 42 41 53 45 41 50 49 20 4c 50 56 4f  .WINBASEAPI LPVO
1350: 49 44 20 57 49 4e 41 50 49 20 4d 61 70 56 69 65  ID WINAPI MapVie
1360: 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 28 48  wOfFileFromApp(H
1370: 41 4e 44 4c 45 2c 20 55 4c 4f 4e 47 2c 20 55 4c  ANDLE, ULONG, UL
1380: 4f 4e 47 36 34 2c 20 53 49 5a 45 5f 54 29 3b 0a  ONG64, SIZE_T);.
1390: 23 65 6c 73 65 0a 23 69 66 20 64 65 66 69 6e 65  #else.#if define
13a0: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
13b0: 41 53 5f 41 4e 53 49 29 0a 57 49 4e 42 41 53 45  AS_ANSI).WINBASE
13c0: 41 50 49 20 48 41 4e 44 4c 45 20 57 49 4e 41 50  API HANDLE WINAP
13d0: 49 20 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70  I CreateFileMapp
13e0: 69 6e 67 41 28 48 41 4e 44 4c 45 2c 20 4c 50 53  ingA(HANDLE, LPS
13f0: 45 43 55 52 49 54 59 5f 41 54 54 52 49 42 55 54  ECURITY_ATTRIBUT
1400: 45 53 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57  ES, \.        DW
1410: 4f 52 44 2c 20 44 57 4f 52 44 2c 20 44 57 4f 52  ORD, DWORD, DWOR
1420: 44 2c 20 4c 50 43 53 54 52 29 3b 0a 23 65 6e 64  D, LPCSTR);.#end
1430: 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51  if /* defined(SQ
1440: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
1450: 4e 53 49 29 20 2a 2f 0a 0a 23 69 66 20 64 65 66  NSI) */..#if def
1460: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
1470: 32 5f 48 41 53 5f 57 49 44 45 29 0a 57 49 4e 42  2_HAS_WIDE).WINB
1480: 41 53 45 41 50 49 20 48 41 4e 44 4c 45 20 57 49  ASEAPI HANDLE WI
1490: 4e 41 50 49 20 43 72 65 61 74 65 46 69 6c 65 4d  NAPI CreateFileM
14a0: 61 70 70 69 6e 67 57 28 48 41 4e 44 4c 45 2c 20  appingW(HANDLE, 
14b0: 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54 52 49  LPSECURITY_ATTRI
14c0: 42 55 54 45 53 2c 20 5c 0a 20 20 20 20 20 20 20  BUTES, \.       
14d0: 20 44 57 4f 52 44 2c 20 44 57 4f 52 44 2c 20 44   DWORD, DWORD, D
14e0: 57 4f 52 44 2c 20 4c 50 43 57 53 54 52 29 3b 0a  WORD, LPCWSTR);.
14f0: 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65  #endif /* define
1500: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
1510: 41 53 5f 57 49 44 45 29 20 2a 2f 0a 0a 57 49 4e  AS_WIDE) */..WIN
1520: 42 41 53 45 41 50 49 20 4c 50 56 4f 49 44 20 57  BASEAPI LPVOID W
1530: 49 4e 41 50 49 20 4d 61 70 56 69 65 77 4f 66 46  INAPI MapViewOfF
1540: 69 6c 65 28 48 41 4e 44 4c 45 2c 20 44 57 4f 52  ile(HANDLE, DWOR
1550: 44 2c 20 44 57 4f 52 44 2c 20 44 57 4f 52 44 2c  D, DWORD, DWORD,
1560: 20 53 49 5a 45 5f 54 29 3b 0a 23 65 6e 64 69 66   SIZE_T);.#endif
1570: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49   /* SQLITE_OS_WI
1580: 4e 52 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  NRT */../*.** Th
1590: 69 73 20 66 69 6c 65 20 6d 61 70 70 69 6e 67 20  is file mapping 
15a0: 41 50 49 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f  API is common to
15b0: 20 62 6f 74 68 20 57 69 6e 33 32 20 61 6e 64 20   both Win32 and 
15c0: 57 69 6e 52 54 2e 0a 2a 2f 0a 57 49 4e 42 41 53  WinRT..*/.WINBAS
15d0: 45 41 50 49 20 42 4f 4f 4c 20 57 49 4e 41 50 49  EAPI BOOL WINAPI
15e0: 20 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65   UnmapViewOfFile
15f0: 28 4c 50 43 56 4f 49 44 29 3b 0a 23 65 6e 64 69  (LPCVOID);.#endi
1600: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 57 49 4e 33  f /* SQLITE_WIN3
1610: 32 5f 46 49 4c 45 4d 41 50 50 49 4e 47 5f 41 50  2_FILEMAPPING_AP
1620: 49 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  I && !defined(SQ
1630: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 2a  LITE_OMIT_WAL) *
1640: 2f 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 20 4d 69  /../*.** Some Mi
1650: 63 72 6f 73 6f 66 74 20 63 6f 6d 70 69 6c 65 72  crosoft compiler
1660: 73 20 6c 61 63 6b 20 74 68 69 73 20 64 65 66 69  s lack this defi
1670: 6e 69 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64  nition..*/.#ifnd
1680: 65 66 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f  ef INVALID_FILE_
1690: 41 54 54 52 49 42 55 54 45 53 0a 23 20 64 65 66  ATTRIBUTES.# def
16a0: 69 6e 65 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45  ine INVALID_FILE
16b0: 5f 41 54 54 52 49 42 55 54 45 53 20 28 28 44 57  _ATTRIBUTES ((DW
16c0: 4f 52 44 29 2d 31 29 0a 23 65 6e 64 69 66 0a 0a  ORD)-1).#endif..
16d0: 23 69 66 6e 64 65 66 20 46 49 4c 45 5f 46 4c 41  #ifndef FILE_FLA
16e0: 47 5f 4d 41 53 4b 0a 23 20 64 65 66 69 6e 65 20  G_MASK.# define 
16f0: 46 49 4c 45 5f 46 4c 41 47 5f 4d 41 53 4b 20 20  FILE_FLAG_MASK  
1700: 20 20 20 20 20 20 20 20 28 30 78 46 46 33 43 30          (0xFF3C0
1710: 30 30 30 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66  000).#endif..#if
1720: 6e 64 65 66 20 46 49 4c 45 5f 41 54 54 52 49 42  ndef FILE_ATTRIB
1730: 55 54 45 5f 4d 41 53 4b 0a 23 20 64 65 66 69 6e  UTE_MASK.# defin
1740: 65 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  e FILE_ATTRIBUTE
1750: 5f 4d 41 53 4b 20 20 20 20 20 28 30 78 30 30 30  _MASK     (0x000
1760: 33 46 46 46 37 29 0a 23 65 6e 64 69 66 0a 0a 23  3FFF7).#endif..#
1770: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1780: 49 54 5f 57 41 4c 0a 2f 2a 20 46 6f 72 77 61 72  IT_WAL./* Forwar
1790: 64 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  d references to 
17a0: 73 74 72 75 63 74 75 72 65 73 20 75 73 65 64 20  structures used 
17b0: 66 6f 72 20 57 41 4c 20 2a 2f 0a 74 79 70 65 64  for WAL */.typed
17c0: 65 66 20 73 74 72 75 63 74 20 77 69 6e 53 68 6d  ef struct winShm
17d0: 20 77 69 6e 53 68 6d 3b 20 20 20 20 20 20 20 20   winShm;        
17e0: 20 20 20 2f 2a 20 41 20 63 6f 6e 6e 65 63 74 69     /* A connecti
17f0: 6f 6e 20 74 6f 20 73 68 61 72 65 64 2d 6d 65 6d  on to shared-mem
1800: 6f 72 79 20 2a 2f 0a 74 79 70 65 64 65 66 20 73  ory */.typedef s
1810: 74 72 75 63 74 20 77 69 6e 53 68 6d 4e 6f 64 65  truct winShmNode
1820: 20 77 69 6e 53 68 6d 4e 6f 64 65 3b 20 20 20 2f   winShmNode;   /
1830: 2a 20 41 20 72 65 67 69 6f 6e 20 6f 66 20 73 68  * A region of sh
1840: 61 72 65 64 2d 6d 65 6d 6f 72 79 20 2a 2f 0a 23  ared-memory */.#
1850: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 69 6e  endif../*.** Win
1860: 43 45 20 6c 61 63 6b 73 20 6e 61 74 69 76 65 20  CE lacks native 
1870: 73 75 70 70 6f 72 74 20 66 6f 72 20 66 69 6c 65  support for file
1880: 20 6c 6f 63 6b 69 6e 67 20 73 6f 20 77 65 20 68   locking so we h
1890: 61 76 65 20 74 6f 20 66 61 6b 65 20 69 74 0a 2a  ave to fake it.*
18a0: 2a 20 77 69 74 68 20 73 6f 6d 65 20 63 6f 64 65  * with some code
18b0: 20 6f 66 20 6f 75 72 20 6f 77 6e 2e 0a 2a 2f 0a   of our own..*/.
18c0: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
18d0: 4e 43 45 0a 74 79 70 65 64 65 66 20 73 74 72 75  NCE.typedef stru
18e0: 63 74 20 77 69 6e 63 65 4c 6f 63 6b 20 7b 0a 20  ct winceLock {. 
18f0: 20 69 6e 74 20 6e 52 65 61 64 65 72 73 3b 20 20   int nReaders;  
1900: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1910: 66 20 72 65 61 64 65 72 20 6c 6f 63 6b 73 20 6f  f reader locks o
1920: 62 74 61 69 6e 65 64 20 2a 2f 0a 20 20 42 4f 4f  btained */.  BOO
1930: 4c 20 62 50 65 6e 64 69 6e 67 3b 20 20 20 20 20  L bPending;     
1940: 20 2f 2a 20 49 6e 64 69 63 61 74 65 73 20 61 20   /* Indicates a 
1950: 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 20 68 61 73  pending lock has
1960: 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 2a   been obtained *
1970: 2f 0a 20 20 42 4f 4f 4c 20 62 52 65 73 65 72 76  /.  BOOL bReserv
1980: 65 64 3b 20 20 20 20 20 2f 2a 20 49 6e 64 69 63  ed;     /* Indic
1990: 61 74 65 73 20 61 20 72 65 73 65 72 76 65 64 20  ates a reserved 
19a0: 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 6f 62  lock has been ob
19b0: 74 61 69 6e 65 64 20 2a 2f 0a 20 20 42 4f 4f 4c  tained */.  BOOL
19c0: 20 62 45 78 63 6c 75 73 69 76 65 3b 20 20 20 20   bExclusive;    
19d0: 2f 2a 20 49 6e 64 69 63 61 74 65 73 20 61 6e 20  /* Indicates an 
19e0: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 68  exclusive lock h
19f0: 61 73 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64  as been obtained
1a00: 20 2a 2f 0a 7d 20 77 69 6e 63 65 4c 6f 63 6b 3b   */.} winceLock;
1a10: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
1a20: 68 65 20 77 69 6e 46 69 6c 65 20 73 74 72 75 63  he winFile struc
1a30: 74 75 72 65 20 69 73 20 61 20 73 75 62 63 6c 61  ture is a subcla
1a40: 73 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 66 69  ss of sqlite3_fi
1a50: 6c 65 2a 20 73 70 65 63 69 66 69 63 20 74 6f 20  le* specific to 
1a60: 74 68 65 20 77 69 6e 33 32 0a 2a 2a 20 70 6f 72  the win32.** por
1a70: 74 61 62 69 6c 69 74 79 20 6c 61 79 65 72 2e 0a  tability layer..
1a80: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
1a90: 74 20 77 69 6e 46 69 6c 65 20 77 69 6e 46 69 6c  t winFile winFil
1aa0: 65 3b 0a 73 74 72 75 63 74 20 77 69 6e 46 69 6c  e;.struct winFil
1ab0: 65 20 7b 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69  e {.  const sqli
1ac0: 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a  te3_io_methods *
1ad0: 70 4d 65 74 68 6f 64 3b 20 2f 2a 2a 2a 20 4d 75  pMethod; /*** Mu
1ae0: 73 74 20 62 65 20 66 69 72 73 74 20 2a 2a 2a 2f  st be first ***/
1af0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
1b00: 70 56 66 73 3b 20 20 20 20 20 20 2f 2a 20 54 68  pVfs;      /* Th
1b10: 65 20 56 46 53 20 75 73 65 64 20 74 6f 20 6f 70  e VFS used to op
1b20: 65 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a  en this file */.
1b30: 20 20 48 41 4e 44 4c 45 20 68 3b 20 20 20 20 20    HANDLE h;     
1b40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e            /* Han
1b50: 64 6c 65 20 66 6f 72 20 61 63 63 65 73 73 69 6e  dle for accessin
1b60: 67 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20  g the file */.  
1b70: 75 38 20 6c 6f 63 6b 74 79 70 65 3b 20 20 20 20  u8 locktype;    
1b80: 20 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20          /* Type 
1b90: 6f 66 20 6c 6f 63 6b 20 63 75 72 72 65 6e 74 6c  of lock currentl
1ba0: 79 20 68 65 6c 64 20 6f 6e 20 74 68 69 73 20 66  y held on this f
1bb0: 69 6c 65 20 2a 2f 0a 20 20 73 68 6f 72 74 20 73  ile */.  short s
1bc0: 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 3b 20 20  haredLockByte;  
1bd0: 20 2f 2a 20 52 61 6e 64 6f 6d 6c 79 20 63 68 6f   /* Randomly cho
1be0: 73 65 6e 20 62 79 74 65 20 75 73 65 64 20 61 73  sen byte used as
1bf0: 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 2a   a shared lock *
1c00: 2f 0a 20 20 75 38 20 63 74 72 6c 46 6c 61 67 73  /.  u8 ctrlFlags
1c10: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  ;           /* F
1c20: 6c 61 67 73 2e 20 20 53 65 65 20 57 49 4e 46 49  lags.  See WINFI
1c30: 4c 45 5f 2a 20 62 65 6c 6f 77 20 2a 2f 0a 20 20  LE_* below */.  
1c40: 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b  DWORD lastErrno;
1c50: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
1c60: 69 6e 64 6f 77 73 20 65 72 72 6e 6f 20 66 72 6f  indows errno fro
1c70: 6d 20 74 68 65 20 6c 61 73 74 20 49 2f 4f 20 65  m the last I/O e
1c80: 72 72 6f 72 20 2a 2f 0a 23 69 66 6e 64 65 66 20  rror */.#ifndef 
1c90: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
1ca0: 20 20 77 69 6e 53 68 6d 20 2a 70 53 68 6d 3b 20    winShm *pShm; 
1cb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73            /* Ins
1cc0: 74 61 6e 63 65 20 6f 66 20 73 68 61 72 65 64 20  tance of shared 
1cd0: 6d 65 6d 6f 72 79 20 6f 6e 20 74 68 69 73 20 66  memory on this f
1ce0: 69 6c 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  ile */.#endif.  
1cf0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
1d00: 68 3b 20 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20  h;      /* Full 
1d10: 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 69 73  pathname of this
1d20: 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 73   file */.  int s
1d30: 7a 43 68 75 6e 6b 3b 20 20 20 20 20 20 20 20 20  zChunk;         
1d40: 20 20 20 2f 2a 20 43 68 75 6e 6b 20 73 69 7a 65     /* Chunk size
1d50: 20 63 6f 6e 66 69 67 75 72 65 64 20 62 79 20 46   configured by F
1d60: 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 20  CNTL_CHUNK_SIZE 
1d70: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  */.#if SQLITE_OS
1d80: 5f 57 49 4e 43 45 0a 20 20 4c 50 57 53 54 52 20  _WINCE.  LPWSTR 
1d90: 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 3b 20  zDeleteOnClose; 
1da0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65   /* Name of file
1db0: 20 74 6f 20 64 65 6c 65 74 65 20 77 68 65 6e 20   to delete when 
1dc0: 63 6c 6f 73 69 6e 67 20 2a 2f 0a 20 20 48 41 4e  closing */.  HAN
1dd0: 44 4c 45 20 68 4d 75 74 65 78 3b 20 20 20 20 20  DLE hMutex;     
1de0: 20 20 20 20 20 2f 2a 20 4d 75 74 65 78 20 75 73       /* Mutex us
1df0: 65 64 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 61 63  ed to control ac
1e00: 63 65 73 73 20 74 6f 20 73 68 61 72 65 64 20 6c  cess to shared l
1e10: 6f 63 6b 20 2a 2f 0a 20 20 48 41 4e 44 4c 45 20  ock */.  HANDLE 
1e20: 68 53 68 61 72 65 64 3b 20 20 20 20 20 20 20 20  hShared;        
1e30: 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f 72   /* Shared memor
1e40: 79 20 73 65 67 6d 65 6e 74 20 75 73 65 64 20 66  y segment used f
1e50: 6f 72 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20  or locking */.  
1e60: 77 69 6e 63 65 4c 6f 63 6b 20 6c 6f 63 61 6c 3b  winceLock local;
1e70: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 6b 73          /* Locks
1e80: 20 6f 62 74 61 69 6e 65 64 20 62 79 20 74 68 69   obtained by thi
1e90: 73 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 77 69  s instance of wi
1ea0: 6e 46 69 6c 65 20 2a 2f 0a 20 20 77 69 6e 63 65  nFile */.  wince
1eb0: 4c 6f 63 6b 20 2a 73 68 61 72 65 64 3b 20 20 20  Lock *shared;   
1ec0: 20 20 20 2f 2a 20 47 6c 6f 62 61 6c 20 73 68 61     /* Global sha
1ed0: 72 65 64 20 6c 6f 63 6b 20 6d 65 6d 6f 72 79 20  red lock memory 
1ee0: 66 6f 72 20 74 68 65 20 66 69 6c 65 20 20 2a 2f  for the file  */
1ef0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
1f00: 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
1f10: 3e 30 0a 20 20 69 6e 74 20 6e 46 65 74 63 68 4f  >0.  int nFetchO
1f20: 75 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ut;             
1f30: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1f40: 6f 75 74 73 74 61 6e 64 69 6e 67 20 78 46 65 74  outstanding xFet
1f50: 63 68 20 72 65 66 65 72 65 6e 63 65 73 20 2a 2f  ch references */
1f60: 0a 20 20 48 41 4e 44 4c 45 20 68 4d 61 70 3b 20  .  HANDLE hMap; 
1f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f80: 20 2f 2a 20 48 61 6e 64 6c 65 20 66 6f 72 20 61   /* Handle for a
1f90: 63 63 65 73 73 69 6e 67 20 6d 65 6d 6f 72 79 20  ccessing memory 
1fa0: 6d 61 70 70 69 6e 67 20 2a 2f 0a 20 20 76 6f 69  mapping */.  voi
1fb0: 64 20 2a 70 4d 61 70 52 65 67 69 6f 6e 3b 20 20  d *pMapRegion;  
1fc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
1fd0: 65 61 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64  ea memory mapped
1fe0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
1ff0: 74 36 34 20 6d 6d 61 70 53 69 7a 65 3b 20 20 20  t64 mmapSize;   
2000: 20 20 20 20 2f 2a 20 55 73 61 62 6c 65 20 73 69      /* Usable si
2010: 7a 65 20 6f 66 20 6d 61 70 70 65 64 20 72 65 67  ze of mapped reg
2020: 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ion */.  sqlite3
2030: 5f 69 6e 74 36 34 20 6d 6d 61 70 53 69 7a 65 41  _int64 mmapSizeA
2040: 63 74 75 61 6c 3b 20 2f 2a 20 41 63 74 75 61 6c  ctual; /* Actual
2050: 20 73 69 7a 65 20 6f 66 20 6d 61 70 70 65 64 20   size of mapped 
2060: 72 65 67 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69  region */.  sqli
2070: 74 65 33 5f 69 6e 74 36 34 20 6d 6d 61 70 53 69  te3_int64 mmapSi
2080: 7a 65 4d 61 78 3b 20 20 20 20 2f 2a 20 43 6f 6e  zeMax;    /* Con
2090: 66 69 67 75 72 65 64 20 46 43 4e 54 4c 5f 4d 4d  figured FCNTL_MM
20a0: 41 50 5f 53 49 5a 45 20 76 61 6c 75 65 20 2a 2f  AP_SIZE value */
20b0: 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a  .#endif.};../*.*
20c0: 2a 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73  * Allowed values
20d0: 20 66 6f 72 20 77 69 6e 46 69 6c 65 2e 63 74 72   for winFile.ctr
20e0: 6c 46 6c 61 67 73 0a 2a 2f 0a 23 64 65 66 69 6e  lFlags.*/.#defin
20f0: 65 20 57 49 4e 46 49 4c 45 5f 52 44 4f 4e 4c 59  e WINFILE_RDONLY
2100: 20 20 20 20 20 20 20 20 20 20 30 78 30 32 20 20            0x02  
2110: 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 69   /* Connection i
2120: 73 20 72 65 61 64 20 6f 6e 6c 79 20 2a 2f 0a 23  s read only */.#
2130: 64 65 66 69 6e 65 20 57 49 4e 46 49 4c 45 5f 50  define WINFILE_P
2140: 45 52 53 49 53 54 5f 57 41 4c 20 20 20 20 20 30  ERSIST_WAL     0
2150: 78 30 34 20 20 20 2f 2a 20 50 65 72 73 69 73 74  x04   /* Persist
2160: 65 6e 74 20 57 41 4c 20 6d 6f 64 65 20 2a 2f 0a  ent WAL mode */.
2170: 23 64 65 66 69 6e 65 20 57 49 4e 46 49 4c 45 5f  #define WINFILE_
2180: 50 53 4f 57 20 20 20 20 20 20 20 20 20 20 20 20  PSOW            
2190: 30 78 31 30 20 20 20 2f 2a 20 53 51 4c 49 54 45  0x10   /* SQLITE
21a0: 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53 41 46 45  _IOCAP_POWERSAFE
21b0: 5f 4f 56 45 52 57 52 49 54 45 20 2a 2f 0a 0a 2f  _OVERWRITE */../
21c0: 2a 0a 20 2a 20 54 68 65 20 73 69 7a 65 20 6f 66  *. * The size of
21d0: 20 74 68 65 20 62 75 66 66 65 72 20 75 73 65 64   the buffer used
21e0: 20 62 79 20 73 71 6c 69 74 65 33 5f 77 69 6e 33   by sqlite3_win3
21f0: 32 5f 77 72 69 74 65 5f 64 65 62 75 67 28 29 2e  2_write_debug().
2200: 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  . */.#ifndef SQL
2210: 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55  ITE_WIN32_DBG_BU
2220: 46 5f 53 49 5a 45 0a 23 20 20 64 65 66 69 6e 65  F_SIZE.#  define
2230: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42   SQLITE_WIN32_DB
2240: 47 5f 42 55 46 5f 53 49 5a 45 20 20 20 28 28 69  G_BUF_SIZE   ((i
2250: 6e 74 29 28 34 30 39 36 2d 73 69 7a 65 6f 66 28  nt)(4096-sizeof(
2260: 44 57 4f 52 44 29 29 29 0a 23 65 6e 64 69 66 0a  DWORD))).#endif.
2270: 0a 2f 2a 0a 20 2a 20 54 68 65 20 76 61 6c 75 65  ./*. * The value
2280: 20 75 73 65 64 20 77 69 74 68 20 73 71 6c 69 74   used with sqlit
2290: 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72  e3_win32_set_dir
22a0: 65 63 74 6f 72 79 28 29 20 74 6f 20 73 70 65 63  ectory() to spec
22b0: 69 66 79 20 74 68 61 74 0a 20 2a 20 74 68 65 20  ify that. * the 
22c0: 64 61 74 61 20 64 69 72 65 63 74 6f 72 79 20 73  data directory s
22d0: 68 6f 75 6c 64 20 62 65 20 63 68 61 6e 67 65 64  hould be changed
22e0: 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  .. */.#ifndef SQ
22f0: 4c 49 54 45 5f 57 49 4e 33 32 5f 44 41 54 41 5f  LITE_WIN32_DATA_
2300: 44 49 52 45 43 54 4f 52 59 5f 54 59 50 45 0a 23  DIRECTORY_TYPE.#
2310: 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f    define SQLITE_
2320: 57 49 4e 33 32 5f 44 41 54 41 5f 44 49 52 45 43  WIN32_DATA_DIREC
2330: 54 4f 52 59 5f 54 59 50 45 20 28 31 29 0a 23 65  TORY_TYPE (1).#e
2340: 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20  ndif../*. * The 
2350: 76 61 6c 75 65 20 75 73 65 64 20 77 69 74 68 20  value used with 
2360: 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65  sqlite3_win32_se
2370: 74 5f 64 69 72 65 63 74 6f 72 79 28 29 20 74 6f  t_directory() to
2380: 20 73 70 65 63 69 66 79 20 74 68 61 74 0a 20 2a   specify that. *
2390: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 64   the temporary d
23a0: 69 72 65 63 74 6f 72 79 20 73 68 6f 75 6c 64 20  irectory should 
23b0: 62 65 20 63 68 61 6e 67 65 64 2e 0a 20 2a 2f 0a  be changed.. */.
23c0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57  #ifndef SQLITE_W
23d0: 49 4e 33 32 5f 54 45 4d 50 5f 44 49 52 45 43 54  IN32_TEMP_DIRECT
23e0: 4f 52 59 5f 54 59 50 45 0a 23 20 20 64 65 66 69  ORY_TYPE.#  defi
23f0: 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ne SQLITE_WIN32_
2400: 54 45 4d 50 5f 44 49 52 45 43 54 4f 52 59 5f 54  TEMP_DIRECTORY_T
2410: 59 50 45 20 28 32 29 0a 23 65 6e 64 69 66 0a 0a  YPE (2).#endif..
2420: 2f 2a 0a 20 2a 20 49 66 20 63 6f 6d 70 69 6c 65  /*. * If compile
2430: 64 20 77 69 74 68 20 53 51 4c 49 54 45 5f 57 49  d with SQLITE_WI
2440: 4e 33 32 5f 4d 41 4c 4c 4f 43 20 6f 6e 20 57 69  N32_MALLOC on Wi
2450: 6e 64 6f 77 73 2c 20 77 65 20 77 69 6c 6c 20 75  ndows, we will u
2460: 73 65 20 74 68 65 0a 20 2a 20 76 61 72 69 6f 75  se the. * variou
2470: 73 20 57 69 6e 33 32 20 41 50 49 20 68 65 61 70  s Win32 API heap
2480: 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 73 74 65   functions inste
2490: 61 64 20 6f 66 20 6f 75 72 20 6f 77 6e 2e 0a 20  ad of our own.. 
24a0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
24b0: 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 0a 0a 2f  _WIN32_MALLOC../
24c0: 2a 0a 20 2a 20 49 66 20 74 68 69 73 20 69 73 20  *. * If this is 
24d0: 6e 6f 6e 2d 7a 65 72 6f 2c 20 61 6e 20 69 73 6f  non-zero, an iso
24e0: 6c 61 74 65 64 20 68 65 61 70 20 77 69 6c 6c 20  lated heap will 
24f0: 62 65 20 63 72 65 61 74 65 64 20 62 79 20 74 68  be created by th
2500: 65 20 6e 61 74 69 76 65 20 57 69 6e 33 32 0a 20  e native Win32. 
2510: 2a 20 61 6c 6c 6f 63 61 74 6f 72 20 73 75 62 73  * allocator subs
2520: 79 73 74 65 6d 3b 20 6f 74 68 65 72 77 69 73 65  ystem; otherwise
2530: 2c 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 72  , the default pr
2540: 6f 63 65 73 73 20 68 65 61 70 20 77 69 6c 6c 20  ocess heap will 
2550: 62 65 20 75 73 65 64 2e 20 20 54 68 69 73 0a 20  be used.  This. 
2560: 2a 20 73 65 74 74 69 6e 67 20 68 61 73 20 6e 6f  * setting has no
2570: 20 65 66 66 65 63 74 20 77 68 65 6e 20 63 6f 6d   effect when com
2580: 70 69 6c 69 6e 67 20 66 6f 72 20 57 69 6e 52 54  piling for WinRT
2590: 2e 20 20 42 79 20 64 65 66 61 75 6c 74 2c 20 74  .  By default, t
25a0: 68 69 73 20 69 73 20 65 6e 61 62 6c 65 64 0a 20  his is enabled. 
25b0: 2a 20 61 6e 64 20 61 6e 20 69 73 6f 6c 61 74 65  * and an isolate
25c0: 64 20 68 65 61 70 20 77 69 6c 6c 20 62 65 20 63  d heap will be c
25d0: 72 65 61 74 65 64 20 74 6f 20 73 74 6f 72 65 20  reated to store 
25e0: 61 6c 6c 20 61 6c 6c 6f 63 61 74 65 64 20 64 61  all allocated da
25f0: 74 61 2e 0a 20 2a 0a 20 2a 2a 2a 2a 2a 2a 2a 2a  ta.. *. ********
2600: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2610: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2620: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2630: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2640: 2a 2a 2a 2a 2a 2a 0a 20 2a 20 57 41 52 4e 49 4e  ******. * WARNIN
2650: 47 3a 20 49 74 20 69 73 20 69 6d 70 6f 72 74 61  G: It is importa
2660: 6e 74 20 74 6f 20 6e 6f 74 65 20 74 68 61 74 20  nt to note that 
2670: 77 68 65 6e 20 74 68 69 73 20 73 65 74 74 69 6e  when this settin
2680: 67 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e  g is non-zero an
2690: 64 20 74 68 65 0a 20 2a 20 20 20 20 20 20 20 20  d the. *        
26a0: 20 20 77 69 6e 4d 65 6d 53 68 75 74 64 6f 77 6e    winMemShutdown
26b0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
26c0: 6c 65 64 20 28 65 2e 67 2e 20 62 79 20 74 68 65  led (e.g. by the
26d0: 20 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77   sqlite3_shutdow
26e0: 6e 0a 20 2a 20 20 20 20 20 20 20 20 20 20 66 75  n. *          fu
26f0: 6e 63 74 69 6f 6e 29 2c 20 61 6c 6c 20 64 61 74  nction), all dat
2700: 61 20 74 68 61 74 20 77 61 73 20 61 6c 6c 6f 63  a that was alloc
2710: 61 74 65 64 20 75 73 69 6e 67 20 74 68 65 20 69  ated using the i
2720: 73 6f 6c 61 74 65 64 20 68 65 61 70 20 77 69 6c  solated heap wil
2730: 6c 0a 20 2a 20 20 20 20 20 20 20 20 20 20 62 65  l. *          be
2740: 20 66 72 65 65 64 20 69 6d 6d 65 64 69 61 74 65   freed immediate
2750: 6c 79 20 61 6e 64 20 61 6e 79 20 61 74 74 65 6d  ly and any attem
2760: 70 74 20 74 6f 20 61 63 63 65 73 73 20 61 6e 79  pt to access any
2770: 20 6f 66 20 74 68 61 74 20 66 72 65 65 64 0a 20   of that freed. 
2780: 2a 20 20 20 20 20 20 20 20 20 20 64 61 74 61 20  *          data 
2790: 77 69 6c 6c 20 61 6c 6d 6f 73 74 20 63 65 72 74  will almost cert
27a0: 61 69 6e 6c 79 20 72 65 73 75 6c 74 20 69 6e 20  ainly result in 
27b0: 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 61 63 63  an immediate acc
27c0: 65 73 73 20 76 69 6f 6c 61 74 69 6f 6e 2e 0a 20  ess violation.. 
27d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2800: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2810: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20  **************. 
2820: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
2830: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 43 52 45  E_WIN32_HEAP_CRE
2840: 41 54 45 0a 23 20 20 64 65 66 69 6e 65 20 53 51  ATE.#  define SQ
2850: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
2860: 43 52 45 41 54 45 20 20 20 20 28 54 52 55 45 29  CREATE    (TRUE)
2870: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54  .#endif../*. * T
2880: 68 65 20 69 6e 69 74 69 61 6c 20 73 69 7a 65 20  he initial size 
2890: 6f 66 20 74 68 65 20 57 69 6e 33 32 2d 73 70 65  of the Win32-spe
28a0: 63 69 66 69 63 20 68 65 61 70 2e 20 20 54 68 69  cific heap.  Thi
28b0: 73 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20 7a  s value may be z
28c0: 65 72 6f 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66  ero.. */.#ifndef
28d0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
28e0: 41 50 5f 49 4e 49 54 5f 53 49 5a 45 0a 23 20 20  AP_INIT_SIZE.#  
28f0: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49  define SQLITE_WI
2900: 4e 33 32 5f 48 45 41 50 5f 49 4e 49 54 5f 53 49  N32_HEAP_INIT_SI
2910: 5a 45 20 28 28 53 51 4c 49 54 45 5f 44 45 46 41  ZE ((SQLITE_DEFA
2920: 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45 29 20  ULT_CACHE_SIZE) 
2930: 2a 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20  * \.            
2940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2950: 20 20 20 20 20 20 20 20 20 20 20 28 53 51 4c 49             (SQLI
2960: 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  TE_DEFAULT_PAGE_
2970: 53 49 5a 45 29 20 2b 20 34 31 39 34 33 30 34 29  SIZE) + 4194304)
2980: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54  .#endif../*. * T
2990: 68 65 20 6d 61 78 69 6d 75 6d 20 73 69 7a 65 20  he maximum size 
29a0: 6f 66 20 74 68 65 20 57 69 6e 33 32 2d 73 70 65  of the Win32-spe
29b0: 63 69 66 69 63 20 68 65 61 70 2e 20 20 54 68 69  cific heap.  Thi
29c0: 73 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20 7a  s value may be z
29d0: 65 72 6f 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66  ero.. */.#ifndef
29e0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
29f0: 41 50 5f 4d 41 58 5f 53 49 5a 45 0a 23 20 20 64  AP_MAX_SIZE.#  d
2a00: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e  efine SQLITE_WIN
2a10: 33 32 5f 48 45 41 50 5f 4d 41 58 5f 53 49 5a 45  32_HEAP_MAX_SIZE
2a20: 20 20 28 30 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a    (0).#endif../*
2a30: 0a 20 2a 20 54 68 65 20 65 78 74 72 61 20 66 6c  . * The extra fl
2a40: 61 67 73 20 74 6f 20 75 73 65 20 69 6e 20 63 61  ags to use in ca
2a50: 6c 6c 73 20 74 6f 20 74 68 65 20 57 69 6e 33 32  lls to the Win32
2a60: 20 68 65 61 70 20 41 50 49 73 2e 20 20 54 68 69   heap APIs.  Thi
2a70: 73 20 76 61 6c 75 65 20 6d 61 79 20 62 65 0a 20  s value may be. 
2a80: 2a 20 7a 65 72 6f 20 66 6f 72 20 74 68 65 20 64  * zero for the d
2a90: 65 66 61 75 6c 74 20 62 65 68 61 76 69 6f 72 2e  efault behavior.
2aa0: 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  . */.#ifndef SQL
2ab0: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46  ITE_WIN32_HEAP_F
2ac0: 4c 41 47 53 0a 23 20 20 64 65 66 69 6e 65 20 53  LAGS.#  define S
2ad0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
2ae0: 5f 46 4c 41 47 53 20 20 20 20 20 28 30 29 0a 23  _FLAGS     (0).#
2af0: 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  endif.../*.** Th
2b00: 65 20 77 69 6e 4d 65 6d 44 61 74 61 20 73 74 72  e winMemData str
2b10: 75 63 74 75 72 65 20 73 74 6f 72 65 73 20 69 6e  ucture stores in
2b20: 66 6f 72 6d 61 74 69 6f 6e 20 72 65 71 75 69 72  formation requir
2b30: 65 64 20 62 79 20 74 68 65 20 57 69 6e 33 32 2d  ed by the Win32-
2b40: 73 70 65 63 69 66 69 63 0a 2a 2a 20 73 71 6c 69  specific.** sqli
2b50: 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20  te3_mem_methods 
2b60: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 0a  implementation..
2b70: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
2b80: 74 20 77 69 6e 4d 65 6d 44 61 74 61 20 77 69 6e  t winMemData win
2b90: 4d 65 6d 44 61 74 61 3b 0a 73 74 72 75 63 74 20  MemData;.struct 
2ba0: 77 69 6e 4d 65 6d 44 61 74 61 20 7b 0a 23 69 66  winMemData {.#if
2bb0: 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 75 33  ndef NDEBUG.  u3
2bc0: 32 20 6d 61 67 69 63 31 3b 20 20 20 2f 2a 20 4d  2 magic1;   /* M
2bd0: 61 67 69 63 20 6e 75 6d 62 65 72 20 74 6f 20 64  agic number to d
2be0: 65 74 65 63 74 20 73 74 72 75 63 74 75 72 65 20  etect structure 
2bf0: 63 6f 72 72 75 70 74 69 6f 6e 2e 20 2a 2f 0a 23  corruption. */.#
2c00: 65 6e 64 69 66 0a 20 20 48 41 4e 44 4c 45 20 68  endif.  HANDLE h
2c10: 48 65 61 70 3b 20 2f 2a 20 54 68 65 20 68 61 6e  Heap; /* The han
2c20: 64 6c 65 20 74 6f 20 6f 75 72 20 68 65 61 70 2e  dle to our heap.
2c30: 20 2a 2f 0a 20 20 42 4f 4f 4c 20 62 4f 77 6e 65   */.  BOOL bOwne
2c40: 64 3b 20 20 2f 2a 20 44 6f 20 77 65 20 6f 77 6e  d;  /* Do we own
2c50: 20 74 68 65 20 68 65 61 70 20 28 69 2e 65 2e 20   the heap (i.e. 
2c60: 64 65 73 74 72 6f 79 20 69 74 20 6f 6e 20 73 68  destroy it on sh
2c70: 75 74 64 6f 77 6e 29 3f 20 2a 2f 0a 23 69 66 6e  utdown)? */.#ifn
2c80: 64 65 66 20 4e 44 45 42 55 47 0a 20 20 75 33 32  def NDEBUG.  u32
2c90: 20 6d 61 67 69 63 32 3b 20 20 20 2f 2a 20 4d 61   magic2;   /* Ma
2ca0: 67 69 63 20 6e 75 6d 62 65 72 20 74 6f 20 64 65  gic number to de
2cb0: 74 65 63 74 20 73 74 72 75 63 74 75 72 65 20 63  tect structure c
2cc0: 6f 72 72 75 70 74 69 6f 6e 2e 20 2a 2f 0a 23 65  orruption. */.#e
2cd0: 6e 64 69 66 0a 7d 3b 0a 0a 23 69 66 6e 64 65 66  ndif.};..#ifndef
2ce0: 20 4e 44 45 42 55 47 0a 23 64 65 66 69 6e 65 20   NDEBUG.#define 
2cf0: 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 31 20 20 20  WINMEM_MAGIC1   
2d00: 20 20 30 78 34 32 62 32 38 33 30 62 0a 23 64 65    0x42b2830b.#de
2d10: 66 69 6e 65 20 57 49 4e 4d 45 4d 5f 4d 41 47 49  fine WINMEM_MAGI
2d20: 43 32 20 20 20 20 20 30 78 62 64 34 64 37 63 66  C2     0xbd4d7cf
2d30: 34 0a 23 65 6e 64 69 66 0a 0a 73 74 61 74 69 63  4.#endif..static
2d40: 20 73 74 72 75 63 74 20 77 69 6e 4d 65 6d 44 61   struct winMemDa
2d50: 74 61 20 77 69 6e 5f 6d 65 6d 5f 64 61 74 61 20  ta win_mem_data 
2d60: 3d 20 7b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  = {.#ifndef NDEB
2d70: 55 47 0a 20 20 57 49 4e 4d 45 4d 5f 4d 41 47 49  UG.  WINMEM_MAGI
2d80: 43 31 2c 0a 23 65 6e 64 69 66 0a 20 20 4e 55 4c  C1,.#endif.  NUL
2d90: 4c 2c 20 46 41 4c 53 45 0a 23 69 66 6e 64 65 66  L, FALSE.#ifndef
2da0: 20 4e 44 45 42 55 47 0a 20 20 2c 57 49 4e 4d 45   NDEBUG.  ,WINME
2db0: 4d 5f 4d 41 47 49 43 32 0a 23 65 6e 64 69 66 0a  M_MAGIC2.#endif.
2dc0: 7d 3b 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  };..#ifndef NDEB
2dd0: 55 47 0a 23 64 65 66 69 6e 65 20 77 69 6e 4d 65  UG.#define winMe
2de0: 6d 41 73 73 65 72 74 4d 61 67 69 63 31 28 29 20  mAssertMagic1() 
2df0: 61 73 73 65 72 74 28 20 77 69 6e 5f 6d 65 6d 5f  assert( win_mem_
2e00: 64 61 74 61 2e 6d 61 67 69 63 31 3d 3d 57 49 4e  data.magic1==WIN
2e10: 4d 45 4d 5f 4d 41 47 49 43 31 20 29 0a 23 64 65  MEM_MAGIC1 ).#de
2e20: 66 69 6e 65 20 77 69 6e 4d 65 6d 41 73 73 65 72  fine winMemAsser
2e30: 74 4d 61 67 69 63 32 28 29 20 61 73 73 65 72 74  tMagic2() assert
2e40: 28 20 77 69 6e 5f 6d 65 6d 5f 64 61 74 61 2e 6d  ( win_mem_data.m
2e50: 61 67 69 63 32 3d 3d 57 49 4e 4d 45 4d 5f 4d 41  agic2==WINMEM_MA
2e60: 47 49 43 32 20 29 0a 23 64 65 66 69 6e 65 20 77  GIC2 ).#define w
2e70: 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63  inMemAssertMagic
2e80: 28 29 20 20 77 69 6e 4d 65 6d 41 73 73 65 72 74  ()  winMemAssert
2e90: 4d 61 67 69 63 31 28 29 3b 20 77 69 6e 4d 65 6d  Magic1(); winMem
2ea0: 41 73 73 65 72 74 4d 61 67 69 63 32 28 29 3b 0a  AssertMagic2();.
2eb0: 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 77 69  #else.#define wi
2ec0: 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63 28  nMemAssertMagic(
2ed0: 29 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ).#endif..#defin
2ee0: 65 20 77 69 6e 4d 65 6d 47 65 74 44 61 74 61 50  e winMemGetDataP
2ef0: 74 72 28 29 20 20 26 77 69 6e 5f 6d 65 6d 5f 64  tr()  &win_mem_d
2f00: 61 74 61 0a 23 64 65 66 69 6e 65 20 77 69 6e 4d  ata.#define winM
2f10: 65 6d 47 65 74 48 65 61 70 28 29 20 20 20 20 20  emGetHeap()     
2f20: 77 69 6e 5f 6d 65 6d 5f 64 61 74 61 2e 68 48 65  win_mem_data.hHe
2f30: 61 70 0a 23 64 65 66 69 6e 65 20 77 69 6e 4d 65  ap.#define winMe
2f40: 6d 47 65 74 4f 77 6e 65 64 28 29 20 20 20 20 77  mGetOwned()    w
2f50: 69 6e 5f 6d 65 6d 5f 64 61 74 61 2e 62 4f 77 6e  in_mem_data.bOwn
2f60: 65 64 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ed..static void 
2f70: 2a 77 69 6e 4d 65 6d 4d 61 6c 6c 6f 63 28 69 6e  *winMemMalloc(in
2f80: 74 20 6e 42 79 74 65 73 29 3b 0a 73 74 61 74 69  t nBytes);.stati
2f90: 63 20 76 6f 69 64 20 77 69 6e 4d 65 6d 46 72 65  c void winMemFre
2fa0: 65 28 76 6f 69 64 20 2a 70 50 72 69 6f 72 29 3b  e(void *pPrior);
2fb0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 77 69  .static void *wi
2fc0: 6e 4d 65 6d 52 65 61 6c 6c 6f 63 28 76 6f 69 64  nMemRealloc(void
2fd0: 20 2a 70 50 72 69 6f 72 2c 20 69 6e 74 20 6e 42   *pPrior, int nB
2fe0: 79 74 65 73 29 3b 0a 73 74 61 74 69 63 20 69 6e  ytes);.static in
2ff0: 74 20 77 69 6e 4d 65 6d 53 69 7a 65 28 76 6f 69  t winMemSize(voi
3000: 64 20 2a 70 29 3b 0a 73 74 61 74 69 63 20 69 6e  d *p);.static in
3010: 74 20 77 69 6e 4d 65 6d 52 6f 75 6e 64 75 70 28  t winMemRoundup(
3020: 69 6e 74 20 6e 29 3b 0a 73 74 61 74 69 63 20 69  int n);.static i
3030: 6e 74 20 77 69 6e 4d 65 6d 49 6e 69 74 28 76 6f  nt winMemInit(vo
3040: 69 64 20 2a 70 41 70 70 44 61 74 61 29 3b 0a 73  id *pAppData);.s
3050: 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 4d 65  tatic void winMe
3060: 6d 53 68 75 74 64 6f 77 6e 28 76 6f 69 64 20 2a  mShutdown(void *
3070: 70 41 70 70 44 61 74 61 29 3b 0a 0a 63 6f 6e 73  pAppData);..cons
3080: 74 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65  t sqlite3_mem_me
3090: 74 68 6f 64 73 20 2a 73 71 6c 69 74 65 33 4d 65  thods *sqlite3Me
30a0: 6d 47 65 74 57 69 6e 33 32 28 76 6f 69 64 29 3b  mGetWin32(void);
30b0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
30c0: 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 20 2a  E_WIN32_MALLOC *
30d0: 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  /../*.** The fol
30e0: 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 20  lowing variable 
30f0: 69 73 20 28 6e 6f 72 6d 61 6c 6c 79 29 20 73 65  is (normally) se
3100: 74 20 6f 6e 63 65 20 61 6e 64 20 6e 65 76 65 72  t once and never
3110: 20 63 68 61 6e 67 65 73 0a 2a 2a 20 74 68 65 72   changes.** ther
3120: 65 61 66 74 65 72 2e 20 20 49 74 20 72 65 63 6f  eafter.  It reco
3130: 72 64 73 20 77 68 65 74 68 65 72 20 74 68 65 20  rds whether the 
3140: 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
3150: 20 69 73 20 57 69 6e 39 78 0a 2a 2a 20 6f 72 20   is Win9x.** or 
3160: 57 69 6e 4e 54 2e 0a 2a 2a 0a 2a 2a 20 30 3a 20  WinNT..**.** 0: 
3170: 20 20 4f 70 65 72 61 74 69 6e 67 20 73 79 73 74    Operating syst
3180: 65 6d 20 75 6e 6b 6e 6f 77 6e 2e 0a 2a 2a 20 31  em unknown..** 1
3190: 3a 20 20 20 4f 70 65 72 61 74 69 6e 67 20 73 79  :   Operating sy
31a0: 73 74 65 6d 20 69 73 20 57 69 6e 39 78 2e 0a 2a  stem is Win9x..*
31b0: 2a 20 32 3a 20 20 20 4f 70 65 72 61 74 69 6e 67  * 2:   Operating
31c0: 20 73 79 73 74 65 6d 20 69 73 20 57 69 6e 4e 54   system is WinNT
31d0: 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65 72  ..**.** In order
31e0: 20 74 6f 20 66 61 63 69 6c 69 74 61 74 65 20 74   to facilitate t
31f0: 65 73 74 69 6e 67 20 6f 6e 20 61 20 57 69 6e 4e  esting on a WinN
3200: 54 20 73 79 73 74 65 6d 2c 20 74 68 65 20 74 65  T system, the te
3210: 73 74 20 66 69 78 74 75 72 65 0a 2a 2a 20 63 61  st fixture.** ca
3220: 6e 20 6d 61 6e 75 61 6c 6c 79 20 73 65 74 20 74  n manually set t
3230: 68 69 73 20 76 61 6c 75 65 20 74 6f 20 31 20 74  his value to 1 t
3240: 6f 20 65 6d 75 6c 61 74 65 20 57 69 6e 39 38 20  o emulate Win98 
3250: 62 65 68 61 76 69 6f 72 2e 0a 2a 2f 0a 23 69 66  behavior..*/.#if
3260: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
3270: 4c 4f 4e 47 20 76 6f 6c 61 74 69 6c 65 20 73 71  LONG volatile sq
3280: 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 20 3d 20  lite3_os_type = 
3290: 30 3b 0a 23 65 6c 73 65 0a 73 74 61 74 69 63 20  0;.#else.static 
32a0: 4c 4f 4e 47 20 76 6f 6c 61 74 69 6c 65 20 73 71  LONG volatile sq
32b0: 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 20 3d 20  lite3_os_type = 
32c0: 30 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  0;.#endif..#ifnd
32d0: 65 66 20 53 59 53 43 41 4c 4c 0a 23 20 20 64 65  ef SYSCALL.#  de
32e0: 66 69 6e 65 20 53 59 53 43 41 4c 4c 20 73 71 6c  fine SYSCALL sql
32f0: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
3300: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
3310: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
3320: 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e  not available on
3330: 20 57 69 6e 64 6f 77 73 20 43 45 20 6f 72 20 57   Windows CE or W
3340: 69 6e 52 54 2e 0a 20 2a 2f 0a 0a 23 69 66 20 53  inRT.. */..#if S
3350: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c  QLITE_OS_WINCE |
3360: 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  | SQLITE_OS_WINR
3370: 54 0a 23 20 20 64 65 66 69 6e 65 20 6f 73 41 72  T.#  define osAr
3380: 65 46 69 6c 65 41 70 69 73 41 4e 53 49 28 29 20  eFileApisANSI() 
3390: 20 20 20 20 20 20 31 0a 23 65 6e 64 69 66 0a 0a        1.#endif..
33a0: 2f 2a 0a 2a 2a 20 4d 61 6e 79 20 73 79 73 74 65  /*.** Many syste
33b0: 6d 20 63 61 6c 6c 73 20 61 72 65 20 61 63 63 65  m calls are acce
33c0: 73 73 65 64 20 74 68 72 6f 75 67 68 20 70 6f 69  ssed through poi
33d0: 6e 74 65 72 2d 74 6f 2d 66 75 6e 63 74 69 6f 6e  nter-to-function
33e0: 73 20 73 6f 20 74 68 61 74 0a 2a 2a 20 74 68 65  s so that.** the
33f0: 79 20 6d 61 79 20 62 65 20 6f 76 65 72 72 69 64  y may be overrid
3400: 64 65 6e 20 61 74 20 72 75 6e 74 69 6d 65 20 74  den at runtime t
3410: 6f 20 66 61 63 69 6c 69 74 61 74 65 20 66 61 75  o facilitate fau
3420: 6c 74 20 69 6e 6a 65 63 74 69 6f 6e 20 64 75 72  lt injection dur
3430: 69 6e 67 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61  ing.** testing a
3440: 6e 64 20 73 61 6e 64 62 6f 78 69 6e 67 2e 20 20  nd sandboxing.  
3450: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72  The following ar
3460: 72 61 79 20 68 6f 6c 64 73 20 74 68 65 20 6e 61  ray holds the na
3470: 6d 65 73 20 61 6e 64 20 70 6f 69 6e 74 65 72 73  mes and pointers
3480: 0a 2a 2a 20 74 6f 20 61 6c 6c 20 6f 76 65 72 72  .** to all overr
3490: 69 64 65 61 62 6c 65 20 73 79 73 74 65 6d 20 63  ideable system c
34a0: 61 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  alls..*/.static 
34b0: 73 74 72 75 63 74 20 77 69 6e 5f 73 79 73 63 61  struct win_sysca
34c0: 6c 6c 20 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ll {.  const cha
34d0: 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20  r *zName;       
34e0: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
34f0: 74 68 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  the system call 
3500: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73  */.  sqlite3_sys
3510: 63 61 6c 6c 5f 70 74 72 20 70 43 75 72 72 65 6e  call_ptr pCurren
3520: 74 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20 76 61  t; /* Current va
3530: 6c 75 65 20 6f 66 20 74 68 65 20 73 79 73 74 65  lue of the syste
3540: 6d 20 63 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69  m call */.  sqli
3550: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20  te3_syscall_ptr 
3560: 70 44 65 66 61 75 6c 74 3b 20 2f 2a 20 44 65 66  pDefault; /* Def
3570: 61 75 6c 74 20 76 61 6c 75 65 20 2a 2f 0a 7d 20  ault value */.} 
3580: 61 53 79 73 63 61 6c 6c 5b 5d 20 3d 20 7b 0a 23  aSyscall[] = {.#
3590: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
35a0: 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f  NCE && !SQLITE_O
35b0: 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 41 72 65  S_WINRT.  { "Are
35c0: 46 69 6c 65 41 70 69 73 41 4e 53 49 22 2c 20 20  FileApisANSI",  
35d0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
35e0: 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49 2c  AreFileApisANSI,
35f0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
3600: 6c 73 65 0a 20 20 7b 20 22 41 72 65 46 69 6c 65  lse.  { "AreFile
3610: 41 70 69 73 41 4e 53 49 22 2c 20 20 20 20 20 20  ApisANSI",      
3620: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
3630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3640: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
3650: 0a 0a 23 69 66 6e 64 65 66 20 6f 73 41 72 65 46  ..#ifndef osAreF
3660: 69 6c 65 41 70 69 73 41 4e 53 49 0a 23 64 65 66  ileApisANSI.#def
3670: 69 6e 65 20 6f 73 41 72 65 46 69 6c 65 41 70 69  ine osAreFileApi
3680: 73 41 4e 53 49 20 28 28 42 4f 4f 4c 28 57 49 4e  sANSI ((BOOL(WIN
3690: 41 50 49 2a 29 28 56 4f 49 44 29 29 61 53 79 73  API*)(VOID))aSys
36a0: 63 61 6c 6c 5b 30 5d 2e 70 43 75 72 72 65 6e 74  call[0].pCurrent
36b0: 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51  ).#endif..#if SQ
36c0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26  LITE_OS_WINCE &&
36d0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
36e0: 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a  WIN32_HAS_WIDE).
36f0: 20 20 7b 20 22 43 68 61 72 4c 6f 77 65 72 57 22    { "CharLowerW"
3700: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ,              (
3710: 53 59 53 43 41 4c 4c 29 43 68 61 72 4c 6f 77 65  SYSCALL)CharLowe
3720: 72 57 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rW,             
3730: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
3740: 22 43 68 61 72 4c 6f 77 65 72 57 22 2c 20 20 20  "CharLowerW",   
3750: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
3760: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
3770: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
3780: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
3790: 65 20 6f 73 43 68 61 72 4c 6f 77 65 72 57 20 28  e osCharLowerW (
37a0: 28 4c 50 57 53 54 52 28 57 49 4e 41 50 49 2a 29  (LPWSTR(WINAPI*)
37b0: 28 4c 50 57 53 54 52 29 29 61 53 79 73 63 61 6c  (LPWSTR))aSyscal
37c0: 6c 5b 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  l[1].pCurrent)..
37d0: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
37e0: 4e 43 45 20 26 26 20 64 65 66 69 6e 65 64 28 53  NCE && defined(S
37f0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
3800: 57 49 44 45 29 0a 20 20 7b 20 22 43 68 61 72 55  WIDE).  { "CharU
3810: 70 70 65 72 57 22 2c 20 20 20 20 20 20 20 20 20  pperW",         
3820: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 68       (SYSCALL)Ch
3830: 61 72 55 70 70 65 72 57 2c 20 20 20 20 20 20 20  arUpperW,       
3840: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
3850: 65 0a 20 20 7b 20 22 43 68 61 72 55 70 70 65 72  e.  { "CharUpper
3860: 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  W",             
3870: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
3880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3890: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
38a0: 23 64 65 66 69 6e 65 20 6f 73 43 68 61 72 55 70  #define osCharUp
38b0: 70 65 72 57 20 28 28 4c 50 57 53 54 52 28 57 49  perW ((LPWSTR(WI
38c0: 4e 41 50 49 2a 29 28 4c 50 57 53 54 52 29 29 61  NAPI*)(LPWSTR))a
38d0: 53 79 73 63 61 6c 6c 5b 32 5d 2e 70 43 75 72 72  Syscall[2].pCurr
38e0: 65 6e 74 29 0a 0a 20 20 7b 20 22 43 6c 6f 73 65  ent)..  { "Close
38f0: 48 61 6e 64 6c 65 22 2c 20 20 20 20 20 20 20 20  Handle",        
3900: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 6c       (SYSCALL)Cl
3910: 6f 73 65 48 61 6e 64 6c 65 2c 20 20 20 20 20 20  oseHandle,      
3920: 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65         0 },..#de
3930: 66 69 6e 65 20 6f 73 43 6c 6f 73 65 48 61 6e 64  fine osCloseHand
3940: 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  le ((BOOL(WINAPI
3950: 2a 29 28 48 41 4e 44 4c 45 29 29 61 53 79 73 63  *)(HANDLE))aSysc
3960: 61 6c 6c 5b 33 5d 2e 70 43 75 72 72 65 6e 74 29  all[3].pCurrent)
3970: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
3980: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
3990: 4e 53 49 29 0a 20 20 7b 20 22 43 72 65 61 74 65  NSI).  { "Create
39a0: 46 69 6c 65 41 22 2c 20 20 20 20 20 20 20 20 20  FileA",         
39b0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72 65      (SYSCALL)Cre
39c0: 61 74 65 46 69 6c 65 41 2c 20 20 20 20 20 20 20  ateFileA,       
39d0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
39e0: 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65  .  { "CreateFile
39f0: 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  A",             
3a00: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
3a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a20: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
3a30: 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65 46  define osCreateF
3a40: 69 6c 65 41 20 28 28 48 41 4e 44 4c 45 28 57 49  ileA ((HANDLE(WI
3a50: 4e 41 50 49 2a 29 28 4c 50 43 53 54 52 2c 44 57  NAPI*)(LPCSTR,DW
3a60: 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20  ORD,DWORD, \.   
3a70: 20 20 20 20 20 4c 50 53 45 43 55 52 49 54 59 5f       LPSECURITY_
3a80: 41 54 54 52 49 42 55 54 45 53 2c 44 57 4f 52 44  ATTRIBUTES,DWORD
3a90: 2c 44 57 4f 52 44 2c 48 41 4e 44 4c 45 29 29 61  ,DWORD,HANDLE))a
3aa0: 53 79 73 63 61 6c 6c 5b 34 5d 2e 70 43 75 72 72  Syscall[4].pCurr
3ab0: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
3ac0: 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65  E_OS_WINRT && de
3ad0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
3ae0: 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b  32_HAS_WIDE).  {
3af0: 20 22 43 72 65 61 74 65 46 69 6c 65 57 22 2c 20   "CreateFileW", 
3b00: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
3b10: 43 41 4c 4c 29 43 72 65 61 74 65 46 69 6c 65 57  CALL)CreateFileW
3b20: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20  ,             0 
3b30: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72  },.#else.  { "Cr
3b40: 65 61 74 65 46 69 6c 65 57 22 2c 20 20 20 20 20  eateFileW",     
3b50: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
3b60: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
3b70: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
3b80: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
3b90: 73 43 72 65 61 74 65 46 69 6c 65 57 20 28 28 48  sCreateFileW ((H
3ba0: 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c  ANDLE(WINAPI*)(L
3bb0: 50 43 57 53 54 52 2c 44 57 4f 52 44 2c 44 57 4f  PCWSTR,DWORD,DWO
3bc0: 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  RD, \.        LP
3bd0: 53 45 43 55 52 49 54 59 5f 41 54 54 52 49 42 55  SECURITY_ATTRIBU
3be0: 54 45 53 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c  TES,DWORD,DWORD,
3bf0: 48 41 4e 44 4c 45 29 29 61 53 79 73 63 61 6c 6c  HANDLE))aSyscall
3c00: 5b 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  [5].pCurrent)..#
3c10: 69 66 20 28 21 53 51 4c 49 54 45 5f 4f 53 5f 57  if (!SQLITE_OS_W
3c20: 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28  INRT && defined(
3c30: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
3c40: 5f 41 4e 53 49 29 20 26 26 20 5c 0a 20 20 20 20  _ANSI) && \.    
3c50: 20 20 20 20 21 64 65 66 69 6e 65 64 28 53 51 4c      !defined(SQL
3c60: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 29 0a 20  ITE_OMIT_WAL)). 
3c70: 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65 4d 61   { "CreateFileMa
3c80: 70 70 69 6e 67 41 22 2c 20 20 20 20 20 20 28 53  ppingA",      (S
3c90: 59 53 43 41 4c 4c 29 43 72 65 61 74 65 46 69 6c  YSCALL)CreateFil
3ca0: 65 4d 61 70 70 69 6e 67 41 2c 20 20 20 20 20 20  eMappingA,      
3cb0: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
3cc0: 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e  CreateFileMappin
3cd0: 67 41 22 2c 20 20 20 20 20 20 28 53 59 53 43 41  gA",      (SYSCA
3ce0: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
3cf0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
3d00: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
3d10: 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70   osCreateFileMap
3d20: 70 69 6e 67 41 20 28 28 48 41 4e 44 4c 45 28 57  pingA ((HANDLE(W
3d30: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c  INAPI*)(HANDLE,L
3d40: 50 53 45 43 55 52 49 54 59 5f 41 54 54 52 49 42  PSECURITY_ATTRIB
3d50: 55 54 45 53 2c 20 5c 0a 20 20 20 20 20 20 20 20  UTES, \.        
3d60: 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52  DWORD,DWORD,DWOR
3d70: 44 2c 4c 50 43 53 54 52 29 29 61 53 79 73 63 61  D,LPCSTR))aSysca
3d80: 6c 6c 5b 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[6].pCurrent).
3d90: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
3da0: 49 4e 43 45 20 7c 7c 20 28 21 53 51 4c 49 54 45  INCE || (!SQLITE
3db0: 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66  _OS_WINRT && def
3dc0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
3dd0: 32 5f 48 41 53 5f 57 49 44 45 29 20 26 26 20 5c  2_HAS_WIDE) && \
3de0: 0a 20 20 20 20 20 20 20 20 21 64 65 66 69 6e 65  .        !define
3df0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  d(SQLITE_OMIT_WA
3e00: 4c 29 29 0a 20 20 7b 20 22 43 72 65 61 74 65 46  L)).  { "CreateF
3e10: 69 6c 65 4d 61 70 70 69 6e 67 57 22 2c 20 20 20  ileMappingW",   
3e20: 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72 65 61     (SYSCALL)Crea
3e30: 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 2c 20  teFileMappingW, 
3e40: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
3e50: 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65 4d    { "CreateFileM
3e60: 61 70 70 69 6e 67 57 22 2c 20 20 20 20 20 20 28  appingW",      (
3e70: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
3e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e90: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
3ea0: 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65 46 69  efine osCreateFi
3eb0: 6c 65 4d 61 70 70 69 6e 67 57 20 28 28 48 41 4e  leMappingW ((HAN
3ec0: 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  DLE(WINAPI*)(HAN
3ed0: 44 4c 45 2c 4c 50 53 45 43 55 52 49 54 59 5f 41  DLE,LPSECURITY_A
3ee0: 54 54 52 49 42 55 54 45 53 2c 20 5c 0a 20 20 20  TTRIBUTES, \.   
3ef0: 20 20 20 20 20 44 57 4f 52 44 2c 44 57 4f 52 44       DWORD,DWORD
3f00: 2c 44 57 4f 52 44 2c 4c 50 43 57 53 54 52 29 29  ,DWORD,LPCWSTR))
3f10: 61 53 79 73 63 61 6c 6c 5b 37 5d 2e 70 43 75 72  aSyscall[7].pCur
3f20: 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49  rent)..#if !SQLI
3f30: 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64  TE_OS_WINRT && d
3f40: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
3f50: 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20  N32_HAS_WIDE).  
3f60: 7b 20 22 43 72 65 61 74 65 4d 75 74 65 78 57 22  { "CreateMutexW"
3f70: 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ,            (SY
3f80: 53 43 41 4c 4c 29 43 72 65 61 74 65 4d 75 74 65  SCALL)CreateMute
3f90: 78 57 2c 20 20 20 20 20 20 20 20 20 20 20 20 30  xW,            0
3fa0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43   },.#else.  { "C
3fb0: 72 65 61 74 65 4d 75 74 65 78 57 22 2c 20 20 20  reateMutexW",   
3fc0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
3fd0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
3fe0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
3ff0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
4000: 6f 73 43 72 65 61 74 65 4d 75 74 65 78 57 20 28  osCreateMutexW (
4010: 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29  (HANDLE(WINAPI*)
4020: 28 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54 52  (LPSECURITY_ATTR
4030: 49 42 55 54 45 53 2c 42 4f 4f 4c 2c 20 5c 0a 20  IBUTES,BOOL, \. 
4040: 20 20 20 20 20 20 20 4c 50 43 57 53 54 52 29 29         LPCWSTR))
4050: 61 53 79 73 63 61 6c 6c 5b 38 5d 2e 70 43 75 72  aSyscall[8].pCur
4060: 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e  rent)..#if defin
4070: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
4080: 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 44  HAS_ANSI).  { "D
4090: 65 6c 65 74 65 46 69 6c 65 41 22 2c 20 20 20 20  eleteFileA",    
40a0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
40b0: 4c 29 44 65 6c 65 74 65 46 69 6c 65 41 2c 20 20  L)DeleteFileA,  
40c0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
40d0: 23 65 6c 73 65 0a 20 20 7b 20 22 44 65 6c 65 74  #else.  { "Delet
40e0: 65 46 69 6c 65 41 22 2c 20 20 20 20 20 20 20 20  eFileA",        
40f0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
4100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4110: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
4120: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 44 65  if..#define osDe
4130: 6c 65 74 65 46 69 6c 65 41 20 28 28 42 4f 4f 4c  leteFileA ((BOOL
4140: 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 53 54 52  (WINAPI*)(LPCSTR
4150: 29 29 61 53 79 73 63 61 6c 6c 5b 39 5d 2e 70 43  ))aSyscall[9].pC
4160: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66  urrent)..#if def
4170: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
4180: 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20  2_HAS_WIDE).  { 
4190: 22 44 65 6c 65 74 65 46 69 6c 65 57 22 2c 20 20  "DeleteFileW",  
41a0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
41b0: 41 4c 4c 29 44 65 6c 65 74 65 46 69 6c 65 57 2c  ALL)DeleteFileW,
41c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
41d0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 44 65 6c  ,.#else.  { "Del
41e0: 65 74 65 46 69 6c 65 57 22 2c 20 20 20 20 20 20  eteFileW",      
41f0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
4200: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
4210: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
4220: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
4230: 44 65 6c 65 74 65 46 69 6c 65 57 20 28 28 42 4f  DeleteFileW ((BO
4240: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57  OL(WINAPI*)(LPCW
4250: 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 31 30  STR))aSyscall[10
4260: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
4270: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
4280: 0a 20 20 7b 20 22 46 69 6c 65 54 69 6d 65 54 6f  .  { "FileTimeTo
4290: 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65 22 2c 20  LocalFileTime", 
42a0: 28 53 59 53 43 41 4c 4c 29 46 69 6c 65 54 69 6d  (SYSCALL)FileTim
42b0: 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65  eToLocalFileTime
42c0: 2c 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b  , 0 },.#else.  {
42d0: 20 22 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63 61   "FileTimeToLoca
42e0: 6c 46 69 6c 65 54 69 6d 65 22 2c 20 28 53 59 53  lFileTime", (SYS
42f0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
4300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
4310: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
4320: 6e 65 20 6f 73 46 69 6c 65 54 69 6d 65 54 6f 4c  ne osFileTimeToL
4330: 6f 63 61 6c 46 69 6c 65 54 69 6d 65 20 28 28 42  ocalFileTime ((B
4340: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 43 4f 4e  OOL(WINAPI*)(CON
4350: 53 54 20 46 49 4c 45 54 49 4d 45 2a 2c 20 5c 0a  ST FILETIME*, \.
4360: 20 20 20 20 20 20 20 20 4c 50 46 49 4c 45 54 49          LPFILETI
4370: 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b 31 31 5d  ME))aSyscall[11]
4380: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
4390: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
43a0: 20 20 7b 20 22 46 69 6c 65 54 69 6d 65 54 6f 53    { "FileTimeToS
43b0: 79 73 74 65 6d 54 69 6d 65 22 2c 20 20 20 20 28  ystemTime",    (
43c0: 53 59 53 43 41 4c 4c 29 46 69 6c 65 54 69 6d 65  SYSCALL)FileTime
43d0: 54 6f 53 79 73 74 65 6d 54 69 6d 65 2c 20 20 20  ToSystemTime,   
43e0: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
43f0: 22 46 69 6c 65 54 69 6d 65 54 6f 53 79 73 74 65  "FileTimeToSyste
4400: 6d 54 69 6d 65 22 2c 20 20 20 20 28 53 59 53 43  mTime",    (SYSC
4410: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
4420: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
4430: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
4440: 65 20 6f 73 46 69 6c 65 54 69 6d 65 54 6f 53 79  e osFileTimeToSy
4450: 73 74 65 6d 54 69 6d 65 20 28 28 42 4f 4f 4c 28  stemTime ((BOOL(
4460: 57 49 4e 41 50 49 2a 29 28 43 4f 4e 53 54 20 46  WINAPI*)(CONST F
4470: 49 4c 45 54 49 4d 45 2a 2c 20 5c 0a 20 20 20 20  ILETIME*, \.    
4480: 20 20 20 20 4c 50 53 59 53 54 45 4d 54 49 4d 45      LPSYSTEMTIME
4490: 29 29 61 53 79 73 63 61 6c 6c 5b 31 32 5d 2e 70  ))aSyscall[12].p
44a0: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 46  Current)..  { "F
44b0: 6c 75 73 68 46 69 6c 65 42 75 66 66 65 72 73 22  lushFileBuffers"
44c0: 2c 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c  ,        (SYSCAL
44d0: 4c 29 46 6c 75 73 68 46 69 6c 65 42 75 66 66 65  L)FlushFileBuffe
44e0: 72 73 2c 20 20 20 20 20 20 20 20 30 20 7d 2c 0a  rs,        0 },.
44f0: 0a 23 64 65 66 69 6e 65 20 6f 73 46 6c 75 73 68  .#define osFlush
4500: 46 69 6c 65 42 75 66 66 65 72 73 20 28 28 42 4f  FileBuffers ((BO
4510: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44  OL(WINAPI*)(HAND
4520: 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 31 33 5d  LE))aSyscall[13]
4530: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
4540: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
4550: 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20  IN32_HAS_ANSI). 
4560: 20 7b 20 22 46 6f 72 6d 61 74 4d 65 73 73 61 67   { "FormatMessag
4570: 65 41 22 2c 20 20 20 20 20 20 20 20 20 20 28 53  eA",          (S
4580: 59 53 43 41 4c 4c 29 46 6f 72 6d 61 74 4d 65 73  YSCALL)FormatMes
4590: 73 61 67 65 41 2c 20 20 20 20 20 20 20 20 20 20  sageA,          
45a0: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
45b0: 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 41 22 2c  FormatMessageA",
45c0: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
45d0: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
45e0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
45f0: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
4600: 20 6f 73 46 6f 72 6d 61 74 4d 65 73 73 61 67 65   osFormatMessage
4610: 41 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49  A ((DWORD(WINAPI
4620: 2a 29 28 44 57 4f 52 44 2c 4c 50 43 56 4f 49 44  *)(DWORD,LPCVOID
4630: 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 4c 50 53  ,DWORD,DWORD,LPS
4640: 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57  TR, \.        DW
4650: 4f 52 44 2c 76 61 5f 6c 69 73 74 2a 29 29 61 53  ORD,va_list*))aS
4660: 79 73 63 61 6c 6c 5b 31 34 5d 2e 70 43 75 72 72  yscall[14].pCurr
4670: 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65  ent)..#if define
4680: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
4690: 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 46 6f  AS_WIDE).  { "Fo
46a0: 72 6d 61 74 4d 65 73 73 61 67 65 57 22 2c 20 20  rmatMessageW",  
46b0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
46c0: 29 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 57 2c  )FormatMessageW,
46d0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
46e0: 65 6c 73 65 0a 20 20 7b 20 22 46 6f 72 6d 61 74  else.  { "Format
46f0: 4d 65 73 73 61 67 65 57 22 2c 20 20 20 20 20 20  MessageW",      
4700: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
4710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4720: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
4730: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46 6f 72  f..#define osFor
4740: 6d 61 74 4d 65 73 73 61 67 65 57 20 28 28 44 57  matMessageW ((DW
4750: 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 44 57 4f  ORD(WINAPI*)(DWO
4760: 52 44 2c 4c 50 43 56 4f 49 44 2c 44 57 4f 52 44  RD,LPCVOID,DWORD
4770: 2c 44 57 4f 52 44 2c 4c 50 57 53 54 52 2c 20 5c  ,DWORD,LPWSTR, \
4780: 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44 2c 76  .        DWORD,v
4790: 61 5f 6c 69 73 74 2a 29 29 61 53 79 73 63 61 6c  a_list*))aSyscal
47a0: 6c 5b 31 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[15].pCurrent).
47b0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
47c0: 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45  LITE_OMIT_LOAD_E
47d0: 58 54 45 4e 53 49 4f 4e 29 0a 20 20 7b 20 22 46  XTENSION).  { "F
47e0: 72 65 65 4c 69 62 72 61 72 79 22 2c 20 20 20 20  reeLibrary",    
47f0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
4800: 4c 29 46 72 65 65 4c 69 62 72 61 72 79 2c 20 20  L)FreeLibrary,  
4810: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
4820: 23 65 6c 73 65 0a 20 20 7b 20 22 46 72 65 65 4c  #else.  { "FreeL
4830: 69 62 72 61 72 79 22 2c 20 20 20 20 20 20 20 20  ibrary",        
4840: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
4850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4860: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
4870: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46 72  if..#define osFr
4880: 65 65 4c 69 62 72 61 72 79 20 28 28 42 4f 4f 4c  eeLibrary ((BOOL
4890: 28 57 49 4e 41 50 49 2a 29 28 48 4d 4f 44 55 4c  (WINAPI*)(HMODUL
48a0: 45 29 29 61 53 79 73 63 61 6c 6c 5b 31 36 5d 2e  E))aSyscall[16].
48b0: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
48c0: 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
48d0: 73 49 64 22 2c 20 20 20 20 20 28 53 59 53 43 41  sId",     (SYSCA
48e0: 4c 4c 29 47 65 74 43 75 72 72 65 6e 74 50 72 6f  LL)GetCurrentPro
48f0: 63 65 73 73 49 64 2c 20 20 20 20 20 30 20 7d 2c  cessId,     0 },
4900: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 43  ..#define osGetC
4910: 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 20  urrentProcessId 
4920: 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29  ((DWORD(WINAPI*)
4930: 28 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b  (VOID))aSyscall[
4940: 31 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  17].pCurrent)..#
4950: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
4960: 4e 43 45 20 26 26 20 64 65 66 69 6e 65 64 28 53  NCE && defined(S
4970: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
4980: 41 4e 53 49 29 0a 20 20 7b 20 22 47 65 74 44 69  ANSI).  { "GetDi
4990: 73 6b 46 72 65 65 53 70 61 63 65 41 22 2c 20 20  skFreeSpaceA",  
49a0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65       (SYSCALL)Ge
49b0: 74 44 69 73 6b 46 72 65 65 53 70 61 63 65 41 2c  tDiskFreeSpaceA,
49c0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
49d0: 65 0a 20 20 7b 20 22 47 65 74 44 69 73 6b 46 72  e.  { "GetDiskFr
49e0: 65 65 53 70 61 63 65 41 22 2c 20 20 20 20 20 20  eeSpaceA",      
49f0: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
4a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a10: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
4a20: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 44 69 73  #define osGetDis
4a30: 6b 46 72 65 65 53 70 61 63 65 41 20 28 28 42 4f  kFreeSpaceA ((BO
4a40: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 53  OL(WINAPI*)(LPCS
4a50: 54 52 2c 4c 50 44 57 4f 52 44 2c 4c 50 44 57 4f  TR,LPDWORD,LPDWO
4a60: 52 44 2c 4c 50 44 57 4f 52 44 2c 20 5c 0a 20 20  RD,LPDWORD, \.  
4a70: 20 20 20 20 20 20 4c 50 44 57 4f 52 44 29 29 61        LPDWORD))a
4a80: 53 79 73 63 61 6c 6c 5b 31 38 5d 2e 70 43 75 72  Syscall[18].pCur
4a90: 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49  rent)..#if !SQLI
4aa0: 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21  TE_OS_WINCE && !
4ab0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20  SQLITE_OS_WINRT 
4ac0: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
4ad0: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45  E_WIN32_HAS_WIDE
4ae0: 29 0a 20 20 7b 20 22 47 65 74 44 69 73 6b 46 72  ).  { "GetDiskFr
4af0: 65 65 53 70 61 63 65 57 22 2c 20 20 20 20 20 20  eeSpaceW",      
4b00: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 44 69 73   (SYSCALL)GetDis
4b10: 6b 46 72 65 65 53 70 61 63 65 57 2c 20 20 20 20  kFreeSpaceW,    
4b20: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
4b30: 7b 20 22 47 65 74 44 69 73 6b 46 72 65 65 53 70  { "GetDiskFreeSp
4b40: 61 63 65 57 22 2c 20 20 20 20 20 20 20 28 53 59  aceW",       (SY
4b50: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
4b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
4b70: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
4b80: 69 6e 65 20 6f 73 47 65 74 44 69 73 6b 46 72 65  ine osGetDiskFre
4b90: 65 53 70 61 63 65 57 20 28 28 42 4f 4f 4c 28 57  eSpaceW ((BOOL(W
4ba0: 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52 2c  INAPI*)(LPCWSTR,
4bb0: 4c 50 44 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c  LPDWORD,LPDWORD,
4bc0: 4c 50 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20  LPDWORD, \.     
4bd0: 20 20 20 4c 50 44 57 4f 52 44 29 29 61 53 79 73     LPDWORD))aSys
4be0: 63 61 6c 6c 5b 31 39 5d 2e 70 43 75 72 72 65 6e  call[19].pCurren
4bf0: 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  t)..#if defined(
4c00: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
4c10: 5f 41 4e 53 49 29 0a 20 20 7b 20 22 47 65 74 46  _ANSI).  { "GetF
4c20: 69 6c 65 41 74 74 72 69 62 75 74 65 73 41 22 2c  ileAttributesA",
4c30: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47        (SYSCALL)G
4c40: 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
4c50: 41 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c  A,      0 },.#el
4c60: 73 65 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 41  se.  { "GetFileA
4c70: 74 74 72 69 62 75 74 65 73 41 22 2c 20 20 20 20  ttributesA",    
4c80: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
4c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ca0: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
4cb0: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 46 69  .#define osGetFi
4cc0: 6c 65 41 74 74 72 69 62 75 74 65 73 41 20 28 28  leAttributesA ((
4cd0: 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 4c  DWORD(WINAPI*)(L
4ce0: 50 43 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b  PCSTR))aSyscall[
4cf0: 32 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  20].pCurrent)..#
4d00: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
4d10: 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53  NRT && defined(S
4d20: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
4d30: 57 49 44 45 29 0a 20 20 7b 20 22 47 65 74 46 69  WIDE).  { "GetFi
4d40: 6c 65 41 74 74 72 69 62 75 74 65 73 57 22 2c 20  leAttributesW", 
4d50: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65       (SYSCALL)Ge
4d60: 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 57  tFileAttributesW
4d70: 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73  ,      0 },.#els
4d80: 65 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 41 74  e.  { "GetFileAt
4d90: 74 72 69 62 75 74 65 73 57 22 2c 20 20 20 20 20  tributesW",     
4da0: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
4db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4dc0: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
4dd0: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 46 69 6c  #define osGetFil
4de0: 65 41 74 74 72 69 62 75 74 65 73 57 20 28 28 44  eAttributesW ((D
4df0: 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 4c 50  WORD(WINAPI*)(LP
4e00: 43 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b  CWSTR))aSyscall[
4e10: 32 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  21].pCurrent)..#
4e20: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
4e30: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45  E_WIN32_HAS_WIDE
4e40: 29 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 41 74  ).  { "GetFileAt
4e50: 74 72 69 62 75 74 65 73 45 78 57 22 2c 20 20 20  tributesExW",   
4e60: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 46 69 6c   (SYSCALL)GetFil
4e70: 65 41 74 74 72 69 62 75 74 65 73 45 78 57 2c 20  eAttributesExW, 
4e80: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
4e90: 7b 20 22 47 65 74 46 69 6c 65 41 74 74 72 69 62  { "GetFileAttrib
4ea0: 75 74 65 73 45 78 57 22 2c 20 20 20 20 28 53 59  utesExW",    (SY
4eb0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
4ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
4ed0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
4ee0: 69 6e 65 20 6f 73 47 65 74 46 69 6c 65 41 74 74  ine osGetFileAtt
4ef0: 72 69 62 75 74 65 73 45 78 57 20 28 28 42 4f 4f  ributesExW ((BOO
4f00: 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53  L(WINAPI*)(LPCWS
4f10: 54 52 2c 47 45 54 5f 46 49 4c 45 45 58 5f 49 4e  TR,GET_FILEEX_IN
4f20: 46 4f 5f 4c 45 56 45 4c 53 2c 20 5c 0a 20 20 20  FO_LEVELS, \.   
4f30: 20 20 20 20 20 4c 50 56 4f 49 44 29 29 61 53 79       LPVOID))aSy
4f40: 73 63 61 6c 6c 5b 32 32 5d 2e 70 43 75 72 72 65  scall[22].pCurre
4f50: 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  nt)..#if !SQLITE
4f60: 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 47  _OS_WINRT.  { "G
4f70: 65 74 46 69 6c 65 53 69 7a 65 22 2c 20 20 20 20  etFileSize",    
4f80: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
4f90: 4c 29 47 65 74 46 69 6c 65 53 69 7a 65 2c 20 20  L)GetFileSize,  
4fa0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
4fb0: 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46 69  #else.  { "GetFi
4fc0: 6c 65 53 69 7a 65 22 2c 20 20 20 20 20 20 20 20  leSize",        
4fd0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
4fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ff0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
5000: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65  if..#define osGe
5010: 74 46 69 6c 65 53 69 7a 65 20 28 28 44 57 4f 52  tFileSize ((DWOR
5020: 44 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  D(WINAPI*)(HANDL
5030: 45 2c 4c 50 44 57 4f 52 44 29 29 61 53 79 73 63  E,LPDWORD))aSysc
5040: 61 6c 6c 5b 32 33 5d 2e 70 43 75 72 72 65 6e 74  all[23].pCurrent
5050: 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  )..#if !SQLITE_O
5060: 53 5f 57 49 4e 43 45 20 26 26 20 64 65 66 69 6e  S_WINCE && defin
5070: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
5080: 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 47  HAS_ANSI).  { "G
5090: 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41 22  etFullPathNameA"
50a0: 2c 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c  ,        (SYSCAL
50b0: 4c 29 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d  L)GetFullPathNam
50c0: 65 41 2c 20 20 20 20 20 20 20 20 30 20 7d 2c 0a  eA,        0 },.
50d0: 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46 75  #else.  { "GetFu
50e0: 6c 6c 50 61 74 68 4e 61 6d 65 41 22 2c 20 20 20  llPathNameA",   
50f0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
5100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5110: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
5120: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65  if..#define osGe
5130: 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41 20 28  tFullPathNameA (
5140: 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28  (DWORD(WINAPI*)(
5150: 4c 50 43 53 54 52 2c 44 57 4f 52 44 2c 4c 50 53  LPCSTR,DWORD,LPS
5160: 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  TR, \.        LP
5170: 53 54 52 2a 29 29 61 53 79 73 63 61 6c 6c 5b 32  STR*))aSyscall[2
5180: 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  4].pCurrent)..#i
5190: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
51a0: 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53  CE && !SQLITE_OS
51b0: 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65  _WINRT && define
51c0: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
51d0: 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 47 65  AS_WIDE).  { "Ge
51e0: 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57 22 2c  tFullPathNameW",
51f0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
5200: 29 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65  )GetFullPathName
5210: 57 2c 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23  W,        0 },.#
5220: 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46 75 6c  else.  { "GetFul
5230: 6c 50 61 74 68 4e 61 6d 65 57 22 2c 20 20 20 20  lPathNameW",    
5240: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
5250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5260: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
5270: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  f..#define osGet
5280: 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57 20 28 28  FullPathNameW ((
5290: 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 4c  DWORD(WINAPI*)(L
52a0: 50 43 57 53 54 52 2c 44 57 4f 52 44 2c 4c 50 57  PCWSTR,DWORD,LPW
52b0: 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c  STR, \.        L
52c0: 50 57 53 54 52 2a 29 29 61 53 79 73 63 61 6c 6c  PWSTR*))aSyscall
52d0: 5b 32 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [25].pCurrent)..
52e0: 20 20 7b 20 22 47 65 74 4c 61 73 74 45 72 72 6f    { "GetLastErro
52f0: 72 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28  r",            (
5300: 53 59 53 43 41 4c 4c 29 47 65 74 4c 61 73 74 45  SYSCALL)GetLastE
5310: 72 72 6f 72 2c 20 20 20 20 20 20 20 20 20 20 20  rror,           
5320: 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f   0 },..#define o
5330: 73 47 65 74 4c 61 73 74 45 72 72 6f 72 20 28 28  sGetLastError ((
5340: 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 56  DWORD(WINAPI*)(V
5350: 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 32 36  OID))aSyscall[26
5360: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
5370: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
5380: 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e  _OMIT_LOAD_EXTEN
5390: 53 49 4f 4e 29 0a 23 69 66 20 53 51 4c 49 54 45  SION).#if SQLITE
53a0: 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 2f 2a 20 54  _OS_WINCE.  /* T
53b0: 68 65 20 47 65 74 50 72 6f 63 41 64 64 72 65 73  he GetProcAddres
53c0: 73 41 28 29 20 72 6f 75 74 69 6e 65 20 69 73 20  sA() routine is 
53d0: 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 6f  only available o
53e0: 6e 20 57 69 6e 64 6f 77 73 20 43 45 2e 20 2a 2f  n Windows CE. */
53f0: 0a 20 20 7b 20 22 47 65 74 50 72 6f 63 41 64 64  .  { "GetProcAdd
5400: 72 65 73 73 41 22 2c 20 20 20 20 20 20 20 20 20  ressA",         
5410: 28 53 59 53 43 41 4c 4c 29 47 65 74 50 72 6f 63  (SYSCALL)GetProc
5420: 41 64 64 72 65 73 73 41 2c 20 20 20 20 20 20 20  AddressA,       
5430: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 2f    0 },.#else.  /
5440: 2a 20 41 6c 6c 20 6f 74 68 65 72 20 57 69 6e 64  * All other Wind
5450: 6f 77 73 20 70 6c 61 74 66 6f 72 6d 73 20 65 78  ows platforms ex
5460: 70 65 63 74 20 47 65 74 50 72 6f 63 41 64 64 72  pect GetProcAddr
5470: 65 73 73 28 29 20 74 6f 20 74 61 6b 65 0a 20 20  ess() to take.  
5480: 2a 2a 20 61 6e 20 41 4e 53 49 20 73 74 72 69 6e  ** an ANSI strin
5490: 67 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20  g regardless of 
54a0: 74 68 65 20 5f 55 4e 49 43 4f 44 45 20 73 65 74  the _UNICODE set
54b0: 74 69 6e 67 20 2a 2f 0a 20 20 7b 20 22 47 65 74  ting */.  { "Get
54c0: 50 72 6f 63 41 64 64 72 65 73 73 41 22 2c 20 20  ProcAddressA",  
54d0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
54e0: 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 2c 20  GetProcAddress, 
54f0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
5500: 6e 64 69 66 0a 23 65 6c 73 65 0a 20 20 7b 20 22  ndif.#else.  { "
5510: 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 41 22  GetProcAddressA"
5520: 2c 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41  ,         (SYSCA
5530: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
5540: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
5550: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
5560: 20 6f 73 47 65 74 50 72 6f 63 41 64 64 72 65 73   osGetProcAddres
5570: 73 41 20 28 28 46 41 52 50 52 4f 43 28 57 49 4e  sA ((FARPROC(WIN
5580: 41 50 49 2a 29 28 48 4d 4f 44 55 4c 45 2c 20 5c  API*)(HMODULE, \
5590: 0a 20 20 20 20 20 20 20 20 4c 50 43 53 54 52 29  .        LPCSTR)
55a0: 29 61 53 79 73 63 61 6c 6c 5b 32 37 5d 2e 70 43  )aSyscall[27].pC
55b0: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
55c0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
55d0: 7b 20 22 47 65 74 53 79 73 74 65 6d 49 6e 66 6f  { "GetSystemInfo
55e0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ",           (SY
55f0: 53 43 41 4c 4c 29 47 65 74 53 79 73 74 65 6d 49  SCALL)GetSystemI
5600: 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20 30  nfo,           0
5610: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47   },.#else.  { "G
5620: 65 74 53 79 73 74 65 6d 49 6e 66 6f 22 2c 20 20  etSystemInfo",  
5630: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
5640: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
5650: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
5660: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
5670: 6f 73 47 65 74 53 79 73 74 65 6d 49 6e 66 6f 20  osGetSystemInfo 
5680: 28 28 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28  ((VOID(WINAPI*)(
5690: 4c 50 53 59 53 54 45 4d 5f 49 4e 46 4f 29 29 61  LPSYSTEM_INFO))a
56a0: 53 79 73 63 61 6c 6c 5b 32 38 5d 2e 70 43 75 72  Syscall[28].pCur
56b0: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 47 65 74 53  rent)..  { "GetS
56c0: 79 73 74 65 6d 54 69 6d 65 22 2c 20 20 20 20 20  ystemTime",     
56d0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47        (SYSCALL)G
56e0: 65 74 53 79 73 74 65 6d 54 69 6d 65 2c 20 20 20  etSystemTime,   
56f0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64          0 },..#d
5700: 65 66 69 6e 65 20 6f 73 47 65 74 53 79 73 74 65  efine osGetSyste
5710: 6d 54 69 6d 65 20 28 28 56 4f 49 44 28 57 49 4e  mTime ((VOID(WIN
5720: 41 50 49 2a 29 28 4c 50 53 59 53 54 45 4d 54 49  API*)(LPSYSTEMTI
5730: 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b 32 39 5d  ME))aSyscall[29]
5740: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
5750: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45  !SQLITE_OS_WINCE
5760: 0a 20 20 7b 20 22 47 65 74 53 79 73 74 65 6d 54  .  { "GetSystemT
5770: 69 6d 65 41 73 46 69 6c 65 54 69 6d 65 22 2c 20  imeAsFileTime", 
5780: 28 53 59 53 43 41 4c 4c 29 47 65 74 53 79 73 74  (SYSCALL)GetSyst
5790: 65 6d 54 69 6d 65 41 73 46 69 6c 65 54 69 6d 65  emTimeAsFileTime
57a0: 2c 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b  , 0 },.#else.  {
57b0: 20 22 47 65 74 53 79 73 74 65 6d 54 69 6d 65 41   "GetSystemTimeA
57c0: 73 46 69 6c 65 54 69 6d 65 22 2c 20 28 53 59 53  sFileTime", (SYS
57d0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
57e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
57f0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
5800: 6e 65 20 6f 73 47 65 74 53 79 73 74 65 6d 54 69  ne osGetSystemTi
5810: 6d 65 41 73 46 69 6c 65 54 69 6d 65 20 28 28 56  meAsFileTime ((V
5820: 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 20 5c 0a  OID(WINAPI*)( \.
5830: 20 20 20 20 20 20 20 20 4c 50 46 49 4c 45 54 49          LPFILETI
5840: 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b 33 30 5d  ME))aSyscall[30]
5850: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
5860: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
5870: 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20  IN32_HAS_ANSI). 
5880: 20 7b 20 22 47 65 74 54 65 6d 70 50 61 74 68 41   { "GetTempPathA
5890: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ",            (S
58a0: 59 53 43 41 4c 4c 29 47 65 74 54 65 6d 70 50 61  YSCALL)GetTempPa
58b0: 74 68 41 2c 20 20 20 20 20 20 20 20 20 20 20 20  thA,            
58c0: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
58d0: 47 65 74 54 65 6d 70 50 61 74 68 41 22 2c 20 20  GetTempPathA",  
58e0: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
58f0: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
5900: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
5910: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
5920: 20 6f 73 47 65 74 54 65 6d 70 50 61 74 68 41 20   osGetTempPathA 
5930: 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29  ((DWORD(WINAPI*)
5940: 28 44 57 4f 52 44 2c 4c 50 53 54 52 29 29 61 53  (DWORD,LPSTR))aS
5950: 79 73 63 61 6c 6c 5b 33 31 5d 2e 70 43 75 72 72  yscall[31].pCurr
5960: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
5970: 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65  E_OS_WINRT && de
5980: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
5990: 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b  32_HAS_WIDE).  {
59a0: 20 22 47 65 74 54 65 6d 70 50 61 74 68 57 22 2c   "GetTempPathW",
59b0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
59c0: 43 41 4c 4c 29 47 65 74 54 65 6d 70 50 61 74 68  CALL)GetTempPath
59d0: 57 2c 20 20 20 20 20 20 20 20 20 20 20 20 30 20  W,            0 
59e0: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65  },.#else.  { "Ge
59f0: 74 54 65 6d 70 50 61 74 68 57 22 2c 20 20 20 20  tTempPathW",    
5a00: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
5a10: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
5a20: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
5a30: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
5a40: 73 47 65 74 54 65 6d 70 50 61 74 68 57 20 28 28  sGetTempPathW ((
5a50: 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 44  DWORD(WINAPI*)(D
5a60: 57 4f 52 44 2c 4c 50 57 53 54 52 29 29 61 53 79  WORD,LPWSTR))aSy
5a70: 73 63 61 6c 6c 5b 33 32 5d 2e 70 43 75 72 72 65  scall[32].pCurre
5a80: 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  nt)..#if !SQLITE
5a90: 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 47  _OS_WINRT.  { "G
5aa0: 65 74 54 69 63 6b 43 6f 75 6e 74 22 2c 20 20 20  etTickCount",   
5ab0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
5ac0: 4c 29 47 65 74 54 69 63 6b 43 6f 75 6e 74 2c 20  L)GetTickCount, 
5ad0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
5ae0: 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 54 69  #else.  { "GetTi
5af0: 63 6b 43 6f 75 6e 74 22 2c 20 20 20 20 20 20 20  ckCount",       
5b00: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
5b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b20: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
5b30: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65  if..#define osGe
5b40: 74 54 69 63 6b 43 6f 75 6e 74 20 28 28 44 57 4f  tTickCount ((DWO
5b50: 52 44 28 57 49 4e 41 50 49 2a 29 28 56 4f 49 44  RD(WINAPI*)(VOID
5b60: 29 29 61 53 79 73 63 61 6c 6c 5b 33 33 5d 2e 70  ))aSyscall[33].p
5b70: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65  Current)..#if de
5b80: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
5b90: 33 32 5f 48 41 53 5f 41 4e 53 49 29 20 26 26 20  32_HAS_ANSI) && 
5ba0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
5bb0: 49 4e 33 32 5f 47 45 54 56 45 52 53 49 4f 4e 45  IN32_GETVERSIONE
5bc0: 58 29 20 26 26 20 5c 0a 20 20 20 20 20 20 20 20  X) && \.        
5bd0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 47 45 54  SQLITE_WIN32_GET
5be0: 56 45 52 53 49 4f 4e 45 58 0a 20 20 7b 20 22 47  VERSIONEX.  { "G
5bf0: 65 74 56 65 72 73 69 6f 6e 45 78 41 22 2c 20 20  etVersionExA",  
5c00: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
5c10: 4c 29 47 65 74 56 65 72 73 69 6f 6e 45 78 41 2c  L)GetVersionExA,
5c20: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
5c30: 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 56 65  #else.  { "GetVe
5c40: 72 73 69 6f 6e 45 78 41 22 2c 20 20 20 20 20 20  rsionExA",      
5c50: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
5c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c70: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
5c80: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65  if..#define osGe
5c90: 74 56 65 72 73 69 6f 6e 45 78 41 20 28 28 42 4f  tVersionExA ((BO
5ca0: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 20 5c 0a 20  OL(WINAPI*)( \. 
5cb0: 20 20 20 20 20 20 20 4c 50 4f 53 56 45 52 53 49         LPOSVERSI
5cc0: 4f 4e 49 4e 46 4f 41 29 29 61 53 79 73 63 61 6c  ONINFOA))aSyscal
5cd0: 6c 5b 33 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[34].pCurrent).
5ce0: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
5cf0: 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64  WINRT && defined
5d00: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
5d10: 53 5f 57 49 44 45 29 20 26 26 20 5c 0a 20 20 20  S_WIDE) && \.   
5d20: 20 20 20 20 20 64 65 66 69 6e 65 64 28 53 51 4c       defined(SQL
5d30: 49 54 45 5f 57 49 4e 33 32 5f 47 45 54 56 45 52  ITE_WIN32_GETVER
5d40: 53 49 4f 4e 45 58 29 20 26 26 20 53 51 4c 49 54  SIONEX) && SQLIT
5d50: 45 5f 57 49 4e 33 32 5f 47 45 54 56 45 52 53 49  E_WIN32_GETVERSI
5d60: 4f 4e 45 58 0a 20 20 7b 20 22 47 65 74 56 65 72  ONEX.  { "GetVer
5d70: 73 69 6f 6e 45 78 57 22 2c 20 20 20 20 20 20 20  sionExW",       
5d80: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74      (SYSCALL)Get
5d90: 56 65 72 73 69 6f 6e 45 78 57 2c 20 20 20 20 20  VersionExW,     
5da0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
5db0: 0a 20 20 7b 20 22 47 65 74 56 65 72 73 69 6f 6e  .  { "GetVersion
5dc0: 45 78 57 22 2c 20 20 20 20 20 20 20 20 20 20 20  ExW",           
5dd0: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
5de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5df0: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
5e00: 64 65 66 69 6e 65 20 6f 73 47 65 74 56 65 72 73  define osGetVers
5e10: 69 6f 6e 45 78 57 20 28 28 42 4f 4f 4c 28 57 49  ionExW ((BOOL(WI
5e20: 4e 41 50 49 2a 29 28 20 5c 0a 20 20 20 20 20 20  NAPI*)( \.      
5e30: 20 20 4c 50 4f 53 56 45 52 53 49 4f 4e 49 4e 46    LPOSVERSIONINF
5e40: 4f 57 29 29 61 53 79 73 63 61 6c 6c 5b 33 35 5d  OW))aSyscall[35]
5e50: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
5e60: 22 48 65 61 70 41 6c 6c 6f 63 22 2c 20 20 20 20  "HeapAlloc",    
5e70: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
5e80: 41 4c 4c 29 48 65 61 70 41 6c 6c 6f 63 2c 20 20  ALL)HeapAlloc,  
5e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
5ea0: 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 61  ,..#define osHea
5eb0: 70 41 6c 6c 6f 63 20 28 28 4c 50 56 4f 49 44 28  pAlloc ((LPVOID(
5ec0: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c  WINAPI*)(HANDLE,
5ed0: 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20  DWORD, \.       
5ee0: 20 53 49 5a 45 5f 54 29 29 61 53 79 73 63 61 6c   SIZE_T))aSyscal
5ef0: 6c 5b 33 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[36].pCurrent).
5f00: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
5f10: 57 49 4e 52 54 0a 20 20 7b 20 22 48 65 61 70 43  WINRT.  { "HeapC
5f20: 72 65 61 74 65 22 2c 20 20 20 20 20 20 20 20 20  reate",         
5f30: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65       (SYSCALL)He
5f40: 61 70 43 72 65 61 74 65 2c 20 20 20 20 20 20 20  apCreate,       
5f50: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
5f60: 65 0a 20 20 7b 20 22 48 65 61 70 43 72 65 61 74  e.  { "HeapCreat
5f70: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
5f80: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
5f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5fa0: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
5fb0: 23 64 65 66 69 6e 65 20 6f 73 48 65 61 70 43 72  #define osHeapCr
5fc0: 65 61 74 65 20 28 28 48 41 4e 44 4c 45 28 57 49  eate ((HANDLE(WI
5fd0: 4e 41 50 49 2a 29 28 44 57 4f 52 44 2c 53 49 5a  NAPI*)(DWORD,SIZ
5fe0: 45 5f 54 2c 20 5c 0a 20 20 20 20 20 20 20 20 53  E_T, \.        S
5ff0: 49 5a 45 5f 54 29 29 61 53 79 73 63 61 6c 6c 5b  IZE_T))aSyscall[
6000: 33 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  37].pCurrent)..#
6010: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
6020: 4e 52 54 0a 20 20 7b 20 22 48 65 61 70 44 65 73  NRT.  { "HeapDes
6030: 74 72 6f 79 22 2c 20 20 20 20 20 20 20 20 20 20  troy",          
6040: 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65 61 70     (SYSCALL)Heap
6050: 44 65 73 74 72 6f 79 2c 20 20 20 20 20 20 20 20  Destroy,        
6060: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
6070: 20 20 7b 20 22 48 65 61 70 44 65 73 74 72 6f 79    { "HeapDestroy
6080: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ",             (
6090: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
60a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
60b0: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
60c0: 65 66 69 6e 65 20 6f 73 48 65 61 70 44 65 73 74  efine osHeapDest
60d0: 72 6f 79 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  roy ((BOOL(WINAP
60e0: 49 2a 29 28 48 41 4e 44 4c 45 29 29 61 53 79 73  I*)(HANDLE))aSys
60f0: 63 61 6c 6c 5b 33 38 5d 2e 70 43 75 72 72 65 6e  call[38].pCurren
6100: 74 29 0a 0a 20 20 7b 20 22 48 65 61 70 46 72 65  t)..  { "HeapFre
6110: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
6120: 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65 61 70     (SYSCALL)Heap
6130: 46 72 65 65 2c 20 20 20 20 20 20 20 20 20 20 20  Free,           
6140: 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69       0 },..#defi
6150: 6e 65 20 6f 73 48 65 61 70 46 72 65 65 20 28 28  ne osHeapFree ((
6160: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41  BOOL(WINAPI*)(HA
6170: 4e 44 4c 45 2c 44 57 4f 52 44 2c 4c 50 56 4f 49  NDLE,DWORD,LPVOI
6180: 44 29 29 61 53 79 73 63 61 6c 6c 5b 33 39 5d 2e  D))aSyscall[39].
6190: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
61a0: 48 65 61 70 52 65 41 6c 6c 6f 63 22 2c 20 20 20  HeapReAlloc",   
61b0: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
61c0: 4c 4c 29 48 65 61 70 52 65 41 6c 6c 6f 63 2c 20  LL)HeapReAlloc, 
61d0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
61e0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 61 70  ..#define osHeap
61f0: 52 65 41 6c 6c 6f 63 20 28 28 4c 50 56 4f 49 44  ReAlloc ((LPVOID
6200: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
6210: 2c 44 57 4f 52 44 2c 4c 50 56 4f 49 44 2c 20 5c  ,DWORD,LPVOID, \
6220: 0a 20 20 20 20 20 20 20 20 53 49 5a 45 5f 54 29  .        SIZE_T)
6230: 29 61 53 79 73 63 61 6c 6c 5b 34 30 5d 2e 70 43  )aSyscall[40].pC
6240: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 48 65  urrent)..  { "He
6250: 61 70 53 69 7a 65 22 2c 20 20 20 20 20 20 20 20  apSize",        
6260: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
6270: 29 48 65 61 70 53 69 7a 65 2c 20 20 20 20 20 20  )HeapSize,      
6280: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a            0 },..
6290: 23 64 65 66 69 6e 65 20 6f 73 48 65 61 70 53 69  #define osHeapSi
62a0: 7a 65 20 28 28 53 49 5a 45 5f 54 28 57 49 4e 41  ze ((SIZE_T(WINA
62b0: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52  PI*)(HANDLE,DWOR
62c0: 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 43  D, \.        LPC
62d0: 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 34  VOID))aSyscall[4
62e0: 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  1].pCurrent)..#i
62f0: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
6300: 52 54 0a 20 20 7b 20 22 48 65 61 70 56 61 6c 69  RT.  { "HeapVali
6310: 64 61 74 65 22 2c 20 20 20 20 20 20 20 20 20 20  date",          
6320: 20 20 28 53 59 53 43 41 4c 4c 29 48 65 61 70 56    (SYSCALL)HeapV
6330: 61 6c 69 64 61 74 65 2c 20 20 20 20 20 20 20 20  alidate,        
6340: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
6350: 20 7b 20 22 48 65 61 70 56 61 6c 69 64 61 74 65   { "HeapValidate
6360: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ",            (S
6370: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
6380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6390: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
63a0: 66 69 6e 65 20 6f 73 48 65 61 70 56 61 6c 69 64  fine osHeapValid
63b0: 61 74 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  ate ((BOOL(WINAP
63c0: 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44  I*)(HANDLE,DWORD
63d0: 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 43 56  , \.        LPCV
63e0: 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 34 32  OID))aSyscall[42
63f0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
6400: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43   !SQLITE_OS_WINC
6410: 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f  E && !SQLITE_OS_
6420: 57 49 4e 52 54 0a 20 20 7b 20 22 48 65 61 70 43  WINRT.  { "HeapC
6430: 6f 6d 70 61 63 74 22 2c 20 20 20 20 20 20 20 20  ompact",        
6440: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65       (SYSCALL)He
6450: 61 70 43 6f 6d 70 61 63 74 2c 20 20 20 20 20 20  apCompact,      
6460: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
6470: 65 0a 20 20 7b 20 22 48 65 61 70 43 6f 6d 70 61  e.  { "HeapCompa
6480: 63 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ct",            
6490: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
64a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
64b0: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
64c0: 23 64 65 66 69 6e 65 20 6f 73 48 65 61 70 43 6f  #define osHeapCo
64d0: 6d 70 61 63 74 20 28 28 55 49 4e 54 28 57 49 4e  mpact ((UINT(WIN
64e0: 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f  API*)(HANDLE,DWO
64f0: 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 34 33 5d  RD))aSyscall[43]
6500: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
6510: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
6520: 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 20 26  IN32_HAS_ANSI) &
6530: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
6540: 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45  E_OMIT_LOAD_EXTE
6550: 4e 53 49 4f 4e 29 0a 20 20 7b 20 22 4c 6f 61 64  NSION).  { "Load
6560: 4c 69 62 72 61 72 79 41 22 2c 20 20 20 20 20 20  LibraryA",      
6570: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4c        (SYSCALL)L
6580: 6f 61 64 4c 69 62 72 61 72 79 41 2c 20 20 20 20  oadLibraryA,    
6590: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
65a0: 73 65 0a 20 20 7b 20 22 4c 6f 61 64 4c 69 62 72  se.  { "LoadLibr
65b0: 61 72 79 41 22 2c 20 20 20 20 20 20 20 20 20 20  aryA",          
65c0: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
65d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
65e0: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
65f0: 0a 23 64 65 66 69 6e 65 20 6f 73 4c 6f 61 64 4c  .#define osLoadL
6600: 69 62 72 61 72 79 41 20 28 28 48 4d 4f 44 55 4c  ibraryA ((HMODUL
6610: 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 53 54  E(WINAPI*)(LPCST
6620: 52 29 29 61 53 79 73 63 61 6c 6c 5b 34 34 5d 2e  R))aSyscall[44].
6630: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
6640: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20  SQLITE_OS_WINRT 
6650: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
6660: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45  E_WIN32_HAS_WIDE
6670: 29 20 26 26 20 5c 0a 20 20 20 20 20 20 20 20 21  ) && \.        !
6680: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
6690: 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49  MIT_LOAD_EXTENSI
66a0: 4f 4e 29 0a 20 20 7b 20 22 4c 6f 61 64 4c 69 62  ON).  { "LoadLib
66b0: 72 61 72 79 57 22 2c 20 20 20 20 20 20 20 20 20  raryW",         
66c0: 20 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f 61 64     (SYSCALL)Load
66d0: 4c 69 62 72 61 72 79 57 2c 20 20 20 20 20 20 20  LibraryW,       
66e0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
66f0: 20 20 7b 20 22 4c 6f 61 64 4c 69 62 72 61 72 79    { "LoadLibrary
6700: 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28  W",            (
6710: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
6720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6730: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
6740: 65 66 69 6e 65 20 6f 73 4c 6f 61 64 4c 69 62 72  efine osLoadLibr
6750: 61 72 79 57 20 28 28 48 4d 4f 44 55 4c 45 28 57  aryW ((HMODULE(W
6760: 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52 29  INAPI*)(LPCWSTR)
6770: 29 61 53 79 73 63 61 6c 6c 5b 34 35 5d 2e 70 43  )aSyscall[45].pC
6780: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
6790: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
67a0: 7b 20 22 4c 6f 63 61 6c 46 72 65 65 22 2c 20 20  { "LocalFree",  
67b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
67c0: 53 43 41 4c 4c 29 4c 6f 63 61 6c 46 72 65 65 2c  SCALL)LocalFree,
67d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
67e0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4c   },.#else.  { "L
67f0: 6f 63 61 6c 46 72 65 65 22 2c 20 20 20 20 20 20  ocalFree",      
6800: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
6810: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
6820: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
6830: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
6840: 6f 73 4c 6f 63 61 6c 46 72 65 65 20 28 28 48 4c  osLocalFree ((HL
6850: 4f 43 41 4c 28 57 49 4e 41 50 49 2a 29 28 48 4c  OCAL(WINAPI*)(HL
6860: 4f 43 41 4c 29 29 61 53 79 73 63 61 6c 6c 5b 34  OCAL))aSyscall[4
6870: 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  6].pCurrent)..#i
6880: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
6890: 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53  CE && !SQLITE_OS
68a0: 5f 57 49 4e 52 54 0a 20 20 7b 20 22 4c 6f 63 6b  _WINRT.  { "Lock
68b0: 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20  File",          
68c0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4c        (SYSCALL)L
68d0: 6f 63 6b 46 69 6c 65 2c 20 20 20 20 20 20 20 20  ockFile,        
68e0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
68f0: 73 65 0a 20 20 7b 20 22 4c 6f 63 6b 46 69 6c 65  se.  { "LockFile
6900: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
6910: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
6920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6930: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
6940: 0a 23 69 66 6e 64 65 66 20 6f 73 4c 6f 63 6b 46  .#ifndef osLockF
6950: 69 6c 65 0a 23 64 65 66 69 6e 65 20 6f 73 4c 6f  ile.#define osLo
6960: 63 6b 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49  ckFile ((BOOL(WI
6970: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57  NAPI*)(HANDLE,DW
6980: 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c  ORD,DWORD,DWORD,
6990: 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44   \.        DWORD
69a0: 29 29 61 53 79 73 63 61 6c 6c 5b 34 37 5d 2e 70  ))aSyscall[47].p
69b0: 43 75 72 72 65 6e 74 29 0a 23 65 6e 64 69 66 0a  Current).#endif.
69c0: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
69d0: 57 49 4e 43 45 0a 20 20 7b 20 22 4c 6f 63 6b 46  WINCE.  { "LockF
69e0: 69 6c 65 45 78 22 2c 20 20 20 20 20 20 20 20 20  ileEx",         
69f0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f       (SYSCALL)Lo
6a00: 63 6b 46 69 6c 65 45 78 2c 20 20 20 20 20 20 20  ckFileEx,       
6a10: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
6a20: 65 0a 20 20 7b 20 22 4c 6f 63 6b 46 69 6c 65 45  e.  { "LockFileE
6a30: 78 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  x",             
6a40: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
6a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a60: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
6a70: 23 69 66 6e 64 65 66 20 6f 73 4c 6f 63 6b 46 69  #ifndef osLockFi
6a80: 6c 65 45 78 0a 23 64 65 66 69 6e 65 20 6f 73 4c  leEx.#define osL
6a90: 6f 63 6b 46 69 6c 65 45 78 20 28 28 42 4f 4f 4c  ockFileEx ((BOOL
6aa0: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
6ab0: 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f  ,DWORD,DWORD,DWO
6ac0: 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20  RD,DWORD, \.    
6ad0: 20 20 20 20 4c 50 4f 56 45 52 4c 41 50 50 45 44      LPOVERLAPPED
6ae0: 29 29 61 53 79 73 63 61 6c 6c 5b 34 38 5d 2e 70  ))aSyscall[48].p
6af0: 43 75 72 72 65 6e 74 29 0a 23 65 6e 64 69 66 0a  Current).#endif.
6b00: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
6b10: 49 4e 43 45 20 7c 7c 20 28 21 53 51 4c 49 54 45  INCE || (!SQLITE
6b20: 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 21 64 65  _OS_WINRT && !de
6b30: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
6b40: 54 5f 57 41 4c 29 29 0a 20 20 7b 20 22 4d 61 70  T_WAL)).  { "Map
6b50: 56 69 65 77 4f 66 46 69 6c 65 22 2c 20 20 20 20  ViewOfFile",    
6b60: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
6b70: 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 2c 20 20  MapViewOfFile,  
6b80: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
6b90: 6c 73 65 0a 20 20 7b 20 22 4d 61 70 56 69 65 77  lse.  { "MapView
6ba0: 4f 66 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20  OfFile",        
6bb0: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
6bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6bd0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
6be0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4d 61 70 56  ..#define osMapV
6bf0: 69 65 77 4f 66 46 69 6c 65 20 28 28 4c 50 56 4f  iewOfFile ((LPVO
6c00: 49 44 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44  ID(WINAPI*)(HAND
6c10: 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44  LE,DWORD,DWORD,D
6c20: 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20  WORD, \.        
6c30: 53 49 5a 45 5f 54 29 29 61 53 79 73 63 61 6c 6c  SIZE_T))aSyscall
6c40: 5b 34 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [49].pCurrent)..
6c50: 20 20 7b 20 22 4d 75 6c 74 69 42 79 74 65 54 6f    { "MultiByteTo
6c60: 57 69 64 65 43 68 61 72 22 2c 20 20 20 20 20 28  WideChar",     (
6c70: 53 59 53 43 41 4c 4c 29 4d 75 6c 74 69 42 79 74  SYSCALL)MultiByt
6c80: 65 54 6f 57 69 64 65 43 68 61 72 2c 20 20 20 20  eToWideChar,    
6c90: 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f   0 },..#define o
6ca0: 73 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65  sMultiByteToWide
6cb0: 43 68 61 72 20 28 28 69 6e 74 28 57 49 4e 41 50  Char ((int(WINAP
6cc0: 49 2a 29 28 55 49 4e 54 2c 44 57 4f 52 44 2c 4c  I*)(UINT,DWORD,L
6cd0: 50 43 53 54 52 2c 69 6e 74 2c 4c 50 57 53 54 52  PCSTR,int,LPWSTR
6ce0: 2c 20 5c 0a 20 20 20 20 20 20 20 20 69 6e 74 29  , \.        int)
6cf0: 29 61 53 79 73 63 61 6c 6c 5b 35 30 5d 2e 70 43  )aSyscall[50].pC
6d00: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 51 75  urrent)..  { "Qu
6d10: 65 72 79 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f  eryPerformanceCo
6d20: 75 6e 74 65 72 22 2c 20 28 53 59 53 43 41 4c 4c  unter", (SYSCALL
6d30: 29 51 75 65 72 79 50 65 72 66 6f 72 6d 61 6e 63  )QueryPerformanc
6d40: 65 43 6f 75 6e 74 65 72 2c 20 30 20 7d 2c 0a 0a  eCounter, 0 },..
6d50: 23 64 65 66 69 6e 65 20 6f 73 51 75 65 72 79 50  #define osQueryP
6d60: 65 72 66 6f 72 6d 61 6e 63 65 43 6f 75 6e 74 65  erformanceCounte
6d70: 72 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  r ((BOOL(WINAPI*
6d80: 29 28 20 5c 0a 20 20 20 20 20 20 20 20 4c 41 52  )( \.        LAR
6d90: 47 45 5f 49 4e 54 45 47 45 52 2a 29 29 61 53 79  GE_INTEGER*))aSy
6da0: 73 63 61 6c 6c 5b 35 31 5d 2e 70 43 75 72 72 65  scall[51].pCurre
6db0: 6e 74 29 0a 0a 20 20 7b 20 22 52 65 61 64 46 69  nt)..  { "ReadFi
6dc0: 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  le",            
6dd0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 52 65 61      (SYSCALL)Rea
6de0: 64 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20  dFile,          
6df0: 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66        0 },..#def
6e00: 69 6e 65 20 6f 73 52 65 61 64 46 69 6c 65 20 28  ine osReadFile (
6e10: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48  (BOOL(WINAPI*)(H
6e20: 41 4e 44 4c 45 2c 4c 50 56 4f 49 44 2c 44 57 4f  ANDLE,LPVOID,DWO
6e30: 52 44 2c 4c 50 44 57 4f 52 44 2c 20 5c 0a 20 20  RD,LPDWORD, \.  
6e40: 20 20 20 20 20 20 4c 50 4f 56 45 52 4c 41 50 50        LPOVERLAPP
6e50: 45 44 29 29 61 53 79 73 63 61 6c 6c 5b 35 32 5d  ED))aSyscall[52]
6e60: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
6e70: 22 53 65 74 45 6e 64 4f 66 46 69 6c 65 22 2c 20  "SetEndOfFile", 
6e80: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
6e90: 41 4c 4c 29 53 65 74 45 6e 64 4f 66 46 69 6c 65  ALL)SetEndOfFile
6ea0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d  ,            0 }
6eb0: 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 53 65 74  ,..#define osSet
6ec0: 45 6e 64 4f 66 46 69 6c 65 20 28 28 42 4f 4f 4c  EndOfFile ((BOOL
6ed0: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
6ee0: 29 29 61 53 79 73 63 61 6c 6c 5b 35 33 5d 2e 70  ))aSyscall[53].p
6ef0: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53  Current)..#if !S
6f00: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
6f10: 20 7b 20 22 53 65 74 46 69 6c 65 50 6f 69 6e 74   { "SetFilePoint
6f20: 65 72 22 2c 20 20 20 20 20 20 20 20 20 20 28 53  er",          (S
6f30: 59 53 43 41 4c 4c 29 53 65 74 46 69 6c 65 50 6f  YSCALL)SetFilePo
6f40: 69 6e 74 65 72 2c 20 20 20 20 20 20 20 20 20 20  inter,          
6f50: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
6f60: 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 22 2c  SetFilePointer",
6f70: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
6f80: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
6f90: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
6fa0: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
6fb0: 20 6f 73 53 65 74 46 69 6c 65 50 6f 69 6e 74 65   osSetFilePointe
6fc0: 72 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49  r ((DWORD(WINAPI
6fd0: 2a 29 28 48 41 4e 44 4c 45 2c 4c 4f 4e 47 2c 50  *)(HANDLE,LONG,P
6fe0: 4c 4f 4e 47 2c 20 5c 0a 20 20 20 20 20 20 20 20  LONG, \.        
6ff0: 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b  DWORD))aSyscall[
7000: 35 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  54].pCurrent)..#
7010: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
7020: 4e 52 54 0a 20 20 7b 20 22 53 6c 65 65 70 22 2c  NRT.  { "Sleep",
7030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7040: 20 20 20 28 53 59 53 43 41 4c 4c 29 53 6c 65 65     (SYSCALL)Slee
7050: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
7060: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
7070: 20 20 7b 20 22 53 6c 65 65 70 22 2c 20 20 20 20    { "Sleep",    
7080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
7090: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
70a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
70b0: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
70c0: 65 66 69 6e 65 20 6f 73 53 6c 65 65 70 20 28 28  efine osSleep ((
70d0: 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 44 57  VOID(WINAPI*)(DW
70e0: 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 35 35  ORD))aSyscall[55
70f0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
7100: 20 22 53 79 73 74 65 6d 54 69 6d 65 54 6f 46 69   "SystemTimeToFi
7110: 6c 65 54 69 6d 65 22 2c 20 20 20 20 28 53 59 53  leTime",    (SYS
7120: 43 41 4c 4c 29 53 79 73 74 65 6d 54 69 6d 65 54  CALL)SystemTimeT
7130: 6f 46 69 6c 65 54 69 6d 65 2c 20 20 20 20 30 20  oFileTime,    0 
7140: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 53 79  },..#define osSy
7150: 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54 69  stemTimeToFileTi
7160: 6d 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  me ((BOOL(WINAPI
7170: 2a 29 28 43 4f 4e 53 54 20 53 59 53 54 45 4d 54  *)(CONST SYSTEMT
7180: 49 4d 45 2a 2c 20 5c 0a 20 20 20 20 20 20 20 20  IME*, \.        
7190: 4c 50 46 49 4c 45 54 49 4d 45 29 29 61 53 79 73  LPFILETIME))aSys
71a0: 63 61 6c 6c 5b 35 36 5d 2e 70 43 75 72 72 65 6e  call[56].pCurren
71b0: 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  t)..#if !SQLITE_
71c0: 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c  OS_WINCE && !SQL
71d0: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b  ITE_OS_WINRT.  {
71e0: 20 22 55 6e 6c 6f 63 6b 46 69 6c 65 22 2c 20 20   "UnlockFile",  
71f0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
7200: 43 41 4c 4c 29 55 6e 6c 6f 63 6b 46 69 6c 65 2c  CALL)UnlockFile,
7210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
7220: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 55 6e  },.#else.  { "Un
7230: 6c 6f 63 6b 46 69 6c 65 22 2c 20 20 20 20 20 20  lockFile",      
7240: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
7250: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
7260: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
7270: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 6f  endif..#ifndef o
7280: 73 55 6e 6c 6f 63 6b 46 69 6c 65 0a 23 64 65 66  sUnlockFile.#def
7290: 69 6e 65 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65  ine osUnlockFile
72a0: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
72b0: 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 44 57  (HANDLE,DWORD,DW
72c0: 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20  ORD,DWORD, \.   
72d0: 20 20 20 20 20 44 57 4f 52 44 29 29 61 53 79 73       DWORD))aSys
72e0: 63 61 6c 6c 5b 35 37 5d 2e 70 43 75 72 72 65 6e  call[57].pCurren
72f0: 74 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21  t).#endif..#if !
7300: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
7310: 20 20 7b 20 22 55 6e 6c 6f 63 6b 46 69 6c 65 45    { "UnlockFileE
7320: 78 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28  x",            (
7330: 53 59 53 43 41 4c 4c 29 55 6e 6c 6f 63 6b 46 69  SYSCALL)UnlockFi
7340: 6c 65 45 78 2c 20 20 20 20 20 20 20 20 20 20 20  leEx,           
7350: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
7360: 22 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 22 2c 20  "UnlockFileEx", 
7370: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
7380: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
7390: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
73a0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
73b0: 65 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 45 78  e osUnlockFileEx
73c0: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
73d0: 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 44 57  (HANDLE,DWORD,DW
73e0: 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20  ORD,DWORD, \.   
73f0: 20 20 20 20 20 4c 50 4f 56 45 52 4c 41 50 50 45       LPOVERLAPPE
7400: 44 29 29 61 53 79 73 63 61 6c 6c 5b 35 38 5d 2e  D))aSyscall[58].
7410: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53  pCurrent)..#if S
7420: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c  QLITE_OS_WINCE |
7430: 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
7440: 45 5f 4f 4d 49 54 5f 57 41 4c 29 0a 20 20 7b 20  E_OMIT_WAL).  { 
7450: 22 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65  "UnmapViewOfFile
7460: 22 2c 20 20 20 20 20 20 20 20 20 28 53 59 53 43  ",         (SYSC
7470: 41 4c 4c 29 55 6e 6d 61 70 56 69 65 77 4f 66 46  ALL)UnmapViewOfF
7480: 69 6c 65 2c 20 20 20 20 20 20 20 20 20 30 20 7d  ile,         0 }
7490: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 55 6e 6d  ,.#else.  { "Unm
74a0: 61 70 56 69 65 77 4f 66 46 69 6c 65 22 2c 20 20  apViewOfFile",  
74b0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
74c0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
74d0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
74e0: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
74f0: 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 20  UnmapViewOfFile 
7500: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
7510: 4c 50 43 56 4f 49 44 29 29 61 53 79 73 63 61 6c  LPCVOID))aSyscal
7520: 6c 5b 35 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[59].pCurrent).
7530: 0a 20 20 7b 20 22 57 69 64 65 43 68 61 72 54 6f  .  { "WideCharTo
7540: 4d 75 6c 74 69 42 79 74 65 22 2c 20 20 20 20 20  MultiByte",     
7550: 28 53 59 53 43 41 4c 4c 29 57 69 64 65 43 68 61  (SYSCALL)WideCha
7560: 72 54 6f 4d 75 6c 74 69 42 79 74 65 2c 20 20 20  rToMultiByte,   
7570: 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20    0 },..#define 
7580: 6f 73 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74  osWideCharToMult
7590: 69 42 79 74 65 20 28 28 69 6e 74 28 57 49 4e 41  iByte ((int(WINA
75a0: 50 49 2a 29 28 55 49 4e 54 2c 44 57 4f 52 44 2c  PI*)(UINT,DWORD,
75b0: 4c 50 43 57 53 54 52 2c 69 6e 74 2c 4c 50 53 54  LPCWSTR,int,LPST
75c0: 52 2c 69 6e 74 2c 20 5c 0a 20 20 20 20 20 20 20  R,int, \.       
75d0: 20 4c 50 43 53 54 52 2c 4c 50 42 4f 4f 4c 29 29   LPCSTR,LPBOOL))
75e0: 61 53 79 73 63 61 6c 6c 5b 36 30 5d 2e 70 43 75  aSyscall[60].pCu
75f0: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 57 72 69  rrent)..  { "Wri
7600: 74 65 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20  teFile",        
7610: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
7620: 57 72 69 74 65 46 69 6c 65 2c 20 20 20 20 20 20  WriteFile,      
7630: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23           0 },..#
7640: 64 65 66 69 6e 65 20 6f 73 57 72 69 74 65 46 69  define osWriteFi
7650: 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  le ((BOOL(WINAPI
7660: 2a 29 28 48 41 4e 44 4c 45 2c 4c 50 43 56 4f 49  *)(HANDLE,LPCVOI
7670: 44 2c 44 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c  D,DWORD,LPDWORD,
7680: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 4f 56 45   \.        LPOVE
7690: 52 4c 41 50 50 45 44 29 29 61 53 79 73 63 61 6c  RLAPPED))aSyscal
76a0: 6c 5b 36 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[61].pCurrent).
76b0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
76c0: 49 4e 52 54 0a 20 20 7b 20 22 43 72 65 61 74 65  INRT.  { "Create
76d0: 45 76 65 6e 74 45 78 57 22 2c 20 20 20 20 20 20  EventExW",      
76e0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72 65      (SYSCALL)Cre
76f0: 61 74 65 45 76 65 6e 74 45 78 57 2c 20 20 20 20  ateEventExW,    
7700: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
7710: 0a 20 20 7b 20 22 43 72 65 61 74 65 45 76 65 6e  .  { "CreateEven
7720: 74 45 78 57 22 2c 20 20 20 20 20 20 20 20 20 20  tExW",          
7730: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
7740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7750: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
7760: 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65 45  define osCreateE
7770: 76 65 6e 74 45 78 57 20 28 28 48 41 4e 44 4c 45  ventExW ((HANDLE
7780: 28 57 49 4e 41 50 49 2a 29 28 4c 50 53 45 43 55  (WINAPI*)(LPSECU
7790: 52 49 54 59 5f 41 54 54 52 49 42 55 54 45 53 2c  RITY_ATTRIBUTES,
77a0: 4c 50 43 57 53 54 52 2c 20 5c 0a 20 20 20 20 20  LPCWSTR, \.     
77b0: 20 20 20 44 57 4f 52 44 2c 44 57 4f 52 44 29 29     DWORD,DWORD))
77c0: 61 53 79 73 63 61 6c 6c 5b 36 32 5d 2e 70 43 75  aSyscall[62].pCu
77d0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c  rrent)..#if !SQL
77e0: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b  ITE_OS_WINRT.  {
77f0: 20 22 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f   "WaitForSingleO
7800: 62 6a 65 63 74 22 2c 20 20 20 20 20 28 53 59 53  bject",     (SYS
7810: 43 41 4c 4c 29 57 61 69 74 46 6f 72 53 69 6e 67  CALL)WaitForSing
7820: 6c 65 4f 62 6a 65 63 74 2c 20 20 20 20 20 30 20  leObject,     0 
7830: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 57 61  },.#else.  { "Wa
7840: 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63  itForSingleObjec
7850: 74 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c 4c  t",     (SYSCALL
7860: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
7870: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
7880: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
7890: 73 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62  sWaitForSingleOb
78a0: 6a 65 63 74 20 28 28 44 57 4f 52 44 28 57 49 4e  ject ((DWORD(WIN
78b0: 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 20 5c 0a  API*)(HANDLE, \.
78c0: 20 20 20 20 20 20 20 20 44 57 4f 52 44 29 29 61          DWORD))a
78d0: 53 79 73 63 61 6c 6c 5b 36 33 5d 2e 70 43 75 72  Syscall[63].pCur
78e0: 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54  rent)..#if SQLIT
78f0: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22  E_OS_WINRT.  { "
7900: 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a  WaitForSingleObj
7910: 65 63 74 45 78 22 2c 20 20 20 28 53 59 53 43 41  ectEx",   (SYSCA
7920: 4c 4c 29 57 61 69 74 46 6f 72 53 69 6e 67 6c 65  LL)WaitForSingle
7930: 4f 62 6a 65 63 74 45 78 2c 20 20 20 30 20 7d 2c  ObjectEx,   0 },
7940: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 57 61 69 74  .#else.  { "Wait
7950: 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 45  ForSingleObjectE
7960: 78 22 2c 20 20 20 28 53 59 53 43 41 4c 4c 29 30  x",   (SYSCALL)0
7970: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
7980: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
7990: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 57  dif..#define osW
79a0: 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65  aitForSingleObje
79b0: 63 74 45 78 20 28 28 44 57 4f 52 44 28 57 49 4e  ctEx ((DWORD(WIN
79c0: 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f  API*)(HANDLE,DWO
79d0: 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 42 4f  RD, \.        BO
79e0: 4f 4c 29 29 61 53 79 73 63 61 6c 6c 5b 36 34 5d  OL))aSyscall[64]
79f0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
7a00: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
7a10: 20 20 7b 20 22 53 65 74 46 69 6c 65 50 6f 69 6e    { "SetFilePoin
7a20: 74 65 72 45 78 22 2c 20 20 20 20 20 20 20 20 28  terEx",        (
7a30: 53 59 53 43 41 4c 4c 29 53 65 74 46 69 6c 65 50  SYSCALL)SetFileP
7a40: 6f 69 6e 74 65 72 45 78 2c 20 20 20 20 20 20 20  ointerEx,       
7a50: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
7a60: 22 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 45  "SetFilePointerE
7a70: 78 22 2c 20 20 20 20 20 20 20 20 28 53 59 53 43  x",        (SYSC
7a80: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
7a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
7aa0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
7ab0: 65 20 6f 73 53 65 74 46 69 6c 65 50 6f 69 6e 74  e osSetFilePoint
7ac0: 65 72 45 78 20 28 28 42 4f 4f 4c 28 57 49 4e 41  erEx ((BOOL(WINA
7ad0: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 41 52 47  PI*)(HANDLE,LARG
7ae0: 45 5f 49 4e 54 45 47 45 52 2c 20 5c 0a 20 20 20  E_INTEGER, \.   
7af0: 20 20 20 20 20 50 4c 41 52 47 45 5f 49 4e 54 45       PLARGE_INTE
7b00: 47 45 52 2c 44 57 4f 52 44 29 29 61 53 79 73 63  GER,DWORD))aSysc
7b10: 61 6c 6c 5b 36 35 5d 2e 70 43 75 72 72 65 6e 74  all[65].pCurrent
7b20: 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  )..#if SQLITE_OS
7b30: 5f 57 49 4e 52 54 0a 20 20 7b 20 22 47 65 74 46  _WINRT.  { "GetF
7b40: 69 6c 65 49 6e 66 6f 72 6d 61 74 69 6f 6e 42 79  ileInformationBy
7b50: 48 61 6e 64 6c 65 45 78 22 2c 20 28 53 59 53 43  HandleEx", (SYSC
7b60: 41 4c 4c 29 47 65 74 46 69 6c 65 49 6e 66 6f 72  ALL)GetFileInfor
7b70: 6d 61 74 69 6f 6e 42 79 48 61 6e 64 6c 65 45 78  mationByHandleEx
7b80: 2c 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b  , 0 },.#else.  {
7b90: 20 22 47 65 74 46 69 6c 65 49 6e 66 6f 72 6d 61   "GetFileInforma
7ba0: 74 69 6f 6e 42 79 48 61 6e 64 6c 65 45 78 22 2c  tionByHandleEx",
7bb0: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
7bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
7bd0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
7be0: 6e 65 20 6f 73 47 65 74 46 69 6c 65 49 6e 66 6f  ne osGetFileInfo
7bf0: 72 6d 61 74 69 6f 6e 42 79 48 61 6e 64 6c 65 45  rmationByHandleE
7c00: 78 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  x ((BOOL(WINAPI*
7c10: 29 28 48 41 4e 44 4c 45 2c 20 5c 0a 20 20 20 20  )(HANDLE, \.    
7c20: 20 20 20 20 46 49 4c 45 5f 49 4e 46 4f 5f 42 59      FILE_INFO_BY
7c30: 5f 48 41 4e 44 4c 45 5f 43 4c 41 53 53 2c 4c 50  _HANDLE_CLASS,LP
7c40: 56 4f 49 44 2c 44 57 4f 52 44 29 29 61 53 79 73  VOID,DWORD))aSys
7c50: 63 61 6c 6c 5b 36 36 5d 2e 70 43 75 72 72 65 6e  call[66].pCurren
7c60: 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  t)..#if SQLITE_O
7c70: 53 5f 57 49 4e 52 54 20 26 26 20 21 64 65 66 69  S_WINRT && !defi
7c80: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
7c90: 57 41 4c 29 0a 20 20 7b 20 22 4d 61 70 56 69 65  WAL).  { "MapVie
7ca0: 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 22 2c  wOfFileFromApp",
7cb0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4d 61 70      (SYSCALL)Map
7cc0: 56 69 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70  ViewOfFileFromAp
7cd0: 70 2c 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65  p,    0 },.#else
7ce0: 0a 20 20 7b 20 22 4d 61 70 56 69 65 77 4f 66 46  .  { "MapViewOfF
7cf0: 69 6c 65 46 72 6f 6d 41 70 70 22 2c 20 20 20 20  ileFromApp",    
7d00: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
7d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d20: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
7d30: 64 65 66 69 6e 65 20 6f 73 4d 61 70 56 69 65 77  define osMapView
7d40: 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 20 28 28  OfFileFromApp ((
7d50: 4c 50 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28  LPVOID(WINAPI*)(
7d60: 48 41 4e 44 4c 45 2c 55 4c 4f 4e 47 2c 55 4c 4f  HANDLE,ULONG,ULO
7d70: 4e 47 36 34 2c 20 5c 0a 20 20 20 20 20 20 20 20  NG64, \.        
7d80: 53 49 5a 45 5f 54 29 29 61 53 79 73 63 61 6c 6c  SIZE_T))aSyscall
7d90: 5b 36 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [67].pCurrent)..
7da0: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
7db0: 4e 52 54 0a 20 20 7b 20 22 43 72 65 61 74 65 46  NRT.  { "CreateF
7dc0: 69 6c 65 32 22 2c 20 20 20 20 20 20 20 20 20 20  ile2",          
7dd0: 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72 65 61     (SYSCALL)Crea
7de0: 74 65 46 69 6c 65 32 2c 20 20 20 20 20 20 20 20  teFile2,        
7df0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
7e00: 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65 32    { "CreateFile2
7e10: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ",             (
7e20: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
7e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7e40: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
7e50: 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65 46 69  efine osCreateFi
7e60: 6c 65 32 20 28 28 48 41 4e 44 4c 45 28 57 49 4e  le2 ((HANDLE(WIN
7e70: 41 50 49 2a 29 28 4c 50 43 57 53 54 52 2c 44 57  API*)(LPCWSTR,DW
7e80: 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c  ORD,DWORD,DWORD,
7e90: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 43 52 45   \.        LPCRE
7ea0: 41 54 45 46 49 4c 45 32 5f 45 58 54 45 4e 44 45  ATEFILE2_EXTENDE
7eb0: 44 5f 50 41 52 41 4d 45 54 45 52 53 29 29 61 53  D_PARAMETERS))aS
7ec0: 79 73 63 61 6c 6c 5b 36 38 5d 2e 70 43 75 72 72  yscall[68].pCurr
7ed0: 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45  ent)..#if SQLITE
7ee0: 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 21 64 65  _OS_WINRT && !de
7ef0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
7f00: 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  T_LOAD_EXTENSION
7f10: 29 0a 20 20 7b 20 22 4c 6f 61 64 50 61 63 6b 61  ).  { "LoadPacka
7f20: 67 65 64 4c 69 62 72 61 72 79 22 2c 20 20 20 20  gedLibrary",    
7f30: 20 28 53 59 53 43 41 4c 4c 29 4c 6f 61 64 50 61   (SYSCALL)LoadPa
7f40: 63 6b 61 67 65 64 4c 69 62 72 61 72 79 2c 20 20  ckagedLibrary,  
7f50: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
7f60: 7b 20 22 4c 6f 61 64 50 61 63 6b 61 67 65 64 4c  { "LoadPackagedL
7f70: 69 62 72 61 72 79 22 2c 20 20 20 20 20 28 53 59  ibrary",     (SY
7f80: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
7f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
7fa0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
7fb0: 69 6e 65 20 6f 73 4c 6f 61 64 50 61 63 6b 61 67  ine osLoadPackag
7fc0: 65 64 4c 69 62 72 61 72 79 20 28 28 48 4d 4f 44  edLibrary ((HMOD
7fd0: 55 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 43  ULE(WINAPI*)(LPC
7fe0: 57 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20  WSTR, \.        
7ff0: 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b  DWORD))aSyscall[
8000: 36 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  69].pCurrent)..#
8010: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
8020: 52 54 0a 20 20 7b 20 22 47 65 74 54 69 63 6b 43  RT.  { "GetTickC
8030: 6f 75 6e 74 36 34 22 2c 20 20 20 20 20 20 20 20  ount64",        
8040: 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 54 69    (SYSCALL)GetTi
8050: 63 6b 43 6f 75 6e 74 36 34 2c 20 20 20 20 20 20  ckCount64,      
8060: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
8070: 20 7b 20 22 47 65 74 54 69 63 6b 43 6f 75 6e 74   { "GetTickCount
8080: 36 34 22 2c 20 20 20 20 20 20 20 20 20 20 28 53  64",          (S
8090: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
80a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
80b0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
80c0: 66 69 6e 65 20 6f 73 47 65 74 54 69 63 6b 43 6f  fine osGetTickCo
80d0: 75 6e 74 36 34 20 28 28 55 4c 4f 4e 47 4c 4f 4e  unt64 ((ULONGLON
80e0: 47 28 57 49 4e 41 50 49 2a 29 28 56 4f 49 44 29  G(WINAPI*)(VOID)
80f0: 29 61 53 79 73 63 61 6c 6c 5b 37 30 5d 2e 70 43  )aSyscall[70].pC
8100: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c  urrent)..#if SQL
8110: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b  ITE_OS_WINRT.  {
8120: 20 22 47 65 74 4e 61 74 69 76 65 53 79 73 74 65   "GetNativeSyste
8130: 6d 49 6e 66 6f 22 2c 20 20 20 20 20 28 53 59 53  mInfo",     (SYS
8140: 43 41 4c 4c 29 47 65 74 4e 61 74 69 76 65 53 79  CALL)GetNativeSy
8150: 73 74 65 6d 49 6e 66 6f 2c 20 20 20 20 20 30 20  stemInfo,     0 
8160: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65  },.#else.  { "Ge
8170: 74 4e 61 74 69 76 65 53 79 73 74 65 6d 49 6e 66  tNativeSystemInf
8180: 6f 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c 4c  o",     (SYSCALL
8190: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
81a0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
81b0: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
81c0: 73 47 65 74 4e 61 74 69 76 65 53 79 73 74 65 6d  sGetNativeSystem
81d0: 49 6e 66 6f 20 28 28 56 4f 49 44 28 57 49 4e 41  Info ((VOID(WINA
81e0: 50 49 2a 29 28 20 5c 0a 20 20 20 20 20 20 20 20  PI*)( \.        
81f0: 4c 50 53 59 53 54 45 4d 5f 49 4e 46 4f 29 29 61  LPSYSTEM_INFO))a
8200: 53 79 73 63 61 6c 6c 5b 37 31 5d 2e 70 43 75 72  Syscall[71].pCur
8210: 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e  rent)..#if defin
8220: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
8230: 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 4f  HAS_ANSI).  { "O
8240: 75 74 70 75 74 44 65 62 75 67 53 74 72 69 6e 67  utputDebugString
8250: 41 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c  A",      (SYSCAL
8260: 4c 29 4f 75 74 70 75 74 44 65 62 75 67 53 74 72  L)OutputDebugStr
8270: 69 6e 67 41 2c 20 20 20 20 20 20 30 20 7d 2c 0a  ingA,      0 },.
8280: 23 65 6c 73 65 0a 20 20 7b 20 22 4f 75 74 70 75  #else.  { "Outpu
8290: 74 44 65 62 75 67 53 74 72 69 6e 67 41 22 2c 20  tDebugStringA", 
82a0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
82b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
82c0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
82d0: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4f 75  if..#define osOu
82e0: 74 70 75 74 44 65 62 75 67 53 74 72 69 6e 67 41  tputDebugStringA
82f0: 20 28 28 56 4f 49 44 28 57 49 4e 41 50 49 2a 29   ((VOID(WINAPI*)
8300: 28 4c 50 43 53 54 52 29 29 61 53 79 73 63 61 6c  (LPCSTR))aSyscal
8310: 6c 5b 37 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[72].pCurrent).
8320: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
8330: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
8340: 44 45 29 0a 20 20 7b 20 22 4f 75 74 70 75 74 44  DE).  { "OutputD
8350: 65 62 75 67 53 74 72 69 6e 67 57 22 2c 20 20 20  ebugStringW",   
8360: 20 20 20 28 53 59 53 43 41 4c 4c 29 4f 75 74 70     (SYSCALL)Outp
8370: 75 74 44 65 62 75 67 53 74 72 69 6e 67 57 2c 20  utDebugStringW, 
8380: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
8390: 20 20 7b 20 22 4f 75 74 70 75 74 44 65 62 75 67    { "OutputDebug
83a0: 53 74 72 69 6e 67 57 22 2c 20 20 20 20 20 20 28  StringW",      (
83b0: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
83c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
83d0: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
83e0: 65 66 69 6e 65 20 6f 73 4f 75 74 70 75 74 44 65  efine osOutputDe
83f0: 62 75 67 53 74 72 69 6e 67 57 20 28 28 56 4f 49  bugStringW ((VOI
8400: 44 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53  D(WINAPI*)(LPCWS
8410: 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 37 33 5d  TR))aSyscall[73]
8420: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
8430: 22 47 65 74 50 72 6f 63 65 73 73 48 65 61 70 22  "GetProcessHeap"
8440: 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43  ,          (SYSC
8450: 41 4c 4c 29 47 65 74 50 72 6f 63 65 73 73 48 65  ALL)GetProcessHe
8460: 61 70 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d  ap,          0 }
8470: 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  ,..#define osGet
8480: 50 72 6f 63 65 73 73 48 65 61 70 20 28 28 48 41  ProcessHeap ((HA
8490: 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 56 4f  NDLE(WINAPI*)(VO
84a0: 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 37 34 5d  ID))aSyscall[74]
84b0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
84c0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20  SQLITE_OS_WINRT 
84d0: 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
84e0: 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 0a 20 20 7b  TE_OMIT_WAL).  {
84f0: 20 22 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70   "CreateFileMapp
8500: 69 6e 67 46 72 6f 6d 41 70 70 22 2c 20 28 53 59  ingFromApp", (SY
8510: 53 43 41 4c 4c 29 43 72 65 61 74 65 46 69 6c 65  SCALL)CreateFile
8520: 4d 61 70 70 69 6e 67 46 72 6f 6d 41 70 70 2c 20  MappingFromApp, 
8530: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
8540: 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e  CreateFileMappin
8550: 67 46 72 6f 6d 41 70 70 22 2c 20 28 53 59 53 43  gFromApp", (SYSC
8560: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
8570: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
8580: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
8590: 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70   osCreateFileMap
85a0: 70 69 6e 67 46 72 6f 6d 41 70 70 20 28 28 48 41  pingFromApp ((HA
85b0: 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 48 41  NDLE(WINAPI*)(HA
85c0: 4e 44 4c 45 2c 20 5c 0a 20 20 20 20 20 20 20 20  NDLE, \.        
85d0: 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54 52 49  LPSECURITY_ATTRI
85e0: 42 55 54 45 53 2c 55 4c 4f 4e 47 2c 55 4c 4f 4e  BUTES,ULONG,ULON
85f0: 47 36 34 2c 4c 50 43 57 53 54 52 29 29 61 53 79  G64,LPCWSTR))aSy
8600: 73 63 61 6c 6c 5b 37 35 5d 2e 70 43 75 72 72 65  scall[75].pCurre
8610: 6e 74 29 0a 0a 2f 2a 0a 2a 2a 20 4e 4f 54 45 3a  nt)../*.** NOTE:
8620: 20 4f 6e 20 73 6f 6d 65 20 73 75 62 2d 70 6c 61   On some sub-pla
8630: 74 66 6f 72 6d 73 2c 20 74 68 65 20 49 6e 74 65  tforms, the Inte
8640: 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72 65 45 78  rlockedCompareEx
8650: 63 68 61 6e 67 65 20 22 66 75 6e 63 74 69 6f 6e  change "function
8660: 22 0a 2a 2a 20 20 20 20 20 20 20 69 73 20 72 65  ".**       is re
8670: 61 6c 6c 79 20 6a 75 73 74 20 61 20 6d 61 63 72  ally just a macr
8680: 6f 20 74 68 61 74 20 75 73 65 73 20 61 20 63 6f  o that uses a co
8690: 6d 70 69 6c 65 72 20 69 6e 74 72 69 6e 73 69 63  mpiler intrinsic
86a0: 20 28 65 2e 67 2e 20 78 36 34 29 2e 0a 2a 2a 20   (e.g. x64)..** 
86b0: 20 20 20 20 20 20 53 6f 20 64 6f 20 6e 6f 74 20        So do not 
86c0: 74 72 79 20 74 6f 20 6d 61 6b 65 20 74 68 69 73  try to make this
86d0: 20 69 73 20 69 6e 74 6f 20 61 20 72 65 64 65 66   is into a redef
86e0: 69 6e 61 62 6c 65 20 69 6e 74 65 72 66 61 63 65  inable interface
86f0: 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64  ..*/.#if defined
8700: 28 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70  (InterlockedComp
8710: 61 72 65 45 78 63 68 61 6e 67 65 29 0a 20 20 7b  areExchange).  {
8720: 20 22 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d   "InterlockedCom
8730: 70 61 72 65 45 78 63 68 61 6e 67 65 22 2c 20 28  pareExchange", (
8740: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
8750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
8760: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 49 6e  },..#define osIn
8770: 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72 65  terlockedCompare
8780: 45 78 63 68 61 6e 67 65 20 49 6e 74 65 72 6c 6f  Exchange Interlo
8790: 63 6b 65 64 43 6f 6d 70 61 72 65 45 78 63 68 61  ckedCompareExcha
87a0: 6e 67 65 0a 23 65 6c 73 65 0a 20 20 7b 20 22 49  nge.#else.  { "I
87b0: 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72  nterlockedCompar
87c0: 65 45 78 63 68 61 6e 67 65 22 2c 20 28 53 59 53  eExchange", (SYS
87d0: 43 41 4c 4c 29 49 6e 74 65 72 6c 6f 63 6b 65 64  CALL)Interlocked
87e0: 43 6f 6d 70 61 72 65 45 78 63 68 61 6e 67 65 2c  CompareExchange,
87f0: 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f   0 },..#define o
8800: 73 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70  sInterlockedComp
8810: 61 72 65 45 78 63 68 61 6e 67 65 20 28 28 4c 4f  areExchange ((LO
8820: 4e 47 28 57 49 4e 41 50 49 2a 29 28 4c 4f 4e 47  NG(WINAPI*)(LONG
8830: 20 76 6f 6c 61 74 69 6c 65 2a 2c 20 5c 0a 20 20   volatile*, \.  
8840: 20 20 20 20 20 20 4c 4f 4e 47 2c 4c 4f 4e 47 29        LONG,LONG)
8850: 29 61 53 79 73 63 61 6c 6c 5b 37 36 5d 2e 70 43  )aSyscall[76].pC
8860: 75 72 72 65 6e 74 29 0a 23 65 6e 64 69 66 20 2f  urrent).#endif /
8870: 2a 20 64 65 66 69 6e 65 64 28 49 6e 74 65 72 6c  * defined(Interl
8880: 6f 63 6b 65 64 43 6f 6d 70 61 72 65 45 78 63 68  ockedCompareExch
8890: 61 6e 67 65 29 20 2a 2f 0a 0a 7d 3b 20 2f 2a 20  ange) */..}; /* 
88a0: 45 6e 64 20 6f 66 20 74 68 65 20 6f 76 65 72 72  End of the overr
88b0: 69 64 65 61 62 6c 65 20 73 79 73 74 65 6d 20 63  ideable system c
88c0: 61 6c 6c 73 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  alls */../*.** T
88d0: 68 69 73 20 69 73 20 74 68 65 20 78 53 65 74 53  his is the xSetS
88e0: 79 73 74 65 6d 43 61 6c 6c 28 29 20 6d 65 74 68  ystemCall() meth
88f0: 6f 64 20 6f 66 20 73 71 6c 69 74 65 33 5f 76 66  od of sqlite3_vf
8900: 73 20 66 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65  s for all of the
8910: 0a 2a 2a 20 22 77 69 6e 33 32 22 20 56 46 53 65  .** "win32" VFSe
8920: 73 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  s.  Return SQLIT
8930: 45 5f 4f 4b 20 6f 70 6f 6e 20 73 75 63 63 65 73  E_OK opon succes
8940: 73 66 75 6c 6c 79 20 75 70 64 61 74 69 6e 67 20  sfully updating 
8950: 74 68 65 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61  the.** system ca
8960: 6c 6c 20 70 6f 69 6e 74 65 72 2c 20 6f 72 20 53  ll pointer, or S
8970: 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 69  QLITE_NOTFOUND i
8980: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63 6f  f there is no co
8990: 6e 66 69 67 75 72 61 62 6c 65 0a 2a 2a 20 73 79  nfigurable.** sy
89a0: 73 74 65 6d 20 63 61 6c 6c 20 6e 61 6d 65 64 20  stem call named 
89b0: 7a 4e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  zName..*/.static
89c0: 20 69 6e 74 20 77 69 6e 53 65 74 53 79 73 74 65   int winSetSyste
89d0: 6d 43 61 6c 6c 28 0a 20 20 73 71 6c 69 74 65 33  mCall(.  sqlite3
89e0: 5f 76 66 73 20 2a 70 4e 6f 74 55 73 65 64 2c 20  _vfs *pNotUsed, 
89f0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 46         /* The VF
8a00: 53 20 70 6f 69 6e 74 65 72 2e 20 20 4e 6f 74 20  S pointer.  Not 
8a10: 75 73 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  used */.  const 
8a20: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20  char *zName,    
8a30: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
8a40: 6f 66 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 74  of system call t
8a50: 6f 20 6f 76 65 72 72 69 64 65 20 2a 2f 0a 20 20  o override */.  
8a60: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
8a70: 70 74 72 20 70 4e 65 77 46 75 6e 63 20 20 2f 2a  ptr pNewFunc  /*
8a80: 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20   Pointer to new 
8a90: 73 79 73 74 65 6d 20 63 61 6c 6c 20 76 61 6c 75  system call valu
8aa0: 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e  e */.){.  unsign
8ab0: 65 64 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  ed int i;.  int 
8ac0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 46  rc = SQLITE_NOTF
8ad0: 4f 55 4e 44 3b 0a 0a 20 20 55 4e 55 53 45 44 5f  OUND;..  UNUSED_
8ae0: 50 41 52 41 4d 45 54 45 52 28 70 4e 6f 74 55 73  PARAMETER(pNotUs
8af0: 65 64 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65  ed);.  if( zName
8b00: 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ==0 ){.    /* If
8b10: 20 6e 6f 20 7a 4e 61 6d 65 20 69 73 20 67 69 76   no zName is giv
8b20: 65 6e 2c 20 72 65 73 74 6f 72 65 20 61 6c 6c 20  en, restore all 
8b30: 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 74 6f 20  system calls to 
8b40: 74 68 65 69 72 20 64 65 66 61 75 6c 74 0a 20 20  their default.  
8b50: 20 20 2a 2a 20 73 65 74 74 69 6e 67 73 20 61 6e    ** settings an
8b60: 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 0a 20 20  d return NULL.  
8b70: 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51    */.    rc = SQ
8b80: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 66 6f 72  LITE_OK;.    for
8b90: 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61  (i=0; i<sizeof(a
8ba0: 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28  Syscall)/sizeof(
8bb0: 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b  aSyscall[0]); i+
8bc0: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 53  +){.      if( aS
8bd0: 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75  yscall[i].pDefau
8be0: 6c 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61 53  lt ){.        aS
8bf0: 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65  yscall[i].pCurre
8c00: 6e 74 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d  nt = aSyscall[i]
8c10: 2e 70 44 65 66 61 75 6c 74 3b 0a 20 20 20 20 20  .pDefault;.     
8c20: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
8c30: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 7a 4e 61 6d  {.    /* If zNam
8c40: 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2c 20  e is specified, 
8c50: 6f 70 65 72 61 74 65 20 6f 6e 20 6f 6e 6c 79 20  operate on only 
8c60: 74 68 65 20 6f 6e 65 20 73 79 73 74 65 6d 20 63  the one system c
8c70: 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 70 65 63 69  all.    ** speci
8c80: 66 69 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  fied..    */.   
8c90: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
8ca0: 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a  of(aSyscall)/siz
8cb0: 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29  eof(aSyscall[0])
8cc0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
8cd0: 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20  ( strcmp(zName, 
8ce0: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d  aSyscall[i].zNam
8cf0: 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)==0 ){.       
8d00: 20 69 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d   if( aSyscall[i]
8d10: 2e 70 44 65 66 61 75 6c 74 3d 3d 30 20 29 7b 0a  .pDefault==0 ){.
8d20: 20 20 20 20 20 20 20 20 20 20 61 53 79 73 63 61            aSysca
8d30: 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 20 3d  ll[i].pDefault =
8d40: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75   aSyscall[i].pCu
8d50: 72 72 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 7d  rrent;.        }
8d60: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
8d70: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
8d80: 20 69 66 28 20 70 4e 65 77 46 75 6e 63 3d 3d 30   if( pNewFunc==0
8d90: 20 29 20 70 4e 65 77 46 75 6e 63 20 3d 20 61 53   ) pNewFunc = aS
8da0: 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75  yscall[i].pDefau
8db0: 6c 74 3b 0a 20 20 20 20 20 20 20 20 61 53 79 73  lt;.        aSys
8dc0: 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74  call[i].pCurrent
8dd0: 20 3d 20 70 4e 65 77 46 75 6e 63 3b 0a 20 20 20   = pNewFunc;.   
8de0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8df0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
8e00: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
8e10: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76  .** Return the v
8e20: 61 6c 75 65 20 6f 66 20 61 20 73 79 73 74 65 6d  alue of a system
8e30: 20 63 61 6c 6c 2e 20 20 52 65 74 75 72 6e 20 4e   call.  Return N
8e40: 55 4c 4c 20 69 66 20 7a 4e 61 6d 65 20 69 73 20  ULL if zName is 
8e50: 6e 6f 74 20 61 0a 2a 2a 20 72 65 63 6f 67 6e 69  not a.** recogni
8e60: 7a 65 64 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  zed system call 
8e70: 6e 61 6d 65 2e 20 20 4e 55 4c 4c 20 69 73 20 61  name.  NULL is a
8e80: 6c 73 6f 20 72 65 74 75 72 6e 65 64 20 69 66 20  lso returned if 
8e90: 74 68 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 0a  the system call.
8ea0: 2a 2a 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ** is currently 
8eb0: 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74  undefined..*/.st
8ec0: 61 74 69 63 20 73 71 6c 69 74 65 33 5f 73 79 73  atic sqlite3_sys
8ed0: 63 61 6c 6c 5f 70 74 72 20 77 69 6e 47 65 74 53  call_ptr winGetS
8ee0: 79 73 74 65 6d 43 61 6c 6c 28 0a 20 20 73 71 6c  ystemCall(.  sql
8ef0: 69 74 65 33 5f 76 66 73 20 2a 70 4e 6f 74 55 73  ite3_vfs *pNotUs
8f00: 65 64 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ed,.  const char
8f10: 20 2a 7a 4e 61 6d 65 0a 29 7b 0a 20 20 75 6e 73   *zName.){.  uns
8f20: 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 0a 20 20  igned int i;..  
8f30: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
8f40: 28 70 4e 6f 74 55 73 65 64 29 3b 0a 20 20 66 6f  (pNotUsed);.  fo
8f50: 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28  r(i=0; i<sizeof(
8f60: 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66  aSyscall)/sizeof
8f70: 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69  (aSyscall[0]); i
8f80: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72  ++){.    if( str
8f90: 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63  cmp(zName, aSysc
8fa0: 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  all[i].zName)==0
8fb0: 20 29 20 72 65 74 75 72 6e 20 61 53 79 73 63 61   ) return aSysca
8fc0: 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 3b 0a  ll[i].pCurrent;.
8fd0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
8fe0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
8ff0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
9000: 66 69 72 73 74 20 73 79 73 74 65 6d 20 63 61 6c  first system cal
9010: 6c 20 61 66 74 65 72 20 7a 4e 61 6d 65 2e 20 20  l after zName.  
9020: 49 66 20 7a 4e 61 6d 65 3d 3d 4e 55 4c 4c 0a 2a  If zName==NULL.*
9030: 2a 20 74 68 65 6e 20 72 65 74 75 72 6e 20 74 68  * then return th
9040: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  e name of the fi
9050: 72 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e  rst system call.
9060: 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66    Return NULL if
9070: 20 7a 4e 61 6d 65 0a 2a 2a 20 69 73 20 74 68 65   zName.** is the
9080: 20 6c 61 73 74 20 73 79 73 74 65 6d 20 63 61 6c   last system cal
9090: 6c 20 6f 72 20 69 66 20 7a 4e 61 6d 65 20 69 73  l or if zName is
90a0: 20 6e 6f 74 20 74 68 65 20 6e 61 6d 65 20 6f 66   not the name of
90b0: 20 61 20 76 61 6c 69 64 0a 2a 2a 20 73 79 73 74   a valid.** syst
90c0: 65 6d 20 63 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74  em call..*/.stat
90d0: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 77  ic const char *w
90e0: 69 6e 4e 65 78 74 53 79 73 74 65 6d 43 61 6c 6c  inNextSystemCall
90f0: 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 2c  (sqlite3_vfs *p,
9100: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
9110: 6d 65 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 2d  me){.  int i = -
9120: 31 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  1;..  UNUSED_PAR
9130: 41 4d 45 54 45 52 28 70 29 3b 0a 20 20 69 66 28  AMETER(p);.  if(
9140: 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 66 6f   zName ){.    fo
9150: 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69  r(i=0; i<ArraySi
9160: 7a 65 28 61 53 79 73 63 61 6c 6c 29 2d 31 3b 20  ze(aSyscall)-1; 
9170: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
9180: 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53  strcmp(zName, aS
9190: 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29  yscall[i].zName)
91a0: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
91b0: 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69 2b 2b   }.  }.  for(i++
91c0: 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 53  ; i<ArraySize(aS
91d0: 79 73 63 61 6c 6c 29 3b 20 69 2b 2b 29 7b 0a 20  yscall); i++){. 
91e0: 20 20 20 69 66 28 20 61 53 79 73 63 61 6c 6c 5b     if( aSyscall[
91f0: 69 5d 2e 70 43 75 72 72 65 6e 74 21 3d 30 20 29  i].pCurrent!=0 )
9200: 20 72 65 74 75 72 6e 20 61 53 79 73 63 61 6c 6c   return aSyscall
9210: 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20  [i].zName;.  }. 
9220: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69   return 0;.}..#i
9230: 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  fdef SQLITE_WIN3
9240: 32 5f 4d 41 4c 4c 4f 43 0a 2f 2a 0a 2a 2a 20 49  2_MALLOC./*.** I
9250: 66 20 61 20 57 69 6e 33 32 20 6e 61 74 69 76 65  f a Win32 native
9260: 20 68 65 61 70 20 68 61 73 20 62 65 65 6e 20 63   heap has been c
9270: 6f 6e 66 69 67 75 72 65 64 2c 20 74 68 69 73 20  onfigured, this 
9280: 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 61 74  function will at
9290: 74 65 6d 70 74 20 74 6f 0a 2a 2a 20 63 6f 6d 70  tempt to.** comp
92a0: 61 63 74 20 69 74 2e 20 20 55 70 6f 6e 20 73 75  act it.  Upon su
92b0: 63 63 65 73 73 2c 20 53 51 4c 49 54 45 5f 4f 4b  ccess, SQLITE_OK
92c0: 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65   will be returne
92d0: 64 2e 20 20 55 70 6f 6e 20 66 61 69 6c 75 72 65  d.  Upon failure
92e0: 2c 20 6f 6e 65 0a 2a 2a 20 6f 66 20 53 51 4c 49  , one.** of SQLI
92f0: 54 45 5f 4e 4f 4d 45 4d 2c 20 53 51 4c 49 54 45  TE_NOMEM, SQLITE
9300: 5f 45 52 52 4f 52 2c 20 6f 72 20 53 51 4c 49 54  _ERROR, or SQLIT
9310: 45 5f 4e 4f 54 46 4f 55 4e 44 20 77 69 6c 6c 20  E_NOTFOUND will 
9320: 62 65 20 72 65 74 75 72 6e 65 64 2e 20 20 54 68  be returned.  Th
9330: 65 0a 2a 2a 20 22 70 6e 4c 61 72 67 65 73 74 22  e.** "pnLargest"
9340: 20 61 72 67 75 6d 65 6e 74 2c 20 69 66 20 6e 6f   argument, if no
9350: 6e 2d 7a 65 72 6f 2c 20 77 69 6c 6c 20 62 65 20  n-zero, will be 
9360: 75 73 65 64 20 74 6f 20 72 65 74 75 72 6e 20 74  used to return t
9370: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a  he size of the.*
9380: 2a 20 6c 61 72 67 65 73 74 20 63 6f 6d 6d 69 74  * largest commit
9390: 74 65 64 20 66 72 65 65 20 62 6c 6f 63 6b 20 69  ted free block i
93a0: 6e 20 74 68 65 20 68 65 61 70 2c 20 69 6e 20 62  n the heap, in b
93b0: 79 74 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ytes..*/.int sql
93c0: 69 74 65 33 5f 77 69 6e 33 32 5f 63 6f 6d 70 61  ite3_win32_compa
93d0: 63 74 5f 68 65 61 70 28 4c 50 55 49 4e 54 20 70  ct_heap(LPUINT p
93e0: 6e 4c 61 72 67 65 73 74 29 7b 0a 20 20 69 6e 74  nLargest){.  int
93f0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
9400: 0a 20 20 55 49 4e 54 20 6e 4c 61 72 67 65 73 74  .  UINT nLargest
9410: 20 3d 20 30 3b 0a 20 20 48 41 4e 44 4c 45 20 68   = 0;.  HANDLE h
9420: 48 65 61 70 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41  Heap;..  winMemA
9430: 73 73 65 72 74 4d 61 67 69 63 28 29 3b 0a 20 20  ssertMagic();.  
9440: 68 48 65 61 70 20 3d 20 77 69 6e 4d 65 6d 47 65  hHeap = winMemGe
9450: 74 48 65 61 70 28 29 3b 0a 20 20 61 73 73 65 72  tHeap();.  asser
9460: 74 28 20 68 48 65 61 70 21 3d 30 20 29 3b 0a 20  t( hHeap!=0 );. 
9470: 20 61 73 73 65 72 74 28 20 68 48 65 61 70 21 3d   assert( hHeap!=
9480: 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56  INVALID_HANDLE_V
9490: 41 4c 55 45 20 29 3b 0a 23 69 66 20 21 53 51 4c  ALUE );.#if !SQL
94a0: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20  ITE_OS_WINRT && 
94b0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
94c0: 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49  IN32_MALLOC_VALI
94d0: 44 41 54 45 29 0a 20 20 61 73 73 65 72 74 28 20  DATE).  assert( 
94e0: 6f 73 48 65 61 70 56 61 6c 69 64 61 74 65 28 68  osHeapValidate(h
94f0: 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e  Heap, SQLITE_WIN
9500: 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 4e  32_HEAP_FLAGS, N
9510: 55 4c 4c 29 20 29 3b 0a 23 65 6e 64 69 66 0a 23  ULL) );.#endif.#
9520: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
9530: 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f  NCE && !SQLITE_O
9540: 53 5f 57 49 4e 52 54 0a 20 20 69 66 28 20 28 6e  S_WINRT.  if( (n
9550: 4c 61 72 67 65 73 74 3d 6f 73 48 65 61 70 43 6f  Largest=osHeapCo
9560: 6d 70 61 63 74 28 68 48 65 61 70 2c 20 53 51 4c  mpact(hHeap, SQL
9570: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46  ITE_WIN32_HEAP_F
9580: 4c 41 47 53 29 29 3d 3d 30 20 29 7b 0a 20 20 20  LAGS))==0 ){.   
9590: 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f   DWORD lastErrno
95a0: 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
95b0: 72 28 29 3b 0a 20 20 20 20 69 66 28 20 6c 61 73  r();.    if( las
95c0: 74 45 72 72 6e 6f 3d 3d 4e 4f 5f 45 52 52 4f 52  tErrno==NO_ERROR
95d0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
95e0: 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d  3_log(SQLITE_NOM
95f0: 45 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 48  EM, "failed to H
9600: 65 61 70 43 6f 6d 70 61 63 74 20 28 6e 6f 20 73  eapCompact (no s
9610: 70 61 63 65 29 2c 20 68 65 61 70 3d 25 70 22 2c  pace), heap=%p",
9620: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9630: 20 20 20 28 76 6f 69 64 2a 29 68 48 65 61 70 29     (void*)hHeap)
9640: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
9650: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
9660: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
9670: 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 45  te3_log(SQLITE_E
9680: 52 52 4f 52 2c 20 22 66 61 69 6c 65 64 20 74 6f  RROR, "failed to
9690: 20 48 65 61 70 43 6f 6d 70 61 63 74 20 28 25 6c   HeapCompact (%l
96a0: 75 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20  u), heap=%p",.  
96b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
96c0: 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
96d0: 2c 20 28 76 6f 69 64 2a 29 68 48 65 61 70 29 3b  , (void*)hHeap);
96e0: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
96f0: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  TE_ERROR;.    }.
9700: 20 20 7d 0a 23 65 6c 73 65 0a 20 20 73 71 6c 69    }.#else.  sqli
9710: 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e  te3_log(SQLITE_N
9720: 4f 54 46 4f 55 4e 44 2c 20 22 66 61 69 6c 65 64  OTFOUND, "failed
9730: 20 74 6f 20 48 65 61 70 43 6f 6d 70 61 63 74 2c   to HeapCompact,
9740: 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20 20   heap=%p",.     
9750: 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29           (void*)
9760: 68 48 65 61 70 29 3b 0a 20 20 72 63 20 3d 20 53  hHeap);.  rc = S
9770: 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a  QLITE_NOTFOUND;.
9780: 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 6e 4c  #endif.  if( pnL
9790: 61 72 67 65 73 74 20 29 20 2a 70 6e 4c 61 72 67  argest ) *pnLarg
97a0: 65 73 74 20 3d 20 6e 4c 61 72 67 65 73 74 3b 0a  est = nLargest;.
97b0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
97c0: 2f 2a 0a 2a 2a 20 49 66 20 61 20 57 69 6e 33 32  /*.** If a Win32
97d0: 20 6e 61 74 69 76 65 20 68 65 61 70 20 68 61 73   native heap has
97e0: 20 62 65 65 6e 20 63 6f 6e 66 69 67 75 72 65 64   been configured
97f0: 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
9800: 77 69 6c 6c 20 61 74 74 65 6d 70 74 20 74 6f 0a  will attempt to.
9810: 2a 2a 20 64 65 73 74 72 6f 79 20 61 6e 64 20 72  ** destroy and r
9820: 65 63 72 65 61 74 65 20 69 74 2e 20 20 49 66 20  ecreate it.  If 
9830: 74 68 65 20 57 69 6e 33 32 20 6e 61 74 69 76 65  the Win32 native
9840: 20 68 65 61 70 20 69 73 20 6e 6f 74 20 69 73 6f   heap is not iso
9850: 6c 61 74 65 64 20 61 6e 64 2f 6f 72 0a 2a 2a 20  lated and/or.** 
9860: 74 68 65 20 73 71 6c 69 74 65 33 5f 6d 65 6d 6f  the sqlite3_memo
9870: 72 79 5f 75 73 65 64 28 29 20 66 75 6e 63 74 69  ry_used() functi
9880: 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 72 65 74 75  on does not retu
9890: 72 6e 20 7a 65 72 6f 2c 20 53 51 4c 49 54 45 5f  rn zero, SQLITE_
98a0: 42 55 53 59 20 77 69 6c 6c 0a 2a 2a 20 62 65 20  BUSY will.** be 
98b0: 72 65 74 75 72 6e 65 64 20 61 6e 64 20 6e 6f 20  returned and no 
98c0: 63 68 61 6e 67 65 73 20 77 69 6c 6c 20 62 65 20  changes will be 
98d0: 6d 61 64 65 20 74 6f 20 74 68 65 20 57 69 6e 33  made to the Win3
98e0: 32 20 6e 61 74 69 76 65 20 68 65 61 70 2e 0a 2a  2 native heap..*
98f0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 69  /.int sqlite3_wi
9900: 6e 33 32 5f 72 65 73 65 74 5f 68 65 61 70 28 29  n32_reset_heap()
9910: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 55  {.  int rc;.  MU
9920: 54 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74  TEX_LOGIC( sqlit
9930: 65 33 5f 6d 75 74 65 78 20 2a 70 4d 61 73 74 65  e3_mutex *pMaste
9940: 72 3b 20 29 20 2f 2a 20 54 68 65 20 6d 61 69 6e  r; ) /* The main
9950: 20 73 74 61 74 69 63 20 6d 75 74 65 78 20 2a 2f   static mutex */
9960: 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20  .  MUTEX_LOGIC( 
9970: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 70  sqlite3_mutex *p
9980: 4d 65 6d 3b 20 29 20 20 20 20 2f 2a 20 54 68 65  Mem; )    /* The
9990: 20 6d 65 6d 73 79 73 20 73 74 61 74 69 63 20 6d   memsys static m
99a0: 75 74 65 78 20 2a 2f 0a 20 20 4d 55 54 45 58 5f  utex */.  MUTEX_
99b0: 4c 4f 47 49 43 28 20 70 4d 61 73 74 65 72 20 3d  LOGIC( pMaster =
99c0: 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
99d0: 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
99e0: 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 20  STATIC_MASTER); 
99f0: 29 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28  ).  MUTEX_LOGIC(
9a00: 20 70 4d 65 6d 20 3d 20 73 71 6c 69 74 65 33 4d   pMem = sqlite3M
9a10: 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
9a20: 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 45  _MUTEX_STATIC_ME
9a30: 4d 29 3b 20 29 0a 20 20 73 71 6c 69 74 65 33 5f  M); ).  sqlite3_
9a40: 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 4d 61 73  mutex_enter(pMas
9a50: 74 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ter);.  sqlite3_
9a60: 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 4d 65 6d  mutex_enter(pMem
9a70: 29 3b 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65 72  );.  winMemAsser
9a80: 74 4d 61 67 69 63 28 29 3b 0a 20 20 69 66 28 20  tMagic();.  if( 
9a90: 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 21  winMemGetHeap()!
9aa0: 3d 4e 55 4c 4c 20 26 26 20 77 69 6e 4d 65 6d 47  =NULL && winMemG
9ab0: 65 74 4f 77 6e 65 64 28 29 20 26 26 20 73 71 6c  etOwned() && sql
9ac0: 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 75 73 65 64  ite3_memory_used
9ad0: 28 29 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 0a  ()==0 ){.    /*.
9ae0: 20 20 20 20 2a 2a 20 41 74 20 74 68 69 73 20 70      ** At this p
9af0: 6f 69 6e 74 2c 20 74 68 65 72 65 20 73 68 6f 75  oint, there shou
9b00: 6c 64 20 62 65 20 6e 6f 20 6f 75 74 73 74 61 6e  ld be no outstan
9b10: 64 69 6e 67 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  ding memory allo
9b20: 63 61 74 69 6f 6e 73 20 6f 6e 0a 20 20 20 20 2a  cations on.    *
9b30: 2a 20 74 68 65 20 68 65 61 70 2e 20 20 41 6c 73  * the heap.  Als
9b40: 6f 2c 20 73 69 6e 63 65 20 62 6f 74 68 20 74 68  o, since both th
9b50: 65 20 6d 61 73 74 65 72 20 61 6e 64 20 6d 65 6d  e master and mem
9b60: 73 79 73 20 6c 6f 63 6b 73 20 61 72 65 20 63 75  sys locks are cu
9b70: 72 72 65 6e 74 6c 79 0a 20 20 20 20 2a 2a 20 62  rrently.    ** b
9b80: 65 69 6e 67 20 68 65 6c 64 20 62 79 20 75 73 2c  eing held by us,
9b90: 20 6e 6f 20 6f 74 68 65 72 20 66 75 6e 63 74 69   no other functi
9ba0: 6f 6e 20 28 69 2e 65 2e 20 66 72 6f 6d 20 61 6e  on (i.e. from an
9bb0: 6f 74 68 65 72 20 74 68 72 65 61 64 29 20 73 68  other thread) sh
9bc0: 6f 75 6c 64 0a 20 20 20 20 2a 2a 20 62 65 20 61  ould.    ** be a
9bd0: 62 6c 65 20 74 6f 20 65 76 65 6e 20 61 63 63 65  ble to even acce
9be0: 73 73 20 74 68 65 20 68 65 61 70 2e 20 20 41 74  ss the heap.  At
9bf0: 74 65 6d 70 74 20 74 6f 20 64 65 73 74 72 6f 79  tempt to destroy
9c00: 20 61 6e 64 20 72 65 63 72 65 61 74 65 20 6f 75   and recreate ou
9c10: 72 0a 20 20 20 20 2a 2a 20 69 73 6f 6c 61 74 65  r.    ** isolate
9c20: 64 20 57 69 6e 33 32 20 6e 61 74 69 76 65 20 68  d Win32 native h
9c30: 65 61 70 20 6e 6f 77 2e 0a 20 20 20 20 2a 2f 0a  eap now..    */.
9c40: 20 20 20 20 61 73 73 65 72 74 28 20 77 69 6e 4d      assert( winM
9c50: 65 6d 47 65 74 48 65 61 70 28 29 21 3d 4e 55 4c  emGetHeap()!=NUL
9c60: 4c 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  L );.    assert(
9c70: 20 77 69 6e 4d 65 6d 47 65 74 4f 77 6e 65 64 28   winMemGetOwned(
9c80: 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
9c90: 20 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f   sqlite3_memory_
9ca0: 75 73 65 64 28 29 3d 3d 30 20 29 3b 0a 20 20 20  used()==0 );.   
9cb0: 20 77 69 6e 4d 65 6d 53 68 75 74 64 6f 77 6e 28   winMemShutdown(
9cc0: 77 69 6e 4d 65 6d 47 65 74 44 61 74 61 50 74 72  winMemGetDataPtr
9cd0: 28 29 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ());.    assert(
9ce0: 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29   winMemGetHeap()
9cf0: 3d 3d 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 61 73  ==NULL );.    as
9d00: 73 65 72 74 28 20 21 77 69 6e 4d 65 6d 47 65 74  sert( !winMemGet
9d10: 4f 77 6e 65 64 28 29 20 29 3b 0a 20 20 20 20 61  Owned() );.    a
9d20: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
9d30: 65 6d 6f 72 79 5f 75 73 65 64 28 29 3d 3d 30 20  emory_used()==0 
9d40: 29 3b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4d  );.    rc = winM
9d50: 65 6d 49 6e 69 74 28 77 69 6e 4d 65 6d 47 65 74  emInit(winMemGet
9d60: 44 61 74 61 50 74 72 28 29 29 3b 0a 20 20 20 20  DataPtr());.    
9d70: 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
9d80: 54 45 5f 4f 4b 20 7c 7c 20 77 69 6e 4d 65 6d 47  TE_OK || winMemG
9d90: 65 74 48 65 61 70 28 29 21 3d 4e 55 4c 4c 20 29  etHeap()!=NULL )
9da0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  ;.    assert( rc
9db0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 77  !=SQLITE_OK || w
9dc0: 69 6e 4d 65 6d 47 65 74 4f 77 6e 65 64 28 29 20  inMemGetOwned() 
9dd0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
9de0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
9df0: 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 75  sqlite3_memory_u
9e00: 73 65 64 28 29 3d 3d 30 20 29 3b 0a 20 20 7d 65  sed()==0 );.  }e
9e10: 6c 73 65 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20  lse{.    /*.    
9e20: 2a 2a 20 54 68 65 20 57 69 6e 33 32 20 6e 61 74  ** The Win32 nat
9e30: 69 76 65 20 68 65 61 70 20 63 61 6e 6e 6f 74 20  ive heap cannot 
9e40: 62 65 20 6d 6f 64 69 66 69 65 64 20 62 65 63 61  be modified beca
9e50: 75 73 65 20 69 74 20 6d 61 79 20 62 65 20 69 6e  use it may be in
9e60: 20 75 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   use..    */.   
9e70: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
9e80: 59 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  Y;.  }.  sqlite3
9e90: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 65  _mutex_leave(pMe
9ea0: 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  m);.  sqlite3_mu
9eb0: 74 65 78 5f 6c 65 61 76 65 28 70 4d 61 73 74 65  tex_leave(pMaste
9ec0: 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  r);.  return rc;
9ed0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
9ee0: 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43  ITE_WIN32_MALLOC
9ef0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20   */../*.** This 
9f00: 66 75 6e 63 74 69 6f 6e 20 6f 75 74 70 75 74 73  function outputs
9f10: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 28   the specified (
9f20: 41 4e 53 49 29 20 73 74 72 69 6e 67 20 74 6f 20  ANSI) string to 
9f30: 74 68 65 20 57 69 6e 33 32 20 64 65 62 75 67 67  the Win32 debugg
9f40: 65 72 0a 2a 2a 20 28 69 66 20 61 76 61 69 6c 61  er.** (if availa
9f50: 62 6c 65 29 2e 0a 2a 2f 0a 0a 76 6f 69 64 20 73  ble)..*/..void s
9f60: 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 77 72 69  qlite3_win32_wri
9f70: 74 65 5f 64 65 62 75 67 28 63 6f 6e 73 74 20 63  te_debug(const c
9f80: 68 61 72 20 2a 7a 42 75 66 2c 20 69 6e 74 20 6e  har *zBuf, int n
9f90: 42 75 66 29 7b 0a 20 20 63 68 61 72 20 7a 44 62  Buf){.  char zDb
9fa0: 67 42 75 66 5b 53 51 4c 49 54 45 5f 57 49 4e 33  gBuf[SQLITE_WIN3
9fb0: 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 5d 3b  2_DBG_BUF_SIZE];
9fc0: 0a 20 20 69 6e 74 20 6e 4d 69 6e 20 3d 20 4d 49  .  int nMin = MI
9fd0: 4e 28 6e 42 75 66 2c 20 28 53 51 4c 49 54 45 5f  N(nBuf, (SQLITE_
9fe0: 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49  WIN32_DBG_BUF_SI
9ff0: 5a 45 20 2d 20 31 29 29 3b 20 2f 2a 20 6d 61 79  ZE - 1)); /* may
a000: 20 62 65 20 6e 65 67 61 74 69 76 65 2e 20 2a 2f   be negative. */
a010: 0a 20 20 69 66 28 20 6e 4d 69 6e 3c 2d 31 20 29  .  if( nMin<-1 )
a020: 20 6e 4d 69 6e 20 3d 20 2d 31 3b 20 2f 2a 20 61   nMin = -1; /* a
a030: 6c 6c 20 6e 65 67 61 74 69 76 65 20 76 61 6c 75  ll negative valu
a040: 65 73 20 62 65 63 6f 6d 65 20 2d 31 2e 20 2a 2f  es become -1. */
a050: 0a 20 20 61 73 73 65 72 74 28 20 6e 4d 69 6e 3d  .  assert( nMin=
a060: 3d 2d 31 20 7c 7c 20 6e 4d 69 6e 3d 3d 30 20 7c  =-1 || nMin==0 |
a070: 7c 20 6e 4d 69 6e 3c 53 51 4c 49 54 45 5f 57 49  | nMin<SQLITE_WI
a080: 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45  N32_DBG_BUF_SIZE
a090: 20 29 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28   );.#if defined(
a0a0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
a0b0: 5f 41 4e 53 49 29 0a 20 20 69 66 28 20 6e 4d 69  _ANSI).  if( nMi
a0c0: 6e 3e 30 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65  n>0 ){.    memse
a0d0: 74 28 7a 44 62 67 42 75 66 2c 20 30 2c 20 53 51  t(zDbgBuf, 0, SQ
a0e0: 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42  LITE_WIN32_DBG_B
a0f0: 55 46 5f 53 49 5a 45 29 3b 0a 20 20 20 20 6d 65  UF_SIZE);.    me
a100: 6d 63 70 79 28 7a 44 62 67 42 75 66 2c 20 7a 42  mcpy(zDbgBuf, zB
a110: 75 66 2c 20 6e 4d 69 6e 29 3b 0a 20 20 20 20 6f  uf, nMin);.    o
a120: 73 4f 75 74 70 75 74 44 65 62 75 67 53 74 72 69  sOutputDebugStri
a130: 6e 67 41 28 7a 44 62 67 42 75 66 29 3b 0a 20 20  ngA(zDbgBuf);.  
a140: 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 73 4f 75 74  }else{.    osOut
a150: 70 75 74 44 65 62 75 67 53 74 72 69 6e 67 41 28  putDebugStringA(
a160: 7a 42 75 66 29 3b 0a 20 20 7d 0a 23 65 6c 69 66  zBuf);.  }.#elif
a170: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
a180: 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a  WIN32_HAS_WIDE).
a190: 20 20 6d 65 6d 73 65 74 28 7a 44 62 67 42 75 66    memset(zDbgBuf
a1a0: 2c 20 30 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33  , 0, SQLITE_WIN3
a1b0: 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 29 3b  2_DBG_BUF_SIZE);
a1c0: 0a 20 20 69 66 20 28 20 6f 73 4d 75 6c 74 69 42  .  if ( osMultiB
a1d0: 79 74 65 54 6f 57 69 64 65 43 68 61 72 28 0a 20  yteToWideChar(. 
a1e0: 20 20 20 20 20 20 20 20 20 6f 73 41 72 65 46 69           osAreFi
a1f0: 6c 65 41 70 69 73 41 4e 53 49 28 29 20 3f 20 43  leApisANSI() ? C
a200: 50 5f 41 43 50 20 3a 20 43 50 5f 4f 45 4d 43 50  P_ACP : CP_OEMCP
a210: 2c 20 30 2c 20 7a 42 75 66 2c 0a 20 20 20 20 20  , 0, zBuf,.     
a220: 20 20 20 20 20 6e 4d 69 6e 2c 20 28 4c 50 57 53       nMin, (LPWS
a230: 54 52 29 7a 44 62 67 42 75 66 2c 20 53 51 4c 49  TR)zDbgBuf, SQLI
a240: 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46  TE_WIN32_DBG_BUF
a250: 5f 53 49 5a 45 2f 73 69 7a 65 6f 66 28 57 43 48  _SIZE/sizeof(WCH
a260: 41 52 29 29 3c 3d 30 20 29 7b 0a 20 20 20 20 72  AR))<=0 ){.    r
a270: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6f 73 4f  eturn;.  }.  osO
a280: 75 74 70 75 74 44 65 62 75 67 53 74 72 69 6e 67  utputDebugString
a290: 57 28 28 4c 50 43 57 53 54 52 29 7a 44 62 67 42  W((LPCWSTR)zDbgB
a2a0: 75 66 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28  uf);.#else.  if(
a2b0: 20 6e 4d 69 6e 3e 30 20 29 7b 0a 20 20 20 20 6d   nMin>0 ){.    m
a2c0: 65 6d 73 65 74 28 7a 44 62 67 42 75 66 2c 20 30  emset(zDbgBuf, 0
a2d0: 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44  , SQLITE_WIN32_D
a2e0: 42 47 5f 42 55 46 5f 53 49 5a 45 29 3b 0a 20 20  BG_BUF_SIZE);.  
a2f0: 20 20 6d 65 6d 63 70 79 28 7a 44 62 67 42 75 66    memcpy(zDbgBuf
a300: 2c 20 7a 42 75 66 2c 20 6e 4d 69 6e 29 3b 0a 20  , zBuf, nMin);. 
a310: 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
a320: 72 2c 20 22 25 73 22 2c 20 7a 44 62 67 42 75 66  r, "%s", zDbgBuf
a330: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
a340: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
a350: 22 25 73 22 2c 20 7a 42 75 66 29 3b 0a 20 20 7d  "%s", zBuf);.  }
a360: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
a370: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72   The following r
a380: 6f 75 74 69 6e 65 20 73 75 73 70 65 6e 64 73 20  outine suspends 
a390: 74 68 65 20 63 75 72 72 65 6e 74 20 74 68 72 65  the current thre
a3a0: 61 64 20 66 6f 72 20 61 74 20 6c 65 61 73 74 20  ad for at least 
a3b0: 6d 73 0a 2a 2a 20 6d 69 6c 6c 69 73 65 63 6f 6e  ms.** millisecon
a3c0: 64 73 2e 20 20 54 68 69 73 20 69 73 20 65 71 75  ds.  This is equ
a3d0: 69 76 61 6c 65 6e 74 20 74 6f 20 74 68 65 20 57  ivalent to the W
a3e0: 69 6e 33 32 20 53 6c 65 65 70 28 29 20 69 6e 74  in32 Sleep() int
a3f0: 65 72 66 61 63 65 2e 0a 2a 2f 0a 23 69 66 20 53  erface..*/.#if S
a400: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 73  QLITE_OS_WINRT.s
a410: 74 61 74 69 63 20 48 41 4e 44 4c 45 20 73 6c 65  tatic HANDLE sle
a420: 65 70 4f 62 6a 20 3d 20 4e 55 4c 4c 3b 0a 23 65  epObj = NULL;.#e
a430: 6e 64 69 66 0a 0a 76 6f 69 64 20 73 71 6c 69 74  ndif..void sqlit
a440: 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28 44  e3_win32_sleep(D
a450: 57 4f 52 44 20 6d 69 6c 6c 69 73 65 63 6f 6e 64  WORD millisecond
a460: 73 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  s){.#if SQLITE_O
a470: 53 5f 57 49 4e 52 54 0a 20 20 69 66 20 28 20 73  S_WINRT.  if ( s
a480: 6c 65 65 70 4f 62 6a 3d 3d 4e 55 4c 4c 20 29 7b  leepObj==NULL ){
a490: 0a 20 20 20 20 73 6c 65 65 70 4f 62 6a 20 3d 20  .    sleepObj = 
a4a0: 6f 73 43 72 65 61 74 65 45 76 65 6e 74 45 78 57  osCreateEventExW
a4b0: 28 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 43 52 45  (NULL, NULL, CRE
a4c0: 41 54 45 5f 45 56 45 4e 54 5f 4d 41 4e 55 41 4c  ATE_EVENT_MANUAL
a4d0: 5f 52 45 53 45 54 2c 0a 20 20 20 20 20 20 20 20  _RESET,.        
a4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a4f0: 20 20 20 20 20 20 20 20 53 59 4e 43 48 52 4f 4e          SYNCHRON
a500: 49 5a 45 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  IZE);.  }.  asse
a510: 72 74 28 20 73 6c 65 65 70 4f 62 6a 21 3d 4e 55  rt( sleepObj!=NU
a520: 4c 4c 20 29 3b 0a 20 20 6f 73 57 61 69 74 46 6f  LL );.  osWaitFo
a530: 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 45 78 28  rSingleObjectEx(
a540: 73 6c 65 65 70 4f 62 6a 2c 20 6d 69 6c 6c 69 73  sleepObj, millis
a550: 65 63 6f 6e 64 73 2c 20 46 41 4c 53 45 29 3b 0a  econds, FALSE);.
a560: 23 65 6c 73 65 0a 20 20 6f 73 53 6c 65 65 70 28  #else.  osSleep(
a570: 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 29 3b 0a 23  milliseconds);.#
a580: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  endif.}../*.** R
a590: 65 74 75 72 6e 20 74 72 75 65 20 28 6e 6f 6e 2d  eturn true (non-
a5a0: 7a 65 72 6f 29 20 69 66 20 77 65 20 61 72 65 20  zero) if we are 
a5b0: 72 75 6e 6e 69 6e 67 20 75 6e 64 65 72 20 57 69  running under Wi
a5c0: 6e 4e 54 2c 20 57 69 6e 32 4b 2c 20 57 69 6e 58  nNT, Win2K, WinX
a5d0: 50 2c 0a 2a 2a 20 6f 72 20 57 69 6e 43 45 2e 20  P,.** or WinCE. 
a5e0: 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20 28 7a   Return false (z
a5f0: 65 72 6f 29 20 66 6f 72 20 57 69 6e 39 35 2c 20  ero) for Win95, 
a600: 57 69 6e 39 38 2c 20 6f 72 20 57 69 6e 4d 45 2e  Win98, or WinME.
a610: 0a 2a 2a 0a 2a 2a 20 48 65 72 65 20 69 73 20 61  .**.** Here is a
a620: 6e 20 69 6e 74 65 72 65 73 74 69 6e 67 20 6f 62  n interesting ob
a630: 73 65 72 76 61 74 69 6f 6e 3a 20 20 57 69 6e 39  servation:  Win9
a640: 35 2c 20 57 69 6e 39 38 2c 20 61 6e 64 20 57 69  5, Win98, and Wi
a650: 6e 4d 45 20 6c 61 63 6b 0a 2a 2a 20 74 68 65 20  nME lack.** the 
a660: 4c 6f 63 6b 46 69 6c 65 45 78 28 29 20 41 50 49  LockFileEx() API
a670: 2e 20 20 42 75 74 20 77 65 20 63 61 6e 20 73 74  .  But we can st
a680: 69 6c 6c 20 73 74 61 74 69 63 61 6c 6c 79 20 6c  ill statically l
a690: 69 6e 6b 20 61 67 61 69 6e 73 74 20 74 68 61 74  ink against that
a6a0: 0a 2a 2a 20 41 50 49 20 61 73 20 6c 6f 6e 67 20  .** API as long 
a6b0: 61 73 20 77 65 20 64 6f 6e 27 74 20 63 61 6c 6c  as we don't call
a6c0: 20 69 74 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67   it when running
a6d0: 20 57 69 6e 39 35 2f 39 38 2f 4d 45 2e 20 20 41   Win95/98/ME.  A
a6e0: 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 74 68 69 73   call to.** this
a6f0: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
a700: 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66   to determine if
a710: 20 74 68 65 20 68 6f 73 74 20 69 73 20 57 69 6e   the host is Win
a720: 39 35 2f 39 38 2f 4d 45 20 6f 72 0a 2a 2a 20 57  95/98/ME or.** W
a730: 69 6e 4e 54 2f 32 4b 2f 58 50 20 73 6f 20 74 68  inNT/2K/XP so th
a740: 61 74 20 77 65 20 77 69 6c 6c 20 6b 6e 6f 77 20  at we will know 
a750: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 77  whether or not w
a760: 65 20 63 61 6e 20 73 61 66 65 6c 79 20 63 61 6c  e can safely cal
a770: 6c 0a 2a 2a 20 74 68 65 20 4c 6f 63 6b 46 69 6c  l.** the LockFil
a780: 65 45 78 28 29 20 41 50 49 2e 0a 2a 2f 0a 0a 23  eEx() API..*/..#
a790: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
a7a0: 54 45 5f 57 49 4e 33 32 5f 47 45 54 56 45 52 53  TE_WIN32_GETVERS
a7b0: 49 4f 4e 45 58 29 20 7c 7c 20 21 53 51 4c 49 54  IONEX) || !SQLIT
a7c0: 45 5f 57 49 4e 33 32 5f 47 45 54 56 45 52 53 49  E_WIN32_GETVERSI
a7d0: 4f 4e 45 58 0a 23 20 64 65 66 69 6e 65 20 6f 73  ONEX.# define os
a7e0: 49 73 4e 54 28 29 20 20 28 31 29 0a 23 65 6c 69  IsNT()  (1).#eli
a7f0: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
a800: 45 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57  E || SQLITE_OS_W
a810: 49 4e 52 54 20 7c 7c 20 21 64 65 66 69 6e 65 64  INRT || !defined
a820: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
a830: 53 5f 41 4e 53 49 29 0a 23 20 64 65 66 69 6e 65  S_ANSI).# define
a840: 20 6f 73 49 73 4e 54 28 29 20 20 28 31 29 0a 23   osIsNT()  (1).#
a850: 65 6c 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  elif !defined(SQ
a860: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57  LITE_WIN32_HAS_W
a870: 49 44 45 29 0a 23 20 64 65 66 69 6e 65 20 6f 73  IDE).# define os
a880: 49 73 4e 54 28 29 20 20 28 30 29 0a 23 65 6c 73  IsNT()  (0).#els
a890: 65 0a 23 20 64 65 66 69 6e 65 20 6f 73 49 73 4e  e.# define osIsN
a8a0: 54 28 29 20 20 28 28 73 71 6c 69 74 65 33 5f 6f  T()  ((sqlite3_o
a8b0: 73 5f 74 79 70 65 3d 3d 32 29 20 7c 7c 20 73 71  s_type==2) || sq
a8c0: 6c 69 74 65 33 5f 77 69 6e 33 32 5f 69 73 5f 6e  lite3_win32_is_n
a8d0: 74 28 29 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  t()).#endif../*.
a8e0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
a8f0: 20 64 65 74 65 72 6d 69 6e 65 73 20 69 66 20 74   determines if t
a900: 68 65 20 6d 61 63 68 69 6e 65 20 69 73 20 72 75  he machine is ru
a910: 6e 6e 69 6e 67 20 61 20 76 65 72 73 69 6f 6e 20  nning a version 
a920: 6f 66 20 57 69 6e 64 6f 77 73 0a 2a 2a 20 62 61  of Windows.** ba
a930: 73 65 64 20 6f 6e 20 74 68 65 20 4e 54 20 6b 65  sed on the NT ke
a940: 72 6e 65 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rnel..*/.int sql
a950: 69 74 65 33 5f 77 69 6e 33 32 5f 69 73 5f 6e 74  ite3_win32_is_nt
a960: 28 76 6f 69 64 29 7b 0a 23 69 66 20 64 65 66 69  (void){.#if defi
a970: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
a980: 5f 47 45 54 56 45 52 53 49 4f 4e 45 58 29 20 26  _GETVERSIONEX) &
a990: 26 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 47  & SQLITE_WIN32_G
a9a0: 45 54 56 45 52 53 49 4f 4e 45 58 0a 20 20 69 66  ETVERSIONEX.  if
a9b0: 28 20 6f 73 49 6e 74 65 72 6c 6f 63 6b 65 64 43  ( osInterlockedC
a9c0: 6f 6d 70 61 72 65 45 78 63 68 61 6e 67 65 28 26  ompareExchange(&
a9d0: 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 2c  sqlite3_os_type,
a9e0: 20 30 2c 20 30 29 3d 3d 30 20 29 7b 0a 23 69 66   0, 0)==0 ){.#if
a9f0: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
aa00: 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  T && defined(SQL
aa10: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
aa20: 44 45 29 20 26 26 20 5c 0a 20 20 20 20 20 20 20  DE) && \.       
aa30: 20 64 65 66 69 6e 65 64 28 4e 54 44 44 49 5f 56   defined(NTDDI_V
aa40: 45 52 53 49 4f 4e 29 20 26 26 20 4e 54 44 44 49  ERSION) && NTDDI
aa50: 5f 56 45 52 53 49 4f 4e 20 3e 3d 20 4e 54 44 44  _VERSION >= NTDD
aa60: 49 5f 57 49 4e 38 0a 20 20 20 20 4f 53 56 45 52  I_WIN8.    OSVER
aa70: 53 49 4f 4e 49 4e 46 4f 57 20 73 49 6e 66 6f 3b  SIONINFOW sInfo;
aa80: 0a 20 20 20 20 73 49 6e 66 6f 2e 64 77 4f 53 56  .    sInfo.dwOSV
aa90: 65 72 73 69 6f 6e 49 6e 66 6f 53 69 7a 65 20 3d  ersionInfoSize =
aaa0: 20 73 69 7a 65 6f 66 28 73 49 6e 66 6f 29 3b 0a   sizeof(sInfo);.
aab0: 20 20 20 20 6f 73 47 65 74 56 65 72 73 69 6f 6e      osGetVersion
aac0: 45 78 57 28 26 73 49 6e 66 6f 29 3b 0a 23 65 6c  ExW(&sInfo);.#el
aad0: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
aae0: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
aaf0: 29 0a 20 20 20 20 4f 53 56 45 52 53 49 4f 4e 49  ).    OSVERSIONI
ab00: 4e 46 4f 41 20 73 49 6e 66 6f 3b 0a 20 20 20 20  NFOA sInfo;.    
ab10: 73 49 6e 66 6f 2e 64 77 4f 53 56 65 72 73 69 6f  sInfo.dwOSVersio
ab20: 6e 49 6e 66 6f 53 69 7a 65 20 3d 20 73 69 7a 65  nInfoSize = size
ab30: 6f 66 28 73 49 6e 66 6f 29 3b 0a 20 20 20 20 6f  of(sInfo);.    o
ab40: 73 47 65 74 56 65 72 73 69 6f 6e 45 78 41 28 26  sGetVersionExA(&
ab50: 73 49 6e 66 6f 29 3b 0a 23 65 6e 64 69 66 0a 20  sInfo);.#endif. 
ab60: 20 20 20 6f 73 49 6e 74 65 72 6c 6f 63 6b 65 64     osInterlocked
ab70: 43 6f 6d 70 61 72 65 45 78 63 68 61 6e 67 65 28  CompareExchange(
ab80: 26 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65  &sqlite3_os_type
ab90: 2c 0a 20 20 20 20 20 20 20 20 28 73 49 6e 66 6f  ,.        (sInfo
aba0: 2e 64 77 50 6c 61 74 66 6f 72 6d 49 64 20 3d 3d  .dwPlatformId ==
abb0: 20 56 45 52 5f 50 4c 41 54 46 4f 52 4d 5f 57 49   VER_PLATFORM_WI
abc0: 4e 33 32 5f 4e 54 29 20 3f 20 32 20 3a 20 31 2c  N32_NT) ? 2 : 1,
abd0: 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   0);.  }.  retur
abe0: 6e 20 6f 73 49 6e 74 65 72 6c 6f 63 6b 65 64 43  n osInterlockedC
abf0: 6f 6d 70 61 72 65 45 78 63 68 61 6e 67 65 28 26  ompareExchange(&
ac00: 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 2c  sqlite3_os_type,
ac10: 20 32 2c 20 32 29 3d 3d 32 3b 0a 23 65 6c 73 65   2, 2)==2;.#else
ac20: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e  .  return 1;.#en
ac30: 64 69 66 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  dif.}..#ifdef SQ
ac40: 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f  LITE_WIN32_MALLO
ac50: 43 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  C./*.** Allocate
ac60: 20 6e 42 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72   nBytes of memor
ac70: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  y..*/.static voi
ac80: 64 20 2a 77 69 6e 4d 65 6d 4d 61 6c 6c 6f 63 28  d *winMemMalloc(
ac90: 69 6e 74 20 6e 42 79 74 65 73 29 7b 0a 20 20 48  int nBytes){.  H
aca0: 41 4e 44 4c 45 20 68 48 65 61 70 3b 0a 20 20 76  ANDLE hHeap;.  v
acb0: 6f 69 64 20 2a 70 3b 0a 0a 20 20 77 69 6e 4d 65  oid *p;..  winMe
acc0: 6d 41 73 73 65 72 74 4d 61 67 69 63 28 29 3b 0a  mAssertMagic();.
acd0: 20 20 68 48 65 61 70 20 3d 20 77 69 6e 4d 65 6d    hHeap = winMem
ace0: 47 65 74 48 65 61 70 28 29 3b 0a 20 20 61 73 73  GetHeap();.  ass
acf0: 65 72 74 28 20 68 48 65 61 70 21 3d 30 20 29 3b  ert( hHeap!=0 );
ad00: 0a 20 20 61 73 73 65 72 74 28 20 68 48 65 61 70  .  assert( hHeap
ad10: 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  !=INVALID_HANDLE
ad20: 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66 20 21 53  _VALUE );.#if !S
ad30: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26  QLITE_OS_WINRT &
ad40: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
ad50: 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41  _WIN32_MALLOC_VA
ad60: 4c 49 44 41 54 45 29 0a 20 20 61 73 73 65 72 74  LIDATE).  assert
ad70: 28 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74 65  ( osHeapValidate
ad80: 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57  (hHeap, SQLITE_W
ad90: 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c  IN32_HEAP_FLAGS,
ada0: 20 4e 55 4c 4c 29 20 29 3b 0a 23 65 6e 64 69 66   NULL) );.#endif
adb0: 0a 20 20 61 73 73 65 72 74 28 20 6e 42 79 74 65  .  assert( nByte
adc0: 73 3e 3d 30 20 29 3b 0a 20 20 70 20 3d 20 6f 73  s>=0 );.  p = os
add0: 48 65 61 70 41 6c 6c 6f 63 28 68 48 65 61 70 2c  HeapAlloc(hHeap,
ade0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
adf0: 41 50 5f 46 4c 41 47 53 2c 20 28 53 49 5a 45 5f  AP_FLAGS, (SIZE_
ae00: 54 29 6e 42 79 74 65 73 29 3b 0a 20 20 69 66 28  T)nBytes);.  if(
ae10: 20 21 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74   !p ){.    sqlit
ae20: 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f  e3_log(SQLITE_NO
ae30: 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f 20  MEM, "failed to 
ae40: 48 65 61 70 41 6c 6c 6f 63 20 25 75 20 62 79 74  HeapAlloc %u byt
ae50: 65 73 20 28 25 6c 75 29 2c 20 68 65 61 70 3d 25  es (%lu), heap=%
ae60: 70 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  p",.            
ae70: 20 20 20 20 6e 42 79 74 65 73 2c 20 6f 73 47 65      nBytes, osGe
ae80: 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 28 76  tLastError(), (v
ae90: 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a 20 20 7d  oid*)hHeap);.  }
aea0: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
aeb0: 2f 2a 0a 2a 2a 20 46 72 65 65 20 6d 65 6d 6f 72  /*.** Free memor
aec0: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  y..*/.static voi
aed0: 64 20 77 69 6e 4d 65 6d 46 72 65 65 28 76 6f 69  d winMemFree(voi
aee0: 64 20 2a 70 50 72 69 6f 72 29 7b 0a 20 20 48 41  d *pPrior){.  HA
aef0: 4e 44 4c 45 20 68 48 65 61 70 3b 0a 0a 20 20 77  NDLE hHeap;..  w
af00: 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63  inMemAssertMagic
af10: 28 29 3b 0a 20 20 68 48 65 61 70 20 3d 20 77 69  ();.  hHeap = wi
af20: 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 3b 0a 20  nMemGetHeap();. 
af30: 20 61 73 73 65 72 74 28 20 68 48 65 61 70 21 3d   assert( hHeap!=
af40: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68  0 );.  assert( h
af50: 48 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41  Heap!=INVALID_HA
af60: 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69  NDLE_VALUE );.#i
af70: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
af80: 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  RT && defined(SQ
af90: 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f  LITE_WIN32_MALLO
afa0: 43 5f 56 41 4c 49 44 41 54 45 29 0a 20 20 61 73  C_VALIDATE).  as
afb0: 73 65 72 74 28 20 6f 73 48 65 61 70 56 61 6c 69  sert( osHeapVali
afc0: 64 61 74 65 28 68 48 65 61 70 2c 20 53 51 4c 49  date(hHeap, SQLI
afd0: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c  TE_WIN32_HEAP_FL
afe0: 41 47 53 2c 20 70 50 72 69 6f 72 29 20 29 3b 0a  AGS, pPrior) );.
aff0: 23 65 6e 64 69 66 0a 20 20 69 66 28 20 21 70 50  #endif.  if( !pP
b000: 72 69 6f 72 20 29 20 72 65 74 75 72 6e 3b 20 2f  rior ) return; /
b010: 2a 20 50 61 73 73 69 6e 67 20 4e 55 4c 4c 20 74  * Passing NULL t
b020: 6f 20 48 65 61 70 46 72 65 65 20 69 73 20 75 6e  o HeapFree is un
b030: 64 65 66 69 6e 65 64 2e 20 2a 2f 0a 20 20 69 66  defined. */.  if
b040: 28 20 21 6f 73 48 65 61 70 46 72 65 65 28 68 48  ( !osHeapFree(hH
b050: 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33  eap, SQLITE_WIN3
b060: 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 70 50  2_HEAP_FLAGS, pP
b070: 72 69 6f 72 29 20 29 7b 0a 20 20 20 20 73 71 6c  rior) ){.    sql
b080: 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
b090: 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20 74  NOMEM, "failed t
b0a0: 6f 20 48 65 61 70 46 72 65 65 20 62 6c 6f 63 6b  o HeapFree block
b0b0: 20 25 70 20 28 25 6c 75 29 2c 20 68 65 61 70 3d   %p (%lu), heap=
b0c0: 25 70 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %p",.           
b0d0: 20 20 20 20 20 70 50 72 69 6f 72 2c 20 6f 73 47       pPrior, osG
b0e0: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 28  etLastError(), (
b0f0: 76 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a 20 20  void*)hHeap);.  
b100: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  }.}../*.** Chang
b110: 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61 6e  e the size of an
b120: 20 65 78 69 73 74 69 6e 67 20 6d 65 6d 6f 72 79   existing memory
b130: 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 73   allocation.*/.s
b140: 74 61 74 69 63 20 76 6f 69 64 20 2a 77 69 6e 4d  tatic void *winM
b150: 65 6d 52 65 61 6c 6c 6f 63 28 76 6f 69 64 20 2a  emRealloc(void *
b160: 70 50 72 69 6f 72 2c 20 69 6e 74 20 6e 42 79 74  pPrior, int nByt
b170: 65 73 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 48  es){.  HANDLE hH
b180: 65 61 70 3b 0a 20 20 76 6f 69 64 20 2a 70 3b 0a  eap;.  void *p;.
b190: 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d  .  winMemAssertM
b1a0: 61 67 69 63 28 29 3b 0a 20 20 68 48 65 61 70 20  agic();.  hHeap 
b1b0: 3d 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28  = winMemGetHeap(
b1c0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48 65  );.  assert( hHe
b1d0: 61 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ap!=0 );.  asser
b1e0: 74 28 20 68 48 65 61 70 21 3d 49 4e 56 41 4c 49  t( hHeap!=INVALI
b1f0: 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29  D_HANDLE_VALUE )
b200: 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ;.#if !SQLITE_OS
b210: 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65  _WINRT && define
b220: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d  d(SQLITE_WIN32_M
b230: 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a  ALLOC_VALIDATE).
b240: 20 20 61 73 73 65 72 74 28 20 6f 73 48 65 61 70    assert( osHeap
b250: 56 61 6c 69 64 61 74 65 28 68 48 65 61 70 2c 20  Validate(hHeap, 
b260: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
b270: 50 5f 46 4c 41 47 53 2c 20 70 50 72 69 6f 72 29  P_FLAGS, pPrior)
b280: 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73   );.#endif.  ass
b290: 65 72 74 28 20 6e 42 79 74 65 73 3e 3d 30 20 29  ert( nBytes>=0 )
b2a0: 3b 0a 20 20 69 66 28 20 21 70 50 72 69 6f 72 20  ;.  if( !pPrior 
b2b0: 29 7b 0a 20 20 20 20 70 20 3d 20 6f 73 48 65 61  ){.    p = osHea
b2c0: 70 41 6c 6c 6f 63 28 68 48 65 61 70 2c 20 53 51  pAlloc(hHeap, SQ
b2d0: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
b2e0: 46 4c 41 47 53 2c 20 28 53 49 5a 45 5f 54 29 6e  FLAGS, (SIZE_T)n
b2f0: 42 79 74 65 73 29 3b 0a 20 20 7d 65 6c 73 65 7b  Bytes);.  }else{
b300: 0a 20 20 20 20 70 20 3d 20 6f 73 48 65 61 70 52  .    p = osHeapR
b310: 65 41 6c 6c 6f 63 28 68 48 65 61 70 2c 20 53 51  eAlloc(hHeap, SQ
b320: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
b330: 46 4c 41 47 53 2c 20 70 50 72 69 6f 72 2c 20 28  FLAGS, pPrior, (
b340: 53 49 5a 45 5f 54 29 6e 42 79 74 65 73 29 3b 0a  SIZE_T)nBytes);.
b350: 20 20 7d 0a 20 20 69 66 28 20 21 70 20 29 7b 0a    }.  if( !p ){.
b360: 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
b370: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66  SQLITE_NOMEM, "f
b380: 61 69 6c 65 64 20 74 6f 20 25 73 20 25 75 20 62  ailed to %s %u b
b390: 79 74 65 73 20 28 25 6c 75 29 2c 20 68 65 61 70  ytes (%lu), heap
b3a0: 3d 25 70 22 2c 0a 20 20 20 20 20 20 20 20 20 20  =%p",.          
b3b0: 20 20 20 20 20 20 70 50 72 69 6f 72 20 3f 20 22        pPrior ? "
b3c0: 48 65 61 70 52 65 41 6c 6c 6f 63 22 20 3a 20 22  HeapReAlloc" : "
b3d0: 48 65 61 70 41 6c 6c 6f 63 22 2c 20 6e 42 79 74  HeapAlloc", nByt
b3e0: 65 73 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72  es, osGetLastErr
b3f0: 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20  or(),.          
b400: 20 20 20 20 20 20 28 76 6f 69 64 2a 29 68 48 65        (void*)hHe
b410: 61 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ap);.  }.  retur
b420: 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n p;.}../*.** Re
b430: 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66  turn the size of
b440: 20 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   an outstanding 
b450: 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20 69 6e 20 62  allocation, in b
b460: 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ytes..*/.static 
b470: 69 6e 74 20 77 69 6e 4d 65 6d 53 69 7a 65 28 76  int winMemSize(v
b480: 6f 69 64 20 2a 70 29 7b 0a 20 20 48 41 4e 44 4c  oid *p){.  HANDL
b490: 45 20 68 48 65 61 70 3b 0a 20 20 53 49 5a 45 5f  E hHeap;.  SIZE_
b4a0: 54 20 6e 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73  T n;..  winMemAs
b4b0: 73 65 72 74 4d 61 67 69 63 28 29 3b 0a 20 20 68  sertMagic();.  h
b4c0: 48 65 61 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74  Heap = winMemGet
b4d0: 48 65 61 70 28 29 3b 0a 20 20 61 73 73 65 72 74  Heap();.  assert
b4e0: 28 20 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 20  ( hHeap!=0 );.  
b4f0: 61 73 73 65 72 74 28 20 68 48 65 61 70 21 3d 49  assert( hHeap!=I
b500: 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
b510: 4c 55 45 20 29 3b 0a 23 69 66 20 21 53 51 4c 49  LUE );.#if !SQLI
b520: 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64  TE_OS_WINRT && d
b530: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
b540: 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44  N32_MALLOC_VALID
b550: 41 54 45 29 0a 20 20 61 73 73 65 72 74 28 20 6f  ATE).  assert( o
b560: 73 48 65 61 70 56 61 6c 69 64 61 74 65 28 68 48  sHeapValidate(hH
b570: 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33  eap, SQLITE_WIN3
b580: 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 70 29  2_HEAP_FLAGS, p)
b590: 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28   );.#endif.  if(
b5a0: 20 21 70 20 29 20 72 65 74 75 72 6e 20 30 3b 0a   !p ) return 0;.
b5b0: 20 20 6e 20 3d 20 6f 73 48 65 61 70 53 69 7a 65    n = osHeapSize
b5c0: 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57  (hHeap, SQLITE_W
b5d0: 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c  IN32_HEAP_FLAGS,
b5e0: 20 70 29 3b 0a 20 20 69 66 28 20 6e 3d 3d 28 53   p);.  if( n==(S
b5f0: 49 5a 45 5f 54 29 2d 31 20 29 7b 0a 20 20 20 20  IZE_T)-1 ){.    
b600: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49  sqlite3_log(SQLI
b610: 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65  TE_NOMEM, "faile
b620: 64 20 74 6f 20 48 65 61 70 53 69 7a 65 20 62 6c  d to HeapSize bl
b630: 6f 63 6b 20 25 70 20 28 25 6c 75 29 2c 20 68 65  ock %p (%lu), he
b640: 61 70 3d 25 70 22 2c 0a 20 20 20 20 20 20 20 20  ap=%p",.        
b650: 20 20 20 20 20 20 20 20 70 2c 20 6f 73 47 65 74          p, osGet
b660: 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 28 76 6f  LastError(), (vo
b670: 69 64 2a 29 68 48 65 61 70 29 3b 0a 20 20 20 20  id*)hHeap);.    
b680: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
b690: 72 65 74 75 72 6e 20 28 69 6e 74 29 6e 3b 0a 7d  return (int)n;.}
b6a0: 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75 6e 64 20 75 70  ../*.** Round up
b6b0: 20 61 20 72 65 71 75 65 73 74 20 73 69 7a 65 20   a request size 
b6c0: 74 6f 20 74 68 65 20 6e 65 78 74 20 76 61 6c 69  to the next vali
b6d0: 64 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 69 7a  d allocation siz
b6e0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
b6f0: 20 77 69 6e 4d 65 6d 52 6f 75 6e 64 75 70 28 69   winMemRoundup(i
b700: 6e 74 20 6e 29 7b 0a 20 20 72 65 74 75 72 6e 20  nt n){.  return 
b710: 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74  n;.}../*.** Init
b720: 69 61 6c 69 7a 65 20 74 68 69 73 20 6d 6f 64 75  ialize this modu
b730: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
b740: 74 20 77 69 6e 4d 65 6d 49 6e 69 74 28 76 6f 69  t winMemInit(voi
b750: 64 20 2a 70 41 70 70 44 61 74 61 29 7b 0a 20 20  d *pAppData){.  
b760: 77 69 6e 4d 65 6d 44 61 74 61 20 2a 70 57 69 6e  winMemData *pWin
b770: 4d 65 6d 44 61 74 61 20 3d 20 28 77 69 6e 4d 65  MemData = (winMe
b780: 6d 44 61 74 61 20 2a 29 70 41 70 70 44 61 74 61  mData *)pAppData
b790: 3b 0a 0a 20 20 69 66 28 20 21 70 57 69 6e 4d 65  ;..  if( !pWinMe
b7a0: 6d 44 61 74 61 20 29 20 72 65 74 75 72 6e 20 53  mData ) return S
b7b0: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 61  QLITE_ERROR;.  a
b7c0: 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61  ssert( pWinMemDa
b7d0: 74 61 2d 3e 6d 61 67 69 63 31 3d 3d 57 49 4e 4d  ta->magic1==WINM
b7e0: 45 4d 5f 4d 41 47 49 43 31 20 29 3b 0a 20 20 61  EM_MAGIC1 );.  a
b7f0: 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61  ssert( pWinMemDa
b800: 74 61 2d 3e 6d 61 67 69 63 32 3d 3d 57 49 4e 4d  ta->magic2==WINM
b810: 45 4d 5f 4d 41 47 49 43 32 20 29 3b 0a 0a 23 69  EM_MAGIC2 );..#i
b820: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
b830: 52 54 20 26 26 20 53 51 4c 49 54 45 5f 57 49 4e  RT && SQLITE_WIN
b840: 33 32 5f 48 45 41 50 5f 43 52 45 41 54 45 0a 20  32_HEAP_CREATE. 
b850: 20 69 66 28 20 21 70 57 69 6e 4d 65 6d 44 61 74   if( !pWinMemDat
b860: 61 2d 3e 68 48 65 61 70 20 29 7b 0a 20 20 20 20  a->hHeap ){.    
b870: 44 57 4f 52 44 20 64 77 49 6e 69 74 69 61 6c 53  DWORD dwInitialS
b880: 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f 57 49 4e  ize = SQLITE_WIN
b890: 33 32 5f 48 45 41 50 5f 49 4e 49 54 5f 53 49 5a  32_HEAP_INIT_SIZ
b8a0: 45 3b 0a 20 20 20 20 44 57 4f 52 44 20 64 77 4d  E;.    DWORD dwM
b8b0: 61 78 69 6d 75 6d 53 69 7a 65 20 3d 20 28 44 57  aximumSize = (DW
b8c0: 4f 52 44 29 73 71 6c 69 74 65 33 47 6c 6f 62 61  ORD)sqlite3Globa
b8d0: 6c 43 6f 6e 66 69 67 2e 6e 48 65 61 70 3b 0a 20  lConfig.nHeap;. 
b8e0: 20 20 20 69 66 28 20 64 77 4d 61 78 69 6d 75 6d     if( dwMaximum
b8f0: 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Size==0 ){.     
b900: 20 64 77 4d 61 78 69 6d 75 6d 53 69 7a 65 20 3d   dwMaximumSize =
b910: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
b920: 41 50 5f 4d 41 58 5f 53 49 5a 45 3b 0a 20 20 20  AP_MAX_SIZE;.   
b930: 20 7d 65 6c 73 65 20 69 66 28 20 64 77 49 6e 69   }else if( dwIni
b940: 74 69 61 6c 53 69 7a 65 3e 64 77 4d 61 78 69 6d  tialSize>dwMaxim
b950: 75 6d 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  umSize ){.      
b960: 64 77 49 6e 69 74 69 61 6c 53 69 7a 65 20 3d 20  dwInitialSize = 
b970: 64 77 4d 61 78 69 6d 75 6d 53 69 7a 65 3b 0a 20  dwMaximumSize;. 
b980: 20 20 20 7d 0a 20 20 20 20 70 57 69 6e 4d 65 6d     }.    pWinMem
b990: 44 61 74 61 2d 3e 68 48 65 61 70 20 3d 20 6f 73  Data->hHeap = os
b9a0: 48 65 61 70 43 72 65 61 74 65 28 53 51 4c 49 54  HeapCreate(SQLIT
b9b0: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41  E_WIN32_HEAP_FLA
b9c0: 47 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  GS,.            
b9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9e0: 20 20 20 20 20 20 20 20 20 20 64 77 49 6e 69 74            dwInit
b9f0: 69 61 6c 53 69 7a 65 2c 20 64 77 4d 61 78 69 6d  ialSize, dwMaxim
ba00: 75 6d 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28  umSize);.    if(
ba10: 20 21 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68   !pWinMemData->h
ba20: 48 65 61 70 20 29 7b 0a 20 20 20 20 20 20 73 71  Heap ){.      sq
ba30: 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
ba40: 5f 4e 4f 4d 45 4d 2c 0a 20 20 20 20 20 20 20 20  _NOMEM,.        
ba50: 20 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65 61    "failed to Hea
ba60: 70 43 72 65 61 74 65 20 28 25 6c 75 29 2c 20 66  pCreate (%lu), f
ba70: 6c 61 67 73 3d 25 75 2c 20 69 6e 69 74 53 69 7a  lags=%u, initSiz
ba80: 65 3d 25 6c 75 2c 20 6d 61 78 53 69 7a 65 3d 25  e=%lu, maxSize=%
ba90: 6c 75 22 2c 0a 20 20 20 20 20 20 20 20 20 20 6f  lu",.          o
baa0: 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c  sGetLastError(),
bab0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
bac0: 41 50 5f 46 4c 41 47 53 2c 20 64 77 49 6e 69 74  AP_FLAGS, dwInit
bad0: 69 61 6c 53 69 7a 65 2c 0a 20 20 20 20 20 20 20  ialSize,.       
bae0: 20 20 20 64 77 4d 61 78 69 6d 75 6d 53 69 7a 65     dwMaximumSize
baf0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
bb00: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
bb10: 20 20 7d 0a 20 20 20 20 70 57 69 6e 4d 65 6d 44    }.    pWinMemD
bb20: 61 74 61 2d 3e 62 4f 77 6e 65 64 20 3d 20 54 52  ata->bOwned = TR
bb30: 55 45 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  UE;.    assert( 
bb40: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f 77  pWinMemData->bOw
bb50: 6e 65 64 20 29 3b 0a 20 20 7d 0a 23 65 6c 73 65  ned );.  }.#else
bb60: 0a 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e  .  pWinMemData->
bb70: 68 48 65 61 70 20 3d 20 6f 73 47 65 74 50 72 6f  hHeap = osGetPro
bb80: 63 65 73 73 48 65 61 70 28 29 3b 0a 20 20 69 66  cessHeap();.  if
bb90: 28 20 21 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e  ( !pWinMemData->
bba0: 68 48 65 61 70 20 29 7b 0a 20 20 20 20 73 71 6c  hHeap ){.    sql
bbb0: 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
bbc0: 4e 4f 4d 45 4d 2c 0a 20 20 20 20 20 20 20 20 22  NOMEM,.        "
bbd0: 66 61 69 6c 65 64 20 74 6f 20 47 65 74 50 72 6f  failed to GetPro
bbe0: 63 65 73 73 48 65 61 70 20 28 25 6c 75 29 22 2c  cessHeap (%lu)",
bbf0: 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
bc00: 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ));.    return S
bc10: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
bc20: 0a 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e  .  pWinMemData->
bc30: 62 4f 77 6e 65 64 20 3d 20 46 41 4c 53 45 3b 0a  bOwned = FALSE;.
bc40: 20 20 61 73 73 65 72 74 28 20 21 70 57 69 6e 4d    assert( !pWinM
bc50: 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20 29  emData->bOwned )
bc60: 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72  ;.#endif.  asser
bc70: 74 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e  t( pWinMemData->
bc80: 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61 73  hHeap!=0 );.  as
bc90: 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61 74  sert( pWinMemDat
bca0: 61 2d 3e 68 48 65 61 70 21 3d 49 4e 56 41 4c 49  a->hHeap!=INVALI
bcb0: 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29  D_HANDLE_VALUE )
bcc0: 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ;.#if !SQLITE_OS
bcd0: 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65  _WINRT && define
bce0: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d  d(SQLITE_WIN32_M
bcf0: 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a  ALLOC_VALIDATE).
bd00: 20 20 61 73 73 65 72 74 28 20 6f 73 48 65 61 70    assert( osHeap
bd10: 56 61 6c 69 64 61 74 65 28 70 57 69 6e 4d 65 6d  Validate(pWinMem
bd20: 44 61 74 61 2d 3e 68 48 65 61 70 2c 20 53 51 4c  Data->hHeap, SQL
bd30: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46  ITE_WIN32_HEAP_F
bd40: 4c 41 47 53 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23  LAGS, NULL) );.#
bd50: 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53  endif.  return S
bd60: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
bd70: 2a 2a 20 44 65 69 6e 69 74 69 61 6c 69 7a 65 20  ** Deinitialize 
bd80: 74 68 69 73 20 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a  this module..*/.
bd90: 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 4d  static void winM
bda0: 65 6d 53 68 75 74 64 6f 77 6e 28 76 6f 69 64 20  emShutdown(void 
bdb0: 2a 70 41 70 70 44 61 74 61 29 7b 0a 20 20 77 69  *pAppData){.  wi
bdc0: 6e 4d 65 6d 44 61 74 61 20 2a 70 57 69 6e 4d 65  nMemData *pWinMe
bdd0: 6d 44 61 74 61 20 3d 20 28 77 69 6e 4d 65 6d 44  mData = (winMemD
bde0: 61 74 61 20 2a 29 70 41 70 70 44 61 74 61 3b 0a  ata *)pAppData;.
bdf0: 0a 20 20 69 66 28 20 21 70 57 69 6e 4d 65 6d 44  .  if( !pWinMemD
be00: 61 74 61 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ata ) return;.  
be10: 61 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44  assert( pWinMemD
be20: 61 74 61 2d 3e 6d 61 67 69 63 31 3d 3d 57 49 4e  ata->magic1==WIN
be30: 4d 45 4d 5f 4d 41 47 49 43 31 20 29 3b 0a 20 20  MEM_MAGIC1 );.  
be40: 61 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44  assert( pWinMemD
be50: 61 74 61 2d 3e 6d 61 67 69 63 32 3d 3d 57 49 4e  ata->magic2==WIN
be60: 4d 45 4d 5f 4d 41 47 49 43 32 20 29 3b 0a 0a 20  MEM_MAGIC2 );.. 
be70: 20 69 66 28 20 70 57 69 6e 4d 65 6d 44 61 74 61   if( pWinMemData
be80: 2d 3e 68 48 65 61 70 20 29 7b 0a 20 20 20 20 61  ->hHeap ){.    a
be90: 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61  ssert( pWinMemDa
bea0: 74 61 2d 3e 68 48 65 61 70 21 3d 49 4e 56 41 4c  ta->hHeap!=INVAL
beb0: 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20  ID_HANDLE_VALUE 
bec0: 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  );.#if !SQLITE_O
bed0: 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e  S_WINRT && defin
bee0: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
bef0: 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29  MALLOC_VALIDATE)
bf00: 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 73 48  .    assert( osH
bf10: 65 61 70 56 61 6c 69 64 61 74 65 28 70 57 69 6e  eapValidate(pWin
bf20: 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 2c 20  MemData->hHeap, 
bf30: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
bf40: 50 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c 29 20 29  P_FLAGS, NULL) )
bf50: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  ;.#endif.    if(
bf60: 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f   pWinMemData->bO
bf70: 77 6e 65 64 20 29 7b 0a 20 20 20 20 20 20 69 66  wned ){.      if
bf80: 28 20 21 6f 73 48 65 61 70 44 65 73 74 72 6f 79  ( !osHeapDestroy
bf90: 28 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48  (pWinMemData->hH
bfa0: 65 61 70 29 20 29 7b 0a 20 20 20 20 20 20 20 20  eap) ){.        
bfb0: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49  sqlite3_log(SQLI
bfc0: 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65  TE_NOMEM, "faile
bfd0: 64 20 74 6f 20 48 65 61 70 44 65 73 74 72 6f 79  d to HeapDestroy
bfe0: 20 28 25 6c 75 29 2c 20 68 65 61 70 3d 25 70 22   (%lu), heap=%p"
bff0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
c000: 20 20 20 20 20 20 6f 73 47 65 74 4c 61 73 74 45        osGetLastE
c010: 72 72 6f 72 28 29 2c 20 28 76 6f 69 64 2a 29 70  rror(), (void*)p
c020: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61  WinMemData->hHea
c030: 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  p);.      }.    
c040: 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62    pWinMemData->b
c050: 4f 77 6e 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20  Owned = FALSE;. 
c060: 20 20 20 7d 0a 20 20 20 20 70 57 69 6e 4d 65 6d     }.    pWinMem
c070: 44 61 74 61 2d 3e 68 48 65 61 70 20 3d 20 4e 55  Data->hHeap = NU
c080: 4c 4c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  LL;.  }.}../*.**
c090: 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 6c 6f   Populate the lo
c0a0: 77 2d 6c 65 76 65 6c 20 6d 65 6d 6f 72 79 20 61  w-level memory a
c0b0: 6c 6c 6f 63 61 74 69 6f 6e 20 66 75 6e 63 74 69  llocation functi
c0c0: 6f 6e 20 70 6f 69 6e 74 65 72 73 20 69 6e 0a 2a  on pointers in.*
c0d0: 2a 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  * sqlite3GlobalC
c0e0: 6f 6e 66 69 67 2e 6d 20 77 69 74 68 20 70 6f 69  onfig.m with poi
c0f0: 6e 74 65 72 73 20 74 6f 20 74 68 65 20 72 6f 75  nters to the rou
c100: 74 69 6e 65 73 20 69 6e 20 74 68 69 73 20 66 69  tines in this fi
c110: 6c 65 2e 20 54 68 65 0a 2a 2a 20 61 72 67 75 6d  le. The.** argum
c120: 65 6e 74 73 20 73 70 65 63 69 66 79 20 74 68 65  ents specify the
c130: 20 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72 79   block of memory
c140: 20 74 6f 20 6d 61 6e 61 67 65 2e 0a 2a 2a 0a 2a   to manage..**.*
c150: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
c160: 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62 79  s only called by
c170: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28   sqlite3_config(
c180: 29 2c 20 61 6e 64 20 74 68 65 72 65 66 6f 72 65  ), and therefore
c190: 0a 2a 2a 20 69 73 20 6e 6f 74 20 72 65 71 75 69  .** is not requi
c1a0: 72 65 64 20 74 6f 20 62 65 20 74 68 72 65 61 64  red to be thread
c1b0: 73 61 66 65 20 28 69 74 20 69 73 20 6e 6f 74 29  safe (it is not)
c1c0: 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 73 71 6c 69 74  ..*/.const sqlit
c1d0: 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 2a  e3_mem_methods *
c1e0: 73 71 6c 69 74 65 33 4d 65 6d 47 65 74 57 69 6e  sqlite3MemGetWin
c1f0: 33 32 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74  32(void){.  stat
c200: 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
c210: 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 77 69 6e  _mem_methods win
c220: 4d 65 6d 4d 65 74 68 6f 64 73 20 3d 20 7b 0a 20  MemMethods = {. 
c230: 20 20 20 77 69 6e 4d 65 6d 4d 61 6c 6c 6f 63 2c     winMemMalloc,
c240: 0a 20 20 20 20 77 69 6e 4d 65 6d 46 72 65 65 2c  .    winMemFree,
c250: 0a 20 20 20 20 77 69 6e 4d 65 6d 52 65 61 6c 6c  .    winMemReall
c260: 6f 63 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 53 69  oc,.    winMemSi
c270: 7a 65 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 52 6f  ze,.    winMemRo
c280: 75 6e 64 75 70 2c 0a 20 20 20 20 77 69 6e 4d 65  undup,.    winMe
c290: 6d 49 6e 69 74 2c 0a 20 20 20 20 77 69 6e 4d 65  mInit,.    winMe
c2a0: 6d 53 68 75 74 64 6f 77 6e 2c 0a 20 20 20 20 26  mShutdown,.    &
c2b0: 77 69 6e 5f 6d 65 6d 5f 64 61 74 61 0a 20 20 7d  win_mem_data.  }
c2c0: 3b 0a 20 20 72 65 74 75 72 6e 20 26 77 69 6e 4d  ;.  return &winM
c2d0: 65 6d 4d 65 74 68 6f 64 73 3b 0a 7d 0a 0a 76 6f  emMethods;.}..vo
c2e0: 69 64 20 73 71 6c 69 74 65 33 4d 65 6d 53 65 74  id sqlite3MemSet
c2f0: 44 65 66 61 75 6c 74 28 76 6f 69 64 29 7b 0a 20  Default(void){. 
c300: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28   sqlite3_config(
c310: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 41  SQLITE_CONFIG_MA
c320: 4c 4c 4f 43 2c 20 73 71 6c 69 74 65 33 4d 65 6d  LLOC, sqlite3Mem
c330: 47 65 74 57 69 6e 33 32 28 29 29 3b 0a 7d 0a 23  GetWin32());.}.#
c340: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
c350: 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 20 2a 2f 0a  WIN32_MALLOC */.
c360: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61  ./*.** Convert a
c370: 20 55 54 46 2d 38 20 73 74 72 69 6e 67 20 74 6f   UTF-8 string to
c380: 20 4d 69 63 72 6f 73 6f 66 74 20 55 6e 69 63 6f   Microsoft Unico
c390: 64 65 20 28 55 54 46 2d 31 36 3f 29 2e 0a 2a 2a  de (UTF-16?)..**
c3a0: 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  .** Space to hol
c3b0: 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73  d the returned s
c3c0: 74 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65  tring is obtaine
c3d0: 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 0a 2a  d from malloc..*
c3e0: 2f 0a 73 74 61 74 69 63 20 4c 50 57 53 54 52 20  /.static LPWSTR 
c3f0: 77 69 6e 55 74 66 38 54 6f 55 6e 69 63 6f 64 65  winUtf8ToUnicode
c400: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69  (const char *zFi
c410: 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 6e  lename){.  int n
c420: 43 68 61 72 3b 0a 20 20 4c 50 57 53 54 52 20 7a  Char;.  LPWSTR z
c430: 57 69 64 65 46 69 6c 65 6e 61 6d 65 3b 0a 0a 20  WideFilename;.. 
c440: 20 6e 43 68 61 72 20 3d 20 6f 73 4d 75 6c 74 69   nChar = osMulti
c450: 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 28 43  ByteToWideChar(C
c460: 50 5f 55 54 46 38 2c 20 30 2c 20 7a 46 69 6c 65  P_UTF8, 0, zFile
c470: 6e 61 6d 65 2c 20 2d 31 2c 20 4e 55 4c 4c 2c 20  name, -1, NULL, 
c480: 30 29 3b 0a 20 20 69 66 28 20 6e 43 68 61 72 3d  0);.  if( nChar=
c490: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
c4a0: 20 30 3b 0a 20 20 7d 0a 20 20 7a 57 69 64 65 46   0;.  }.  zWideF
c4b0: 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ilename = sqlite
c4c0: 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 43 68  3MallocZero( nCh
c4d0: 61 72 2a 73 69 7a 65 6f 66 28 7a 57 69 64 65 46  ar*sizeof(zWideF
c4e0: 69 6c 65 6e 61 6d 65 5b 30 5d 29 20 29 3b 0a 20  ilename[0]) );. 
c4f0: 20 69 66 28 20 7a 57 69 64 65 46 69 6c 65 6e 61   if( zWideFilena
c500: 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  me==0 ){.    ret
c510: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 43 68  urn 0;.  }.  nCh
c520: 61 72 20 3d 20 6f 73 4d 75 6c 74 69 42 79 74 65  ar = osMultiByte
c530: 54 6f 57 69 64 65 43 68 61 72 28 43 50 5f 55 54  ToWideChar(CP_UT
c540: 46 38 2c 20 30 2c 20 7a 46 69 6c 65 6e 61 6d 65  F8, 0, zFilename
c550: 2c 20 2d 31 2c 20 7a 57 69 64 65 46 69 6c 65 6e  , -1, zWideFilen
c560: 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
c570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c580: 20 20 20 20 20 6e 43 68 61 72 29 3b 0a 20 20 69       nChar);.  i
c590: 66 28 20 6e 43 68 61 72 3d 3d 30 20 29 7b 0a 20  f( nChar==0 ){. 
c5a0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
c5b0: 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 29 3b 0a  zWideFilename);.
c5c0: 20 20 20 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d      zWideFilenam
c5d0: 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  e = 0;.  }.  ret
c5e0: 75 72 6e 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d  urn zWideFilenam
c5f0: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76  e;.}../*.** Conv
c600: 65 72 74 20 4d 69 63 72 6f 73 6f 66 74 20 55 6e  ert Microsoft Un
c610: 69 63 6f 64 65 20 74 6f 20 55 54 46 2d 38 2e 20  icode to UTF-8. 
c620: 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74   Space to hold t
c630: 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69  he returned stri
c640: 6e 67 20 69 73 0a 2a 2a 20 6f 62 74 61 69 6e 65  ng is.** obtaine
c650: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d  d from sqlite3_m
c660: 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61 74  alloc()..*/.stat
c670: 69 63 20 63 68 61 72 20 2a 77 69 6e 55 6e 69 63  ic char *winUnic
c680: 6f 64 65 54 6f 55 74 66 38 28 4c 50 43 57 53 54  odeToUtf8(LPCWST
c690: 52 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 29  R zWideFilename)
c6a0: 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20  {.  int nByte;. 
c6b0: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
c6c0: 3b 0a 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73 57  ;..  nByte = osW
c6d0: 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79  ideCharToMultiBy
c6e0: 74 65 28 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a  te(CP_UTF8, 0, z
c6f0: 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c 20 2d 31  WideFilename, -1
c700: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  , 0, 0, 0, 0);. 
c710: 20 69 66 28 20 6e 42 79 74 65 20 3d 3d 20 30 20   if( nByte == 0 
c720: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
c730: 0a 20 20 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d 65  .  }.  zFilename
c740: 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
c750: 5a 65 72 6f 28 20 6e 42 79 74 65 20 29 3b 0a 20  Zero( nByte );. 
c760: 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d   if( zFilename==
c770: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
c780: 30 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d  0;.  }.  nByte =
c790: 20 6f 73 57 69 64 65 43 68 61 72 54 6f 4d 75 6c   osWideCharToMul
c7a0: 74 69 42 79 74 65 28 43 50 5f 55 54 46 38 2c 20  tiByte(CP_UTF8, 
c7b0: 30 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65  0, zWideFilename
c7c0: 2c 20 2d 31 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  , -1, zFilename,
c7d0: 20 6e 42 79 74 65 2c 0a 20 20 20 20 20 20 20 20   nByte,.        
c7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c7f0: 20 20 20 20 20 20 20 20 30 2c 20 30 29 3b 0a 20          0, 0);. 
c800: 20 69 66 28 20 6e 42 79 74 65 20 3d 3d 20 30 20   if( nByte == 0 
c810: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
c820: 72 65 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  ree(zFilename);.
c830: 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20      zFilename = 
c840: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
c850: 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a  zFilename;.}../*
c860: 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 6e 20 41  .** Convert an A
c870: 4e 53 49 20 73 74 72 69 6e 67 20 74 6f 20 4d 69  NSI string to Mi
c880: 63 72 6f 73 6f 66 74 20 55 6e 69 63 6f 64 65 2c  crosoft Unicode,
c890: 20 62 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a   based on the.**
c8a0: 20 63 75 72 72 65 6e 74 20 63 6f 64 65 70 61 67   current codepag
c8b0: 65 20 73 65 74 74 69 6e 67 73 20 66 6f 72 20 66  e settings for f
c8c0: 69 6c 65 20 61 70 69 73 2e 0a 2a 2a 0a 2a 2a 20  ile apis..**.** 
c8d0: 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68  Space to hold th
c8e0: 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e  e returned strin
c8f0: 67 20 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a  g is obtained.**
c900: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61   from sqlite3_ma
c910: 6c 6c 6f 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lloc..*/.static 
c920: 4c 50 57 53 54 52 20 77 69 6e 4d 62 63 73 54 6f  LPWSTR winMbcsTo
c930: 55 6e 69 63 6f 64 65 28 63 6f 6e 73 74 20 63 68  Unicode(const ch
c940: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a  ar *zFilename){.
c950: 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 4c    int nByte;.  L
c960: 50 57 53 54 52 20 7a 4d 62 63 73 46 69 6c 65 6e  PWSTR zMbcsFilen
c970: 61 6d 65 3b 0a 20 20 69 6e 74 20 63 6f 64 65 70  ame;.  int codep
c980: 61 67 65 20 3d 20 6f 73 41 72 65 46 69 6c 65 41  age = osAreFileA
c990: 70 69 73 41 4e 53 49 28 29 20 3f 20 43 50 5f 41  pisANSI() ? CP_A
c9a0: 43 50 20 3a 20 43 50 5f 4f 45 4d 43 50 3b 0a 0a  CP : CP_OEMCP;..
c9b0: 20 20 6e 42 79 74 65 20 3d 20 6f 73 4d 75 6c 74    nByte = osMult
c9c0: 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 28  iByteToWideChar(
c9d0: 63 6f 64 65 70 61 67 65 2c 20 30 2c 20 7a 46 69  codepage, 0, zFi
c9e0: 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 4e 55 4c 4c  lename, -1, NULL
c9f0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
ca00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca10: 20 20 30 29 2a 73 69 7a 65 6f 66 28 57 43 48 41    0)*sizeof(WCHA
ca20: 52 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 3d  R);.  if( nByte=
ca30: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
ca40: 20 30 3b 0a 20 20 7d 0a 20 20 7a 4d 62 63 73 46   0;.  }.  zMbcsF
ca50: 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ilename = sqlite
ca60: 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42 79  3MallocZero( nBy
ca70: 74 65 2a 73 69 7a 65 6f 66 28 7a 4d 62 63 73 46  te*sizeof(zMbcsF
ca80: 69 6c 65 6e 61 6d 65 5b 30 5d 29 20 29 3b 0a 20  ilename[0]) );. 
ca90: 20 69 66 28 20 7a 4d 62 63 73 46 69 6c 65 6e 61   if( zMbcsFilena
caa0: 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  me==0 ){.    ret
cab0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 42 79  urn 0;.  }.  nBy
cac0: 74 65 20 3d 20 6f 73 4d 75 6c 74 69 42 79 74 65  te = osMultiByte
cad0: 54 6f 57 69 64 65 43 68 61 72 28 63 6f 64 65 70  ToWideChar(codep
cae0: 61 67 65 2c 20 30 2c 20 7a 46 69 6c 65 6e 61 6d  age, 0, zFilenam
caf0: 65 2c 20 2d 31 2c 20 7a 4d 62 63 73 46 69 6c 65  e, -1, zMbcsFile
cb00: 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20  name,.          
cb10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb20: 20 20 20 20 20 20 6e 42 79 74 65 29 3b 0a 20 20        nByte);.  
cb30: 69 66 28 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a  if( nByte==0 ){.
cb40: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
cb50: 28 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 29 3b  (zMbcsFilename);
cb60: 0a 20 20 20 20 7a 4d 62 63 73 46 69 6c 65 6e 61  .    zMbcsFilena
cb70: 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  me = 0;.  }.  re
cb80: 74 75 72 6e 20 7a 4d 62 63 73 46 69 6c 65 6e 61  turn zMbcsFilena
cb90: 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  me;.}../*.** Con
cba0: 76 65 72 74 20 4d 69 63 72 6f 73 6f 66 74 20 55  vert Microsoft U
cbb0: 6e 69 63 6f 64 65 20 74 6f 20 6d 75 6c 74 69 2d  nicode to multi-
cbc0: 62 79 74 65 20 63 68 61 72 61 63 74 65 72 20 73  byte character s
cbd0: 74 72 69 6e 67 2c 20 62 61 73 65 64 20 6f 6e 20  tring, based on 
cbe0: 74 68 65 0a 2a 2a 20 75 73 65 72 27 73 20 41 4e  the.** user's AN
cbf0: 53 49 20 63 6f 64 65 70 61 67 65 2e 0a 2a 2a 0a  SI codepage..**.
cc00: 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  ** Space to hold
cc10: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73 74   the returned st
cc20: 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64  ring is obtained
cc30: 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33   from.** sqlite3
cc40: 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74  _malloc()..*/.st
cc50: 61 74 69 63 20 63 68 61 72 20 2a 77 69 6e 55 6e  atic char *winUn
cc60: 69 63 6f 64 65 54 6f 4d 62 63 73 28 4c 50 43 57  icodeToMbcs(LPCW
cc70: 53 54 52 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d  STR zWideFilenam
cc80: 65 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b  e){.  int nByte;
cc90: 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  .  char *zFilena
cca0: 6d 65 3b 0a 20 20 69 6e 74 20 63 6f 64 65 70 61  me;.  int codepa
ccb0: 67 65 20 3d 20 6f 73 41 72 65 46 69 6c 65 41 70  ge = osAreFileAp
ccc0: 69 73 41 4e 53 49 28 29 20 3f 20 43 50 5f 41 43  isANSI() ? CP_AC
ccd0: 50 20 3a 20 43 50 5f 4f 45 4d 43 50 3b 0a 0a 20  P : CP_OEMCP;.. 
cce0: 20 6e 42 79 74 65 20 3d 20 6f 73 57 69 64 65 43   nByte = osWideC
ccf0: 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 28 63  harToMultiByte(c
cd00: 6f 64 65 70 61 67 65 2c 20 30 2c 20 7a 57 69 64  odepage, 0, zWid
cd10: 65 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 30  eFilename, -1, 0
cd20: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66  , 0, 0, 0);.  if
cd30: 28 20 6e 42 79 74 65 20 3d 3d 20 30 20 29 7b 0a  ( nByte == 0 ){.
cd40: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
cd50: 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20  }.  zFilename = 
cd60: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
cd70: 6f 28 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66  o( nByte );.  if
cd80: 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29  ( zFilename==0 )
cd90: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
cda0: 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73    }.  nByte = os
cdb0: 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42  WideCharToMultiB
cdc0: 79 74 65 28 63 6f 64 65 70 61 67 65 2c 20 30 2c  yte(codepage, 0,
cdd0: 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c 20   zWideFilename, 
cde0: 2d 31 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20  -1, zFilename,. 
cdf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
ce10: 42 79 74 65 2c 20 30 2c 20 30 29 3b 0a 20 20 69  Byte, 0, 0);.  i
ce20: 66 28 20 6e 42 79 74 65 20 3d 3d 20 30 20 29 7b  f( nByte == 0 ){
ce30: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
ce40: 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  e(zFilename);.  
ce50: 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b    zFilename = 0;
ce60: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 46  .  }.  return zF
ce70: 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ilename;.}../*.*
ce80: 2a 20 43 6f 6e 76 65 72 74 20 6d 75 6c 74 69 62  * Convert multib
ce90: 79 74 65 20 63 68 61 72 61 63 74 65 72 20 73 74  yte character st
cea0: 72 69 6e 67 20 74 6f 20 55 54 46 2d 38 2e 20 20  ring to UTF-8.  
ceb0: 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68  Space to hold th
cec0: 65 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 73 74  e.** returned st
ced0: 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64  ring is obtained
cee0: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61   from sqlite3_ma
cef0: 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 63 68 61 72 20  lloc()..*/.char 
cf00: 2a 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d  *sqlite3_win32_m
cf10: 62 63 73 5f 74 6f 5f 75 74 66 38 28 63 6f 6e 73  bcs_to_utf8(cons
cf20: 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
cf30: 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c  e){.  char *zFil
cf40: 65 6e 61 6d 65 55 74 66 38 3b 0a 20 20 4c 50 57  enameUtf8;.  LPW
cf50: 53 54 52 20 7a 54 6d 70 57 69 64 65 3b 0a 0a 20  STR zTmpWide;.. 
cf60: 20 7a 54 6d 70 57 69 64 65 20 3d 20 77 69 6e 4d   zTmpWide = winM
cf70: 62 63 73 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69  bcsToUnicode(zFi
cf80: 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a  lename);.  if( z
cf90: 54 6d 70 57 69 64 65 3d 3d 30 20 29 7b 0a 20 20  TmpWide==0 ){.  
cfa0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
cfb0: 20 20 7a 46 69 6c 65 6e 61 6d 65 55 74 66 38 20    zFilenameUtf8 
cfc0: 3d 20 77 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74  = winUnicodeToUt
cfd0: 66 38 28 7a 54 6d 70 57 69 64 65 29 3b 0a 20 20  f8(zTmpWide);.  
cfe0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 6d  sqlite3_free(zTm
cff0: 70 57 69 64 65 29 3b 0a 20 20 72 65 74 75 72 6e  pWide);.  return
d000: 20 7a 46 69 6c 65 6e 61 6d 65 55 74 66 38 3b 0a   zFilenameUtf8;.
d010: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  }../*.** Convert
d020: 20 55 54 46 2d 38 20 74 6f 20 6d 75 6c 74 69 62   UTF-8 to multib
d030: 79 74 65 20 63 68 61 72 61 63 74 65 72 20 73 74  yte character st
d040: 72 69 6e 67 2e 20 20 53 70 61 63 65 20 74 6f 20  ring.  Space to 
d050: 68 6f 6c 64 20 74 68 65 0a 2a 2a 20 72 65 74 75  hold the.** retu
d060: 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73 20 6f  rned string is o
d070: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
d080: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a  ite3_malloc()..*
d090: 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f  /.char *sqlite3_
d0a0: 77 69 6e 33 32 5f 75 74 66 38 5f 74 6f 5f 6d 62  win32_utf8_to_mb
d0b0: 63 73 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  cs(const char *z
d0c0: 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 63 68 61  Filename){.  cha
d0d0: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 4d 62 63 73  r *zFilenameMbcs
d0e0: 3b 0a 20 20 4c 50 57 53 54 52 20 7a 54 6d 70 57  ;.  LPWSTR zTmpW
d0f0: 69 64 65 3b 0a 0a 20 20 7a 54 6d 70 57 69 64 65  ide;..  zTmpWide
d100: 20 3d 20 77 69 6e 55 74 66 38 54 6f 55 6e 69 63   = winUtf8ToUnic
d110: 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  ode(zFilename);.
d120: 20 20 69 66 28 20 7a 54 6d 70 57 69 64 65 3d 3d    if( zTmpWide==
d130: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
d140: 30 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c 65 6e 61  0;.  }.  zFilena
d150: 6d 65 4d 62 63 73 20 3d 20 77 69 6e 55 6e 69 63  meMbcs = winUnic
d160: 6f 64 65 54 6f 4d 62 63 73 28 7a 54 6d 70 57 69  odeToMbcs(zTmpWi
d170: 64 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  de);.  sqlite3_f
d180: 72 65 65 28 7a 54 6d 70 57 69 64 65 29 3b 0a 20  ree(zTmpWide);. 
d190: 20 72 65 74 75 72 6e 20 7a 46 69 6c 65 6e 61 6d   return zFilenam
d1a0: 65 4d 62 63 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eMbcs;.}../*.** 
d1b0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 65  This function se
d1c0: 74 73 20 74 68 65 20 64 61 74 61 20 64 69 72 65  ts the data dire
d1d0: 63 74 6f 72 79 20 6f 72 20 74 68 65 20 74 65 6d  ctory or the tem
d1e0: 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72 79  porary directory
d1f0: 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 74 68 65   based on.** the
d200: 20 70 72 6f 76 69 64 65 64 20 61 72 67 75 6d 65   provided argume
d210: 6e 74 73 2e 20 20 54 68 65 20 74 79 70 65 20 61  nts.  The type a
d220: 72 67 75 6d 65 6e 74 20 6d 75 73 74 20 62 65 20  rgument must be 
d230: 31 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 65  1 in order to se
d240: 74 20 74 68 65 0a 2a 2a 20 64 61 74 61 20 64 69  t the.** data di
d250: 72 65 63 74 6f 72 79 20 6f 72 20 32 20 69 6e 20  rectory or 2 in 
d260: 6f 72 64 65 72 20 74 6f 20 73 65 74 20 74 68 65  order to set the
d270: 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63   temporary direc
d280: 74 6f 72 79 2e 20 20 54 68 65 20 7a 56 61 6c 75  tory.  The zValu
d290: 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 69 73  e.** argument is
d2a0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
d2b0: 20 64 69 72 65 63 74 6f 72 79 20 74 6f 20 75 73   directory to us
d2c0: 65 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76  e.  The return v
d2d0: 61 6c 75 65 20 77 69 6c 6c 20 62 65 0a 2a 2a 20  alue will be.** 
d2e0: 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63  SQLITE_OK if suc
d2f0: 63 65 73 73 66 75 6c 2e 0a 2a 2f 0a 69 6e 74 20  cessful..*/.int 
d300: 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65  sqlite3_win32_se
d310: 74 5f 64 69 72 65 63 74 6f 72 79 28 44 57 4f 52  t_directory(DWOR
d320: 44 20 74 79 70 65 2c 20 4c 50 43 57 53 54 52 20  D type, LPCWSTR 
d330: 7a 56 61 6c 75 65 29 7b 0a 20 20 63 68 61 72 20  zValue){.  char 
d340: 2a 2a 70 70 44 69 72 65 63 74 6f 72 79 20 3d 20  **ppDirectory = 
d350: 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  0;.#ifndef SQLIT
d360: 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a  E_OMIT_AUTOINIT.
d370: 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
d380: 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 3b  e3_initialize();
d390: 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
d3a0: 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 20 20  rn rc;.#endif.  
d3b0: 69 66 28 20 74 79 70 65 3d 3d 53 51 4c 49 54 45  if( type==SQLITE
d3c0: 5f 57 49 4e 33 32 5f 44 41 54 41 5f 44 49 52 45  _WIN32_DATA_DIRE
d3d0: 43 54 4f 52 59 5f 54 59 50 45 20 29 7b 0a 20 20  CTORY_TYPE ){.  
d3e0: 20 20 70 70 44 69 72 65 63 74 6f 72 79 20 3d 20    ppDirectory = 
d3f0: 26 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69  &sqlite3_data_di
d400: 72 65 63 74 6f 72 79 3b 0a 20 20 7d 65 6c 73 65  rectory;.  }else
d410: 20 69 66 28 20 74 79 70 65 3d 3d 53 51 4c 49 54   if( type==SQLIT
d420: 45 5f 57 49 4e 33 32 5f 54 45 4d 50 5f 44 49 52  E_WIN32_TEMP_DIR
d430: 45 43 54 4f 52 59 5f 54 59 50 45 20 29 7b 0a 20  ECTORY_TYPE ){. 
d440: 20 20 20 70 70 44 69 72 65 63 74 6f 72 79 20 3d     ppDirectory =
d450: 20 26 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64   &sqlite3_temp_d
d460: 69 72 65 63 74 6f 72 79 3b 0a 20 20 7d 0a 20 20  irectory;.  }.  
d470: 61 73 73 65 72 74 28 20 21 70 70 44 69 72 65 63  assert( !ppDirec
d480: 74 6f 72 79 20 7c 7c 20 74 79 70 65 3d 3d 53 51  tory || type==SQ
d490: 4c 49 54 45 5f 57 49 4e 33 32 5f 44 41 54 41 5f  LITE_WIN32_DATA_
d4a0: 44 49 52 45 43 54 4f 52 59 5f 54 59 50 45 0a 20  DIRECTORY_TYPE. 
d4b0: 20 20 20 20 20 20 20 20 20 7c 7c 20 74 79 70 65           || type
d4c0: 3d 3d 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 54  ==SQLITE_WIN32_T
d4d0: 45 4d 50 5f 44 49 52 45 43 54 4f 52 59 5f 54 59  EMP_DIRECTORY_TY
d4e0: 50 45 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74  PE.  );.  assert
d4f0: 28 20 21 70 70 44 69 72 65 63 74 6f 72 79 20 7c  ( !ppDirectory |
d500: 7c 20 73 71 6c 69 74 65 33 4d 65 6d 64 65 62 75  | sqlite3Memdebu
d510: 67 48 61 73 54 79 70 65 28 2a 70 70 44 69 72 65  gHasType(*ppDire
d520: 63 74 6f 72 79 2c 20 4d 45 4d 54 59 50 45 5f 48  ctory, MEMTYPE_H
d530: 45 41 50 29 20 29 3b 0a 20 20 69 66 28 20 70 70  EAP) );.  if( pp
d540: 44 69 72 65 63 74 6f 72 79 20 29 7b 0a 20 20 20  Directory ){.   
d550: 20 63 68 61 72 20 2a 7a 56 61 6c 75 65 55 74 66   char *zValueUtf
d560: 38 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 7a  8 = 0;.    if( z
d570: 56 61 6c 75 65 20 26 26 20 7a 56 61 6c 75 65 5b  Value && zValue[
d580: 30 5d 20 29 7b 0a 20 20 20 20 20 20 7a 56 61 6c  0] ){.      zVal
d590: 75 65 55 74 66 38 20 3d 20 77 69 6e 55 6e 69 63  ueUtf8 = winUnic
d5a0: 6f 64 65 54 6f 55 74 66 38 28 7a 56 61 6c 75 65  odeToUtf8(zValue
d5b0: 29 3b 0a 20 20 20 20 20 20 69 66 20 28 20 7a 56  );.      if ( zV
d5c0: 61 6c 75 65 55 74 66 38 3d 3d 30 20 29 7b 0a 20  alueUtf8==0 ){. 
d5d0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
d5e0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
d5f0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
d600: 6c 69 74 65 33 5f 66 72 65 65 28 2a 70 70 44 69  lite3_free(*ppDi
d610: 72 65 63 74 6f 72 79 29 3b 0a 20 20 20 20 2a 70  rectory);.    *p
d620: 70 44 69 72 65 63 74 6f 72 79 20 3d 20 7a 56 61  pDirectory = zVa
d630: 6c 75 65 55 74 66 38 3b 0a 20 20 20 20 72 65 74  lueUtf8;.    ret
d640: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
d650: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
d660: 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a  TE_ERROR;.}../*.
d670: 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  ** The return va
d680: 6c 75 65 20 6f 66 20 77 69 6e 47 65 74 4c 61 73  lue of winGetLas
d690: 74 45 72 72 6f 72 4d 73 67 0a 2a 2a 20 69 73 20  tErrorMsg.** is 
d6a0: 7a 65 72 6f 20 69 66 20 74 68 65 20 65 72 72 6f  zero if the erro
d6b0: 72 20 6d 65 73 73 61 67 65 20 66 69 74 73 20 69  r message fits i
d6c0: 6e 20 74 68 65 20 62 75 66 66 65 72 2c 20 6f 72  n the buffer, or
d6d0: 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20 6f 74 68   non-zero.** oth
d6e0: 65 72 77 69 73 65 20 28 69 66 20 74 68 65 20 6d  erwise (if the m
d6f0: 65 73 73 61 67 65 20 77 61 73 20 74 72 75 6e 63  essage was trunc
d700: 61 74 65 64 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ated)..*/.static
d710: 20 69 6e 74 20 77 69 6e 47 65 74 4c 61 73 74 45   int winGetLastE
d720: 72 72 6f 72 4d 73 67 28 44 57 4f 52 44 20 6c 61  rrorMsg(DWORD la
d730: 73 74 45 72 72 6e 6f 2c 20 69 6e 74 20 6e 42 75  stErrno, int nBu
d740: 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a  f, char *zBuf){.
d750: 20 20 2f 2a 20 46 6f 72 6d 61 74 4d 65 73 73 61    /* FormatMessa
d760: 67 65 20 72 65 74 75 72 6e 73 20 30 20 6f 6e 20  ge returns 0 on 
d770: 66 61 69 6c 75 72 65 2e 20 20 4f 74 68 65 72 77  failure.  Otherw
d780: 69 73 65 20 69 74 0a 20 20 2a 2a 20 72 65 74 75  ise it.  ** retu
d790: 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  rns the number o
d7a0: 66 20 54 43 48 41 52 73 20 77 72 69 74 74 65 6e  f TCHARs written
d7b0: 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 0a 20   to the output. 
d7c0: 20 2a 2a 20 62 75 66 66 65 72 2c 20 65 78 63 6c   ** buffer, excl
d7d0: 75 64 69 6e 67 20 74 68 65 20 74 65 72 6d 69 6e  uding the termin
d7e0: 61 74 69 6e 67 20 6e 75 6c 6c 20 63 68 61 72 2e  ating null char.
d7f0: 0a 20 20 2a 2f 0a 20 20 44 57 4f 52 44 20 64 77  .  */.  DWORD dw
d800: 4c 65 6e 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  Len = 0;.  char 
d810: 2a 7a 4f 75 74 20 3d 20 30 3b 0a 0a 20 20 69 66  *zOut = 0;..  if
d820: 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 23 69  ( osIsNT() ){.#i
d830: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
d840: 54 0a 20 20 20 20 57 43 48 41 52 20 7a 54 65 6d  T.    WCHAR zTem
d850: 70 57 69 64 65 5b 53 51 4c 49 54 45 5f 57 49 4e  pWide[SQLITE_WIN
d860: 33 32 5f 4d 41 58 5f 45 52 52 4d 53 47 5f 43 48  32_MAX_ERRMSG_CH
d870: 41 52 53 2b 31 5d 3b 0a 20 20 20 20 64 77 4c 65  ARS+1];.    dwLe
d880: 6e 20 3d 20 6f 73 46 6f 72 6d 61 74 4d 65 73 73  n = osFormatMess
d890: 61 67 65 57 28 46 4f 52 4d 41 54 5f 4d 45 53 53  ageW(FORMAT_MESS
d8a0: 41 47 45 5f 46 52 4f 4d 5f 53 59 53 54 45 4d 20  AGE_FROM_SYSTEM 
d8b0: 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
d8c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 46                 F
d8d0: 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 49 47  ORMAT_MESSAGE_IG
d8e0: 4e 4f 52 45 5f 49 4e 53 45 52 54 53 2c 0a 20 20  NORE_INSERTS,.  
d8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d900: 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c             NULL,
d910: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 61                la
d930: 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
d940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d950: 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20 20        0,.       
d960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d970: 20 20 20 20 20 20 7a 54 65 6d 70 57 69 64 65 2c        zTempWide,
d980: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
d9a0: 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 45  LITE_WIN32_MAX_E
d9b0: 52 52 4d 53 47 5f 43 48 41 52 53 2c 0a 20 20 20  RRMSG_CHARS,.   
d9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d9d0: 20 20 20 20 20 20 20 20 20 20 30 29 3b 0a 23 65            0);.#e
d9e0: 6c 73 65 0a 20 20 20 20 4c 50 57 53 54 52 20 7a  lse.    LPWSTR z
d9f0: 54 65 6d 70 57 69 64 65 20 3d 20 4e 55 4c 4c 3b  TempWide = NULL;
da00: 0a 20 20 20 20 64 77 4c 65 6e 20 3d 20 6f 73 46  .    dwLen = osF
da10: 6f 72 6d 61 74 4d 65 73 73 61 67 65 57 28 46 4f  ormatMessageW(FO
da20: 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 41 4c 4c  RMAT_MESSAGE_ALL
da30: 4f 43 41 54 45 5f 42 55 46 46 45 52 20 7c 0a 20  OCATE_BUFFER |. 
da40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da50: 20 20 20 20 20 20 20 20 20 20 20 20 46 4f 52 4d              FORM
da60: 41 54 5f 4d 45 53 53 41 47 45 5f 46 52 4f 4d 5f  AT_MESSAGE_FROM_
da70: 53 59 53 54 45 4d 20 7c 0a 20 20 20 20 20 20 20  SYSTEM |.       
da80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da90: 20 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d 45 53        FORMAT_MES
daa0: 53 41 47 45 5f 49 47 4e 4f 52 45 5f 49 4e 53 45  SAGE_IGNORE_INSE
dab0: 52 54 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20  RTS,.           
dac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dad0: 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20    NULL,.        
dae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
daf0: 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 2c 0a       lastErrno,.
db00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db10: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 0a               0,.
db20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db30: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 4c 50               (LP
db40: 57 53 54 52 29 20 26 7a 54 65 6d 70 57 69 64 65  WSTR) &zTempWide
db50: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
db60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
db70: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
db80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
db90: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66  );.#endif.    if
dba0: 28 20 64 77 4c 65 6e 20 3e 20 30 20 29 7b 0a 20  ( dwLen > 0 ){. 
dbb0: 20 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65       /* allocate
dbc0: 20 61 20 62 75 66 66 65 72 20 61 6e 64 20 63 6f   a buffer and co
dbd0: 6e 76 65 72 74 20 74 6f 20 55 54 46 38 20 2a 2f  nvert to UTF8 */
dbe0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65  .      sqlite3Be
dbf0: 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
dc00: 29 3b 0a 20 20 20 20 20 20 7a 4f 75 74 20 3d 20  );.      zOut = 
dc10: 77 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66 38  winUnicodeToUtf8
dc20: 28 7a 54 65 6d 70 57 69 64 65 29 3b 0a 20 20 20  (zTempWide);.   
dc30: 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e     sqlite3EndBen
dc40: 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 23 69 66  ignMalloc();.#if
dc50: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
dc60: 54 0a 20 20 20 20 20 20 2f 2a 20 66 72 65 65 20  T.      /* free 
dc70: 74 68 65 20 73 79 73 74 65 6d 20 62 75 66 66 65  the system buffe
dc80: 72 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 46  r allocated by F
dc90: 6f 72 6d 61 74 4d 65 73 73 61 67 65 20 2a 2f 0a  ormatMessage */.
dca0: 20 20 20 20 20 20 6f 73 4c 6f 63 61 6c 46 72 65        osLocalFre
dcb0: 65 28 7a 54 65 6d 70 57 69 64 65 29 3b 0a 23 65  e(zTempWide);.#e
dcc0: 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  ndif.    }.  }.#
dcd0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  ifdef SQLITE_WIN
dce0: 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c  32_HAS_ANSI.  el
dcf0: 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54  se{.    char *zT
dd00: 65 6d 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  emp = NULL;.    
dd10: 64 77 4c 65 6e 20 3d 20 6f 73 46 6f 72 6d 61 74  dwLen = osFormat
dd20: 4d 65 73 73 61 67 65 41 28 46 4f 52 4d 41 54 5f  MessageA(FORMAT_
dd30: 4d 45 53 53 41 47 45 5f 41 4c 4c 4f 43 41 54 45  MESSAGE_ALLOCATE
dd40: 5f 42 55 46 46 45 52 20 7c 0a 20 20 20 20 20 20  _BUFFER |.      
dd50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd60: 20 20 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d 45         FORMAT_ME
dd70: 53 53 41 47 45 5f 46 52 4f 4d 5f 53 59 53 54 45  SSAGE_FROM_SYSTE
dd80: 4d 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  M |.            
dd90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dda0: 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f   FORMAT_MESSAGE_
ddb0: 49 47 4e 4f 52 45 5f 49 4e 53 45 52 54 53 2c 0a  IGNORE_INSERTS,.
ddc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ddd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c               NUL
dde0: 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  L,.             
ddf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de00: 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  lastErrno,.     
de10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de20: 20 20 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20          0,.     
de30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de40: 20 20 20 20 20 20 20 20 28 4c 50 53 54 52 29 20          (LPSTR) 
de50: 26 7a 54 65 6d 70 2c 0a 20 20 20 20 20 20 20 20  &zTemp,.        
de60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de70: 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20 20 20       0,.        
de80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de90: 20 20 20 20 20 30 29 3b 0a 20 20 20 20 69 66 28       0);.    if(
dea0: 20 64 77 4c 65 6e 20 3e 20 30 20 29 7b 0a 20 20   dwLen > 0 ){.  
deb0: 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20      /* allocate 
dec0: 61 20 62 75 66 66 65 72 20 61 6e 64 20 63 6f 6e  a buffer and con
ded0: 76 65 72 74 20 74 6f 20 55 54 46 38 20 2a 2f 0a  vert to UTF8 */.
dee0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67        sqlite3Beg
def0: 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
df00: 3b 0a 20 20 20 20 20 20 7a 4f 75 74 20 3d 20 73  ;.      zOut = s
df10: 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d 62 63  qlite3_win32_mbc
df20: 73 5f 74 6f 5f 75 74 66 38 28 7a 54 65 6d 70 29  s_to_utf8(zTemp)
df30: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
df40: 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
df50: 3b 0a 20 20 20 20 20 20 2f 2a 20 66 72 65 65 20  ;.      /* free 
df60: 74 68 65 20 73 79 73 74 65 6d 20 62 75 66 66 65  the system buffe
df70: 72 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 46  r allocated by F
df80: 6f 72 6d 61 74 4d 65 73 73 61 67 65 20 2a 2f 0a  ormatMessage */.
df90: 20 20 20 20 20 20 6f 73 4c 6f 63 61 6c 46 72 65        osLocalFre
dfa0: 65 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 7d 0a  e(zTemp);.    }.
dfb0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28    }.#endif.  if(
dfc0: 20 30 20 3d 3d 20 64 77 4c 65 6e 20 29 7b 0a 20   0 == dwLen ){. 
dfd0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
dfe0: 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75 66 2c 20  ntf(nBuf, zBuf, 
dff0: 22 4f 73 45 72 72 6f 72 20 30 78 25 6c 78 20 28  "OsError 0x%lx (
e000: 25 6c 75 29 22 2c 20 6c 61 73 74 45 72 72 6e 6f  %lu)", lastErrno
e010: 2c 20 6c 61 73 74 45 72 72 6e 6f 29 3b 0a 20 20  , lastErrno);.  
e020: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 63 6f  }else{.    /* co
e030: 70 79 20 61 20 6d 61 78 69 6d 75 6d 20 6f 66 20  py a maximum of 
e040: 6e 42 75 66 20 63 68 61 72 73 20 74 6f 20 6f 75  nBuf chars to ou
e050: 74 70 75 74 20 62 75 66 66 65 72 20 2a 2f 0a 20  tput buffer */. 
e060: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
e070: 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75 66 2c 20  ntf(nBuf, zBuf, 
e080: 22 25 73 22 2c 20 7a 4f 75 74 29 3b 0a 20 20 20  "%s", zOut);.   
e090: 20 2f 2a 20 66 72 65 65 20 74 68 65 20 55 54 46   /* free the UTF
e0a0: 38 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 20 20  8 buffer */.    
e0b0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 75  sqlite3_free(zOu
e0c0: 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  t);.  }.  return
e0d0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a 2a 20   0;.}../*.**.** 
e0e0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2d 20  This function - 
e0f0: 77 69 6e 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e  winLogErrorAtLin
e100: 65 28 29 20 2d 20 69 73 20 6f 6e 6c 79 20 65 76  e() - is only ev
e110: 65 72 20 63 61 6c 6c 65 64 20 76 69 61 20 74 68  er called via th
e120: 65 20 6d 61 63 72 6f 0a 2a 2a 20 77 69 6e 4c 6f  e macro.** winLo
e130: 67 45 72 72 6f 72 28 29 2e 0a 2a 2a 0a 2a 2a 20  gError()..**.** 
e140: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
e150: 69 6e 76 6f 6b 65 64 20 61 66 74 65 72 20 61 6e  invoked after an
e160: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e   error occurs in
e170: 20 61 6e 20 4f 53 20 66 75 6e 63 74 69 6f 6e 2e   an OS function.
e180: 0a 2a 2a 20 49 74 20 6c 6f 67 73 20 61 20 6d 65  .** It logs a me
e190: 73 73 61 67 65 20 75 73 69 6e 67 20 73 71 6c 69  ssage using sqli
e1a0: 74 65 33 5f 6c 6f 67 28 29 20 63 6f 6e 74 61 69  te3_log() contai
e1b0: 6e 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74  ning the current
e1c0: 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 65 72 72   value of.** err
e1d0: 6f 72 20 63 6f 64 65 20 61 6e 64 2c 20 69 66 20  or code and, if 
e1e0: 70 6f 73 73 69 62 6c 65 2c 20 74 68 65 20 68 75  possible, the hu
e1f0: 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 65 71 75  man-readable equ
e200: 69 76 61 6c 65 6e 74 20 66 72 6f 6d 0a 2a 2a 20  ivalent from.** 
e210: 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 2e 0a 2a  FormatMessage..*
e220: 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61  *.** The first a
e230: 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74  rgument passed t
e240: 6f 20 74 68 65 20 6d 61 63 72 6f 20 73 68 6f 75  o the macro shou
e250: 6c 64 20 62 65 20 74 68 65 20 65 72 72 6f 72 20  ld be the error 
e260: 63 6f 64 65 20 74 68 61 74 0a 2a 2a 20 77 69 6c  code that.** wil
e270: 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 74 6f  l be returned to
e280: 20 53 51 4c 69 74 65 20 28 65 2e 67 2e 20 53 51   SQLite (e.g. SQ
e290: 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54  LITE_IOERR_DELET
e2a0: 45 2c 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  E, SQLITE_CANTOP
e2b0: 45 4e 29 2e 0a 2a 2a 20 54 68 65 20 74 77 6f 20  EN)..** The two 
e2c0: 73 75 62 73 65 71 75 65 6e 74 20 61 72 67 75 6d  subsequent argum
e2d0: 65 6e 74 73 20 73 68 6f 75 6c 64 20 62 65 20 74  ents should be t
e2e0: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 4f  he name of the O
e2f0: 53 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 0a  S function that.
e300: 2a 2a 20 66 61 69 6c 65 64 20 61 6e 64 20 74 68  ** failed and th
e310: 65 20 61 73 73 6f 63 69 61 74 65 64 20 66 69 6c  e associated fil
e320: 65 2d 73 79 73 74 65 6d 20 70 61 74 68 2c 20 69  e-system path, i
e330: 66 20 61 6e 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e  f any..*/.#defin
e340: 65 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 61 2c  e winLogError(a,
e350: 62 2c 63 2c 64 29 20 20 20 77 69 6e 4c 6f 67 45  b,c,d)   winLogE
e360: 72 72 6f 72 41 74 4c 69 6e 65 28 61 2c 62 2c 63  rrorAtLine(a,b,c
e370: 2c 64 2c 5f 5f 4c 49 4e 45 5f 5f 29 0a 73 74 61  ,d,__LINE__).sta
e380: 74 69 63 20 69 6e 74 20 77 69 6e 4c 6f 67 45 72  tic int winLogEr
e390: 72 6f 72 41 74 4c 69 6e 65 28 0a 20 20 69 6e 74  rorAtLine(.  int
e3a0: 20 65 72 72 63 6f 64 65 2c 20 20 20 20 20 20 20   errcode,       
e3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e3c0: 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
e3d0: 65 20 2a 2f 0a 20 20 44 57 4f 52 44 20 6c 61 73  e */.  DWORD las
e3e0: 74 45 72 72 6e 6f 2c 20 20 20 20 20 20 20 20 20  tErrno,         
e3f0: 20 20 20 20 20 20 20 2f 2a 20 57 69 6e 33 32 20         /* Win32 
e400: 6c 61 73 74 20 65 72 72 6f 72 20 2a 2f 0a 20 20  last error */.  
e410: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e  const char *zFun
e420: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
e430: 2f 2a 20 4e 61 6d 65 20 6f 66 20 4f 53 20 66 75  /* Name of OS fu
e440: 6e 63 74 69 6f 6e 20 74 68 61 74 20 66 61 69 6c  nction that fail
e450: 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ed */.  const ch
e460: 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20  ar *zPath,      
e470: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
e480: 70 61 74 68 20 61 73 73 6f 63 69 61 74 65 64 20  path associated 
e490: 77 69 74 68 20 65 72 72 6f 72 20 2a 2f 0a 20 20  with error */.  
e4a0: 69 6e 74 20 69 4c 69 6e 65 20 20 20 20 20 20 20  int iLine       
e4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e4c0: 2f 2a 20 53 6f 75 72 63 65 20 6c 69 6e 65 20 6e  /* Source line n
e4d0: 75 6d 62 65 72 20 77 68 65 72 65 20 65 72 72 6f  umber where erro
e4e0: 72 20 6f 63 63 75 72 72 65 64 20 2a 2f 0a 29 7b  r occurred */.){
e4f0: 0a 20 20 63 68 61 72 20 7a 4d 73 67 5b 35 30 30  .  char zMsg[500
e500: 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ];              
e510: 20 20 20 2f 2a 20 48 75 6d 61 6e 20 72 65 61 64     /* Human read
e520: 61 62 6c 65 20 65 72 72 6f 72 20 74 65 78 74 20  able error text 
e530: 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
e540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e550: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
e560: 6e 74 65 72 20 2a 2f 0a 0a 20 20 7a 4d 73 67 5b  nter */..  zMsg[
e570: 30 5d 20 3d 20 30 3b 0a 20 20 77 69 6e 47 65 74  0] = 0;.  winGet
e580: 4c 61 73 74 45 72 72 6f 72 4d 73 67 28 6c 61 73  LastErrorMsg(las
e590: 74 45 72 72 6e 6f 2c 20 73 69 7a 65 6f 66 28 7a  tErrno, sizeof(z
e5a0: 4d 73 67 29 2c 20 7a 4d 73 67 29 3b 0a 20 20 61  Msg), zMsg);.  a
e5b0: 73 73 65 72 74 28 20 65 72 72 63 6f 64 65 21 3d  ssert( errcode!=
e5c0: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69  SQLITE_OK );.  i
e5d0: 66 28 20 7a 50 61 74 68 3d 3d 30 20 29 20 7a 50  f( zPath==0 ) zP
e5e0: 61 74 68 20 3d 20 22 22 3b 0a 20 20 66 6f 72 28  ath = "";.  for(
e5f0: 69 3d 30 3b 20 7a 4d 73 67 5b 69 5d 20 26 26 20  i=0; zMsg[i] && 
e600: 7a 4d 73 67 5b 69 5d 21 3d 27 5c 72 27 20 26 26  zMsg[i]!='\r' &&
e610: 20 7a 4d 73 67 5b 69 5d 21 3d 27 5c 6e 27 3b 20   zMsg[i]!='\n'; 
e620: 69 2b 2b 29 7b 7d 0a 20 20 7a 4d 73 67 5b 69 5d  i++){}.  zMsg[i]
e630: 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = 0;.  sqlite3_
e640: 6c 6f 67 28 65 72 72 63 6f 64 65 2c 0a 20 20 20  log(errcode,.   
e650: 20 20 20 22 6f 73 5f 77 69 6e 2e 63 3a 25 64 3a     "os_win.c:%d:
e660: 20 28 25 6c 75 29 20 25 73 28 25 73 29 20 2d 20   (%lu) %s(%s) - 
e670: 25 73 22 2c 0a 20 20 20 20 20 20 69 4c 69 6e 65  %s",.      iLine
e680: 2c 20 6c 61 73 74 45 72 72 6e 6f 2c 20 7a 46 75  , lastErrno, zFu
e690: 6e 63 2c 20 7a 50 61 74 68 2c 20 7a 4d 73 67 0a  nc, zPath, zMsg.
e6a0: 20 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 65    );..  return e
e6b0: 72 72 63 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rrcode;.}../*.**
e6c0: 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74   The number of t
e6d0: 69 6d 65 73 20 74 68 61 74 20 61 20 52 65 61 64  imes that a Read
e6e0: 46 69 6c 65 28 29 2c 20 57 72 69 74 65 46 69 6c  File(), WriteFil
e6f0: 65 28 29 2c 20 61 6e 64 20 44 65 6c 65 74 65 46  e(), and DeleteF
e700: 69 6c 65 28 29 0a 2a 2a 20 77 69 6c 6c 20 62 65  ile().** will be
e710: 20 72 65 74 72 69 65 64 20 66 6f 6c 6c 6f 77 69   retried followi
e720: 6e 67 20 61 20 6c 6f 63 6b 69 6e 67 20 65 72 72  ng a locking err
e730: 6f 72 20 2d 20 70 72 6f 62 61 62 6c 79 20 63 61  or - probably ca
e740: 75 73 65 64 20 62 79 0a 2a 2a 20 61 6e 74 69 76  used by.** antiv
e750: 69 72 75 73 20 73 6f 66 74 77 61 72 65 2e 20 20  irus software.  
e760: 41 6c 73 6f 20 74 68 65 20 69 6e 69 74 69 61 6c  Also the initial
e770: 20 64 65 6c 61 79 20 62 65 66 6f 72 65 20 74 68   delay before th
e780: 65 20 66 69 72 73 74 20 72 65 74 72 79 2e 0a 2a  e first retry..*
e790: 2a 20 54 68 65 20 64 65 6c 61 79 20 69 6e 63 72  * The delay incr
e7a0: 65 61 73 65 73 20 6c 69 6e 65 61 72 6c 79 20 77  eases linearly w
e7b0: 69 74 68 20 65 61 63 68 20 72 65 74 72 79 2e 0a  ith each retry..
e7c0: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
e7d0: 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45  E_WIN32_IOERR_RE
e7e0: 54 52 59 0a 23 20 64 65 66 69 6e 65 20 53 51 4c  TRY.# define SQL
e7f0: 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f  ITE_WIN32_IOERR_
e800: 52 45 54 52 59 20 31 30 0a 23 65 6e 64 69 66 0a  RETRY 10.#endif.
e810: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57  #ifndef SQLITE_W
e820: 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52 59  IN32_IOERR_RETRY
e830: 5f 44 45 4c 41 59 0a 23 20 64 65 66 69 6e 65 20  _DELAY.# define 
e840: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45  SQLITE_WIN32_IOE
e850: 52 52 5f 52 45 54 52 59 5f 44 45 4c 41 59 20 32  RR_RETRY_DELAY 2
e860: 35 0a 23 65 6e 64 69 66 0a 73 74 61 74 69 63 20  5.#endif.static 
e870: 69 6e 74 20 77 69 6e 49 6f 65 72 72 52 65 74 72  int winIoerrRetr
e880: 79 20 3d 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  y = SQLITE_WIN32
e890: 5f 49 4f 45 52 52 5f 52 45 54 52 59 3b 0a 73 74  _IOERR_RETRY;.st
e8a0: 61 74 69 63 20 69 6e 74 20 77 69 6e 49 6f 65 72  atic int winIoer
e8b0: 72 52 65 74 72 79 44 65 6c 61 79 20 3d 20 53 51  rRetryDelay = SQ
e8c0: 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52  LITE_WIN32_IOERR
e8d0: 5f 52 45 54 52 59 5f 44 45 4c 41 59 3b 0a 0a 2f  _RETRY_DELAY;../
e8e0: 2a 0a 2a 2a 20 54 68 65 20 22 77 69 6e 49 6f 65  *.** The "winIoe
e8f0: 72 72 43 61 6e 52 65 74 72 79 31 22 20 6d 61 63  rrCanRetry1" mac
e900: 72 6f 20 69 73 20 75 73 65 64 20 74 6f 20 64 65  ro is used to de
e910: 74 65 72 6d 69 6e 65 20 69 66 20 61 20 70 61 72  termine if a par
e920: 74 69 63 75 6c 61 72 20 49 2f 4f 0a 2a 2a 20 65  ticular I/O.** e
e930: 72 72 6f 72 20 63 6f 64 65 20 6f 62 74 61 69 6e  rror code obtain
e940: 65 64 20 76 69 61 20 47 65 74 4c 61 73 74 45 72  ed via GetLastEr
e950: 72 6f 72 28 29 20 69 73 20 65 6c 69 67 69 62 6c  ror() is eligibl
e960: 65 20 74 6f 20 62 65 20 72 65 74 72 69 65 64 2e  e to be retried.
e970: 20 20 49 74 0a 2a 2a 20 6d 75 73 74 20 61 63 63    It.** must acc
e980: 65 70 74 20 74 68 65 20 65 72 72 6f 72 20 63 6f  ept the error co
e990: 64 65 20 44 57 4f 52 44 20 61 73 20 69 74 73 20  de DWORD as its 
e9a0: 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 20 61 6e  only argument an
e9b0: 64 20 73 68 6f 75 6c 64 20 72 65 74 75 72 6e 0a  d should return.
e9c0: 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74  ** non-zero if t
e9d0: 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  he error code is
e9e0: 20 74 72 61 6e 73 69 65 6e 74 20 69 6e 20 6e 61   transient in na
e9f0: 74 75 72 65 20 61 6e 64 20 74 68 65 20 6f 70 65  ture and the ope
ea00: 72 61 74 69 6f 6e 0a 2a 2a 20 72 65 73 70 6f 6e  ration.** respon
ea10: 73 69 62 6c 65 20 66 6f 72 20 67 65 6e 65 72 61  sible for genera
ea20: 74 69 6e 67 20 74 68 65 20 6f 72 69 67 69 6e 61  ting the origina
ea30: 6c 20 65 72 72 6f 72 20 6d 69 67 68 74 20 73 75  l error might su
ea40: 63 63 65 65 64 20 75 70 6f 6e 20 62 65 69 6e 67  cceed upon being
ea50: 0a 2a 2a 20 72 65 74 72 69 65 64 2e 20 20 54 68  .** retried.  Th
ea60: 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  e argument to th
ea70: 69 73 20 6d 61 63 72 6f 20 73 68 6f 75 6c 64 20  is macro should 
ea80: 62 65 20 61 20 76 61 72 69 61 62 6c 65 2e 0a 2a  be a variable..*
ea90: 2a 0a 2a 2a 20 41 64 64 69 74 69 6f 6e 61 6c 6c  *.** Additionall
eaa0: 79 2c 20 61 20 6d 61 63 72 6f 20 6e 61 6d 65 64  y, a macro named
eab0: 20 22 77 69 6e 49 6f 65 72 72 43 61 6e 52 65 74   "winIoerrCanRet
eac0: 72 79 32 22 20 6d 61 79 20 62 65 20 64 65 66 69  ry2" may be defi
ead0: 6e 65 64 2e 20 20 49 66 20 69 74 0a 2a 2a 20 69  ned.  If it.** i
eae0: 73 20 64 65 66 69 6e 65 64 2c 20 69 74 20 77 69  s defined, it wi
eaf0: 6c 6c 20 62 65 20 63 6f 6e 73 75 6c 74 65 64 20  ll be consulted 
eb00: 6f 6e 6c 79 20 77 68 65 6e 20 74 68 65 20 6d 61  only when the ma
eb10: 63 72 6f 20 22 77 69 6e 49 6f 65 72 72 43 61 6e  cro "winIoerrCan
eb20: 52 65 74 72 79 31 22 0a 2a 2a 20 72 65 74 75 72  Retry1".** retur
eb30: 6e 73 20 7a 65 72 6f 2e 20 20 54 68 65 20 22 77  ns zero.  The "w
eb40: 69 6e 49 6f 65 72 72 43 61 6e 52 65 74 72 79 32  inIoerrCanRetry2
eb50: 22 20 6d 61 63 72 6f 20 69 73 20 63 6f 6d 70 6c  " macro is compl
eb60: 65 74 65 6c 79 20 6f 70 74 69 6f 6e 61 6c 20 61  etely optional a
eb70: 6e 64 0a 2a 2a 20 6d 61 79 20 62 65 20 75 73 65  nd.** may be use
eb80: 64 20 74 6f 20 69 6e 63 6c 75 64 65 20 61 64 64  d to include add
eb90: 69 74 69 6f 6e 61 6c 20 65 72 72 6f 72 20 63 6f  itional error co
eba0: 64 65 73 20 69 6e 20 74 68 65 20 73 65 74 20 74  des in the set t
ebb0: 68 61 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 72 65  hat should.** re
ebc0: 73 75 6c 74 20 69 6e 20 74 68 65 20 66 61 69 6c  sult in the fail
ebd0: 69 6e 67 20 49 2f 4f 20 6f 70 65 72 61 74 69 6f  ing I/O operatio
ebe0: 6e 20 62 65 69 6e 67 20 72 65 74 72 69 65 64 20  n being retried 
ebf0: 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 20  by the caller.  
ec00: 49 66 0a 2a 2a 20 64 65 66 69 6e 65 64 2c 20 74  If.** defined, t
ec10: 68 65 20 22 77 69 6e 49 6f 65 72 72 43 61 6e 52  he "winIoerrCanR
ec20: 65 74 72 79 32 22 20 6d 61 63 72 6f 20 6d 75 73  etry2" macro mus
ec30: 74 20 65 78 68 69 62 69 74 20 65 78 74 65 72 6e  t exhibit extern
ec40: 61 6c 20 73 65 6d 61 6e 74 69 63 73 0a 2a 2a 20  al semantics.** 
ec50: 69 64 65 6e 74 69 63 61 6c 20 74 6f 20 74 68 6f  identical to tho
ec60: 73 65 20 6f 66 20 74 68 65 20 22 77 69 6e 49 6f  se of the "winIo
ec70: 65 72 72 43 61 6e 52 65 74 72 79 31 22 20 6d 61  errCanRetry1" ma
ec80: 63 72 6f 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66  cro..*/.#if !def
ec90: 69 6e 65 64 28 77 69 6e 49 6f 65 72 72 43 61 6e  ined(winIoerrCan
eca0: 52 65 74 72 79 31 29 0a 23 64 65 66 69 6e 65 20  Retry1).#define 
ecb0: 77 69 6e 49 6f 65 72 72 43 61 6e 52 65 74 72 79  winIoerrCanRetry
ecc0: 31 28 61 29 20 28 28 28 61 29 3d 3d 45 52 52 4f  1(a) (((a)==ERRO
ecd0: 52 5f 41 43 43 45 53 53 5f 44 45 4e 49 45 44 29  R_ACCESS_DENIED)
ece0: 20 20 20 20 20 20 20 20 7c 7c 20 5c 0a 20 20 20          || \.   
ecf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ed00: 20 20 20 20 20 20 20 20 20 20 20 28 28 61 29 3d             ((a)=
ed10: 3d 45 52 52 4f 52 5f 53 48 41 52 49 4e 47 5f 56  =ERROR_SHARING_V
ed20: 49 4f 4c 41 54 49 4f 4e 29 20 20 20 20 7c 7c 20  IOLATION)    || 
ed30: 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  \.              
ed40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ed50: 28 28 61 29 3d 3d 45 52 52 4f 52 5f 4c 4f 43 4b  ((a)==ERROR_LOCK
ed60: 5f 56 49 4f 4c 41 54 49 4f 4e 29 20 20 20 20 20  _VIOLATION)     
ed70: 20 20 7c 7c 20 5c 0a 20 20 20 20 20 20 20 20 20    || \.         
ed80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ed90: 20 20 20 20 20 28 28 61 29 3d 3d 45 52 52 4f 52       ((a)==ERROR
eda0: 5f 44 45 56 5f 4e 4f 54 5f 45 58 49 53 54 29 20  _DEV_NOT_EXIST) 
edb0: 20 20 20 20 20 20 20 7c 7c 20 5c 0a 20 20 20 20         || \.    
edc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
edd0: 20 20 20 20 20 20 20 20 20 20 28 28 61 29 3d 3d            ((a)==
ede0: 45 52 52 4f 52 5f 4e 45 54 4e 41 4d 45 5f 44 45  ERROR_NETNAME_DE
edf0: 4c 45 54 45 44 29 20 20 20 20 20 20 7c 7c 20 5c  LETED)      || \
ee00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ee10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
ee20: 28 61 29 3d 3d 45 52 52 4f 52 5f 53 45 4d 5f 54  (a)==ERROR_SEM_T
ee30: 49 4d 45 4f 55 54 29 20 20 20 20 20 20 20 20 20  IMEOUT)         
ee40: 20 7c 7c 20 5c 0a 20 20 20 20 20 20 20 20 20 20   || \.          
ee50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee60: 20 20 20 20 28 28 61 29 3d 3d 45 52 52 4f 52 5f      ((a)==ERROR_
ee70: 4e 45 54 57 4f 52 4b 5f 55 4e 52 45 41 43 48 41  NETWORK_UNREACHA
ee80: 42 4c 45 29 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  BLE)).#endif../*
ee90: 0a 2a 2a 20 49 66 20 61 20 52 65 61 64 46 69 6c  .** If a ReadFil
eea0: 65 28 29 20 6f 72 20 57 72 69 74 65 46 69 6c 65  e() or WriteFile
eeb0: 28 29 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  () error occurs,
eec0: 20 69 6e 76 6f 6b 65 20 74 68 69 73 20 72 6f 75   invoke this rou
eed0: 74 69 6e 65 0a 2a 2a 20 74 6f 20 73 65 65 20 69  tine.** to see i
eee0: 66 20 69 74 20 73 68 6f 75 6c 64 20 62 65 20 72  f it should be r
eef0: 65 74 72 69 65 64 2e 20 20 52 65 74 75 72 6e 20  etried.  Return 
ef00: 54 52 55 45 20 74 6f 20 72 65 74 72 79 2e 20 20  TRUE to retry.  
ef10: 52 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20  Return FALSE.** 
ef20: 74 6f 20 67 69 76 65 20 75 70 20 77 69 74 68 20  to give up with 
ef30: 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61  an error..*/.sta
ef40: 74 69 63 20 69 6e 74 20 77 69 6e 52 65 74 72 79  tic int winRetry
ef50: 49 6f 65 72 72 28 69 6e 74 20 2a 70 6e 52 65 74  Ioerr(int *pnRet
ef60: 72 79 2c 20 44 57 4f 52 44 20 2a 70 45 72 72 6f  ry, DWORD *pErro
ef70: 72 29 7b 0a 20 20 44 57 4f 52 44 20 65 20 3d 20  r){.  DWORD e = 
ef80: 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
ef90: 3b 0a 20 20 69 66 28 20 2a 70 6e 52 65 74 72 79  ;.  if( *pnRetry
efa0: 3e 3d 77 69 6e 49 6f 65 72 72 52 65 74 72 79 20  >=winIoerrRetry 
efb0: 29 7b 0a 20 20 20 20 69 66 28 20 70 45 72 72 6f  ){.    if( pErro
efc0: 72 20 29 7b 0a 20 20 20 20 20 20 2a 70 45 72 72  r ){.      *pErr
efd0: 6f 72 20 3d 20 65 3b 0a 20 20 20 20 7d 0a 20 20  or = e;.    }.  
efe0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
eff0: 20 20 69 66 28 20 77 69 6e 49 6f 65 72 72 43 61    if( winIoerrCa
f000: 6e 52 65 74 72 79 31 28 65 29 20 29 7b 0a 20 20  nRetry1(e) ){.  
f010: 20 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f    sqlite3_win32_
f020: 73 6c 65 65 70 28 77 69 6e 49 6f 65 72 72 52 65  sleep(winIoerrRe
f030: 74 72 79 44 65 6c 61 79 2a 28 31 2b 2a 70 6e 52  tryDelay*(1+*pnR
f040: 65 74 72 79 29 29 3b 0a 20 20 20 20 2b 2b 2a 70  etry));.    ++*p
f050: 6e 52 65 74 72 79 3b 0a 20 20 20 20 72 65 74 75  nRetry;.    retu
f060: 72 6e 20 31 3b 0a 20 20 7d 0a 23 69 66 20 64 65  rn 1;.  }.#if de
f070: 66 69 6e 65 64 28 77 69 6e 49 6f 65 72 72 43 61  fined(winIoerrCa
f080: 6e 52 65 74 72 79 32 29 0a 20 20 65 6c 73 65 20  nRetry2).  else 
f090: 69 66 28 20 77 69 6e 49 6f 65 72 72 43 61 6e 52  if( winIoerrCanR
f0a0: 65 74 72 79 32 28 65 29 20 29 7b 0a 20 20 20 20  etry2(e) ){.    
f0b0: 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c  sqlite3_win32_sl
f0c0: 65 65 70 28 77 69 6e 49 6f 65 72 72 52 65 74 72  eep(winIoerrRetr
f0d0: 79 44 65 6c 61 79 2a 28 31 2b 2a 70 6e 52 65 74  yDelay*(1+*pnRet
f0e0: 72 79 29 29 3b 0a 20 20 20 20 2b 2b 2a 70 6e 52  ry));.    ++*pnR
f0f0: 65 74 72 79 3b 0a 20 20 20 20 72 65 74 75 72 6e  etry;.    return
f100: 20 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20   1;.  }.#endif. 
f110: 20 69 66 28 20 70 45 72 72 6f 72 20 29 7b 0a 20   if( pError ){. 
f120: 20 20 20 2a 70 45 72 72 6f 72 20 3d 20 65 3b 0a     *pError = e;.
f130: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
f140: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 67 20 61 20 49  }../*.** Log a I
f150: 2f 4f 20 65 72 72 6f 72 20 72 65 74 72 79 20 65  /O error retry e
f160: 70 69 73 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69  pisode..*/.stati
f170: 63 20 76 6f 69 64 20 77 69 6e 4c 6f 67 49 6f 65  c void winLogIoe
f180: 72 72 28 69 6e 74 20 6e 52 65 74 72 79 29 7b 0a  rr(int nRetry){.
f190: 20 20 69 66 28 20 6e 52 65 74 72 79 20 29 7b 0a    if( nRetry ){.
f1a0: 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
f1b0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 0a 20 20  SQLITE_IOERR,.  
f1c0: 20 20 20 20 22 64 65 6c 61 79 65 64 20 25 64 6d      "delayed %dm
f1d0: 73 20 66 6f 72 20 6c 6f 63 6b 2f 73 68 61 72 69  s for lock/shari
f1e0: 6e 67 20 63 6f 6e 66 6c 69 63 74 22 2c 0a 20 20  ng conflict",.  
f1f0: 20 20 20 20 77 69 6e 49 6f 65 72 72 52 65 74 72      winIoerrRetr
f200: 79 44 65 6c 61 79 2a 6e 52 65 74 72 79 2a 28 6e  yDelay*nRetry*(n
f210: 52 65 74 72 79 2b 31 29 2f 32 0a 20 20 20 20 29  Retry+1)/2.    )
f220: 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 53 51 4c  ;.  }.}..#if SQL
f230: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 2f 2a 2a  ITE_OS_WINCE./**
f240: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f250: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f260: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f270: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f280: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20  *******.** This 
f290: 73 65 63 74 69 6f 6e 20 63 6f 6e 74 61 69 6e 73  section contains
f2a0: 20 63 6f 64 65 20 66 6f 72 20 57 69 6e 43 45 20   code for WinCE 
f2b0: 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 20 21 64 65  only..*/.#if !de
f2c0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4d 53 56  fined(SQLITE_MSV
f2d0: 43 5f 4c 4f 43 41 4c 54 49 4d 45 5f 41 50 49 29  C_LOCALTIME_API)
f2e0: 20 7c 7c 20 21 53 51 4c 49 54 45 5f 4d 53 56 43   || !SQLITE_MSVC
f2f0: 5f 4c 4f 43 41 4c 54 49 4d 45 5f 41 50 49 0a 2f  _LOCALTIME_API./
f300: 2a 0a 2a 2a 20 54 68 65 20 4d 53 56 43 20 43 52  *.** The MSVC CR
f310: 54 20 6f 6e 20 57 69 6e 64 6f 77 73 20 43 45 20  T on Windows CE 
f320: 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 61 20 6c  may not have a l
f330: 6f 63 61 6c 74 69 6d 65 28 29 20 66 75 6e 63 74  ocaltime() funct
f340: 69 6f 6e 2e 20 20 53 6f 0a 2a 2a 20 63 72 65 61  ion.  So.** crea
f350: 74 65 20 61 20 73 75 62 73 74 69 74 75 74 65 2e  te a substitute.
f360: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 74 69  .*/.#include <ti
f370: 6d 65 2e 68 3e 0a 73 74 72 75 63 74 20 74 6d 20  me.h>.struct tm 
f380: 2a 5f 5f 63 64 65 63 6c 20 6c 6f 63 61 6c 74 69  *__cdecl localti
f390: 6d 65 28 63 6f 6e 73 74 20 74 69 6d 65 5f 74 20  me(const time_t 
f3a0: 2a 74 29 0a 7b 0a 20 20 73 74 61 74 69 63 20 73  *t).{.  static s
f3b0: 74 72 75 63 74 20 74 6d 20 79 3b 0a 20 20 46 49  truct tm y;.  FI
f3c0: 4c 45 54 49 4d 45 20 75 54 6d 2c 20 6c 54 6d 3b  LETIME uTm, lTm;
f3d0: 0a 20 20 53 59 53 54 45 4d 54 49 4d 45 20 70 54  .  SYSTEMTIME pT
f3e0: 6d 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  m;.  sqlite3_int
f3f0: 36 34 20 74 36 34 3b 0a 20 20 74 36 34 20 3d 20  64 t64;.  t64 = 
f400: 2a 74 3b 0a 20 20 74 36 34 20 3d 20 28 74 36 34  *t;.  t64 = (t64
f410: 20 2b 20 31 31 36 34 34 34 37 33 36 30 30 29 2a   + 11644473600)*
f420: 31 30 30 30 30 30 30 30 3b 0a 20 20 75 54 6d 2e  10000000;.  uTm.
f430: 64 77 4c 6f 77 44 61 74 65 54 69 6d 65 20 3d 20  dwLowDateTime = 
f440: 28 44 57 4f 52 44 29 28 74 36 34 20 26 20 30 78  (DWORD)(t64 & 0x
f450: 46 46 46 46 46 46 46 46 29 3b 0a 20 20 75 54 6d  FFFFFFFF);.  uTm
f460: 2e 64 77 48 69 67 68 44 61 74 65 54 69 6d 65 3d  .dwHighDateTime=
f470: 20 28 44 57 4f 52 44 29 28 74 36 34 20 3e 3e 20   (DWORD)(t64 >> 
f480: 33 32 29 3b 0a 20 20 6f 73 46 69 6c 65 54 69 6d  32);.  osFileTim
f490: 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65  eToLocalFileTime
f4a0: 28 26 75 54 6d 2c 26 6c 54 6d 29 3b 0a 20 20 6f  (&uTm,&lTm);.  o
f4b0: 73 46 69 6c 65 54 69 6d 65 54 6f 53 79 73 74 65  sFileTimeToSyste
f4c0: 6d 54 69 6d 65 28 26 6c 54 6d 2c 26 70 54 6d 29  mTime(&lTm,&pTm)
f4d0: 3b 0a 20 20 79 2e 74 6d 5f 79 65 61 72 20 3d 20  ;.  y.tm_year = 
f4e0: 70 54 6d 2e 77 59 65 61 72 20 2d 20 31 39 30 30  pTm.wYear - 1900
f4f0: 3b 0a 20 20 79 2e 74 6d 5f 6d 6f 6e 20 3d 20 70  ;.  y.tm_mon = p
f500: 54 6d 2e 77 4d 6f 6e 74 68 20 2d 20 31 3b 0a 20  Tm.wMonth - 1;. 
f510: 20 79 2e 74 6d 5f 77 64 61 79 20 3d 20 70 54 6d   y.tm_wday = pTm
f520: 2e 77 44 61 79 4f 66 57 65 65 6b 3b 0a 20 20 79  .wDayOfWeek;.  y
f530: 2e 74 6d 5f 6d 64 61 79 20 3d 20 70 54 6d 2e 77  .tm_mday = pTm.w
f540: 44 61 79 3b 0a 20 20 79 2e 74 6d 5f 68 6f 75 72  Day;.  y.tm_hour
f550: 20 3d 20 70 54 6d 2e 77 48 6f 75 72 3b 0a 20 20   = pTm.wHour;.  
f560: 79 2e 74 6d 5f 6d 69 6e 20 3d 20 70 54 6d 2e 77  y.tm_min = pTm.w
f570: 4d 69 6e 75 74 65 3b 0a 20 20 79 2e 74 6d 5f 73  Minute;.  y.tm_s
f580: 65 63 20 3d 20 70 54 6d 2e 77 53 65 63 6f 6e 64  ec = pTm.wSecond
f590: 3b 0a 20 20 72 65 74 75 72 6e 20 26 79 3b 0a 7d  ;.  return &y;.}
f5a0: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
f5b0: 20 48 41 4e 44 4c 45 5f 54 4f 5f 57 49 4e 46 49   HANDLE_TO_WINFI
f5c0: 4c 45 28 61 29 20 28 77 69 6e 46 69 6c 65 2a 29  LE(a) (winFile*)
f5d0: 26 28 28 63 68 61 72 2a 29 61 29 5b 2d 28 69 6e  &((char*)a)[-(in
f5e0: 74 29 6f 66 66 73 65 74 6f 66 28 77 69 6e 46 69  t)offsetof(winFi
f5f0: 6c 65 2c 68 29 5d 0a 0a 2f 2a 0a 2a 2a 20 41 63  le,h)]../*.** Ac
f600: 71 75 69 72 65 20 61 20 6c 6f 63 6b 20 6f 6e 20  quire a lock on 
f610: 74 68 65 20 68 61 6e 64 6c 65 20 68 0a 2a 2f 0a  the handle h.*/.
f620: 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 63  static void winc
f630: 65 4d 75 74 65 78 41 63 71 75 69 72 65 28 48 41  eMutexAcquire(HA
f640: 4e 44 4c 45 20 68 29 7b 0a 20 20 20 44 57 4f 52  NDLE h){.   DWOR
f650: 44 20 64 77 45 72 72 3b 0a 20 20 20 64 6f 20 7b  D dwErr;.   do {
f660: 0a 20 20 20 20 20 64 77 45 72 72 20 3d 20 6f 73  .     dwErr = os
f670: 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a  WaitForSingleObj
f680: 65 63 74 28 68 2c 20 49 4e 46 49 4e 49 54 45 29  ect(h, INFINITE)
f690: 3b 0a 20 20 20 7d 20 77 68 69 6c 65 20 28 64 77  ;.   } while (dw
f6a0: 45 72 72 20 21 3d 20 57 41 49 54 5f 4f 42 4a 45  Err != WAIT_OBJE
f6b0: 43 54 5f 30 20 26 26 20 64 77 45 72 72 20 21 3d  CT_0 && dwErr !=
f6c0: 20 57 41 49 54 5f 41 42 41 4e 44 4f 4e 45 44 29   WAIT_ABANDONED)
f6d0: 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73  ;.}./*.** Releas
f6e0: 65 20 61 20 6c 6f 63 6b 20 61 63 71 75 69 72 65  e a lock acquire
f6f0: 64 20 62 79 20 77 69 6e 63 65 4d 75 74 65 78 41  d by winceMutexA
f700: 63 71 75 69 72 65 28 29 0a 2a 2f 0a 23 64 65 66  cquire().*/.#def
f710: 69 6e 65 20 77 69 6e 63 65 4d 75 74 65 78 52 65  ine winceMutexRe
f720: 6c 65 61 73 65 28 68 29 20 52 65 6c 65 61 73 65  lease(h) Release
f730: 4d 75 74 65 78 28 68 29 0a 0a 2f 2a 0a 2a 2a 20  Mutex(h)../*.** 
f740: 43 72 65 61 74 65 20 74 68 65 20 6d 75 74 65 78  Create the mutex
f750: 20 61 6e 64 20 73 68 61 72 65 64 20 6d 65 6d 6f   and shared memo
f760: 72 79 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b  ry used for lock
f770: 69 6e 67 20 69 6e 20 74 68 65 20 66 69 6c 65 0a  ing in the file.
f780: 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20 70 46  ** descriptor pF
f790: 69 6c 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ile.*/.static in
f7a0: 74 20 77 69 6e 63 65 43 72 65 61 74 65 4c 6f 63  t winceCreateLoc
f7b0: 6b 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  k(const char *zF
f7c0: 69 6c 65 6e 61 6d 65 2c 20 77 69 6e 46 69 6c 65  ilename, winFile
f7d0: 20 2a 70 46 69 6c 65 29 7b 0a 20 20 4c 50 57 53   *pFile){.  LPWS
f7e0: 54 52 20 7a 54 6f 6b 3b 0a 20 20 4c 50 57 53 54  TR zTok;.  LPWST
f7f0: 52 20 7a 4e 61 6d 65 3b 0a 20 20 44 57 4f 52 44  R zName;.  DWORD
f800: 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 42 4f   lastErrno;.  BO
f810: 4f 4c 20 62 4c 6f 67 67 65 64 20 3d 20 46 41 4c  OL bLogged = FAL
f820: 53 45 3b 0a 20 20 42 4f 4f 4c 20 62 49 6e 69 74  SE;.  BOOL bInit
f830: 20 3d 20 54 52 55 45 3b 0a 0a 20 20 7a 4e 61 6d   = TRUE;..  zNam
f840: 65 20 3d 20 77 69 6e 55 74 66 38 54 6f 55 6e 69  e = winUtf8ToUni
f850: 63 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  code(zFilename);
f860: 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20  .  if( zName==0 
f870: 29 7b 0a 20 20 20 20 2f 2a 20 6f 75 74 20 6f 66  ){.    /* out of
f880: 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 20 20 72   memory */.    r
f890: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
f8a0: 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20  RR_NOMEM;.  }.. 
f8b0: 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
f8c0: 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 64 61 74  he local lockdat
f8d0: 61 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 70  a */.  memset(&p
f8e0: 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2c 20 30 2c 20  File->local, 0, 
f8f0: 73 69 7a 65 6f 66 28 70 46 69 6c 65 2d 3e 6c 6f  sizeof(pFile->lo
f900: 63 61 6c 29 29 3b 0a 0a 20 20 2f 2a 20 52 65 70  cal));..  /* Rep
f910: 6c 61 63 65 20 74 68 65 20 62 61 63 6b 73 6c 61  lace the backsla
f920: 73 68 65 73 20 66 72 6f 6d 20 74 68 65 20 66 69  shes from the fi
f930: 6c 65 6e 61 6d 65 20 61 6e 64 20 6c 6f 77 65 72  lename and lower
f940: 63 61 73 65 20 69 74 0a 20 20 2a 2a 20 74 6f 20  case it.  ** to 
f950: 64 65 72 69 76 65 20 61 20 6d 75 74 65 78 20 6e  derive a mutex n
f960: 61 6d 65 2e 20 2a 2f 0a 20 20 7a 54 6f 6b 20 3d  ame. */.  zTok =
f970: 20 6f 73 43 68 61 72 4c 6f 77 65 72 57 28 7a 4e   osCharLowerW(zN
f980: 61 6d 65 29 3b 0a 20 20 66 6f 72 20 28 3b 2a 7a  ame);.  for (;*z
f990: 54 6f 6b 3b 7a 54 6f 6b 2b 2b 29 7b 0a 20 20 20  Tok;zTok++){.   
f9a0: 20 69 66 20 28 2a 7a 54 6f 6b 20 3d 3d 20 27 5c   if (*zTok == '\
f9b0: 5c 27 29 20 2a 7a 54 6f 6b 20 3d 20 27 5f 27 3b  \') *zTok = '_';
f9c0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 72 65 61 74  .  }..  /* Creat
f9d0: 65 2f 6f 70 65 6e 20 74 68 65 20 6e 61 6d 65 64  e/open the named
f9e0: 20 6d 75 74 65 78 20 2a 2f 0a 20 20 70 46 69 6c   mutex */.  pFil
f9f0: 65 2d 3e 68 4d 75 74 65 78 20 3d 20 6f 73 43 72  e->hMutex = osCr
fa00: 65 61 74 65 4d 75 74 65 78 57 28 4e 55 4c 4c 2c  eateMutexW(NULL,
fa10: 20 46 41 4c 53 45 2c 20 7a 4e 61 6d 65 29 3b 0a   FALSE, zName);.
fa20: 20 20 69 66 20 28 21 70 46 69 6c 65 2d 3e 68 4d    if (!pFile->hM
fa30: 75 74 65 78 29 7b 0a 20 20 20 20 70 46 69 6c 65  utex){.    pFile
fa40: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73  ->lastErrno = os
fa50: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
fa60: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
fa70: 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74  (zName);.    ret
fa80: 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  urn winLogError(
fa90: 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 70 46  SQLITE_IOERR, pF
faa0: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a  ile->lastErrno,.
fab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fac0: 20 20 20 20 20 20 20 22 77 69 6e 63 65 43 72 65         "winceCre
fad0: 61 74 65 4c 6f 63 6b 31 22 2c 20 7a 46 69 6c 65  ateLock1", zFile
fae0: 6e 61 6d 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  name);.  }..  /*
faf0: 20 41 63 71 75 69 72 65 20 74 68 65 20 6d 75 74   Acquire the mut
fb00: 65 78 20 62 65 66 6f 72 65 20 63 6f 6e 74 69 6e  ex before contin
fb10: 75 69 6e 67 20 2a 2f 0a 20 20 77 69 6e 63 65 4d  uing */.  winceM
fb20: 75 74 65 78 41 63 71 75 69 72 65 28 70 46 69 6c  utexAcquire(pFil
fb30: 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 0a 20 20 2f  e->hMutex);..  /
fb40: 2a 20 53 69 6e 63 65 20 74 68 65 20 6e 61 6d 65  * Since the name
fb50: 73 20 6f 66 20 6e 61 6d 65 64 20 6d 75 74 65 78  s of named mutex
fb60: 65 73 2c 20 73 65 6d 61 70 68 6f 72 65 73 2c 20  es, semaphores, 
fb70: 66 69 6c 65 20 6d 61 70 70 69 6e 67 73 20 65 74  file mappings et
fb80: 63 20 61 72 65 0a 20 20 2a 2a 20 63 61 73 65 2d  c are.  ** case-
fb90: 73 65 6e 73 69 74 69 76 65 2c 20 74 61 6b 65 20  sensitive, take 
fba0: 61 64 76 61 6e 74 61 67 65 20 6f 66 20 74 68 61  advantage of tha
fbb0: 74 20 62 79 20 75 70 70 65 72 63 61 73 69 6e 67  t by uppercasing
fbc0: 20 74 68 65 20 6d 75 74 65 78 20 6e 61 6d 65 0a   the mutex name.
fbd0: 20 20 2a 2a 20 61 6e 64 20 75 73 69 6e 67 20 74    ** and using t
fbe0: 68 61 74 20 61 73 20 74 68 65 20 73 68 61 72 65  hat as the share
fbf0: 64 20 66 69 6c 65 6d 61 70 70 69 6e 67 20 6e 61  d filemapping na
fc00: 6d 65 2e 0a 20 20 2a 2f 0a 20 20 6f 73 43 68 61  me..  */.  osCha
fc10: 72 55 70 70 65 72 57 28 7a 4e 61 6d 65 29 3b 0a  rUpperW(zName);.
fc20: 20 20 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64    pFile->hShared
fc30: 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d   = osCreateFileM
fc40: 61 70 70 69 6e 67 57 28 49 4e 56 41 4c 49 44 5f  appingW(INVALID_
fc50: 48 41 4e 44 4c 45 5f 56 41 4c 55 45 2c 20 4e 55  HANDLE_VALUE, NU
fc60: 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  LL,.            
fc70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc80: 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45              PAGE
fc90: 5f 52 45 41 44 57 52 49 54 45 2c 20 30 2c 20 73  _READWRITE, 0, s
fca0: 69 7a 65 6f 66 28 77 69 6e 63 65 4c 6f 63 6b 29  izeof(winceLock)
fcb0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
fcc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fcd0: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 29            zName)
fce0: 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 61 20 66 6c  ;..  /* Set a fl
fcf0: 61 67 20 74 68 61 74 20 69 6e 64 69 63 61 74 65  ag that indicate
fd00: 73 20 77 65 27 72 65 20 74 68 65 20 66 69 72 73  s we're the firs
fd10: 74 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 20  t to create the 
fd20: 6d 65 6d 6f 72 79 20 73 6f 20 69 74 0a 20 20 2a  memory so it.  *
fd30: 2a 20 6d 75 73 74 20 62 65 20 7a 65 72 6f 2d 69  * must be zero-i
fd40: 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20  nitialized */.  
fd50: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
fd60: 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
fd70: 69 66 20 28 6c 61 73 74 45 72 72 6e 6f 20 3d 3d  if (lastErrno ==
fd80: 20 45 52 52 4f 52 5f 41 4c 52 45 41 44 59 5f 45   ERROR_ALREADY_E
fd90: 58 49 53 54 53 29 7b 0a 20 20 20 20 62 49 6e 69  XISTS){.    bIni
fda0: 74 20 3d 20 46 41 4c 53 45 3b 0a 20 20 7d 0a 0a  t = FALSE;.  }..
fdb0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
fdc0: 4e 61 6d 65 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  Name);..  /* If 
fdd0: 77 65 20 73 75 63 63 65 65 64 65 64 20 69 6e 20  we succeeded in 
fde0: 6d 61 6b 69 6e 67 20 74 68 65 20 73 68 61 72 65  making the share
fdf0: 64 20 6d 65 6d 6f 72 79 20 68 61 6e 64 6c 65 2c  d memory handle,
fe00: 20 6d 61 70 20 69 74 2e 20 2a 2f 0a 20 20 69 66   map it. */.  if
fe10: 28 20 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64  ( pFile->hShared
fe20: 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 73   ){.    pFile->s
fe30: 68 61 72 65 64 20 3d 20 28 77 69 6e 63 65 4c 6f  hared = (winceLo
fe40: 63 6b 2a 29 6f 73 4d 61 70 56 69 65 77 4f 66 46  ck*)osMapViewOfF
fe50: 69 6c 65 28 70 46 69 6c 65 2d 3e 68 53 68 61 72  ile(pFile->hShar
fe60: 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ed,.            
fe70: 20 46 49 4c 45 5f 4d 41 50 5f 52 45 41 44 7c 46   FILE_MAP_READ|F
fe80: 49 4c 45 5f 4d 41 50 5f 57 52 49 54 45 2c 20 30  ILE_MAP_WRITE, 0
fe90: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 69 6e 63  , 0, sizeof(winc
fea0: 65 4c 6f 63 6b 29 29 3b 0a 20 20 20 20 2f 2a 20  eLock));.    /* 
feb0: 49 66 20 6d 61 70 70 69 6e 67 20 66 61 69 6c 65  If mapping faile
fec0: 64 2c 20 63 6c 6f 73 65 20 74 68 65 20 73 68 61  d, close the sha
fed0: 72 65 64 20 6d 65 6d 6f 72 79 20 68 61 6e 64 6c  red memory handl
fee0: 65 20 61 6e 64 20 65 72 61 73 65 20 69 74 20 2a  e and erase it *
fef0: 2f 0a 20 20 20 20 69 66 28 20 21 70 46 69 6c 65  /.    if( !pFile
ff00: 2d 3e 73 68 61 72 65 64 20 29 7b 0a 20 20 20 20  ->shared ){.    
ff10: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
ff20: 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
ff30: 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 77 69 6e  ror();.      win
ff40: 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
ff50: 49 4f 45 52 52 2c 20 70 46 69 6c 65 2d 3e 6c 61  IOERR, pFile->la
ff60: 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
ff70: 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 63             "winc
ff80: 65 43 72 65 61 74 65 4c 6f 63 6b 32 22 2c 20 7a  eCreateLock2", z
ff90: 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Filename);.     
ffa0: 20 62 4c 6f 67 67 65 64 20 3d 20 54 52 55 45 3b   bLogged = TRUE;
ffb0: 0a 20 20 20 20 20 20 6f 73 43 6c 6f 73 65 48 61  .      osCloseHa
ffc0: 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 53 68 61  ndle(pFile->hSha
ffd0: 72 65 64 29 3b 0a 20 20 20 20 20 20 70 46 69 6c  red);.      pFil
ffe0: 65 2d 3e 68 53 68 61 72 65 64 20 3d 20 4e 55 4c  e->hShared = NUL
fff0: 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  L;.    }.  }..  
10000 2f 2a 20 49 66 20 73 68 61 72 65 64 20 6d 65 6d  /* If shared mem
10010 6f 72 79 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  ory could not be
10020 20 63 72 65 61 74 65 64 2c 20 74 68 65 6e 20 63   created, then c
10030 6c 6f 73 65 20 74 68 65 20 6d 75 74 65 78 20 61  lose the mutex a
10040 6e 64 20 66 61 69 6c 20 2a 2f 0a 20 20 69 66 28  nd fail */.  if(
10050 20 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 3d   pFile->hShared=
10060 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28  =NULL ){.    if(
10070 20 21 62 4c 6f 67 67 65 64 20 29 7b 0a 20 20 20   !bLogged ){.   
10080 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
10090 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b  rno = lastErrno;
100a0 0a 20 20 20 20 20 20 77 69 6e 4c 6f 67 45 72 72  .      winLogErr
100b0 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c  or(SQLITE_IOERR,
100c0 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
100d0 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
100e0 20 20 20 20 20 22 77 69 6e 63 65 43 72 65 61 74       "winceCreat
100f0 65 4c 6f 63 6b 33 22 2c 20 7a 46 69 6c 65 6e 61  eLock3", zFilena
10100 6d 65 29 3b 0a 20 20 20 20 20 20 62 4c 6f 67 67  me);.      bLogg
10110 65 64 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d  ed = TRUE;.    }
10120 0a 20 20 20 20 77 69 6e 63 65 4d 75 74 65 78 52  .    winceMutexR
10130 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d  elease(pFile->hM
10140 75 74 65 78 29 3b 0a 20 20 20 20 6f 73 43 6c 6f  utex);.    osClo
10150 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e  seHandle(pFile->
10160 68 4d 75 74 65 78 29 3b 0a 20 20 20 20 70 46 69  hMutex);.    pFi
10170 6c 65 2d 3e 68 4d 75 74 65 78 20 3d 20 4e 55 4c  le->hMutex = NUL
10180 4c 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  L;.    return SQ
10190 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a  LITE_IOERR;.  }.
101a0 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65  .  /* Initialize
101b0 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f   the shared memo
101c0 72 79 20 69 66 20 77 65 27 72 65 20 73 75 70 70  ry if we're supp
101d0 6f 73 65 64 20 74 6f 20 2a 2f 0a 20 20 69 66 28  osed to */.  if(
101e0 20 62 49 6e 69 74 20 29 7b 0a 20 20 20 20 6d 65   bInit ){.    me
101f0 6d 73 65 74 28 70 46 69 6c 65 2d 3e 73 68 61 72  mset(pFile->shar
10200 65 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 69  ed, 0, sizeof(wi
10210 6e 63 65 4c 6f 63 6b 29 29 3b 0a 20 20 7d 0a 0a  nceLock));.  }..
10220 20 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c 65    winceMutexRele
10230 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65  ase(pFile->hMute
10240 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  x);.  return SQL
10250 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
10260 20 44 65 73 74 72 6f 79 20 74 68 65 20 70 61 72   Destroy the par
10270 74 20 6f 66 20 77 69 6e 46 69 6c 65 20 74 68 61  t of winFile tha
10280 74 20 64 65 61 6c 73 20 77 69 74 68 20 77 69 6e  t deals with win
10290 63 65 20 6c 6f 63 6b 73 0a 2a 2f 0a 73 74 61 74  ce locks.*/.stat
102a0 69 63 20 76 6f 69 64 20 77 69 6e 63 65 44 65 73  ic void winceDes
102b0 74 72 6f 79 4c 6f 63 6b 28 77 69 6e 46 69 6c 65  troyLock(winFile
102c0 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 66 20 28   *pFile){.  if (
102d0 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 7b 0a  pFile->hMutex){.
102e0 20 20 20 20 2f 2a 20 41 63 71 75 69 72 65 20 74      /* Acquire t
102f0 68 65 20 6d 75 74 65 78 20 2a 2f 0a 20 20 20 20  he mutex */.    
10300 77 69 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72  winceMutexAcquir
10310 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29  e(pFile->hMutex)
10320 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6f  ;..    /* The fo
10330 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 73 20 73  llowing blocks s
10340 68 6f 75 6c 64 20 70 72 6f 62 61 62 6c 79 20 61  hould probably a
10350 73 73 65 72 74 20 69 6e 20 64 65 62 75 67 20 6d  ssert in debug m
10360 6f 64 65 2c 20 62 75 74 20 74 68 65 79 0a 20 20  ode, but they.  
10370 20 20 20 20 20 61 72 65 20 74 6f 20 63 6c 65 61       are to clea
10380 6e 75 70 20 69 6e 20 63 61 73 65 20 61 6e 79 20  nup in case any 
10390 6c 6f 63 6b 73 20 72 65 6d 61 69 6e 65 64 20 6f  locks remained o
103a0 70 65 6e 20 2a 2f 0a 20 20 20 20 69 66 20 28 70  pen */.    if (p
103b0 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61  File->local.nRea
103c0 64 65 72 73 29 7b 0a 20 20 20 20 20 20 70 46 69  ders){.      pFi
103d0 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 6e 52 65 61  le->shared->nRea
103e0 64 65 72 73 20 2d 2d 3b 0a 20 20 20 20 7d 0a 20  ders --;.    }. 
103f0 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f     if (pFile->lo
10400 63 61 6c 2e 62 52 65 73 65 72 76 65 64 29 7b 0a  cal.bReserved){.
10410 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61        pFile->sha
10420 72 65 64 2d 3e 62 52 65 73 65 72 76 65 64 20 3d  red->bReserved =
10430 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 20 20   FALSE;.    }.  
10440 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63    if (pFile->loc
10450 61 6c 2e 62 50 65 6e 64 69 6e 67 29 7b 0a 20 20  al.bPending){.  
10460 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65      pFile->share
10470 64 2d 3e 62 50 65 6e 64 69 6e 67 20 3d 20 46 41  d->bPending = FA
10480 4c 53 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  LSE;.    }.    i
10490 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e  f (pFile->local.
104a0 62 45 78 63 6c 75 73 69 76 65 29 7b 0a 20 20 20  bExclusive){.   
104b0 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64     pFile->shared
104c0 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 20 46  ->bExclusive = F
104d0 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ALSE;.    }..   
104e0 20 2f 2a 20 44 65 2d 72 65 66 65 72 65 6e 63 65   /* De-reference
104f0 20 61 6e 64 20 63 6c 6f 73 65 20 6f 75 72 20 63   and close our c
10500 6f 70 79 20 6f 66 20 74 68 65 20 73 68 61 72 65  opy of the share
10510 64 20 6d 65 6d 6f 72 79 20 68 61 6e 64 6c 65 20  d memory handle 
10520 2a 2f 0a 20 20 20 20 6f 73 55 6e 6d 61 70 56 69  */.    osUnmapVi
10530 65 77 4f 66 46 69 6c 65 28 70 46 69 6c 65 2d 3e  ewOfFile(pFile->
10540 73 68 61 72 65 64 29 3b 0a 20 20 20 20 6f 73 43  shared);.    osC
10550 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65  loseHandle(pFile
10560 2d 3e 68 53 68 61 72 65 64 29 3b 0a 0a 20 20 20  ->hShared);..   
10570 20 2f 2a 20 44 6f 6e 65 20 77 69 74 68 20 74 68   /* Done with th
10580 65 20 6d 75 74 65 78 20 2a 2f 0a 20 20 20 20 77  e mutex */.    w
10590 69 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65  inceMutexRelease
105a0 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b  (pFile->hMutex);
105b0 0a 20 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64  .    osCloseHand
105c0 6c 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78  le(pFile->hMutex
105d0 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68 4d  );.    pFile->hM
105e0 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d  utex = NULL;.  }
105f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6d 70  .}../*.** An imp
10600 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
10610 68 65 20 4c 6f 63 6b 46 69 6c 65 28 29 20 41 50  he LockFile() AP
10620 49 20 6f 66 20 57 69 6e 64 6f 77 73 20 66 6f 72  I of Windows for
10630 20 43 45 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f   CE.*/.static BO
10640 4f 4c 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65  OL winceLockFile
10650 28 0a 20 20 4c 50 48 41 4e 44 4c 45 20 70 68 46  (.  LPHANDLE phF
10660 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20 64 77 46  ile,.  DWORD dwF
10670 69 6c 65 4f 66 66 73 65 74 4c 6f 77 2c 0a 20 20  ileOffsetLow,.  
10680 44 57 4f 52 44 20 64 77 46 69 6c 65 4f 66 66 73  DWORD dwFileOffs
10690 65 74 48 69 67 68 2c 0a 20 20 44 57 4f 52 44 20  etHigh,.  DWORD 
106a0 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f  nNumberOfBytesTo
106b0 4c 6f 63 6b 4c 6f 77 2c 0a 20 20 44 57 4f 52 44  LockLow,.  DWORD
106c0 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54   nNumberOfBytesT
106d0 6f 4c 6f 63 6b 48 69 67 68 0a 29 7b 0a 20 20 77  oLockHigh.){.  w
106e0 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  inFile *pFile = 
106f0 48 41 4e 44 4c 45 5f 54 4f 5f 57 49 4e 46 49 4c  HANDLE_TO_WINFIL
10700 45 28 70 68 46 69 6c 65 29 3b 0a 20 20 42 4f 4f  E(phFile);.  BOO
10710 4c 20 62 52 65 74 75 72 6e 20 3d 20 46 41 4c 53  L bReturn = FALS
10720 45 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  E;..  UNUSED_PAR
10730 41 4d 45 54 45 52 28 64 77 46 69 6c 65 4f 66 66  AMETER(dwFileOff
10740 73 65 74 48 69 67 68 29 3b 0a 20 20 55 4e 55 53  setHigh);.  UNUS
10750 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 4e 75  ED_PARAMETER(nNu
10760 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63  mberOfBytesToLoc
10770 6b 48 69 67 68 29 3b 0a 0a 20 20 69 66 20 28 21  kHigh);..  if (!
10780 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 20 72  pFile->hMutex) r
10790 65 74 75 72 6e 20 54 52 55 45 3b 0a 20 20 77 69  eturn TRUE;.  wi
107a0 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72 65 28  nceMutexAcquire(
107b0 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a  pFile->hMutex);.
107c0 0a 20 20 2f 2a 20 57 61 6e 74 69 6e 67 20 61 6e  .  /* Wanting an
107d0 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 3f   exclusive lock?
107e0 20 2a 2f 0a 20 20 69 66 20 28 64 77 46 69 6c 65   */.  if (dwFile
107f0 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57  OffsetLow == (DW
10800 4f 52 44 29 53 48 41 52 45 44 5f 46 49 52 53 54  ORD)SHARED_FIRST
10810 0a 20 20 20 20 20 20 20 26 26 20 6e 4e 75 6d 62  .       && nNumb
10820 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c  erOfBytesToLockL
10830 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41  ow == (DWORD)SHA
10840 52 45 44 5f 53 49 5a 45 29 7b 0a 20 20 20 20 69  RED_SIZE){.    i
10850 66 20 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64  f (pFile->shared
10860 2d 3e 6e 52 65 61 64 65 72 73 20 3d 3d 20 30 20  ->nReaders == 0 
10870 26 26 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64  && pFile->shared
10880 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 3d 20  ->bExclusive == 
10890 30 29 7b 0a 20 20 20 20 20 20 20 70 46 69 6c 65  0){.       pFile
108a0 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75  ->shared->bExclu
108b0 73 69 76 65 20 3d 20 54 52 55 45 3b 0a 20 20 20  sive = TRUE;.   
108c0 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c      pFile->local
108d0 2e 62 45 78 63 6c 75 73 69 76 65 20 3d 20 54 52  .bExclusive = TR
108e0 55 45 3b 0a 20 20 20 20 20 20 20 62 52 65 74 75  UE;.       bRetu
108f0 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d  rn = TRUE;.    }
10900 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 61 6e 74 20  .  }..  /* Want 
10910 61 20 72 65 61 64 2d 6f 6e 6c 79 20 6c 6f 63 6b  a read-only lock
10920 3f 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20 28  ? */.  else if (
10930 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20  dwFileOffsetLow 
10940 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45 44  == (DWORD)SHARED
10950 5f 46 49 52 53 54 20 26 26 0a 20 20 20 20 20 20  _FIRST &&.      
10960 20 20 20 20 20 6e 4e 75 6d 62 65 72 4f 66 42 79       nNumberOfBy
10970 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20  tesToLockLow == 
10980 31 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c  1){.    if (pFil
10990 65 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c  e->shared->bExcl
109a0 75 73 69 76 65 20 3d 3d 20 30 29 7b 0a 20 20 20  usive == 0){.   
109b0 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e     pFile->local.
109c0 6e 52 65 61 64 65 72 73 20 2b 2b 3b 0a 20 20 20  nReaders ++;.   
109d0 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f     if (pFile->lo
109e0 63 61 6c 2e 6e 52 65 61 64 65 72 73 20 3d 3d 20  cal.nReaders == 
109f0 31 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c  1){.        pFil
10a00 65 2d 3e 73 68 61 72 65 64 2d 3e 6e 52 65 61 64  e->shared->nRead
10a10 65 72 73 20 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  ers ++;.      }.
10a20 20 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20        bReturn = 
10a30 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  TRUE;.    }.  }.
10a40 0a 20 20 2f 2a 20 57 61 6e 74 20 61 20 70 65 6e  .  /* Want a pen
10a50 64 69 6e 67 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20  ding lock? */.  
10a60 65 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f  else if (dwFileO
10a70 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f  ffsetLow == (DWO
10a80 52 44 29 50 45 4e 44 49 4e 47 5f 42 59 54 45 0a  RD)PENDING_BYTE.
10a90 20 20 20 20 20 20 20 20 20 20 20 26 26 20 6e 4e             && nN
10aa0 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f  umberOfBytesToLo
10ab0 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20  ckLow == 1){.   
10ac0 20 2f 2a 20 49 66 20 6e 6f 20 70 65 6e 64 69 6e   /* If no pendin
10ad0 67 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20  g lock has been 
10ae0 61 63 71 75 69 72 65 64 2c 20 74 68 65 6e 20 61  acquired, then a
10af0 63 71 75 69 72 65 20 69 74 20 2a 2f 0a 20 20 20  cquire it */.   
10b00 20 69 66 20 28 70 46 69 6c 65 2d 3e 73 68 61 72   if (pFile->shar
10b10 65 64 2d 3e 62 50 65 6e 64 69 6e 67 20 3d 3d 20  ed->bPending == 
10b20 30 29 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  0) {.      pFile
10b30 2d 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e 64 69  ->shared->bPendi
10b40 6e 67 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20  ng = TRUE;.     
10b50 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50   pFile->local.bP
10b60 65 6e 64 69 6e 67 20 3d 20 54 52 55 45 3b 0a 20  ending = TRUE;. 
10b70 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54       bReturn = T
10b80 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  RUE;.    }.  }..
10b90 20 20 2f 2a 20 57 61 6e 74 20 61 20 72 65 73 65    /* Want a rese
10ba0 72 76 65 64 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20  rved lock? */.  
10bb0 65 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f  else if (dwFileO
10bc0 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f  ffsetLow == (DWO
10bd0 52 44 29 52 45 53 45 52 56 45 44 5f 42 59 54 45  RD)RESERVED_BYTE
10be0 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20 6e  .           && n
10bf0 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c  NumberOfBytesToL
10c00 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20  ockLow == 1){.  
10c10 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 73 68 61    if (pFile->sha
10c20 72 65 64 2d 3e 62 52 65 73 65 72 76 65 64 20 3d  red->bReserved =
10c30 3d 20 30 29 20 7b 0a 20 20 20 20 20 20 70 46 69  = 0) {.      pFi
10c40 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52 65 73  le->shared->bRes
10c50 65 72 76 65 64 20 3d 20 54 52 55 45 3b 0a 20 20  erved = TRUE;.  
10c60 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c      pFile->local
10c70 2e 62 52 65 73 65 72 76 65 64 20 3d 20 54 52 55  .bReserved = TRU
10c80 45 3b 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e  E;.      bReturn
10c90 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20   = TRUE;.    }. 
10ca0 20 7d 0a 0a 20 20 77 69 6e 63 65 4d 75 74 65 78   }..  winceMutex
10cb0 52 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68  Release(pFile->h
10cc0 4d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  Mutex);.  return
10cd0 20 62 52 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a   bReturn;.}../*.
10ce0 2a 2a 20 41 6e 20 69 6d 70 6c 65 6d 65 6e 74 61  ** An implementa
10cf0 74 69 6f 6e 20 6f 66 20 74 68 65 20 55 6e 6c 6f  tion of the Unlo
10d00 63 6b 46 69 6c 65 20 41 50 49 20 6f 66 20 57 69  ckFile API of Wi
10d10 6e 64 6f 77 73 20 66 6f 72 20 43 45 0a 2a 2f 0a  ndows for CE.*/.
10d20 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 63  static BOOL winc
10d30 65 55 6e 6c 6f 63 6b 46 69 6c 65 28 0a 20 20 4c  eUnlockFile(.  L
10d40 50 48 41 4e 44 4c 45 20 70 68 46 69 6c 65 2c 0a  PHANDLE phFile,.
10d50 20 20 44 57 4f 52 44 20 64 77 46 69 6c 65 4f 66    DWORD dwFileOf
10d60 66 73 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44  fsetLow,.  DWORD
10d70 20 64 77 46 69 6c 65 4f 66 66 73 65 74 48 69 67   dwFileOffsetHig
10d80 68 2c 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62  h,.  DWORD nNumb
10d90 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63  erOfBytesToUnloc
10da0 6b 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6e 4e  kLow,.  DWORD nN
10db0 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e  umberOfBytesToUn
10dc0 6c 6f 63 6b 48 69 67 68 0a 29 7b 0a 20 20 77 69  lockHigh.){.  wi
10dd0 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 48  nFile *pFile = H
10de0 41 4e 44 4c 45 5f 54 4f 5f 57 49 4e 46 49 4c 45  ANDLE_TO_WINFILE
10df0 28 70 68 46 69 6c 65 29 3b 0a 20 20 42 4f 4f 4c  (phFile);.  BOOL
10e00 20 62 52 65 74 75 72 6e 20 3d 20 46 41 4c 53 45   bReturn = FALSE
10e10 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ;..  UNUSED_PARA
10e20 4d 45 54 45 52 28 64 77 46 69 6c 65 4f 66 66 73  METER(dwFileOffs
10e30 65 74 48 69 67 68 29 3b 0a 20 20 55 4e 55 53 45  etHigh);.  UNUSE
10e40 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 4e 75 6d  D_PARAMETER(nNum
10e50 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f  berOfBytesToUnlo
10e60 63 6b 48 69 67 68 29 3b 0a 0a 20 20 69 66 20 28  ckHigh);..  if (
10e70 21 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 20  !pFile->hMutex) 
10e80 72 65 74 75 72 6e 20 54 52 55 45 3b 0a 20 20 77  return TRUE;.  w
10e90 69 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72 65  inceMutexAcquire
10ea0 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b  (pFile->hMutex);
10eb0 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73 69 6e 67  ..  /* Releasing
10ec0 20 61 20 72 65 61 64 65 72 20 6c 6f 63 6b 20 6f   a reader lock o
10ed0 72 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  r an exclusive l
10ee0 6f 63 6b 20 2a 2f 0a 20 20 69 66 20 28 64 77 46  ock */.  if (dwF
10ef0 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20  ileOffsetLow == 
10f00 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f 46 49  (DWORD)SHARED_FI
10f10 52 53 54 29 7b 0a 20 20 20 20 2f 2a 20 44 69 64  RST){.    /* Did
10f20 20 77 65 20 68 61 76 65 20 61 6e 20 65 78 63 6c   we have an excl
10f30 75 73 69 76 65 20 6c 6f 63 6b 3f 20 2a 2f 0a 20  usive lock? */. 
10f40 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f     if (pFile->lo
10f50 63 61 6c 2e 62 45 78 63 6c 75 73 69 76 65 29 7b  cal.bExclusive){
10f60 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 6e 4e  .      assert(nN
10f70 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e  umberOfBytesToUn
10f80 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 28 44 57 4f 52  lockLow == (DWOR
10f90 44 29 53 48 41 52 45 44 5f 53 49 5a 45 29 3b 0a  D)SHARED_SIZE);.
10fa0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63        pFile->loc
10fb0 61 6c 2e 62 45 78 63 6c 75 73 69 76 65 20 3d 20  al.bExclusive = 
10fc0 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 70 46 69  FALSE;.      pFi
10fd0 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78 63  le->shared->bExc
10fe0 6c 75 73 69 76 65 20 3d 20 46 41 4c 53 45 3b 0a  lusive = FALSE;.
10ff0 20 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20        bReturn = 
11000 54 52 55 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  TRUE;.    }..   
11010 20 2f 2a 20 44 69 64 20 77 65 20 6a 75 73 74 20   /* Did we just 
11020 68 61 76 65 20 61 20 72 65 61 64 65 72 20 6c 6f  have a reader lo
11030 63 6b 3f 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20  ck? */.    else 
11040 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c  if (pFile->local
11050 2e 6e 52 65 61 64 65 72 73 29 7b 0a 20 20 20 20  .nReaders){.    
11060 20 20 61 73 73 65 72 74 28 6e 4e 75 6d 62 65 72    assert(nNumber
11070 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c  OfBytesToUnlockL
11080 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41  ow == (DWORD)SHA
11090 52 45 44 5f 53 49 5a 45 0a 20 20 20 20 20 20 20  RED_SIZE.       
110a0 20 20 20 20 20 20 7c 7c 20 6e 4e 75 6d 62 65 72        || nNumber
110b0 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c  OfBytesToUnlockL
110c0 6f 77 20 3d 3d 20 31 29 3b 0a 20 20 20 20 20 20  ow == 1);.      
110d0 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65  pFile->local.nRe
110e0 61 64 65 72 73 20 2d 2d 3b 0a 20 20 20 20 20 20  aders --;.      
110f0 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c  if (pFile->local
11100 2e 6e 52 65 61 64 65 72 73 20 3d 3d 20 30 29 0a  .nReaders == 0).
11110 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
11120 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 6e  pFile->shared->n
11130 52 65 61 64 65 72 73 20 2d 2d 3b 0a 20 20 20 20  Readers --;.    
11140 20 20 7d 0a 20 20 20 20 20 20 62 52 65 74 75 72    }.      bRetur
11150 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a  n = TRUE;.    }.
11160 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73    }..  /* Releas
11170 69 6e 67 20 61 20 70 65 6e 64 69 6e 67 20 6c 6f  ing a pending lo
11180 63 6b 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20  ck */.  else if 
11190 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77  (dwFileOffsetLow
111a0 20 3d 3d 20 28 44 57 4f 52 44 29 50 45 4e 44 49   == (DWORD)PENDI
111b0 4e 47 5f 42 59 54 45 0a 20 20 20 20 20 20 20 20  NG_BYTE.        
111c0 20 20 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42     && nNumberOfB
111d0 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20  ytesToUnlockLow 
111e0 3d 3d 20 31 29 7b 0a 20 20 20 20 69 66 20 28 70  == 1){.    if (p
111f0 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e  File->local.bPen
11200 64 69 6e 67 29 7b 0a 20 20 20 20 20 20 70 46 69  ding){.      pFi
11210 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69  le->local.bPendi
11220 6e 67 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20  ng = FALSE;.    
11230 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d    pFile->shared-
11240 3e 62 50 65 6e 64 69 6e 67 20 3d 20 46 41 4c 53  >bPending = FALS
11250 45 3b 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e  E;.      bReturn
11260 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20   = TRUE;.    }. 
11270 20 7d 0a 20 20 2f 2a 20 52 65 6c 65 61 73 69 6e   }.  /* Releasin
11280 67 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63  g a reserved loc
11290 6b 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20 28  k */.  else if (
112a0 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20  dwFileOffsetLow 
112b0 3d 3d 20 28 44 57 4f 52 44 29 52 45 53 45 52 56  == (DWORD)RESERV
112c0 45 44 5f 42 59 54 45 0a 20 20 20 20 20 20 20 20  ED_BYTE.        
112d0 20 20 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42     && nNumberOfB
112e0 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20  ytesToUnlockLow 
112f0 3d 3d 20 31 29 7b 0a 20 20 20 20 69 66 20 28 70  == 1){.    if (p
11300 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73  File->local.bRes
11310 65 72 76 65 64 29 20 7b 0a 20 20 20 20 20 20 70  erved) {.      p
11320 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73  File->local.bRes
11330 65 72 76 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20  erved = FALSE;. 
11340 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72       pFile->shar
11350 65 64 2d 3e 62 52 65 73 65 72 76 65 64 20 3d 20  ed->bReserved = 
11360 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 62 52 65  FALSE;.      bRe
11370 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20  turn = TRUE;.   
11380 20 7d 0a 20 20 7d 0a 0a 20 20 77 69 6e 63 65 4d   }.  }..  winceM
11390 75 74 65 78 52 65 6c 65 61 73 65 28 70 46 69 6c  utexRelease(pFil
113a0 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 72 65  e->hMutex);.  re
113b0 74 75 72 6e 20 62 52 65 74 75 72 6e 3b 0a 7d 0a  turn bReturn;.}.
113c0 2f 2a 0a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65  /*.** End of the
113d0 20 73 70 65 63 69 61 6c 20 63 6f 64 65 20 66 6f   special code fo
113e0 72 20 77 69 6e 63 65 0a 2a 2a 2a 2a 2a 2a 2a 2a  r wince.********
113f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11400 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11410 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11420 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11430 2a 2a 2a 2a 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a  *****/.#endif /*
11440 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
11450 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20   */../*.** Lock 
11460 61 20 66 69 6c 65 20 72 65 67 69 6f 6e 2e 0a 2a  a file region..*
11470 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69  /.static BOOL wi
11480 6e 4c 6f 63 6b 46 69 6c 65 28 0a 20 20 4c 50 48  nLockFile(.  LPH
11490 41 4e 44 4c 45 20 70 68 46 69 6c 65 2c 0a 20 20  ANDLE phFile,.  
114a0 44 57 4f 52 44 20 66 6c 61 67 73 2c 0a 20 20 44  DWORD flags,.  D
114b0 57 4f 52 44 20 6f 66 66 73 65 74 4c 6f 77 2c 0a  WORD offsetLow,.
114c0 20 20 44 57 4f 52 44 20 6f 66 66 73 65 74 48 69    DWORD offsetHi
114d0 67 68 2c 0a 20 20 44 57 4f 52 44 20 6e 75 6d 42  gh,.  DWORD numB
114e0 79 74 65 73 4c 6f 77 2c 0a 20 20 44 57 4f 52 44  ytesLow,.  DWORD
114f0 20 6e 75 6d 42 79 74 65 73 48 69 67 68 0a 29 7b   numBytesHigh.){
11500 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
11510 49 4e 43 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4e  INCE.  /*.  ** N
11520 4f 54 45 3a 20 57 69 6e 64 6f 77 73 20 43 45 20  OTE: Windows CE 
11530 69 73 20 68 61 6e 64 6c 65 64 20 64 69 66 66 65  is handled diffe
11540 72 65 6e 74 6c 79 20 68 65 72 65 20 64 75 65 20  rently here due 
11550 69 74 73 20 6c 61 63 6b 20 6f 66 20 74 68 65 20  its lack of the 
11560 57 69 6e 33 32 0a 20 20 2a 2a 20 20 20 20 20 20  Win32.  **      
11570 20 41 50 49 20 4c 6f 63 6b 46 69 6c 65 2e 0a 20   API LockFile.. 
11580 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 77 69 6e   */.  return win
11590 63 65 4c 6f 63 6b 46 69 6c 65 28 70 68 46 69 6c  ceLockFile(phFil
115a0 65 2c 20 6f 66 66 73 65 74 4c 6f 77 2c 20 6f 66  e, offsetLow, of
115b0 66 73 65 74 48 69 67 68 2c 0a 20 20 20 20 20 20  fsetHigh,.      
115c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
115d0 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 20 6e 75   numBytesLow, nu
115e0 6d 42 79 74 65 73 48 69 67 68 29 3b 0a 23 65 6c  mBytesHigh);.#el
115f0 73 65 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28  se.  if( osIsNT(
11600 29 20 29 7b 0a 20 20 20 20 4f 56 45 52 4c 41 50  ) ){.    OVERLAP
11610 50 45 44 20 6f 76 6c 70 3b 0a 20 20 20 20 6d 65  PED ovlp;.    me
11620 6d 73 65 74 28 26 6f 76 6c 70 2c 20 30 2c 20 73  mset(&ovlp, 0, s
11630 69 7a 65 6f 66 28 4f 56 45 52 4c 41 50 50 45 44  izeof(OVERLAPPED
11640 29 29 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66 66  ));.    ovlp.Off
11650 73 65 74 20 3d 20 6f 66 66 73 65 74 4c 6f 77 3b  set = offsetLow;
11660 0a 20 20 20 20 6f 76 6c 70 2e 4f 66 66 73 65 74  .    ovlp.Offset
11670 48 69 67 68 20 3d 20 6f 66 66 73 65 74 48 69 67  High = offsetHig
11680 68 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6f 73  h;.    return os
11690 4c 6f 63 6b 46 69 6c 65 45 78 28 2a 70 68 46 69  LockFileEx(*phFi
116a0 6c 65 2c 20 66 6c 61 67 73 2c 20 30 2c 20 6e 75  le, flags, 0, nu
116b0 6d 42 79 74 65 73 4c 6f 77 2c 20 6e 75 6d 42 79  mBytesLow, numBy
116c0 74 65 73 48 69 67 68 2c 20 26 6f 76 6c 70 29 3b  tesHigh, &ovlp);
116d0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
116e0 74 75 72 6e 20 6f 73 4c 6f 63 6b 46 69 6c 65 28  turn osLockFile(
116f0 2a 70 68 46 69 6c 65 2c 20 6f 66 66 73 65 74 4c  *phFile, offsetL
11700 6f 77 2c 20 6f 66 66 73 65 74 48 69 67 68 2c 20  ow, offsetHigh, 
11710 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 0a 20 20 20  numBytesLow,.   
11720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11730 20 20 20 6e 75 6d 42 79 74 65 73 48 69 67 68 29     numBytesHigh)
11740 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a  ;.  }.#endif.}..
11750 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 61 20 66  /*.** Unlock a f
11760 69 6c 65 20 72 65 67 69 6f 6e 2e 0a 20 2a 2f 0a  ile region.. */.
11770 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 55  static BOOL winU
11780 6e 6c 6f 63 6b 46 69 6c 65 28 0a 20 20 4c 50 48  nlockFile(.  LPH
11790 41 4e 44 4c 45 20 70 68 46 69 6c 65 2c 0a 20 20  ANDLE phFile,.  
117a0 44 57 4f 52 44 20 6f 66 66 73 65 74 4c 6f 77 2c  DWORD offsetLow,
117b0 0a 20 20 44 57 4f 52 44 20 6f 66 66 73 65 74 48  .  DWORD offsetH
117c0 69 67 68 2c 0a 20 20 44 57 4f 52 44 20 6e 75 6d  igh,.  DWORD num
117d0 42 79 74 65 73 4c 6f 77 2c 0a 20 20 44 57 4f 52  BytesLow,.  DWOR
117e0 44 20 6e 75 6d 42 79 74 65 73 48 69 67 68 0a 29  D numBytesHigh.)
117f0 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  {.#if SQLITE_OS_
11800 57 49 4e 43 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20  WINCE.  /*.  ** 
11810 4e 4f 54 45 3a 20 57 69 6e 64 6f 77 73 20 43 45  NOTE: Windows CE
11820 20 69 73 20 68 61 6e 64 6c 65 64 20 64 69 66 66   is handled diff
11830 65 72 65 6e 74 6c 79 20 68 65 72 65 20 64 75 65  erently here due
11840 20 69 74 73 20 6c 61 63 6b 20 6f 66 20 74 68 65   its lack of the
11850 20 57 69 6e 33 32 0a 20 20 2a 2a 20 20 20 20 20   Win32.  **     
11860 20 20 41 50 49 20 55 6e 6c 6f 63 6b 46 69 6c 65    API UnlockFile
11870 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ..  */.  return 
11880 77 69 6e 63 65 55 6e 6c 6f 63 6b 46 69 6c 65 28  winceUnlockFile(
11890 70 68 46 69 6c 65 2c 20 6f 66 66 73 65 74 4c 6f  phFile, offsetLo
118a0 77 2c 20 6f 66 66 73 65 74 48 69 67 68 2c 0a 20  w, offsetHigh,. 
118b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
118c0 20 20 20 20 20 20 20 20 6e 75 6d 42 79 74 65 73          numBytes
118d0 4c 6f 77 2c 20 6e 75 6d 42 79 74 65 73 48 69 67  Low, numBytesHig
118e0 68 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28 20  h);.#else.  if( 
118f0 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 20 20 20  osIsNT() ){.    
11900 4f 56 45 52 4c 41 50 50 45 44 20 6f 76 6c 70 3b  OVERLAPPED ovlp;
11910 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 6f 76 6c  .    memset(&ovl
11920 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4f 56 45  p, 0, sizeof(OVE
11930 52 4c 41 50 50 45 44 29 29 3b 0a 20 20 20 20 6f  RLAPPED));.    o
11940 76 6c 70 2e 4f 66 66 73 65 74 20 3d 20 6f 66 66  vlp.Offset = off
11950 73 65 74 4c 6f 77 3b 0a 20 20 20 20 6f 76 6c 70  setLow;.    ovlp
11960 2e 4f 66 66 73 65 74 48 69 67 68 20 3d 20 6f 66  .OffsetHigh = of
11970 66 73 65 74 48 69 67 68 3b 0a 20 20 20 20 72 65  fsetHigh;.    re
11980 74 75 72 6e 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c  turn osUnlockFil
11990 65 45 78 28 2a 70 68 46 69 6c 65 2c 20 30 2c 20  eEx(*phFile, 0, 
119a0 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 20 6e 75 6d  numBytesLow, num
119b0 42 79 74 65 73 48 69 67 68 2c 20 26 6f 76 6c 70  BytesHigh, &ovlp
119c0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
119d0 72 65 74 75 72 6e 20 6f 73 55 6e 6c 6f 63 6b 46  return osUnlockF
119e0 69 6c 65 28 2a 70 68 46 69 6c 65 2c 20 6f 66 66  ile(*phFile, off
119f0 73 65 74 4c 6f 77 2c 20 6f 66 66 73 65 74 48 69  setLow, offsetHi
11a00 67 68 2c 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c  gh, numBytesLow,
11a10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11a20 20 20 20 20 20 20 20 20 20 6e 75 6d 42 79 74 65           numByte
11a30 73 48 69 67 68 29 3b 0a 20 20 7d 0a 23 65 6e 64  sHigh);.  }.#end
11a40 69 66 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  if.}../*********
11a50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11a60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11a70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11a80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11a90 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 78 74  ****.** The next
11aa0 20 67 72 6f 75 70 20 6f 66 20 72 6f 75 74 69 6e   group of routin
11ab0 65 73 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  es implement the
11ac0 20 49 2f 4f 20 6d 65 74 68 6f 64 73 20 73 70 65   I/O methods spe
11ad0 63 69 66 69 65 64 0a 2a 2a 20 62 79 20 74 68 65  cified.** by the
11ae0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
11af0 6f 64 73 20 6f 62 6a 65 63 74 2e 0a 2a 2a 2a 2a  ods object..****
11b00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11b10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11b20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11b30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11b40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a  **********/../*.
11b50 2a 2a 20 53 6f 6d 65 20 4d 69 63 72 6f 73 6f 66  ** Some Microsof
11b60 74 20 63 6f 6d 70 69 6c 65 72 73 20 6c 61 63 6b  t compilers lack
11b70 20 74 68 69 73 20 64 65 66 69 6e 69 74 69 6f 6e   this definition
11b80 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 49 4e 56  ..*/.#ifndef INV
11b90 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f  ALID_SET_FILE_PO
11ba0 49 4e 54 45 52 0a 23 20 64 65 66 69 6e 65 20 49  INTER.# define I
11bb0 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f  NVALID_SET_FILE_
11bc0 50 4f 49 4e 54 45 52 20 28 28 44 57 4f 52 44 29  POINTER ((DWORD)
11bd0 2d 31 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  -1).#endif../*.*
11be0 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 72 65  * Move the curre
11bf0 6e 74 20 70 6f 73 69 74 69 6f 6e 20 6f 66 20 74  nt position of t
11c00 68 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 70  he file handle p
11c10 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
11c20 73 74 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 74  st.** argument t
11c30 6f 20 6f 66 66 73 65 74 20 69 4f 66 66 73 65 74  o offset iOffset
11c40 20 77 69 74 68 69 6e 20 74 68 65 20 66 69 6c 65   within the file
11c50 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  . If successful,
11c60 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2a 20 4f 74   return 0..** Ot
11c70 68 65 72 77 69 73 65 2c 20 73 65 74 20 70 46 69  herwise, set pFi
11c80 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 61 6e  le->lastErrno an
11c90 64 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72  d return non-zer
11ca0 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  o..*/.static int
11cb0 20 77 69 6e 53 65 65 6b 46 69 6c 65 28 77 69 6e   winSeekFile(win
11cc0 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 73 71 6c  File *pFile, sql
11cd0 69 74 65 33 5f 69 6e 74 36 34 20 69 4f 66 66 73  ite3_int64 iOffs
11ce0 65 74 29 7b 0a 23 69 66 20 21 53 51 4c 49 54 45  et){.#if !SQLITE
11cf0 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 4c 4f 4e 47  _OS_WINRT.  LONG
11d00 20 75 70 70 65 72 42 69 74 73 3b 20 20 20 20 20   upperBits;     
11d10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
11d20 6f 73 74 20 73 69 67 2e 20 33 32 20 62 69 74 73  ost sig. 32 bits
11d30 20 6f 66 20 6e 65 77 20 6f 66 66 73 65 74 20 2a   of new offset *
11d40 2f 0a 20 20 4c 4f 4e 47 20 6c 6f 77 65 72 42 69  /.  LONG lowerBi
11d50 74 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ts;             
11d60 20 20 20 20 2f 2a 20 4c 65 61 73 74 20 73 69 67      /* Least sig
11d70 2e 20 33 32 20 62 69 74 73 20 6f 66 20 6e 65 77  . 32 bits of new
11d80 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 44 57 4f   offset */.  DWO
11d90 52 44 20 64 77 52 65 74 3b 20 20 20 20 20 20 20  RD dwRet;       
11da0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11db0 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  Value returned b
11dc0 79 20 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72  y SetFilePointer
11dd0 28 29 20 2a 2f 0a 20 20 44 57 4f 52 44 20 6c 61  () */.  DWORD la
11de0 73 74 45 72 72 6e 6f 3b 20 20 20 20 20 20 20 20  stErrno;        
11df0 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
11e00 20 72 65 74 75 72 6e 65 64 20 62 79 20 47 65 74   returned by Get
11e10 4c 61 73 74 45 72 72 6f 72 28 29 20 2a 2f 0a 0a  LastError() */..
11e20 20 20 4f 53 54 52 41 43 45 28 28 22 53 45 45 4b    OSTRACE(("SEEK
11e30 20 66 69 6c 65 3d 25 70 2c 20 6f 66 66 73 65 74   file=%p, offset
11e40 3d 25 6c 6c 64 5c 6e 22 2c 20 70 46 69 6c 65 2d  =%lld\n", pFile-
11e50 3e 68 2c 20 69 4f 66 66 73 65 74 29 29 3b 0a 0a  >h, iOffset));..
11e60 20 20 75 70 70 65 72 42 69 74 73 20 3d 20 28 4c    upperBits = (L
11e70 4f 4e 47 29 28 28 69 4f 66 66 73 65 74 3e 3e 33  ONG)((iOffset>>3
11e80 32 29 20 26 20 30 78 37 66 66 66 66 66 66 66 29  2) & 0x7fffffff)
11e90 3b 0a 20 20 6c 6f 77 65 72 42 69 74 73 20 3d 20  ;.  lowerBits = 
11ea0 28 4c 4f 4e 47 29 28 69 4f 66 66 73 65 74 20 26  (LONG)(iOffset &
11eb0 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a 0a 20   0xffffffff);.. 
11ec0 20 2f 2a 20 41 50 49 20 6f 64 64 69 74 79 3a 20   /* API oddity: 
11ed0 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53  If successful, S
11ee0 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 28 29 20  etFilePointer() 
11ef0 72 65 74 75 72 6e 73 20 61 20 64 77 6f 72 64 0a  returns a dword.
11f00 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20    ** containing 
11f10 74 68 65 20 6c 6f 77 65 72 20 33 32 2d 62 69 74  the lower 32-bit
11f20 73 20 6f 66 20 74 68 65 20 6e 65 77 20 66 69 6c  s of the new fil
11f30 65 2d 6f 66 66 73 65 74 2e 20 4f 72 2c 20 69 66  e-offset. Or, if
11f40 20 69 74 20 66 61 69 6c 73 2c 0a 20 20 2a 2a 20   it fails,.  ** 
11f50 69 74 20 72 65 74 75 72 6e 73 20 49 4e 56 41 4c  it returns INVAL
11f60 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e  ID_SET_FILE_POIN
11f70 54 45 52 2e 20 48 6f 77 65 76 65 72 20 61 63 63  TER. However acc
11f80 6f 72 64 69 6e 67 20 74 6f 20 4d 53 44 4e 2c 0a  ording to MSDN,.
11f90 20 20 2a 2a 20 49 4e 56 41 4c 49 44 5f 53 45 54    ** INVALID_SET
11fa0 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 20 6d 61  _FILE_POINTER ma
11fb0 79 20 61 6c 73 6f 20 62 65 20 61 20 76 61 6c 69  y also be a vali
11fc0 64 20 6e 65 77 20 6f 66 66 73 65 74 2e 20 53 6f  d new offset. So
11fd0 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 0a 20 20   to determine.  
11fe0 2a 2a 20 77 68 65 74 68 65 72 20 61 6e 20 65 72  ** whether an er
11ff0 72 6f 72 20 68 61 73 20 61 63 74 75 61 6c 6c 79  ror has actually
12000 20 6f 63 63 75 72 72 65 64 2c 20 69 74 20 69 73   occurred, it is
12010 20 61 6c 73 6f 20 6e 65 63 65 73 73 61 72 79 20   also necessary 
12020 74 6f 20 63 61 6c 6c 0a 20 20 2a 2a 20 47 65 74  to call.  ** Get
12030 4c 61 73 74 45 72 72 6f 72 28 29 2e 0a 20 20 2a  LastError()..  *
12040 2f 0a 20 20 64 77 52 65 74 20 3d 20 6f 73 53 65  /.  dwRet = osSe
12050 74 46 69 6c 65 50 6f 69 6e 74 65 72 28 70 46 69  tFilePointer(pFi
12060 6c 65 2d 3e 68 2c 20 6c 6f 77 65 72 42 69 74 73  le->h, lowerBits
12070 2c 20 26 75 70 70 65 72 42 69 74 73 2c 20 46 49  , &upperBits, FI
12080 4c 45 5f 42 45 47 49 4e 29 3b 0a 0a 20 20 69 66  LE_BEGIN);..  if
12090 28 20 28 64 77 52 65 74 3d 3d 49 4e 56 41 4c 49  ( (dwRet==INVALI
120a0 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54  D_SET_FILE_POINT
120b0 45 52 0a 20 20 20 20 20 20 26 26 20 28 28 6c 61  ER.      && ((la
120c0 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
120d0 61 73 74 45 72 72 6f 72 28 29 29 21 3d 4e 4f 5f  astError())!=NO_
120e0 45 52 52 4f 52 29 29 20 29 7b 0a 20 20 20 20 70  ERROR)) ){.    p
120f0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
12100 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20  = lastErrno;.   
12110 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
12120 49 54 45 5f 49 4f 45 52 52 5f 53 45 45 4b 2c 20  ITE_IOERR_SEEK, 
12130 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
12140 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
12150 20 20 22 77 69 6e 53 65 65 6b 46 69 6c 65 22 2c    "winSeekFile",
12160 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
12170 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 53 45      OSTRACE(("SE
12180 45 4b 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53  EK file=%p, rc=S
12190 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 45 45 4b  QLITE_IOERR_SEEK
121a0 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  \n", pFile->h));
121b0 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
121c0 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22   }..  OSTRACE(("
121d0 53 45 45 4b 20 66 69 6c 65 3d 25 70 2c 20 72 63  SEEK file=%p, rc
121e0 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70  =SQLITE_OK\n", p
121f0 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 72 65 74  File->h));.  ret
12200 75 72 6e 20 30 3b 0a 23 65 6c 73 65 0a 20 20 2f  urn 0;.#else.  /
12210 2a 0a 20 20 2a 2a 20 53 61 6d 65 20 61 73 20 61  *.  ** Same as a
12220 62 6f 76 65 2c 20 65 78 63 65 70 74 20 74 68 61  bove, except tha
12230 74 20 74 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74  t this implement
12240 61 74 69 6f 6e 20 77 6f 72 6b 73 20 66 6f 72 20  ation works for 
12250 57 69 6e 52 54 2e 0a 20 20 2a 2f 0a 0a 20 20 4c  WinRT..  */..  L
12260 41 52 47 45 5f 49 4e 54 45 47 45 52 20 78 3b 20  ARGE_INTEGER x; 
12270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12280 2a 20 54 68 65 20 6e 65 77 20 6f 66 66 73 65 74  * The new offset
12290 20 2a 2f 0a 20 20 42 4f 4f 4c 20 62 52 65 74 3b   */.  BOOL bRet;
122a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
122b0 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72        /* Value r
122c0 65 74 75 72 6e 65 64 20 62 79 20 53 65 74 46 69  eturned by SetFi
122d0 6c 65 50 6f 69 6e 74 65 72 45 78 28 29 20 2a 2f  lePointerEx() */
122e0 0a 0a 20 20 78 2e 51 75 61 64 50 61 72 74 20 3d  ..  x.QuadPart =
122f0 20 69 4f 66 66 73 65 74 3b 0a 20 20 62 52 65 74   iOffset;.  bRet
12300 20 3d 20 6f 73 53 65 74 46 69 6c 65 50 6f 69 6e   = osSetFilePoin
12310 74 65 72 45 78 28 70 46 69 6c 65 2d 3e 68 2c 20  terEx(pFile->h, 
12320 78 2c 20 30 2c 20 46 49 4c 45 5f 42 45 47 49 4e  x, 0, FILE_BEGIN
12330 29 3b 0a 0a 20 20 69 66 28 21 62 52 65 74 29 7b  );..  if(!bRet){
12340 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74  .    pFile->last
12350 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
12360 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 77 69  tError();.    wi
12370 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
12380 5f 49 4f 45 52 52 5f 53 45 45 4b 2c 20 70 46 69  _IOERR_SEEK, pFi
12390 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20  le->lastErrno,. 
123a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
123b0 77 69 6e 53 65 65 6b 46 69 6c 65 22 2c 20 70 46  winSeekFile", pF
123c0 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  ile->zPath);.   
123d0 20 4f 53 54 52 41 43 45 28 28 22 53 45 45 4b 20   OSTRACE(("SEEK 
123e0 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49  file=%p, rc=SQLI
123f0 54 45 5f 49 4f 45 52 52 5f 53 45 45 4b 5c 6e 22  TE_IOERR_SEEK\n"
12400 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
12410 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
12420 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 45 45  .  OSTRACE(("SEE
12430 4b 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51  K file=%p, rc=SQ
12440 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c  LITE_OK\n", pFil
12450 65 2d 3e 68 29 29 3b 0a 20 20 72 65 74 75 72 6e  e->h));.  return
12460 20 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 69   0;.#endif.}..#i
12470 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
12480 50 5f 53 49 5a 45 3e 30 0a 2f 2a 20 46 6f 72 77  P_SIZE>0./* Forw
12490 61 72 64 20 72 65 66 65 72 65 6e 63 65 73 20 74  ard references t
124a0 6f 20 56 46 53 20 68 65 6c 70 65 72 20 6d 65 74  o VFS helper met
124b0 68 6f 64 73 20 75 73 65 64 20 66 6f 72 20 6d 65  hods used for me
124c0 6d 6f 72 79 20 6d 61 70 70 65 64 20 66 69 6c 65  mory mapped file
124d0 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  s */.static int 
124e0 77 69 6e 4d 61 70 66 69 6c 65 28 77 69 6e 46 69  winMapfile(winFi
124f0 6c 65 2a 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74  le*, sqlite3_int
12500 36 34 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  64);.static int 
12510 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28 77 69 6e  winUnmapfile(win
12520 46 69 6c 65 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a  File*);.#endif..
12530 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69  /*.** Close a fi
12540 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20  le..**.** It is 
12550 72 65 70 6f 72 74 65 64 20 74 68 61 74 20 61 6e  reported that an
12560 20 61 74 74 65 6d 70 74 20 74 6f 20 63 6c 6f 73   attempt to clos
12570 65 20 61 20 68 61 6e 64 6c 65 20 6d 69 67 68 74  e a handle might
12580 20 73 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 66 61   sometimes.** fa
12590 69 6c 2e 20 20 54 68 69 73 20 69 73 20 61 20 76  il.  This is a v
125a0 65 72 79 20 75 6e 72 65 61 73 6f 6e 61 62 6c 65  ery unreasonable
125b0 20 72 65 73 75 6c 74 2c 20 62 75 74 20 57 69 6e   result, but Win
125c0 64 6f 77 73 20 69 73 20 6e 6f 74 6f 72 69 6f 75  dows is notoriou
125d0 73 0a 2a 2a 20 66 6f 72 20 62 65 69 6e 67 20 75  s.** for being u
125e0 6e 72 65 61 73 6f 6e 61 62 6c 65 20 73 6f 20 49  nreasonable so I
125f0 20 64 6f 20 6e 6f 74 20 64 6f 75 62 74 20 74 68   do not doubt th
12600 61 74 20 69 74 20 6d 69 67 68 74 20 68 61 70 70  at it might happ
12610 65 6e 2e 20 20 49 66 0a 2a 2a 20 74 68 65 20 63  en.  If.** the c
12620 6c 6f 73 65 20 66 61 69 6c 73 2c 20 77 65 20 70  lose fails, we p
12630 61 75 73 65 20 66 6f 72 20 31 30 30 20 6d 69 6c  ause for 100 mil
12640 6c 69 73 65 63 6f 6e 64 73 20 61 6e 64 20 74 72  liseconds and tr
12650 79 20 61 67 61 69 6e 2e 20 20 41 73 0a 2a 2a 20  y again.  As.** 
12660 6d 61 6e 79 20 61 73 20 4d 58 5f 43 4c 4f 53 45  many as MX_CLOSE
12670 5f 41 54 54 45 4d 50 54 20 61 74 74 65 6d 70 74  _ATTEMPT attempt
12680 73 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 20 68  s to close the h
12690 61 6e 64 6c 65 20 61 72 65 20 6d 61 64 65 20 62  andle are made b
126a0 65 66 6f 72 65 0a 2a 2a 20 67 69 76 69 6e 67 20  efore.** giving 
126b0 75 70 20 61 6e 64 20 72 65 74 75 72 6e 69 6e 67  up and returning
126c0 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 23 64   an error..*/.#d
126d0 65 66 69 6e 65 20 4d 58 5f 43 4c 4f 53 45 5f 41  efine MX_CLOSE_A
126e0 54 54 45 4d 50 54 20 33 0a 73 74 61 74 69 63 20  TTEMPT 3.static 
126f0 69 6e 74 20 77 69 6e 43 6c 6f 73 65 28 73 71 6c  int winClose(sql
12700 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a  ite3_file *id){.
12710 20 20 69 6e 74 20 72 63 2c 20 63 6e 74 20 3d 20    int rc, cnt = 
12720 30 3b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46  0;.  winFile *pF
12730 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29  ile = (winFile*)
12740 69 64 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69  id;..  assert( i
12750 64 21 3d 30 20 29 3b 0a 23 69 66 6e 64 65 66 20  d!=0 );.#ifndef 
12760 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
12770 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
12780 3e 70 53 68 6d 3d 3d 30 20 29 3b 0a 23 65 6e 64  >pShm==0 );.#end
12790 69 66 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  if.  assert( pFi
127a0 6c 65 2d 3e 68 21 3d 4e 55 4c 4c 20 26 26 20 70  le->h!=NULL && p
127b0 46 69 6c 65 2d 3e 68 21 3d 49 4e 56 41 4c 49 44  File->h!=INVALID
127c0 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b  _HANDLE_VALUE );
127d0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 43 4c 4f  .  OSTRACE(("CLO
127e0 53 45 20 66 69 6c 65 3d 25 70 5c 6e 22 2c 20 70  SE file=%p\n", p
127f0 46 69 6c 65 2d 3e 68 29 29 3b 0a 0a 23 69 66 20  File->h));..#if 
12800 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
12810 53 49 5a 45 3e 30 0a 20 20 77 69 6e 55 6e 6d 61  SIZE>0.  winUnma
12820 70 66 69 6c 65 28 70 46 69 6c 65 29 3b 0a 23 65  pfile(pFile);.#e
12830 6e 64 69 66 0a 0a 20 20 64 6f 7b 0a 20 20 20 20  ndif..  do{.    
12840 72 63 20 3d 20 6f 73 43 6c 6f 73 65 48 61 6e 64  rc = osCloseHand
12850 6c 65 28 70 46 69 6c 65 2d 3e 68 29 3b 0a 20 20  le(pFile->h);.  
12860 20 20 2f 2a 20 53 69 6d 75 6c 61 74 65 49 4f 45    /* SimulateIOE
12870 72 72 6f 72 28 20 72 63 3d 30 3b 20 63 6e 74 3d  rror( rc=0; cnt=
12880 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d 50 54  MX_CLOSE_ATTEMPT
12890 3b 20 29 3b 20 2a 2f 0a 20 20 7d 77 68 69 6c 65  ; ); */.  }while
128a0 28 20 72 63 3d 3d 30 20 26 26 20 2b 2b 63 6e 74  ( rc==0 && ++cnt
128b0 20 3c 20 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 45   < MX_CLOSE_ATTE
128c0 4d 50 54 20 26 26 20 28 73 71 6c 69 74 65 33 5f  MPT && (sqlite3_
128d0 77 69 6e 33 32 5f 73 6c 65 65 70 28 31 30 30 29  win32_sleep(100)
128e0 2c 20 31 29 20 29 3b 0a 23 69 66 20 53 51 4c 49  , 1) );.#if SQLI
128f0 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 23 64 65 66  TE_OS_WINCE.#def
12900 69 6e 65 20 57 49 4e 43 45 5f 44 45 4c 45 54 49  ine WINCE_DELETI
12910 4f 4e 5f 41 54 54 45 4d 50 54 53 20 33 0a 20 20  ON_ATTEMPTS 3.  
12920 77 69 6e 63 65 44 65 73 74 72 6f 79 4c 6f 63 6b  winceDestroyLock
12930 28 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 70  (pFile);.  if( p
12940 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43  File->zDeleteOnC
12950 6c 6f 73 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  lose ){.    int 
12960 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 77 68 69  cnt = 0;.    whi
12970 6c 65 28 0a 20 20 20 20 20 20 20 20 20 20 20 6f  le(.           o
12980 73 44 65 6c 65 74 65 46 69 6c 65 57 28 70 46 69  sDeleteFileW(pFi
12990 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f  le->zDeleteOnClo
129a0 73 65 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 26  se)==0.        &
129b0 26 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69  & osGetFileAttri
129c0 62 75 74 65 73 57 28 70 46 69 6c 65 2d 3e 7a 44  butesW(pFile->zD
129d0 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 29 21 3d 30  eleteOnClose)!=0
129e0 78 66 66 66 66 66 66 66 66 0a 20 20 20 20 20 20  xffffffff.      
129f0 20 20 26 26 20 63 6e 74 2b 2b 20 3c 20 57 49 4e    && cnt++ < WIN
12a00 43 45 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45  CE_DELETION_ATTE
12a10 4d 50 54 53 0a 20 20 20 20 29 7b 0a 20 20 20 20  MPTS.    ){.    
12a20 20 20 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32     sqlite3_win32
12a30 5f 73 6c 65 65 70 28 31 30 30 29 3b 20 20 2f 2a  _sleep(100);  /*
12a40 20 57 61 69 74 20 61 20 6c 69 74 74 6c 65 20 62   Wait a little b
12a50 65 66 6f 72 65 20 74 72 79 69 6e 67 20 61 67 61  efore trying aga
12a60 69 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20  in */.    }.    
12a70 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46 69  sqlite3_free(pFi
12a80 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f  le->zDeleteOnClo
12a90 73 65 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  se);.  }.#endif.
12aa0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
12ab0 70 46 69 6c 65 2d 3e 68 20 3d 20 4e 55 4c 4c 3b  pFile->h = NULL;
12ac0 0a 20 20 7d 0a 20 20 4f 70 65 6e 43 6f 75 6e 74  .  }.  OpenCount
12ad0 65 72 28 2d 31 29 3b 0a 20 20 4f 53 54 52 41 43  er(-1);.  OSTRAC
12ae0 45 28 28 22 43 4c 4f 53 45 20 66 69 6c 65 3d 25  E(("CLOSE file=%
12af0 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 20 70 46 69  p, rc=%s\n", pFi
12b00 6c 65 2d 3e 68 2c 20 72 63 20 3f 20 22 6f 6b 22  le->h, rc ? "ok"
12b10 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20   : "failed"));. 
12b20 20 72 65 74 75 72 6e 20 72 63 20 3f 20 53 51 4c   return rc ? SQL
12b30 49 54 45 5f 4f 4b 0a 20 20 20 20 20 20 20 20 20  ITE_OK.         
12b40 20 20 20 3a 20 77 69 6e 4c 6f 67 45 72 72 6f 72     : winLogError
12b50 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c  (SQLITE_IOERR_CL
12b60 4f 53 45 2c 20 6f 73 47 65 74 4c 61 73 74 45 72  OSE, osGetLastEr
12b70 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20  ror(),.         
12b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12b90 20 22 77 69 6e 43 6c 6f 73 65 22 2c 20 70 46 69   "winClose", pFi
12ba0 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 7d 0a 0a 2f  le->zPath);.}../
12bb0 2a 0a 2a 2a 20 52 65 61 64 20 64 61 74 61 20 66  *.** Read data f
12bc0 72 6f 6d 20 61 20 66 69 6c 65 20 69 6e 74 6f 20  rom a file into 
12bd0 61 20 62 75 66 66 65 72 2e 20 20 52 65 74 75 72  a buffer.  Retur
12be0 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 61  n SQLITE_OK if a
12bf0 6c 6c 0a 2a 2a 20 62 79 74 65 73 20 77 65 72 65  ll.** bytes were
12c00 20 72 65 61 64 20 73 75 63 63 65 73 73 66 75 6c   read successful
12c10 6c 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4f  ly and SQLITE_IO
12c20 45 52 52 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ERR if anything 
12c30 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 0a 2a  goes.** wrong..*
12c40 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
12c50 52 65 61 64 28 0a 20 20 73 71 6c 69 74 65 33 5f  Read(.  sqlite3_
12c60 66 69 6c 65 20 2a 69 64 2c 20 20 20 20 20 20 20  file *id,       
12c70 20 20 20 2f 2a 20 46 69 6c 65 20 74 6f 20 72 65     /* File to re
12c80 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 76 6f 69  ad from */.  voi
12c90 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20  d *pBuf,        
12ca0 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
12cb0 20 63 6f 6e 74 65 6e 74 20 69 6e 74 6f 20 74 68   content into th
12cc0 69 73 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69  is buffer */.  i
12cd0 6e 74 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20  nt amt,         
12ce0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
12cf0 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20  ber of bytes to 
12d00 72 65 61 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65  read */.  sqlite
12d10 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 20 20  3_int64 offset  
12d20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 72 65       /* Begin re
12d30 61 64 69 6e 67 20 61 74 20 74 68 69 73 20 6f 66  ading at this of
12d40 66 73 65 74 20 2a 2f 0a 29 7b 0a 23 69 66 20 21  fset */.){.#if !
12d50 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
12d60 20 20 4f 56 45 52 4c 41 50 50 45 44 20 6f 76 65    OVERLAPPED ove
12d70 72 6c 61 70 70 65 64 3b 20 20 20 20 20 20 20 20  rlapped;        
12d80 20 20 2f 2a 20 54 68 65 20 6f 66 66 73 65 74 20    /* The offset 
12d90 66 6f 72 20 52 65 61 64 46 69 6c 65 2e 20 2a 2f  for ReadFile. */
12da0 0a 23 65 6e 64 69 66 0a 20 20 77 69 6e 46 69 6c  .#endif.  winFil
12db0 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46  e *pFile = (winF
12dc0 69 6c 65 2a 29 69 64 3b 20 20 2f 2a 20 66 69 6c  ile*)id;  /* fil
12dd0 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 44 57  e handle */.  DW
12de0 4f 52 44 20 6e 52 65 61 64 3b 20 20 20 20 20 20  ORD nRead;      
12df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12e00 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
12e10 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64 20 66   actually read f
12e20 72 6f 6d 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  rom file */.  in
12e30 74 20 6e 52 65 74 72 79 20 3d 20 30 3b 20 20 20  t nRetry = 0;   
12e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12e50 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 74 72 79   Number of retry
12e60 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  s */..  assert( 
12e70 69 64 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  id!=0 );.  asser
12e80 74 28 20 61 6d 74 3e 30 20 29 3b 0a 20 20 61 73  t( amt>0 );.  as
12e90 73 65 72 74 28 20 6f 66 66 73 65 74 3e 3d 30 20  sert( offset>=0 
12ea0 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  );.  SimulateIOE
12eb0 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49  rror(return SQLI
12ec0 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 29 3b 0a  TE_IOERR_READ);.
12ed0 20 20 4f 53 54 52 41 43 45 28 28 22 52 45 41 44    OSTRACE(("READ
12ee0 20 66 69 6c 65 3d 25 70 2c 20 62 75 66 66 65 72   file=%p, buffer
12ef0 3d 25 70 2c 20 61 6d 6f 75 6e 74 3d 25 64 2c 20  =%p, amount=%d, 
12f00 6f 66 66 73 65 74 3d 25 6c 6c 64 2c 20 6c 6f 63  offset=%lld, loc
12f10 6b 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  k=%d\n",.       
12f20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70 42      pFile->h, pB
12f30 75 66 2c 20 61 6d 74 2c 20 6f 66 66 73 65 74 2c  uf, amt, offset,
12f40 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
12f50 29 29 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  ));..#if SQLITE_
12f60 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
12f70 20 20 2f 2a 20 44 65 61 6c 20 77 69 74 68 20 61    /* Deal with a
12f80 73 20 6d 75 63 68 20 6f 66 20 74 68 69 73 20 72  s much of this r
12f90 65 61 64 20 72 65 71 75 65 73 74 20 61 73 20 70  ead request as p
12fa0 6f 73 73 69 62 6c 65 20 62 79 20 74 72 61 6e 73  ossible by trans
12fb0 66 65 72 69 6e 67 0a 20 20 2a 2a 20 64 61 74 61  fering.  ** data
12fc0 20 66 72 6f 6d 20 74 68 65 20 6d 65 6d 6f 72 79   from the memory
12fd0 20 6d 61 70 70 69 6e 67 20 75 73 69 6e 67 20 6d   mapping using m
12fe0 65 6d 63 70 79 28 29 2e 20 20 2a 2f 0a 20 20 69  emcpy().  */.  i
12ff0 66 28 20 6f 66 66 73 65 74 3c 70 46 69 6c 65 2d  f( offset<pFile-
13000 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20  >mmapSize ){.   
13010 20 69 66 28 20 6f 66 66 73 65 74 2b 61 6d 74 20   if( offset+amt 
13020 3c 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69  <= pFile->mmapSi
13030 7a 65 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63  ze ){.      memc
13040 70 79 28 70 42 75 66 2c 20 26 28 28 75 38 20 2a  py(pBuf, &((u8 *
13050 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67  )(pFile->pMapReg
13060 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20 61  ion))[offset], a
13070 6d 74 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41  mt);.      OSTRA
13080 43 45 28 28 22 52 45 41 44 2d 4d 4d 41 50 20 66  CE(("READ-MMAP f
13090 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  ile=%p, rc=SQLIT
130a0 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  E_OK\n", pFile->
130b0 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  h));.      retur
130c0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
130d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
130e0 74 20 6e 43 6f 70 79 20 3d 20 28 69 6e 74 29 28  t nCopy = (int)(
130f0 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20  pFile->mmapSize 
13100 2d 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 20  - offset);.     
13110 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20 26 28   memcpy(pBuf, &(
13120 28 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d  (u8 *)(pFile->pM
13130 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65  apRegion))[offse
13140 74 5d 2c 20 6e 43 6f 70 79 29 3b 0a 20 20 20 20  t], nCopy);.    
13150 20 20 70 42 75 66 20 3d 20 26 28 28 75 38 20 2a    pBuf = &((u8 *
13160 29 70 42 75 66 29 5b 6e 43 6f 70 79 5d 3b 0a 20  )pBuf)[nCopy];. 
13170 20 20 20 20 20 61 6d 74 20 2d 3d 20 6e 43 6f 70       amt -= nCop
13180 79 3b 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20  y;.      offset 
13190 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 7d 0a  += nCopy;.    }.
131a0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20    }.#endif..#if 
131b0 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
131c0 20 20 69 66 28 20 77 69 6e 53 65 65 6b 46 69 6c    if( winSeekFil
131d0 65 28 70 46 69 6c 65 2c 20 6f 66 66 73 65 74 29  e(pFile, offset)
131e0 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28   ){.    OSTRACE(
131f0 28 22 52 45 41 44 20 66 69 6c 65 3d 25 70 2c 20  ("READ file=%p, 
13200 72 63 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 5c 6e  rc=SQLITE_FULL\n
13210 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20  ", pFile->h));. 
13220 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
13230 5f 46 55 4c 4c 3b 0a 20 20 7d 0a 20 20 77 68 69  _FULL;.  }.  whi
13240 6c 65 28 20 21 6f 73 52 65 61 64 46 69 6c 65 28  le( !osReadFile(
13250 70 46 69 6c 65 2d 3e 68 2c 20 70 42 75 66 2c 20  pFile->h, pBuf, 
13260 61 6d 74 2c 20 26 6e 52 65 61 64 2c 20 30 29 20  amt, &nRead, 0) 
13270 29 7b 0a 23 65 6c 73 65 0a 20 20 6d 65 6d 73 65  ){.#else.  memse
13280 74 28 26 6f 76 65 72 6c 61 70 70 65 64 2c 20 30  t(&overlapped, 0
13290 2c 20 73 69 7a 65 6f 66 28 4f 56 45 52 4c 41 50  , sizeof(OVERLAP
132a0 50 45 44 29 29 3b 0a 20 20 6f 76 65 72 6c 61 70  PED));.  overlap
132b0 70 65 64 2e 4f 66 66 73 65 74 20 3d 20 28 4c 4f  ped.Offset = (LO
132c0 4e 47 29 28 6f 66 66 73 65 74 20 26 20 30 78 66  NG)(offset & 0xf
132d0 66 66 66 66 66 66 66 29 3b 0a 20 20 6f 76 65 72  fffffff);.  over
132e0 6c 61 70 70 65 64 2e 4f 66 66 73 65 74 48 69 67  lapped.OffsetHig
132f0 68 20 3d 20 28 4c 4f 4e 47 29 28 28 6f 66 66 73  h = (LONG)((offs
13300 65 74 3e 3e 33 32 29 20 26 20 30 78 37 66 66 66  et>>32) & 0x7fff
13310 66 66 66 66 29 3b 0a 20 20 77 68 69 6c 65 28 20  ffff);.  while( 
13320 21 6f 73 52 65 61 64 46 69 6c 65 28 70 46 69 6c  !osReadFile(pFil
13330 65 2d 3e 68 2c 20 70 42 75 66 2c 20 61 6d 74 2c  e->h, pBuf, amt,
13340 20 26 6e 52 65 61 64 2c 20 26 6f 76 65 72 6c 61   &nRead, &overla
13350 70 70 65 64 29 20 26 26 0a 20 20 20 20 20 20 20  pped) &&.       
13360 20 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72    osGetLastError
13370 28 29 21 3d 45 52 52 4f 52 5f 48 41 4e 44 4c 45  ()!=ERROR_HANDLE
13380 5f 45 4f 46 20 29 7b 0a 23 65 6e 64 69 66 0a 20  _EOF ){.#endif. 
13390 20 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72     DWORD lastErr
133a0 6e 6f 3b 0a 20 20 20 20 69 66 28 20 77 69 6e 52  no;.    if( winR
133b0 65 74 72 79 49 6f 65 72 72 28 26 6e 52 65 74 72  etryIoerr(&nRetr
133c0 79 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29  y, &lastErrno) )
133d0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70   continue;.    p
133e0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
133f0 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20  = lastErrno;.   
13400 20 4f 53 54 52 41 43 45 28 28 22 52 45 41 44 20   OSTRACE(("READ 
13410 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49  file=%p, rc=SQLI
13420 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 5c 6e 22  TE_IOERR_READ\n"
13430 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
13440 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45    return winLogE
13450 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
13460 52 5f 52 45 41 44 2c 20 70 46 69 6c 65 2d 3e 6c  R_READ, pFile->l
13470 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
13480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13490 20 22 77 69 6e 52 65 61 64 22 2c 20 70 46 69 6c   "winRead", pFil
134a0 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 20  e->zPath);.  }. 
134b0 20 77 69 6e 4c 6f 67 49 6f 65 72 72 28 6e 52 65   winLogIoerr(nRe
134c0 74 72 79 29 3b 0a 20 20 69 66 28 20 6e 52 65 61  try);.  if( nRea
134d0 64 3c 28 44 57 4f 52 44 29 61 6d 74 20 29 7b 0a  d<(DWORD)amt ){.
134e0 20 20 20 20 2f 2a 20 55 6e 72 65 61 64 20 70 61      /* Unread pa
134f0 72 74 73 20 6f 66 20 74 68 65 20 62 75 66 66 65  rts of the buffe
13500 72 20 6d 75 73 74 20 62 65 20 7a 65 72 6f 2d 66  r must be zero-f
13510 69 6c 6c 65 64 20 2a 2f 0a 20 20 20 20 6d 65 6d  illed */.    mem
13520 73 65 74 28 26 28 28 63 68 61 72 2a 29 70 42 75  set(&((char*)pBu
13530 66 29 5b 6e 52 65 61 64 5d 2c 20 30 2c 20 61 6d  f)[nRead], 0, am
13540 74 2d 6e 52 65 61 64 29 3b 0a 20 20 20 20 4f 53  t-nRead);.    OS
13550 54 52 41 43 45 28 28 22 52 45 41 44 20 66 69 6c  TRACE(("READ fil
13560 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%p, rc=SQLITE_
13570 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
13580 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  \n", pFile->h));
13590 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
135a0 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
135b0 45 41 44 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54 52  EAD;.  }..  OSTR
135c0 41 43 45 28 28 22 52 45 41 44 20 66 69 6c 65 3d  ACE(("READ file=
135d0 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b  %p, rc=SQLITE_OK
135e0 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  \n", pFile->h));
135f0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
13600 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72  _OK;.}../*.** Wr
13610 69 74 65 20 64 61 74 61 20 66 72 6f 6d 20 61 20  ite data from a 
13620 62 75 66 66 65 72 20 69 6e 74 6f 20 61 20 66 69  buffer into a fi
13630 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  le.  Return SQLI
13640 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
13650 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65  .** or some othe
13660 72 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 6e 20  r error code on 
13670 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  failure..*/.stat
13680 69 63 20 69 6e 74 20 77 69 6e 57 72 69 74 65 28  ic int winWrite(
13690 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
136a0 2a 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  *id,            
136b0 20 20 20 2f 2a 20 46 69 6c 65 20 74 6f 20 77 72     /* File to wr
136c0 69 74 65 20 69 6e 74 6f 20 2a 2f 0a 20 20 63 6f  ite into */.  co
136d0 6e 73 74 20 76 6f 69 64 20 2a 70 42 75 66 2c 20  nst void *pBuf, 
136e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
136f0 20 54 68 65 20 62 79 74 65 73 20 74 6f 20 62 65   The bytes to be
13700 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 69 6e   written */.  in
13710 74 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20 20  t amt,          
13720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13730 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
13740 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20 73   to write */.  s
13750 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66  qlite3_int64 off
13760 73 65 74 20 20 20 20 20 20 20 20 20 20 20 20 2f  set            /
13770 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 74 68  * Offset into th
13780 65 20 66 69 6c 65 20 74 6f 20 62 65 67 69 6e 20  e file to begin 
13790 77 72 69 74 69 6e 67 20 61 74 20 2a 2f 0a 29 7b  writing at */.){
137a0 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 20 20  .  int rc = 0;  
137b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
137c0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 65 72     /* True if er
137d0 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65 64  ror has occurred
137e0 2c 20 65 6c 73 65 20 66 61 6c 73 65 20 2a 2f 0a  , else false */.
137f0 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65    winFile *pFile
13800 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b   = (winFile*)id;
13810 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65    /* File handle
13820 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 74 72 79   */.  int nRetry
13830 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
13840 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
13850 6f 66 20 72 65 74 72 69 65 73 20 2a 2f 0a 0a 20  of retries */.. 
13860 20 61 73 73 65 72 74 28 20 61 6d 74 3e 30 20 29   assert( amt>0 )
13870 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ;.  assert( pFil
13880 65 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49  e );.  SimulateI
13890 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51  OError(return SQ
138a0 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45  LITE_IOERR_WRITE
138b0 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 44 69 73  );.  SimulateDis
138c0 6b 66 75 6c 6c 45 72 72 6f 72 28 72 65 74 75 72  kfullError(retur
138d0 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 29 3b 0a  n SQLITE_FULL);.
138e0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 57 52 49  .  OSTRACE(("WRI
138f0 54 45 20 66 69 6c 65 3d 25 70 2c 20 62 75 66 66  TE file=%p, buff
13900 65 72 3d 25 70 2c 20 61 6d 6f 75 6e 74 3d 25 64  er=%p, amount=%d
13910 2c 20 6f 66 66 73 65 74 3d 25 6c 6c 64 2c 20 6c  , offset=%lld, l
13920 6f 63 6b 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  ock=%d\n",.     
13930 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20        pFile->h, 
13940 70 42 75 66 2c 20 61 6d 74 2c 20 6f 66 66 73 65  pBuf, amt, offse
13950 74 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  t, pFile->lockty
13960 70 65 29 29 3b 0a 0a 23 69 66 20 53 51 4c 49 54  pe));..#if SQLIT
13970 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
13980 30 0a 20 20 2f 2a 20 44 65 61 6c 20 77 69 74 68  0.  /* Deal with
13990 20 61 73 20 6d 75 63 68 20 6f 66 20 74 68 69 73   as much of this
139a0 20 77 72 69 74 65 20 72 65 71 75 65 73 74 20 61   write request a
139b0 73 20 70 6f 73 73 69 62 6c 65 20 62 79 20 74 72  s possible by tr
139c0 61 6e 73 66 65 72 69 6e 67 0a 20 20 2a 2a 20 64  ansfering.  ** d
139d0 61 74 61 20 66 72 6f 6d 20 74 68 65 20 6d 65 6d  ata from the mem
139e0 6f 72 79 20 6d 61 70 70 69 6e 67 20 75 73 69 6e  ory mapping usin
139f0 67 20 6d 65 6d 63 70 79 28 29 2e 20 20 2a 2f 0a  g memcpy().  */.
13a00 20 20 69 66 28 20 6f 66 66 73 65 74 3c 70 46 69    if( offset<pFi
13a10 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a  le->mmapSize ){.
13a20 20 20 20 20 69 66 28 20 6f 66 66 73 65 74 2b 61      if( offset+a
13a30 6d 74 20 3c 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61  mt <= pFile->mma
13a40 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 6d  pSize ){.      m
13a50 65 6d 63 70 79 28 26 28 28 75 38 20 2a 29 28 70  emcpy(&((u8 *)(p
13a60 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e  File->pMapRegion
13a70 29 29 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75 66  ))[offset], pBuf
13a80 2c 20 61 6d 74 29 3b 0a 20 20 20 20 20 20 4f 53  , amt);.      OS
13a90 54 52 41 43 45 28 28 22 57 52 49 54 45 2d 4d 4d  TRACE(("WRITE-MM
13aa0 41 50 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53  AP file=%p, rc=S
13ab0 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69  QLITE_OK\n", pFi
13ac0 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72  le->h));.      r
13ad0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
13ae0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
13af0 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20 28 69    int nCopy = (i
13b00 6e 74 29 28 70 46 69 6c 65 2d 3e 6d 6d 61 70 53  nt)(pFile->mmapS
13b10 69 7a 65 20 2d 20 6f 66 66 73 65 74 29 3b 0a 20  ize - offset);. 
13b20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 28 28 75       memcpy(&((u
13b30 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70  8 *)(pFile->pMap
13b40 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d  Region))[offset]
13b50 2c 20 70 42 75 66 2c 20 6e 43 6f 70 79 29 3b 0a  , pBuf, nCopy);.
13b60 20 20 20 20 20 20 70 42 75 66 20 3d 20 26 28 28        pBuf = &((
13b70 75 38 20 2a 29 70 42 75 66 29 5b 6e 43 6f 70 79  u8 *)pBuf)[nCopy
13b80 5d 3b 0a 20 20 20 20 20 20 61 6d 74 20 2d 3d 20  ];.      amt -= 
13b90 6e 43 6f 70 79 3b 0a 20 20 20 20 20 20 6f 66 66  nCopy;.      off
13ba0 73 65 74 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20  set += nCopy;.  
13bb0 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
13bc0 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
13bd0 4e 43 45 0a 20 20 72 63 20 3d 20 77 69 6e 53 65  NCE.  rc = winSe
13be0 65 6b 46 69 6c 65 28 70 46 69 6c 65 2c 20 6f 66  ekFile(pFile, of
13bf0 66 73 65 74 29 3b 0a 20 20 69 66 28 20 72 63 3d  fset);.  if( rc=
13c00 3d 30 20 29 7b 0a 23 65 6c 73 65 0a 20 20 7b 0a  =0 ){.#else.  {.
13c10 23 65 6e 64 69 66 0a 23 69 66 20 21 53 51 4c 49  #endif.#if !SQLI
13c20 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20  TE_OS_WINCE.    
13c30 4f 56 45 52 4c 41 50 50 45 44 20 6f 76 65 72 6c  OVERLAPPED overl
13c40 61 70 70 65 64 3b 20 20 20 20 20 20 20 20 2f 2a  apped;        /*
13c50 20 54 68 65 20 6f 66 66 73 65 74 20 66 6f 72 20   The offset for 
13c60 57 72 69 74 65 46 69 6c 65 2e 20 2a 2f 0a 23 65  WriteFile. */.#e
13c70 6e 64 69 66 0a 20 20 20 20 75 38 20 2a 61 52 65  ndif.    u8 *aRe
13c80 6d 20 3d 20 28 75 38 20 2a 29 70 42 75 66 3b 20  m = (u8 *)pBuf; 
13c90 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20 79         /* Data y
13ca0 65 74 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  et to be written
13cb0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 52 65 6d   */.    int nRem
13cc0 20 3d 20 61 6d 74 3b 20 20 20 20 20 20 20 20 20   = amt;         
13cd0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
13ce0 6f 66 20 62 79 74 65 73 20 79 65 74 20 74 6f 20  of bytes yet to 
13cf0 62 65 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20  be written */.  
13d00 20 20 44 57 4f 52 44 20 6e 57 72 69 74 65 3b 20    DWORD nWrite; 
13d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d20 2f 2a 20 42 79 74 65 73 20 77 72 69 74 74 65 6e  /* Bytes written
13d30 20 62 79 20 65 61 63 68 20 57 72 69 74 65 46 69   by each WriteFi
13d40 6c 65 28 29 20 63 61 6c 6c 20 2a 2f 0a 20 20 20  le() call */.   
13d50 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f   DWORD lastErrno
13d60 20 3d 20 4e 4f 5f 45 52 52 4f 52 3b 20 20 20 2f   = NO_ERROR;   /
13d70 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64  * Value returned
13d80 20 62 79 20 47 65 74 4c 61 73 74 45 72 72 6f 72   by GetLastError
13d90 28 29 20 2a 2f 0a 0a 23 69 66 20 21 53 51 4c 49  () */..#if !SQLI
13da0 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20  TE_OS_WINCE.    
13db0 6d 65 6d 73 65 74 28 26 6f 76 65 72 6c 61 70 70  memset(&overlapp
13dc0 65 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4f 56  ed, 0, sizeof(OV
13dd0 45 52 4c 41 50 50 45 44 29 29 3b 0a 20 20 20 20  ERLAPPED));.    
13de0 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66 66 73 65  overlapped.Offse
13df0 74 20 3d 20 28 4c 4f 4e 47 29 28 6f 66 66 73 65  t = (LONG)(offse
13e00 74 20 26 20 30 78 66 66 66 66 66 66 66 66 29 3b  t & 0xffffffff);
13e10 0a 20 20 20 20 6f 76 65 72 6c 61 70 70 65 64 2e  .    overlapped.
13e20 4f 66 66 73 65 74 48 69 67 68 20 3d 20 28 4c 4f  OffsetHigh = (LO
13e30 4e 47 29 28 28 6f 66 66 73 65 74 3e 3e 33 32 29  NG)((offset>>32)
13e40 20 26 20 30 78 37 66 66 66 66 66 66 66 29 3b 0a   & 0x7fffffff);.
13e50 23 65 6e 64 69 66 0a 0a 20 20 20 20 77 68 69 6c  #endif..    whil
13e60 65 28 20 6e 52 65 6d 3e 30 20 29 7b 0a 23 69 66  e( nRem>0 ){.#if
13e70 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
13e80 0a 20 20 20 20 20 20 69 66 28 20 21 6f 73 57 72  .      if( !osWr
13e90 69 74 65 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68  iteFile(pFile->h
13ea0 2c 20 61 52 65 6d 2c 20 6e 52 65 6d 2c 20 26 6e  , aRem, nRem, &n
13eb0 57 72 69 74 65 2c 20 30 29 20 29 7b 0a 23 65 6c  Write, 0) ){.#el
13ec0 73 65 0a 20 20 20 20 20 20 69 66 28 20 21 6f 73  se.      if( !os
13ed0 57 72 69 74 65 46 69 6c 65 28 70 46 69 6c 65 2d  WriteFile(pFile-
13ee0 3e 68 2c 20 61 52 65 6d 2c 20 6e 52 65 6d 2c 20  >h, aRem, nRem, 
13ef0 26 6e 57 72 69 74 65 2c 20 26 6f 76 65 72 6c 61  &nWrite, &overla
13f00 70 70 65 64 29 20 29 7b 0a 23 65 6e 64 69 66 0a  pped) ){.#endif.
13f10 20 20 20 20 20 20 20 20 69 66 28 20 77 69 6e 52          if( winR
13f20 65 74 72 79 49 6f 65 72 72 28 26 6e 52 65 74 72  etryIoerr(&nRetr
13f30 79 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29  y, &lastErrno) )
13f40 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
13f50 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
13f60 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
13f70 6e 57 72 69 74 65 3d 3d 30 20 7c 7c 20 6e 57 72  nWrite==0 || nWr
13f80 69 74 65 3c 3d 28 44 57 4f 52 44 29 6e 52 65 6d  ite<=(DWORD)nRem
13f90 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 57   );.      if( nW
13fa0 72 69 74 65 3d 3d 30 20 7c 7c 20 6e 57 72 69 74  rite==0 || nWrit
13fb0 65 3e 28 44 57 4f 52 44 29 6e 52 65 6d 20 29 7b  e>(DWORD)nRem ){
13fc0 0a 20 20 20 20 20 20 20 20 6c 61 73 74 45 72 72  .        lastErr
13fd0 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
13fe0 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 20 20 62  ror();.        b
13ff0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 69  reak;.      }.#i
14000 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
14010 43 45 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20  CE.      offset 
14020 2b 3d 20 6e 57 72 69 74 65 3b 0a 20 20 20 20 20  += nWrite;.     
14030 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66 66 73   overlapped.Offs
14040 65 74 20 3d 20 28 4c 4f 4e 47 29 28 6f 66 66 73  et = (LONG)(offs
14050 65 74 20 26 20 30 78 66 66 66 66 66 66 66 66 29  et & 0xffffffff)
14060 3b 0a 20 20 20 20 20 20 6f 76 65 72 6c 61 70 70  ;.      overlapp
14070 65 64 2e 4f 66 66 73 65 74 48 69 67 68 20 3d 20  ed.OffsetHigh = 
14080 28 4c 4f 4e 47 29 28 28 6f 66 66 73 65 74 3e 3e  (LONG)((offset>>
14090 33 32 29 20 26 20 30 78 37 66 66 66 66 66 66 66  32) & 0x7fffffff
140a0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
140b0 61 52 65 6d 20 2b 3d 20 6e 57 72 69 74 65 3b 0a  aRem += nWrite;.
140c0 20 20 20 20 20 20 6e 52 65 6d 20 2d 3d 20 6e 57        nRem -= nW
140d0 72 69 74 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rite;.    }.    
140e0 69 66 28 20 6e 52 65 6d 3e 30 20 29 7b 0a 20 20  if( nRem>0 ){.  
140f0 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
14100 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f  rrno = lastErrno
14110 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  ;.      rc = 1;.
14120 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
14130 20 72 63 20 29 7b 0a 20 20 20 20 69 66 28 20 20   rc ){.    if(  
14140 20 28 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72   ( pFile->lastEr
14150 72 6e 6f 3d 3d 45 52 52 4f 52 5f 48 41 4e 44 4c  rno==ERROR_HANDL
14160 45 5f 44 49 53 4b 5f 46 55 4c 4c 20 29 0a 20 20  E_DISK_FULL ).  
14170 20 20 20 20 20 7c 7c 20 28 20 70 46 69 6c 65 2d       || ( pFile-
14180 3e 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f  >lastErrno==ERRO
14190 52 5f 44 49 53 4b 5f 46 55 4c 4c 20 29 29 7b 0a  R_DISK_FULL )){.
141a0 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
141b0 57 52 49 54 45 20 66 69 6c 65 3d 25 70 2c 20 72  WRITE file=%p, r
141c0 63 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 5c 6e 22  c=SQLITE_FULL\n"
141d0 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
141e0 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f      return winLo
141f0 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 46 55  gError(SQLITE_FU
14200 4c 4c 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  LL, pFile->lastE
14210 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
14220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
14230 77 69 6e 57 72 69 74 65 31 22 2c 20 70 46 69 6c  winWrite1", pFil
14240 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d  e->zPath);.    }
14250 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 57  .    OSTRACE(("W
14260 52 49 54 45 20 66 69 6c 65 3d 25 70 2c 20 72 63  RITE file=%p, rc
14270 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52  =SQLITE_IOERR_WR
14280 49 54 45 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  ITE\n", pFile->h
14290 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 77  ));.    return w
142a0 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
142b0 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 2c 20 70  E_IOERR_WRITE, p
142c0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c  File->lastErrno,
142d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
142e0 20 20 20 20 20 20 20 20 22 77 69 6e 57 72 69 74          "winWrit
142f0 65 32 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  e2", pFile->zPat
14300 68 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  h);.  }else{.   
14310 20 77 69 6e 4c 6f 67 49 6f 65 72 72 28 6e 52 65   winLogIoerr(nRe
14320 74 72 79 29 3b 0a 20 20 7d 0a 20 20 4f 53 54 52  try);.  }.  OSTR
14330 41 43 45 28 28 22 57 52 49 54 45 20 66 69 6c 65  ACE(("WRITE file
14340 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f  =%p, rc=SQLITE_O
14350 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29  K\n", pFile->h))
14360 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
14370 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
14380 72 75 6e 63 61 74 65 20 61 6e 20 6f 70 65 6e 20  runcate an open 
14390 66 69 6c 65 20 74 6f 20 61 20 73 70 65 63 69 66  file to a specif
143a0 69 65 64 20 73 69 7a 65 0a 2a 2f 0a 73 74 61 74  ied size.*/.stat
143b0 69 63 20 69 6e 74 20 77 69 6e 54 72 75 6e 63 61  ic int winTrunca
143c0 74 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  te(sqlite3_file 
143d0 2a 69 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74  *id, sqlite3_int
143e0 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 77 69 6e  64 nByte){.  win
143f0 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77  File *pFile = (w
14400 69 6e 46 69 6c 65 2a 29 69 64 3b 20 20 2f 2a 20  inFile*)id;  /* 
14410 46 69 6c 65 20 68 61 6e 64 6c 65 20 6f 62 6a 65  File handle obje
14420 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  ct */.  int rc =
14430 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
14440 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
14450 6e 20 63 6f 64 65 20 66 6f 72 20 74 68 69 73 20  n code for this 
14460 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 44 57  function */.  DW
14470 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 0a  ORD lastErrno;..
14480 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
14490 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  );.  SimulateIOE
144a0 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49  rror(return SQLI
144b0 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54  TE_IOERR_TRUNCAT
144c0 45 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  E);.  OSTRACE(("
144d0 54 52 55 4e 43 41 54 45 20 66 69 6c 65 3d 25 70  TRUNCATE file=%p
144e0 2c 20 73 69 7a 65 3d 25 6c 6c 64 2c 20 6c 6f 63  , size=%lld, loc
144f0 6b 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  k=%d\n",.       
14500 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 6e 42      pFile->h, nB
14510 79 74 65 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  yte, pFile->lock
14520 74 79 70 65 29 29 3b 0a 0a 20 20 2f 2a 20 49 66  type));..  /* If
14530 20 74 68 65 20 75 73 65 72 20 68 61 73 20 63 6f   the user has co
14540 6e 66 69 67 75 72 65 64 20 61 20 63 68 75 6e 6b  nfigured a chunk
14550 2d 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 66  -size for this f
14560 69 6c 65 2c 20 74 72 75 6e 63 61 74 65 20 74 68  ile, truncate th
14570 65 0a 20 20 2a 2a 20 66 69 6c 65 20 73 6f 20 74  e.  ** file so t
14580 68 61 74 20 69 74 20 63 6f 6e 73 69 73 74 73 20  hat it consists 
14590 6f 66 20 61 6e 20 69 6e 74 65 67 65 72 20 6e 75  of an integer nu
145a0 6d 62 65 72 20 6f 66 20 63 68 75 6e 6b 73 20 28  mber of chunks (
145b0 69 2e 65 2e 20 74 68 65 0a 20 20 2a 2a 20 61 63  i.e. the.  ** ac
145c0 74 75 61 6c 20 66 69 6c 65 20 73 69 7a 65 20 61  tual file size a
145d0 66 74 65 72 20 74 68 65 20 6f 70 65 72 61 74 69  fter the operati
145e0 6f 6e 20 6d 61 79 20 62 65 20 6c 61 72 67 65 72  on may be larger
145f0 20 74 68 61 6e 20 74 68 65 20 72 65 71 75 65 73   than the reques
14600 74 65 64 0a 20 20 2a 2a 20 73 69 7a 65 29 2e 0a  ted.  ** size)..
14610 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65    */.  if( pFile
14620 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20 29 7b 0a 20  ->szChunk>0 ){. 
14630 20 20 20 6e 42 79 74 65 20 3d 20 28 28 6e 42 79     nByte = ((nBy
14640 74 65 20 2b 20 70 46 69 6c 65 2d 3e 73 7a 43 68  te + pFile->szCh
14650 75 6e 6b 20 2d 20 31 29 2f 70 46 69 6c 65 2d 3e  unk - 1)/pFile->
14660 73 7a 43 68 75 6e 6b 29 20 2a 20 70 46 69 6c 65  szChunk) * pFile
14670 2d 3e 73 7a 43 68 75 6e 6b 3b 0a 20 20 7d 0a 0a  ->szChunk;.  }..
14680 20 20 2f 2a 20 53 65 74 45 6e 64 4f 66 46 69 6c    /* SetEndOfFil
14690 65 28 29 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d  e() returns non-
146a0 7a 65 72 6f 20 77 68 65 6e 20 73 75 63 63 65 73  zero when succes
146b0 73 66 75 6c 2c 20 6f 72 20 7a 65 72 6f 20 77 68  sful, or zero wh
146c0 65 6e 20 69 74 20 66 61 69 6c 73 2e 20 2a 2f 0a  en it fails. */.
146d0 20 20 69 66 28 20 77 69 6e 53 65 65 6b 46 69 6c    if( winSeekFil
146e0 65 28 70 46 69 6c 65 2c 20 6e 42 79 74 65 29 20  e(pFile, nByte) 
146f0 29 7b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4c  ){.    rc = winL
14700 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
14710 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 2c 20 70  OERR_TRUNCATE, p
14720 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c  File->lastErrno,
14730 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14740 20 20 20 20 20 20 22 77 69 6e 54 72 75 6e 63 61        "winTrunca
14750 74 65 31 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61  te1", pFile->zPa
14760 74 68 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  th);.  }else if(
14770 20 30 3d 3d 6f 73 53 65 74 45 6e 64 4f 66 46 69   0==osSetEndOfFi
14780 6c 65 28 70 46 69 6c 65 2d 3e 68 29 20 26 26 0a  le(pFile->h) &&.
14790 20 20 20 20 20 20 20 20 20 20 20 20 28 28 6c 61              ((la
147a0 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
147b0 61 73 74 45 72 72 6f 72 28 29 29 21 3d 45 52 52  astError())!=ERR
147c0 4f 52 5f 55 53 45 52 5f 4d 41 50 50 45 44 5f 46  OR_USER_MAPPED_F
147d0 49 4c 45 29 20 29 7b 0a 20 20 20 20 70 46 69 6c  ILE) ){.    pFil
147e0 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c  e->lastErrno = l
147f0 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 72 63  astErrno;.    rc
14800 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53   = winLogError(S
14810 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e  QLITE_IOERR_TRUN
14820 43 41 54 45 2c 20 70 46 69 6c 65 2d 3e 6c 61 73  CATE, pFile->las
14830 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
14840 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
14850 6e 54 72 75 6e 63 61 74 65 32 22 2c 20 70 46 69  nTruncate2", pFi
14860 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a  le->zPath);.  }.
14870 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
14880 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 2f 2a  MMAP_SIZE>0.  /*
14890 20 49 66 20 74 68 65 20 66 69 6c 65 20 77 61 73   If the file was
148a0 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 61 20   truncated to a 
148b0 73 69 7a 65 20 73 6d 61 6c 6c 65 72 20 74 68 61  size smaller tha
148c0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 0a  n the currently.
148d0 20 20 2a 2a 20 6d 61 70 70 65 64 20 72 65 67 69    ** mapped regi
148e0 6f 6e 2c 20 72 65 64 75 63 65 20 74 68 65 20 65  on, reduce the e
148f0 66 66 65 63 74 69 76 65 20 6d 61 70 70 69 6e 67  ffective mapping
14900 20 73 69 7a 65 20 61 73 20 77 65 6c 6c 2e 20 53   size as well. S
14910 51 4c 69 74 65 20 77 69 6c 6c 0a 20 20 2a 2a 20  QLite will.  ** 
14920 75 73 65 20 72 65 61 64 28 29 20 61 6e 64 20 77  use read() and w
14930 72 69 74 65 28 29 20 74 6f 20 61 63 63 65 73 73  rite() to access
14940 20 64 61 74 61 20 62 65 79 6f 6e 64 20 74 68 69   data beyond thi
14950 73 20 70 6f 69 6e 74 20 66 72 6f 6d 20 6e 6f 77  s point from now
14960 20 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20   on..  */.  if( 
14970 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f  pFile->pMapRegio
14980 6e 20 26 26 20 6e 42 79 74 65 3c 70 46 69 6c 65  n && nByte<pFile
14990 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20  ->mmapSize ){.  
149a0 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a    pFile->mmapSiz
149b0 65 20 3d 20 6e 42 79 74 65 3b 0a 20 20 7d 0a 23  e = nByte;.  }.#
149c0 65 6e 64 69 66 0a 0a 20 20 4f 53 54 52 41 43 45  endif..  OSTRACE
149d0 28 28 22 54 52 55 4e 43 41 54 45 20 66 69 6c 65  (("TRUNCATE file
149e0 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 20 70  =%p, rc=%s\n", p
149f0 46 69 6c 65 2d 3e 68 2c 20 73 71 6c 69 74 65 33  File->h, sqlite3
14a00 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20  ErrName(rc)));. 
14a10 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
14a20 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
14a30 54 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68  T./*.** Count th
14a40 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c  e number of full
14a50 73 79 6e 63 73 20 61 6e 64 20 6e 6f 72 6d 61 6c  syncs and normal
14a60 20 73 79 6e 63 73 2e 20 20 54 68 69 73 20 69 73   syncs.  This is
14a70 20 75 73 65 64 20 74 6f 20 74 65 73 74 0a 2a 2a   used to test.**
14a80 20 74 68 61 74 20 73 79 6e 63 73 20 61 6e 64 20   that syncs and 
14a90 66 75 6c 6c 73 79 6e 63 73 20 61 72 65 20 6f 63  fullsyncs are oc
14aa0 63 75 72 69 6e 67 20 61 74 20 74 68 65 20 72 69  curing at the ri
14ab0 67 68 74 20 74 69 6d 65 73 2e 0a 2a 2f 0a 69 6e  ght times..*/.in
14ac0 74 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63  t sqlite3_sync_c
14ad0 6f 75 6e 74 20 3d 20 30 3b 0a 69 6e 74 20 73 71  ount = 0;.int sq
14ae0 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63  lite3_fullsync_c
14af0 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66  ount = 0;.#endif
14b00 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
14b10 65 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20  e all writes to 
14b20 61 20 70 61 72 74 69 63 75 6c 61 72 20 66 69 6c  a particular fil
14b30 65 20 61 72 65 20 63 6f 6d 6d 69 74 74 65 64 20  e are committed 
14b40 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74  to disk..*/.stat
14b50 69 63 20 69 6e 74 20 77 69 6e 53 79 6e 63 28 73  ic int winSync(s
14b60 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
14b70 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 23 69 66   int flags){.#if
14b80 6e 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53  ndef SQLITE_NO_S
14b90 59 4e 43 0a 20 20 2f 2a 0a 20 20 2a 2a 20 55 73  YNC.  /*.  ** Us
14ba0 65 64 20 6f 6e 6c 79 20 77 68 65 6e 20 53 51 4c  ed only when SQL
14bb0 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 69 73 20 6e  ITE_NO_SYNC is n
14bc0 6f 74 20 64 65 66 69 6e 65 64 2e 0a 20 20 20 2a  ot defined..   *
14bd0 2f 0a 20 20 42 4f 4f 4c 20 72 63 3b 0a 23 65 6e  /.  BOOL rc;.#en
14be0 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64  dif.#if !defined
14bf0 28 4e 44 45 42 55 47 29 20 7c 7c 20 21 64 65 66  (NDEBUG) || !def
14c00 69 6e 65 64 28 53 51 4c 49 54 45 5f 4e 4f 5f 53  ined(SQLITE_NO_S
14c10 59 4e 43 29 20 7c 7c 20 5c 0a 20 20 20 20 28 64  YNC) || \.    (d
14c20 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45  efined(SQLITE_TE
14c30 53 54 29 20 26 26 20 64 65 66 69 6e 65 64 28 53  ST) && defined(S
14c40 51 4c 49 54 45 5f 44 45 42 55 47 29 29 0a 20 20  QLITE_DEBUG)).  
14c50 2f 2a 0a 20 20 2a 2a 20 55 73 65 64 20 77 68 65  /*.  ** Used whe
14c60 6e 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43  n SQLITE_NO_SYNC
14c70 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 20   is not defined 
14c80 61 6e 64 20 62 79 20 74 68 65 20 61 73 73 65 72  and by the asser
14c90 74 28 29 20 61 6e 64 2f 6f 72 0a 20 20 2a 2a 20  t() and/or.  ** 
14ca0 4f 53 54 52 41 43 45 28 29 20 6d 61 63 72 6f 73  OSTRACE() macros
14cb0 2e 0a 20 20 20 2a 2f 0a 20 20 77 69 6e 46 69 6c  ..   */.  winFil
14cc0 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46  e *pFile = (winF
14cd0 69 6c 65 2a 29 69 64 3b 0a 23 65 6c 73 65 0a 20  ile*)id;.#else. 
14ce0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
14cf0 52 28 69 64 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  R(id);.#endif.. 
14d00 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
14d10 3b 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61  ;.  /* Check tha
14d20 74 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f  t one of SQLITE_
14d30 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 46  SYNC_NORMAL or F
14d40 55 4c 4c 20 77 61 73 20 70 61 73 73 65 64 20 2a  ULL was passed *
14d50 2f 0a 20 20 61 73 73 65 72 74 28 28 66 6c 61 67  /.  assert((flag
14d60 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f  s&0x0F)==SQLITE_
14d70 53 59 4e 43 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20  SYNC_NORMAL.    
14d80 20 20 7c 7c 20 28 66 6c 61 67 73 26 30 78 30 46    || (flags&0x0F
14d90 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46  )==SQLITE_SYNC_F
14da0 55 4c 4c 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 55  ULL.  );..  /* U
14db0 6e 69 78 20 63 61 6e 6e 6f 74 2c 20 62 75 74 20  nix cannot, but 
14dc0 73 6f 6d 65 20 73 79 73 74 65 6d 73 20 6d 61 79  some systems may
14dd0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46   return SQLITE_F
14de0 55 4c 4c 20 66 72 6f 6d 20 68 65 72 65 2e 20 54  ULL from here. T
14df0 68 69 73 0a 20 20 2a 2a 20 6c 69 6e 65 20 69 73  his.  ** line is
14e00 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 64 6f   to test that do
14e10 69 6e 67 20 73 6f 20 64 6f 65 73 20 6e 6f 74 20  ing so does not 
14e20 63 61 75 73 65 20 61 6e 79 20 70 72 6f 62 6c 65  cause any proble
14e30 6d 73 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c  ms..  */.  Simul
14e40 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72  ateDiskfullError
14e50 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
14e60 46 55 4c 4c 20 29 3b 0a 0a 20 20 4f 53 54 52 41  FULL );..  OSTRA
14e70 43 45 28 28 22 53 59 4e 43 20 66 69 6c 65 3d 25  CE(("SYNC file=%
14e80 70 2c 20 66 6c 61 67 73 3d 25 78 2c 20 6c 6f 63  p, flags=%x, loc
14e90 6b 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  k=%d\n",.       
14ea0 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 66 6c      pFile->h, fl
14eb0 61 67 73 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ags, pFile->lock
14ec0 74 79 70 65 29 29 3b 0a 0a 23 69 66 6e 64 65 66  type));..#ifndef
14ed0 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 55   SQLITE_TEST.  U
14ee0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
14ef0 66 6c 61 67 73 29 3b 0a 23 65 6c 73 65 0a 20 20  flags);.#else.  
14f00 69 66 28 20 28 66 6c 61 67 73 26 30 78 30 46 29  if( (flags&0x0F)
14f10 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55  ==SQLITE_SYNC_FU
14f20 4c 4c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  LL ){.    sqlite
14f30 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74  3_fullsync_count
14f40 2b 2b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ++;.  }.  sqlite
14f50 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a  3_sync_count++;.
14f60 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20  #endif..  /* If 
14f70 77 65 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68  we compiled with
14f80 20 74 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53   the SQLITE_NO_S
14f90 59 4e 43 20 66 6c 61 67 2c 20 74 68 65 6e 20 73  YNC flag, then s
14fa0 79 6e 63 69 6e 67 20 69 73 20 61 0a 20 20 2a 2a  yncing is a.  **
14fb0 20 6e 6f 2d 6f 70 0a 20 20 2a 2f 0a 23 69 66 64   no-op.  */.#ifd
14fc0 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  ef SQLITE_NO_SYN
14fd0 43 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 59  C.  OSTRACE(("SY
14fe0 4e 43 2d 4e 4f 50 20 66 69 6c 65 3d 25 70 2c 20  NC-NOP file=%p, 
14ff0 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c  rc=SQLITE_OK\n",
15000 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 72   pFile->h));.  r
15010 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
15020 0a 23 65 6c 73 65 0a 20 20 72 63 20 3d 20 6f 73  .#else.  rc = os
15030 46 6c 75 73 68 46 69 6c 65 42 75 66 66 65 72 73  FlushFileBuffers
15040 28 70 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 53 69  (pFile->h);.  Si
15050 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
15060 63 3d 46 41 4c 53 45 20 29 3b 0a 20 20 69 66 28  c=FALSE );.  if(
15070 20 72 63 20 29 7b 0a 20 20 20 20 4f 53 54 52 41   rc ){.    OSTRA
15080 43 45 28 28 22 53 59 4e 43 20 66 69 6c 65 3d 25  CE(("SYNC file=%
15090 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c  p, rc=SQLITE_OK\
150a0 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  n", pFile->h));.
150b0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
150c0 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  E_OK;.  }else{. 
150d0 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
150e0 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
150f0 72 72 6f 72 28 29 3b 0a 20 20 20 20 4f 53 54 52  rror();.    OSTR
15100 41 43 45 28 28 22 53 59 4e 43 20 66 69 6c 65 3d  ACE(("SYNC file=
15110 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f  %p, rc=SQLITE_IO
15120 45 52 52 5f 46 53 59 4e 43 5c 6e 22 2c 20 70 46  ERR_FSYNC\n", pF
15130 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65  ile->h));.    re
15140 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72  turn winLogError
15150 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53  (SQLITE_IOERR_FS
15160 59 4e 43 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74  YNC, pFile->last
15170 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  Errno,.         
15180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
15190 69 6e 53 79 6e 63 22 2c 20 70 46 69 6c 65 2d 3e  inSync", pFile->
151a0 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 23 65 6e 64  zPath);.  }.#end
151b0 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65  if.}../*.** Dete
151c0 72 6d 69 6e 65 20 74 68 65 20 63 75 72 72 65 6e  rmine the curren
151d0 74 20 73 69 7a 65 20 6f 66 20 61 20 66 69 6c 65  t size of a file
151e0 20 69 6e 20 62 79 74 65 73 0a 2a 2f 0a 73 74 61   in bytes.*/.sta
151f0 74 69 63 20 69 6e 74 20 77 69 6e 46 69 6c 65 53  tic int winFileS
15200 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ize(sqlite3_file
15210 20 2a 69 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e   *id, sqlite3_in
15220 74 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20 77  t64 *pSize){.  w
15230 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  inFile *pFile = 
15240 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20  (winFile*)id;.  
15250 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
15260 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69  OK;..  assert( i
15270 64 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  d!=0 );.  assert
15280 28 20 70 53 69 7a 65 21 3d 30 20 29 3b 0a 20 20  ( pSize!=0 );.  
15290 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
152a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
152b0 45 52 52 5f 46 53 54 41 54 29 3b 0a 20 20 4f 53  ERR_FSTAT);.  OS
152c0 54 52 41 43 45 28 28 22 53 49 5a 45 20 66 69 6c  TRACE(("SIZE fil
152d0 65 3d 25 70 2c 20 70 53 69 7a 65 3d 25 70 5c 6e  e=%p, pSize=%p\n
152e0 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 70 53 69  ", pFile->h, pSi
152f0 7a 65 29 29 3b 0a 0a 23 69 66 20 53 51 4c 49 54  ze));..#if SQLIT
15300 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 0a 20  E_OS_WINRT.  {. 
15310 20 20 20 46 49 4c 45 5f 53 54 41 4e 44 41 52 44     FILE_STANDARD
15320 5f 49 4e 46 4f 20 69 6e 66 6f 3b 0a 20 20 20 20  _INFO info;.    
15330 69 66 28 20 6f 73 47 65 74 46 69 6c 65 49 6e 66  if( osGetFileInf
15340 6f 72 6d 61 74 69 6f 6e 42 79 48 61 6e 64 6c 65  ormationByHandle
15350 45 78 28 70 46 69 6c 65 2d 3e 68 2c 20 46 69 6c  Ex(pFile->h, Fil
15360 65 53 74 61 6e 64 61 72 64 49 6e 66 6f 2c 0a 20  eStandardInfo,. 
15370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15390 20 20 20 20 26 69 6e 66 6f 2c 20 73 69 7a 65 6f      &info, sizeo
153a0 66 28 69 6e 66 6f 29 29 20 29 7b 0a 20 20 20 20  f(info)) ){.    
153b0 20 20 2a 70 53 69 7a 65 20 3d 20 69 6e 66 6f 2e    *pSize = info.
153c0 45 6e 64 4f 66 46 69 6c 65 2e 51 75 61 64 50 61  EndOfFile.QuadPa
153d0 72 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  rt;.    }else{. 
153e0 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
153f0 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
15400 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20  tError();.      
15410 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72  rc = winLogError
15420 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53  (SQLITE_IOERR_FS
15430 54 41 54 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74  TAT, pFile->last
15440 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  Errno,.         
15450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
15460 69 6e 46 69 6c 65 53 69 7a 65 22 2c 20 70 46 69  inFileSize", pFi
15470 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20  le->zPath);.    
15480 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 7b 0a  }.  }.#else.  {.
15490 20 20 20 20 44 57 4f 52 44 20 75 70 70 65 72 42      DWORD upperB
154a0 69 74 73 3b 0a 20 20 20 20 44 57 4f 52 44 20 6c  its;.    DWORD l
154b0 6f 77 65 72 42 69 74 73 3b 0a 20 20 20 20 44 57  owerBits;.    DW
154c0 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 0a  ORD lastErrno;..
154d0 20 20 20 20 6c 6f 77 65 72 42 69 74 73 20 3d 20      lowerBits = 
154e0 6f 73 47 65 74 46 69 6c 65 53 69 7a 65 28 70 46  osGetFileSize(pF
154f0 69 6c 65 2d 3e 68 2c 20 26 75 70 70 65 72 42 69  ile->h, &upperBi
15500 74 73 29 3b 0a 20 20 20 20 2a 70 53 69 7a 65 20  ts);.    *pSize 
15510 3d 20 28 28 28 73 71 6c 69 74 65 33 5f 69 6e 74  = (((sqlite3_int
15520 36 34 29 75 70 70 65 72 42 69 74 73 29 3c 3c 33  64)upperBits)<<3
15530 32 29 20 2b 20 6c 6f 77 65 72 42 69 74 73 3b 0a  2) + lowerBits;.
15540 20 20 20 20 69 66 28 20 20 20 28 6c 6f 77 65 72      if(   (lower
15550 42 69 74 73 20 3d 3d 20 49 4e 56 41 4c 49 44 5f  Bits == INVALID_
15560 46 49 4c 45 5f 53 49 5a 45 29 0a 20 20 20 20 20  FILE_SIZE).     
15570 20 20 26 26 20 28 28 6c 61 73 74 45 72 72 6e 6f    && ((lastErrno
15580 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
15590 72 28 29 29 21 3d 4e 4f 5f 45 52 52 4f 52 29 20  r())!=NO_ERROR) 
155a0 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
155b0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74  lastErrno = last
155c0 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20  Errno;.      rc 
155d0 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  = winLogError(SQ
155e0 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54  LITE_IOERR_FSTAT
155f0 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  , pFile->lastErr
15600 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
15610 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 46             "winF
15620 69 6c 65 53 69 7a 65 22 2c 20 70 46 69 6c 65 2d  ileSize", pFile-
15630 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20  >zPath);.    }. 
15640 20 7d 0a 23 65 6e 64 69 66 0a 20 20 4f 53 54 52   }.#endif.  OSTR
15650 41 43 45 28 28 22 53 49 5a 45 20 66 69 6c 65 3d  ACE(("SIZE file=
15660 25 70 2c 20 70 53 69 7a 65 3d 25 70 2c 20 2a 70  %p, pSize=%p, *p
15670 53 69 7a 65 3d 25 6c 6c 64 2c 20 72 63 3d 25 73  Size=%lld, rc=%s
15680 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
15690 70 46 69 6c 65 2d 3e 68 2c 20 70 53 69 7a 65 2c  pFile->h, pSize,
156a0 20 2a 70 53 69 7a 65 2c 20 73 71 6c 69 74 65 33   *pSize, sqlite3
156b0 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20  ErrName(rc)));. 
156c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
156d0 2a 0a 2a 2a 20 4c 4f 43 4b 46 49 4c 45 5f 46 41  *.** LOCKFILE_FA
156e0 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 20 69  IL_IMMEDIATELY i
156f0 73 20 75 6e 64 65 66 69 6e 65 64 20 6f 6e 20 73  s undefined on s
15700 6f 6d 65 20 57 69 6e 64 6f 77 73 20 73 79 73 74  ome Windows syst
15710 65 6d 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ems..*/.#ifndef 
15720 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d  LOCKFILE_FAIL_IM
15730 4d 45 44 49 41 54 45 4c 59 0a 23 20 64 65 66 69  MEDIATELY.# defi
15740 6e 65 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c  ne LOCKFILE_FAIL
15750 5f 49 4d 4d 45 44 49 41 54 45 4c 59 20 31 0a 23  _IMMEDIATELY 1.#
15760 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 4c  endif..#ifndef L
15770 4f 43 4b 46 49 4c 45 5f 45 58 43 4c 55 53 49 56  OCKFILE_EXCLUSIV
15780 45 5f 4c 4f 43 4b 0a 23 20 64 65 66 69 6e 65 20  E_LOCK.# define 
15790 4c 4f 43 4b 46 49 4c 45 5f 45 58 43 4c 55 53 49  LOCKFILE_EXCLUSI
157a0 56 45 5f 4c 4f 43 4b 20 32 0a 23 65 6e 64 69 66  VE_LOCK 2.#endif
157b0 0a 0a 2f 2a 0a 2a 2a 20 48 69 73 74 6f 72 69 63  ../*.** Historic
157c0 61 6c 6c 79 2c 20 53 51 4c 69 74 65 20 68 61 73  ally, SQLite has
157d0 20 75 73 65 64 20 62 6f 74 68 20 74 68 65 20 4c   used both the L
157e0 6f 63 6b 46 69 6c 65 20 61 6e 64 20 4c 6f 63 6b  ockFile and Lock
157f0 46 69 6c 65 45 78 20 66 75 6e 63 74 69 6f 6e 73  FileEx functions
15800 2e 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20 4c 6f  ..** When the Lo
15810 63 6b 46 69 6c 65 20 66 75 6e 63 74 69 6f 6e 20  ckFile function 
15820 77 61 73 20 75 73 65 64 2c 20 69 74 20 77 61 73  was used, it was
15830 20 61 6c 77 61 79 73 20 65 78 70 65 63 74 65 64   always expected
15840 20 74 6f 20 66 61 69 6c 0a 2a 2a 20 69 6d 6d 65   to fail.** imme
15850 64 69 61 74 65 6c 79 20 69 66 20 74 68 65 20 6c  diately if the l
15860 6f 63 6b 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  ock could not be
15870 20 6f 62 74 61 69 6e 65 64 2e 20 20 41 6c 73 6f   obtained.  Also
15880 2c 20 69 74 20 61 6c 77 61 79 73 20 65 78 70 65  , it always expe
15890 63 74 65 64 20 74 6f 0a 2a 2a 20 6f 62 74 61 69  cted to.** obtai
158a0 6e 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  n an exclusive l
158b0 6f 63 6b 2e 20 20 54 68 65 73 65 20 66 6c 61 67  ock.  These flag
158c0 73 20 61 72 65 20 75 73 65 64 20 77 69 74 68 20  s are used with 
158d0 74 68 65 20 4c 6f 63 6b 46 69 6c 65 45 78 20 66  the LockFileEx f
158e0 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 72  unction.** and r
158f0 65 66 6c 65 63 74 20 74 68 6f 73 65 20 65 78 70  eflect those exp
15900 65 63 74 61 74 69 6f 6e 73 3b 20 74 68 65 72 65  ectations; there
15910 66 6f 72 65 2c 20 74 68 65 79 20 73 68 6f 75 6c  fore, they shoul
15920 64 20 6e 6f 74 20 62 65 20 63 68 61 6e 67 65 64  d not be changed
15930 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
15940 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41  ITE_LOCKFILE_FLA
15950 47 53 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49  GS.# define SQLI
15960 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47  TE_LOCKFILE_FLAG
15970 53 20 20 20 28 4c 4f 43 4b 46 49 4c 45 5f 46 41  S   (LOCKFILE_FA
15980 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 20 7c  IL_IMMEDIATELY |
15990 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   \.             
159a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
159b0 20 20 20 20 20 4c 4f 43 4b 46 49 4c 45 5f 45 58       LOCKFILE_EX
159c0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a 23 65  CLUSIVE_LOCK).#e
159d0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 75 72 72  ndif../*.** Curr
159e0 65 6e 74 6c 79 2c 20 53 51 4c 69 74 65 20 6e 65  ently, SQLite ne
159f0 76 65 72 20 63 61 6c 6c 73 20 74 68 65 20 4c 6f  ver calls the Lo
15a00 63 6b 46 69 6c 65 45 78 20 66 75 6e 63 74 69 6f  ckFileEx functio
15a10 6e 20 77 69 74 68 6f 75 74 20 77 61 6e 74 69 6e  n without wantin
15a20 67 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f  g the.** call to
15a30 20 66 61 69 6c 20 69 6d 6d 65 64 69 61 74 65 6c   fail immediatel
15a40 79 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 63 61  y if the lock ca
15a50 6e 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64  nnot be obtained
15a60 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
15a70 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 45 58 5f 46  ITE_LOCKFILEEX_F
15a80 4c 41 47 53 0a 23 20 64 65 66 69 6e 65 20 53 51  LAGS.# define SQ
15a90 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 45 58 5f  LITE_LOCKFILEEX_
15aa0 46 4c 41 47 53 20 28 4c 4f 43 4b 46 49 4c 45 5f  FLAGS (LOCKFILE_
15ab0 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59  FAIL_IMMEDIATELY
15ac0 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
15ad0 41 63 71 75 69 72 65 20 61 20 72 65 61 64 65 72  Acquire a reader
15ae0 20 6c 6f 63 6b 2e 0a 2a 2a 20 44 69 66 66 65 72   lock..** Differ
15af0 65 6e 74 20 41 50 49 20 72 6f 75 74 69 6e 65 73  ent API routines
15b00 20 61 72 65 20 63 61 6c 6c 65 64 20 64 65 70 65   are called depe
15b10 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72  nding on whether
15b20 20 6f 72 20 6e 6f 74 20 74 68 69 73 0a 2a 2a 20   or not this.** 
15b30 69 73 20 57 69 6e 39 78 20 6f 72 20 57 69 6e 4e  is Win9x or WinN
15b40 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  T..*/.static int
15b50 20 77 69 6e 47 65 74 52 65 61 64 4c 6f 63 6b 28   winGetReadLock(
15b60 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b  winFile *pFile){
15b70 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 4f 53  .  int res;.  OS
15b80 54 52 41 43 45 28 28 22 52 45 41 44 2d 4c 4f 43  TRACE(("READ-LOC
15b90 4b 20 66 69 6c 65 3d 25 70 2c 20 6c 6f 63 6b 3d  K file=%p, lock=
15ba0 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %d\n", pFile->h,
15bb0 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
15bc0 29 29 3b 0a 20 20 69 66 28 20 6f 73 49 73 4e 54  ));.  if( osIsNT
15bd0 28 29 20 29 7b 0a 23 69 66 20 53 51 4c 49 54 45  () ){.#if SQLITE
15be0 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20 2f 2a  _OS_WINCE.    /*
15bf0 0a 20 20 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 69  .    ** NOTE: Wi
15c00 6e 64 6f 77 73 20 43 45 20 69 73 20 68 61 6e 64  ndows CE is hand
15c10 6c 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20  led differently 
15c20 68 65 72 65 20 64 75 65 20 69 74 73 20 6c 61 63  here due its lac
15c30 6b 20 6f 66 20 74 68 65 20 57 69 6e 33 32 0a 20  k of the Win32. 
15c40 20 20 20 2a 2a 20 20 20 20 20 20 20 41 50 49 20     **       API 
15c50 4c 6f 63 6b 46 69 6c 65 45 78 2e 0a 20 20 20 20  LockFileEx..    
15c60 2a 2f 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e  */.    res = win
15c70 63 65 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c  ceLockFile(&pFil
15c80 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52  e->h, SHARED_FIR
15c90 53 54 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 23 65  ST, 0, 1, 0);.#e
15ca0 6c 73 65 0a 20 20 20 20 72 65 73 20 3d 20 77 69  lse.    res = wi
15cb0 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65  nLockFile(&pFile
15cc0 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  ->h, SQLITE_LOCK
15cd0 46 49 4c 45 45 58 5f 46 4c 41 47 53 2c 20 53 48  FILEEX_FLAGS, SH
15ce0 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c 0a 20  ARED_FIRST, 0,. 
15cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d00 20 20 20 20 20 53 48 41 52 45 44 5f 53 49 5a 45       SHARED_SIZE
15d10 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  , 0);.#endif.  }
15d20 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57  .#ifdef SQLITE_W
15d30 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20  IN32_HAS_ANSI.  
15d40 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6c 6b  else{.    int lk
15d50 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61  ;.    sqlite3_ra
15d60 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28  ndomness(sizeof(
15d70 6c 6b 29 2c 20 26 6c 6b 29 3b 0a 20 20 20 20 70  lk), &lk);.    p
15d80 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b  File->sharedLock
15d90 42 79 74 65 20 3d 20 28 73 68 6f 72 74 29 28 28  Byte = (short)((
15da0 6c 6b 20 26 20 30 78 37 66 66 66 66 66 66 66 29  lk & 0x7fffffff)
15db0 25 28 53 48 41 52 45 44 5f 53 49 5a 45 20 2d 20  %(SHARED_SIZE - 
15dc0 31 29 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 77  1));.    res = w
15dd0 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c  inLockFile(&pFil
15de0 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43  e->h, SQLITE_LOC
15df0 4b 46 49 4c 45 5f 46 4c 41 47 53 2c 0a 20 20 20  KFILE_FLAGS,.   
15e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e10 20 20 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b     SHARED_FIRST+
15e20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63  pFile->sharedLoc
15e30 6b 42 79 74 65 2c 20 30 2c 20 31 2c 20 30 29 3b  kByte, 0, 1, 0);
15e40 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
15e50 28 20 72 65 73 20 3d 3d 20 30 20 29 7b 0a 20 20  ( res == 0 ){.  
15e60 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
15e70 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
15e80 72 6f 72 28 29 3b 0a 20 20 20 20 2f 2a 20 4e 6f  ror();.    /* No
15e90 20 6e 65 65 64 20 74 6f 20 6c 6f 67 20 61 20 66   need to log a f
15ea0 61 69 6c 75 72 65 20 74 6f 20 6c 6f 63 6b 20 2a  ailure to lock *
15eb0 2f 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28  /.  }.  OSTRACE(
15ec0 28 22 52 45 41 44 2d 4c 4f 43 4b 20 66 69 6c 65  ("READ-LOCK file
15ed0 3d 25 70 2c 20 72 65 73 75 6c 74 3d 25 64 5c 6e  =%p, result=%d\n
15ee0 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 65 73  ", pFile->h, res
15ef0 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73  ));.  return res
15f00 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 64 6f 20  ;.}../*.** Undo 
15f10 61 20 72 65 61 64 6c 6f 63 6b 0a 2a 2f 0a 73 74  a readlock.*/.st
15f20 61 74 69 63 20 69 6e 74 20 77 69 6e 55 6e 6c 6f  atic int winUnlo
15f30 63 6b 52 65 61 64 4c 6f 63 6b 28 77 69 6e 46 69  ckReadLock(winFi
15f40 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e  le *pFile){.  in
15f50 74 20 72 65 73 3b 0a 20 20 44 57 4f 52 44 20 6c  t res;.  DWORD l
15f60 61 73 74 45 72 72 6e 6f 3b 0a 20 20 4f 53 54 52  astErrno;.  OSTR
15f70 41 43 45 28 28 22 52 45 41 44 2d 55 4e 4c 4f 43  ACE(("READ-UNLOC
15f80 4b 20 66 69 6c 65 3d 25 70 2c 20 6c 6f 63 6b 3d  K file=%p, lock=
15f90 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %d\n", pFile->h,
15fa0 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
15fb0 29 29 3b 0a 20 20 69 66 28 20 6f 73 49 73 4e 54  ));.  if( osIsNT
15fc0 28 29 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20  () ){.    res = 
15fd0 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70  winUnlockFile(&p
15fe0 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f  File->h, SHARED_
15ff0 46 49 52 53 54 2c 20 30 2c 20 53 48 41 52 45 44  FIRST, 0, SHARED
16000 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20 7d 0a 23  _SIZE, 0);.  }.#
16010 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  ifdef SQLITE_WIN
16020 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c  32_HAS_ANSI.  el
16030 73 65 7b 0a 20 20 20 20 72 65 73 20 3d 20 77 69  se{.    res = wi
16040 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69  nUnlockFile(&pFi
16050 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49  le->h, SHARED_FI
16060 52 53 54 2b 70 46 69 6c 65 2d 3e 73 68 61 72 65  RST+pFile->share
16070 64 4c 6f 63 6b 42 79 74 65 2c 20 30 2c 20 31 2c  dLockByte, 0, 1,
16080 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   0);.  }.#endif.
16090 20 20 69 66 28 20 72 65 73 3d 3d 30 20 26 26 20    if( res==0 && 
160a0 28 28 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73  ((lastErrno = os
160b0 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29 21  GetLastError())!
160c0 3d 45 52 52 4f 52 5f 4e 4f 54 5f 4c 4f 43 4b 45  =ERROR_NOT_LOCKE
160d0 44 29 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  D) ){.    pFile-
160e0 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73  >lastErrno = las
160f0 74 45 72 72 6e 6f 3b 0a 20 20 20 20 77 69 6e 4c  tErrno;.    winL
16100 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
16110 4f 45 52 52 5f 55 4e 4c 4f 43 4b 2c 20 70 46 69  OERR_UNLOCK, pFi
16120 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20  le->lastErrno,. 
16130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
16140 77 69 6e 55 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63  winUnlockReadLoc
16150 6b 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  k", pFile->zPath
16160 29 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45  );.  }.  OSTRACE
16170 28 28 22 52 45 41 44 2d 55 4e 4c 4f 43 4b 20 66  (("READ-UNLOCK f
16180 69 6c 65 3d 25 70 2c 20 72 65 73 75 6c 74 3d 25  ile=%p, result=%
16190 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  d\n", pFile->h, 
161a0 72 65 73 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  res));.  return 
161b0 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f  res;.}../*.** Lo
161c0 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74 68  ck the file with
161d0 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66   the lock specif
161e0 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72  ied by parameter
161f0 20 6c 6f 63 6b 74 79 70 65 20 2d 20 6f 6e 65 0a   locktype - one.
16200 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ** of the follow
16210 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28  ing:.**.**     (
16220 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a  1) SHARED_LOCK.*
16230 2a 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56  *     (2) RESERV
16240 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  ED_LOCK.**     (
16250 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a  3) PENDING_LOCK.
16260 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55  **     (4) EXCLU
16270 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20  SIVE_LOCK.**.** 
16280 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72  Sometimes when r
16290 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f  equesting one lo
162a0 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69  ck state, additi
162b0 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73  onal lock states
162c0 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64  .** are inserted
162d0 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68   in between.  Th
162e0 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20  e locking might 
162f0 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74  fail on one of t
16300 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e  he later.** tran
16310 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20  sitions leaving 
16320 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64  the lock state d
16330 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68  ifferent from wh
16340 61 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75  at it started bu
16350 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74  t.** still short
16360 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54   of its goal.  T
16370 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61  he following cha
16380 72 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c  rt shows the all
16390 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69  owed.** transiti
163a0 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65  ons and the inse
163b0 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74  rted intermediat
163c0 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20  e states:.**.** 
163d0 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53     UNLOCKED -> S
163e0 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  HARED.**    SHAR
163f0 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a  ED -> RESERVED.*
16400 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28  *    SHARED -> (
16410 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
16420 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45  USIVE.**    RESE
16430 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47  RVED -> (PENDING
16440 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  ) -> EXCLUSIVE.*
16450 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20  *    PENDING -> 
16460 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20  EXCLUSIVE.**.** 
16470 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
16480 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20  l only increase 
16490 61 20 6c 6f 63 6b 2e 20 20 54 68 65 20 77 69 6e  a lock.  The win
164a0 55 6e 6c 6f 63 6b 28 29 20 72 6f 75 74 69 6e 65  Unlock() routine
164b0 0a 2a 2a 20 65 72 61 73 65 73 20 61 6c 6c 20 6c  .** erases all l
164c0 6f 63 6b 73 20 61 74 20 6f 6e 63 65 20 61 6e 64  ocks at once and
164d0 20 72 65 74 75 72 6e 73 20 75 73 20 69 6d 6d 65   returns us imme
164e0 64 69 61 74 65 6c 79 20 74 6f 20 6c 6f 63 6b 69  diately to locki
164f0 6e 67 20 6c 65 76 65 6c 20 30 2e 0a 2a 2a 20 49  ng level 0..** I
16500 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
16510 65 20 74 6f 20 6c 6f 77 65 72 20 74 68 65 20 6c  e to lower the l
16520 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 65  ocking level one
16530 20 73 74 65 70 20 61 74 20 61 20 74 69 6d 65 2e   step at a time.
16540 20 20 59 6f 75 0a 2a 2a 20 6d 75 73 74 20 67 6f    You.** must go
16550 20 73 74 72 61 69 67 68 74 20 74 6f 20 6c 6f 63   straight to loc
16560 6b 69 6e 67 20 6c 65 76 65 6c 20 30 2e 0a 2a 2f  king level 0..*/
16570 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4c  .static int winL
16580 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
16590 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79   *id, int lockty
165a0 70 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  pe){.  int rc = 
165b0 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 2f 2a  SQLITE_OK;    /*
165c0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f   Return code fro
165d0 6d 20 73 75 62 72 6f 75 74 69 6e 65 73 20 2a 2f  m subroutines */
165e0 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 31 3b 20  .  int res = 1; 
165f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
16600 75 6c 74 20 6f 66 20 61 20 57 69 6e 64 6f 77 73  ult of a Windows
16610 20 6c 6f 63 6b 20 63 61 6c 6c 20 2a 2f 0a 20 20   lock call */.  
16620 69 6e 74 20 6e 65 77 4c 6f 63 6b 74 79 70 65 3b  int newLocktype;
16630 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 70 46         /* Set pF
16640 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 74 6f  ile->locktype to
16650 20 74 68 69 73 20 76 61 6c 75 65 20 62 65 66 6f   this value befo
16660 72 65 20 65 78 69 74 69 6e 67 20 2a 2f 0a 20 20  re exiting */.  
16670 69 6e 74 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f  int gotPendingLo
16680 63 6b 20 3d 20 30 3b 2f 2a 20 54 72 75 65 20 69  ck = 0;/* True i
16690 66 20 77 65 20 61 63 71 75 69 72 65 64 20 61 20  f we acquired a 
166a0 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 74 68 69  PENDING lock thi
166b0 73 20 74 69 6d 65 20 2a 2f 0a 20 20 77 69 6e 46  s time */.  winF
166c0 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69  ile *pFile = (wi
166d0 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 44 57 4f  nFile*)id;.  DWO
166e0 52 44 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 4e  RD lastErrno = N
166f0 4f 5f 45 52 52 4f 52 3b 0a 0a 20 20 61 73 73 65  O_ERROR;..  asse
16700 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 4f  rt( id!=0 );.  O
16710 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 66 69  STRACE(("LOCK fi
16720 6c 65 3d 25 70 2c 20 6f 6c 64 4c 6f 63 6b 3d 25  le=%p, oldLock=%
16730 64 28 25 64 29 2c 20 6e 65 77 4c 6f 63 6b 3d 25  d(%d), newLock=%
16740 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
16750 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65   pFile->h, pFile
16760 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 70 46 69 6c  ->locktype, pFil
16770 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74  e->sharedLockByt
16780 65 2c 20 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 0a  e, locktype));..
16790 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
167a0 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b 20   already a lock 
167b0 6f 66 20 74 68 69 73 20 74 79 70 65 20 6f 72 20  of this type or 
167c0 6d 6f 72 65 20 72 65 73 74 72 69 63 74 69 76 65  more restrictive
167d0 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 4f 73 46   on the.  ** OsF
167e0 69 6c 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e  ile, do nothing.
167f0 20 44 6f 6e 27 74 20 75 73 65 20 74 68 65 20 65   Don't use the e
16800 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61  nd_lock: exit pa
16810 74 68 2c 20 61 73 0a 20 20 2a 2a 20 73 71 6c 69  th, as.  ** sqli
16820 74 65 33 4f 73 45 6e 74 65 72 4d 75 74 65 78 28  te3OsEnterMutex(
16830 29 20 68 61 73 6e 27 74 20 62 65 65 6e 20 63 61  ) hasn't been ca
16840 6c 6c 65 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20  lled yet..  */. 
16850 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b   if( pFile->lock
16860 74 79 70 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29  type>=locktype )
16870 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  {.    OSTRACE(("
16880 4c 4f 43 4b 2d 48 45 4c 44 20 66 69 6c 65 3d 25  LOCK-HELD file=%
16890 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c  p, rc=SQLITE_OK\
168a0 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  n", pFile->h));.
168b0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
168c0 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  E_OK;.  }..  /* 
168d0 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f  Make sure the lo
168e0 63 6b 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69  cking sequence i
168f0 73 20 63 6f 72 72 65 63 74 0a 20 20 2a 2f 0a 20  s correct.  */. 
16900 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
16910 6c 6f 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43  locktype!=NO_LOC
16920 4b 20 7c 7c 20 6c 6f 63 6b 74 79 70 65 3d 3d 53  K || locktype==S
16930 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
16940 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65  assert( locktype
16950 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29  !=PENDING_LOCK )
16960 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b  ;.  assert( lock
16970 74 79 70 65 21 3d 52 45 53 45 52 56 45 44 5f 4c  type!=RESERVED_L
16980 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 6c 6f  OCK || pFile->lo
16990 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c  cktype==SHARED_L
169a0 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 63  OCK );..  /* Loc
169b0 6b 20 74 68 65 20 50 45 4e 44 49 4e 47 5f 4c 4f  k the PENDING_LO
169c0 43 4b 20 62 79 74 65 20 69 66 20 77 65 20 6e 65  CK byte if we ne
169d0 65 64 20 74 6f 20 61 63 71 75 69 72 65 20 61 20  ed to acquire a 
169e0 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 6f 72 0a  PENDING lock or.
169f0 20 20 2a 2a 20 61 20 53 48 41 52 45 44 20 6c 6f    ** a SHARED lo
16a00 63 6b 2e 20 20 49 66 20 77 65 20 61 72 65 20 61  ck.  If we are a
16a10 63 71 75 69 72 69 6e 67 20 61 20 53 48 41 52 45  cquiring a SHARE
16a20 44 20 6c 6f 63 6b 2c 20 74 68 65 20 61 63 71 75  D lock, the acqu
16a30 69 73 69 74 69 6f 6e 20 6f 66 0a 20 20 2a 2a 20  isition of.  ** 
16a40 74 68 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  the PENDING_LOCK
16a50 20 62 79 74 65 20 69 73 20 74 65 6d 70 6f 72 61   byte is tempora
16a60 72 79 2e 0a 20 20 2a 2f 0a 20 20 6e 65 77 4c 6f  ry..  */.  newLo
16a70 63 6b 74 79 70 65 20 3d 20 70 46 69 6c 65 2d 3e  cktype = pFile->
16a80 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 69 66 28 20  locktype;.  if( 
16a90 20 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79    (pFile->lockty
16aa0 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 29 0a 20 20 20  pe==NO_LOCK).   
16ab0 20 20 7c 7c 20 28 20 20 20 28 6c 6f 63 6b 74 79    || (   (lockty
16ac0 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  pe==EXCLUSIVE_LO
16ad0 43 4b 29 0a 20 20 20 20 20 20 20 20 20 26 26 20  CK).         && 
16ae0 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65  (pFile->locktype
16af0 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29  ==RESERVED_LOCK)
16b00 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20 63  ).  ){.    int c
16b10 6e 74 20 3d 20 33 3b 0a 20 20 20 20 77 68 69 6c  nt = 3;.    whil
16b20 65 28 20 63 6e 74 2d 2d 3e 30 20 26 26 20 28 72  e( cnt-->0 && (r
16b30 65 73 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65  es = winLockFile
16b40 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49  (&pFile->h, SQLI
16b50 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47  TE_LOCKFILE_FLAG
16b60 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  S,.             
16b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b80 20 20 20 20 20 20 20 20 20 20 20 20 50 45 4e 44              PEND
16b90 49 4e 47 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20  ING_BYTE, 0, 1, 
16ba0 30 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  0))==0 ){.      
16bb0 2f 2a 20 54 72 79 20 33 20 74 69 6d 65 73 20 74  /* Try 3 times t
16bc0 6f 20 67 65 74 20 74 68 65 20 70 65 6e 64 69 6e  o get the pendin
16bd0 67 20 6c 6f 63 6b 2e 20 20 54 68 69 73 20 69 73  g lock.  This is
16be0 20 6e 65 65 64 65 64 20 74 6f 20 77 6f 72 6b 0a   needed to work.
16bf0 20 20 20 20 20 20 2a 2a 20 61 72 6f 75 6e 64 20        ** around 
16c00 70 72 6f 62 6c 65 6d 73 20 63 61 75 73 65 64 20  problems caused 
16c10 62 79 20 69 6e 64 65 78 69 6e 67 20 61 6e 64 2f  by indexing and/
16c20 6f 72 20 61 6e 74 69 2d 76 69 72 75 73 20 73 6f  or anti-virus so
16c30 66 74 77 61 72 65 20 6f 6e 0a 20 20 20 20 20 20  ftware on.      
16c40 2a 2a 20 57 69 6e 64 6f 77 73 20 73 79 73 74 65  ** Windows syste
16c50 6d 73 2e 0a 20 20 20 20 20 20 2a 2a 20 49 66 20  ms..      ** If 
16c60 79 6f 75 20 61 72 65 20 75 73 69 6e 67 20 74 68  you are using th
16c70 69 73 20 63 6f 64 65 20 61 73 20 61 20 6d 6f 64  is code as a mod
16c80 65 6c 20 66 6f 72 20 61 6c 74 65 72 6e 61 74 69  el for alternati
16c90 76 65 20 56 46 53 65 73 2c 20 64 6f 20 6e 6f 74  ve VFSes, do not
16ca0 0a 20 20 20 20 20 20 2a 2a 20 63 6f 70 79 20 74  .      ** copy t
16cb0 68 69 73 20 72 65 74 72 79 20 6c 6f 67 69 63 2e  his retry logic.
16cc0 20 20 49 74 20 69 73 20 61 20 68 61 63 6b 20 69    It is a hack i
16cd0 6e 74 65 6e 64 65 64 20 66 6f 72 20 57 69 6e 64  ntended for Wind
16ce0 6f 77 73 20 6f 6e 6c 79 2e 0a 20 20 20 20 20 20  ows only..      
16cf0 2a 2f 0a 20 20 20 20 20 20 6c 61 73 74 45 72 72  */.      lastErr
16d00 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
16d10 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 4f 53 54  ror();.      OST
16d20 52 41 43 45 28 28 22 4c 4f 43 4b 2d 50 45 4e 44  RACE(("LOCK-PEND
16d30 49 4e 47 2d 46 41 49 4c 20 66 69 6c 65 3d 25 70  ING-FAIL file=%p
16d40 2c 20 63 6f 75 6e 74 3d 25 64 2c 20 72 65 73 75  , count=%d, resu
16d50 6c 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  lt=%d\n",.      
16d60 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
16d70 68 2c 20 63 6e 74 2c 20 72 65 73 29 29 3b 0a 20  h, cnt, res));. 
16d80 20 20 20 20 20 69 66 28 20 6c 61 73 74 45 72 72       if( lastErr
16d90 6e 6f 3d 3d 45 52 52 4f 52 5f 49 4e 56 41 4c 49  no==ERROR_INVALI
16da0 44 5f 48 41 4e 44 4c 45 20 29 7b 0a 20 20 20 20  D_HANDLE ){.    
16db0 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
16dc0 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f  rrno = lastErrno
16dd0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  ;.        rc = S
16de0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
16df0 3b 0a 20 20 20 20 20 20 20 20 4f 53 54 52 41 43  ;.        OSTRAC
16e00 45 28 28 22 4c 4f 43 4b 2d 46 41 49 4c 20 66 69  E(("LOCK-FAIL fi
16e10 6c 65 3d 25 70 2c 20 63 6f 75 6e 74 3d 25 64 2c  le=%p, count=%d,
16e20 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20   rc=%s\n",.     
16e30 20 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c              pFil
16e40 65 2d 3e 68 2c 20 63 6e 74 2c 20 73 71 6c 69 74  e->h, cnt, sqlit
16e50 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b  e3ErrName(rc)));
16e60 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
16e70 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
16e80 20 20 69 66 28 20 63 6e 74 20 29 20 73 71 6c 69    if( cnt ) sqli
16e90 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28  te3_win32_sleep(
16ea0 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f  1);.    }.    go
16eb0 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20 72  tPendingLock = r
16ec0 65 73 3b 0a 20 20 20 20 69 66 28 20 21 72 65 73  es;.    if( !res
16ed0 20 29 7b 0a 20 20 20 20 20 20 6c 61 73 74 45 72   ){.      lastEr
16ee0 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
16ef0 72 72 6f 72 28 29 3b 0a 20 20 20 20 7d 0a 20 20  rror();.    }.  
16f00 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20  }..  /* Acquire 
16f10 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 0a 20 20  a shared lock.  
16f20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70  */.  if( locktyp
16f30 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26  e==SHARED_LOCK &
16f40 26 20 72 65 73 20 29 7b 0a 20 20 20 20 61 73 73  & res ){.    ass
16f50 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ert( pFile->lock
16f60 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 3b  type==NO_LOCK );
16f70 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e 47 65  .    res = winGe
16f80 74 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29  tReadLock(pFile)
16f90 3b 0a 20 20 20 20 69 66 28 20 72 65 73 20 29 7b  ;.    if( res ){
16fa0 0a 20 20 20 20 20 20 6e 65 77 4c 6f 63 6b 74 79  .      newLockty
16fb0 70 65 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b  pe = SHARED_LOCK
16fc0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
16fd0 20 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f     lastErrno = o
16fe0 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b  sGetLastError();
16ff0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
17000 20 41 63 71 75 69 72 65 20 61 20 52 45 53 45 52   Acquire a RESER
17010 56 45 44 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20  VED lock.  */.  
17020 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 52 45  if( locktype==RE
17030 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 72  SERVED_LOCK && r
17040 65 73 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  es ){.    assert
17050 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  ( pFile->locktyp
17060 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e==SHARED_LOCK )
17070 3b 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e 4c  ;.    res = winL
17080 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e  ockFile(&pFile->
17090 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49  h, SQLITE_LOCKFI
170a0 4c 45 5f 46 4c 41 47 53 2c 20 52 45 53 45 52 56  LE_FLAGS, RESERV
170b0 45 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30  ED_BYTE, 0, 1, 0
170c0 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73 20 29  );.    if( res )
170d0 7b 0a 20 20 20 20 20 20 6e 65 77 4c 6f 63 6b 74  {.      newLockt
170e0 79 70 65 20 3d 20 52 45 53 45 52 56 45 44 5f 4c  ype = RESERVED_L
170f0 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  OCK;.    }else{.
17100 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 20        lastErrno 
17110 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
17120 28 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ();.    }.  }.. 
17130 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20 50 45   /* Acquire a PE
17140 4e 44 49 4e 47 20 6c 6f 63 6b 0a 20 20 2a 2f 0a  NDING lock.  */.
17150 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d    if( locktype==
17160 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26  EXCLUSIVE_LOCK &
17170 26 20 72 65 73 20 29 7b 0a 20 20 20 20 6e 65 77  & res ){.    new
17180 4c 6f 63 6b 74 79 70 65 20 3d 20 50 45 4e 44 49  Locktype = PENDI
17190 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20 67 6f 74  NG_LOCK;.    got
171a0 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20 30 3b  PendingLock = 0;
171b0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69  .  }..  /* Acqui
171c0 72 65 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  re an EXCLUSIVE 
171d0 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20  lock.  */.  if( 
171e0 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53  locktype==EXCLUS
171f0 49 56 45 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20  IVE_LOCK && res 
17200 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
17210 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d  File->locktype>=
17220 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
17230 20 20 20 72 65 73 20 3d 20 77 69 6e 55 6e 6c 6f     res = winUnlo
17240 63 6b 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65  ckReadLock(pFile
17250 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e  );.    res = win
17260 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d  LockFile(&pFile-
17270 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46  >h, SQLITE_LOCKF
17280 49 4c 45 5f 46 4c 41 47 53 2c 20 53 48 41 52 45  ILE_FLAGS, SHARE
17290 44 5f 46 49 52 53 54 2c 20 30 2c 0a 20 20 20 20  D_FIRST, 0,.    
172a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
172b0 20 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30    SHARED_SIZE, 0
172c0 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73 20 29  );.    if( res )
172d0 7b 0a 20 20 20 20 20 20 6e 65 77 4c 6f 63 6b 74  {.      newLockt
172e0 79 70 65 20 3d 20 45 58 43 4c 55 53 49 56 45 5f  ype = EXCLUSIVE_
172f0 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  LOCK;.    }else{
17300 0a 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f  .      lastErrno
17310 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
17320 72 28 29 3b 0a 20 20 20 20 20 20 77 69 6e 47 65  r();.      winGe
17330 74 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29  tReadLock(pFile)
17340 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
17350 2a 20 49 66 20 77 65 20 61 72 65 20 68 6f 6c 64  * If we are hold
17360 69 6e 67 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f  ing a PENDING lo
17370 63 6b 20 74 68 61 74 20 6f 75 67 68 74 20 74 6f  ck that ought to
17380 20 62 65 20 72 65 6c 65 61 73 65 64 2c 20 74 68   be released, th
17390 65 6e 0a 20 20 2a 2a 20 72 65 6c 65 61 73 65 20  en.  ** release 
173a0 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69  it now..  */.  i
173b0 66 28 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63  f( gotPendingLoc
173c0 6b 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 53  k && locktype==S
173d0 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
173e0 20 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28    winUnlockFile(
173f0 26 70 46 69 6c 65 2d 3e 68 2c 20 50 45 4e 44 49  &pFile->h, PENDI
17400 4e 47 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30  NG_BYTE, 0, 1, 0
17410 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64  );.  }..  /* Upd
17420 61 74 65 20 74 68 65 20 73 74 61 74 65 20 6f 66  ate the state of
17430 20 74 68 65 20 6c 6f 63 6b 20 68 61 73 20 68 65   the lock has he
17440 6c 64 20 69 6e 20 74 68 65 20 66 69 6c 65 20 64  ld in the file d
17450 65 73 63 72 69 70 74 6f 72 20 74 68 65 6e 0a 20  escriptor then. 
17460 20 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20 61   ** return the a
17470 70 70 72 6f 70 72 69 61 74 65 20 72 65 73 75 6c  ppropriate resul
17480 74 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 69  t code..  */.  i
17490 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20 72 63  f( res ){.    rc
174a0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
174b0 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c 65  }else{.    pFile
174c0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61  ->lastErrno = la
174d0 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 72 63 20  stErrno;.    rc 
174e0 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
174f0 20 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43     OSTRACE(("LOC
17500 4b 2d 46 41 49 4c 20 66 69 6c 65 3d 25 70 2c 20  K-FAIL file=%p, 
17510 77 61 6e 74 65 64 3d 25 64 2c 20 67 6f 74 3d 25  wanted=%d, got=%
17520 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
17530 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63     pFile->h, loc
17540 6b 74 79 70 65 2c 20 6e 65 77 4c 6f 63 6b 74 79  ktype, newLockty
17550 70 65 29 29 3b 0a 20 20 7d 0a 20 20 70 46 69 6c  pe));.  }.  pFil
17560 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 28 75  e->locktype = (u
17570 38 29 6e 65 77 4c 6f 63 6b 74 79 70 65 3b 0a 20  8)newLocktype;. 
17580 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20   OSTRACE(("LOCK 
17590 66 69 6c 65 3d 25 70 2c 20 6c 6f 63 6b 3d 25 64  file=%p, lock=%d
175a0 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20  , rc=%s\n",.    
175b0 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c         pFile->h,
175c0 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
175d0 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65  , sqlite3ErrName
175e0 28 72 63 29 29 29 3b 0a 20 20 72 65 74 75 72 6e  (rc)));.  return
175f0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
17600 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b  is routine check
17610 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  s if there is a 
17620 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65  RESERVED lock he
17630 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66  ld on the specif
17640 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74  ied.** file by t
17650 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72  his or any other
17660 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63   process. If suc
17670 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  h a lock is held
17680 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d  , return.** non-
17690 7a 65 72 6f 2c 20 6f 74 68 65 72 77 69 73 65 20  zero, otherwise 
176a0 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  zero..*/.static 
176b0 69 6e 74 20 77 69 6e 43 68 65 63 6b 52 65 73 65  int winCheckRese
176c0 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33  rvedLock(sqlite3
176d0 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a  _file *id, int *
176e0 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20  pResOut){.  int 
176f0 72 65 73 3b 0a 20 20 77 69 6e 46 69 6c 65 20 2a  res;.  winFile *
17700 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65  pFile = (winFile
17710 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74  *)id;..  Simulat
17720 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
17730 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48   SQLITE_IOERR_CH
17740 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b  ECKRESERVEDLOCK;
17750 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22   );.  OSTRACE(("
17760 54 45 53 54 2d 57 52 2d 4c 4f 43 4b 20 66 69 6c  TEST-WR-LOCK fil
17770 65 3d 25 70 2c 20 70 52 65 73 4f 75 74 3d 25 70  e=%p, pResOut=%p
17780 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 70  \n", pFile->h, p
17790 52 65 73 4f 75 74 29 29 3b 0a 0a 20 20 61 73 73  ResOut));..  ass
177a0 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20  ert( id!=0 );.  
177b0 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  if( pFile->lockt
177c0 79 70 65 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ype>=RESERVED_LO
177d0 43 4b 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20  CK ){.    res = 
177e0 31 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  1;.    OSTRACE((
177f0 22 54 45 53 54 2d 57 52 2d 4c 4f 43 4b 20 66 69  "TEST-WR-LOCK fi
17800 6c 65 3d 25 70 2c 20 72 65 73 75 6c 74 3d 25 64  le=%p, result=%d
17810 20 28 6c 6f 63 61 6c 29 5c 6e 22 2c 20 70 46 69   (local)\n", pFi
17820 6c 65 2d 3e 68 2c 20 72 65 73 29 29 3b 0a 20 20  le->h, res));.  
17830 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 73 20 3d  }else{.    res =
17840 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46   winLockFile(&pF
17850 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c  ile->h, SQLITE_L
17860 4f 43 4b 46 49 4c 45 45 58 5f 46 4c 41 47 53 2c  OCKFILEEX_FLAGS,
17870 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 30  RESERVED_BYTE, 0
17880 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 1, 0);.    if(
17890 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20 77 69   res ){.      wi
178a0 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69  nUnlockFile(&pFi
178b0 6c 65 2d 3e 68 2c 20 52 45 53 45 52 56 45 44 5f  le->h, RESERVED_
178c0 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a  BYTE, 0, 1, 0);.
178d0 20 20 20 20 7d 0a 20 20 20 20 72 65 73 20 3d 20      }.    res = 
178e0 21 72 65 73 3b 0a 20 20 20 20 4f 53 54 52 41 43  !res;.    OSTRAC
178f0 45 28 28 22 54 45 53 54 2d 57 52 2d 4c 4f 43 4b  E(("TEST-WR-LOCK
17900 20 66 69 6c 65 3d 25 70 2c 20 72 65 73 75 6c 74   file=%p, result
17910 3d 25 64 20 28 72 65 6d 6f 74 65 29 5c 6e 22 2c  =%d (remote)\n",
17920 20 70 46 69 6c 65 2d 3e 68 2c 20 72 65 73 29 29   pFile->h, res))
17930 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 4f 75 74  ;.  }.  *pResOut
17940 20 3d 20 72 65 73 3b 0a 20 20 4f 53 54 52 41 43   = res;.  OSTRAC
17950 45 28 28 22 54 45 53 54 2d 57 52 2d 4c 4f 43 4b  E(("TEST-WR-LOCK
17960 20 66 69 6c 65 3d 25 70 2c 20 70 52 65 73 4f 75   file=%p, pResOu
17970 74 3d 25 70 2c 20 2a 70 52 65 73 4f 75 74 3d 25  t=%p, *pResOut=%
17980 64 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c  d, rc=SQLITE_OK\
17990 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  n",.           p
179a0 46 69 6c 65 2d 3e 68 2c 20 70 52 65 73 4f 75 74  File->h, pResOut
179b0 2c 20 2a 70 52 65 73 4f 75 74 29 29 3b 0a 20 20  , *pResOut));.  
179c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
179d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72  ;.}../*.** Lower
179e0 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
179f0 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72  el on file descr
17a00 69 70 74 6f 72 20 69 64 20 74 6f 20 6c 6f 63 6b  iptor id to lock
17a10 74 79 70 65 2e 20 20 6c 6f 63 6b 74 79 70 65 0a  type.  locktype.
17a20 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65  ** must be eithe
17a30 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41  r NO_LOCK or SHA
17a40 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20  RED_LOCK..**.** 
17a50 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  If the locking l
17a60 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65  evel of the file
17a70 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61   descriptor is a
17a80 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c  lready at or bel
17a90 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73  ow.** the reques
17aa0 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  ted locking leve
17ab0 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  l, this routine 
17ac0 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
17ad0 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  * It is not poss
17ae0 69 62 6c 65 20 66 6f 72 20 74 68 69 73 20 72 6f  ible for this ro
17af0 75 74 69 6e 65 20 74 6f 20 66 61 69 6c 20 69 66  utine to fail if
17b00 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
17b10 6d 65 6e 74 0a 2a 2a 20 69 73 20 4e 4f 5f 4c 4f  ment.** is NO_LO
17b20 43 4b 2e 20 20 49 66 20 74 68 65 20 73 65 63 6f  CK.  If the seco
17b30 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 53  nd argument is S
17b40 48 41 52 45 44 5f 4c 4f 43 4b 20 74 68 65 6e 20  HARED_LOCK then 
17b50 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
17b60 6d 69 67 68 74 20 72 65 74 75 72 6e 20 53 51 4c  might return SQL
17b70 49 54 45 5f 49 4f 45 52 52 3b 0a 2a 2f 0a 73 74  ITE_IOERR;.*/.st
17b80 61 74 69 63 20 69 6e 74 20 77 69 6e 55 6e 6c 6f  atic int winUnlo
17b90 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
17ba0 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70  *id, int locktyp
17bb0 65 29 7b 0a 20 20 69 6e 74 20 74 79 70 65 3b 0a  e){.  int type;.
17bc0 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65    winFile *pFile
17bd0 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b   = (winFile*)id;
17be0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
17bf0 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28  TE_OK;.  assert(
17c00 20 70 46 69 6c 65 21 3d 30 20 29 3b 0a 20 20 61   pFile!=0 );.  a
17c10 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 3c  ssert( locktype<
17c20 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
17c30 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f    OSTRACE(("UNLO
17c40 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6f 6c 64 4c  CK file=%p, oldL
17c50 6f 63 6b 3d 25 64 28 25 64 29 2c 20 6e 65 77 4c  ock=%d(%d), newL
17c60 6f 63 6b 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  ock=%d\n",.     
17c70 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20        pFile->h, 
17c80 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c  pFile->locktype,
17c90 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f   pFile->sharedLo
17ca0 63 6b 42 79 74 65 2c 20 6c 6f 63 6b 74 79 70 65  ckByte, locktype
17cb0 29 29 3b 0a 20 20 74 79 70 65 20 3d 20 70 46 69  ));.  type = pFi
17cc0 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20 20  le->locktype;.  
17cd0 69 66 28 20 74 79 70 65 3e 3d 45 58 43 4c 55 53  if( type>=EXCLUS
17ce0 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  IVE_LOCK ){.    
17cf0 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70  winUnlockFile(&p
17d00 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f  File->h, SHARED_
17d10 46 49 52 53 54 2c 20 30 2c 20 53 48 41 52 45 44  FIRST, 0, SHARED
17d20 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20 20 20 69  _SIZE, 0);.    i
17d30 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41  f( locktype==SHA
17d40 52 45 44 5f 4c 4f 43 4b 20 26 26 20 21 77 69 6e  RED_LOCK && !win
17d50 47 65 74 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c  GetReadLock(pFil
17d60 65 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  e) ){.      /* T
17d70 68 69 73 20 73 68 6f 75 6c 64 20 6e 65 76 65 72  his should never
17d80 20 68 61 70 70 65 6e 2e 20 20 57 65 20 73 68 6f   happen.  We sho
17d90 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20 61 62  uld always be ab
17da0 6c 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 72  le to.      ** r
17db0 65 61 63 71 75 69 72 65 20 74 68 65 20 72 65 61  eacquire the rea
17dc0 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20  d lock */.      
17dd0 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72  rc = winLogError
17de0 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e  (SQLITE_IOERR_UN
17df0 4c 4f 43 4b 2c 20 6f 73 47 65 74 4c 61 73 74 45  LOCK, osGetLastE
17e00 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20  rror(),.        
17e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
17e20 77 69 6e 55 6e 6c 6f 63 6b 22 2c 20 70 46 69 6c  winUnlock", pFil
17e30 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d  e->zPath);.    }
17e40 0a 20 20 7d 0a 20 20 69 66 28 20 74 79 70 65 3e  .  }.  if( type>
17e50 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29  =RESERVED_LOCK )
17e60 7b 0a 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 46  {.    winUnlockF
17e70 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 52  ile(&pFile->h, R
17e80 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 30 2c  ESERVED_BYTE, 0,
17e90 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66   1, 0);.  }.  if
17ea0 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c  ( locktype==NO_L
17eb0 4f 43 4b 20 26 26 20 74 79 70 65 3e 3d 53 48 41  OCK && type>=SHA
17ec0 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
17ed0 77 69 6e 55 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63  winUnlockReadLoc
17ee0 6b 28 70 46 69 6c 65 29 3b 0a 20 20 7d 0a 20 20  k(pFile);.  }.  
17ef0 69 66 28 20 74 79 70 65 3e 3d 50 45 4e 44 49 4e  if( type>=PENDIN
17f00 47 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 77 69  G_LOCK ){.    wi
17f10 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69  nUnlockFile(&pFi
17f20 6c 65 2d 3e 68 2c 20 50 45 4e 44 49 4e 47 5f 42  le->h, PENDING_B
17f30 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20  YTE, 0, 1, 0);. 
17f40 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b   }.  pFile->lock
17f50 74 79 70 65 20 3d 20 28 75 38 29 6c 6f 63 6b 74  type = (u8)lockt
17f60 79 70 65 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  ype;.  OSTRACE((
17f70 22 55 4e 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c  "UNLOCK file=%p,
17f80 20 6c 6f 63 6b 3d 25 64 2c 20 72 63 3d 25 73 5c   lock=%d, rc=%s\
17f90 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  n",.           p
17fa0 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e  File->h, pFile->
17fb0 6c 6f 63 6b 74 79 70 65 2c 20 73 71 6c 69 74 65  locktype, sqlite
17fc0 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a  3ErrName(rc)));.
17fd0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
17fe0 2f 2a 0a 2a 2a 20 49 66 20 2a 70 41 72 67 20 69  /*.** If *pArg i
17ff0 73 20 69 6e 69 74 69 74 69 61 6c 6c 79 20 6e 65  s inititially ne
18000 67 61 74 69 76 65 20 74 68 65 6e 20 74 68 69 73  gative then this
18010 20 69 73 20 61 20 71 75 65 72 79 2e 20 20 53 65   is a query.  Se
18020 74 20 2a 70 41 72 67 20 74 6f 0a 2a 2a 20 31 20  t *pArg to.** 1 
18030 6f 72 20 30 20 64 65 70 65 6e 64 69 6e 67 20 6f  or 0 depending o
18040 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  n whether or not
18050 20 62 69 74 20 6d 61 73 6b 20 6f 66 20 70 46 69   bit mask of pFi
18060 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 69 73  le->ctrlFlags is
18070 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a   set..**.** If *
18080 70 41 72 67 20 69 73 20 30 20 6f 72 20 31 2c 20  pArg is 0 or 1, 
18090 74 68 65 6e 20 63 6c 65 61 72 20 6f 72 20 73 65  then clear or se
180a0 74 20 74 68 65 20 6d 61 73 6b 20 62 69 74 20 6f  t the mask bit o
180b0 66 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61  f pFile->ctrlFla
180c0 67 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  gs..*/.static vo
180d0 69 64 20 77 69 6e 4d 6f 64 65 42 69 74 28 77 69  id winModeBit(wi
180e0 6e 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 75 6e  nFile *pFile, un
180f0 73 69 67 6e 65 64 20 63 68 61 72 20 6d 61 73 6b  signed char mask
18100 2c 20 69 6e 74 20 2a 70 41 72 67 29 7b 0a 20 20  , int *pArg){.  
18110 69 66 28 20 2a 70 41 72 67 3c 30 20 29 7b 0a 20  if( *pArg<0 ){. 
18120 20 20 20 2a 70 41 72 67 20 3d 20 28 70 46 69 6c     *pArg = (pFil
18130 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 6d  e->ctrlFlags & m
18140 61 73 6b 29 21 3d 30 3b 0a 20 20 7d 65 6c 73 65  ask)!=0;.  }else
18150 20 69 66 28 20 28 2a 70 41 72 67 29 3d 3d 30 20   if( (*pArg)==0 
18160 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74  ){.    pFile->ct
18170 72 6c 46 6c 61 67 73 20 26 3d 20 7e 6d 61 73 6b  rlFlags &= ~mask
18180 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
18190 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20  File->ctrlFlags 
181a0 7c 3d 20 6d 61 73 6b 3b 0a 20 20 7d 0a 7d 0a 0a  |= mask;.  }.}..
181b0 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
181c0 65 6e 63 65 73 20 74 6f 20 56 46 53 20 68 65 6c  ences to VFS hel
181d0 70 65 72 20 6d 65 74 68 6f 64 73 20 75 73 65 64  per methods used
181e0 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66   for temporary f
181f0 69 6c 65 73 20 2a 2f 0a 73 74 61 74 69 63 20 69  iles */.static i
18200 6e 74 20 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d  nt winGetTempnam
18210 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 2c  e(sqlite3_vfs *,
18220 20 63 68 61 72 20 2a 2a 29 3b 0a 73 74 61 74 69   char **);.stati
18230 63 20 69 6e 74 20 77 69 6e 49 73 44 69 72 28 63  c int winIsDir(c
18240 6f 6e 73 74 20 76 6f 69 64 20 2a 29 3b 0a 73 74  onst void *);.st
18250 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 49 73 44  atic BOOL winIsD
18260 72 69 76 65 4c 65 74 74 65 72 41 6e 64 43 6f 6c  riveLetterAndCol
18270 6f 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  on(const char *)
18280 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 74 72 6f 6c  ;../*.** Control
18290 20 61 6e 64 20 71 75 65 72 79 20 6f 66 20 74 68   and query of th
182a0 65 20 6f 70 65 6e 20 66 69 6c 65 20 68 61 6e 64  e open file hand
182b0 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
182c0 74 20 77 69 6e 46 69 6c 65 43 6f 6e 74 72 6f 6c  t winFileControl
182d0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
182e0 64 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20  d, int op, void 
182f0 2a 70 41 72 67 29 7b 0a 20 20 77 69 6e 46 69 6c  *pArg){.  winFil
18300 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46  e *pFile = (winF
18310 69 6c 65 2a 29 69 64 3b 0a 20 20 4f 53 54 52 41  ile*)id;.  OSTRA
18320 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d  CE(("FCNTL file=
18330 25 70 2c 20 6f 70 3d 25 64 2c 20 70 41 72 67 3d  %p, op=%d, pArg=
18340 25 70 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %p\n", pFile->h,
18350 20 6f 70 2c 20 70 41 72 67 29 29 3b 0a 20 20 73   op, pArg));.  s
18360 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20  witch( op ){.   
18370 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
18380 54 4c 5f 4c 4f 43 4b 53 54 41 54 45 3a 20 7b 0a  TL_LOCKSTATE: {.
18390 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72        *(int*)pAr
183a0 67 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  g = pFile->lockt
183b0 79 70 65 3b 0a 20 20 20 20 20 20 4f 53 54 52 41  ype;.      OSTRA
183c0 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d  CE(("FCNTL file=
183d0 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b  %p, rc=SQLITE_OK
183e0 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  \n", pFile->h));
183f0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
18400 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
18410 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4c     case SQLITE_L
18420 41 53 54 5f 45 52 52 4e 4f 3a 20 7b 0a 20 20 20  AST_ERRNO: {.   
18430 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d     *(int*)pArg =
18440 20 28 69 6e 74 29 70 46 69 6c 65 2d 3e 6c 61 73   (int)pFile->las
18450 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 4f 53  tErrno;.      OS
18460 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69  TRACE(("FCNTL fi
18470 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
18480 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  _OK\n", pFile->h
18490 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
184a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
184b0 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
184c0 45 5f 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49  E_FCNTL_CHUNK_SI
184d0 5a 45 3a 20 7b 0a 20 20 20 20 20 20 70 46 69 6c  ZE: {.      pFil
184e0 65 2d 3e 73 7a 43 68 75 6e 6b 20 3d 20 2a 28 69  e->szChunk = *(i
184f0 6e 74 20 2a 29 70 41 72 67 3b 0a 20 20 20 20 20  nt *)pArg;.     
18500 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c   OSTRACE(("FCNTL
18510 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c   file=%p, rc=SQL
18520 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65  ITE_OK\n", pFile
18530 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74  ->h));.      ret
18540 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
18550 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
18560 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f  LITE_FCNTL_SIZE_
18570 48 49 4e 54 3a 20 7b 0a 20 20 20 20 20 20 69 66  HINT: {.      if
18580 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b  ( pFile->szChunk
18590 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  >0 ){.        sq
185a0 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 6c 64 53  lite3_int64 oldS
185b0 7a 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  z;.        int r
185c0 63 20 3d 20 77 69 6e 46 69 6c 65 53 69 7a 65 28  c = winFileSize(
185d0 69 64 2c 20 26 6f 6c 64 53 7a 29 3b 0a 20 20 20  id, &oldSz);.   
185e0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
185f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
18600 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
18610 34 20 6e 65 77 53 7a 20 3d 20 2a 28 73 71 6c 69  4 newSz = *(sqli
18620 74 65 33 5f 69 6e 74 36 34 2a 29 70 41 72 67 3b  te3_int64*)pArg;
18630 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e  .          if( n
18640 65 77 53 7a 3e 6f 6c 64 53 7a 20 29 7b 0a 20 20  ewSz>oldSz ){.  
18650 20 20 20 20 20 20 20 20 20 20 53 69 6d 75 6c 61            Simula
18660 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28  teIOErrorBenign(
18670 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  1);.            
18680 72 63 20 3d 20 77 69 6e 54 72 75 6e 63 61 74 65  rc = winTruncate
18690 28 69 64 2c 20 6e 65 77 53 7a 29 3b 0a 20 20 20  (id, newSz);.   
186a0 20 20 20 20 20 20 20 20 20 53 69 6d 75 6c 61 74           Simulat
186b0 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30  eIOErrorBenign(0
186c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
186d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
186e0 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c   OSTRACE(("FCNTL
186f0 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c   file=%p, rc=%s\
18700 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 73 71  n", pFile->h, sq
18710 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29  lite3ErrName(rc)
18720 29 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ));.        retu
18730 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
18740 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46       OSTRACE(("F
18750 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63  CNTL file=%p, rc
18760 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70  =SQLITE_OK\n", p
18770 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20  File->h));.     
18780 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
18790 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
187a0 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50  e SQLITE_FCNTL_P
187b0 45 52 53 49 53 54 5f 57 41 4c 3a 20 7b 0a 20 20  ERSIST_WAL: {.  
187c0 20 20 20 20 77 69 6e 4d 6f 64 65 42 69 74 28 70      winModeBit(p
187d0 46 69 6c 65 2c 20 57 49 4e 46 49 4c 45 5f 50 45  File, WINFILE_PE
187e0 52 53 49 53 54 5f 57 41 4c 2c 20 28 69 6e 74 2a  RSIST_WAL, (int*
187f0 29 70 41 72 67 29 3b 0a 20 20 20 20 20 20 4f 53  )pArg);.      OS
18800 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69  TRACE(("FCNTL fi
18810 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
18820 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  _OK\n", pFile->h
18830 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
18840 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
18850 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
18860 45 5f 46 43 4e 54 4c 5f 50 4f 57 45 52 53 41 46  E_FCNTL_POWERSAF
18870 45 5f 4f 56 45 52 57 52 49 54 45 3a 20 7b 0a 20  E_OVERWRITE: {. 
18880 20 20 20 20 20 77 69 6e 4d 6f 64 65 42 69 74 28       winModeBit(
18890 70 46 69 6c 65 2c 20 57 49 4e 46 49 4c 45 5f 50  pFile, WINFILE_P
188a0 53 4f 57 2c 20 28 69 6e 74 2a 29 70 41 72 67 29  SOW, (int*)pArg)
188b0 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  ;.      OSTRACE(
188c0 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c  ("FCNTL file=%p,
188d0 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22   rc=SQLITE_OK\n"
188e0 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
188f0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
18900 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
18910 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
18920 4c 5f 56 46 53 4e 41 4d 45 3a 20 7b 0a 20 20 20  L_VFSNAME: {.   
18930 20 20 20 2a 28 63 68 61 72 2a 2a 29 70 41 72 67     *(char**)pArg
18940 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
18950 74 66 28 22 25 73 22 2c 20 70 46 69 6c 65 2d 3e  tf("%s", pFile->
18960 70 56 66 73 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pVfs->zName);.  
18970 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46 43      OSTRACE(("FC
18980 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  NTL file=%p, rc=
18990 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46  SQLITE_OK\n", pF
189a0 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20  ile->h));.      
189b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
189c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
189d0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 57 49   SQLITE_FCNTL_WI
189e0 4e 33 32 5f 41 56 5f 52 45 54 52 59 3a 20 7b 0a  N32_AV_RETRY: {.
189f0 20 20 20 20 20 20 69 6e 74 20 2a 61 20 3d 20 28        int *a = (
18a00 69 6e 74 2a 29 70 41 72 67 3b 0a 20 20 20 20 20  int*)pArg;.     
18a10 20 69 66 28 20 61 5b 30 5d 3e 30 20 29 7b 0a 20   if( a[0]>0 ){. 
18a20 20 20 20 20 20 20 20 77 69 6e 49 6f 65 72 72 52         winIoerrR
18a30 65 74 72 79 20 3d 20 61 5b 30 5d 3b 0a 20 20 20  etry = a[0];.   
18a40 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
18a50 20 20 61 5b 30 5d 20 3d 20 77 69 6e 49 6f 65 72    a[0] = winIoer
18a60 72 52 65 74 72 79 3b 0a 20 20 20 20 20 20 7d 0a  rRetry;.      }.
18a70 20 20 20 20 20 20 69 66 28 20 61 5b 31 5d 3e 30        if( a[1]>0
18a80 20 29 7b 0a 20 20 20 20 20 20 20 20 77 69 6e 49   ){.        winI
18a90 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79 20 3d  oerrRetryDelay =
18aa0 20 61 5b 31 5d 3b 0a 20 20 20 20 20 20 7d 65 6c   a[1];.      }el
18ab0 73 65 7b 0a 20 20 20 20 20 20 20 20 61 5b 31 5d  se{.        a[1]
18ac0 20 3d 20 77 69 6e 49 6f 65 72 72 52 65 74 72 79   = winIoerrRetry
18ad0 44 65 6c 61 79 3b 0a 20 20 20 20 20 20 7d 0a 20  Delay;.      }. 
18ae0 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46       OSTRACE(("F
18af0 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63  CNTL file=%p, rc
18b00 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70  =SQLITE_OK\n", p
18b10 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20  File->h));.     
18b20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
18b30 4b 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20  K;.    }.#ifdef 
18b40 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 20 20  SQLITE_TEST.    
18b50 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
18b60 4c 5f 57 49 4e 33 32 5f 53 45 54 5f 48 41 4e 44  L_WIN32_SET_HAND
18b70 4c 45 3a 20 7b 0a 20 20 20 20 20 20 4c 50 48 41  LE: {.      LPHA
18b80 4e 44 4c 45 20 70 68 46 69 6c 65 20 3d 20 28 4c  NDLE phFile = (L
18b90 50 48 41 4e 44 4c 45 29 70 41 72 67 3b 0a 20 20  PHANDLE)pArg;.  
18ba0 20 20 20 20 48 41 4e 44 4c 45 20 68 4f 6c 64 46      HANDLE hOldF
18bb0 69 6c 65 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a  ile = pFile->h;.
18bc0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 20 3d        pFile->h =
18bd0 20 2a 70 68 46 69 6c 65 3b 0a 20 20 20 20 20 20   *phFile;.      
18be0 2a 70 68 46 69 6c 65 20 3d 20 68 4f 6c 64 46 69  *phFile = hOldFi
18bf0 6c 65 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43  le;.      OSTRAC
18c00 45 28 28 22 46 43 4e 54 4c 20 6f 6c 64 46 69 6c  E(("FCNTL oldFil
18c10 65 3d 25 70 2c 20 6e 65 77 46 69 6c 65 3d 25 70  e=%p, newFile=%p
18c20 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e  , rc=SQLITE_OK\n
18c30 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
18c40 20 20 68 4f 6c 64 46 69 6c 65 2c 20 70 46 69 6c    hOldFile, pFil
18c50 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65  e->h));.      re
18c60 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
18c70 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
18c80 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
18c90 54 4c 5f 54 45 4d 50 46 49 4c 45 4e 41 4d 45 3a  TL_TEMPFILENAME:
18ca0 20 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a   {.      char *z
18cb0 54 46 69 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20  TFile = 0;.     
18cc0 20 69 6e 74 20 72 63 20 3d 20 77 69 6e 47 65 74   int rc = winGet
18cd0 54 65 6d 70 6e 61 6d 65 28 70 46 69 6c 65 2d 3e  Tempname(pFile->
18ce0 70 56 66 73 2c 20 26 7a 54 46 69 6c 65 29 3b 0a  pVfs, &zTFile);.
18cf0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
18d00 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
18d10 20 20 20 2a 28 63 68 61 72 2a 2a 29 70 41 72 67     *(char**)pArg
18d20 20 3d 20 7a 54 46 69 6c 65 3b 0a 20 20 20 20 20   = zTFile;.     
18d30 20 7d 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45   }.      OSTRACE
18d40 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70  (("FCNTL file=%p
18d50 2c 20 72 63 3d 25 73 5c 6e 22 2c 20 70 46 69 6c  , rc=%s\n", pFil
18d60 65 2d 3e 68 2c 20 73 71 6c 69 74 65 33 45 72 72  e->h, sqlite3Err
18d70 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 20 20  Name(rc)));.    
18d80 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
18d90 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41   }.#if SQLITE_MA
18da0 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
18db0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
18dc0 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 3a 20 7b  NTL_MMAP_SIZE: {
18dd0 0a 20 20 20 20 20 20 69 36 34 20 6e 65 77 4c 69  .      i64 newLi
18de0 6d 69 74 20 3d 20 2a 28 69 36 34 2a 29 70 41 72  mit = *(i64*)pAr
18df0 67 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20  g;.      int rc 
18e00 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
18e10 20 20 20 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e     if( newLimit>
18e20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
18e30 66 69 67 2e 6d 78 4d 6d 61 70 20 29 7b 0a 20 20  fig.mxMmap ){.  
18e40 20 20 20 20 20 20 6e 65 77 4c 69 6d 69 74 20 3d        newLimit =
18e50 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
18e60 6e 66 69 67 2e 6d 78 4d 6d 61 70 3b 0a 20 20 20  nfig.mxMmap;.   
18e70 20 20 20 7d 0a 20 20 20 20 20 20 2a 28 69 36 34     }.      *(i64
18e80 2a 29 70 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e  *)pArg = pFile->
18e90 6d 6d 61 70 53 69 7a 65 4d 61 78 3b 0a 20 20 20  mmapSizeMax;.   
18ea0 20 20 20 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e     if( newLimit>
18eb0 3d 30 20 26 26 20 6e 65 77 4c 69 6d 69 74 21 3d  =0 && newLimit!=
18ec0 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d  pFile->mmapSizeM
18ed0 61 78 20 26 26 20 70 46 69 6c 65 2d 3e 6e 46 65  ax && pFile->nFe
18ee0 74 63 68 4f 75 74 3d 3d 30 20 29 7b 0a 20 20 20  tchOut==0 ){.   
18ef0 20 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70       pFile->mmap
18f00 53 69 7a 65 4d 61 78 20 3d 20 6e 65 77 4c 69 6d  SizeMax = newLim
18f10 69 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  it;.        if( 
18f20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 3e  pFile->mmapSize>
18f30 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77  0 ){.          w
18f40 69 6e 55 6e 6d 61 70 66 69 6c 65 28 70 46 69 6c  inUnmapfile(pFil
18f50 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  e);.          rc
18f60 20 3d 20 77 69 6e 4d 61 70 66 69 6c 65 28 70 46   = winMapfile(pF
18f70 69 6c 65 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20  ile, -1);.      
18f80 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
18f90 20 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54    OSTRACE(("FCNT
18fa0 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73  L file=%p, rc=%s
18fb0 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 73  \n", pFile->h, s
18fc0 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63  qlite3ErrName(rc
18fd0 29 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  )));.      retur
18fe0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  n rc;.    }.#end
18ff0 69 66 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45  if.  }.  OSTRACE
19000 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70  (("FCNTL file=%p
19010 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 54 46  , rc=SQLITE_NOTF
19020 4f 55 4e 44 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  OUND\n", pFile->
19030 68 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  h));.  return SQ
19040 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 7d  LITE_NOTFOUND;.}
19050 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
19060 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69  he sector size i
19070 6e 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 75  n bytes of the u
19080 6e 64 65 72 6c 79 69 6e 67 20 62 6c 6f 63 6b 20  nderlying block 
19090 64 65 76 69 63 65 20 66 6f 72 0a 2a 2a 20 74 68  device for.** th
190a0 65 20 73 70 65 63 69 66 69 65 64 20 66 69 6c 65  e specified file
190b0 2e 20 54 68 69 73 20 69 73 20 61 6c 6d 6f 73 74  . This is almost
190c0 20 61 6c 77 61 79 73 20 35 31 32 20 62 79 74 65   always 512 byte
190d0 73 2c 20 62 75 74 20 6d 61 79 20 62 65 0a 2a 2a  s, but may be.**
190e0 20 6c 61 72 67 65 72 20 66 6f 72 20 73 6f 6d 65   larger for some
190f0 20 64 65 76 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20   devices..**.** 
19100 53 51 4c 69 74 65 20 63 6f 64 65 20 61 73 73 75  SQLite code assu
19110 6d 65 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f  mes this functio
19120 6e 20 63 61 6e 6e 6f 74 20 66 61 69 6c 2e 20 49  n cannot fail. I
19130 74 20 61 6c 73 6f 20 61 73 73 75 6d 65 73 20 74  t also assumes t
19140 68 61 74 0a 2a 2a 20 69 66 20 74 77 6f 20 66 69  hat.** if two fi
19150 6c 65 73 20 61 72 65 20 63 72 65 61 74 65 64 20  les are created 
19160 69 6e 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65  in the same file
19170 2d 73 79 73 74 65 6d 20 64 69 72 65 63 74 6f 72  -system director
19180 79 20 28 69 2e 65 2e 0a 2a 2a 20 61 20 64 61 74  y (i.e..** a dat
19190 61 62 61 73 65 20 61 6e 64 20 69 74 73 20 6a 6f  abase and its jo
191a0 75 72 6e 61 6c 20 66 69 6c 65 29 20 74 68 61 74  urnal file) that
191b0 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65   the sector size
191c0 20 77 69 6c 6c 20 62 65 20 74 68 65 0a 2a 2a 20   will be the.** 
191d0 73 61 6d 65 20 66 6f 72 20 62 6f 74 68 2e 0a 2a  same for both..*
191e0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
191f0 53 65 63 74 6f 72 53 69 7a 65 28 73 71 6c 69 74  SectorSize(sqlit
19200 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20  e3_file *id){.  
19210 28 76 6f 69 64 29 69 64 3b 0a 20 20 72 65 74 75  (void)id;.  retu
19220 72 6e 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  rn SQLITE_DEFAUL
19230 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 7d  T_SECTOR_SIZE;.}
19240 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
19250 20 76 65 63 74 6f 72 20 6f 66 20 64 65 76 69 63   vector of devic
19260 65 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63  e characteristic
19270 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
19280 20 77 69 6e 44 65 76 69 63 65 43 68 61 72 61 63   winDeviceCharac
19290 74 65 72 69 73 74 69 63 73 28 73 71 6c 69 74 65  teristics(sqlite
192a0 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 77  3_file *id){.  w
192b0 69 6e 46 69 6c 65 20 2a 70 20 3d 20 28 77 69 6e  inFile *p = (win
192c0 46 69 6c 65 2a 29 69 64 3b 0a 20 20 72 65 74 75  File*)id;.  retu
192d0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  rn SQLITE_IOCAP_
192e0 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e  UNDELETABLE_WHEN
192f0 5f 4f 50 45 4e 20 7c 0a 20 20 20 20 20 20 20 20  _OPEN |.        
19300 20 28 28 70 2d 3e 63 74 72 6c 46 6c 61 67 73 20   ((p->ctrlFlags 
19310 26 20 57 49 4e 46 49 4c 45 5f 50 53 4f 57 29 3f  & WINFILE_PSOW)?
19320 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57  SQLITE_IOCAP_POW
19330 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45  ERSAFE_OVERWRITE
19340 3a 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 69  :0);.}../*.** Wi
19350 6e 64 6f 77 73 20 77 69 6c 6c 20 6f 6e 6c 79 20  ndows will only 
19360 6c 65 74 20 79 6f 75 20 63 72 65 61 74 65 20 66  let you create f
19370 69 6c 65 20 76 69 65 77 20 6d 61 70 70 69 6e 67  ile view mapping
19380 73 0a 2a 2a 20 6f 6e 20 61 6c 6c 6f 63 61 74 69  s.** on allocati
19390 6f 6e 20 73 69 7a 65 20 67 72 61 6e 75 6c 61 72  on size granular
193a0 69 74 79 20 62 6f 75 6e 64 61 72 69 65 73 2e 0a  ity boundaries..
193b0 2a 2a 20 44 75 72 69 6e 67 20 73 71 6c 69 74 65  ** During sqlite
193c0 33 5f 6f 73 5f 69 6e 69 74 28 29 20 77 65 20 64  3_os_init() we d
193d0 6f 20 61 20 47 65 74 53 79 73 74 65 6d 49 6e 66  o a GetSystemInf
193e0 6f 28 29 0a 2a 2a 20 74 6f 20 67 65 74 20 74 68  o().** to get th
193f0 65 20 67 72 61 6e 75 6c 61 72 69 74 79 20 73 69  e granularity si
19400 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 59  ze..*/.static SY
19410 53 54 45 4d 5f 49 4e 46 4f 20 77 69 6e 53 79 73  STEM_INFO winSys
19420 49 6e 66 6f 3b 0a 0a 23 69 66 6e 64 65 66 20 53  Info;..#ifndef S
19430 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 0a  QLITE_OMIT_WAL..
19440 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e  /*.** Helper fun
19450 63 74 69 6f 6e 73 20 74 6f 20 6f 62 74 61 69 6e  ctions to obtain
19460 20 61 6e 64 20 72 65 6c 69 6e 71 75 69 73 68 20   and relinquish 
19470 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78  the global mutex
19480 2e 20 54 68 65 0a 2a 2a 20 67 6c 6f 62 61 6c 20  . The.** global 
19490 6d 75 74 65 78 20 69 73 20 75 73 65 64 20 74 6f  mutex is used to
194a0 20 70 72 6f 74 65 63 74 20 74 68 65 20 77 69 6e   protect the win
194b0 4c 6f 63 6b 49 6e 66 6f 20 6f 62 6a 65 63 74 73  LockInfo objects
194c0 20 75 73 65 64 20 62 79 0a 2a 2a 20 74 68 69 73   used by.** this
194d0 20 66 69 6c 65 2c 20 61 6c 6c 20 6f 66 20 77 68   file, all of wh
194e0 69 63 68 20 6d 61 79 20 62 65 20 73 68 61 72 65  ich may be share
194f0 64 20 62 79 20 6d 75 6c 74 69 70 6c 65 20 74 68  d by multiple th
19500 72 65 61 64 73 2e 0a 2a 2a 0a 2a 2a 20 46 75 6e  reads..**.** Fun
19510 63 74 69 6f 6e 20 77 69 6e 53 68 6d 4d 75 74 65  ction winShmMute
19520 78 48 65 6c 64 28 29 20 69 73 20 75 73 65 64 20  xHeld() is used 
19530 74 6f 20 61 73 73 65 72 74 28 29 20 74 68 61 74  to assert() that
19540 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65   the global mute
19550 78 0a 2a 2a 20 69 73 20 68 65 6c 64 20 77 68 65  x.** is held whe
19560 6e 20 72 65 71 75 69 72 65 64 2e 20 54 68 69 73  n required. This
19570 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c   function is onl
19580 79 20 75 73 65 64 20 61 73 20 70 61 72 74 20 6f  y used as part o
19590 66 20 61 73 73 65 72 74 28 29 0a 2a 2a 20 73 74  f assert().** st
195a0 61 74 65 6d 65 6e 74 73 2e 20 65 2e 67 2e 0a 2a  atements. e.g..*
195b0 2a 0a 2a 2a 20 20 20 77 69 6e 53 68 6d 45 6e 74  *.**   winShmEnt
195c0 65 72 4d 75 74 65 78 28 29 0a 2a 2a 20 20 20 20  erMutex().**    
195d0 20 61 73 73 65 72 74 28 20 77 69 6e 53 68 6d 4d   assert( winShmM
195e0 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 2a 2a  utexHeld() );.**
195f0 20 20 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75     winShmLeaveMu
19600 74 65 78 28 29 0a 2a 2f 0a 73 74 61 74 69 63 20  tex().*/.static 
19610 76 6f 69 64 20 77 69 6e 53 68 6d 45 6e 74 65 72  void winShmEnter
19620 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a 20 20 73  Mutex(void){.  s
19630 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
19640 65 72 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41  er(sqlite3MutexA
19650 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
19660 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29  X_STATIC_MASTER)
19670 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  );.}.static void
19680 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65   winShmLeaveMute
19690 78 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74  x(void){.  sqlit
196a0 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73  e3_mutex_leave(s
196b0 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
196c0 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
196d0 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d  ATIC_MASTER));.}
196e0 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
196f0 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 68  static int winSh
19700 6d 4d 75 74 65 78 48 65 6c 64 28 76 6f 69 64 29  mMutexHeld(void)
19710 20 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69   {.  return sqli
19720 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 73  te3_mutex_held(s
19730 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
19740 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
19750 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d  ATIC_MASTER));.}
19760 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f  .#endif../*.** O
19770 62 6a 65 63 74 20 75 73 65 64 20 74 6f 20 72 65  bject used to re
19780 70 72 65 73 65 6e 74 20 61 20 73 69 6e 67 6c 65  present a single
19790 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 6e 64   file opened and
197a0 20 6d 6d 61 70 70 65 64 20 74 6f 20 70 72 6f 76   mmapped to prov
197b0 69 64 65 0a 2a 2a 20 73 68 61 72 65 64 20 6d 65  ide.** shared me
197c0 6d 6f 72 79 2e 20 20 57 68 65 6e 20 6d 75 6c 74  mory.  When mult
197d0 69 70 6c 65 20 74 68 72 65 61 64 73 20 61 6c 6c  iple threads all
197e0 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 73   reference the s
197f0 61 6d 65 0a 2a 2a 20 6c 6f 67 2d 73 75 6d 6d 61  ame.** log-summa
19800 72 79 2c 20 65 61 63 68 20 74 68 72 65 61 64 20  ry, each thread 
19810 68 61 73 20 69 74 73 20 6f 77 6e 20 77 69 6e 46  has its own winF
19820 69 6c 65 20 6f 62 6a 65 63 74 2c 20 62 75 74 20  ile object, but 
19830 74 68 65 79 20 61 6c 6c 0a 2a 2a 20 70 6f 69 6e  they all.** poin
19840 74 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 69 6e  t to a single in
19850 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f  stance of this o
19860 62 6a 65 63 74 2e 20 20 49 6e 20 6f 74 68 65 72  bject.  In other
19870 20 77 6f 72 64 73 2c 20 65 61 63 68 0a 2a 2a 20   words, each.** 
19880 6c 6f 67 2d 73 75 6d 6d 61 72 79 20 69 73 20 6f  log-summary is o
19890 70 65 6e 65 64 20 6f 6e 6c 79 20 6f 6e 63 65 20  pened only once 
198a0 70 65 72 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a  per process..**.
198b0 2a 2a 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65  ** winShmMutexHe
198c0 6c 64 28 29 20 6d 75 73 74 20 62 65 20 74 72 75  ld() must be tru
198d0 65 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20  e when creating 
198e0 6f 72 20 64 65 73 74 72 6f 79 69 6e 67 0a 2a 2a  or destroying.**
198f0 20 74 68 69 73 20 6f 62 6a 65 63 74 20 6f 72 20   this object or 
19900 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 6f 72  while reading or
19910 20 77 72 69 74 69 6e 67 20 74 68 65 20 66 6f 6c   writing the fol
19920 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 3a 0a 2a  lowing fields:.*
19930 2a 0a 2a 2a 20 20 20 20 20 20 6e 52 65 66 0a 2a  *.**      nRef.*
19940 2a 20 20 20 20 20 20 70 4e 65 78 74 0a 2a 2a 0a  *      pNext.**.
19950 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
19960 20 66 69 65 6c 64 73 20 61 72 65 20 72 65 61 64   fields are read
19970 2d 6f 6e 6c 79 20 61 66 74 65 72 20 74 68 65 20  -only after the 
19980 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61 74 65  object is create
19990 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 66 69  d:.**.**      fi
199a0 64 0a 2a 2a 20 20 20 20 20 20 7a 46 69 6c 65 6e  d.**      zFilen
199b0 61 6d 65 0a 2a 2a 0a 2a 2a 20 45 69 74 68 65 72  ame.**.** Either
199c0 20 77 69 6e 53 68 6d 4e 6f 64 65 2e 6d 75 74 65   winShmNode.mute
199d0 78 20 6d 75 73 74 20 62 65 20 68 65 6c 64 20 6f  x must be held o
199e0 72 20 77 69 6e 53 68 6d 4e 6f 64 65 2e 6e 52 65  r winShmNode.nRe
199f0 66 3d 3d 30 20 61 6e 64 0a 2a 2a 20 77 69 6e 53  f==0 and.** winS
19a00 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 69 73  hmMutexHeld() is
19a10 20 74 72 75 65 20 77 68 65 6e 20 72 65 61 64 69   true when readi
19a20 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 61 6e  ng or writing an
19a30 79 20 6f 74 68 65 72 20 66 69 65 6c 64 0a 2a 2a  y other field.**
19a40 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75   in this structu
19a50 72 65 2e 0a 2a 2a 0a 2a 2f 0a 73 74 72 75 63 74  re..**.*/.struct
19a60 20 77 69 6e 53 68 6d 4e 6f 64 65 20 7b 0a 20 20   winShmNode {.  
19a70 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d  sqlite3_mutex *m
19a80 75 74 65 78 3b 20 20 20 20 20 20 2f 2a 20 4d 75  utex;      /* Mu
19a90 74 65 78 20 74 6f 20 61 63 63 65 73 73 20 74 68  tex to access th
19aa0 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63  is object */.  c
19ab0 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20  har *zFilename; 
19ac0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
19ad0 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 2a 2f  e of the file */
19ae0 0a 20 20 77 69 6e 46 69 6c 65 20 68 46 69 6c 65  .  winFile hFile
19af0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
19b00 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 66 72 6f   File handle fro
19b10 6d 20 77 69 6e 4f 70 65 6e 20 2a 2f 0a 0a 20 20  m winOpen */..  
19b20 69 6e 74 20 73 7a 52 65 67 69 6f 6e 3b 20 20 20  int szRegion;   
19b30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
19b40 7a 65 20 6f 66 20 73 68 61 72 65 64 2d 6d 65 6d  ze of shared-mem
19b50 6f 72 79 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20  ory regions */. 
19b60 20 69 6e 74 20 6e 52 65 67 69 6f 6e 3b 20 20 20   int nRegion;   
19b70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
19b80 69 7a 65 20 6f 66 20 61 72 72 61 79 20 61 70 52  ize of array apR
19b90 65 67 69 6f 6e 20 2a 2f 0a 20 20 73 74 72 75 63  egion */.  struc
19ba0 74 20 53 68 6d 52 65 67 69 6f 6e 20 7b 0a 20 20  t ShmRegion {.  
19bb0 20 20 48 41 4e 44 4c 45 20 68 4d 61 70 3b 20 20    HANDLE hMap;  
19bc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
19bd0 6c 65 20 68 61 6e 64 6c 65 20 66 72 6f 6d 20 43  le handle from C
19be0 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67  reateFileMapping
19bf0 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 4d   */.    void *pM
19c00 61 70 3b 0a 20 20 7d 20 2a 61 52 65 67 69 6f 6e  ap;.  } *aRegion
19c10 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72  ;.  DWORD lastEr
19c20 72 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f  rno;           /
19c30 2a 20 54 68 65 20 57 69 6e 64 6f 77 73 20 65 72  * The Windows er
19c40 72 6e 6f 20 66 72 6f 6d 20 74 68 65 20 6c 61 73  rno from the las
19c50 74 20 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a 0a  t I/O error */..
19c60 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20    int nRef;     
19c70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19c80 4e 75 6d 62 65 72 20 6f 66 20 77 69 6e 53 68 6d  Number of winShm
19c90 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e   objects pointin
19ca0 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a 20 20 77  g to this */.  w
19cb0 69 6e 53 68 6d 20 2a 70 46 69 72 73 74 3b 20 20  inShm *pFirst;  
19cc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
19cd0 20 77 69 6e 53 68 6d 20 6f 62 6a 65 63 74 73 20   winShm objects 
19ce0 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 69 73  pointing to this
19cf0 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65   */.  winShmNode
19d00 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20   *pNext;        
19d10 20 2f 2a 20 4e 65 78 74 20 69 6e 20 6c 69 73 74   /* Next in list
19d20 20 6f 66 20 61 6c 6c 20 77 69 6e 53 68 6d 4e 6f   of all winShmNo
19d30 64 65 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 23 69  de objects */.#i
19d40 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
19d50 47 0a 20 20 75 38 20 6e 65 78 74 53 68 6d 49 64  G.  u8 nextShmId
19d60 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
19d70 2a 20 4e 65 78 74 20 61 76 61 69 6c 61 62 6c 65  * Next available
19d80 20 77 69 6e 53 68 6d 2e 69 64 20 76 61 6c 75 65   winShm.id value
19d90 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f   */.#endif.};../
19da0 2a 0a 2a 2a 20 41 20 67 6c 6f 62 61 6c 20 61 72  *.** A global ar
19db0 72 61 79 20 6f 66 20 61 6c 6c 20 77 69 6e 53 68  ray of all winSh
19dc0 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 73 2e 0a 2a  mNode objects..*
19dd0 2a 0a 2a 2a 20 54 68 65 20 77 69 6e 53 68 6d 4d  *.** The winShmM
19de0 75 74 65 78 48 65 6c 64 28 29 20 6d 75 73 74 20  utexHeld() must 
19df0 62 65 20 74 72 75 65 20 77 68 69 6c 65 20 72 65  be true while re
19e00 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ading or writing
19e10 20 74 68 69 73 20 6c 69 73 74 2e 0a 2a 2f 0a 73   this list..*/.s
19e20 74 61 74 69 63 20 77 69 6e 53 68 6d 4e 6f 64 65  tatic winShmNode
19e30 20 2a 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74   *winShmNodeList
19e40 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 53 74 72   = 0;../*.** Str
19e50 75 63 74 75 72 65 20 75 73 65 64 20 69 6e 74 65  ucture used inte
19e60 72 6e 61 6c 6c 79 20 62 79 20 74 68 69 73 20 56  rnally by this V
19e70 46 53 20 74 6f 20 72 65 63 6f 72 64 20 74 68 65  FS to record the
19e80 20 73 74 61 74 65 20 6f 66 20 61 6e 0a 2a 2a 20   state of an.** 
19e90 6f 70 65 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f  open shared memo
19ea0 72 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a  ry connection..*
19eb0 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
19ec0 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20 69 6e  ng fields are in
19ed0 69 74 69 61 6c 69 7a 65 64 20 77 68 65 6e 20 74  itialized when t
19ee0 68 69 73 20 6f 62 6a 65 63 74 20 69 73 20 63 72  his object is cr
19ef0 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20 61 72 65  eated and.** are
19f00 20 72 65 61 64 2d 6f 6e 6c 79 20 74 68 65 72 65   read-only there
19f10 61 66 74 65 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  after:.**.**    
19f20 77 69 6e 53 68 6d 2e 70 53 68 6d 4e 6f 64 65 0a  winShm.pShmNode.
19f30 2a 2a 20 20 20 20 77 69 6e 53 68 6d 2e 69 64 0a  **    winShm.id.
19f40 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 74 68 65 72 20  **.** All other 
19f50 66 69 65 6c 64 73 20 61 72 65 20 72 65 61 64 2f  fields are read/
19f60 77 72 69 74 65 2e 20 20 54 68 65 20 77 69 6e 53  write.  The winS
19f70 68 6d 2e 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  hm.pShmNode->mut
19f80 65 78 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a  ex must be held.
19f90 2a 2a 20 77 68 69 6c 65 20 61 63 63 65 73 73 69  ** while accessi
19fa0 6e 67 20 61 6e 79 20 72 65 61 64 2f 77 72 69 74  ng any read/writ
19fb0 65 20 66 69 65 6c 64 73 2e 0a 2a 2f 0a 73 74 72  e fields..*/.str
19fc0 75 63 74 20 77 69 6e 53 68 6d 20 7b 0a 20 20 77  uct winShm {.  w
19fd0 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e  inShmNode *pShmN
19fe0 6f 64 65 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  ode;      /* The
19ff0 20 75 6e 64 65 72 6c 79 69 6e 67 20 77 69 6e 53   underlying winS
1a000 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 2a 2f  hmNode object */
1a010 0a 20 20 77 69 6e 53 68 6d 20 2a 70 4e 65 78 74  .  winShm *pNext
1a020 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1a030 20 4e 65 78 74 20 77 69 6e 53 68 6d 20 77 69 74   Next winShm wit
1a040 68 20 74 68 65 20 73 61 6d 65 20 77 69 6e 53 68  h the same winSh
1a050 6d 4e 6f 64 65 20 2a 2f 0a 20 20 75 38 20 68 61  mNode */.  u8 ha
1a060 73 4d 75 74 65 78 3b 20 20 20 20 20 20 20 20 20  sMutex;         
1a070 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
1a080 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 77 69 6e   holding the win
1a090 53 68 6d 4e 6f 64 65 20 6d 75 74 65 78 20 2a 2f  ShmNode mutex */
1a0a0 0a 20 20 75 31 36 20 73 68 61 72 65 64 4d 61 73  .  u16 sharedMas
1a0b0 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  k;            /*
1a0c0 20 4d 61 73 6b 20 6f 66 20 73 68 61 72 65 64 20   Mask of shared 
1a0d0 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20  locks held */.  
1a0e0 75 31 36 20 65 78 63 6c 4d 61 73 6b 3b 20 20 20  u16 exclMask;   
1a0f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
1a100 73 6b 20 6f 66 20 65 78 63 6c 75 73 69 76 65 20  sk of exclusive 
1a110 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 23 69  locks held */.#i
1a120 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
1a130 47 0a 20 20 75 38 20 69 64 3b 20 20 20 20 20 20  G.  u8 id;      
1a140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a150 2a 20 49 64 20 6f 66 20 74 68 69 73 20 63 6f 6e  * Id of this con
1a160 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 69 74 73  nection with its
1a170 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 23   winShmNode */.#
1a180 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  endif.};../*.** 
1a190 43 6f 6e 73 74 61 6e 74 73 20 75 73 65 64 20 66  Constants used f
1a1a0 6f 72 20 6c 6f 63 6b 69 6e 67 0a 2a 2f 0a 23 64  or locking.*/.#d
1a1b0 65 66 69 6e 65 20 57 49 4e 5f 53 48 4d 5f 42 41  efine WIN_SHM_BA
1a1c0 53 45 20 20 20 28 28 32 32 2b 53 51 4c 49 54 45  SE   ((22+SQLITE
1a1d0 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 2a 34 29 20 20  _SHM_NLOCK)*4)  
1a1e0 20 20 20 20 20 20 2f 2a 20 66 69 72 73 74 20 6c        /* first l
1a1f0 6f 63 6b 20 62 79 74 65 20 2a 2f 0a 23 64 65 66  ock byte */.#def
1a200 69 6e 65 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 20  ine WIN_SHM_DMS 
1a210 20 20 20 28 57 49 4e 5f 53 48 4d 5f 42 41 53 45     (WIN_SHM_BASE
1a220 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43  +SQLITE_SHM_NLOC
1a230 4b 29 20 20 2f 2a 20 64 65 61 64 6d 61 6e 20 73  K)  /* deadman s
1a240 77 69 74 63 68 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  witch */../*.** 
1a250 41 70 70 6c 79 20 61 64 76 69 73 6f 72 79 20 6c  Apply advisory l
1a260 6f 63 6b 73 20 66 6f 72 20 61 6c 6c 20 6e 20 62  ocks for all n b
1a270 79 74 65 73 20 62 65 67 69 6e 6e 69 6e 67 20 61  ytes beginning a
1a280 74 20 6f 66 73 74 2e 0a 2a 2f 0a 23 64 65 66 69  t ofst..*/.#defi
1a290 6e 65 20 5f 53 48 4d 5f 55 4e 4c 43 4b 20 20 31  ne _SHM_UNLCK  1
1a2a0 0a 23 64 65 66 69 6e 65 20 5f 53 48 4d 5f 52 44  .#define _SHM_RD
1a2b0 4c 43 4b 20 20 32 0a 23 64 65 66 69 6e 65 20 5f  LCK  2.#define _
1a2c0 53 48 4d 5f 57 52 4c 43 4b 20 20 33 0a 73 74 61  SHM_WRLCK  3.sta
1a2d0 74 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 53 79  tic int winShmSy
1a2e0 73 74 65 6d 4c 6f 63 6b 28 0a 20 20 77 69 6e 53  stemLock(.  winS
1a2f0 68 6d 4e 6f 64 65 20 2a 70 46 69 6c 65 2c 20 20  hmNode *pFile,  
1a300 20 20 2f 2a 20 41 70 70 6c 79 20 6c 6f 63 6b 73    /* Apply locks
1a310 20 74 6f 20 74 68 69 73 20 6f 70 65 6e 20 73 68   to this open sh
1a320 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d  ared-memory segm
1a330 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 6f 63  ent */.  int loc
1a340 6b 54 79 70 65 2c 20 20 20 20 20 20 20 20 20 2f  kType,         /
1a350 2a 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20 5f 53  * _SHM_UNLCK, _S
1a360 48 4d 5f 52 44 4c 43 4b 2c 20 6f 72 20 5f 53 48  HM_RDLCK, or _SH
1a370 4d 5f 57 52 4c 43 4b 20 2a 2f 0a 20 20 69 6e 74  M_WRLCK */.  int
1a380 20 6f 66 73 74 2c 20 20 20 20 20 20 20 20 20 20   ofst,          
1a390 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
1a3a0 66 69 72 73 74 20 62 79 74 65 20 74 6f 20 62 65  first byte to be
1a3b0 20 6c 6f 63 6b 65 64 2f 75 6e 6c 6f 63 6b 65 64   locked/unlocked
1a3c0 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 20   */.  int nByte 
1a3d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1a3e0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
1a3f0 6f 20 6c 6f 63 6b 20 6f 72 20 75 6e 6c 6f 63 6b  o lock or unlock
1a400 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
1a410 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
1a420 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66 6f  * Result code fo
1a430 72 6d 20 4c 6f 63 6b 2f 55 6e 6c 6f 63 6b 46 69  rm Lock/UnlockFi
1a440 6c 65 45 78 28 29 20 2a 2f 0a 0a 20 20 2f 2a 20  leEx() */..  /* 
1a450 41 63 63 65 73 73 20 74 6f 20 74 68 65 20 77 69  Access to the wi
1a460 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20  nShmNode object 
1a470 69 73 20 73 65 72 69 61 6c 69 7a 65 64 20 62 79  is serialized by
1a480 20 74 68 65 20 63 61 6c 6c 65 72 20 2a 2f 0a 20   the caller */. 
1a490 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1a4a0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 46 69 6c  _mutex_held(pFil
1a4b0 65 2d 3e 6d 75 74 65 78 29 20 7c 7c 20 70 46 69  e->mutex) || pFi
1a4c0 6c 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a  le->nRef==0 );..
1a4d0 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d    OSTRACE(("SHM-
1a4e0 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6c 6f  LOCK file=%p, lo
1a4f0 63 6b 3d 25 64 2c 20 6f 66 66 73 65 74 3d 25 64  ck=%d, offset=%d
1a500 2c 20 73 69 7a 65 3d 25 64 5c 6e 22 2c 0a 20 20  , size=%d\n",.  
1a510 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
1a520 68 46 69 6c 65 2e 68 2c 20 6c 6f 63 6b 54 79 70  hFile.h, lockTyp
1a530 65 2c 20 6f 66 73 74 2c 20 6e 42 79 74 65 29 29  e, ofst, nByte))
1a540 3b 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73 65 2f  ;..  /* Release/
1a550 41 63 71 75 69 72 65 20 74 68 65 20 73 79 73 74  Acquire the syst
1a560 65 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b 20 2a 2f  em-level lock */
1a570 0a 20 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d  .  if( lockType=
1a580 3d 5f 53 48 4d 5f 55 4e 4c 43 4b 20 29 7b 0a 20  =_SHM_UNLCK ){. 
1a590 20 20 20 72 63 20 3d 20 77 69 6e 55 6e 6c 6f 63     rc = winUnloc
1a5a0 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 46  kFile(&pFile->hF
1a5b0 69 6c 65 2e 68 2c 20 6f 66 73 74 2c 20 30 2c 20  ile.h, ofst, 0, 
1a5c0 6e 42 79 74 65 2c 20 30 29 3b 0a 20 20 7d 65 6c  nByte, 0);.  }el
1a5d0 73 65 7b 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69  se{.    /* Initi
1a5e0 61 6c 69 7a 65 20 74 68 65 20 6c 6f 63 6b 69 6e  alize the lockin
1a5f0 67 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a  g parameters */.
1a600 20 20 20 20 44 57 4f 52 44 20 64 77 46 6c 61 67      DWORD dwFlag
1a610 73 20 3d 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49  s = LOCKFILE_FAI
1a620 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 3b 0a 20  L_IMMEDIATELY;. 
1a630 20 20 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 20     if( lockType 
1a640 3d 3d 20 5f 53 48 4d 5f 57 52 4c 43 4b 20 29 20  == _SHM_WRLCK ) 
1a650 64 77 46 6c 61 67 73 20 7c 3d 20 4c 4f 43 4b 46  dwFlags |= LOCKF
1a660 49 4c 45 5f 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ILE_EXCLUSIVE_LO
1a670 43 4b 3b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e  CK;.    rc = win
1a680 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d  LockFile(&pFile-
1a690 3e 68 46 69 6c 65 2e 68 2c 20 64 77 46 6c 61 67  >hFile.h, dwFlag
1a6a0 73 2c 20 6f 66 73 74 2c 20 30 2c 20 6e 42 79 74  s, ofst, 0, nByt
1a6b0 65 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  e, 0);.  }..  if
1a6c0 28 20 72 63 21 3d 20 30 20 29 7b 0a 20 20 20 20  ( rc!= 0 ){.    
1a6d0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1a6e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46 69    }else{.    pFi
1a6f0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
1a700 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
1a710 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  );.    rc = SQLI
1a720 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a 20 20  TE_BUSY;.  }..  
1a730 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f  OSTRACE(("SHM-LO
1a740 43 4b 20 66 69 6c 65 3d 25 70 2c 20 66 75 6e 63  CK file=%p, func
1a750 3d 25 73 2c 20 65 72 72 6e 6f 3d 25 6c 75 2c 20  =%s, errno=%lu, 
1a760 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  rc=%s\n",.      
1a770 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 46 69 6c       pFile->hFil
1a780 65 2e 68 2c 20 28 6c 6f 63 6b 54 79 70 65 20 3d  e.h, (lockType =
1a790 3d 20 5f 53 48 4d 5f 55 4e 4c 43 4b 29 20 3f 20  = _SHM_UNLCK) ? 
1a7a0 22 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 22 20  "winUnlockFile" 
1a7b0 3a 0a 20 20 20 20 20 20 20 20 20 20 20 22 77 69  :.           "wi
1a7c0 6e 4c 6f 63 6b 46 69 6c 65 22 2c 20 70 46 69 6c  nLockFile", pFil
1a7d0 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 20 73 71  e->lastErrno, sq
1a7e0 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29  lite3ErrName(rc)
1a7f0 29 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63  ));..  return rc
1a800 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20  ;.}../* Forward 
1a810 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 56 46  references to VF
1a820 53 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 73 74 61  S methods */.sta
1a830 74 69 63 20 69 6e 74 20 77 69 6e 4f 70 65 6e 28  tic int winOpen(
1a840 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c 63 6f 6e  sqlite3_vfs*,con
1a850 73 74 20 63 68 61 72 2a 2c 73 71 6c 69 74 65 33  st char*,sqlite3
1a860 5f 66 69 6c 65 2a 2c 69 6e 74 2c 69 6e 74 2a 29  _file*,int,int*)
1a870 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  ;.static int win
1a880 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 5f 76  Delete(sqlite3_v
1a890 66 73 20 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a  fs *,const char*
1a8a0 2c 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50 75  ,int);../*.** Pu
1a8b0 72 67 65 20 74 68 65 20 77 69 6e 53 68 6d 4e 6f  rge the winShmNo
1a8c0 64 65 4c 69 73 74 20 6c 69 73 74 20 6f 66 20 61  deList list of a
1a8d0 6c 6c 20 65 6e 74 72 69 65 73 20 77 69 74 68 20  ll entries with 
1a8e0 77 69 6e 53 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d  winShmNode.nRef=
1a8f0 3d 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  =0..**.** This i
1a900 73 20 6e 6f 74 20 61 20 56 46 53 20 73 68 61 72  s not a VFS shar
1a910 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 74 68 6f 64  ed-memory method
1a920 3b 20 69 74 20 69 73 20 61 20 75 74 69 6c 69 74  ; it is a utilit
1a930 79 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65  y function calle
1a940 64 0a 2a 2a 20 62 79 20 56 46 53 20 73 68 61 72  d.** by VFS shar
1a950 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 74 68 6f 64  ed-memory method
1a960 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
1a970 64 20 77 69 6e 53 68 6d 50 75 72 67 65 28 73 71  d winShmPurge(sq
1a980 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
1a990 20 69 6e 74 20 64 65 6c 65 74 65 46 6c 61 67 29   int deleteFlag)
1a9a0 7b 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a  {.  winShmNode *
1a9b0 2a 70 70 3b 0a 20 20 77 69 6e 53 68 6d 4e 6f 64  *pp;.  winShmNod
1a9c0 65 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20  e *p;.  assert( 
1a9d0 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28  winShmMutexHeld(
1a9e0 29 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  ) );.  OSTRACE((
1a9f0 22 53 48 4d 2d 50 55 52 47 45 20 70 69 64 3d 25  "SHM-PURGE pid=%
1aa00 6c 75 2c 20 64 65 6c 65 74 65 46 6c 61 67 3d 25  lu, deleteFlag=%
1aa10 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
1aa20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
1aa30 63 65 73 73 49 64 28 29 2c 20 64 65 6c 65 74 65  cessId(), delete
1aa40 46 6c 61 67 29 29 3b 0a 20 20 70 70 20 3d 20 26  Flag));.  pp = &
1aa50 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 3b 0a  winShmNodeList;.
1aa60 20 20 77 68 69 6c 65 28 20 28 70 20 3d 20 2a 70    while( (p = *p
1aa70 70 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  p)!=0 ){.    if(
1aa80 20 70 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20   p->nRef==0 ){. 
1aa90 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
1aaa0 20 20 69 66 28 20 70 2d 3e 6d 75 74 65 78 20 29    if( p->mutex )
1aab0 7b 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  { sqlite3_mutex_
1aac0 66 72 65 65 28 70 2d 3e 6d 75 74 65 78 29 3b 20  free(p->mutex); 
1aad0 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  }.      for(i=0;
1aae0 20 69 3c 70 2d 3e 6e 52 65 67 69 6f 6e 3b 20 69   i<p->nRegion; i
1aaf0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 42 4f 4f  ++){.        BOO
1ab00 4c 20 62 52 63 20 3d 20 6f 73 55 6e 6d 61 70 56  L bRc = osUnmapV
1ab10 69 65 77 4f 66 46 69 6c 65 28 70 2d 3e 61 52 65  iewOfFile(p->aRe
1ab20 67 69 6f 6e 5b 69 5d 2e 70 4d 61 70 29 3b 0a 20  gion[i].pMap);. 
1ab30 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28         OSTRACE((
1ab40 22 53 48 4d 2d 50 55 52 47 45 2d 55 4e 4d 41 50  "SHM-PURGE-UNMAP
1ab50 20 70 69 64 3d 25 6c 75 2c 20 72 65 67 69 6f 6e   pid=%lu, region
1ab60 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20  =%d, rc=%s\n",. 
1ab70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ab80 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
1ab90 65 73 73 49 64 28 29 2c 20 69 2c 20 62 52 63 20  essId(), i, bRc 
1aba0 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64  ? "ok" : "failed
1abb0 22 29 29 3b 0a 20 20 20 20 20 20 20 20 55 4e 55  "));.        UNU
1abc0 53 45 44 5f 56 41 52 49 41 42 4c 45 5f 56 41 4c  SED_VARIABLE_VAL
1abd0 55 45 28 62 52 63 29 3b 0a 20 20 20 20 20 20 20  UE(bRc);.       
1abe0 20 62 52 63 20 3d 20 6f 73 43 6c 6f 73 65 48 61   bRc = osCloseHa
1abf0 6e 64 6c 65 28 70 2d 3e 61 52 65 67 69 6f 6e 5b  ndle(p->aRegion[
1ac00 69 5d 2e 68 4d 61 70 29 3b 0a 20 20 20 20 20 20  i].hMap);.      
1ac10 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d    OSTRACE(("SHM-
1ac20 50 55 52 47 45 2d 43 4c 4f 53 45 20 70 69 64 3d  PURGE-CLOSE pid=
1ac30 25 6c 75 2c 20 72 65 67 69 6f 6e 3d 25 64 2c 20  %lu, region=%d, 
1ac40 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  rc=%s\n",.      
1ac50 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74             osGet
1ac60 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
1ac70 28 29 2c 20 69 2c 20 62 52 63 20 3f 20 22 6f 6b  (), i, bRc ? "ok
1ac80 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a  " : "failed"));.
1ac90 20 20 20 20 20 20 20 20 55 4e 55 53 45 44 5f 56          UNUSED_V
1aca0 41 52 49 41 42 4c 45 5f 56 41 4c 55 45 28 62 52  ARIABLE_VALUE(bR
1acb0 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  c);.      }.    
1acc0 20 20 69 66 28 20 70 2d 3e 68 46 69 6c 65 2e 68    if( p->hFile.h
1acd0 21 3d 4e 55 4c 4c 20 26 26 20 70 2d 3e 68 46 69  !=NULL && p->hFi
1ace0 6c 65 2e 68 21 3d 49 4e 56 41 4c 49 44 5f 48 41  le.h!=INVALID_HA
1acf0 4e 44 4c 45 5f 56 41 4c 55 45 20 29 7b 0a 20 20  NDLE_VALUE ){.  
1ad00 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
1ad10 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a  ErrorBenign(1);.
1ad20 20 20 20 20 20 20 20 20 77 69 6e 43 6c 6f 73 65          winClose
1ad30 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  ((sqlite3_file *
1ad40 29 26 70 2d 3e 68 46 69 6c 65 29 3b 0a 20 20 20  )&p->hFile);.   
1ad50 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45       SimulateIOE
1ad60 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20  rrorBenign(0);. 
1ad70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1ad80 20 64 65 6c 65 74 65 46 6c 61 67 20 29 7b 0a 20   deleteFlag ){. 
1ad90 20 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49         SimulateI
1ada0 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b  OErrorBenign(1);
1adb0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1adc0 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
1add0 63 28 29 3b 0a 20 20 20 20 20 20 20 20 77 69 6e  c();.        win
1ade0 44 65 6c 65 74 65 28 70 56 66 73 2c 20 70 2d 3e  Delete(pVfs, p->
1adf0 7a 46 69 6c 65 6e 61 6d 65 2c 20 30 29 3b 0a 20  zFilename, 0);. 
1ae00 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e         sqlite3En
1ae10 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
1ae20 0a 20 20 20 20 20 20 20 20 53 69 6d 75 6c 61 74  .        Simulat
1ae30 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30  eIOErrorBenign(0
1ae40 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1ae50 20 2a 70 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b   *pp = p->pNext;
1ae60 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
1ae70 72 65 65 28 70 2d 3e 61 52 65 67 69 6f 6e 29 3b  ree(p->aRegion);
1ae80 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
1ae90 72 65 65 28 70 29 3b 0a 20 20 20 20 7d 65 6c 73  ree(p);.    }els
1aea0 65 7b 0a 20 20 20 20 20 20 70 70 20 3d 20 26 70  e{.      pp = &p
1aeb0 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  ->pNext;.    }. 
1aec0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e   }.}../*.** Open
1aed0 20 74 68 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f   the shared-memo
1aee0 72 79 20 61 72 65 61 20 61 73 73 6f 63 69 61 74  ry area associat
1aef0 65 64 20 77 69 74 68 20 64 61 74 61 62 61 73 65  ed with database
1af00 20 66 69 6c 65 20 70 44 62 46 64 2e 0a 2a 2a 0a   file pDbFd..**.
1af10 2a 2a 20 57 68 65 6e 20 6f 70 65 6e 69 6e 67 20  ** When opening 
1af20 61 20 6e 65 77 20 73 68 61 72 65 64 2d 6d 65 6d  a new shared-mem
1af30 6f 72 79 20 66 69 6c 65 2c 20 69 66 20 6e 6f 20  ory file, if no 
1af40 6f 74 68 65 72 20 69 6e 73 74 61 6e 63 65 73 20  other instances 
1af50 6f 66 20 74 68 61 74 0a 2a 2a 20 66 69 6c 65 20  of that.** file 
1af60 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70  are currently op
1af70 65 6e 2c 20 69 6e 20 74 68 69 73 20 70 72 6f 63  en, in this proc
1af80 65 73 73 20 6f 72 20 69 6e 20 6f 74 68 65 72 20  ess or in other 
1af90 70 72 6f 63 65 73 73 65 73 2c 20 74 68 65 6e 0a  processes, then.
1afa0 2a 2a 20 74 68 65 20 66 69 6c 65 20 6d 75 73 74  ** the file must
1afb0 20 62 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f   be truncated to
1afc0 20 7a 65 72 6f 20 6c 65 6e 67 74 68 20 6f 72 20   zero length or 
1afd0 68 61 76 65 20 69 74 73 20 68 65 61 64 65 72 20  have its header 
1afe0 63 6c 65 61 72 65 64 2e 0a 2a 2f 0a 73 74 61 74  cleared..*/.stat
1aff0 69 63 20 69 6e 74 20 77 69 6e 4f 70 65 6e 53 68  ic int winOpenSh
1b000 61 72 65 64 4d 65 6d 6f 72 79 28 77 69 6e 46 69  aredMemory(winFi
1b010 6c 65 20 2a 70 44 62 46 64 29 7b 0a 20 20 73 74  le *pDbFd){.  st
1b020 72 75 63 74 20 77 69 6e 53 68 6d 20 2a 70 3b 20  ruct winShm *p; 
1b030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b040 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74 69   /* The connecti
1b050 6f 6e 20 74 6f 20 62 65 20 6f 70 65 6e 65 64 20  on to be opened 
1b060 2a 2f 0a 20 20 73 74 72 75 63 74 20 77 69 6e 53  */.  struct winS
1b070 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65  hmNode *pShmNode
1b080 20 3d 20 30 3b 20 20 20 2f 2a 20 54 68 65 20 75   = 0;   /* The u
1b090 6e 64 65 72 6c 79 69 6e 67 20 6d 6d 61 70 70 65  nderlying mmappe
1b0a0 64 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  d file */.  int 
1b0b0 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
1b0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b0d0 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f  * Result code */
1b0e0 0a 20 20 73 74 72 75 63 74 20 77 69 6e 53 68 6d  .  struct winShm
1b0f0 4e 6f 64 65 20 2a 70 4e 65 77 3b 20 20 20 20 20  Node *pNew;     
1b100 20 20 20 20 20 20 2f 2a 20 4e 65 77 6c 79 20 61        /* Newly a
1b110 6c 6c 6f 63 61 74 65 64 20 77 69 6e 53 68 6d 4e  llocated winShmN
1b120 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61  ode */.  int nNa
1b130 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  me;             
1b140 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1b150 69 7a 65 20 6f 66 20 7a 4e 61 6d 65 20 69 6e 20  ize of zName in 
1b160 62 79 74 65 73 20 2a 2f 0a 0a 20 20 61 73 73 65  bytes */..  asse
1b170 72 74 28 20 70 44 62 46 64 2d 3e 70 53 68 6d 3d  rt( pDbFd->pShm=
1b180 3d 30 20 29 3b 20 20 20 20 2f 2a 20 4e 6f 74 20  =0 );    /* Not 
1b190 70 72 65 76 69 6f 75 73 6c 79 20 6f 70 65 6e 65  previously opene
1b1a0 64 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  d */..  /* Alloc
1b1b0 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 74 68  ate space for th
1b1c0 65 20 6e 65 77 20 73 71 6c 69 74 65 33 5f 73 68  e new sqlite3_sh
1b1d0 6d 20 6f 62 6a 65 63 74 2e 20 20 41 6c 73 6f 20  m object.  Also 
1b1e0 73 70 65 63 75 6c 61 74 69 76 65 6c 79 0a 20 20  speculatively.  
1b1f0 2a 2a 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63  ** allocate spac
1b200 65 20 66 6f 72 20 61 20 6e 65 77 20 77 69 6e 53  e for a new winS
1b210 68 6d 4e 6f 64 65 20 61 6e 64 20 66 69 6c 65 6e  hmNode and filen
1b220 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 70 20 3d 20  ame..  */.  p = 
1b230 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
1b240 6f 28 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b  o( sizeof(*p) );
1b250 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
1b260 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
1b270 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 6e 4e 61 6d 65  R_NOMEM;.  nName
1b280 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
1b290 33 30 28 70 44 62 46 64 2d 3e 7a 50 61 74 68 29  30(pDbFd->zPath)
1b2a0 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
1b2b0 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69  e3MallocZero( si
1b2c0 7a 65 6f 66 28 2a 70 53 68 6d 4e 6f 64 65 29 20  zeof(*pShmNode) 
1b2d0 2b 20 6e 4e 61 6d 65 20 2b 20 31 37 20 29 3b 0a  + nName + 17 );.
1b2e0 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b    if( pNew==0 ){
1b2f0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
1b300 65 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  e(p);.    return
1b310 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
1b320 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d  MEM;.  }.  pNew-
1b330 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68  >zFilename = (ch
1b340 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20  ar*)&pNew[1];.  
1b350 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
1b360 28 6e 4e 61 6d 65 2b 31 35 2c 20 70 4e 65 77 2d  (nName+15, pNew-
1b370 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 25 73 2d  >zFilename, "%s-
1b380 73 68 6d 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61  shm", pDbFd->zPa
1b390 74 68 29 3b 0a 20 20 73 71 6c 69 74 65 33 46 69  th);.  sqlite3Fi
1b3a0 6c 65 53 75 66 66 69 78 33 28 70 44 62 46 64 2d  leSuffix3(pDbFd-
1b3b0 3e 7a 50 61 74 68 2c 20 70 4e 65 77 2d 3e 7a 46  >zPath, pNew->zF
1b3c0 69 6c 65 6e 61 6d 65 29 3b 0a 0a 20 20 2f 2a 20  ilename);..  /* 
1b3d0 4c 6f 6f 6b 20 74 6f 20 73 65 65 20 69 66 20 74  Look to see if t
1b3e0 68 65 72 65 20 69 73 20 61 6e 20 65 78 69 73 74  here is an exist
1b3f0 69 6e 67 20 77 69 6e 53 68 6d 4e 6f 64 65 20 74  ing winShmNode t
1b400 68 61 74 20 63 61 6e 20 62 65 20 75 73 65 64 2e  hat can be used.
1b410 0a 20 20 2a 2a 20 49 66 20 6e 6f 20 6d 61 74 63  .  ** If no matc
1b420 68 69 6e 67 20 77 69 6e 53 68 6d 4e 6f 64 65 20  hing winShmNode 
1b430 63 75 72 72 65 6e 74 6c 79 20 65 78 69 73 74 73  currently exists
1b440 2c 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 6f  , create a new o
1b450 6e 65 2e 0a 20 20 2a 2f 0a 20 20 77 69 6e 53 68  ne..  */.  winSh
1b460 6d 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  mEnterMutex();. 
1b470 20 66 6f 72 28 70 53 68 6d 4e 6f 64 65 20 3d 20   for(pShmNode = 
1b480 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 3b 20  winShmNodeList; 
1b490 70 53 68 6d 4e 6f 64 65 3b 20 70 53 68 6d 4e 6f  pShmNode; pShmNo
1b4a0 64 65 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 4e 65  de=pShmNode->pNe
1b4b0 78 74 29 7b 0a 20 20 20 20 2f 2a 20 54 42 44 20  xt){.    /* TBD 
1b4c0 6e 65 65 64 20 74 6f 20 63 6f 6d 65 20 75 70 20  need to come up 
1b4d0 77 69 74 68 20 62 65 74 74 65 72 20 6d 61 74 63  with better matc
1b4e0 68 20 68 65 72 65 2e 20 20 50 65 72 68 61 70 73  h here.  Perhaps
1b4f0 0a 20 20 20 20 2a 2a 20 75 73 65 20 46 49 4c 45  .    ** use FILE
1b500 5f 49 44 5f 42 4f 54 48 5f 44 49 52 5f 49 4e 46  _ID_BOTH_DIR_INF
1b510 4f 20 53 74 72 75 63 74 75 72 65 2e 0a 20 20 20  O Structure..   
1b520 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69   */.    if( sqli
1b530 74 65 33 53 74 72 49 43 6d 70 28 70 53 68 6d 4e  te3StrICmp(pShmN
1b540 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20  ode->zFilename, 
1b550 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29  pNew->zFilename)
1b560 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  ==0 ) break;.  }
1b570 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 20  .  if( pShmNode 
1b580 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
1b590 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 7d 65 6c  ree(pNew);.  }el
1b5a0 73 65 7b 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65  se{.    pShmNode
1b5b0 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 70 4e 65   = pNew;.    pNe
1b5c0 77 20 3d 20 30 3b 0a 20 20 20 20 28 28 77 69 6e  w = 0;.    ((win
1b5d0 46 69 6c 65 2a 29 28 26 70 53 68 6d 4e 6f 64 65  File*)(&pShmNode
1b5e0 2d 3e 68 46 69 6c 65 29 29 2d 3e 68 20 3d 20 49  ->hFile))->h = I
1b5f0 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
1b600 4c 55 45 3b 0a 20 20 20 20 70 53 68 6d 4e 6f 64  LUE;.    pShmNod
1b610 65 2d 3e 70 4e 65 78 74 20 3d 20 77 69 6e 53 68  e->pNext = winSh
1b620 6d 4e 6f 64 65 4c 69 73 74 3b 0a 20 20 20 20 77  mNodeList;.    w
1b630 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 20 3d 20  inShmNodeList = 
1b640 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20 20 20 70  pShmNode;..    p
1b650 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20 3d  ShmNode->mutex =
1b660 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61   sqlite3_mutex_a
1b670 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
1b680 58 5f 46 41 53 54 29 3b 0a 20 20 20 20 69 66 28  X_FAST);.    if(
1b690 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78   pShmNode->mutex
1b6a0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
1b6b0 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  = SQLITE_IOERR_N
1b6c0 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f  OMEM;.      goto
1b6d0 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20   shm_open_err;. 
1b6e0 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 77     }..    rc = w
1b6f0 69 6e 4f 70 65 6e 28 70 44 62 46 64 2d 3e 70 56  inOpen(pDbFd->pV
1b700 66 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  fs,.            
1b710 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a       pShmNode->z
1b720 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20 20 20 20  Filename,       
1b730 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
1b740 20 74 68 65 20 66 69 6c 65 20 28 55 54 46 2d 38   the file (UTF-8
1b750 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  ) */.           
1b760 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 66        (sqlite3_f
1b770 69 6c 65 2a 29 26 70 53 68 6d 4e 6f 64 65 2d 3e  ile*)&pShmNode->
1b780 68 46 69 6c 65 2c 20 20 2f 2a 20 46 69 6c 65 20  hFile,  /* File 
1b790 68 61 6e 64 6c 65 20 68 65 72 65 20 2a 2f 0a 20  handle here */. 
1b7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b7b0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20  SQLITE_OPEN_WAL 
1b7c0 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  | SQLITE_OPEN_RE
1b7d0 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45  ADWRITE | SQLITE
1b7e0 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c 0a 20 20  _OPEN_CREATE,.  
1b7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
1b800 29 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54  );.    if( SQLIT
1b810 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20  E_OK!=rc ){.    
1b820 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f    goto shm_open_
1b830 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  err;.    }..    
1b840 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
1b850 69 66 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65  if another proce
1b860 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68  ss is holding th
1b870 65 20 64 65 61 64 2d 6d 61 6e 20 73 77 69 74 63  e dead-man switc
1b880 68 2e 0a 20 20 20 20 2a 2a 20 49 66 20 6e 6f 74  h..    ** If not
1b890 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 66  , truncate the f
1b8a0 69 6c 65 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67  ile to zero leng
1b8b0 74 68 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  th..    */.    i
1b8c0 66 28 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c  f( winShmSystemL
1b8d0 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53  ock(pShmNode, _S
1b8e0 48 4d 5f 57 52 4c 43 4b 2c 20 57 49 4e 5f 53 48  HM_WRLCK, WIN_SH
1b8f0 4d 5f 44 4d 53 2c 20 31 29 3d 3d 53 51 4c 49 54  M_DMS, 1)==SQLIT
1b900 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
1b910 20 3d 20 77 69 6e 54 72 75 6e 63 61 74 65 28 28   = winTruncate((
1b920 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 26  sqlite3_file *)&
1b930 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c  pShmNode->hFile,
1b940 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
1b950 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1b960 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e          rc = win
1b970 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
1b980 49 4f 45 52 52 5f 53 48 4d 4f 50 45 4e 2c 20 6f  IOERR_SHMOPEN, o
1b990 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c  sGetLastError(),
1b9a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1b9b0 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 4f 70            "winOp
1b9c0 65 6e 53 68 6d 22 2c 20 70 44 62 46 64 2d 3e 7a  enShm", pDbFd->z
1b9d0 50 61 74 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Path);.      }. 
1b9e0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
1b9f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1ba00 20 20 20 20 77 69 6e 53 68 6d 53 79 73 74 65 6d      winShmSystem
1ba10 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f  Lock(pShmNode, _
1ba20 53 48 4d 5f 55 4e 4c 43 4b 2c 20 57 49 4e 5f 53  SHM_UNLCK, WIN_S
1ba30 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20 20 20 20  HM_DMS, 1);.    
1ba40 20 20 72 63 20 3d 20 77 69 6e 53 68 6d 53 79 73    rc = winShmSys
1ba50 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65  temLock(pShmNode
1ba60 2c 20 5f 53 48 4d 5f 52 44 4c 43 4b 2c 20 57 49  , _SHM_RDLCK, WI
1ba70 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20  N_SHM_DMS, 1);. 
1ba80 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 20     }.    if( rc 
1ba90 29 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f  ) goto shm_open_
1baa0 65 72 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  err;.  }..  /* M
1bab0 61 6b 65 20 74 68 65 20 6e 65 77 20 63 6f 6e 6e  ake the new conn
1bac0 65 63 74 69 6f 6e 20 61 20 63 68 69 6c 64 20 6f  ection a child o
1bad0 66 20 74 68 65 20 77 69 6e 53 68 6d 4e 6f 64 65  f the winShmNode
1bae0 20 2a 2f 0a 20 20 70 2d 3e 70 53 68 6d 4e 6f 64   */.  p->pShmNod
1baf0 65 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 23 69  e = pShmNode;.#i
1bb00 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
1bb10 47 0a 20 20 70 2d 3e 69 64 20 3d 20 70 53 68 6d  G.  p->id = pShm
1bb20 4e 6f 64 65 2d 3e 6e 65 78 74 53 68 6d 49 64 2b  Node->nextShmId+
1bb30 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 70 53 68 6d  +;.#endif.  pShm
1bb40 4e 6f 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20  Node->nRef++;.  
1bb50 70 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20 70 3b  pDbFd->pShm = p;
1bb60 0a 20 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75  .  winShmLeaveMu
1bb70 74 65 78 28 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  tex();..  /* The
1bb80 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
1bb90 20 6f 6e 20 70 53 68 6d 4e 6f 64 65 20 68 61 73   on pShmNode has
1bba0 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69 6e   already been in
1bbb0 63 72 65 6d 65 6e 74 65 64 20 75 6e 64 65 72 0a  cremented under.
1bbc0 20 20 2a 2a 20 74 68 65 20 63 6f 76 65 72 20 6f    ** the cover o
1bbd0 66 20 74 68 65 20 77 69 6e 53 68 6d 45 6e 74 65  f the winShmEnte
1bbe0 72 4d 75 74 65 78 28 29 20 6d 75 74 65 78 20 61  rMutex() mutex a
1bbf0 6e 64 20 74 68 65 20 70 6f 69 6e 74 65 72 20 66  nd the pointer f
1bc00 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 6e 65 77  rom the.  ** new
1bc10 20 28 73 74 72 75 63 74 20 77 69 6e 53 68 6d 29   (struct winShm)
1bc20 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20 70   object to the p
1bc30 53 68 6d 4e 6f 64 65 20 68 61 73 20 62 65 65 6e  ShmNode has been
1bc40 20 73 65 74 2e 20 41 6c 6c 20 74 68 61 74 20 69   set. All that i
1bc50 73 0a 20 20 2a 2a 20 6c 65 66 74 20 74 6f 20 64  s.  ** left to d
1bc60 6f 20 69 73 20 74 6f 20 6c 69 6e 6b 20 74 68 65  o is to link the
1bc70 20 6e 65 77 20 6f 62 6a 65 63 74 20 69 6e 74 6f   new object into
1bc80 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74   the linked list
1bc90 20 73 74 61 72 74 69 6e 67 0a 20 20 2a 2a 20 61   starting.  ** a
1bca0 74 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72  t pShmNode->pFir
1bcb0 73 74 2e 20 54 68 69 73 20 6d 75 73 74 20 62 65  st. This must be
1bcc0 20 64 6f 6e 65 20 77 68 69 6c 65 20 68 6f 6c 64   done while hold
1bcd0 69 6e 67 20 74 68 65 20 70 53 68 6d 4e 6f 64 65  ing the pShmNode
1bce0 2d 3e 6d 75 74 65 78 0a 20 20 2a 2a 20 6d 75 74  ->mutex.  ** mut
1bcf0 65 78 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ex..  */.  sqlit
1bd00 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70  e3_mutex_enter(p
1bd10 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b  ShmNode->mutex);
1bd20 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53  .  p->pNext = pS
1bd30 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 0a  hmNode->pFirst;.
1bd40 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72    pShmNode->pFir
1bd50 73 74 20 3d 20 70 3b 0a 20 20 73 71 6c 69 74 65  st = p;.  sqlite
1bd60 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53  3_mutex_leave(pS
1bd70 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
1bd80 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1bd90 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68  OK;..  /* Jump h
1bda0 65 72 65 20 6f 6e 20 61 6e 79 20 65 72 72 6f 72  ere on any error
1bdb0 20 2a 2f 0a 73 68 6d 5f 6f 70 65 6e 5f 65 72 72   */.shm_open_err
1bdc0 3a 0a 20 20 77 69 6e 53 68 6d 53 79 73 74 65 6d  :.  winShmSystem
1bdd0 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f  Lock(pShmNode, _
1bde0 53 48 4d 5f 55 4e 4c 43 4b 2c 20 57 49 4e 5f 53  SHM_UNLCK, WIN_S
1bdf0 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20 20 77 69  HM_DMS, 1);.  wi
1be00 6e 53 68 6d 50 75 72 67 65 28 70 44 62 46 64 2d  nShmPurge(pDbFd-
1be10 3e 70 56 66 73 2c 20 30 29 3b 20 20 20 20 20 20  >pVfs, 0);      
1be20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 66 72 65  /* This call fre
1be30 65 73 20 70 53 68 6d 4e 6f 64 65 20 69 66 20 72  es pShmNode if r
1be40 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 73 71 6c  equired */.  sql
1be50 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
1be60 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65  sqlite3_free(pNe
1be70 77 29 3b 0a 20 20 77 69 6e 53 68 6d 4c 65 61 76  w);.  winShmLeav
1be80 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74 75  eMutex();.  retu
1be90 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1bea0 43 6c 6f 73 65 20 61 20 63 6f 6e 6e 65 63 74 69  Close a connecti
1beb0 6f 6e 20 74 6f 20 73 68 61 72 65 64 2d 6d 65 6d  on to shared-mem
1bec0 6f 72 79 2e 20 20 44 65 6c 65 74 65 20 74 68 65  ory.  Delete the
1bed0 20 75 6e 64 65 72 6c 79 69 6e 67 0a 2a 2a 20 73   underlying.** s
1bee0 74 6f 72 61 67 65 20 69 66 20 64 65 6c 65 74 65  torage if delete
1bef0 46 6c 61 67 20 69 73 20 74 72 75 65 2e 0a 2a 2f  Flag is true..*/
1bf00 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53  .static int winS
1bf10 68 6d 55 6e 6d 61 70 28 0a 20 20 73 71 6c 69 74  hmUnmap(.  sqlit
1bf20 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20  e3_file *fd,    
1bf30 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
1bf40 65 20 68 6f 6c 64 69 6e 67 20 73 68 61 72 65 64  e holding shared
1bf50 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74   memory */.  int
1bf60 20 64 65 6c 65 74 65 46 6c 61 67 20 20 20 20 20   deleteFlag     
1bf70 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74          /* Delet
1bf80 65 20 61 66 74 65 72 20 63 6c 6f 73 69 6e 67 20  e after closing 
1bf90 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20  if true */.){.  
1bfa0 77 69 6e 46 69 6c 65 20 2a 70 44 62 46 64 3b 20  winFile *pDbFd; 
1bfb0 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
1bfc0 65 20 68 6f 6c 64 69 6e 67 20 73 68 61 72 65 64  e holding shared
1bfd0 2d 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 77 69 6e  -memory */.  win
1bfe0 53 68 6d 20 2a 70 3b 20 20 20 20 20 20 20 20 20  Shm *p;         
1bff0 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63     /* The connec
1c000 74 69 6f 6e 20 74 6f 20 62 65 20 63 6c 6f 73 65  tion to be close
1c010 64 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f 64  d */.  winShmNod
1c020 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 2f 2a 20  e *pShmNode; /* 
1c030 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 73  The underlying s
1c040 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c  hared-memory fil
1c050 65 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 2a  e */.  winShm **
1c060 70 70 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  pp;          /* 
1c070 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
1c080 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74   sibling connect
1c090 69 6f 6e 73 20 2a 2f 0a 0a 20 20 70 44 62 46 64  ions */..  pDbFd
1c0a0 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66 64 3b   = (winFile*)fd;
1c0b0 0a 20 20 70 20 3d 20 70 44 62 46 64 2d 3e 70 53  .  p = pDbFd->pS
1c0c0 68 6d 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  hm;.  if( p==0 )
1c0d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1c0e0 4b 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20  K;.  pShmNode = 
1c0f0 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20  p->pShmNode;..  
1c100 2f 2a 20 52 65 6d 6f 76 65 20 63 6f 6e 6e 65 63  /* Remove connec
1c110 74 69 6f 6e 20 70 20 66 72 6f 6d 20 74 68 65 20  tion p from the 
1c120 73 65 74 20 6f 66 20 63 6f 6e 6e 65 63 74 69 6f  set of connectio
1c130 6e 73 20 61 73 73 6f 63 69 61 74 65 64 0a 20 20  ns associated.  
1c140 2a 2a 20 77 69 74 68 20 70 53 68 6d 4e 6f 64 65  ** with pShmNode
1c150 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   */.  sqlite3_mu
1c160 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f  tex_enter(pShmNo
1c170 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 66 6f  de->mutex);.  fo
1c180 72 28 70 70 3d 26 70 53 68 6d 4e 6f 64 65 2d 3e  r(pp=&pShmNode->
1c190 70 46 69 72 73 74 3b 20 28 2a 70 70 29 21 3d 70  pFirst; (*pp)!=p
1c1a0 3b 20 70 70 20 3d 20 26 28 2a 70 70 29 2d 3e 70  ; pp = &(*pp)->p
1c1b0 4e 65 78 74 29 7b 7d 0a 20 20 2a 70 70 20 3d 20  Next){}.  *pp = 
1c1c0 70 2d 3e 70 4e 65 78 74 3b 0a 0a 20 20 2f 2a 20  p->pNext;..  /* 
1c1d0 46 72 65 65 20 74 68 65 20 63 6f 6e 6e 65 63 74  Free the connect
1c1e0 69 6f 6e 20 70 20 2a 2f 0a 20 20 73 71 6c 69 74  ion p */.  sqlit
1c1f0 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 70 44  e3_free(p);.  pD
1c200 62 46 64 2d 3e 70 53 68 6d 20 3d 20 30 3b 0a 20  bFd->pShm = 0;. 
1c210 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
1c220 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  eave(pShmNode->m
1c230 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  utex);..  /* If 
1c240 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 20 68  pShmNode->nRef h
1c250 61 73 20 72 65 61 63 68 65 64 20 30 2c 20 74 68  as reached 0, th
1c260 65 6e 20 63 6c 6f 73 65 20 74 68 65 20 75 6e 64  en close the und
1c270 65 72 6c 79 69 6e 67 0a 20 20 2a 2a 20 73 68 61  erlying.  ** sha
1c280 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c  red-memory file,
1c290 20 74 6f 6f 20 2a 2f 0a 20 20 77 69 6e 53 68 6d   too */.  winShm
1c2a0 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
1c2b0 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65  assert( pShmNode
1c2c0 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70 53  ->nRef>0 );.  pS
1c2d0 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a  hmNode->nRef--;.
1c2e0 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e    if( pShmNode->
1c2f0 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 77  nRef==0 ){.    w
1c300 69 6e 53 68 6d 50 75 72 67 65 28 70 44 62 46 64  inShmPurge(pDbFd
1c310 2d 3e 70 56 66 73 2c 20 64 65 6c 65 74 65 46 6c  ->pVfs, deleteFl
1c320 61 67 29 3b 0a 20 20 7d 0a 20 20 77 69 6e 53 68  ag);.  }.  winSh
1c330 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 0a  mLeaveMutex();..
1c340 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1c350 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  OK;.}../*.** Cha
1c360 6e 67 65 20 74 68 65 20 6c 6f 63 6b 20 73 74 61  nge the lock sta
1c370 74 65 20 66 6f 72 20 61 20 73 68 61 72 65 64 2d  te for a shared-
1c380 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 2e 0a  memory segment..
1c390 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
1c3a0 6e 53 68 6d 4c 6f 63 6b 28 0a 20 20 73 71 6c 69  nShmLock(.  sqli
1c3b0 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20  te3_file *fd,   
1c3c0 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
1c3d0 73 65 20 66 69 6c 65 20 68 6f 6c 64 69 6e 67 20  se file holding 
1c3e0 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  the shared memor
1c3f0 79 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c  y */.  int ofst,
1c400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c410 20 20 2f 2a 20 46 69 72 73 74 20 6c 6f 63 6b 20    /* First lock 
1c420 74 6f 20 61 63 71 75 69 72 65 20 6f 72 20 72 65  to acquire or re
1c430 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  lease */.  int n
1c440 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1c450 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1c460 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 61 63 71 75  of locks to acqu
1c470 69 72 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a  ire or release *
1c480 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20  /.  int flags   
1c490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c4a0 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74  * What to do wit
1c4b0 68 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 29 7b  h the lock */.){
1c4c0 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 44 62 46  .  winFile *pDbF
1c4d0 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66 64  d = (winFile*)fd
1c4e0 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e  ;        /* Conn
1c4f0 65 63 74 69 6f 6e 20 68 6f 6c 64 69 6e 67 20 73  ection holding s
1c500 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a  hared memory */.
1c510 20 20 77 69 6e 53 68 6d 20 2a 70 20 3d 20 70 44    winShm *p = pD
1c520 62 46 64 2d 3e 70 53 68 6d 3b 20 20 20 20 20 20  bFd->pShm;      
1c530 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
1c540 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 62 65 69  hared memory bei
1c550 6e 67 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 77  ng locked */.  w
1c560 69 6e 53 68 6d 20 2a 70 58 3b 20 20 20 20 20 20  inShm *pX;      
1c570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c580 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70       /* For loop
1c590 69 6e 67 20 6f 76 65 72 20 61 6c 6c 20 73 69 62  ing over all sib
1c5a0 6c 69 6e 67 73 20 2a 2f 0a 20 20 77 69 6e 53 68  lings */.  winSh
1c5b0 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 20  mNode *pShmNode 
1c5c0 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20  = p->pShmNode;. 
1c5d0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1c5e0 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
1c5f0 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
1c600 20 63 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20 6d   code */.  u16 m
1c610 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ask;            
1c620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c630 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b   /* Mask of lock
1c640 73 20 74 6f 20 74 61 6b 65 20 6f 72 20 72 65 6c  s to take or rel
1c650 65 61 73 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ease */..  asser
1c660 74 28 20 6f 66 73 74 3e 3d 30 20 26 26 20 6f 66  t( ofst>=0 && of
1c670 73 74 2b 6e 3c 3d 53 51 4c 49 54 45 5f 53 48 4d  st+n<=SQLITE_SHM
1c680 5f 4e 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  _NLOCK );.  asse
1c690 72 74 28 20 6e 3e 3d 31 20 29 3b 0a 20 20 61 73  rt( n>=1 );.  as
1c6a0 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 28 53 51  sert( flags==(SQ
1c6b0 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20  LITE_SHM_LOCK | 
1c6c0 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45  SQLITE_SHM_SHARE
1c6d0 44 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61  D).       || fla
1c6e0 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f  gs==(SQLITE_SHM_
1c6f0 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48  LOCK | SQLITE_SH
1c700 4d 5f 45 58 43 4c 55 53 49 56 45 29 0a 20 20 20  M_EXCLUSIVE).   
1c710 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53      || flags==(S
1c720 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b  QLITE_SHM_UNLOCK
1c730 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48   | SQLITE_SHM_SH
1c740 41 52 45 44 29 0a 20 20 20 20 20 20 20 7c 7c 20  ARED).       || 
1c750 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53  flags==(SQLITE_S
1c760 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49  HM_UNLOCK | SQLI
1c770 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45  TE_SHM_EXCLUSIVE
1c780 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  ) );.  assert( n
1c790 3d 3d 31 20 7c 7c 20 28 66 6c 61 67 73 20 26 20  ==1 || (flags & 
1c7a0 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55  SQLITE_SHM_EXCLU
1c7b0 53 49 56 45 29 21 3d 30 20 29 3b 0a 0a 20 20 6d  SIVE)!=0 );..  m
1c7c0 61 73 6b 20 3d 20 28 75 31 36 29 28 28 31 55 3c  ask = (u16)((1U<
1c7d0 3c 28 6f 66 73 74 2b 6e 29 29 20 2d 20 28 31 55  <(ofst+n)) - (1U
1c7e0 3c 3c 6f 66 73 74 29 29 3b 0a 20 20 61 73 73 65  <<ofst));.  asse
1c7f0 72 74 28 20 6e 3e 31 20 7c 7c 20 6d 61 73 6b 3d  rt( n>1 || mask=
1c800 3d 28 31 3c 3c 6f 66 73 74 29 20 29 3b 0a 20 20  =(1<<ofst) );.  
1c810 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
1c820 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  ter(pShmNode->mu
1c830 74 65 78 29 3b 0a 20 20 69 66 28 20 66 6c 61 67  tex);.  if( flag
1c840 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 55  s & SQLITE_SHM_U
1c850 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 75 31 36  NLOCK ){.    u16
1c860 20 61 6c 6c 4d 61 73 6b 20 3d 20 30 3b 20 2f 2a   allMask = 0; /*
1c870 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 68   Mask of locks h
1c880 65 6c 64 20 62 79 20 73 69 62 6c 69 6e 67 73 20  eld by siblings 
1c890 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 65 20 69  */..    /* See i
1c8a0 66 20 61 6e 79 20 73 69 62 6c 69 6e 67 73 20 68  f any siblings h
1c8b0 6f 6c 64 20 74 68 69 73 20 73 61 6d 65 20 6c 6f  old this same lo
1c8c0 63 6b 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58  ck */.    for(pX
1c8d0 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73  =pShmNode->pFirs
1c8e0 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e  t; pX; pX=pX->pN
1c8f0 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ext){.      if( 
1c900 70 58 3d 3d 70 20 29 20 63 6f 6e 74 69 6e 75 65  pX==p ) continue
1c910 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1c920 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20  (pX->exclMask & 
1c930 28 70 2d 3e 65 78 63 6c 4d 61 73 6b 7c 70 2d 3e  (p->exclMask|p->
1c940 73 68 61 72 65 64 4d 61 73 6b 29 29 3d 3d 30 20  sharedMask))==0 
1c950 29 3b 0a 20 20 20 20 20 20 61 6c 6c 4d 61 73 6b  );.      allMask
1c960 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d 61   |= pX->sharedMa
1c970 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  sk;.    }..    /
1c980 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 73 79 73  * Unlock the sys
1c990 74 65 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b 73 20  tem-level locks 
1c9a0 2a 2f 0a 20 20 20 20 69 66 28 20 28 6d 61 73 6b  */.    if( (mask
1c9b0 20 26 20 61 6c 6c 4d 61 73 6b 29 3d 3d 30 20 29   & allMask)==0 )
1c9c0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e  {.      rc = win
1c9d0 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53  ShmSystemLock(pS
1c9e0 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55 4e 4c  hmNode, _SHM_UNL
1c9f0 43 4b 2c 20 6f 66 73 74 2b 57 49 4e 5f 53 48 4d  CK, ofst+WIN_SHM
1ca00 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 7d  _BASE, n);.    }
1ca10 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
1ca20 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1ca30 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 64 6f 20 74  }..    /* Undo t
1ca40 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 73 20 2a  he local locks *
1ca50 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
1ca60 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1ca70 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20   p->exclMask &= 
1ca80 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 2d 3e  ~mask;.      p->
1ca90 73 68 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d  sharedMask &= ~m
1caa0 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  ask;.    }.  }el
1cab0 73 65 20 69 66 28 20 66 6c 61 67 73 20 26 20 53  se if( flags & S
1cac0 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44  QLITE_SHM_SHARED
1cad0 20 29 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c 53   ){.    u16 allS
1cae0 68 61 72 65 64 20 3d 20 30 3b 20 20 2f 2a 20 55  hared = 0;  /* U
1caf0 6e 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73 20 68 65  nion of locks he
1cb00 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e  ld by connection
1cb10 73 20 6f 74 68 65 72 20 74 68 61 6e 20 22 70 22  s other than "p"
1cb20 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64   */..    /* Find
1cb30 20 6f 75 74 20 77 68 69 63 68 20 73 68 61 72 65   out which share
1cb40 64 20 6c 6f 63 6b 73 20 61 72 65 20 61 6c 72 65  d locks are alre
1cb50 61 64 79 20 68 65 6c 64 20 62 79 20 73 69 62 6c  ady held by sibl
1cb60 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e  ing connections.
1cb70 0a 20 20 20 20 2a 2a 20 49 66 20 61 6e 79 20 73  .    ** If any s
1cb80 69 62 6c 69 6e 67 20 61 6c 72 65 61 64 79 20 68  ibling already h
1cb90 6f 6c 64 73 20 61 6e 20 65 78 63 6c 75 73 69 76  olds an exclusiv
1cba0 65 20 6c 6f 63 6b 2c 20 67 6f 20 61 68 65 61 64  e lock, go ahead
1cbb0 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 20 20   and return.    
1cbc0 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a  ** SQLITE_BUSY..
1cbd0 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70      */.    for(p
1cbe0 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72  X=pShmNode->pFir
1cbf0 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70  st; pX; pX=pX->p
1cc00 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28  Next){.      if(
1cc10 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26   (pX->exclMask &
1cc20 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20   mask)!=0 ){.   
1cc30 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1cc40 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 62  _BUSY;.        b
1cc50 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
1cc60 20 20 20 20 61 6c 6c 53 68 61 72 65 64 20 7c 3d      allShared |=
1cc70 20 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b   pX->sharedMask;
1cc80 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47  .    }..    /* G
1cc90 65 74 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20  et shared locks 
1cca0 61 74 20 74 68 65 20 73 79 73 74 65 6d 20 6c 65  at the system le
1ccb0 76 65 6c 2c 20 69 66 20 6e 65 63 65 73 73 61 72  vel, if necessar
1ccc0 79 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d  y */.    if( rc=
1ccd0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1cce0 20 20 20 20 69 66 28 20 28 61 6c 6c 53 68 61 72      if( (allShar
1ccf0 65 64 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29 7b  ed & mask)==0 ){
1cd00 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 69  .        rc = wi
1cd10 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70  nShmSystemLock(p
1cd20 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 52 44  ShmNode, _SHM_RD
1cd30 4c 43 4b 2c 20 6f 66 73 74 2b 57 49 4e 5f 53 48  LCK, ofst+WIN_SH
1cd40 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20  M_BASE, n);.    
1cd50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1cd60 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1cd70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
1cd80 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20 6c      /* Get the l
1cd90 6f 63 61 6c 20 73 68 61 72 65 64 20 6c 6f 63 6b  ocal shared lock
1cda0 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d  s */.    if( rc=
1cdb0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1cdc0 20 20 20 20 70 2d 3e 73 68 61 72 65 64 4d 61 73      p->sharedMas
1cdd0 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 7d  k |= mask;.    }
1cde0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
1cdf0 20 4d 61 6b 65 20 73 75 72 65 20 6e 6f 20 73 69   Make sure no si
1ce00 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e  bling connection
1ce10 73 20 68 6f 6c 64 20 6c 6f 63 6b 73 20 74 68 61  s hold locks tha
1ce20 74 20 77 69 6c 6c 20 62 6c 6f 63 6b 20 74 68 69  t will block thi
1ce30 73 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 2e 20 20  s.    ** lock.  
1ce40 49 66 20 61 6e 79 20 64 6f 2c 20 72 65 74 75 72  If any do, retur
1ce50 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 20 72 69  n SQLITE_BUSY ri
1ce60 67 68 74 20 61 77 61 79 2e 0a 20 20 20 20 2a 2f  ght away..    */
1ce70 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d  .    for(pX=pShm
1ce80 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58  Node->pFirst; pX
1ce90 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b  ; pX=pX->pNext){
1cea0 0a 20 20 20 20 20 20 69 66 28 20 28 70 58 2d 3e  .      if( (pX->
1ceb0 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29  exclMask & mask)
1cec0 21 3d 30 20 7c 7c 20 28 70 58 2d 3e 73 68 61 72  !=0 || (pX->shar
1ced0 65 64 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d  edMask & mask)!=
1cee0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
1cef0 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
1cf00 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1cf10 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
1cf20 20 2f 2a 20 47 65 74 20 74 68 65 20 65 78 63 6c   /* Get the excl
1cf30 75 73 69 76 65 20 6c 6f 63 6b 73 20 61 74 20 74  usive locks at t
1cf40 68 65 20 73 79 73 74 65 6d 20 6c 65 76 65 6c 2e  he system level.
1cf50 20 20 54 68 65 6e 20 69 66 20 73 75 63 63 65 73    Then if succes
1cf60 73 66 75 6c 0a 20 20 20 20 2a 2a 20 61 6c 73 6f  sful.    ** also
1cf70 20 6d 61 72 6b 20 74 68 65 20 6c 6f 63 61 6c 20   mark the local 
1cf80 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 73 20 62 65  connection as be
1cf90 69 6e 67 20 6c 6f 63 6b 65 64 2e 0a 20 20 20 20  ing locked..    
1cfa0 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
1cfb0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1cfc0 20 20 72 63 20 3d 20 77 69 6e 53 68 6d 53 79 73    rc = winShmSys
1cfd0 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65  temLock(pShmNode
1cfe0 2c 20 5f 53 48 4d 5f 57 52 4c 43 4b 2c 20 6f 66  , _SHM_WRLCK, of
1cff0 73 74 2b 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2c  st+WIN_SHM_BASE,
1d000 20 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   n);.      if( r
1d010 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1d020 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1d030 28 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26  (p->sharedMask &
1d040 20 6d 61 73 6b 29 3d 3d 30 20 29 3b 0a 20 20 20   mask)==0 );.   
1d050 20 20 20 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b       p->exclMask
1d060 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20   |= mask;.      
1d070 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  }.    }.  }.  sq
1d080 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
1d090 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  e(pShmNode->mute
1d0a0 78 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  x);.  OSTRACE(("
1d0b0 53 48 4d 2d 4c 4f 43 4b 20 70 69 64 3d 25 6c 75  SHM-LOCK pid=%lu
1d0c0 2c 20 69 64 3d 25 64 2c 20 73 68 61 72 65 64 4d  , id=%d, sharedM
1d0d0 61 73 6b 3d 25 30 33 78 2c 20 65 78 63 6c 4d 61  ask=%03x, exclMa
1d0e0 73 6b 3d 25 30 33 78 2c 20 72 63 3d 25 73 5c 6e  sk=%03x, rc=%s\n
1d0f0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73  ",.           os
1d100 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
1d110 73 49 64 28 29 2c 20 70 2d 3e 69 64 2c 20 70 2d  sId(), p->id, p-
1d120 3e 73 68 61 72 65 64 4d 61 73 6b 2c 20 70 2d 3e  >sharedMask, p->
1d130 65 78 63 6c 4d 61 73 6b 2c 0a 20 20 20 20 20 20  exclMask,.      
1d140 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 4e       sqlite3ErrN
1d150 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 72 65 74  ame(rc)));.  ret
1d160 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1d170 20 49 6d 70 6c 65 6d 65 6e 74 20 61 20 6d 65 6d   Implement a mem
1d180 6f 72 79 20 62 61 72 72 69 65 72 20 6f 72 20 6d  ory barrier or m
1d190 65 6d 6f 72 79 20 66 65 6e 63 65 20 6f 6e 20 73  emory fence on s
1d1a0 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e 0a 2a 2a  hared memory..**
1d1b0 0a 2a 2a 20 41 6c 6c 20 6c 6f 61 64 73 20 61 6e  .** All loads an
1d1c0 64 20 73 74 6f 72 65 73 20 62 65 67 75 6e 20 62  d stores begun b
1d1d0 65 66 6f 72 65 20 74 68 65 20 62 61 72 72 69 65  efore the barrie
1d1e0 72 20 6d 75 73 74 20 63 6f 6d 70 6c 65 74 65 20  r must complete 
1d1f0 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 20 6c 6f  before.** any lo
1d200 61 64 20 6f 72 20 73 74 6f 72 65 20 62 65 67 75  ad or store begu
1d210 6e 20 61 66 74 65 72 20 74 68 65 20 62 61 72 72  n after the barr
1d220 69 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ier..*/.static v
1d230 6f 69 64 20 77 69 6e 53 68 6d 42 61 72 72 69 65  oid winShmBarrie
1d240 72 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  r(.  sqlite3_fil
1d250 65 20 2a 66 64 20 20 20 20 20 20 20 20 20 20 2f  e *fd          /
1d260 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c 64 69  * Database holdi
1d270 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6d 65  ng the shared me
1d280 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 55 4e 55  mory */.){.  UNU
1d290 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66 64  SED_PARAMETER(fd
1d2a0 29 3b 0a 20 20 2f 2a 20 4d 65 6d 6f 72 79 42 61  );.  /* MemoryBa
1d2b0 72 72 69 65 72 28 29 3b 20 2f 2f 20 64 6f 65 73  rrier(); // does
1d2c0 20 6e 6f 74 20 77 6f 72 6b 20 2d 2d 20 64 6f 20   not work -- do 
1d2d0 6e 6f 74 20 6b 6e 6f 77 20 77 68 79 20 6e 6f 74  not know why not
1d2e0 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 45 6e 74 65   */.  winShmEnte
1d2f0 72 4d 75 74 65 78 28 29 3b 0a 20 20 77 69 6e 53  rMutex();.  winS
1d300 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  hmLeaveMutex();.
1d310 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
1d320 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
1d330 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 70 6f 69   to obtain a poi
1d340 6e 74 65 72 20 74 6f 20 72 65 67 69 6f 6e 20 69  nter to region i
1d350 52 65 67 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a  Region of the.**
1d360 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61   shared-memory a
1d370 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
1d380 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1d390 20 66 64 2e 20 53 68 61 72 65 64 2d 6d 65 6d 6f   fd. Shared-memo
1d3a0 72 79 20 72 65 67 69 6f 6e 73 0a 2a 2a 20 61 72  ry regions.** ar
1d3b0 65 20 6e 75 6d 62 65 72 65 64 20 73 74 61 72 74  e numbered start
1d3c0 69 6e 67 20 66 72 6f 6d 20 7a 65 72 6f 2e 20 45  ing from zero. E
1d3d0 61 63 68 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  ach shared-memor
1d3e0 79 20 72 65 67 69 6f 6e 20 69 73 20 73 7a 52 65  y region is szRe
1d3f0 67 69 6f 6e 0a 2a 2a 20 62 79 74 65 73 20 69 6e  gion.** bytes in
1d400 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   size..**.** If 
1d410 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
1d420 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
1d430 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  s returned and *
1d440 70 70 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c  pp is set to NUL
1d450 4c 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  L..**.** Otherwi
1d460 73 65 2c 20 69 66 20 74 68 65 20 69 73 57 72 69  se, if the isWri
1d470 74 65 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  te parameter is 
1d480 30 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73  0 and the reques
1d490 74 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  ted shared-memor
1d4a0 79 0a 2a 2a 20 72 65 67 69 6f 6e 20 68 61 73 20  y.** region has 
1d4b0 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  not been allocat
1d4c0 65 64 20 28 62 79 20 61 6e 79 20 63 6c 69 65 6e  ed (by any clien
1d4d0 74 2c 20 69 6e 63 6c 75 64 69 6e 67 20 6f 6e 65  t, including one
1d4e0 20 72 75 6e 6e 69 6e 67 20 69 6e 20 61 0a 2a 2a   running in a.**
1d4f0 20 73 65 70 61 72 61 74 65 20 70 72 6f 63 65 73   separate proces
1d500 73 29 2c 20 74 68 65 6e 20 2a 70 70 20 69 73 20  s), then *pp is 
1d510 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20  set to NULL and 
1d520 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
1d530 65 64 2e 20 49 66 0a 2a 2a 20 69 73 57 72 69 74  ed. If.** isWrit
1d540 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e  e is non-zero an
1d550 64 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  d the requested 
1d560 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65  shared-memory re
1d570 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20 79 65 74  gion has not yet
1d580 0a 2a 2a 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  .** been allocat
1d590 65 64 2c 20 69 74 20 69 73 20 61 6c 6c 6f 63 61  ed, it is alloca
1d5a0 74 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ted by this func
1d5b0 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  tion..**.** If t
1d5c0 68 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  he shared-memory
1d5d0 20 72 65 67 69 6f 6e 20 68 61 73 20 61 6c 72 65   region has alre
1d5e0 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  ady been allocat
1d5f0 65 64 20 6f 72 20 69 73 20 61 6c 6c 6f 63 61 74  ed or is allocat
1d600 65 64 20 62 79 0a 2a 2a 20 74 68 69 73 20 63 61  ed by.** this ca
1d610 6c 6c 20 61 73 20 64 65 73 63 72 69 62 65 64 20  ll as described 
1d620 61 62 6f 76 65 2c 20 74 68 65 6e 20 69 74 20 69  above, then it i
1d630 73 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 74 68  s mapped into th
1d640 69 73 20 70 72 6f 63 65 73 73 65 73 0a 2a 2a 20  is processes.** 
1d650 61 64 64 72 65 73 73 20 73 70 61 63 65 20 28 69  address space (i
1d660 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65  f it is not alre
1d670 61 64 79 29 2c 20 2a 70 70 20 69 73 20 73 65 74  ady), *pp is set
1d680 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
1d690 20 6d 61 70 70 65 64 0a 2a 2a 20 6d 65 6d 6f 72   mapped.** memor
1d6a0 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  y and SQLITE_OK 
1d6b0 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
1d6c0 74 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 4d 61  tic int winShmMa
1d6d0 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  p(.  sqlite3_fil
1d6e0 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20  e *fd,          
1d6f0 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 6f       /* Handle o
1d700 70 65 6e 20 6f 6e 20 64 61 74 61 62 61 73 65 20  pen on database 
1d710 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52  file */.  int iR
1d720 65 67 69 6f 6e 2c 20 20 20 20 20 20 20 20 20 20  egion,          
1d730 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
1d740 69 6f 6e 20 74 6f 20 72 65 74 72 69 65 76 65 20  ion to retrieve 
1d750 2a 2f 0a 20 20 69 6e 74 20 73 7a 52 65 67 69 6f  */.  int szRegio
1d760 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
1d770 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1d780 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  regions */.  int
1d790 20 69 73 57 72 69 74 65 2c 20 20 20 20 20 20 20   isWrite,       
1d7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d7b0 54 72 75 65 20 74 6f 20 65 78 74 65 6e 64 20 66  True to extend f
1d7c0 69 6c 65 20 69 66 20 6e 65 63 65 73 73 61 72 79  ile if necessary
1d7d0 20 2a 2f 0a 20 20 76 6f 69 64 20 76 6f 6c 61 74   */.  void volat
1d7e0 69 6c 65 20 2a 2a 70 70 20 20 20 20 20 20 20 20  ile **pp        
1d7f0 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 61        /* OUT: Ma
1d800 70 70 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29  pped memory */.)
1d810 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 44 62  {.  winFile *pDb
1d820 46 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66  Fd = (winFile*)f
1d830 64 3b 0a 20 20 77 69 6e 53 68 6d 20 2a 70 20 3d  d;.  winShm *p =
1d840 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20   pDbFd->pShm;.  
1d850 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d  winShmNode *pShm
1d860 4e 6f 64 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d  Node;.  int rc =
1d870 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69   SQLITE_OK;..  i
1d880 66 28 20 21 70 20 29 7b 0a 20 20 20 20 72 63 20  f( !p ){.    rc 
1d890 3d 20 77 69 6e 4f 70 65 6e 53 68 61 72 65 64 4d  = winOpenSharedM
1d8a0 65 6d 6f 72 79 28 70 44 62 46 64 29 3b 0a 20 20  emory(pDbFd);.  
1d8b0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1d8c0 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
1d8d0 0a 20 20 20 20 70 20 3d 20 70 44 62 46 64 2d 3e  .    p = pDbFd->
1d8e0 70 53 68 6d 3b 0a 20 20 7d 0a 20 20 70 53 68 6d  pShm;.  }.  pShm
1d8f0 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f  Node = p->pShmNo
1d900 64 65 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 6d  de;..  sqlite3_m
1d910 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e  utex_enter(pShmN
1d920 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61  ode->mutex);.  a
1d930 73 73 65 72 74 28 20 73 7a 52 65 67 69 6f 6e 3d  ssert( szRegion=
1d940 3d 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67  =pShmNode->szReg
1d950 69 6f 6e 20 7c 7c 20 70 53 68 6d 4e 6f 64 65 2d  ion || pShmNode-
1d960 3e 6e 52 65 67 69 6f 6e 3d 3d 30 20 29 3b 0a 0a  >nRegion==0 );..
1d970 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e    if( pShmNode->
1d980 6e 52 65 67 69 6f 6e 3c 3d 69 52 65 67 69 6f 6e  nRegion<=iRegion
1d990 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53   ){.    struct S
1d9a0 68 6d 52 65 67 69 6f 6e 20 2a 61 70 4e 65 77 3b  hmRegion *apNew;
1d9b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
1d9c0 77 20 61 52 65 67 69 6f 6e 5b 5d 20 61 72 72 61  w aRegion[] arra
1d9d0 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79  y */.    int nBy
1d9e0 74 65 20 3d 20 28 69 52 65 67 69 6f 6e 2b 31 29  te = (iRegion+1)
1d9f0 2a 73 7a 52 65 67 69 6f 6e 3b 20 20 2f 2a 20 4d  *szRegion;  /* M
1da00 69 6e 69 6d 75 6d 20 72 65 71 75 69 72 65 64 20  inimum required 
1da10 66 69 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20  file size */.   
1da20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73   sqlite3_int64 s
1da30 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  z;              
1da40 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73      /* Current s
1da50 69 7a 65 20 6f 66 20 77 61 6c 2d 69 6e 64 65 78  ize of wal-index
1da60 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 70 53   file */..    pS
1da70 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f 6e  hmNode->szRegion
1da80 20 3d 20 73 7a 52 65 67 69 6f 6e 3b 0a 0a 20 20   = szRegion;..  
1da90 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74    /* The request
1daa0 65 64 20 72 65 67 69 6f 6e 20 69 73 20 6e 6f 74  ed region is not
1dab0 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 74 68 69   mapped into thi
1dac0 73 20 70 72 6f 63 65 73 73 65 73 20 61 64 64 72  s processes addr
1dad0 65 73 73 20 73 70 61 63 65 2e 0a 20 20 20 20 2a  ess space..    *
1dae0 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
1daf0 66 20 69 74 20 68 61 73 20 62 65 65 6e 20 61 6c  f it has been al
1db00 6c 6f 63 61 74 65 64 20 28 69 2e 65 2e 20 69 66  located (i.e. if
1db10 20 74 68 65 20 77 61 6c 2d 69 6e 64 65 78 20 66   the wal-index f
1db20 69 6c 65 20 69 73 0a 20 20 20 20 2a 2a 20 6c 61  ile is.    ** la
1db30 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 63 6f  rge enough to co
1db40 6e 74 61 69 6e 20 74 68 65 20 72 65 71 75 65 73  ntain the reques
1db50 74 65 64 20 72 65 67 69 6f 6e 29 2e 0a 20 20 20  ted region)..   
1db60 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 77 69 6e   */.    rc = win
1db70 46 69 6c 65 53 69 7a 65 28 28 73 71 6c 69 74 65  FileSize((sqlite
1db80 33 5f 66 69 6c 65 20 2a 29 26 70 53 68 6d 4e 6f  3_file *)&pShmNo
1db90 64 65 2d 3e 68 46 69 6c 65 2c 20 26 73 7a 29 3b  de->hFile, &sz);
1dba0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1dbb0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1dbc0 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72  rc = winLogError
1dbd0 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  (SQLITE_IOERR_SH
1dbe0 4d 53 49 5a 45 2c 20 6f 73 47 65 74 4c 61 73 74  MSIZE, osGetLast
1dbf0 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20  Error(),.       
1dc00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc10 22 77 69 6e 53 68 6d 4d 61 70 31 22 2c 20 70 44  "winShmMap1", pD
1dc20 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  bFd->zPath);.   
1dc30 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f     goto shmpage_
1dc40 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  out;.    }..    
1dc50 69 66 28 20 73 7a 3c 6e 42 79 74 65 20 29 7b 0a  if( sz<nByte ){.
1dc60 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71        /* The req
1dc70 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72 65  uested memory re
1dc80 67 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 65 78  gion does not ex
1dc90 69 73 74 2e 20 49 66 20 69 73 57 72 69 74 65 20  ist. If isWrite 
1dca0 69 73 20 73 65 74 20 74 6f 0a 20 20 20 20 20 20  is set to.      
1dcb0 2a 2a 20 7a 65 72 6f 2c 20 65 78 69 74 20 65 61  ** zero, exit ea
1dcc0 72 6c 79 2e 20 2a 70 70 20 77 69 6c 6c 20 62 65  rly. *pp will be
1dcd0 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64   set to NULL and
1dce0 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
1dcf0 6e 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ned..      **.  
1dd00 20 20 20 20 2a 2a 20 41 6c 74 65 72 6e 61 74 69      ** Alternati
1dd10 76 65 6c 79 2c 20 69 66 20 69 73 57 72 69 74 65  vely, if isWrite
1dd20 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 75 73   is non-zero, us
1dd30 65 20 66 74 72 75 6e 63 61 74 65 28 29 20 74 6f  e ftruncate() to
1dd40 20 61 6c 6c 6f 63 61 74 65 0a 20 20 20 20 20 20   allocate.      
1dd50 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ** the requested
1dd60 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 2e 0a   memory region..
1dd70 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
1dd80 66 28 20 21 69 73 57 72 69 74 65 20 29 20 67 6f  f( !isWrite ) go
1dd90 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a  to shmpage_out;.
1dda0 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 54 72        rc = winTr
1ddb0 75 6e 63 61 74 65 28 28 73 71 6c 69 74 65 33 5f  uncate((sqlite3_
1ddc0 66 69 6c 65 20 2a 29 26 70 53 68 6d 4e 6f 64 65  file *)&pShmNode
1ddd0 2d 3e 68 46 69 6c 65 2c 20 6e 42 79 74 65 29 3b  ->hFile, nByte);
1dde0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
1ddf0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1de00 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45      rc = winLogE
1de10 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
1de20 52 5f 53 48 4d 53 49 5a 45 2c 20 6f 73 47 65 74  R_SHMSIZE, osGet
1de30 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20  LastError(),.   
1de40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de50 20 20 20 20 20 20 22 77 69 6e 53 68 6d 4d 61 70        "winShmMap
1de60 32 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 68  2", pDbFd->zPath
1de70 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  );.        goto 
1de80 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20  shmpage_out;.   
1de90 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
1dea0 2f 2a 20 4d 61 70 20 74 68 65 20 72 65 71 75 65  /* Map the reque
1deb0 73 74 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69  sted memory regi
1dec0 6f 6e 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f  on into this pro
1ded0 63 65 73 73 65 73 20 61 64 64 72 65 73 73 20 73  cesses address s
1dee0 70 61 63 65 2e 20 2a 2f 0a 20 20 20 20 61 70 4e  pace. */.    apN
1def0 65 77 20 3d 20 28 73 74 72 75 63 74 20 53 68 6d  ew = (struct Shm
1df00 52 65 67 69 6f 6e 20 2a 29 73 71 6c 69 74 65 33  Region *)sqlite3
1df10 5f 72 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20  _realloc(.      
1df20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67    pShmNode->aReg
1df30 69 6f 6e 2c 20 28 69 52 65 67 69 6f 6e 2b 31 29  ion, (iRegion+1)
1df40 2a 73 69 7a 65 6f 66 28 61 70 4e 65 77 5b 30 5d  *sizeof(apNew[0]
1df50 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28  ).    );.    if(
1df60 20 21 61 70 4e 65 77 20 29 7b 0a 20 20 20 20 20   !apNew ){.     
1df70 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
1df80 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  RR_NOMEM;.      
1df90 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74  goto shmpage_out
1dfa0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 68 6d  ;.    }.    pShm
1dfb0 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 20 3d 20  Node->aRegion = 
1dfc0 61 70 4e 65 77 3b 0a 0a 20 20 20 20 77 68 69 6c  apNew;..    whil
1dfd0 65 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  e( pShmNode->nRe
1dfe0 67 69 6f 6e 3c 3d 69 52 65 67 69 6f 6e 20 29 7b  gion<=iRegion ){
1dff0 0a 20 20 20 20 20 20 48 41 4e 44 4c 45 20 68 4d  .      HANDLE hM
1e000 61 70 20 3d 20 4e 55 4c 4c 3b 20 20 20 20 20 20  ap = NULL;      
1e010 20 20 20 2f 2a 20 66 69 6c 65 2d 6d 61 70 70 69     /* file-mappi
1e020 6e 67 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 20  ng handle */.   
1e030 20 20 20 76 6f 69 64 20 2a 70 4d 61 70 20 3d 20     void *pMap = 
1e040 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
1e050 2a 20 4d 61 70 70 65 64 20 6d 65 6d 6f 72 79 20  * Mapped memory 
1e060 72 65 67 69 6f 6e 20 2a 2f 0a 0a 23 69 66 20 53  region */..#if S
1e070 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
1e080 20 20 20 20 20 68 4d 61 70 20 3d 20 6f 73 43 72       hMap = osCr
1e090 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 46  eateFileMappingF
1e0a0 72 6f 6d 41 70 70 28 70 53 68 6d 4e 6f 64 65 2d  romApp(pShmNode-
1e0b0 3e 68 46 69 6c 65 2e 68 2c 0a 20 20 20 20 20 20  >hFile.h,.      
1e0c0 20 20 20 20 4e 55 4c 4c 2c 20 50 41 47 45 5f 52      NULL, PAGE_R
1e0d0 45 41 44 57 52 49 54 45 2c 20 6e 42 79 74 65 2c  EADWRITE, nByte,
1e0e0 20 4e 55 4c 4c 0a 20 20 20 20 20 20 29 3b 0a 23   NULL.      );.#
1e0f0 65 6c 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  elif defined(SQL
1e100 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
1e110 44 45 29 0a 20 20 20 20 20 20 68 4d 61 70 20 3d  DE).      hMap =
1e120 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70   osCreateFileMap
1e130 70 69 6e 67 57 28 70 53 68 6d 4e 6f 64 65 2d 3e  pingW(pShmNode->
1e140 68 46 69 6c 65 2e 68 2c 0a 20 20 20 20 20 20 20  hFile.h,.       
1e150 20 20 20 4e 55 4c 4c 2c 20 50 41 47 45 5f 52 45     NULL, PAGE_RE
1e160 41 44 57 52 49 54 45 2c 20 30 2c 20 6e 42 79 74  ADWRITE, 0, nByt
1e170 65 2c 20 4e 55 4c 4c 0a 20 20 20 20 20 20 29 3b  e, NULL.      );
1e180 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 53  .#elif defined(S
1e190 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
1e1a0 41 4e 53 49 29 0a 20 20 20 20 20 20 68 4d 61 70  ANSI).      hMap
1e1b0 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d   = osCreateFileM
1e1c0 61 70 70 69 6e 67 41 28 70 53 68 6d 4e 6f 64 65  appingA(pShmNode
1e1d0 2d 3e 68 46 69 6c 65 2e 68 2c 0a 20 20 20 20 20  ->hFile.h,.     
1e1e0 20 20 20 20 20 4e 55 4c 4c 2c 20 50 41 47 45 5f       NULL, PAGE_
1e1f0 52 45 41 44 57 52 49 54 45 2c 20 30 2c 20 6e 42  READWRITE, 0, nB
1e200 79 74 65 2c 20 4e 55 4c 4c 0a 20 20 20 20 20 20  yte, NULL.      
1e210 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
1e220 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4d 41  OSTRACE(("SHM-MA
1e230 50 2d 43 52 45 41 54 45 20 70 69 64 3d 25 6c 75  P-CREATE pid=%lu
1e240 2c 20 72 65 67 69 6f 6e 3d 25 64 2c 20 73 69 7a  , region=%d, siz
1e250 65 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a  e=%d, rc=%s\n",.
1e260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
1e270 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
1e280 73 73 49 64 28 29 2c 20 70 53 68 6d 4e 6f 64 65  ssId(), pShmNode
1e290 2d 3e 6e 52 65 67 69 6f 6e 2c 20 6e 42 79 74 65  ->nRegion, nByte
1e2a0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1e2b0 20 68 4d 61 70 20 3f 20 22 6f 6b 22 20 3a 20 22   hMap ? "ok" : "
1e2c0 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20 20 20  failed"));.     
1e2d0 20 69 66 28 20 68 4d 61 70 20 29 7b 0a 20 20 20   if( hMap ){.   
1e2e0 20 20 20 20 20 69 6e 74 20 69 4f 66 66 73 65 74       int iOffset
1e2f0 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65   = pShmNode->nRe
1e300 67 69 6f 6e 2a 73 7a 52 65 67 69 6f 6e 3b 0a 20  gion*szRegion;. 
1e310 20 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66 73         int iOffs
1e320 65 74 53 68 69 66 74 20 3d 20 69 4f 66 66 73 65  etShift = iOffse
1e330 74 20 25 20 77 69 6e 53 79 73 49 6e 66 6f 2e 64  t % winSysInfo.d
1e340 77 41 6c 6c 6f 63 61 74 69 6f 6e 47 72 61 6e 75  wAllocationGranu
1e350 6c 61 72 69 74 79 3b 0a 23 69 66 20 53 51 4c 49  larity;.#if SQLI
1e360 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20  TE_OS_WINRT.    
1e370 20 20 20 20 70 4d 61 70 20 3d 20 6f 73 4d 61 70      pMap = osMap
1e380 56 69 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70  ViewOfFileFromAp
1e390 70 28 68 4d 61 70 2c 20 46 49 4c 45 5f 4d 41 50  p(hMap, FILE_MAP
1e3a0 5f 57 52 49 54 45 20 7c 20 46 49 4c 45 5f 4d 41  _WRITE | FILE_MA
1e3b0 50 5f 52 45 41 44 2c 0a 20 20 20 20 20 20 20 20  P_READ,.        
1e3c0 20 20 20 20 69 4f 66 66 73 65 74 20 2d 20 69 4f      iOffset - iO
1e3d0 66 66 73 65 74 53 68 69 66 74 2c 20 73 7a 52 65  ffsetShift, szRe
1e3e0 67 69 6f 6e 20 2b 20 69 4f 66 66 73 65 74 53 68  gion + iOffsetSh
1e3f0 69 66 74 0a 20 20 20 20 20 20 20 20 29 3b 0a 23  ift.        );.#
1e400 65 6c 73 65 0a 20 20 20 20 20 20 20 20 70 4d 61  else.        pMa
1e410 70 20 3d 20 6f 73 4d 61 70 56 69 65 77 4f 66 46  p = osMapViewOfF
1e420 69 6c 65 28 68 4d 61 70 2c 20 46 49 4c 45 5f 4d  ile(hMap, FILE_M
1e430 41 50 5f 57 52 49 54 45 20 7c 20 46 49 4c 45 5f  AP_WRITE | FILE_
1e440 4d 41 50 5f 52 45 41 44 2c 0a 20 20 20 20 20 20  MAP_READ,.      
1e450 20 20 20 20 20 20 30 2c 20 69 4f 66 66 73 65 74        0, iOffset
1e460 20 2d 20 69 4f 66 66 73 65 74 53 68 69 66 74 2c   - iOffsetShift,
1e470 20 73 7a 52 65 67 69 6f 6e 20 2b 20 69 4f 66 66   szRegion + iOff
1e480 73 65 74 53 68 69 66 74 0a 20 20 20 20 20 20 20  setShift.       
1e490 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20   );.#endif.     
1e4a0 20 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d     OSTRACE(("SHM
1e4b0 2d 4d 41 50 2d 4d 41 50 20 70 69 64 3d 25 6c 75  -MAP-MAP pid=%lu
1e4c0 2c 20 72 65 67 69 6f 6e 3d 25 64 2c 20 6f 66 66  , region=%d, off
1e4d0 73 65 74 3d 25 64 2c 20 73 69 7a 65 3d 25 64 2c  set=%d, size=%d,
1e4e0 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20   rc=%s\n",.     
1e4f0 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65              osGe
1e500 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
1e510 64 28 29 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  d(), pShmNode->n
1e520 52 65 67 69 6f 6e 2c 20 69 4f 66 66 73 65 74 2c  Region, iOffset,
1e530 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1e540 20 20 73 7a 52 65 67 69 6f 6e 2c 20 70 4d 61 70    szRegion, pMap
1e550 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65   ? "ok" : "faile
1e560 64 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  d"));.      }.  
1e570 20 20 20 20 69 66 28 20 21 70 4d 61 70 20 29 7b      if( !pMap ){
1e580 0a 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64  .        pShmNod
1e590 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f  e->lastErrno = o
1e5a0 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b  sGetLastError();
1e5b0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 69  .        rc = wi
1e5c0 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
1e5d0 5f 49 4f 45 52 52 5f 53 48 4d 4d 41 50 2c 20 70  _IOERR_SHMMAP, p
1e5e0 53 68 6d 4e 6f 64 65 2d 3e 6c 61 73 74 45 72 72  ShmNode->lastErr
1e5f0 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
1e600 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
1e610 6e 53 68 6d 4d 61 70 33 22 2c 20 70 44 62 46 64  nShmMap3", pDbFd
1e620 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20  ->zPath);.      
1e630 20 20 69 66 28 20 68 4d 61 70 20 29 20 6f 73 43    if( hMap ) osC
1e640 6c 6f 73 65 48 61 6e 64 6c 65 28 68 4d 61 70 29  loseHandle(hMap)
1e650 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73  ;.        goto s
1e660 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  hmpage_out;.    
1e670 20 20 7d 0a 0a 20 20 20 20 20 20 70 53 68 6d 4e    }..      pShmN
1e680 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 5b 70 53 68  ode->aRegion[pSh
1e690 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 5d 2e  mNode->nRegion].
1e6a0 70 4d 61 70 20 3d 20 70 4d 61 70 3b 0a 20 20 20  pMap = pMap;.   
1e6b0 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65     pShmNode->aRe
1e6c0 67 69 6f 6e 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e  gion[pShmNode->n
1e6d0 52 65 67 69 6f 6e 5d 2e 68 4d 61 70 20 3d 20 68  Region].hMap = h
1e6e0 4d 61 70 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e  Map;.      pShmN
1e6f0 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2b 2b 3b 0a  ode->nRegion++;.
1e700 20 20 20 20 7d 0a 20 20 7d 0a 0a 73 68 6d 70 61      }.  }..shmpa
1e710 67 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20 70 53  ge_out:.  if( pS
1e720 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3e  hmNode->nRegion>
1e730 69 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 69  iRegion ){.    i
1e740 6e 74 20 69 4f 66 66 73 65 74 20 3d 20 69 52 65  nt iOffset = iRe
1e750 67 69 6f 6e 2a 73 7a 52 65 67 69 6f 6e 3b 0a 20  gion*szRegion;. 
1e760 20 20 20 69 6e 74 20 69 4f 66 66 73 65 74 53 68     int iOffsetSh
1e770 69 66 74 20 3d 20 69 4f 66 66 73 65 74 20 25 20  ift = iOffset % 
1e780 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77 41 6c 6c  winSysInfo.dwAll
1e790 6f 63 61 74 69 6f 6e 47 72 61 6e 75 6c 61 72 69  ocationGranulari
1e7a0 74 79 3b 0a 20 20 20 20 63 68 61 72 20 2a 70 20  ty;.    char *p 
1e7b0 3d 20 28 63 68 61 72 20 2a 29 70 53 68 6d 4e 6f  = (char *)pShmNo
1e7c0 64 65 2d 3e 61 52 65 67 69 6f 6e 5b 69 52 65 67  de->aRegion[iReg
1e7d0 69 6f 6e 5d 2e 70 4d 61 70 3b 0a 20 20 20 20 2a  ion].pMap;.    *
1e7e0 70 70 20 3d 20 28 76 6f 69 64 20 2a 29 26 70 5b  pp = (void *)&p[
1e7f0 69 4f 66 66 73 65 74 53 68 69 66 74 5d 3b 0a 20  iOffsetShift];. 
1e800 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 20   }else{.    *pp 
1e810 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  = 0;.  }.  sqlit
1e820 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70  e3_mutex_leave(p
1e830 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b  ShmNode->mutex);
1e840 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1e850 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
1e860 77 69 6e 53 68 6d 4d 61 70 20 20 20 20 20 30 0a  winShmMap     0.
1e870 23 20 64 65 66 69 6e 65 20 77 69 6e 53 68 6d 4c  # define winShmL
1e880 6f 63 6b 20 20 20 20 30 0a 23 20 64 65 66 69 6e  ock    0.# defin
1e890 65 20 77 69 6e 53 68 6d 42 61 72 72 69 65 72 20  e winShmBarrier 
1e8a0 30 0a 23 20 64 65 66 69 6e 65 20 77 69 6e 53 68  0.# define winSh
1e8b0 6d 55 6e 6d 61 70 20 20 20 30 0a 23 65 6e 64 69  mUnmap   0.#endi
1e8c0 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c  f /* #ifndef SQL
1e8d0 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a  ITE_OMIT_WAL */.
1e8e0 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 73 20 75 70  ./*.** Cleans up
1e8f0 20 74 68 65 20 6d 61 70 70 65 64 20 72 65 67 69   the mapped regi
1e900 6f 6e 20 6f 66 20 74 68 65 20 73 70 65 63 69 66  on of the specif
1e910 69 65 64 20 66 69 6c 65 2c 20 69 66 20 61 6e 79  ied file, if any
1e920 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  ..*/.#if SQLITE_
1e930 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
1e940 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 55 6e  static int winUn
1e950 6d 61 70 66 69 6c 65 28 77 69 6e 46 69 6c 65 20  mapfile(winFile 
1e960 2a 70 46 69 6c 65 29 7b 0a 20 20 61 73 73 65 72  *pFile){.  asser
1e970 74 28 20 70 46 69 6c 65 21 3d 30 20 29 3b 0a 20  t( pFile!=0 );. 
1e980 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4d 41 50   OSTRACE(("UNMAP
1e990 2d 46 49 4c 45 20 70 69 64 3d 25 6c 75 2c 20 70  -FILE pid=%lu, p
1e9a0 46 69 6c 65 3d 25 70 2c 20 68 4d 61 70 3d 25 70  File=%p, hMap=%p
1e9b0 2c 20 70 4d 61 70 52 65 67 69 6f 6e 3d 25 70 2c  , pMapRegion=%p,
1e9c0 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 22 6d   ".           "m
1e9d0 6d 61 70 53 69 7a 65 3d 25 6c 6c 64 2c 20 6d 6d  mapSize=%lld, mm
1e9e0 61 70 53 69 7a 65 41 63 74 75 61 6c 3d 25 6c 6c  apSizeActual=%ll
1e9f0 64 2c 20 6d 6d 61 70 53 69 7a 65 4d 61 78 3d 25  d, mmapSizeMax=%
1ea00 6c 6c 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  lld\n",.        
1ea10 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50     osGetCurrentP
1ea20 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c  rocessId(), pFil
1ea30 65 2c 20 70 46 69 6c 65 2d 3e 68 4d 61 70 2c 20  e, pFile->hMap, 
1ea40 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f  pFile->pMapRegio
1ea50 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46  n,.           pF
1ea60 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 2c 20 70  ile->mmapSize, p
1ea70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 41 63  File->mmapSizeAc
1ea80 74 75 61 6c 2c 20 70 46 69 6c 65 2d 3e 6d 6d 61  tual, pFile->mma
1ea90 70 53 69 7a 65 4d 61 78 29 29 3b 0a 20 20 69 66  pSizeMax));.  if
1eaa0 28 20 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67  ( pFile->pMapReg
1eab0 69 6f 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 21  ion ){.    if( !
1eac0 6f 73 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c  osUnmapViewOfFil
1ead0 65 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67  e(pFile->pMapReg
1eae0 69 6f 6e 29 20 29 7b 0a 20 20 20 20 20 20 70 46  ion) ){.      pF
1eaf0 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
1eb00 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
1eb10 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  );.      OSTRACE
1eb20 28 28 22 55 4e 4d 41 50 2d 46 49 4c 45 20 70 69  (("UNMAP-FILE pi
1eb30 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c  d=%lu, pFile=%p,
1eb40 20 70 4d 61 70 52 65 67 69 6f 6e 3d 25 70 2c 20   pMapRegion=%p, 
1eb50 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
1eb60 20 22 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52   "rc=SQLITE_IOER
1eb70 52 5f 4d 4d 41 50 5c 6e 22 2c 20 6f 73 47 65 74  R_MMAP\n", osGet
1eb80 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
1eb90 28 29 2c 20 70 46 69 6c 65 2c 0a 20 20 20 20 20  (), pFile,.     
1eba0 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
1ebb0 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29 3b 0a 20  >pMapRegion));. 
1ebc0 20 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c       return winL
1ebd0 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
1ebe0 4f 45 52 52 5f 4d 4d 41 50 2c 20 70 46 69 6c 65  OERR_MMAP, pFile
1ebf0 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20  ->lastErrno,.   
1ec00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec10 20 20 20 20 20 20 22 77 69 6e 55 6e 6d 61 70 66        "winUnmapf
1ec20 69 6c 65 31 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  ile1", pFile->zP
1ec30 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ath);.    }.    
1ec40 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f  pFile->pMapRegio
1ec50 6e 20 3d 20 30 3b 0a 20 20 20 20 70 46 69 6c 65  n = 0;.    pFile
1ec60 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d 20 30 3b 0a  ->mmapSize = 0;.
1ec70 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53      pFile->mmapS
1ec80 69 7a 65 41 63 74 75 61 6c 20 3d 20 30 3b 0a 20  izeActual = 0;. 
1ec90 20 7d 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e   }.  if( pFile->
1eca0 68 4d 61 70 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20  hMap!=NULL ){.  
1ecb0 20 20 69 66 28 20 21 6f 73 43 6c 6f 73 65 48 61    if( !osCloseHa
1ecc0 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 4d 61 70  ndle(pFile->hMap
1ecd0 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  ) ){.      pFile
1ece0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73  ->lastErrno = os
1ecf0 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
1ed00 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
1ed10 55 4e 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d 25  UNMAP-FILE pid=%
1ed20 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 68 4d  lu, pFile=%p, hM
1ed30 61 70 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  ap=%p, rc=SQLITE
1ed40 5f 49 4f 45 52 52 5f 4d 4d 41 50 5c 6e 22 2c 0a  _IOERR_MMAP\n",.
1ed50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
1ed60 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
1ed70 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 20 70  ssId(), pFile, p
1ed80 46 69 6c 65 2d 3e 68 4d 61 70 29 29 3b 0a 20 20  File->hMap));.  
1ed90 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f      return winLo
1eda0 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
1edb0 45 52 52 5f 4d 4d 41 50 2c 20 70 46 69 6c 65 2d  ERR_MMAP, pFile-
1edc0 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20  >lastErrno,.    
1edd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ede0 20 20 20 20 20 22 77 69 6e 55 6e 6d 61 70 66 69       "winUnmapfi
1edf0 6c 65 32 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61  le2", pFile->zPa
1ee00 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  th);.    }.    p
1ee10 46 69 6c 65 2d 3e 68 4d 61 70 20 3d 20 4e 55 4c  File->hMap = NUL
1ee20 4c 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45  L;.  }.  OSTRACE
1ee30 28 28 22 55 4e 4d 41 50 2d 46 49 4c 45 20 70 69  (("UNMAP-FILE pi
1ee40 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c  d=%lu, pFile=%p,
1ee50 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22   rc=SQLITE_OK\n"
1ee60 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 47  ,.           osG
1ee70 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
1ee80 49 64 28 29 2c 20 70 46 69 6c 65 29 29 3b 0a 20  Id(), pFile));. 
1ee90 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1eea0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 6d 6f  K;.}../*.** Memo
1eeb0 72 79 20 6d 61 70 20 6f 72 20 72 65 6d 61 70 20  ry map or remap 
1eec0 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 20  the file opened 
1eed0 62 79 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74  by file-descript
1eee0 6f 72 20 70 46 64 20 28 69 66 20 74 68 65 20 66  or pFd (if the f
1eef0 69 6c 65 0a 2a 2a 20 69 73 20 61 6c 72 65 61 64  ile.** is alread
1ef00 79 20 6d 61 70 70 65 64 2c 20 74 68 65 20 65 78  y mapped, the ex
1ef10 69 73 74 69 6e 67 20 6d 61 70 70 69 6e 67 20 69  isting mapping i
1ef20 73 20 72 65 70 6c 61 63 65 64 20 62 79 20 74 68  s replaced by th
1ef30 65 20 6e 65 77 29 2e 20 4f 72 2c 20 69 66 0a 2a  e new). Or, if.*
1ef40 2a 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 20  * there already 
1ef50 65 78 69 73 74 73 20 61 20 6d 61 70 70 69 6e 67  exists a mapping
1ef60 20 66 6f 72 20 74 68 69 73 20 66 69 6c 65 2c 20   for this file, 
1ef70 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 73 74  and there are st
1ef80 69 6c 6c 0a 2a 2a 20 6f 75 74 73 74 61 6e 64 69  ill.** outstandi
1ef90 6e 67 20 78 46 65 74 63 68 28 29 20 72 65 66 65  ng xFetch() refe
1efa0 72 65 6e 63 65 73 20 74 6f 20 69 74 2c 20 74 68  rences to it, th
1efb0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
1efc0 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66   no-op..**.** If
1efd0 20 70 61 72 61 6d 65 74 65 72 20 6e 42 79 74 65   parameter nByte
1efe0 20 69 73 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65   is non-negative
1eff0 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74 68 65  , then it is the
1f000 20 72 65 71 75 65 73 74 65 64 20 73 69 7a 65 20   requested size 
1f010 6f 66 0a 2a 2a 20 74 68 65 20 6d 61 70 70 69 6e  of.** the mappin
1f020 67 20 74 6f 20 63 72 65 61 74 65 2e 20 4f 74 68  g to create. Oth
1f030 65 72 77 69 73 65 2c 20 69 66 20 6e 42 79 74 65  erwise, if nByte
1f040 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65   is less than ze
1f050 72 6f 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20  ro, then the.** 
1f060 72 65 71 75 65 73 74 65 64 20 73 69 7a 65 20 69  requested size i
1f070 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  s the size of th
1f080 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20  e file on disk. 
1f090 54 68 65 20 61 63 74 75 61 6c 20 73 69 7a 65 20  The actual size 
1f0a0 6f 66 20 74 68 65 0a 2a 2a 20 63 72 65 61 74 65  of the.** create
1f0b0 64 20 6d 61 70 70 69 6e 67 20 69 73 20 65 69 74  d mapping is eit
1f0c0 68 65 72 20 74 68 65 20 72 65 71 75 65 73 74 65  her the requeste
1f0d0 64 20 73 69 7a 65 20 6f 72 20 74 68 65 20 76 61  d size or the va
1f0e0 6c 75 65 20 63 6f 6e 66 69 67 75 72 65 64 0a 2a  lue configured.*
1f0f0 2a 20 75 73 69 6e 67 20 53 51 4c 49 54 45 5f 46  * using SQLITE_F
1f100 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 2c 20  CNTL_MMAP_SIZE, 
1f110 77 68 69 63 68 65 76 65 72 20 69 73 20 73 6d 61  whichever is sma
1f120 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49  ller..**.** SQLI
1f130 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
1f140 64 20 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63  d if no error oc
1f150 63 75 72 73 20 28 65 76 65 6e 20 69 66 20 74 68  curs (even if th
1f160 65 20 6d 61 70 70 69 6e 67 20 69 73 20 6e 6f 74  e mapping is not
1f170 0a 2a 2a 20 72 65 63 72 65 61 74 65 64 20 61 73  .** recreated as
1f180 20 61 20 72 65 73 75 6c 74 20 6f 66 20 6f 75 74   a result of out
1f190 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e  standing referen
1f1a0 63 65 73 29 20 6f 72 20 61 6e 20 53 51 4c 69 74  ces) or an SQLit
1f1b0 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20  e error.** code 
1f1c0 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74  otherwise..*/.st
1f1d0 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 61 70 66  atic int winMapf
1f1e0 69 6c 65 28 77 69 6e 46 69 6c 65 20 2a 70 46 64  ile(winFile *pFd
1f1f0 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  , sqlite3_int64 
1f200 6e 42 79 74 65 29 7b 0a 20 20 73 71 6c 69 74 65  nByte){.  sqlite
1f210 33 5f 69 6e 74 36 34 20 6e 4d 61 70 20 3d 20 6e  3_int64 nMap = n
1f220 42 79 74 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  Byte;.  int rc;.
1f230 0a 20 20 61 73 73 65 72 74 28 20 6e 4d 61 70 3e  .  assert( nMap>
1f240 3d 30 20 7c 7c 20 70 46 64 2d 3e 6e 46 65 74 63  =0 || pFd->nFetc
1f250 68 4f 75 74 3d 3d 30 20 29 3b 0a 20 20 4f 53 54  hOut==0 );.  OST
1f260 52 41 43 45 28 28 22 4d 41 50 2d 46 49 4c 45 20  RACE(("MAP-FILE 
1f270 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25  pid=%lu, pFile=%
1f280 70 2c 20 73 69 7a 65 3d 25 6c 6c 64 5c 6e 22 2c  p, size=%lld\n",
1f290 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65  .           osGe
1f2a0 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
1f2b0 64 28 29 2c 20 70 46 64 2c 20 6e 42 79 74 65 29  d(), pFd, nByte)
1f2c0 29 3b 0a 0a 20 20 69 66 28 20 70 46 64 2d 3e 6e  );..  if( pFd->n
1f2d0 46 65 74 63 68 4f 75 74 3e 30 20 29 20 72 65 74  FetchOut>0 ) ret
1f2e0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  urn SQLITE_OK;..
1f2f0 20 20 69 66 28 20 6e 4d 61 70 3c 30 20 29 7b 0a    if( nMap<0 ){.
1f300 20 20 20 20 72 63 20 3d 20 77 69 6e 46 69 6c 65      rc = winFile
1f310 53 69 7a 65 28 28 73 71 6c 69 74 65 33 5f 66 69  Size((sqlite3_fi
1f320 6c 65 2a 29 70 46 64 2c 20 26 6e 4d 61 70 29 3b  le*)pFd, &nMap);
1f330 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
1f340 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4d       OSTRACE(("M
1f350 41 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c 75 2c  AP-FILE pid=%lu,
1f360 20 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51   pFile=%p, rc=SQ
1f370 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54  LITE_IOERR_FSTAT
1f380 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
1f390 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74      osGetCurrent
1f3a0 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 64  ProcessId(), pFd
1f3b0 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
1f3c0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53   SQLITE_IOERR_FS
1f3d0 54 41 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  TAT;.    }.  }. 
1f3e0 20 69 66 28 20 6e 4d 61 70 3e 70 46 64 2d 3e 6d   if( nMap>pFd->m
1f3f0 6d 61 70 53 69 7a 65 4d 61 78 20 29 7b 0a 20 20  mapSizeMax ){.  
1f400 20 20 6e 4d 61 70 20 3d 20 70 46 64 2d 3e 6d 6d    nMap = pFd->mm
1f410 61 70 53 69 7a 65 4d 61 78 3b 0a 20 20 7d 0a 20  apSizeMax;.  }. 
1f420 20 6e 4d 61 70 20 26 3d 20 7e 28 73 71 6c 69 74   nMap &= ~(sqlit
1f430 65 33 5f 69 6e 74 36 34 29 28 77 69 6e 53 79 73  e3_int64)(winSys
1f440 49 6e 66 6f 2e 64 77 50 61 67 65 53 69 7a 65 20  Info.dwPageSize 
1f450 2d 20 31 29 3b 0a 0a 20 20 69 66 28 20 6e 4d 61  - 1);..  if( nMa
1f460 70 3d 3d 30 20 26 26 20 70 46 64 2d 3e 6d 6d 61  p==0 && pFd->mma
1f470 70 53 69 7a 65 3e 30 20 29 7b 0a 20 20 20 20 77  pSize>0 ){.    w
1f480 69 6e 55 6e 6d 61 70 66 69 6c 65 28 70 46 64 29  inUnmapfile(pFd)
1f490 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4d 61 70  ;.  }.  if( nMap
1f4a0 21 3d 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20  !=pFd->mmapSize 
1f4b0 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4e 65  ){.    void *pNe
1f4c0 77 20 3d 20 30 3b 0a 20 20 20 20 44 57 4f 52 44  w = 0;.    DWORD
1f4d0 20 70 72 6f 74 65 63 74 20 3d 20 50 41 47 45 5f   protect = PAGE_
1f4e0 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 44 57  READONLY;.    DW
1f4f0 4f 52 44 20 66 6c 61 67 73 20 3d 20 46 49 4c 45  ORD flags = FILE
1f500 5f 4d 41 50 5f 52 45 41 44 3b 0a 0a 20 20 20 20  _MAP_READ;..    
1f510 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28 70 46 64  winUnmapfile(pFd
1f520 29 3b 0a 20 20 20 20 69 66 28 20 28 70 46 64 2d  );.    if( (pFd-
1f530 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 57 49 4e  >ctrlFlags & WIN
1f540 46 49 4c 45 5f 52 44 4f 4e 4c 59 29 3d 3d 30 20  FILE_RDONLY)==0 
1f550 29 7b 0a 20 20 20 20 20 20 70 72 6f 74 65 63 74  ){.      protect
1f560 20 3d 20 50 41 47 45 5f 52 45 41 44 57 52 49 54   = PAGE_READWRIT
1f570 45 3b 0a 20 20 20 20 20 20 66 6c 61 67 73 20 7c  E;.      flags |
1f580 3d 20 46 49 4c 45 5f 4d 41 50 5f 57 52 49 54 45  = FILE_MAP_WRITE
1f590 3b 0a 20 20 20 20 7d 0a 23 69 66 20 53 51 4c 49  ;.    }.#if SQLI
1f5a0 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20  TE_OS_WINRT.    
1f5b0 70 46 64 2d 3e 68 4d 61 70 20 3d 20 6f 73 43 72  pFd->hMap = osCr
1f5c0 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 46  eateFileMappingF
1f5d0 72 6f 6d 41 70 70 28 70 46 64 2d 3e 68 2c 20 4e  romApp(pFd->h, N
1f5e0 55 4c 4c 2c 20 70 72 6f 74 65 63 74 2c 20 6e 4d  ULL, protect, nM
1f5f0 61 70 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6c 69 66  ap, NULL);.#elif
1f600 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1f610 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a  WIN32_HAS_WIDE).
1f620 20 20 20 20 70 46 64 2d 3e 68 4d 61 70 20 3d 20      pFd->hMap = 
1f630 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70  osCreateFileMapp
1f640 69 6e 67 57 28 70 46 64 2d 3e 68 2c 20 4e 55 4c  ingW(pFd->h, NUL
1f650 4c 2c 20 70 72 6f 74 65 63 74 2c 0a 20 20 20 20  L, protect,.    
1f660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f670 20 20 20 20 20 20 20 20 20 20 20 20 28 44 57 4f              (DWO
1f680 52 44 29 28 28 6e 4d 61 70 3e 3e 33 32 29 20 26  RD)((nMap>>32) &
1f690 20 30 78 66 66 66 66 66 66 66 66 29 2c 0a 20 20   0xffffffff),.  
1f6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 44                (D
1f6c0 57 4f 52 44 29 28 6e 4d 61 70 20 26 20 30 78 66  WORD)(nMap & 0xf
1f6d0 66 66 66 66 66 66 66 29 2c 20 4e 55 4c 4c 29 3b  fffffff), NULL);
1f6e0 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 53  .#elif defined(S
1f6f0 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
1f700 41 4e 53 49 29 0a 20 20 20 20 70 46 64 2d 3e 68  ANSI).    pFd->h
1f710 4d 61 70 20 3d 20 6f 73 43 72 65 61 74 65 46 69  Map = osCreateFi
1f720 6c 65 4d 61 70 70 69 6e 67 41 28 70 46 64 2d 3e  leMappingA(pFd->
1f730 68 2c 20 4e 55 4c 4c 2c 20 70 72 6f 74 65 63 74  h, NULL, protect
1f740 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1f750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f760 20 20 28 44 57 4f 52 44 29 28 28 6e 4d 61 70 3e    (DWORD)((nMap>
1f770 3e 33 32 29 20 26 20 30 78 66 66 66 66 66 66 66  >32) & 0xfffffff
1f780 66 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  f),.            
1f790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f7a0 20 20 20 20 28 44 57 4f 52 44 29 28 6e 4d 61 70      (DWORD)(nMap
1f7b0 20 26 20 30 78 66 66 66 66 66 66 66 66 29 2c 20   & 0xffffffff), 
1f7c0 4e 55 4c 4c 29 3b 0a 23 65 6e 64 69 66 0a 20 20  NULL);.#endif.  
1f7d0 20 20 69 66 28 20 70 46 64 2d 3e 68 4d 61 70 3d    if( pFd->hMap=
1f7e0 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 70  =NULL ){.      p
1f7f0 46 64 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  Fd->lastErrno = 
1f800 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
1f810 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e  ;.      rc = win
1f820 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
1f830 49 4f 45 52 52 5f 4d 4d 41 50 2c 20 70 46 64 2d  IOERR_MMAP, pFd-
1f840 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20  >lastErrno,.    
1f850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f860 20 20 20 22 77 69 6e 4d 61 70 66 69 6c 65 31 22     "winMapfile1"
1f870 2c 20 70 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20  , pFd->zPath);. 
1f880 20 20 20 20 20 2f 2a 20 4c 6f 67 20 74 68 65 20       /* Log the 
1f890 65 72 72 6f 72 2c 20 62 75 74 20 63 6f 6e 74 69  error, but conti
1f8a0 6e 75 65 20 6e 6f 72 6d 61 6c 20 6f 70 65 72 61  nue normal opera
1f8b0 74 69 6f 6e 20 75 73 69 6e 67 20 78 52 65 61 64  tion using xRead
1f8c0 2f 78 57 72 69 74 65 20 2a 2f 0a 20 20 20 20 20  /xWrite */.     
1f8d0 20 4f 53 54 52 41 43 45 28 28 22 4d 41 50 2d 46   OSTRACE(("MAP-F
1f8e0 49 4c 45 2d 43 52 45 41 54 45 20 70 69 64 3d 25  ILE-CREATE pid=%
1f8f0 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72 63  lu, pFile=%p, rc
1f900 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%s\n",.        
1f910 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72         osGetCurr
1f920 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
1f930 70 46 64 2c 20 73 71 6c 69 74 65 33 45 72 72 4e  pFd, sqlite3ErrN
1f940 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 20 20 20  ame(rc)));.     
1f950 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1f960 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  K;.    }.    ass
1f970 65 72 74 28 20 28 6e 4d 61 70 20 25 20 77 69 6e  ert( (nMap % win
1f980 53 79 73 49 6e 66 6f 2e 64 77 50 61 67 65 53 69  SysInfo.dwPageSi
1f990 7a 65 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  ze)==0 );.    as
1f9a0 73 65 72 74 28 20 73 69 7a 65 6f 66 28 53 49 5a  sert( sizeof(SIZ
1f9b0 45 5f 54 29 3d 3d 73 69 7a 65 6f 66 28 73 71 6c  E_T)==sizeof(sql
1f9c0 69 74 65 33 5f 69 6e 74 36 34 29 20 7c 7c 20 6e  ite3_int64) || n
1f9d0 4d 61 70 3c 3d 30 78 66 66 66 66 66 66 66 66 20  Map<=0xffffffff 
1f9e0 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  );.#if SQLITE_OS
1f9f0 5f 57 49 4e 52 54 0a 20 20 20 20 70 4e 65 77 20  _WINRT.    pNew 
1fa00 3d 20 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 6c  = osMapViewOfFil
1fa10 65 46 72 6f 6d 41 70 70 28 70 46 64 2d 3e 68 4d  eFromApp(pFd->hM
1fa20 61 70 2c 20 66 6c 61 67 73 2c 20 30 2c 20 28 53  ap, flags, 0, (S
1fa30 49 5a 45 5f 54 29 6e 4d 61 70 29 3b 0a 23 65 6c  IZE_T)nMap);.#el
1fa40 73 65 0a 20 20 20 20 70 4e 65 77 20 3d 20 6f 73  se.    pNew = os
1fa50 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 28 70 46  MapViewOfFile(pF
1fa60 64 2d 3e 68 4d 61 70 2c 20 66 6c 61 67 73 2c 20  d->hMap, flags, 
1fa70 30 2c 20 30 2c 20 28 53 49 5a 45 5f 54 29 6e 4d  0, 0, (SIZE_T)nM
1fa80 61 70 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  ap);.#endif.    
1fa90 69 66 28 20 70 4e 65 77 3d 3d 4e 55 4c 4c 20 29  if( pNew==NULL )
1faa0 7b 0a 20 20 20 20 20 20 6f 73 43 6c 6f 73 65 48  {.      osCloseH
1fab0 61 6e 64 6c 65 28 70 46 64 2d 3e 68 4d 61 70 29  andle(pFd->hMap)
1fac0 3b 0a 20 20 20 20 20 20 70 46 64 2d 3e 68 4d 61  ;.      pFd->hMa
1fad0 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 20 20  p = NULL;.      
1fae0 70 46 64 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  pFd->lastErrno =
1faf0 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
1fb00 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69  );.      rc = wi
1fb10 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
1fb20 5f 49 4f 45 52 52 5f 4d 4d 41 50 2c 20 70 46 64  _IOERR_MMAP, pFd
1fb30 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20  ->lastErrno,.   
1fb40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb50 20 20 20 20 22 77 69 6e 4d 61 70 66 69 6c 65 32      "winMapfile2
1fb60 22 2c 20 70 46 64 2d 3e 7a 50 61 74 68 29 3b 0a  ", pFd->zPath);.
1fb70 20 20 20 20 20 20 2f 2a 20 4c 6f 67 20 74 68 65        /* Log the
1fb80 20 65 72 72 6f 72 2c 20 62 75 74 20 63 6f 6e 74   error, but cont
1fb90 69 6e 75 65 20 6e 6f 72 6d 61 6c 20 6f 70 65 72  inue normal oper
1fba0 61 74 69 6f 6e 20 75 73 69 6e 67 20 78 52 65 61  ation using xRea
1fbb0 64 2f 78 57 72 69 74 65 20 2a 2f 0a 20 20 20 20  d/xWrite */.    
1fbc0 20 20 4f 53 54 52 41 43 45 28 28 22 4d 41 50 2d    OSTRACE(("MAP-
1fbd0 46 49 4c 45 2d 4d 41 50 20 70 69 64 3d 25 6c 75  FILE-MAP pid=%lu
1fbe0 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d 25  , pFile=%p, rc=%
1fbf0 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
1fc00 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e       osGetCurren
1fc10 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46  tProcessId(), pF
1fc20 64 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d  d, sqlite3ErrNam
1fc30 65 28 72 63 29 29 29 3b 0a 20 20 20 20 20 20 72  e(rc)));.      r
1fc40 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1fc50 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 64 2d 3e  .    }.    pFd->
1fc60 70 4d 61 70 52 65 67 69 6f 6e 20 3d 20 70 4e 65  pMapRegion = pNe
1fc70 77 3b 0a 20 20 20 20 70 46 64 2d 3e 6d 6d 61 70  w;.    pFd->mmap
1fc80 53 69 7a 65 20 3d 20 6e 4d 61 70 3b 0a 20 20 20  Size = nMap;.   
1fc90 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63   pFd->mmapSizeAc
1fca0 74 75 61 6c 20 3d 20 6e 4d 61 70 3b 0a 20 20 7d  tual = nMap;.  }
1fcb0 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4d 41  ..  OSTRACE(("MA
1fcc0 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c 75 2c 20  P-FILE pid=%lu, 
1fcd0 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c  pFile=%p, rc=SQL
1fce0 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20  ITE_OK\n",.     
1fcf0 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65        osGetCurre
1fd00 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70  ntProcessId(), p
1fd10 46 64 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  Fd));.  return S
1fd20 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
1fd30 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58  if /* SQLITE_MAX
1fd40 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a  _MMAP_SIZE>0 */.
1fd50 0a 2f 2a 0a 2a 2a 20 49 66 20 70 6f 73 73 69 62  ./*.** If possib
1fd60 6c 65 2c 20 72 65 74 75 72 6e 20 61 20 70 6f 69  le, return a poi
1fd70 6e 74 65 72 20 74 6f 20 61 20 6d 61 70 70 69 6e  nter to a mappin
1fd80 67 20 6f 66 20 66 69 6c 65 20 66 64 20 73 74 61  g of file fd sta
1fd90 72 74 69 6e 67 20 61 74 20 6f 66 66 73 65 74 0a  rting at offset.
1fda0 2a 2a 20 69 4f 66 66 2e 20 54 68 65 20 6d 61 70  ** iOff. The map
1fdb0 70 69 6e 67 20 6d 75 73 74 20 62 65 20 76 61 6c  ping must be val
1fdc0 69 64 20 66 6f 72 20 61 74 20 6c 65 61 73 74 20  id for at least 
1fdd0 6e 41 6d 74 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a  nAmt bytes..**.*
1fde0 2a 20 49 66 20 73 75 63 68 20 61 20 70 6f 69 6e  * If such a poin
1fdf0 74 65 72 20 63 61 6e 20 62 65 20 6f 62 74 61 69  ter can be obtai
1fe00 6e 65 64 2c 20 73 74 6f 72 65 20 69 74 20 69 6e  ned, store it in
1fe10 20 2a 70 70 20 61 6e 64 20 72 65 74 75 72 6e 20   *pp and return 
1fe20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 4f 72  SQLITE_OK..** Or
1fe30 2c 20 69 66 20 6f 6e 65 20 63 61 6e 6e 6f 74 20  , if one cannot 
1fe40 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63  but no error occ
1fe50 75 72 73 2c 20 73 65 74 20 2a 70 70 20 74 6f 20  urs, set *pp to 
1fe60 30 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  0 and return SQL
1fe70 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 46 69 6e 61 6c  ITE_OK..** Final
1fe80 6c 79 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20  ly, if an error 
1fe90 64 6f 65 73 20 6f 63 63 75 72 2c 20 72 65 74 75  does occur, retu
1fea0 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  rn an SQLite err
1feb0 6f 72 20 63 6f 64 65 2e 20 54 68 65 20 66 69 6e  or code. The fin
1fec0 61 6c 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 2a  al.** value of *
1fed0 70 70 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20  pp is undefined 
1fee0 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a  in this case..**
1fef0 0a 2a 2a 20 49 66 20 74 68 69 73 20 66 75 6e 63  .** If this func
1ff00 74 69 6f 6e 20 64 6f 65 73 20 72 65 74 75 72 6e  tion does return
1ff10 20 61 20 70 6f 69 6e 74 65 72 2c 20 74 68 65 20   a pointer, the 
1ff20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 76 65 6e  caller must even
1ff30 74 75 61 6c 6c 79 0a 2a 2a 20 72 65 6c 65 61 73  tually.** releas
1ff40 65 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  e the reference 
1ff50 62 79 20 63 61 6c 6c 69 6e 67 20 77 69 6e 55 6e  by calling winUn
1ff60 66 65 74 63 68 28 29 2e 0a 2a 2f 0a 73 74 61 74  fetch()..*/.stat
1ff70 69 63 20 69 6e 74 20 77 69 6e 46 65 74 63 68 28  ic int winFetch(
1ff80 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
1ff90 2c 20 69 36 34 20 69 4f 66 66 2c 20 69 6e 74 20  , i64 iOff, int 
1ffa0 6e 41 6d 74 2c 20 76 6f 69 64 20 2a 2a 70 70 29  nAmt, void **pp)
1ffb0 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  {.#if SQLITE_MAX
1ffc0 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 77  _MMAP_SIZE>0.  w
1ffd0 69 6e 46 69 6c 65 20 2a 70 46 64 20 3d 20 28 77  inFile *pFd = (w
1ffe0 69 6e 46 69 6c 65 2a 29 66 64 3b 20 20 20 2f 2a  inFile*)fd;   /*
1fff0 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   The underlying 
20000 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
20010 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70 20 3d 20  .#endif.  *pp = 
20020 30 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22  0;..  OSTRACE(("
20030 46 45 54 43 48 20 70 69 64 3d 25 6c 75 2c 20 70  FETCH pid=%lu, p
20040 46 69 6c 65 3d 25 70 2c 20 6f 66 66 73 65 74 3d  File=%p, offset=
20050 25 6c 6c 64 2c 20 61 6d 6f 75 6e 74 3d 25 64 2c  %lld, amount=%d,
20060 20 70 70 3d 25 70 5c 6e 22 2c 0a 20 20 20 20 20   pp=%p\n",.     
20070 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65        osGetCurre
20080 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 66  ntProcessId(), f
20090 64 2c 20 69 4f 66 66 2c 20 6e 41 6d 74 2c 20 70  d, iOff, nAmt, p
200a0 70 29 29 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45  p));..#if SQLITE
200b0 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
200c0 0a 20 20 69 66 28 20 70 46 64 2d 3e 6d 6d 61 70  .  if( pFd->mmap
200d0 53 69 7a 65 4d 61 78 3e 30 20 29 7b 0a 20 20 20  SizeMax>0 ){.   
200e0 20 69 66 28 20 70 46 64 2d 3e 70 4d 61 70 52 65   if( pFd->pMapRe
200f0 67 69 6f 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  gion==0 ){.     
20100 20 69 6e 74 20 72 63 20 3d 20 77 69 6e 4d 61 70   int rc = winMap
20110 66 69 6c 65 28 70 46 64 2c 20 2d 31 29 3b 0a 20  file(pFd, -1);. 
20120 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
20130 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
20140 20 20 4f 53 54 52 41 43 45 28 28 22 46 45 54 43    OSTRACE(("FETC
20150 48 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65  H pid=%lu, pFile
20160 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20  =%p, rc=%s\n",. 
20170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20180 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
20190 65 73 73 49 64 28 29 2c 20 70 46 64 2c 20 73 71  essId(), pFd, sq
201a0 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29  lite3ErrName(rc)
201b0 29 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ));.        retu
201c0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
201d0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46 64     }.    if( pFd
201e0 2d 3e 6d 6d 61 70 53 69 7a 65 20 3e 3d 20 69 4f  ->mmapSize >= iO
201f0 66 66 2b 6e 41 6d 74 20 29 7b 0a 20 20 20 20 20  ff+nAmt ){.     
20200 20 2a 70 70 20 3d 20 26 28 28 75 38 20 2a 29 70   *pp = &((u8 *)p
20210 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 5b  Fd->pMapRegion)[
20220 69 4f 66 66 5d 3b 0a 20 20 20 20 20 20 70 46 64  iOff];.      pFd
20230 2d 3e 6e 46 65 74 63 68 4f 75 74 2b 2b 3b 0a 20  ->nFetchOut++;. 
20240 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
20250 0a 20 20 4f 53 54 52 41 43 45 28 28 22 46 45 54  .  OSTRACE(("FET
20260 43 48 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c  CH pid=%lu, pFil
20270 65 3d 25 70 2c 20 70 70 3d 25 70 2c 20 2a 70 70  e=%p, pp=%p, *pp
20280 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f  =%p, rc=SQLITE_O
20290 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  K\n",.          
202a0 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
202b0 63 65 73 73 49 64 28 29 2c 20 66 64 2c 20 70 70  cessId(), fd, pp
202c0 2c 20 2a 70 70 29 29 3b 0a 20 20 72 65 74 75 72  , *pp));.  retur
202d0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
202e0 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 74 68 69  /*.** If the thi
202f0 72 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e  rd argument is n
20300 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68  on-NULL, then th
20310 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 6c 65  is function rele
20320 61 73 65 73 20 61 0a 2a 2a 20 72 65 66 65 72 65  ases a.** refere
20330 6e 63 65 20 6f 62 74 61 69 6e 65 64 20 62 79 20  nce obtained by 
20340 61 6e 20 65 61 72 6c 69 65 72 20 63 61 6c 6c 20  an earlier call 
20350 74 6f 20 77 69 6e 46 65 74 63 68 28 29 2e 20 54  to winFetch(). T
20360 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 61 72 67  he second.** arg
20370 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20  ument passed to 
20380 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 75  this function mu
20390 73 74 20 62 65 20 74 68 65 20 73 61 6d 65 20 61  st be the same a
203a0 73 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  s the correspond
203b0 69 6e 67 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20  ing.** argument 
203c0 74 68 61 74 20 77 61 73 20 70 61 73 73 65 64 20  that was passed 
203d0 74 6f 20 74 68 65 20 77 69 6e 46 65 74 63 68 28  to the winFetch(
203e0 29 20 69 6e 76 6f 63 61 74 69 6f 6e 2e 0a 2a 2a  ) invocation..**
203f0 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65 20 74  .** Or, if the t
20400 68 69 72 64 20 61 72 67 75 6d 65 6e 74 20 69 73  hird argument is
20410 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73   NULL, then this
20420 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 62 65 69   function is bei
20430 6e 67 20 63 61 6c 6c 65 64 0a 2a 2a 20 74 6f 20  ng called.** to 
20440 69 6e 66 6f 72 6d 20 74 68 65 20 56 46 53 20 6c  inform the VFS l
20450 61 79 65 72 20 74 68 61 74 2c 20 61 63 63 6f 72  ayer that, accor
20460 64 69 6e 67 20 74 6f 20 50 4f 53 49 58 2c 20 61  ding to POSIX, a
20470 6e 79 20 65 78 69 73 74 69 6e 67 20 6d 61 70 70  ny existing mapp
20480 69 6e 67 0a 2a 2a 20 6d 61 79 20 6e 6f 77 20 62  ing.** may now b
20490 65 20 69 6e 76 61 6c 69 64 20 61 6e 64 20 73 68  e invalid and sh
204a0 6f 75 6c 64 20 62 65 20 75 6e 6d 61 70 70 65 64  ould be unmapped
204b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
204c0 77 69 6e 55 6e 66 65 74 63 68 28 73 71 6c 69 74  winUnfetch(sqlit
204d0 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34  e3_file *fd, i64
204e0 20 69 4f 66 66 2c 20 76 6f 69 64 20 2a 70 29 7b   iOff, void *p){
204f0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
20500 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 77 69  MMAP_SIZE>0.  wi
20510 6e 46 69 6c 65 20 2a 70 46 64 20 3d 20 28 77 69  nFile *pFd = (wi
20520 6e 46 69 6c 65 2a 29 66 64 3b 20 20 20 2f 2a 20  nFile*)fd;   /* 
20530 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64  The underlying d
20540 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
20550 0a 20 20 2f 2a 20 49 66 20 70 3d 3d 30 20 28 75  .  /* If p==0 (u
20560 6e 6d 61 70 20 74 68 65 20 65 6e 74 69 72 65 20  nmap the entire 
20570 66 69 6c 65 29 20 74 68 65 6e 20 74 68 65 72 65  file) then there
20580 20 6d 75 73 74 20 62 65 20 6e 6f 20 6f 75 74 73   must be no outs
20590 74 61 6e 64 69 6e 67 0a 20 20 2a 2a 20 78 46 65  tanding.  ** xFe
205a0 74 63 68 20 72 65 66 65 72 65 6e 63 65 73 2e 20  tch references. 
205b0 4f 72 2c 20 69 66 20 70 21 3d 30 20 28 6d 65 61  Or, if p!=0 (mea
205c0 6e 69 6e 67 20 69 74 20 69 73 20 61 6e 20 78 46  ning it is an xF
205d0 65 74 63 68 20 72 65 66 65 72 65 6e 63 65 29 2c  etch reference),
205e0 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65  .  ** then there
205f0 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73   must be at leas
20600 74 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e  t one outstandin
20610 67 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  g.  */.  assert(
20620 20 28 70 3d 3d 30 29 3d 3d 28 70 46 64 2d 3e 6e   (p==0)==(pFd->n
20630 46 65 74 63 68 4f 75 74 3d 3d 30 29 20 29 3b 0a  FetchOut==0) );.
20640 0a 20 20 2f 2a 20 49 66 20 70 21 3d 30 2c 20 69  .  /* If p!=0, i
20650 74 20 6d 75 73 74 20 6d 61 74 63 68 20 74 68 65  t must match the
20660 20 69 4f 66 66 20 76 61 6c 75 65 2e 20 2a 2f 0a   iOff value. */.
20670 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20 7c    assert( p==0 |
20680 7c 20 70 3d 3d 26 28 28 75 38 20 2a 29 70 46 64  | p==&((u8 *)pFd
20690 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 5b 69 4f  ->pMapRegion)[iO
206a0 66 66 5d 20 29 3b 0a 0a 20 20 4f 53 54 52 41 43  ff] );..  OSTRAC
206b0 45 28 28 22 55 4e 46 45 54 43 48 20 70 69 64 3d  E(("UNFETCH pid=
206c0 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 6f  %lu, pFile=%p, o
206d0 66 66 73 65 74 3d 25 6c 6c 64 2c 20 70 3d 25 70  ffset=%lld, p=%p
206e0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
206f0 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
20700 65 73 73 49 64 28 29 2c 20 70 46 64 2c 20 69 4f  essId(), pFd, iO
20710 66 66 2c 20 70 29 29 3b 0a 0a 20 20 69 66 28 20  ff, p));..  if( 
20720 70 20 29 7b 0a 20 20 20 20 70 46 64 2d 3e 6e 46  p ){.    pFd->nF
20730 65 74 63 68 4f 75 74 2d 2d 3b 0a 20 20 7d 65 6c  etchOut--;.  }el
20740 73 65 7b 0a 20 20 20 20 2f 2a 20 46 49 58 4d 45  se{.    /* FIXME
20750 3a 20 20 49 66 20 57 69 6e 64 6f 77 73 20 74 72  :  If Windows tr
20760 75 6c 79 20 61 6c 77 61 79 73 20 70 72 65 76 65  uly always preve
20770 6e 74 73 20 74 72 75 6e 63 61 74 69 6e 67 20 6f  nts truncating o
20780 72 20 64 65 6c 65 74 69 6e 67 20 61 0a 20 20 20  r deleting a.   
20790 20 2a 2a 20 66 69 6c 65 20 77 68 69 6c 65 20 61   ** file while a
207a0 20 6d 61 70 70 69 6e 67 20 69 73 20 68 65 6c 64   mapping is held
207b0 2c 20 74 68 65 6e 20 74 68 65 20 66 6f 6c 6c 6f  , then the follo
207c0 77 69 6e 67 20 77 69 6e 55 6e 6d 61 70 66 69 6c  wing winUnmapfil
207d0 65 28 29 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20  e() call.    ** 
207e0 69 73 20 75 6e 6e 65 63 65 73 73 61 72 79 20 63  is unnecessary c
207f0 61 6e 20 63 61 6e 20 62 65 20 6f 6d 69 74 74 65  an can be omitte
20800 64 20 2d 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20  d - potentially 
20810 69 6d 70 72 6f 76 69 6e 67 0a 20 20 20 20 2a 2a  improving.    **
20820 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e 20 20 2a   performance.  *
20830 2f 0a 20 20 20 20 77 69 6e 55 6e 6d 61 70 66 69  /.    winUnmapfi
20840 6c 65 28 70 46 64 29 3b 0a 20 20 7d 0a 0a 20 20  le(pFd);.  }..  
20850 61 73 73 65 72 74 28 20 70 46 64 2d 3e 6e 46 65  assert( pFd->nFe
20860 74 63 68 4f 75 74 3e 3d 30 20 29 3b 0a 23 65 6e  tchOut>=0 );.#en
20870 64 69 66 0a 0a 20 20 4f 53 54 52 41 43 45 28 28  dif..  OSTRACE((
20880 22 55 4e 46 45 54 43 48 20 70 69 64 3d 25 6c 75  "UNFETCH pid=%lu
20890 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d 53  , pFile=%p, rc=S
208a0 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20  QLITE_OK\n",.   
208b0 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
208c0 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
208d0 20 66 64 29 29 3b 0a 20 20 72 65 74 75 72 6e 20   fd));.  return 
208e0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
208f0 0a 2a 2a 20 48 65 72 65 20 65 6e 64 73 20 74 68  .** Here ends th
20900 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
20910 20 6f 66 20 61 6c 6c 20 73 71 6c 69 74 65 33 5f   of all sqlite3_
20920 66 69 6c 65 20 6d 65 74 68 6f 64 73 2e 0a 2a 2a  file methods..**
20930 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
20940 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 73 71 6c 69  ******* End sqli
20950 74 65 33 5f 66 69 6c 65 20 4d 65 74 68 6f 64 73  te3_file Methods
20960 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
20970 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20980 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
20990 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
209a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
209b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
209c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
209d0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65 63  ../*.** This vec
209e0 74 6f 72 20 64 65 66 69 6e 65 73 20 61 6c 6c 20  tor defines all 
209f0 74 68 65 20 6d 65 74 68 6f 64 73 20 74 68 61 74  the methods that
20a00 20 63 61 6e 20 6f 70 65 72 61 74 65 20 6f 6e 20   can operate on 
20a10 61 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 66 69  an.** sqlite3_fi
20a20 6c 65 20 66 6f 72 20 77 69 6e 33 32 2e 0a 2a 2f  le for win32..*/
20a30 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71  .static const sq
20a40 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
20a50 20 77 69 6e 49 6f 4d 65 74 68 6f 64 20 3d 20 7b   winIoMethod = {
20a60 0a 20 20 33 2c 20 20 20 20 20 20 20 20 20 20 20  .  3,           
20a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a80 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a     /* iVersion *
20a90 2f 0a 20 20 77 69 6e 43 6c 6f 73 65 2c 20 20 20  /.  winClose,   
20aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ab0 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 2a 2f      /* xClose */
20ac0 0a 20 20 77 69 6e 52 65 61 64 2c 20 20 20 20 20  .  winRead,     
20ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ae0 20 20 20 2f 2a 20 78 52 65 61 64 20 2a 2f 0a 20     /* xRead */. 
20af0 20 77 69 6e 57 72 69 74 65 2c 20 20 20 20 20 20   winWrite,      
20b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20b10 20 2f 2a 20 78 57 72 69 74 65 20 2a 2f 0a 20 20   /* xWrite */.  
20b20 77 69 6e 54 72 75 6e 63 61 74 65 2c 20 20 20 20  winTruncate,    
20b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20b40 2f 2a 20 78 54 72 75 6e 63 61 74 65 20 2a 2f 0a  /* xTruncate */.
20b50 20 20 77 69 6e 53 79 6e 63 2c 20 20 20 20 20 20    winSync,      
20b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20b70 20 20 2f 2a 20 78 53 79 6e 63 20 2a 2f 0a 20 20    /* xSync */.  
20b80 77 69 6e 46 69 6c 65 53 69 7a 65 2c 20 20 20 20  winFileSize,    
20b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ba0 2f 2a 20 78 46 69 6c 65 53 69 7a 65 20 2a 2f 0a  /* xFileSize */.
20bb0 20 20 77 69 6e 4c 6f 63 6b 2c 20 20 20 20 20 20    winLock,      
20bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20bd0 20 20 2f 2a 20 78 4c 6f 63 6b 20 2a 2f 0a 20 20    /* xLock */.  
20be0 77 69 6e 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20  winUnlock,      
20bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20c00 2f 2a 20 78 55 6e 6c 6f 63 6b 20 2a 2f 0a 20 20  /* xUnlock */.  
20c10 77 69 6e 43 68 65 63 6b 52 65 73 65 72 76 65 64  winCheckReserved
20c20 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
20c30 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  /* xCheckReserve
20c40 64 4c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e 46 69  dLock */.  winFi
20c50 6c 65 43 6f 6e 74 72 6f 6c 2c 20 20 20 20 20 20  leControl,      
20c60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46             /* xF
20c70 69 6c 65 43 6f 6e 74 72 6f 6c 20 2a 2f 0a 20 20  ileControl */.  
20c80 77 69 6e 53 65 63 74 6f 72 53 69 7a 65 2c 20 20  winSectorSize,  
20c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ca0 2f 2a 20 78 53 65 63 74 6f 72 53 69 7a 65 20 2a  /* xSectorSize *
20cb0 2f 0a 20 20 77 69 6e 44 65 76 69 63 65 43 68 61  /.  winDeviceCha
20cc0 72 61 63 74 65 72 69 73 74 69 63 73 2c 20 20 20  racteristics,   
20cd0 20 20 20 20 2f 2a 20 78 44 65 76 69 63 65 43 68      /* xDeviceCh
20ce0 61 72 61 63 74 65 72 69 73 74 69 63 73 20 2a 2f  aracteristics */
20cf0 0a 20 20 77 69 6e 53 68 6d 4d 61 70 2c 20 20 20  .  winShmMap,   
20d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d10 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 2a 2f     /* xShmMap */
20d20 0a 20 20 77 69 6e 53 68 6d 4c 6f 63 6b 2c 20 20  .  winShmLock,  
20d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d40 20 20 20 2f 2a 20 78 53 68 6d 4c 6f 63 6b 20 2a     /* xShmLock *
20d50 2f 0a 20 20 77 69 6e 53 68 6d 42 61 72 72 69 65  /.  winShmBarrie
20d60 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
20d70 20 20 20 20 2f 2a 20 78 53 68 6d 42 61 72 72 69      /* xShmBarri
20d80 65 72 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 55 6e  er */.  winShmUn
20d90 6d 61 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  map,            
20da0 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 55          /* xShmU
20db0 6e 6d 61 70 20 2a 2f 0a 20 20 77 69 6e 46 65 74  nmap */.  winFet
20dc0 63 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ch,             
20dd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 65            /* xFe
20de0 74 63 68 20 2a 2f 0a 20 20 77 69 6e 55 6e 66 65  tch */.  winUnfe
20df0 74 63 68 20 20 20 20 20 20 20 20 20 20 20 20 20  tch             
20e00 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 66           /* xUnf
20e10 65 74 63 68 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 2a 2a  etch */.};../***
20e20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20e30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20e40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20e50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20e60 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
20e70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20e80 2a 2a 2a 2a 2a 2a 20 73 71 6c 69 74 65 33 5f 76  ****** sqlite3_v
20e90 66 73 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a  fs methods *****
20ea0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20eb0 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68  *******.**.** Th
20ec0 69 73 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74  is division cont
20ed0 61 69 6e 73 20 74 68 65 20 69 6d 70 6c 65 6d 65  ains the impleme
20ee0 6e 74 61 74 69 6f 6e 20 6f 66 20 6d 65 74 68 6f  ntation of metho
20ef0 64 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 73 71 6c  ds on the.** sql
20f00 69 74 65 33 5f 76 66 73 20 6f 62 6a 65 63 74 2e  ite3_vfs object.
20f10 0a 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  .*/..#if defined
20f20 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 2f 2a 0a  (__CYGWIN__)./*.
20f30 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 66 69 6c  ** Convert a fil
20f40 65 6e 61 6d 65 20 66 72 6f 6d 20 77 68 61 74 65  ename from whate
20f50 76 65 72 20 74 68 65 20 75 6e 64 65 72 6c 79 69  ver the underlyi
20f60 6e 67 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  ng operating sys
20f70 74 65 6d 0a 2a 2a 20 73 75 70 70 6f 72 74 73 20  tem.** supports 
20f80 66 6f 72 20 66 69 6c 65 6e 61 6d 65 73 20 69 6e  for filenames in
20f90 74 6f 20 55 54 46 2d 38 2e 20 20 53 70 61 63 65  to UTF-8.  Space
20fa0 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 73   to hold the res
20fb0 75 6c 74 20 69 73 0a 2a 2a 20 6f 62 74 61 69 6e  ult is.** obtain
20fc0 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 20 61  ed from malloc a
20fd0 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65 65 64  nd must be freed
20fe0 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20   by the calling 
20ff0 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  function..*/.sta
21000 74 69 63 20 63 68 61 72 20 2a 77 69 6e 43 6f 6e  tic char *winCon
21010 76 65 72 74 54 6f 55 74 66 38 46 69 6c 65 6e 61  vertToUtf8Filena
21020 6d 65 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a  me(const void *z
21030 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 63 68 61  Filename){.  cha
21040 72 20 2a 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20  r *zConverted = 
21050 30 3b 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28  0;.  if( osIsNT(
21060 29 20 29 7b 0a 20 20 20 20 7a 43 6f 6e 76 65 72  ) ){.    zConver
21070 74 65 64 20 3d 20 77 69 6e 55 6e 69 63 6f 64 65  ted = winUnicode
21080 54 6f 55 74 66 38 28 7a 46 69 6c 65 6e 61 6d 65  ToUtf8(zFilename
21090 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51  );.  }.#ifdef SQ
210a0 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
210b0 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20  NSI.  else{.    
210c0 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 73 71 6c  zConverted = sql
210d0 69 74 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f  ite3_win32_mbcs_
210e0 74 6f 5f 75 74 66 38 28 7a 46 69 6c 65 6e 61 6d  to_utf8(zFilenam
210f0 65 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  e);.  }.#endif. 
21100 20 2f 2a 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20   /* caller will 
21110 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20 6d 65  handle out of me
21120 6d 6f 72 79 20 2a 2f 0a 20 20 72 65 74 75 72 6e  mory */.  return
21130 20 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 7d 0a 23   zConverted;.}.#
21140 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  endif../*.** Con
21150 76 65 72 74 20 61 20 55 54 46 2d 38 20 66 69 6c  vert a UTF-8 fil
21160 65 6e 61 6d 65 20 69 6e 74 6f 20 77 68 61 74 65  ename into whate
21170 76 65 72 20 66 6f 72 6d 20 74 68 65 20 75 6e 64  ver form the und
21180 65 72 6c 79 69 6e 67 0a 2a 2a 20 6f 70 65 72 61  erlying.** opera
21190 74 69 6e 67 20 73 79 73 74 65 6d 20 77 61 6e 74  ting system want
211a0 73 20 66 69 6c 65 6e 61 6d 65 73 20 69 6e 2e 20  s filenames in. 
211b0 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74   Space to hold t
211c0 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 69 73 20  he result.** is 
211d0 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61  obtained from ma
211e0 6c 6c 6f 63 20 61 6e 64 20 6d 75 73 74 20 62 65  lloc and must be
211f0 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61   freed by the ca
21200 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f  lling.** functio
21210 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
21220 64 20 2a 77 69 6e 43 6f 6e 76 65 72 74 46 72 6f  d *winConvertFro
21230 6d 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 63 6f  mUtf8Filename(co
21240 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
21250 61 6d 65 29 7b 0a 20 20 76 6f 69 64 20 2a 7a 43  ame){.  void *zC
21260 6f 6e 76 65 72 74 65 64 20 3d 20 30 3b 0a 20 20  onverted = 0;.  
21270 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a  if( osIsNT() ){.
21280 20 20 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d      zConverted =
21290 20 77 69 6e 55 74 66 38 54 6f 55 6e 69 63 6f 64   winUtf8ToUnicod
212a0 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  e(zFilename);.  
212b0 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
212c0 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20  WIN32_HAS_ANSI. 
212d0 20 65 6c 73 65 7b 0a 20 20 20 20 7a 43 6f 6e 76   else{.    zConv
212e0 65 72 74 65 64 20 3d 20 73 71 6c 69 74 65 33 5f  erted = sqlite3_
212f0 77 69 6e 33 32 5f 75 74 66 38 5f 74 6f 5f 6d 62  win32_utf8_to_mb
21300 63 73 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  cs(zFilename);. 
21310 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20 63   }.#endif.  /* c
21320 61 6c 6c 65 72 20 77 69 6c 6c 20 68 61 6e 64 6c  aller will handl
21330 65 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 20  e out of memory 
21340 2a 2f 0a 20 20 72 65 74 75 72 6e 20 7a 43 6f 6e  */.  return zCon
21350 76 65 72 74 65 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  verted;.}../*.**
21360 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
21370 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20  eturns non-zero 
21380 69 66 20 74 68 65 20 73 70 65 63 69 66 69 65 64  if the specified
21390 20 55 54 46 2d 38 20 73 74 72 69 6e 67 20 62 75   UTF-8 string bu
213a0 66 66 65 72 0a 2a 2a 20 65 6e 64 73 20 77 69 74  ffer.** ends wit
213b0 68 20 61 20 64 69 72 65 63 74 6f 72 79 20 73 65  h a directory se
213c0 70 61 72 61 74 6f 72 20 63 68 61 72 61 63 74 65  parator characte
213d0 72 20 6f 72 20 6f 6e 65 20 77 61 73 20 73 75 63  r or one was suc
213e0 63 65 73 73 66 75 6c 6c 79 0a 2a 2a 20 61 64 64  cessfully.** add
213f0 65 64 20 74 6f 20 69 74 2e 0a 2a 2f 0a 73 74 61  ed to it..*/.sta
21400 74 69 63 20 69 6e 74 20 77 69 6e 4d 61 6b 65 45  tic int winMakeE
21410 6e 64 49 6e 44 69 72 53 65 70 28 69 6e 74 20 6e  ndInDirSep(int n
21420 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29  Buf, char *zBuf)
21430 7b 0a 20 20 69 66 28 20 7a 42 75 66 20 29 7b 0a  {.  if( zBuf ){.
21440 20 20 20 20 69 6e 74 20 6e 4c 65 6e 20 3d 20 73      int nLen = s
21450 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
21460 42 75 66 29 3b 0a 20 20 20 20 69 66 28 20 6e 4c  Buf);.    if( nL
21470 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 66  en>0 ){.      if
21480 28 20 77 69 6e 49 73 44 69 72 53 65 70 28 7a 42  ( winIsDirSep(zB
21490 75 66 5b 6e 4c 65 6e 2d 31 5d 29 20 29 7b 0a 20  uf[nLen-1]) ){. 
214a0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
214b0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
214c0 20 6e 4c 65 6e 2b 31 3c 6e 42 75 66 20 29 7b 0a   nLen+1<nBuf ){.
214d0 20 20 20 20 20 20 20 20 7a 42 75 66 5b 6e 4c 65          zBuf[nLe
214e0 6e 5d 20 3d 20 77 69 6e 47 65 74 44 69 72 53 65  n] = winGetDirSe
214f0 70 28 29 3b 0a 20 20 20 20 20 20 20 20 7a 42 75  p();.        zBu
21500 66 5b 6e 4c 65 6e 2b 31 5d 20 3d 20 27 5c 30 27  f[nLen+1] = '\0'
21510 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
21520 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
21530 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
21540 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
21550 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  e a temporary fi
21560 6c 65 20 6e 61 6d 65 20 61 6e 64 20 73 74 6f 72  le name and stor
21570 65 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67 20  e the resulting 
21580 70 6f 69 6e 74 65 72 20 69 6e 74 6f 20 70 7a 42  pointer into pzB
21590 75 66 2e 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74  uf..** The point
215a0 65 72 20 72 65 74 75 72 6e 65 64 20 69 6e 20 70  er returned in p
215b0 7a 42 75 66 20 6d 75 73 74 20 62 65 20 66 72 65  zBuf must be fre
215c0 65 64 20 76 69 61 20 73 71 6c 69 74 65 33 5f 66  ed via sqlite3_f
215d0 72 65 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ree()..*/.static
215e0 20 69 6e 74 20 77 69 6e 47 65 74 54 65 6d 70 6e   int winGetTempn
215f0 61 6d 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ame(sqlite3_vfs 
21600 2a 70 56 66 73 2c 20 63 68 61 72 20 2a 2a 70 7a  *pVfs, char **pz
21610 42 75 66 29 7b 0a 20 20 73 74 61 74 69 63 20 63  Buf){.  static c
21620 68 61 72 20 7a 43 68 61 72 73 5b 5d 20 3d 0a 20  har zChars[] =. 
21630 20 20 20 22 61 62 63 64 65 66 67 68 69 6a 6b 6c     "abcdefghijkl
21640 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 22 0a  mnopqrstuvwxyz".
21650 20 20 20 20 22 41 42 43 44 45 46 47 48 49 4a 4b      "ABCDEFGHIJK
21660 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 22  LMNOPQRSTUVWXYZ"
21670 0a 20 20 20 20 22 30 31 32 33 34 35 36 37 38 39  .    "0123456789
21680 22 3b 0a 20 20 73 69 7a 65 5f 74 20 69 2c 20 6a  ";.  size_t i, j
21690 3b 0a 20 20 69 6e 74 20 6e 50 72 65 20 3d 20 73  ;.  int nPre = s
216a0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 53  qlite3Strlen30(S
216b0 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f  QLITE_TEMP_FILE_
216c0 50 52 45 46 49 58 29 3b 0a 20 20 69 6e 74 20 6e  PREFIX);.  int n
216d0 4d 61 78 2c 20 6e 42 75 66 2c 20 6e 44 69 72 2c  Max, nBuf, nDir,
216e0 20 6e 4c 65 6e 3b 0a 20 20 63 68 61 72 20 2a 7a   nLen;.  char *z
216f0 42 75 66 3b 0a 0a 20 20 2f 2a 20 49 74 27 73 20  Buf;..  /* It's 
21700 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20  odd to simulate 
21710 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65 72 65  an io-error here
21720 2c 20 62 75 74 20 72 65 61 6c 6c 79 20 74 68 69  , but really thi
21730 73 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75  s is just.  ** u
21740 73 69 6e 67 20 74 68 65 20 69 6f 2d 65 72 72 6f  sing the io-erro
21750 72 20 69 6e 66 72 61 73 74 72 75 63 74 75 72 65  r infrastructure
21760 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 53 51   to test that SQ
21770 4c 69 74 65 20 68 61 6e 64 6c 65 73 20 74 68 69  Lite handles thi
21780 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  s.  ** function 
21790 66 61 69 6c 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20  failing..  */.  
217a0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
217b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
217c0 4f 45 52 52 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c  OERR );..  /* Al
217d0 6c 6f 63 61 74 65 20 61 20 74 65 6d 70 6f 72 61  locate a tempora
217e0 72 79 20 62 75 66 66 65 72 20 74 6f 20 73 74 6f  ry buffer to sto
217f0 72 65 20 74 68 65 20 66 75 6c 6c 79 20 71 75 61  re the fully qua
21800 6c 69 66 69 65 64 20 66 69 6c 65 0a 20 20 2a 2a  lified file.  **
21810 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 74 65   name for the te
21820 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 49  mporary file.  I
21830 66 20 74 68 69 73 20 66 61 69 6c 73 2c 20 77 65  f this fails, we
21840 20 63 61 6e 6e 6f 74 20 63 6f 6e 74 69 6e 75 65   cannot continue
21850 2e 0a 20 20 2a 2f 0a 20 20 6e 4d 61 78 20 3d 20  ..  */.  nMax = 
21860 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
21870 3b 20 6e 42 75 66 20 3d 20 6e 4d 61 78 20 2b 20  ; nBuf = nMax + 
21880 32 3b 0a 20 20 7a 42 75 66 20 3d 20 73 71 6c 69  2;.  zBuf = sqli
21890 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e  te3MallocZero( n
218a0 42 75 66 20 29 3b 0a 20 20 69 66 28 20 21 7a 42  Buf );.  if( !zB
218b0 75 66 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43  uf ){.    OSTRAC
218c0 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d  E(("TEMP-FILENAM
218d0 45 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52  E rc=SQLITE_IOER
218e0 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20  R_NOMEM\n"));.  
218f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
21900 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  IOERR_NOMEM;.  }
21910 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
21920 74 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20  t the effective 
21930 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74  temporary direct
21940 6f 72 79 2e 20 20 46 69 72 73 74 2c 20 63 68 65  ory.  First, che
21950 63 6b 20 69 66 20 6f 6e 65 0a 20 20 2a 2a 20 68  ck if one.  ** h
21960 61 73 20 62 65 65 6e 20 65 78 70 6c 69 63 69 74  as been explicit
21970 6c 79 20 73 65 74 20 62 79 20 74 68 65 20 61 70  ly set by the ap
21980 70 6c 69 63 61 74 69 6f 6e 3b 20 6f 74 68 65 72  plication; other
21990 77 69 73 65 2c 20 75 73 65 20 74 68 65 20 6f 6e  wise, use the on
219a0 65 0a 20 20 2a 2a 20 63 6f 6e 66 69 67 75 72 65  e.  ** configure
219b0 64 20 62 79 20 74 68 65 20 6f 70 65 72 61 74 69  d by the operati
219c0 6e 67 20 73 79 73 74 65 6d 2e 0a 20 20 2a 2f 0a  ng system..  */.
219d0 20 20 6e 44 69 72 20 3d 20 6e 4d 61 78 20 2d 20    nDir = nMax - 
219e0 28 6e 50 72 65 20 2b 20 31 35 29 3b 0a 20 20 61  (nPre + 15);.  a
219f0 73 73 65 72 74 28 20 6e 44 69 72 3e 30 20 29 3b  ssert( nDir>0 );
21a00 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 74  .  if( sqlite3_t
21a10 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 29 7b  emp_directory ){
21a20 0a 20 20 20 20 69 6e 74 20 6e 44 69 72 4c 65 6e  .    int nDirLen
21a30 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
21a40 33 30 28 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f  30(sqlite3_temp_
21a50 64 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 20 20  directory);.    
21a60 69 66 28 20 6e 44 69 72 4c 65 6e 3e 30 20 29 7b  if( nDirLen>0 ){
21a70 0a 20 20 20 20 20 20 69 66 28 20 21 77 69 6e 49  .      if( !winI
21a80 73 44 69 72 53 65 70 28 73 71 6c 69 74 65 33 5f  sDirSep(sqlite3_
21a90 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 5b 6e  temp_directory[n
21aa0 44 69 72 4c 65 6e 2d 31 5d 29 20 29 7b 0a 20 20  DirLen-1]) ){.  
21ab0 20 20 20 20 20 20 6e 44 69 72 4c 65 6e 2b 2b 3b        nDirLen++;
21ac0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
21ad0 66 28 20 6e 44 69 72 4c 65 6e 3e 6e 44 69 72 20  f( nDirLen>nDir 
21ae0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
21af0 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20  e3_free(zBuf);. 
21b00 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28         OSTRACE((
21b10 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72  "TEMP-FILENAME r
21b20 63 3d 53 51 4c 49 54 45 5f 45 52 52 4f 52 5c 6e  c=SQLITE_ERROR\n
21b30 22 29 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  "));.        ret
21b40 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  urn winLogError(
21b50 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 30 2c  SQLITE_ERROR, 0,
21b60 20 22 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65   "winGetTempname
21b70 31 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  1", 0);.      }.
21b80 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
21b90 70 72 69 6e 74 66 28 6e 4d 61 78 2c 20 7a 42 75  printf(nMax, zBu
21ba0 66 2c 20 22 25 73 22 2c 20 73 71 6c 69 74 65 33  f, "%s", sqlite3
21bb0 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 29  _temp_directory)
21bc0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66 20  ;.    }.  }.#if 
21bd0 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e  defined(__CYGWIN
21be0 5f 5f 29 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20  __).  else{.    
21bf0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
21c00 72 20 2a 61 7a 44 69 72 73 5b 5d 20 3d 20 7b 0a  r *azDirs[] = {.
21c10 20 20 20 20 20 20 20 30 2c 20 2f 2a 20 67 65 74         0, /* get
21c20 65 6e 76 28 22 53 51 4c 49 54 45 5f 54 4d 50 44  env("SQLITE_TMPD
21c30 49 52 22 29 20 2a 2f 0a 20 20 20 20 20 20 20 30  IR") */.       0
21c40 2c 20 2f 2a 20 67 65 74 65 6e 76 28 22 54 4d 50  , /* getenv("TMP
21c50 44 49 52 22 29 20 2a 2f 0a 20 20 20 20 20 20 20  DIR") */.       
21c60 30 2c 20 2f 2a 20 67 65 74 65 6e 76 28 22 54 4d  0, /* getenv("TM
21c70 50 22 29 20 2a 2f 0a 20 20 20 20 20 20 20 30 2c  P") */.       0,
21c80 20 2f 2a 20 67 65 74 65 6e 76 28 22 54 45 4d 50   /* getenv("TEMP
21c90 22 29 20 2a 2f 0a 20 20 20 20 20 20 20 30 2c 20  ") */.       0, 
21ca0 2f 2a 20 67 65 74 65 6e 76 28 22 55 53 45 52 50  /* getenv("USERP
21cb0 52 4f 46 49 4c 45 22 29 20 2a 2f 0a 20 20 20 20  ROFILE") */.    
21cc0 20 20 20 22 2f 76 61 72 2f 74 6d 70 22 2c 0a 20     "/var/tmp",. 
21cd0 20 20 20 20 20 20 22 2f 75 73 72 2f 74 6d 70 22        "/usr/tmp"
21ce0 2c 0a 20 20 20 20 20 20 20 22 2f 74 6d 70 22 2c  ,.       "/tmp",
21cf0 0a 20 20 20 20 20 20 20 22 2e 22 2c 0a 20 20 20  .       ".",.   
21d00 20 20 20 20 30 20 20 20 20 20 20 20 20 2f 2a 20      0        /* 
21d10 4c 69 73 74 20 74 65 72 6d 69 6e 61 74 6f 72 20  List terminator 
21d20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20 20 20 75 6e  */.    };.    un
21d30 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20 20  signed int i;.  
21d40 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
21d50 69 72 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28  ir = 0;..    if(
21d60 20 21 61 7a 44 69 72 73 5b 30 5d 20 29 20 61 7a   !azDirs[0] ) az
21d70 44 69 72 73 5b 30 5d 20 3d 20 67 65 74 65 6e 76  Dirs[0] = getenv
21d80 28 22 53 51 4c 49 54 45 5f 54 4d 50 44 49 52 22  ("SQLITE_TMPDIR"
21d90 29 3b 0a 20 20 20 20 69 66 28 20 21 61 7a 44 69  );.    if( !azDi
21da0 72 73 5b 31 5d 20 29 20 61 7a 44 69 72 73 5b 31  rs[1] ) azDirs[1
21db0 5d 20 3d 20 67 65 74 65 6e 76 28 22 54 4d 50 44  ] = getenv("TMPD
21dc0 49 52 22 29 3b 0a 20 20 20 20 69 66 28 20 21 61  IR");.    if( !a
21dd0 7a 44 69 72 73 5b 32 5d 20 29 20 61 7a 44 69 72  zDirs[2] ) azDir
21de0 73 5b 32 5d 20 3d 20 67 65 74 65 6e 76 28 22 54  s[2] = getenv("T
21df0 4d 50 22 29 3b 0a 20 20 20 20 69 66 28 20 21 61  MP");.    if( !a
21e00 7a 44 69 72 73 5b 33 5d 20 29 20 61 7a 44 69 72  zDirs[3] ) azDir
21e10 73 5b 33 5d 20 3d 20 67 65 74 65 6e 76 28 22 54  s[3] = getenv("T
21e20 45 4d 50 22 29 3b 0a 20 20 20 20 69 66 28 20 21  EMP");.    if( !
21e30 61 7a 44 69 72 73 5b 34 5d 20 29 20 61 7a 44 69  azDirs[4] ) azDi
21e40 72 73 5b 34 5d 20 3d 20 67 65 74 65 6e 76 28 22  rs[4] = getenv("
21e50 55 53 45 52 50 52 4f 46 49 4c 45 22 29 3b 0a 20  USERPROFILE");. 
21e60 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69     for(i=0; i<si
21e70 7a 65 6f 66 28 61 7a 44 69 72 73 29 2f 73 69 7a  zeof(azDirs)/siz
21e80 65 6f 66 28 61 7a 44 69 72 73 5b 30 5d 29 3b 20  eof(azDirs[0]); 
21e90 7a 44 69 72 3d 61 7a 44 69 72 73 5b 69 2b 2b 5d  zDir=azDirs[i++]
21ea0 29 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 7a  ){.      void *z
21eb0 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 20 20 20  Converted;.     
21ec0 20 69 66 28 20 7a 44 69 72 3d 3d 30 20 29 20 63   if( zDir==0 ) c
21ed0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 2f  ontinue;.      /
21ee0 2a 20 49 66 20 74 68 65 20 70 61 74 68 20 73 74  * If the path st
21ef0 61 72 74 73 20 77 69 74 68 20 61 20 64 72 69 76  arts with a driv
21f00 65 20 6c 65 74 74 65 72 20 66 6f 6c 6c 6f 77 65  e letter followe
21f10 64 20 62 79 20 74 68 65 20 63 6f 6c 6f 6e 0a 20  d by the colon. 
21f20 20 20 20 20 20 2a 2a 20 63 68 61 72 61 63 74 65       ** characte
21f30 72 2c 20 61 73 73 75 6d 65 20 69 74 20 69 73 20  r, assume it is 
21f40 61 6c 72 65 61 64 79 20 61 20 6e 61 74 69 76 65  already a native
21f50 20 57 69 6e 33 32 20 70 61 74 68 3b 20 6f 74 68   Win32 path; oth
21f60 65 72 77 69 73 65 2c 0a 20 20 20 20 20 20 2a 2a  erwise,.      **
21f70 20 69 74 20 6d 75 73 74 20 62 65 20 63 6f 6e 76   it must be conv
21f80 65 72 74 65 64 20 74 6f 20 61 20 6e 61 74 69 76  erted to a nativ
21f90 65 20 57 69 6e 33 32 20 70 61 74 68 20 76 69 61  e Win32 path via
21fa0 20 74 68 65 20 43 79 67 77 69 6e 20 41 50 49 0a   the Cygwin API.
21fb0 20 20 20 20 20 20 2a 2a 20 70 72 69 6f 72 20 74        ** prior t
21fc0 6f 20 75 73 69 6e 67 20 69 74 2e 0a 20 20 20 20  o using it..    
21fd0 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 77    */.      if( w
21fe0 69 6e 49 73 44 72 69 76 65 4c 65 74 74 65 72 41  inIsDriveLetterA
21ff0 6e 64 43 6f 6c 6f 6e 28 7a 44 69 72 29 20 29 7b  ndColon(zDir) ){
22000 0a 20 20 20 20 20 20 20 20 7a 43 6f 6e 76 65 72  .        zConver
22010 74 65 64 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74  ted = winConvert
22020 46 72 6f 6d 55 74 66 38 46 69 6c 65 6e 61 6d 65  FromUtf8Filename
22030 28 7a 44 69 72 29 3b 0a 20 20 20 20 20 20 20 20  (zDir);.        
22040 69 66 28 20 21 7a 43 6f 6e 76 65 72 74 65 64 20  if( !zConverted 
22050 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
22060 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b  ite3_free(zBuf);
22070 0a 20 20 20 20 20 20 20 20 20 20 4f 53 54 52 41  .          OSTRA
22080 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41  CE(("TEMP-FILENA
22090 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45  ME rc=SQLITE_IOE
220a0 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20  RR_NOMEM\n"));. 
220b0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
220c0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
220d0 45 4d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  EM;.        }.  
220e0 20 20 20 20 20 20 69 66 28 20 77 69 6e 49 73 44        if( winIsD
220f0 69 72 28 7a 43 6f 6e 76 65 72 74 65 64 29 20 29  ir(zConverted) )
22100 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
22110 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4d 61  te3_snprintf(nMa
22120 78 2c 20 7a 42 75 66 2c 20 22 25 73 22 2c 20 7a  x, zBuf, "%s", z
22130 44 69 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Dir);.          
22140 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
22150 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20  nverted);.      
22160 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
22170 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
22180 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65  ite3_free(zConve
22190 72 74 65 64 29 3b 0a 20 20 20 20 20 20 7d 65 6c  rted);.      }el
221a0 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6e  se{.        zCon
221b0 76 65 72 74 65 64 20 3d 20 73 71 6c 69 74 65 33  verted = sqlite3
221c0 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 4d 61 78  MallocZero( nMax
221d0 2b 31 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  +1 );.        if
221e0 28 20 21 7a 43 6f 6e 76 65 72 74 65 64 20 29 7b  ( !zConverted ){
221f0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
22200 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20  e3_free(zBuf);. 
22210 20 20 20 20 20 20 20 20 20 4f 53 54 52 41 43 45           OSTRACE
22220 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45  (("TEMP-FILENAME
22230 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52   rc=SQLITE_IOERR
22240 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20 20  _NOMEM\n"));.   
22250 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
22260 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
22270 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
22280 20 20 20 20 69 66 28 20 63 79 67 77 69 6e 5f 63      if( cygwin_c
22290 6f 6e 76 5f 70 61 74 68 28 0a 20 20 20 20 20 20  onv_path(.      
222a0 20 20 20 20 20 20 20 20 20 20 6f 73 49 73 4e 54            osIsNT
222b0 28 29 20 3f 20 43 43 50 5f 50 4f 53 49 58 5f 54  () ? CCP_POSIX_T
222c0 4f 5f 57 49 4e 5f 57 20 3a 20 43 43 50 5f 50 4f  O_WIN_W : CCP_PO
222d0 53 49 58 5f 54 4f 5f 57 49 4e 5f 41 2c 20 7a 44  SIX_TO_WIN_A, zD
222e0 69 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ir,.            
222f0 20 20 20 20 7a 43 6f 6e 76 65 72 74 65 64 2c 20      zConverted, 
22300 6e 4d 61 78 2b 31 29 3c 30 20 29 7b 0a 20 20 20  nMax+1)<0 ){.   
22310 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
22320 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
22330 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
22340 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20  e3_free(zBuf);. 
22350 20 20 20 20 20 20 20 20 20 4f 53 54 52 41 43 45           OSTRACE
22360 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45  (("TEMP-FILENAME
22370 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52   rc=SQLITE_IOERR
22380 5f 43 4f 4e 56 50 41 54 48 5c 6e 22 29 29 3b 0a  _CONVPATH\n"));.
22390 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
223a0 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
223b0 49 54 45 5f 49 4f 45 52 52 5f 43 4f 4e 56 50 41  ITE_IOERR_CONVPA
223c0 54 48 2c 20 28 44 57 4f 52 44 29 65 72 72 6e 6f  TH, (DWORD)errno
223d0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
223e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
223f0 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65 32 22  winGetTempname2"
22400 2c 20 7a 44 69 72 29 3b 0a 20 20 20 20 20 20 20  , zDir);.       
22410 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 77   }.        if( w
22420 69 6e 49 73 44 69 72 28 7a 43 6f 6e 76 65 72 74  inIsDir(zConvert
22430 65 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ed) ){.         
22440 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
22450 74 2c 20 77 65 20 6b 6e 6f 77 20 74 68 65 20 63  t, we know the c
22460 61 6e 64 69 64 61 74 65 20 64 69 72 65 63 74 6f  andidate directo
22470 72 79 20 65 78 69 73 74 73 20 61 6e 64 20 73 68  ry exists and sh
22480 6f 75 6c 64 0a 20 20 20 20 20 20 20 20 20 20 2a  ould.          *
22490 2a 20 62 65 20 75 73 65 64 2e 20 20 48 6f 77 65  * be used.  Howe
224a0 76 65 72 2c 20 77 65 20 6d 61 79 20 6e 65 65 64  ver, we may need
224b0 20 74 6f 20 63 6f 6e 76 65 72 74 20 74 68 65 20   to convert the 
224c0 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e  string containin
224d0 67 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69  g.          ** i
224e0 74 73 20 6e 61 6d 65 20 69 6e 74 6f 20 55 54 46  ts name into UTF
224f0 2d 38 20 28 69 2e 65 2e 20 69 66 20 69 74 20 69  -8 (i.e. if it i
22500 73 20 55 54 46 2d 31 36 20 72 69 67 68 74 20 6e  s UTF-16 right n
22510 6f 77 29 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ow)..          *
22520 2f 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 72  /.          char
22530 20 2a 7a 55 74 66 38 20 3d 20 77 69 6e 43 6f 6e   *zUtf8 = winCon
22540 76 65 72 74 54 6f 55 74 66 38 46 69 6c 65 6e 61  vertToUtf8Filena
22550 6d 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  me(zConverted);.
22560 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 7a            if( !z
22570 55 74 66 38 20 29 7b 0a 20 20 20 20 20 20 20 20  Utf8 ){.        
22580 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
22590 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
225a0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
225b0 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20  3_free(zBuf);.  
225c0 20 20 20 20 20 20 20 20 20 20 4f 53 54 52 41 43            OSTRAC
225d0 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d  E(("TEMP-FILENAM
225e0 45 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52  E rc=SQLITE_IOER
225f0 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20  R_NOMEM\n"));.  
22600 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
22610 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
22620 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  MEM;.          }
22630 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
22640 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4d 61 78  e3_snprintf(nMax
22650 2c 20 7a 42 75 66 2c 20 22 25 73 22 2c 20 7a 55  , zBuf, "%s", zU
22660 74 66 38 29 3b 0a 20 20 20 20 20 20 20 20 20 20  tf8);.          
22670 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 55 74  sqlite3_free(zUt
22680 66 38 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  f8);.          s
22690 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e  qlite3_free(zCon
226a0 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 20  verted);.       
226b0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
226c0 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
226d0 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
226e0 74 65 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ted);.      }.  
226f0 20 20 7d 0a 20 20 7d 0a 23 65 6c 69 66 20 21 53    }.  }.#elif !S
22700 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26  QLITE_OS_WINRT &
22710 26 20 21 64 65 66 69 6e 65 64 28 5f 5f 43 59 47  & !defined(__CYG
22720 57 49 4e 5f 5f 29 0a 20 20 65 6c 73 65 20 69 66  WIN__).  else if
22730 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 20  ( osIsNT() ){.  
22740 20 20 63 68 61 72 20 2a 7a 4d 75 6c 74 69 3b 0a    char *zMulti;.
22750 20 20 20 20 4c 50 57 53 54 52 20 7a 57 69 64 65      LPWSTR zWide
22760 50 61 74 68 20 3d 20 73 71 6c 69 74 65 33 4d 61  Path = sqlite3Ma
22770 6c 6c 6f 63 5a 65 72 6f 28 20 6e 4d 61 78 2a 73  llocZero( nMax*s
22780 69 7a 65 6f 66 28 57 43 48 41 52 29 20 29 3b 0a  izeof(WCHAR) );.
22790 20 20 20 20 69 66 28 20 21 7a 57 69 64 65 50 61      if( !zWidePa
227a0 74 68 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  th ){.      sqli
227b0 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a  te3_free(zBuf);.
227c0 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
227d0 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63  TEMP-FILENAME rc
227e0 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f  =SQLITE_IOERR_NO
227f0 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20  MEM\n"));.      
22800 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
22810 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ERR_NOMEM;.    }
22820 0a 20 20 20 20 69 66 28 20 6f 73 47 65 74 54 65  .    if( osGetTe
22830 6d 70 50 61 74 68 57 28 6e 4d 61 78 2c 20 7a 57  mpPathW(nMax, zW
22840 69 64 65 50 61 74 68 29 3d 3d 30 20 29 7b 0a 20  idePath)==0 ){. 
22850 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
22860 65 28 7a 57 69 64 65 50 61 74 68 29 3b 0a 20 20  e(zWidePath);.  
22870 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
22880 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 4f 53  (zBuf);.      OS
22890 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c  TRACE(("TEMP-FIL
228a0 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f  ENAME rc=SQLITE_
228b0 49 4f 45 52 52 5f 47 45 54 54 45 4d 50 50 41 54  IOERR_GETTEMPPAT
228c0 48 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 72 65  H\n"));.      re
228d0 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72  turn winLogError
228e0 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 47 45  (SQLITE_IOERR_GE
228f0 54 54 45 4d 50 50 41 54 48 2c 20 6f 73 47 65 74  TTEMPPATH, osGet
22900 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20  LastError(),.   
22910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22920 20 20 20 20 20 20 22 77 69 6e 47 65 74 54 65 6d        "winGetTem
22930 70 6e 61 6d 65 32 22 2c 20 30 29 3b 0a 20 20 20  pname2", 0);.   
22940 20 7d 0a 20 20 20 20 7a 4d 75 6c 74 69 20 3d 20   }.    zMulti = 
22950 77 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66 38  winUnicodeToUtf8
22960 28 7a 57 69 64 65 50 61 74 68 29 3b 0a 20 20 20  (zWidePath);.   
22970 20 69 66 28 20 7a 4d 75 6c 74 69 20 29 7b 0a 20   if( zMulti ){. 
22980 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
22990 72 69 6e 74 66 28 6e 4d 61 78 2c 20 7a 42 75 66  rintf(nMax, zBuf
229a0 2c 20 22 25 73 22 2c 20 7a 4d 75 6c 74 69 29 3b  , "%s", zMulti);
229b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
229c0 72 65 65 28 7a 4d 75 6c 74 69 29 3b 0a 20 20 20  ree(zMulti);.   
229d0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
229e0 7a 57 69 64 65 50 61 74 68 29 3b 0a 20 20 20 20  zWidePath);.    
229f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
22a00 69 74 65 33 5f 66 72 65 65 28 7a 57 69 64 65 50  ite3_free(zWideP
22a10 61 74 68 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ath);.      sqli
22a20 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a  te3_free(zBuf);.
22a30 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
22a40 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63  TEMP-FILENAME rc
22a50 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f  =SQLITE_IOERR_NO
22a60 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20  MEM\n"));.      
22a70 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
22a80 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ERR_NOMEM;.    }
22a90 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49  .  }.#ifdef SQLI
22aa0 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
22ab0 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 63 68  I.  else{.    ch
22ac0 61 72 20 2a 7a 55 74 66 38 3b 0a 20 20 20 20 63  ar *zUtf8;.    c
22ad0 68 61 72 20 2a 7a 4d 62 63 73 50 61 74 68 20 3d  har *zMbcsPath =
22ae0 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
22af0 72 6f 28 20 6e 4d 61 78 20 29 3b 0a 20 20 20 20  ro( nMax );.    
22b00 69 66 28 20 21 7a 4d 62 63 73 50 61 74 68 20 29  if( !zMbcsPath )
22b10 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
22b20 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20  free(zBuf);.    
22b30 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50    OSTRACE(("TEMP
22b40 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c  -FILENAME rc=SQL
22b50 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c  ITE_IOERR_NOMEM\
22b60 6e 22 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75  n"));.      retu
22b70 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
22b80 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20  NOMEM;.    }.   
22b90 20 69 66 28 20 6f 73 47 65 74 54 65 6d 70 50 61   if( osGetTempPa
22ba0 74 68 41 28 6e 4d 61 78 2c 20 7a 4d 62 63 73 50  thA(nMax, zMbcsP
22bb0 61 74 68 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ath)==0 ){.     
22bc0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42   sqlite3_free(zB
22bd0 75 66 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41  uf);.      OSTRA
22be0 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41  CE(("TEMP-FILENA
22bf0 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45  ME rc=SQLITE_IOE
22c00 52 52 5f 47 45 54 54 45 4d 50 50 41 54 48 5c 6e  RR_GETTEMPPATH\n
22c10 22 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  "));.      retur
22c20 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  n winLogError(SQ
22c30 4c 49 54 45 5f 49 4f 45 52 52 5f 47 45 54 54 45  LITE_IOERR_GETTE
22c40 4d 50 50 41 54 48 2c 20 6f 73 47 65 74 4c 61 73  MPPATH, osGetLas
22c50 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20  tError(),.      
22c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c70 20 20 20 22 77 69 6e 47 65 74 54 65 6d 70 6e 61     "winGetTempna
22c80 6d 65 33 22 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  me3", 0);.    }.
22c90 20 20 20 20 7a 55 74 66 38 20 3d 20 73 71 6c 69      zUtf8 = sqli
22ca0 74 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74  te3_win32_mbcs_t
22cb0 6f 5f 75 74 66 38 28 7a 4d 62 63 73 50 61 74 68  o_utf8(zMbcsPath
22cc0 29 3b 0a 20 20 20 20 69 66 28 20 7a 55 74 66 38  );.    if( zUtf8
22cd0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
22ce0 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4d 61 78 2c  3_snprintf(nMax,
22cf0 20 7a 42 75 66 2c 20 22 25 73 22 2c 20 7a 55 74   zBuf, "%s", zUt
22d00 66 38 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  f8);.      sqlit
22d10 65 33 5f 66 72 65 65 28 7a 55 74 66 38 29 3b 0a  e3_free(zUtf8);.
22d20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
22d30 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42   sqlite3_free(zB
22d40 75 66 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41  uf);.      OSTRA
22d50 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41  CE(("TEMP-FILENA
22d60 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45  ME rc=SQLITE_IOE
22d70 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20  RR_NOMEM\n"));. 
22d80 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
22d90 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a  TE_IOERR_NOMEM;.
22da0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
22db0 20 2f 2a 20 53 51 4c 49 54 45 5f 57 49 4e 33 32   /* SQLITE_WIN32
22dc0 5f 48 41 53 5f 41 4e 53 49 20 2a 2f 0a 23 65 6e  _HAS_ANSI */.#en
22dd0 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f  dif /* !SQLITE_O
22de0 53 5f 57 49 4e 52 54 20 2a 2f 0a 0a 20 20 2f 2a  S_WINRT */..  /*
22df0 0a 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20 6d  .  ** Check to m
22e00 61 6b 65 20 73 75 72 65 20 74 68 65 20 74 65 6d  ake sure the tem
22e10 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72 79  porary directory
22e20 20 65 6e 64 73 20 77 69 74 68 20 61 6e 20 61 70   ends with an ap
22e30 70 72 6f 70 72 69 61 74 65 0a 20 20 2a 2a 20 73  propriate.  ** s
22e40 65 70 61 72 61 74 6f 72 2e 20 20 49 66 20 69 74  eparator.  If it
22e50 20 64 6f 65 73 20 6e 6f 74 20 61 6e 64 20 74 68   does not and th
22e60 65 72 65 20 69 73 20 6e 6f 74 20 65 6e 6f 75 67  ere is not enoug
22e70 68 20 73 70 61 63 65 20 6c 65 66 74 20 74 6f 20  h space left to 
22e80 61 64 64 0a 20 20 2a 2a 20 6f 6e 65 2c 20 66 61  add.  ** one, fa
22e90 69 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  il..  */.  if( !
22ea0 77 69 6e 4d 61 6b 65 45 6e 64 49 6e 44 69 72 53  winMakeEndInDirS
22eb0 65 70 28 6e 44 69 72 2b 31 2c 20 7a 42 75 66 29  ep(nDir+1, zBuf)
22ec0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
22ed0 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20  free(zBuf);.    
22ee0 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46  OSTRACE(("TEMP-F
22ef0 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54  ILENAME rc=SQLIT
22f00 45 5f 45 52 52 4f 52 5c 6e 22 29 29 3b 0a 20 20  E_ERROR\n"));.  
22f10 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45    return winLogE
22f20 72 72 6f 72 28 53 51 4c 49 54 45 5f 45 52 52 4f  rror(SQLITE_ERRO
22f30 52 2c 20 30 2c 20 22 77 69 6e 47 65 74 54 65 6d  R, 0, "winGetTem
22f40 70 6e 61 6d 65 34 22 2c 20 30 29 3b 0a 20 20 7d  pname4", 0);.  }
22f50 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43 68 65 63  ..  /*.  ** Chec
22f60 6b 20 74 68 61 74 20 74 68 65 20 6f 75 74 70 75  k that the outpu
22f70 74 20 62 75 66 66 65 72 20 69 73 20 6c 61 72 67  t buffer is larg
22f80 65 20 65 6e 6f 75 67 68 20 66 6f 72 20 74 68 65  e enough for the
22f90 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 0a   temporary file.
22fa0 20 20 2a 2a 20 6e 61 6d 65 20 69 6e 20 74 68 65    ** name in the
22fb0 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 61   following forma
22fc0 74 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 22  t:.  **.  **   "
22fd0 3c 74 65 6d 70 6f 72 61 72 79 5f 64 69 72 65 63  <temporary_direc
22fe0 74 6f 72 79 3e 2f 65 74 69 6c 71 73 5f 58 58 58  tory>/etilqs_XXX
22ff0 58 58 58 58 58 58 58 58 58 58 58 58 5c 30 5c 30  XXXXXXXXXXXX\0\0
23000 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 6e  ".  **.  ** If n
23010 6f 74 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ot, return SQLIT
23020 45 5f 45 52 52 4f 52 2e 20 20 54 68 65 20 6e 75  E_ERROR.  The nu
23030 6d 62 65 72 20 31 37 20 69 73 20 75 73 65 64 20  mber 17 is used 
23040 68 65 72 65 20 69 6e 20 6f 72 64 65 72 20 74 6f  here in order to
23050 0a 20 20 2a 2a 20 61 63 63 6f 75 6e 74 20 66 6f  .  ** account fo
23060 72 20 74 68 65 20 73 70 61 63 65 20 75 73 65 64  r the space used
23070 20 62 79 20 74 68 65 20 31 35 20 63 68 61 72 61   by the 15 chara
23080 63 74 65 72 20 72 61 6e 64 6f 6d 20 73 75 66 66  cter random suff
23090 69 78 20 61 6e 64 20 74 68 65 0a 20 20 2a 2a 20  ix and the.  ** 
230a0 74 77 6f 20 74 72 61 69 6c 69 6e 67 20 4e 55 4c  two trailing NUL
230b0 20 63 68 61 72 61 63 74 65 72 73 2e 20 20 54 68   characters.  Th
230c0 65 20 66 69 6e 61 6c 20 64 69 72 65 63 74 6f 72  e final director
230d0 79 20 73 65 70 61 72 61 74 6f 72 20 63 68 61 72  y separator char
230e0 61 63 74 65 72 0a 20 20 2a 2a 20 68 61 73 20 61  acter.  ** has a
230f0 6c 72 65 61 64 79 20 61 64 64 65 64 20 69 66 20  lready added if 
23100 69 74 20 77 61 73 20 6e 6f 74 20 61 6c 72 65 61  it was not alrea
23110 64 79 20 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2f  dy present..  */
23120 0a 20 20 6e 4c 65 6e 20 3d 20 73 71 6c 69 74 65  .  nLen = sqlite
23130 33 53 74 72 6c 65 6e 33 30 28 7a 42 75 66 29 3b  3Strlen30(zBuf);
23140 0a 20 20 69 66 28 20 28 6e 4c 65 6e 20 2b 20 6e  .  if( (nLen + n
23150 50 72 65 20 2b 20 31 37 29 20 3e 20 6e 42 75 66  Pre + 17) > nBuf
23160 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
23170 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20  free(zBuf);.    
23180 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46  OSTRACE(("TEMP-F
23190 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54  ILENAME rc=SQLIT
231a0 45 5f 45 52 52 4f 52 5c 6e 22 29 29 3b 0a 20 20  E_ERROR\n"));.  
231b0 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45    return winLogE
231c0 72 72 6f 72 28 53 51 4c 49 54 45 5f 45 52 52 4f  rror(SQLITE_ERRO
231d0 52 2c 20 30 2c 20 22 77 69 6e 47 65 74 54 65 6d  R, 0, "winGetTem
231e0 70 6e 61 6d 65 35 22 2c 20 30 29 3b 0a 20 20 7d  pname5", 0);.  }
231f0 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  ..  sqlite3_snpr
23200 69 6e 74 66 28 6e 42 75 66 2d 31 36 2d 6e 4c 65  intf(nBuf-16-nLe
23210 6e 2c 20 7a 42 75 66 2b 6e 4c 65 6e 2c 20 53 51  n, zBuf+nLen, SQ
23220 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50  LITE_TEMP_FILE_P
23230 52 45 46 49 58 29 3b 0a 0a 20 20 6a 20 3d 20 73  REFIX);..  j = s
23240 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
23250 42 75 66 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  Buf);.  sqlite3_
23260 72 61 6e 64 6f 6d 6e 65 73 73 28 31 35 2c 20 26  randomness(15, &
23270 7a 42 75 66 5b 6a 5d 29 3b 0a 20 20 66 6f 72 28  zBuf[j]);.  for(
23280 69 3d 30 3b 20 69 3c 31 35 3b 20 69 2b 2b 2c 20  i=0; i<15; i++, 
23290 6a 2b 2b 29 7b 0a 20 20 20 20 7a 42 75 66 5b 6a  j++){.    zBuf[j
232a0 5d 20 3d 20 28 63 68 61 72 29 7a 43 68 61 72 73  ] = (char)zChars
232b0 5b 20 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61  [ ((unsigned cha
232c0 72 29 7a 42 75 66 5b 6a 5d 29 25 28 73 69 7a 65  r)zBuf[j])%(size
232d0 6f 66 28 7a 43 68 61 72 73 29 2d 31 29 20 5d 3b  of(zChars)-1) ];
232e0 0a 20 20 7d 0a 20 20 7a 42 75 66 5b 6a 5d 20 3d  .  }.  zBuf[j] =
232f0 20 30 3b 0a 20 20 7a 42 75 66 5b 6a 2b 31 5d 20   0;.  zBuf[j+1] 
23300 3d 20 30 3b 0a 20 20 2a 70 7a 42 75 66 20 3d 20  = 0;.  *pzBuf = 
23310 7a 42 75 66 3b 0a 0a 20 20 4f 53 54 52 41 43 45  zBuf;..  OSTRACE
23320 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45  (("TEMP-FILENAME
23330 20 6e 61 6d 65 3d 25 73 2c 20 72 63 3d 53 51 4c   name=%s, rc=SQL
23340 49 54 45 5f 4f 4b 5c 6e 22 2c 20 7a 42 75 66 29  ITE_OK\n", zBuf)
23350 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
23360 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
23370 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
23380 68 65 20 6e 61 6d 65 64 20 66 69 6c 65 20 69 73  he named file is
23390 20 72 65 61 6c 6c 79 20 61 20 64 69 72 65 63 74   really a direct
233a0 6f 72 79 2e 20 20 52 65 74 75 72 6e 20 66 61 6c  ory.  Return fal
233b0 73 65 20 69 66 0a 2a 2a 20 69 74 20 69 73 20 73  se if.** it is s
233c0 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72 20 74  omething other t
233d0 68 61 6e 20 61 20 64 69 72 65 63 74 6f 72 79 2c  han a directory,
233e0 20 6f 72 20 69 66 20 74 68 65 72 65 20 69 73 20   or if there is 
233f0 61 6e 79 20 6b 69 6e 64 20 6f 66 20 6d 65 6d 6f  any kind of memo
23400 72 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e  ry.** allocation
23410 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61   failure..*/.sta
23420 74 69 63 20 69 6e 74 20 77 69 6e 49 73 44 69 72  tic int winIsDir
23430 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 43 6f  (const void *zCo
23440 6e 76 65 72 74 65 64 29 7b 0a 20 20 44 57 4f 52  nverted){.  DWOR
23450 44 20 61 74 74 72 3b 0a 20 20 69 6e 74 20 72 63  D attr;.  int rc
23460 20 3d 20 30 3b 0a 20 20 44 57 4f 52 44 20 6c 61   = 0;.  DWORD la
23470 73 74 45 72 72 6e 6f 3b 0a 0a 20 20 69 66 28 20  stErrno;..  if( 
23480 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 20 20 20  osIsNT() ){.    
23490 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20  int cnt = 0;.   
234a0 20 57 49 4e 33 32 5f 46 49 4c 45 5f 41 54 54 52   WIN32_FILE_ATTR
234b0 49 42 55 54 45 5f 44 41 54 41 20 73 41 74 74 72  IBUTE_DATA sAttr
234c0 44 61 74 61 3b 0a 20 20 20 20 6d 65 6d 73 65 74  Data;.    memset
234d0 28 26 73 41 74 74 72 44 61 74 61 2c 20 30 2c 20  (&sAttrData, 0, 
234e0 73 69 7a 65 6f 66 28 73 41 74 74 72 44 61 74 61  sizeof(sAttrData
234f0 29 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 21  ));.    while( !
23500 28 72 63 20 3d 20 6f 73 47 65 74 46 69 6c 65 41  (rc = osGetFileA
23510 74 74 72 69 62 75 74 65 73 45 78 57 28 28 4c 50  ttributesExW((LP
23520 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64  CWSTR)zConverted
23530 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
23540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 47                 G
23550 65 74 46 69 6c 65 45 78 49 6e 66 6f 53 74 61 6e  etFileExInfoStan
23560 64 61 72 64 2c 0a 20 20 20 20 20 20 20 20 20 20  dard,.          
23570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23580 20 20 20 26 73 41 74 74 72 44 61 74 61 29 29 20     &sAttrData)) 
23590 26 26 20 77 69 6e 52 65 74 72 79 49 6f 65 72 72  && winRetryIoerr
235a0 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e  (&cnt, &lastErrn
235b0 6f 29 20 29 7b 7d 0a 20 20 20 20 69 66 28 20 21  o) ){}.    if( !
235c0 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  rc ){.      retu
235d0 72 6e 20 30 3b 20 2f 2a 20 49 6e 76 61 6c 69 64  rn 0; /* Invalid
235e0 20 6e 61 6d 65 3f 20 2a 2f 0a 20 20 20 20 7d 0a   name? */.    }.
235f0 20 20 20 20 61 74 74 72 20 3d 20 73 41 74 74 72      attr = sAttr
23600 44 61 74 61 2e 64 77 46 69 6c 65 41 74 74 72 69  Data.dwFileAttri
23610 62 75 74 65 73 3b 0a 23 69 66 20 53 51 4c 49 54  butes;.#if SQLIT
23620 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a 20 20  E_OS_WINCE==0.  
23630 7d 65 6c 73 65 7b 0a 20 20 20 20 61 74 74 72 20  }else{.    attr 
23640 3d 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69  = osGetFileAttri
23650 62 75 74 65 73 41 28 28 63 68 61 72 2a 29 7a 43  butesA((char*)zC
23660 6f 6e 76 65 72 74 65 64 29 3b 0a 23 65 6e 64 69  onverted);.#endi
23670 66 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28  f.  }.  return (
23680 61 74 74 72 21 3d 49 4e 56 41 4c 49 44 5f 46 49  attr!=INVALID_FI
23690 4c 45 5f 41 54 54 52 49 42 55 54 45 53 29 20 26  LE_ATTRIBUTES) &
236a0 26 20 28 61 74 74 72 26 46 49 4c 45 5f 41 54 54  & (attr&FILE_ATT
236b0 52 49 42 55 54 45 5f 44 49 52 45 43 54 4f 52 59  RIBUTE_DIRECTORY
236c0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  );.}../*.** Open
236d0 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74   a file..*/.stat
236e0 69 63 20 69 6e 74 20 77 69 6e 4f 70 65 6e 28 0a  ic int winOpen(.
236f0 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
23700 56 66 73 2c 20 20 20 20 20 20 20 20 2f 2a 20 55  Vfs,        /* U
23710 73 65 64 20 74 6f 20 67 65 74 20 6d 61 78 69 6d  sed to get maxim
23720 75 6d 20 70 61 74 68 20 6e 61 6d 65 20 6c 65 6e  um path name len
23730 67 74 68 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  gth */.  const c
23740 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20  har *zName,     
23750 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
23760 65 20 66 69 6c 65 20 28 55 54 46 2d 38 29 20 2a  e file (UTF-8) *
23770 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  /.  sqlite3_file
23780 20 2a 69 64 2c 20 20 20 20 20 20 20 20 20 2f 2a   *id,         /*
23790 20 57 72 69 74 65 20 74 68 65 20 53 51 4c 69 74   Write the SQLit
237a0 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 68 65  e file handle he
237b0 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  re */.  int flag
237c0 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
237d0 20 20 2f 2a 20 4f 70 65 6e 20 6d 6f 64 65 20 66    /* Open mode f
237e0 6c 61 67 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  lags */.  int *p
237f0 4f 75 74 46 6c 61 67 73 20 20 20 20 20 20 20 20  OutFlags        
23800 20 20 20 20 2f 2a 20 53 74 61 74 75 73 20 72 65      /* Status re
23810 74 75 72 6e 20 66 6c 61 67 73 20 2a 2f 0a 29 7b  turn flags */.){
23820 0a 20 20 48 41 4e 44 4c 45 20 68 3b 0a 20 20 44  .  HANDLE h;.  D
23830 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 20 3d  WORD lastErrno =
23840 20 30 3b 0a 20 20 44 57 4f 52 44 20 64 77 44 65   0;.  DWORD dwDe
23850 73 69 72 65 64 41 63 63 65 73 73 3b 0a 20 20 44  siredAccess;.  D
23860 57 4f 52 44 20 64 77 53 68 61 72 65 4d 6f 64 65  WORD dwShareMode
23870 3b 0a 20 20 44 57 4f 52 44 20 64 77 43 72 65 61  ;.  DWORD dwCrea
23880 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 3b  tionDisposition;
23890 0a 20 20 44 57 4f 52 44 20 64 77 46 6c 61 67 73  .  DWORD dwFlags
238a0 41 6e 64 41 74 74 72 69 62 75 74 65 73 20 3d 20  AndAttributes = 
238b0 30 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  0;.#if SQLITE_OS
238c0 5f 57 49 4e 43 45 0a 20 20 69 6e 74 20 69 73 54  _WINCE.  int isT
238d0 65 6d 70 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  emp = 0;.#endif.
238e0 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65    winFile *pFile
238f0 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b   = (winFile*)id;
23900 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72  .  void *zConver
23910 74 65 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  ted;            
23920 20 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 69 6e    /* Filename in
23930 20 4f 53 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a   OS encoding */.
23940 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55    const char *zU
23950 74 66 38 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b  tf8Name = zName;
23960 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 69 6e 20   /* Filename in 
23970 55 54 46 2d 38 20 65 6e 63 6f 64 69 6e 67 20 2a  UTF-8 encoding *
23980 2f 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b  /.  int cnt = 0;
23990 0a 0a 20 20 2f 2a 20 49 66 20 61 72 67 75 6d 65  ..  /* If argume
239a0 6e 74 20 7a 50 61 74 68 20 69 73 20 61 20 4e 55  nt zPath is a NU
239b0 4c 4c 20 70 6f 69 6e 74 65 72 2c 20 74 68 69 73  LL pointer, this
239c0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 71   function is req
239d0 75 69 72 65 64 20 74 6f 20 6f 70 65 6e 0a 20 20  uired to open.  
239e0 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  ** a temporary f
239f0 69 6c 65 2e 20 55 73 65 20 74 68 69 73 20 62 75  ile. Use this bu
23a00 66 66 65 72 20 74 6f 20 73 74 6f 72 65 20 74 68  ffer to store th
23a10 65 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e 2e 0a  e file name in..
23a20 20 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54 6d    */.  char *zTm
23a30 70 6e 61 6d 65 20 3d 20 30 3b 20 2f 2a 20 46 6f  pname = 0; /* Fo
23a40 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  r temporary file
23a50 6e 61 6d 65 2c 20 69 66 20 6e 65 63 65 73 73 61  name, if necessa
23a60 72 79 2e 20 2a 2f 0a 0a 20 20 69 6e 74 20 72 63  ry. */..  int rc
23a70 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
23a80 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75 6e 63           /* Func
23a90 74 69 6f 6e 20 52 65 74 75 72 6e 20 43 6f 64 65  tion Return Code
23aa0 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64   */.#if !defined
23ab0 28 4e 44 45 42 55 47 29 20 7c 7c 20 53 51 4c 49  (NDEBUG) || SQLI
23ac0 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 69 6e  TE_OS_WINCE.  in
23ad0 74 20 65 54 79 70 65 20 3d 20 66 6c 61 67 73 26  t eType = flags&
23ae0 30 78 46 46 46 46 46 46 30 30 3b 20 20 2f 2a 20  0xFFFFFF00;  /* 
23af0 54 79 70 65 20 6f 66 20 66 69 6c 65 20 74 6f 20  Type of file to 
23b00 6f 70 65 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a  open */.#endif..
23b10 20 20 69 6e 74 20 69 73 45 78 63 6c 75 73 69 76    int isExclusiv
23b20 65 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51  e  = (flags & SQ
23b30 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53  LITE_OPEN_EXCLUS
23b40 49 56 45 29 3b 0a 20 20 69 6e 74 20 69 73 44 65  IVE);.  int isDe
23b50 6c 65 74 65 20 20 20 20 20 3d 20 28 66 6c 61 67  lete     = (flag
23b60 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
23b70 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 29 3b 0a  DELETEONCLOSE);.
23b80 20 20 69 6e 74 20 69 73 43 72 65 61 74 65 20 20    int isCreate  
23b90 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51     = (flags & SQ
23ba0 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
23bb0 29 3b 0a 20 20 69 6e 74 20 69 73 52 65 61 64 6f  );.  int isReado
23bc0 6e 6c 79 20 20 20 3d 20 28 66 6c 61 67 73 20 26  nly   = (flags &
23bd0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
23be0 44 4f 4e 4c 59 29 3b 0a 20 20 69 6e 74 20 69 73  DONLY);.  int is
23bf0 52 65 61 64 57 72 69 74 65 20 20 3d 20 28 66 6c  ReadWrite  = (fl
23c00 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
23c10 4e 5f 52 45 41 44 57 52 49 54 45 29 3b 0a 0a 23  N_READWRITE);..#
23c20 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
23c30 69 6e 74 20 69 73 4f 70 65 6e 4a 6f 75 72 6e 61  int isOpenJourna
23c40 6c 20 3d 20 28 69 73 43 72 65 61 74 65 20 26 26  l = (isCreate &&
23c50 20 28 0a 20 20 20 20 20 20 20 20 65 54 79 70 65   (.        eType
23c60 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  ==SQLITE_OPEN_MA
23c70 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 0a 20 20 20  STER_JOURNAL.   
23c80 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
23c90 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
23ca0 52 4e 41 4c 0a 20 20 20 20 20 7c 7c 20 65 54 79  RNAL.     || eTy
23cb0 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
23cc0 57 41 4c 0a 20 20 29 29 3b 0a 23 65 6e 64 69 66  WAL.  ));.#endif
23cd0 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50  ..  OSTRACE(("OP
23ce0 45 4e 20 6e 61 6d 65 3d 25 73 2c 20 70 46 69 6c  EN name=%s, pFil
23cf0 65 3d 25 70 2c 20 66 6c 61 67 73 3d 25 78 2c 20  e=%p, flags=%x, 
23d00 70 4f 75 74 46 6c 61 67 73 3d 25 70 5c 6e 22 2c  pOutFlags=%p\n",
23d10 0a 20 20 20 20 20 20 20 20 20 20 20 7a 55 74 66  .           zUtf
23d20 38 4e 61 6d 65 2c 20 69 64 2c 20 66 6c 61 67 73  8Name, id, flags
23d30 2c 20 70 4f 75 74 46 6c 61 67 73 29 29 3b 0a 0a  , pOutFlags));..
23d40 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 65 20 66    /* Check the f
23d50 6f 6c 6c 6f 77 69 6e 67 20 73 74 61 74 65 6d 65  ollowing stateme
23d60 6e 74 73 20 61 72 65 20 74 72 75 65 3a 0a 20 20  nts are true:.  
23d70 2a 2a 0a 20 20 2a 2a 20 20 20 28 61 29 20 45 78  **.  **   (a) Ex
23d80 61 63 74 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65  actly one of the
23d90 20 52 45 41 44 57 52 49 54 45 20 61 6e 64 20 52   READWRITE and R
23da0 45 41 44 4f 4e 4c 59 20 66 6c 61 67 73 20 6d 75  EADONLY flags mu
23db0 73 74 20 62 65 20 73 65 74 2c 20 61 6e 64 0a 20  st be set, and. 
23dc0 20 2a 2a 20 20 20 28 62 29 20 69 66 20 43 52 45   **   (b) if CRE
23dd0 41 54 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e  ATE is set, then
23de0 20 52 45 41 44 57 52 49 54 45 20 6d 75 73 74 20   READWRITE must 
23df0 61 6c 73 6f 20 62 65 20 73 65 74 2c 20 61 6e 64  also be set, and
23e00 0a 20 20 2a 2a 20 20 20 28 63 29 20 69 66 20 45  .  **   (c) if E
23e10 58 43 4c 55 53 49 56 45 20 69 73 20 73 65 74 2c  XCLUSIVE is set,
23e20 20 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73   then CREATE mus
23e30 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20  t also be set.. 
23e40 20 2a 2a 20 20 20 28 64 29 20 69 66 20 44 45 4c   **   (d) if DEL
23e50 45 54 45 4f 4e 43 4c 4f 53 45 20 69 73 20 73 65  ETEONCLOSE is se
23e60 74 2c 20 74 68 65 6e 20 43 52 45 41 54 45 20 6d  t, then CREATE m
23e70 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2e  ust also be set.
23e80 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28  .  */.  assert((
23e90 69 73 52 65 61 64 6f 6e 6c 79 3d 3d 30 20 7c 7c  isReadonly==0 ||
23ea0 20 69 73 52 65 61 64 57 72 69 74 65 3d 3d 30 29   isReadWrite==0)
23eb0 20 26 26 20 28 69 73 52 65 61 64 57 72 69 74 65   && (isReadWrite
23ec0 20 7c 7c 20 69 73 52 65 61 64 6f 6e 6c 79 29 29   || isReadonly))
23ed0 3b 0a 20 20 61 73 73 65 72 74 28 69 73 43 72 65  ;.  assert(isCre
23ee0 61 74 65 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64  ate==0 || isRead
23ef0 57 72 69 74 65 29 3b 0a 20 20 61 73 73 65 72 74  Write);.  assert
23f00 28 69 73 45 78 63 6c 75 73 69 76 65 3d 3d 30 20  (isExclusive==0 
23f10 7c 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 20 20  || isCreate);.  
23f20 61 73 73 65 72 74 28 69 73 44 65 6c 65 74 65 3d  assert(isDelete=
23f30 3d 30 20 7c 7c 20 69 73 43 72 65 61 74 65 29 3b  =0 || isCreate);
23f40 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20  ..  /* The main 
23f50 44 42 2c 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  DB, main journal
23f60 2c 20 57 41 4c 20 66 69 6c 65 20 61 6e 64 20 6d  , WAL file and m
23f70 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 72  aster journal ar
23f80 65 20 6e 65 76 65 72 0a 20 20 2a 2a 20 61 75 74  e never.  ** aut
23f90 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74  omatically delet
23fa0 65 64 2e 20 4e 6f 72 20 61 72 65 20 74 68 65 79  ed. Nor are they
23fb0 20 65 76 65 72 20 74 65 6d 70 6f 72 61 72 79 20   ever temporary 
23fc0 66 69 6c 65 73 2e 20 20 2a 2f 0a 20 20 61 73 73  files.  */.  ass
23fd0 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20  ert( (!isDelete 
23fe0 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79  && zName) || eTy
23ff0 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe!=SQLITE_OPEN_
24000 4d 41 49 4e 5f 44 42 20 29 3b 0a 20 20 61 73 73  MAIN_DB );.  ass
24010 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20  ert( (!isDelete 
24020 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79  && zName) || eTy
24030 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe!=SQLITE_OPEN_
24040 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a  MAIN_JOURNAL );.
24050 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65    assert( (!isDe
24060 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c  lete && zName) |
24070 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f  | eType!=SQLITE_
24080 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52  OPEN_MASTER_JOUR
24090 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  NAL );.  assert(
240a0 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a   (!isDelete && z
240b0 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d  Name) || eType!=
240c0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20  SQLITE_OPEN_WAL 
240d0 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20  );..  /* Assert 
240e0 74 68 61 74 20 74 68 65 20 75 70 70 65 72 20 6c  that the upper l
240f0 61 79 65 72 20 68 61 73 20 73 65 74 20 6f 6e 65  ayer has set one
24100 20 6f 66 20 74 68 65 20 22 66 69 6c 65 2d 74 79   of the "file-ty
24110 70 65 22 20 66 6c 61 67 73 2e 20 2a 2f 0a 20 20  pe" flags. */.  
24120 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 53  assert( eType==S
24130 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
24140 44 42 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65  DB      || eType
24150 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45  ==SQLITE_OPEN_TE
24160 4d 50 5f 44 42 0a 20 20 20 20 20 20 20 7c 7c 20  MP_DB.       || 
24170 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
24180 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20  EN_MAIN_JOURNAL 
24190 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
241a0 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e  _OPEN_TEMP_JOURN
241b0 41 4c 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79  AL.       || eTy
241c0 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
241d0 53 55 42 4a 4f 55 52 4e 41 4c 20 20 20 7c 7c 20  SUBJOURNAL   || 
241e0 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
241f0 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41  EN_MASTER_JOURNA
24200 4c 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70  L.       || eTyp
24210 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54  e==SQLITE_OPEN_T
24220 52 41 4e 53 49 45 4e 54 5f 44 42 20 7c 7c 20 65  RANSIENT_DB || e
24230 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
24240 4e 5f 57 41 4c 0a 20 20 29 3b 0a 0a 20 20 61 73  N_WAL.  );..  as
24250 73 65 72 74 28 20 70 46 69 6c 65 21 3d 30 20 29  sert( pFile!=0 )
24260 3b 0a 20 20 6d 65 6d 73 65 74 28 70 46 69 6c 65  ;.  memset(pFile
24270 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 69 6e 46  , 0, sizeof(winF
24280 69 6c 65 29 29 3b 0a 20 20 70 46 69 6c 65 2d 3e  ile));.  pFile->
24290 68 20 3d 20 49 4e 56 41 4c 49 44 5f 48 41 4e 44  h = INVALID_HAND
242a0 4c 45 5f 56 41 4c 55 45 3b 0a 0a 23 69 66 20 53  LE_VALUE;..#if S
242b0 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
242c0 20 69 66 28 20 21 7a 55 74 66 38 4e 61 6d 65 20   if( !zUtf8Name 
242d0 26 26 20 21 73 71 6c 69 74 65 33 5f 74 65 6d 70  && !sqlite3_temp
242e0 5f 64 69 72 65 63 74 6f 72 79 20 29 7b 0a 20 20  _directory ){.  
242f0 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51    sqlite3_log(SQ
24300 4c 49 54 45 5f 45 52 52 4f 52 2c 0a 20 20 20 20  LITE_ERROR,.    
24310 20 20 20 20 22 73 71 6c 69 74 65 33 5f 74 65 6d      "sqlite3_tem
24320 70 5f 64 69 72 65 63 74 6f 72 79 20 76 61 72 69  p_directory vari
24330 61 62 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 73  able should be s
24340 65 74 20 66 6f 72 20 57 69 6e 52 54 22 29 3b 0a  et for WinRT");.
24350 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
24360 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   If the second a
24370 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
24380 66 75 6e 63 74 69 6f 6e 20 69 73 20 4e 55 4c 4c  function is NULL
24390 2c 20 67 65 6e 65 72 61 74 65 20 61 0a 20 20 2a  , generate a.  *
243a0 2a 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  * temporary file
243b0 20 6e 61 6d 65 20 74 6f 20 75 73 65 0a 20 20 2a   name to use.  *
243c0 2f 0a 20 20 69 66 28 20 21 7a 55 74 66 38 4e 61  /.  if( !zUtf8Na
243d0 6d 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  me ){.    assert
243e0 28 20 69 73 44 65 6c 65 74 65 20 26 26 20 21 69  ( isDelete && !i
243f0 73 4f 70 65 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a  sOpenJournal );.
24400 20 20 20 20 72 63 20 3d 20 77 69 6e 47 65 74 54      rc = winGetT
24410 65 6d 70 6e 61 6d 65 28 70 56 66 73 2c 20 26 7a  empname(pVfs, &z
24420 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66  Tmpname);.    if
24430 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
24440 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  ){.      OSTRACE
24450 28 28 22 4f 50 45 4e 20 6e 61 6d 65 3d 25 73 2c  (("OPEN name=%s,
24460 20 72 63 3d 25 73 22 2c 20 7a 55 74 66 38 4e 61   rc=%s", zUtf8Na
24470 6d 65 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61  me, sqlite3ErrNa
24480 6d 65 28 72 63 29 29 29 3b 0a 20 20 20 20 20 20  me(rc)));.      
24490 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
244a0 0a 20 20 20 20 7a 55 74 66 38 4e 61 6d 65 20 3d  .    zUtf8Name =
244b0 20 7a 54 6d 70 6e 61 6d 65 3b 0a 20 20 7d 0a 0a   zTmpname;.  }..
244c0 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69    /* Database fi
244d0 6c 65 6e 61 6d 65 73 20 61 72 65 20 64 6f 75 62  lenames are doub
244e0 6c 65 2d 7a 65 72 6f 20 74 65 72 6d 69 6e 61 74  le-zero terminat
244f0 65 64 20 69 66 20 74 68 65 79 20 61 72 65 20 6e  ed if they are n
24500 6f 74 0a 20 20 2a 2a 20 55 52 49 73 20 77 69 74  ot.  ** URIs wit
24510 68 20 70 61 72 61 6d 65 74 65 72 73 2e 20 20 48  h parameters.  H
24520 65 6e 63 65 2c 20 74 68 65 79 20 63 61 6e 20 61  ence, they can a
24530 6c 77 61 79 73 20 62 65 20 70 61 73 73 65 64 20  lways be passed 
24540 69 6e 74 6f 0a 20 20 2a 2a 20 73 71 6c 69 74 65  into.  ** sqlite
24550 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28  3_uri_parameter(
24560 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  )..  */.  assert
24570 28 20 28 65 54 79 70 65 21 3d 53 51 4c 49 54 45  ( (eType!=SQLITE
24580 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 20 7c  _OPEN_MAIN_DB) |
24590 7c 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  | (flags & SQLIT
245a0 45 5f 4f 50 45 4e 5f 55 52 49 29 20 7c 7c 0a 20  E_OPEN_URI) ||. 
245b0 20 20 20 20 20 20 7a 55 74 66 38 4e 61 6d 65 5b        zUtf8Name[
245c0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
245d0 7a 55 74 66 38 4e 61 6d 65 29 2b 31 5d 3d 3d 30  zUtf8Name)+1]==0
245e0 20 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 76 65 72   );..  /* Conver
245f0 74 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 74  t the filename t
24600 6f 20 74 68 65 20 73 79 73 74 65 6d 20 65 6e 63  o the system enc
24610 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20 7a 43 6f 6e  oding. */.  zCon
24620 76 65 72 74 65 64 20 3d 20 77 69 6e 43 6f 6e 76  verted = winConv
24630 65 72 74 46 72 6f 6d 55 74 66 38 46 69 6c 65 6e  ertFromUtf8Filen
24640 61 6d 65 28 7a 55 74 66 38 4e 61 6d 65 29 3b 0a  ame(zUtf8Name);.
24650 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64    if( zConverted
24660 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
24670 65 33 5f 66 72 65 65 28 7a 54 6d 70 6e 61 6d 65  e3_free(zTmpname
24680 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  );.    OSTRACE((
24690 22 4f 50 45 4e 20 6e 61 6d 65 3d 25 73 2c 20 72  "OPEN name=%s, r
246a0 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  c=SQLITE_IOERR_N
246b0 4f 4d 45 4d 22 2c 20 7a 55 74 66 38 4e 61 6d 65  OMEM", zUtf8Name
246c0 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ));.    return S
246d0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
246e0 4d 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 77 69  M;.  }..  if( wi
246f0 6e 49 73 44 69 72 28 7a 43 6f 6e 76 65 72 74 65  nIsDir(zConverte
24700 64 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  d) ){.    sqlite
24710 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
24720 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  d);.    sqlite3_
24730 66 72 65 65 28 7a 54 6d 70 6e 61 6d 65 29 3b 0a  free(zTmpname);.
24740 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50      OSTRACE(("OP
24750 45 4e 20 6e 61 6d 65 3d 25 73 2c 20 72 63 3d 53  EN name=%s, rc=S
24760 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 49  QLITE_CANTOPEN_I
24770 53 44 49 52 22 2c 20 7a 55 74 66 38 4e 61 6d 65  SDIR", zUtf8Name
24780 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ));.    return S
24790 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 49  QLITE_CANTOPEN_I
247a0 53 44 49 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  SDIR;.  }..  if(
247b0 20 69 73 52 65 61 64 57 72 69 74 65 20 29 7b 0a   isReadWrite ){.
247c0 20 20 20 20 64 77 44 65 73 69 72 65 64 41 63 63      dwDesiredAcc
247d0 65 73 73 20 3d 20 47 45 4e 45 52 49 43 5f 52 45  ess = GENERIC_RE
247e0 41 44 20 7c 20 47 45 4e 45 52 49 43 5f 57 52 49  AD | GENERIC_WRI
247f0 54 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  TE;.  }else{.   
24800 20 64 77 44 65 73 69 72 65 64 41 63 63 65 73 73   dwDesiredAccess
24810 20 3d 20 47 45 4e 45 52 49 43 5f 52 45 41 44 3b   = GENERIC_READ;
24820 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 51 4c 49 54  .  }..  /* SQLIT
24830 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45  E_OPEN_EXCLUSIVE
24840 20 69 73 20 75 73 65 64 20 74 6f 20 6d 61 6b 65   is used to make
24850 20 73 75 72 65 20 74 68 61 74 20 61 20 6e 65 77   sure that a new
24860 20 66 69 6c 65 20 69 73 0a 20 20 2a 2a 20 63 72   file is.  ** cr
24870 65 61 74 65 64 2e 20 53 51 4c 69 74 65 20 64 6f  eated. SQLite do
24880 65 73 6e 27 74 20 75 73 65 20 69 74 20 74 6f 20  esn't use it to 
24890 69 6e 64 69 63 61 74 65 20 22 65 78 63 6c 75 73  indicate "exclus
248a0 69 76 65 20 61 63 63 65 73 73 22 0a 20 20 2a 2a  ive access".  **
248b0 20 61 73 20 69 74 20 69 73 20 75 73 75 61 6c 6c   as it is usuall
248c0 79 20 75 6e 64 65 72 73 74 6f 6f 64 2e 0a 20 20  y understood..  
248d0 2a 2f 0a 20 20 69 66 28 20 69 73 45 78 63 6c 75  */.  if( isExclu
248e0 73 69 76 65 20 29 7b 0a 20 20 20 20 2f 2a 20 43  sive ){.    /* C
248f0 72 65 61 74 65 73 20 61 20 6e 65 77 20 66 69 6c  reates a new fil
24900 65 2c 20 6f 6e 6c 79 20 69 66 20 69 74 20 64 6f  e, only if it do
24910 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65  es not already e
24920 78 69 73 74 2e 20 2a 2f 0a 20 20 20 20 2f 2a 20  xist. */.    /* 
24930 49 66 20 74 68 65 20 66 69 6c 65 20 65 78 69 73  If the file exis
24940 74 73 2c 20 69 74 20 66 61 69 6c 73 2e 20 2a 2f  ts, it fails. */
24950 0a 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44  .    dwCreationD
24960 69 73 70 6f 73 69 74 69 6f 6e 20 3d 20 43 52 45  isposition = CRE
24970 41 54 45 5f 4e 45 57 3b 0a 20 20 7d 65 6c 73 65  ATE_NEW;.  }else
24980 20 69 66 28 20 69 73 43 72 65 61 74 65 20 29 7b   if( isCreate ){
24990 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 65 78 69  .    /* Open exi
249a0 73 74 69 6e 67 20 66 69 6c 65 2c 20 6f 72 20 63  sting file, or c
249b0 72 65 61 74 65 20 69 66 20 69 74 20 64 6f 65 73  reate if it does
249c0 6e 27 74 20 65 78 69 73 74 20 2a 2f 0a 20 20 20  n't exist */.   
249d0 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f   dwCreationDispo
249e0 73 69 74 69 6f 6e 20 3d 20 4f 50 45 4e 5f 41 4c  sition = OPEN_AL
249f0 57 41 59 53 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  WAYS;.  }else{. 
24a00 20 20 20 2f 2a 20 4f 70 65 6e 73 20 61 20 66 69     /* Opens a fi
24a10 6c 65 2c 20 6f 6e 6c 79 20 69 66 20 69 74 20 65  le, only if it e
24a20 78 69 73 74 73 2e 20 2a 2f 0a 20 20 20 20 64 77  xists. */.    dw
24a30 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74  CreationDisposit
24a40 69 6f 6e 20 3d 20 4f 50 45 4e 5f 45 58 49 53 54  ion = OPEN_EXIST
24a50 49 4e 47 3b 0a 20 20 7d 0a 0a 20 20 64 77 53 68  ING;.  }..  dwSh
24a60 61 72 65 4d 6f 64 65 20 3d 20 46 49 4c 45 5f 53  areMode = FILE_S
24a70 48 41 52 45 5f 52 45 41 44 20 7c 20 46 49 4c 45  HARE_READ | FILE
24a80 5f 53 48 41 52 45 5f 57 52 49 54 45 3b 0a 0a 20  _SHARE_WRITE;.. 
24a90 20 69 66 28 20 69 73 44 65 6c 65 74 65 20 29 7b   if( isDelete ){
24aa0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
24ab0 49 4e 43 45 0a 20 20 20 20 64 77 46 6c 61 67 73  INCE.    dwFlags
24ac0 41 6e 64 41 74 74 72 69 62 75 74 65 73 20 3d 20  AndAttributes = 
24ad0 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 48  FILE_ATTRIBUTE_H
24ae0 49 44 44 45 4e 3b 0a 20 20 20 20 69 73 54 65 6d  IDDEN;.    isTem
24af0 70 20 3d 20 31 3b 0a 23 65 6c 73 65 0a 20 20 20  p = 1;.#else.   
24b00 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69   dwFlagsAndAttri
24b10 62 75 74 65 73 20 3d 20 46 49 4c 45 5f 41 54 54  butes = FILE_ATT
24b20 52 49 42 55 54 45 5f 54 45 4d 50 4f 52 41 52 59  RIBUTE_TEMPORARY
24b30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
24b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b50 7c 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  | FILE_ATTRIBUTE
24b60 5f 48 49 44 44 45 4e 0a 20 20 20 20 20 20 20 20  _HIDDEN.        
24b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b80 20 20 20 20 20 20 20 7c 20 46 49 4c 45 5f 46 4c         | FILE_FL
24b90 41 47 5f 44 45 4c 45 54 45 5f 4f 4e 5f 43 4c 4f  AG_DELETE_ON_CLO
24ba0 53 45 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c  SE;.#endif.  }el
24bb0 73 65 7b 0a 20 20 20 20 64 77 46 6c 61 67 73 41  se{.    dwFlagsA
24bc0 6e 64 41 74 74 72 69 62 75 74 65 73 20 3d 20 46  ndAttributes = F
24bd0 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 4e 4f  ILE_ATTRIBUTE_NO
24be0 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20 2f 2a 20 52  RMAL;.  }.  /* R
24bf0 65 70 6f 72 74 73 20 66 72 6f 6d 20 74 68 65 20  eports from the 
24c00 69 6e 74 65 72 6e 65 74 20 61 72 65 20 74 68 61  internet are tha
24c10 74 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 69 73  t performance is
24c20 20 61 6c 77 61 79 73 0a 20 20 2a 2a 20 62 65 74   always.  ** bet
24c30 74 65 72 20 69 66 20 46 49 4c 45 5f 46 4c 41 47  ter if FILE_FLAG
24c40 5f 52 41 4e 44 4f 4d 5f 41 43 43 45 53 53 20 69  _RANDOM_ACCESS i
24c50 73 20 75 73 65 64 2e 20 20 54 69 63 6b 65 74 20  s used.  Ticket 
24c60 23 32 36 39 39 2e 20 2a 2f 0a 23 69 66 20 53 51  #2699. */.#if SQ
24c70 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
24c80 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62  dwFlagsAndAttrib
24c90 75 74 65 73 20 7c 3d 20 46 49 4c 45 5f 46 4c 41  utes |= FILE_FLA
24ca0 47 5f 52 41 4e 44 4f 4d 5f 41 43 43 45 53 53 3b  G_RANDOM_ACCESS;
24cb0 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 6f  .#endif..  if( o
24cc0 73 49 73 4e 54 28 29 20 29 7b 0a 23 69 66 20 53  sIsNT() ){.#if S
24cd0 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
24ce0 20 20 20 43 52 45 41 54 45 46 49 4c 45 32 5f 45     CREATEFILE2_E
24cf0 58 54 45 4e 44 45 44 5f 50 41 52 41 4d 45 54 45  XTENDED_PARAMETE
24d00 52 53 20 65 78 74 65 6e 64 65 64 50 61 72 61 6d  RS extendedParam
24d10 65 74 65 72 73 3b 0a 20 20 20 20 65 78 74 65 6e  eters;.    exten
24d20 64 65 64 50 61 72 61 6d 65 74 65 72 73 2e 64 77  dedParameters.dw
24d30 53 69 7a 65 20 3d 20 73 69 7a 65 6f 66 28 43 52  Size = sizeof(CR
24d40 45 41 54 45 46 49 4c 45 32 5f 45 58 54 45 4e 44  EATEFILE2_EXTEND
24d50 45 44 5f 50 41 52 41 4d 45 54 45 52 53 29 3b 0a  ED_PARAMETERS);.
24d60 20 20 20 20 65 78 74 65 6e 64 65 64 50 61 72 61      extendedPara
24d70 6d 65 74 65 72 73 2e 64 77 46 69 6c 65 41 74 74  meters.dwFileAtt
24d80 72 69 62 75 74 65 73 20 3d 0a 20 20 20 20 20 20  ributes =.      
24d90 20 20 20 20 20 20 64 77 46 6c 61 67 73 41 6e 64        dwFlagsAnd
24da0 41 74 74 72 69 62 75 74 65 73 20 26 20 46 49 4c  Attributes & FIL
24db0 45 5f 41 54 54 52 49 42 55 54 45 5f 4d 41 53 4b  E_ATTRIBUTE_MASK
24dc0 3b 0a 20 20 20 20 65 78 74 65 6e 64 65 64 50 61  ;.    extendedPa
24dd0 72 61 6d 65 74 65 72 73 2e 64 77 46 69 6c 65 46  rameters.dwFileF
24de0 6c 61 67 73 20 3d 20 64 77 46 6c 61 67 73 41 6e  lags = dwFlagsAn
24df0 64 41 74 74 72 69 62 75 74 65 73 20 26 20 46 49  dAttributes & FI
24e00 4c 45 5f 46 4c 41 47 5f 4d 41 53 4b 3b 0a 20 20  LE_FLAG_MASK;.  
24e10 20 20 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65    extendedParame
24e20 74 65 72 73 2e 64 77 53 65 63 75 72 69 74 79 51  ters.dwSecurityQ
24e30 6f 73 46 6c 61 67 73 20 3d 20 53 45 43 55 52 49  osFlags = SECURI
24e40 54 59 5f 41 4e 4f 4e 59 4d 4f 55 53 3b 0a 20 20  TY_ANONYMOUS;.  
24e50 20 20 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65    extendedParame
24e60 74 65 72 73 2e 6c 70 53 65 63 75 72 69 74 79 41  ters.lpSecurityA
24e70 74 74 72 69 62 75 74 65 73 20 3d 20 4e 55 4c 4c  ttributes = NULL
24e80 3b 0a 20 20 20 20 65 78 74 65 6e 64 65 64 50 61  ;.    extendedPa
24e90 72 61 6d 65 74 65 72 73 2e 68 54 65 6d 70 6c 61  rameters.hTempla
24ea0 74 65 46 69 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 20  teFile = NULL;. 
24eb0 20 20 20 77 68 69 6c 65 28 20 28 68 20 3d 20 6f     while( (h = o
24ec0 73 43 72 65 61 74 65 46 69 6c 65 32 28 28 4c 50  sCreateFile2((LP
24ed0 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64  CWSTR)zConverted
24ee0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
24ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24f00 64 77 44 65 73 69 72 65 64 41 63 63 65 73 73 2c  dwDesiredAccess,
24f10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
24f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
24f30 77 53 68 61 72 65 4d 6f 64 65 2c 0a 20 20 20 20  wShareMode,.    
24f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24f50 20 20 20 20 20 20 20 20 20 20 64 77 43 72 65 61            dwCrea
24f60 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 2c  tionDisposition,
24f70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
24f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
24f90 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74 65  extendedParamete
24fa0 72 73 29 29 3d 3d 49 4e 56 41 4c 49 44 5f 48 41  rs))==INVALID_HA
24fb0 4e 44 4c 45 5f 56 41 4c 55 45 20 26 26 0a 20 20  NDLE_VALUE &&.  
24fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24fd0 20 20 20 20 20 20 20 20 20 20 20 20 77 69 6e 52              winR
24fe0 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20  etryIoerr(&cnt, 
24ff0 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 0a 20  &lastErrno) ){. 
25000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25010 20 4e 6f 6f 70 20 2a 2f 0a 20 20 20 20 7d 0a 23   Noop */.    }.#
25020 65 6c 73 65 0a 20 20 20 20 77 68 69 6c 65 28 20  else.    while( 
25030 28 68 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c  (h = osCreateFil
25040 65 57 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e  eW((LPCWSTR)zCon
25050 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20  verted,.        
25060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25070 20 20 20 20 20 20 64 77 44 65 73 69 72 65 64 41        dwDesiredA
25080 63 63 65 73 73 2c 0a 20 20 20 20 20 20 20 20 20  ccess,.         
25090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
250a0 20 20 20 20 20 64 77 53 68 61 72 65 4d 6f 64 65       dwShareMode
250b0 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20  , NULL,.        
250c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
250d0 20 20 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e        dwCreation
250e0 44 69 73 70 6f 73 69 74 69 6f 6e 2c 0a 20 20 20  Disposition,.   
250f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25100 20 20 20 20 20 20 20 20 20 20 20 64 77 46 6c 61             dwFla
25110 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 2c  gsAndAttributes,
25120 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
25130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4e                 N
25140 55 4c 4c 29 29 3d 3d 49 4e 56 41 4c 49 44 5f 48  ULL))==INVALID_H
25150 41 4e 44 4c 45 5f 56 41 4c 55 45 20 26 26 0a 20  ANDLE_VALUE &&. 
25160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25170 20 20 20 20 20 20 20 20 20 20 20 20 20 77 69 6e               win
25180 52 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c  RetryIoerr(&cnt,
25190 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 0a   &lastErrno) ){.
251a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
251b0 2a 20 4e 6f 6f 70 20 2a 2f 0a 20 20 20 20 7d 0a  * Noop */.    }.
251c0 23 65 6e 64 69 66 0a 20 20 7d 0a 23 69 66 64 65  #endif.  }.#ifde
251d0 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  f SQLITE_WIN32_H
251e0 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a  AS_ANSI.  else{.
251f0 20 20 20 20 77 68 69 6c 65 28 20 28 68 20 3d 20      while( (h = 
25200 6f 73 43 72 65 61 74 65 46 69 6c 65 41 28 28 4c  osCreateFileA((L
25210 50 43 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64  PCSTR)zConverted
25220 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
25230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25240 64 77 44 65 73 69 72 65 64 41 63 63 65 73 73 2c  dwDesiredAccess,
25250 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
25260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
25270 77 53 68 61 72 65 4d 6f 64 65 2c 20 4e 55 4c 4c  wShareMode, NULL
25280 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
25290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
252a0 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73  dwCreationDispos
252b0 69 74 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20 20  ition,.         
252c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
252d0 20 20 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41       dwFlagsAndA
252e0 74 74 72 69 62 75 74 65 73 2c 0a 20 20 20 20 20  ttributes,.     
252f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25300 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 29 29 3d           NULL))=
25310 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f  =INVALID_HANDLE_
25320 56 41 4c 55 45 20 26 26 0a 20 20 20 20 20 20 20  VALUE &&.       
25330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25340 20 20 20 20 20 20 20 77 69 6e 52 65 74 72 79 49         winRetryI
25350 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74  oerr(&cnt, &last
25360 45 72 72 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20  Errno) ){.      
25370 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 6f 70           /* Noop
25380 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65   */.    }.  }.#e
25390 6e 64 69 66 0a 20 20 77 69 6e 4c 6f 67 49 6f 65  ndif.  winLogIoe
253a0 72 72 28 63 6e 74 29 3b 0a 0a 20 20 4f 53 54 52  rr(cnt);..  OSTR
253b0 41 43 45 28 28 22 4f 50 45 4e 20 66 69 6c 65 3d  ACE(("OPEN file=
253c0 25 70 2c 20 6e 61 6d 65 3d 25 73 2c 20 61 63 63  %p, name=%s, acc
253d0 65 73 73 3d 25 6c 78 2c 20 72 63 3d 25 73 5c 6e  ess=%lx, rc=%s\n
253e0 22 2c 20 68 2c 20 7a 55 74 66 38 4e 61 6d 65 2c  ", h, zUtf8Name,
253f0 0a 20 20 20 20 20 20 20 20 20 20 20 64 77 44 65  .           dwDe
25400 73 69 72 65 64 41 63 63 65 73 73 2c 20 28 68 3d  siredAccess, (h=
25410 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f  =INVALID_HANDLE_
25420 56 41 4c 55 45 29 20 3f 20 22 66 61 69 6c 65 64  VALUE) ? "failed
25430 22 20 3a 20 22 6f 6b 22 29 29 3b 0a 0a 20 20 69  " : "ok"));..  i
25440 66 28 20 68 3d 3d 49 4e 56 41 4c 49 44 5f 48 41  f( h==INVALID_HA
25450 4e 44 4c 45 5f 56 41 4c 55 45 20 29 7b 0a 20 20  NDLE_VALUE ){.  
25460 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
25470 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a  no = lastErrno;.
25480 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28      winLogError(
25490 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2c  SQLITE_CANTOPEN,
254a0 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
254b0 6f 2c 20 22 77 69 6e 4f 70 65 6e 22 2c 20 7a 55  o, "winOpen", zU
254c0 74 66 38 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71  tf8Name);.    sq
254d0 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76  lite3_free(zConv
254e0 65 72 74 65 64 29 3b 0a 20 20 20 20 73 71 6c 69  erted);.    sqli
254f0 74 65 33 5f 66 72 65 65 28 7a 54 6d 70 6e 61 6d  te3_free(zTmpnam
25500 65 29 3b 0a 20 20 20 20 69 66 28 20 69 73 52 65  e);.    if( isRe
25510 61 64 57 72 69 74 65 20 26 26 20 21 69 73 45 78  adWrite && !isEx
25520 63 6c 75 73 69 76 65 20 29 7b 0a 20 20 20 20 20  clusive ){.     
25530 20 72 65 74 75 72 6e 20 77 69 6e 4f 70 65 6e 28   return winOpen(
25540 70 56 66 73 2c 20 7a 4e 61 6d 65 2c 20 69 64 2c  pVfs, zName, id,
25550 0a 20 20 20 20 20 20 20 20 20 28 28 66 6c 61 67  .         ((flag
25560 73 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  s|SQLITE_OPEN_RE
25570 41 44 4f 4e 4c 59 29 20 26 0a 20 20 20 20 20 20  ADONLY) &.      
25580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7e                 ~
25590 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45  (SQLITE_OPEN_CRE
255a0 41 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ATE|SQLITE_OPEN_
255b0 52 45 41 44 57 52 49 54 45 29 29 2c 0a 20 20 20  READWRITE)),.   
255c0 20 20 20 20 20 20 70 4f 75 74 46 6c 61 67 73 29        pOutFlags)
255d0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
255e0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
255f0 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a  _CANTOPEN_BKPT;.
25600 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
25610 20 70 4f 75 74 46 6c 61 67 73 20 29 7b 0a 20 20   pOutFlags ){.  
25620 20 20 69 66 28 20 69 73 52 65 61 64 57 72 69 74    if( isReadWrit
25630 65 20 29 7b 0a 20 20 20 20 20 20 2a 70 4f 75 74  e ){.      *pOut
25640 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f  Flags = SQLITE_O
25650 50 45 4e 5f 52 45 41 44 57 52 49 54 45 3b 0a 20  PEN_READWRITE;. 
25660 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
25670 2a 70 4f 75 74 46 6c 61 67 73 20 3d 20 53 51 4c  *pOutFlags = SQL
25680 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
25690 59 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  Y;.    }.  }..  
256a0 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 20 66  OSTRACE(("OPEN f
256b0 69 6c 65 3d 25 70 2c 20 6e 61 6d 65 3d 25 73 2c  ile=%p, name=%s,
256c0 20 61 63 63 65 73 73 3d 25 6c 78 2c 20 70 4f 75   access=%lx, pOu
256d0 74 46 6c 61 67 73 3d 25 70 2c 20 2a 70 4f 75 74  tFlags=%p, *pOut
256e0 46 6c 61 67 73 3d 25 64 2c 20 22 0a 20 20 20 20  Flags=%d, ".    
256f0 20 20 20 20 20 20 20 22 72 63 3d 25 73 5c 6e 22         "rc=%s\n"
25700 2c 20 68 2c 20 7a 55 74 66 38 4e 61 6d 65 2c 20  , h, zUtf8Name, 
25710 64 77 44 65 73 69 72 65 64 41 63 63 65 73 73 2c  dwDesiredAccess,
25720 20 70 4f 75 74 46 6c 61 67 73 2c 20 70 4f 75 74   pOutFlags, pOut
25730 46 6c 61 67 73 20 3f 0a 20 20 20 20 20 20 20 20  Flags ?.        
25740 20 20 20 2a 70 4f 75 74 46 6c 61 67 73 20 3a 20     *pOutFlags : 
25750 30 2c 20 28 68 3d 3d 49 4e 56 41 4c 49 44 5f 48  0, (h==INVALID_H
25760 41 4e 44 4c 45 5f 56 41 4c 55 45 29 20 3f 20 22  ANDLE_VALUE) ? "
25770 66 61 69 6c 65 64 22 20 3a 20 22 6f 6b 22 29 29  failed" : "ok"))
25780 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  ;..#if SQLITE_OS
25790 5f 57 49 4e 43 45 0a 20 20 69 66 28 20 69 73 52  _WINCE.  if( isR
257a0 65 61 64 57 72 69 74 65 20 26 26 20 65 54 79 70  eadWrite && eTyp
257b0 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e==SQLITE_OPEN_M
257c0 41 49 4e 5f 44 42 0a 20 20 20 20 20 20 20 26 26  AIN_DB.       &&
257d0 20 28 72 63 20 3d 20 77 69 6e 63 65 43 72 65 61   (rc = winceCrea
257e0 74 65 4c 6f 63 6b 28 7a 4e 61 6d 65 2c 20 70 46  teLock(zName, pF
257f0 69 6c 65 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b  ile))!=SQLITE_OK
25800 0a 20 20 29 7b 0a 20 20 20 20 6f 73 43 6c 6f 73  .  ){.    osClos
25810 65 48 61 6e 64 6c 65 28 68 29 3b 0a 20 20 20 20  eHandle(h);.    
25820 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
25830 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 73 71  nverted);.    sq
25840 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 6d 70 6e  lite3_free(zTmpn
25850 61 6d 65 29 3b 0a 20 20 20 20 4f 53 54 52 41 43  ame);.    OSTRAC
25860 45 28 28 22 4f 50 45 4e 2d 43 45 2d 4c 4f 43 4b  E(("OPEN-CE-LOCK
25870 20 6e 61 6d 65 3d 25 73 2c 20 72 63 3d 25 73 5c   name=%s, rc=%s\
25880 6e 22 2c 20 7a 4e 61 6d 65 2c 20 73 71 6c 69 74  n", zName, sqlit
25890 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b  e3ErrName(rc)));
258a0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
258b0 20 20 7d 0a 20 20 69 66 28 20 69 73 54 65 6d 70    }.  if( isTemp
258c0 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 7a   ){.    pFile->z
258d0 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 20 3d 20  DeleteOnClose = 
258e0 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 7d 65  zConverted;.  }e
258f0 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20  lse.#endif.  {. 
25900 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
25910 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 7d  zConverted);.  }
25920 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ..  sqlite3_free
25930 28 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 70 46  (zTmpname);.  pF
25940 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 26  ile->pMethod = &
25950 77 69 6e 49 6f 4d 65 74 68 6f 64 3b 0a 20 20 70  winIoMethod;.  p
25960 46 69 6c 65 2d 3e 70 56 66 73 20 3d 20 70 56 66  File->pVfs = pVf
25970 73 3b 0a 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20  s;.  pFile->h = 
25980 68 3b 0a 20 20 69 66 28 20 69 73 52 65 61 64 6f  h;.  if( isReado
25990 6e 6c 79 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  nly ){.    pFile
259a0 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 57  ->ctrlFlags |= W
259b0 49 4e 46 49 4c 45 5f 52 44 4f 4e 4c 59 3b 0a 20  INFILE_RDONLY;. 
259c0 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33   }.  if( sqlite3
259d0 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 7a 4e 61  _uri_boolean(zNa
259e0 6d 65 2c 20 22 70 73 6f 77 22 2c 20 53 51 4c 49  me, "psow", SQLI
259f0 54 45 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45  TE_POWERSAFE_OVE
25a00 52 57 52 49 54 45 29 20 29 7b 0a 20 20 20 20 70  RWRITE) ){.    p
25a10 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20  File->ctrlFlags 
25a20 7c 3d 20 57 49 4e 46 49 4c 45 5f 50 53 4f 57 3b  |= WINFILE_PSOW;
25a30 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 6c 61  .  }.  pFile->la
25a40 73 74 45 72 72 6e 6f 20 3d 20 4e 4f 5f 45 52 52  stErrno = NO_ERR
25a50 4f 52 3b 0a 20 20 70 46 69 6c 65 2d 3e 7a 50 61  OR;.  pFile->zPa
25a60 74 68 20 3d 20 7a 4e 61 6d 65 3b 0a 23 69 66 20  th = zName;.#if 
25a70 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
25a80 53 49 5a 45 3e 30 0a 20 20 70 46 69 6c 65 2d 3e  SIZE>0.  pFile->
25a90 68 4d 61 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20 70  hMap = NULL;.  p
25aa0 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e  File->pMapRegion
25ab0 20 3d 20 30 3b 0a 20 20 70 46 69 6c 65 2d 3e 6d   = 0;.  pFile->m
25ac0 6d 61 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70  mapSize = 0;.  p
25ad0 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 41 63  File->mmapSizeAc
25ae0 74 75 61 6c 20 3d 20 30 3b 0a 20 20 70 46 69 6c  tual = 0;.  pFil
25af0 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 3d  e->mmapSizeMax =
25b00 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
25b10 6e 66 69 67 2e 73 7a 4d 6d 61 70 3b 0a 23 65 6e  nfig.szMmap;.#en
25b20 64 69 66 0a 0a 20 20 4f 70 65 6e 43 6f 75 6e 74  dif..  OpenCount
25b30 65 72 28 2b 31 29 3b 0a 20 20 72 65 74 75 72 6e  er(+1);.  return
25b40 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65   rc;.}../*.** De
25b50 6c 65 74 65 20 74 68 65 20 6e 61 6d 65 64 20 66  lete the named f
25b60 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  ile..**.** Note 
25b70 74 68 61 74 20 57 69 6e 64 6f 77 73 20 64 6f 65  that Windows doe
25b80 73 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 66 69  s not allow a fi
25b90 6c 65 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64  le to be deleted
25ba0 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a   if some other.*
25bb0 2a 20 70 72 6f 63 65 73 73 20 68 61 73 20 69 74  * process has it
25bc0 20 6f 70 65 6e 2e 20 20 53 6f 6d 65 74 69 6d 65   open.  Sometime
25bd0 73 20 61 20 76 69 72 75 73 20 73 63 61 6e 6e 65  s a virus scanne
25be0 72 20 6f 72 20 69 6e 64 65 78 69 6e 67 20 70 72  r or indexing pr
25bf0 6f 67 72 61 6d 0a 2a 2a 20 77 69 6c 6c 20 6f 70  ogram.** will op
25c00 65 6e 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  en a journal fil
25c10 65 20 73 68 6f 72 74 6c 79 20 61 66 74 65 72 20  e shortly after 
25c20 69 74 20 69 73 20 63 72 65 61 74 65 64 20 69 6e  it is created in
25c30 20 6f 72 64 65 72 20 74 6f 20 64 6f 0a 2a 2a 20   order to do.** 
25c40 77 68 61 74 65 76 65 72 20 69 74 20 64 6f 65 73  whatever it does
25c50 2e 20 20 57 68 69 6c 65 20 74 68 69 73 20 6f 74  .  While this ot
25c60 68 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 68  her process is h
25c70 6f 6c 64 69 6e 67 20 74 68 65 0a 2a 2a 20 66 69  olding the.** fi
25c80 6c 65 20 6f 70 65 6e 2c 20 77 65 20 77 69 6c 6c  le open, we will
25c90 20 62 65 20 75 6e 61 62 6c 65 20 74 6f 20 64 65   be unable to de
25ca0 6c 65 74 65 20 69 74 2e 20 20 54 6f 20 77 6f 72  lete it.  To wor
25cb0 6b 20 61 72 6f 75 6e 64 20 74 68 69 73 0a 2a 2a  k around this.**
25cc0 20 70 72 6f 62 6c 65 6d 2c 20 77 65 20 64 65 6c   problem, we del
25cd0 61 79 20 31 30 30 20 6d 69 6c 6c 69 73 65 63 6f  ay 100 milliseco
25ce0 6e 64 73 20 61 6e 64 20 74 72 79 20 74 6f 20 64  nds and try to d
25cf0 65 6c 65 74 65 20 61 67 61 69 6e 2e 20 20 55 70  elete again.  Up
25d00 0a 2a 2a 20 74 6f 20 4d 58 5f 44 45 4c 45 54 49  .** to MX_DELETI
25d10 4f 4e 5f 41 54 54 45 4d 50 54 73 20 64 65 6c 65  ON_ATTEMPTs dele
25d20 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 61 72  tion attempts ar
25d30 65 20 72 75 6e 20 62 65 66 6f 72 65 20 67 69 76  e run before giv
25d40 69 6e 67 0a 2a 2a 20 75 70 20 61 6e 64 20 72 65  ing.** up and re
25d50 74 75 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72  turning an error
25d60 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
25d70 77 69 6e 44 65 6c 65 74 65 28 0a 20 20 73 71 6c  winDelete(.  sql
25d80 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
25d90 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20           /* Not 
25da0 75 73 65 64 20 6f 6e 20 77 69 6e 33 32 20 2a 2f  used on win32 */
25db0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
25dc0 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20 20 20 2f  Filename,      /
25dd0 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74  * Name of file t
25de0 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 69 6e  o delete */.  in
25df0 74 20 73 79 6e 63 44 69 72 20 20 20 20 20 20 20  t syncDir       
25e00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74            /* Not
25e10 20 75 73 65 64 20 6f 6e 20 77 69 6e 33 32 20 2a   used on win32 *
25e20 2f 0a 29 7b 0a 20 20 69 6e 74 20 63 6e 74 20 3d  /.){.  int cnt =
25e30 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20   0;.  int rc;.  
25e40 44 57 4f 52 44 20 61 74 74 72 3b 0a 20 20 44 57  DWORD attr;.  DW
25e50 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20  ORD lastErrno = 
25e60 30 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76  0;.  void *zConv
25e70 65 72 74 65 64 3b 0a 20 20 55 4e 55 53 45 44 5f  erted;.  UNUSED_
25e80 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b  PARAMETER(pVfs);
25e90 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
25ea0 54 45 52 28 73 79 6e 63 44 69 72 29 3b 0a 0a 20  TER(syncDir);.. 
25eb0 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
25ec0 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49  (return SQLITE_I
25ed0 4f 45 52 52 5f 44 45 4c 45 54 45 29 3b 0a 20 20  OERR_DELETE);.  
25ee0 4f 53 54 52 41 43 45 28 28 22 44 45 4c 45 54 45  OSTRACE(("DELETE
25ef0 20 6e 61 6d 65 3d 25 73 2c 20 73 79 6e 63 44 69   name=%s, syncDi
25f00 72 3d 25 64 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61  r=%d\n", zFilena
25f10 6d 65 2c 20 73 79 6e 63 44 69 72 29 29 3b 0a 0a  me, syncDir));..
25f20 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77    zConverted = w
25f30 69 6e 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66  inConvertFromUtf
25f40 38 46 69 6c 65 6e 61 6d 65 28 7a 46 69 6c 65 6e  8Filename(zFilen
25f50 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e  ame);.  if( zCon
25f60 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20  verted==0 ){.   
25f70 20 4f 53 54 52 41 43 45 28 28 22 44 45 4c 45 54   OSTRACE(("DELET
25f80 45 20 6e 61 6d 65 3d 25 73 2c 20 72 63 3d 53 51  E name=%s, rc=SQ
25f90 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
25fa0 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 29  \n", zFilename))
25fb0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
25fc0 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b  ITE_IOERR_NOMEM;
25fd0 0a 20 20 7d 0a 20 20 69 66 28 20 6f 73 49 73 4e  .  }.  if( osIsN
25fe0 54 28 29 20 29 7b 0a 20 20 20 20 64 6f 20 7b 0a  T() ){.    do {.
25ff0 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
26000 4e 52 54 0a 20 20 20 20 20 20 57 49 4e 33 32 5f  NRT.      WIN32_
26010 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 44  FILE_ATTRIBUTE_D
26020 41 54 41 20 73 41 74 74 72 44 61 74 61 3b 0a 20  ATA sAttrData;. 
26030 20 20 20 20 20 6d 65 6d 73 65 74 28 26 73 41 74       memset(&sAt
26040 74 72 44 61 74 61 2c 20 30 2c 20 73 69 7a 65 6f  trData, 0, sizeo
26050 66 28 73 41 74 74 72 44 61 74 61 29 29 3b 0a 20  f(sAttrData));. 
26060 20 20 20 20 20 69 66 20 28 20 6f 73 47 65 74 46       if ( osGetF
26070 69 6c 65 41 74 74 72 69 62 75 74 65 73 45 78 57  ileAttributesExW
26080 28 7a 43 6f 6e 76 65 72 74 65 64 2c 20 47 65 74  (zConverted, Get
26090 46 69 6c 65 45 78 49 6e 66 6f 53 74 61 6e 64 61  FileExInfoStanda
260a0 72 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  rd,.            
260b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
260c0 20 20 20 20 20 20 26 73 41 74 74 72 44 61 74 61        &sAttrData
260d0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 74 74  ) ){.        att
260e0 72 20 3d 20 73 41 74 74 72 44 61 74 61 2e 64 77  r = sAttrData.dw
260f0 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 3b 0a  FileAttributes;.
26100 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
26110 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d       lastErrno =
26120 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
26130 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c  );.        if( l
26140 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f  astErrno==ERROR_
26150 46 49 4c 45 5f 4e 4f 54 5f 46 4f 55 4e 44 0a 20  FILE_NOT_FOUND. 
26160 20 20 20 20 20 20 20 20 7c 7c 20 6c 61 73 74 45          || lastE
26170 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 50 41 54 48  rrno==ERROR_PATH
26180 5f 4e 4f 54 5f 46 4f 55 4e 44 20 29 7b 0a 20 20  _NOT_FOUND ){.  
26190 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
261a0 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45  ITE_IOERR_DELETE
261b0 5f 4e 4f 45 4e 54 3b 20 2f 2a 20 41 6c 72 65 61  _NOENT; /* Alrea
261c0 64 79 20 67 6f 6e 65 3f 20 2a 2f 0a 20 20 20 20  dy gone? */.    
261d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
261e0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
261f0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
26200 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  }.        break;
26210 0a 20 20 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20  .      }.#else. 
26220 20 20 20 20 20 61 74 74 72 20 3d 20 6f 73 47 65       attr = osGe
26230 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 57  tFileAttributesW
26240 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 23 65  (zConverted);.#e
26250 6e 64 69 66 0a 20 20 20 20 20 20 69 66 20 28 20  ndif.      if ( 
26260 61 74 74 72 3d 3d 49 4e 56 41 4c 49 44 5f 46 49  attr==INVALID_FI
26270 4c 45 5f 41 54 54 52 49 42 55 54 45 53 20 29 7b  LE_ATTRIBUTES ){
26280 0a 20 20 20 20 20 20 20 20 6c 61 73 74 45 72 72  .        lastErr
26290 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
262a0 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 20 20 69  ror();.        i
262b0 66 28 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52  f( lastErrno==ER
262c0 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54 5f 46 4f 55  ROR_FILE_NOT_FOU
262d0 4e 44 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 6c  ND.         || l
262e0 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f  astErrno==ERROR_
262f0 50 41 54 48 5f 4e 4f 54 5f 46 4f 55 4e 44 20 29  PATH_NOT_FOUND )
26300 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
26310 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45   SQLITE_IOERR_DE
26320 4c 45 54 45 5f 4e 4f 45 4e 54 3b 20 2f 2a 20 41  LETE_NOENT; /* A
26330 6c 72 65 61 64 79 20 67 6f 6e 65 3f 20 2a 2f 0a  lready gone? */.
26340 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
26350 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
26360 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
26370 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72      }.        br
26380 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
26390 20 20 20 69 66 20 28 20 61 74 74 72 26 46 49 4c     if ( attr&FIL
263a0 45 5f 41 54 54 52 49 42 55 54 45 5f 44 49 52 45  E_ATTRIBUTE_DIRE
263b0 43 54 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 20  CTORY ){.       
263c0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
263d0 4f 52 3b 20 2f 2a 20 46 69 6c 65 73 20 6f 6e 6c  OR; /* Files onl
263e0 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72  y. */.        br
263f0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
26400 20 20 20 69 66 20 28 20 6f 73 44 65 6c 65 74 65     if ( osDelete
26410 46 69 6c 65 57 28 7a 43 6f 6e 76 65 72 74 65 64  FileW(zConverted
26420 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
26430 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 2f 2a 20  = SQLITE_OK; /* 
26440 44 65 6c 65 74 65 64 20 4f 4b 2e 20 2a 2f 0a 20  Deleted OK. */. 
26450 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
26460 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 20 28      }.      if (
26470 20 21 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28   !winRetryIoerr(
26480 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f  &cnt, &lastErrno
26490 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
264a0 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20  = SQLITE_ERROR; 
264b0 2f 2a 20 4e 6f 20 6d 6f 72 65 20 72 65 74 72 69  /* No more retri
264c0 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 62  es. */.        b
264d0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
264e0 20 20 7d 20 77 68 69 6c 65 28 31 29 3b 0a 20 20    } while(1);.  
264f0 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
26500 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20  WIN32_HAS_ANSI. 
26510 20 65 6c 73 65 7b 0a 20 20 20 20 64 6f 20 7b 0a   else{.    do {.
26520 20 20 20 20 20 20 61 74 74 72 20 3d 20 6f 73 47        attr = osG
26530 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
26540 41 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  A(zConverted);. 
26550 20 20 20 20 20 69 66 20 28 20 61 74 74 72 3d 3d       if ( attr==
26560 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54  INVALID_FILE_ATT
26570 52 49 42 55 54 45 53 20 29 7b 0a 20 20 20 20 20  RIBUTES ){.     
26580 20 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f     lastErrno = o
26590 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b  sGetLastError();
265a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c 61 73  .        if( las
265b0 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 46 49  tErrno==ERROR_FI
265c0 4c 45 5f 4e 4f 54 5f 46 4f 55 4e 44 0a 20 20 20  LE_NOT_FOUND.   
265d0 20 20 20 20 20 20 7c 7c 20 6c 61 73 74 45 72 72        || lastErr
265e0 6e 6f 3d 3d 45 52 52 4f 52 5f 50 41 54 48 5f 4e  no==ERROR_PATH_N
265f0 4f 54 5f 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20  OT_FOUND ){.    
26600 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
26610 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e  E_IOERR_DELETE_N
26620 4f 45 4e 54 3b 20 2f 2a 20 41 6c 72 65 61 64 79  OENT; /* Already
26630 20 67 6f 6e 65 3f 20 2a 2f 0a 20 20 20 20 20 20   gone? */.      
26640 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
26650 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
26660 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a  RROR;.        }.
26670 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
26680 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 20       }.      if 
26690 28 20 61 74 74 72 26 46 49 4c 45 5f 41 54 54 52  ( attr&FILE_ATTR
266a0 49 42 55 54 45 5f 44 49 52 45 43 54 4f 52 59 20  IBUTE_DIRECTORY 
266b0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
266c0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 2f 2a  SQLITE_ERROR; /*
266d0 20 46 69 6c 65 73 20 6f 6e 6c 79 2e 20 2a 2f 0a   Files only. */.
266e0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
266f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 20       }.      if 
26700 28 20 6f 73 44 65 6c 65 74 65 46 69 6c 65 41 28  ( osDeleteFileA(
26710 7a 43 6f 6e 76 65 72 74 65 64 29 20 29 7b 0a 20  zConverted) ){. 
26720 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
26730 54 45 5f 4f 4b 3b 20 2f 2a 20 44 65 6c 65 74 65  TE_OK; /* Delete
26740 64 20 4f 4b 2e 20 2a 2f 0a 20 20 20 20 20 20 20  d OK. */.       
26750 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
26760 20 20 20 20 20 20 69 66 20 28 20 21 77 69 6e 52        if ( !winR
26770 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20  etryIoerr(&cnt, 
26780 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 0a 20  &lastErrno) ){. 
26790 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
267a0 54 45 5f 45 52 52 4f 52 3b 20 2f 2a 20 4e 6f 20  TE_ERROR; /* No 
267b0 6d 6f 72 65 20 72 65 74 72 69 65 73 2e 20 2a 2f  more retries. */
267c0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
267d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 77 68        }.    } wh
267e0 69 6c 65 28 31 29 3b 0a 20 20 7d 0a 23 65 6e 64  ile(1);.  }.#end
267f0 69 66 0a 20 20 69 66 28 20 72 63 20 26 26 20 72  if.  if( rc && r
26800 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c!=SQLITE_IOERR_
26810 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 20 29 7b 0a  DELETE_NOENT ){.
26820 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45      rc = winLogE
26830 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
26840 52 5f 44 45 4c 45 54 45 2c 20 6c 61 73 74 45 72  R_DELETE, lastEr
26850 72 6e 6f 2c 20 22 77 69 6e 44 65 6c 65 74 65 22  rno, "winDelete"
26860 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  , zFilename);.  
26870 7d 65 6c 73 65 7b 0a 20 20 20 20 77 69 6e 4c 6f  }else{.    winLo
26880 67 49 6f 65 72 72 28 63 6e 74 29 3b 0a 20 20 7d  gIoerr(cnt);.  }
26890 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
268a0 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 4f  zConverted);.  O
268b0 53 54 52 41 43 45 28 28 22 44 45 4c 45 54 45 20  STRACE(("DELETE 
268c0 6e 61 6d 65 3d 25 73 2c 20 72 63 3d 25 73 5c 6e  name=%s, rc=%s\n
268d0 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 73 71  ", zFilename, sq
268e0 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29  lite3ErrName(rc)
268f0 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ));.  return rc;
26900 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  .}../*.** Check 
26910 74 68 65 20 65 78 69 73 74 65 6e 63 65 20 61 6e  the existence an
26920 64 20 73 74 61 74 75 73 20 6f 66 20 61 20 66 69  d status of a fi
26930 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
26940 74 20 77 69 6e 41 63 63 65 73 73 28 0a 20 20 73  t winAccess(.  s
26950 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
26960 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74  ,         /* Not
26970 20 75 73 65 64 20 6f 6e 20 77 69 6e 33 32 20 2a   used on win32 *
26980 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
26990 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20 20 2f  zFilename,     /
269a0 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74  * Name of file t
269b0 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 69 6e 74  o check */.  int
269c0 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20   flags,         
269d0 20 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20          /* Type 
269e0 6f 66 20 74 65 73 74 20 74 6f 20 6d 61 6b 65 20  of test to make 
269f0 6f 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a  on this file */.
26a00 20 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 20 20    int *pResOut  
26a10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26a20 4f 55 54 3a 20 52 65 73 75 6c 74 20 2a 2f 0a 29  OUT: Result */.)
26a30 7b 0a 20 20 44 57 4f 52 44 20 61 74 74 72 3b 0a  {.  DWORD attr;.
26a40 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20    int rc = 0;.  
26a50 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 20  DWORD lastErrno 
26a60 3d 20 30 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f  = 0;.  void *zCo
26a70 6e 76 65 72 74 65 64 3b 0a 20 20 55 4e 55 53 45  nverted;.  UNUSE
26a80 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73  D_PARAMETER(pVfs
26a90 29 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  );..  SimulateIO
26aa0 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
26ab0 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53  LITE_IOERR_ACCES
26ac0 53 3b 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  S; );.  OSTRACE(
26ad0 28 22 41 43 43 45 53 53 20 6e 61 6d 65 3d 25 73  ("ACCESS name=%s
26ae0 2c 20 66 6c 61 67 73 3d 25 78 2c 20 70 52 65 73  , flags=%x, pRes
26af0 4f 75 74 3d 25 70 5c 6e 22 2c 0a 20 20 20 20 20  Out=%p\n",.     
26b00 20 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 2c        zFilename,
26b10 20 66 6c 61 67 73 2c 20 70 52 65 73 4f 75 74 29   flags, pResOut)
26b20 29 3b 0a 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64  );..  zConverted
26b30 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74 46 72 6f   = winConvertFro
26b40 6d 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 46  mUtf8Filename(zF
26b50 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ilename);.  if( 
26b60 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b  zConverted==0 ){
26b70 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 41  .    OSTRACE(("A
26b80 43 43 45 53 53 20 6e 61 6d 65 3d 25 73 2c 20 72  CCESS name=%s, r
26b90 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  c=SQLITE_IOERR_N
26ba0 4f 4d 45 4d 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61  OMEM\n", zFilena
26bb0 6d 65 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  me));.    return
26bc0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
26bd0 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f  MEM;.  }.  if( o
26be0 73 49 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 69  sIsNT() ){.    i
26bf0 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20  nt cnt = 0;.    
26c00 57 49 4e 33 32 5f 46 49 4c 45 5f 41 54 54 52 49  WIN32_FILE_ATTRI
26c10 42 55 54 45 5f 44 41 54 41 20 73 41 74 74 72 44  BUTE_DATA sAttrD
26c20 61 74 61 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  ata;.    memset(
26c30 26 73 41 74 74 72 44 61 74 61 2c 20 30 2c 20 73  &sAttrData, 0, s
26c40 69 7a 65 6f 66 28 73 41 74 74 72 44 61 74 61 29  izeof(sAttrData)
26c50 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 21 28  );.    while( !(
26c60 72 63 20 3d 20 6f 73 47 65 74 46 69 6c 65 41 74  rc = osGetFileAt
26c70 74 72 69 62 75 74 65 73 45 78 57 28 28 4c 50 43  tributesExW((LPC
26c80 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c  WSTR)zConverted,
26c90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
26ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 47 65                Ge
26cb0 74 46 69 6c 65 45 78 49 6e 66 6f 53 74 61 6e 64  tFileExInfoStand
26cc0 61 72 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ard,.           
26cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26ce0 20 20 26 73 41 74 74 72 44 61 74 61 29 29 20 26    &sAttrData)) &
26cf0 26 20 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28  & winRetryIoerr(
26d00 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f  &cnt, &lastErrno
26d10 29 20 29 7b 7d 0a 20 20 20 20 69 66 28 20 72 63  ) ){}.    if( rc
26d20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72   ){.      /* For
26d30 20 61 6e 20 53 51 4c 49 54 45 5f 41 43 43 45 53   an SQLITE_ACCES
26d40 53 5f 45 58 49 53 54 53 20 71 75 65 72 79 2c 20  S_EXISTS query, 
26d50 74 72 65 61 74 20 61 20 7a 65 72 6f 2d 6c 65 6e  treat a zero-len
26d60 67 74 68 20 66 69 6c 65 0a 20 20 20 20 20 20 2a  gth file.      *
26d70 2a 20 61 73 20 69 66 20 69 74 20 64 6f 65 73 20  * as if it does 
26d80 6e 6f 74 20 65 78 69 73 74 2e 0a 20 20 20 20 20  not exist..     
26d90 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 20 20   */.      if(   
26da0 20 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f 41   flags==SQLITE_A
26db0 43 43 45 53 53 5f 45 58 49 53 54 53 0a 20 20 20  CCESS_EXISTS.   
26dc0 20 20 20 20 20 20 20 26 26 20 73 41 74 74 72 44         && sAttrD
26dd0 61 74 61 2e 6e 46 69 6c 65 53 69 7a 65 48 69 67  ata.nFileSizeHig
26de0 68 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 26  h==0.          &
26df0 26 20 73 41 74 74 72 44 61 74 61 2e 6e 46 69 6c  & sAttrData.nFil
26e00 65 53 69 7a 65 4c 6f 77 3d 3d 30 20 29 7b 0a 20  eSizeLow==0 ){. 
26e10 20 20 20 20 20 20 20 61 74 74 72 20 3d 20 49 4e         attr = IN
26e20 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49  VALID_FILE_ATTRI
26e30 42 55 54 45 53 3b 0a 20 20 20 20 20 20 7d 65 6c  BUTES;.      }el
26e40 73 65 7b 0a 20 20 20 20 20 20 20 20 61 74 74 72  se{.        attr
26e50 20 3d 20 73 41 74 74 72 44 61 74 61 2e 64 77 46   = sAttrData.dwF
26e60 69 6c 65 41 74 74 72 69 62 75 74 65 73 3b 0a 20  ileAttributes;. 
26e70 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
26e80 7b 0a 20 20 20 20 20 20 77 69 6e 4c 6f 67 49 6f  {.      winLogIo
26e90 65 72 72 28 63 6e 74 29 3b 0a 20 20 20 20 20 20  err(cnt);.      
26ea0 69 66 28 20 6c 61 73 74 45 72 72 6e 6f 21 3d 45  if( lastErrno!=E
26eb0 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54 5f 46 4f  RROR_FILE_NOT_FO
26ec0 55 4e 44 20 26 26 20 6c 61 73 74 45 72 72 6e 6f  UND && lastErrno
26ed0 21 3d 45 52 52 4f 52 5f 50 41 54 48 5f 4e 4f 54  !=ERROR_PATH_NOT
26ee0 5f 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20 20 20  _FOUND ){.      
26ef0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
26f00 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
26f10 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f      return winLo
26f20 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
26f30 45 52 52 5f 41 43 43 45 53 53 2c 20 6c 61 73 74  ERR_ACCESS, last
26f40 45 72 72 6e 6f 2c 20 22 77 69 6e 41 63 63 65 73  Errno, "winAcces
26f50 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  s",.            
26f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
26f70 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Filename);.     
26f80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
26f90 61 74 74 72 20 3d 20 49 4e 56 41 4c 49 44 5f 46  attr = INVALID_F
26fa0 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 3b 0a  ILE_ATTRIBUTES;.
26fb0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
26fc0 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
26fd0 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20  WIN32_HAS_ANSI. 
26fe0 20 65 6c 73 65 7b 0a 20 20 20 20 61 74 74 72 20   else{.    attr 
26ff0 3d 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69  = osGetFileAttri
27000 62 75 74 65 73 41 28 28 63 68 61 72 2a 29 7a 43  butesA((char*)zC
27010 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 7d 0a 23  onverted);.  }.#
27020 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f  endif.  sqlite3_
27030 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
27040 3b 0a 20 20 73 77 69 74 63 68 28 20 66 6c 61 67  ;.  switch( flag
27050 73 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51  s ){.    case SQ
27060 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44  LITE_ACCESS_READ
27070 3a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  :.    case SQLIT
27080 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 3a  E_ACCESS_EXISTS:
27090 0a 20 20 20 20 20 20 72 63 20 3d 20 61 74 74 72  .      rc = attr
270a0 21 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41  !=INVALID_FILE_A
270b0 54 54 52 49 42 55 54 45 53 3b 0a 20 20 20 20 20  TTRIBUTES;.     
270c0 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
270d0 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52   SQLITE_ACCESS_R
270e0 45 41 44 57 52 49 54 45 3a 0a 20 20 20 20 20 20  EADWRITE:.      
270f0 72 63 20 3d 20 61 74 74 72 21 3d 49 4e 56 41 4c  rc = attr!=INVAL
27100 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54  ID_FILE_ATTRIBUT
27110 45 53 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  ES &&.          
27120 20 20 20 28 61 74 74 72 20 26 20 46 49 4c 45 5f     (attr & FILE_
27130 41 54 54 52 49 42 55 54 45 5f 52 45 41 44 4f 4e  ATTRIBUTE_READON
27140 4c 59 29 3d 3d 30 3b 0a 20 20 20 20 20 20 62 72  LY)==0;.      br
27150 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74  eak;.    default
27160 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 21  :.      assert(!
27170 22 49 6e 76 61 6c 69 64 20 66 6c 61 67 73 20 61  "Invalid flags a
27180 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20 7d 0a 20  rgument");.  }. 
27190 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 63 3b 0a   *pResOut = rc;.
271a0 20 20 4f 53 54 52 41 43 45 28 28 22 41 43 43 45    OSTRACE(("ACCE
271b0 53 53 20 6e 61 6d 65 3d 25 73 2c 20 70 52 65 73  SS name=%s, pRes
271c0 4f 75 74 3d 25 70 2c 20 2a 70 52 65 73 4f 75 74  Out=%p, *pResOut
271d0 3d 25 64 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f  =%d, rc=SQLITE_O
271e0 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  K\n",.          
271f0 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 52 65 73   zFilename, pRes
27200 4f 75 74 2c 20 2a 70 52 65 73 4f 75 74 29 29 3b  Out, *pResOut));
27210 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
27220 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
27230 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20 69  turns non-zero i
27240 66 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  f the specified 
27250 70 61 74 68 20 6e 61 6d 65 20 73 74 61 72 74 73  path name starts
27260 20 77 69 74 68 20 61 20 64 72 69 76 65 20 6c 65   with a drive le
27270 74 74 65 72 0a 2a 2a 20 66 6f 6c 6c 6f 77 65 64  tter.** followed
27280 20 62 79 20 61 20 63 6f 6c 6f 6e 20 63 68 61 72   by a colon char
27290 61 63 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  acter..*/.static
272a0 20 42 4f 4f 4c 20 77 69 6e 49 73 44 72 69 76 65   BOOL winIsDrive
272b0 4c 65 74 74 65 72 41 6e 64 43 6f 6c 6f 6e 28 0a  LetterAndColon(.
272c0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
272d0 61 74 68 6e 61 6d 65 0a 29 7b 0a 20 20 72 65 74  athname.){.  ret
272e0 75 72 6e 20 28 20 73 71 6c 69 74 65 33 49 73 61  urn ( sqlite3Isa
272f0 6c 70 68 61 28 7a 50 61 74 68 6e 61 6d 65 5b 30  lpha(zPathname[0
27300 5d 29 20 26 26 20 7a 50 61 74 68 6e 61 6d 65 5b  ]) && zPathname[
27310 31 5d 3d 3d 27 3a 27 20 29 3b 0a 7d 0a 0a 2f 2a  1]==':' );.}../*
27320 0a 2a 2a 20 52 65 74 75 72 6e 73 20 6e 6f 6e 2d  .** Returns non-
27330 7a 65 72 6f 20 69 66 20 74 68 65 20 73 70 65 63  zero if the spec
27340 69 66 69 65 64 20 70 61 74 68 20 6e 61 6d 65 20  ified path name 
27350 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 76  should be used v
27360 65 72 62 61 74 69 6d 2e 20 20 49 66 0a 2a 2a 20  erbatim.  If.** 
27370 6e 6f 6e 2d 7a 65 72 6f 20 69 73 20 72 65 74 75  non-zero is retu
27380 72 6e 65 64 20 66 72 6f 6d 20 74 68 69 73 20 66  rned from this f
27390 75 6e 63 74 69 6f 6e 2c 20 74 68 65 20 63 61 6c  unction, the cal
273a0 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6d 75  ling function mu
273b0 73 74 20 73 69 6d 70 6c 79 0a 2a 2a 20 75 73 65  st simply.** use
273c0 20 74 68 65 20 70 72 6f 76 69 64 65 64 20 70 61   the provided pa
273d0 74 68 20 6e 61 6d 65 20 76 65 72 62 61 74 69 6d  th name verbatim
273e0 20 2d 4f 52 2d 20 72 65 73 6f 6c 76 65 20 69 74   -OR- resolve it
273f0 20 69 6e 74 6f 20 61 20 66 75 6c 6c 20 70 61 74   into a full pat
27400 68 20 6e 61 6d 65 0a 2a 2a 20 75 73 69 6e 67 20  h name.** using 
27410 74 68 65 20 47 65 74 46 75 6c 6c 50 61 74 68 4e  the GetFullPathN
27420 61 6d 65 20 57 69 6e 33 32 20 41 50 49 20 66 75  ame Win32 API fu
27430 6e 63 74 69 6f 6e 20 28 69 66 20 61 76 61 69 6c  nction (if avail
27440 61 62 6c 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  able)..*/.static
27450 20 42 4f 4f 4c 20 77 69 6e 49 73 56 65 72 62 61   BOOL winIsVerba
27460 74 69 6d 50 61 74 68 6e 61 6d 65 28 0a 20 20 63  timPathname(.  c
27470 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
27480 6e 61 6d 65 0a 29 7b 0a 20 20 2f 2a 0a 20 20 2a  name.){.  /*.  *
27490 2a 20 49 66 20 74 68 65 20 70 61 74 68 20 6e 61  * If the path na
274a0 6d 65 20 73 74 61 72 74 73 20 77 69 74 68 20 61  me starts with a
274b0 20 66 6f 72 77 61 72 64 20 73 6c 61 73 68 20 6f   forward slash o
274c0 72 20 61 20 62 61 63 6b 73 6c 61 73 68 2c 20 69  r a backslash, i
274d0 74 20 69 73 20 65 69 74 68 65 72 0a 20 20 2a 2a  t is either.  **
274e0 20 61 20 6c 65 67 61 6c 20 55 4e 43 20 6e 61 6d   a legal UNC nam
274f0 65 2c 20 61 20 76 6f 6c 75 6d 65 20 72 65 6c 61  e, a volume rela
27500 74 69 76 65 20 70 61 74 68 2c 20 6f 72 20 61 6e  tive path, or an
27510 20 61 62 73 6f 6c 75 74 65 20 70 61 74 68 20 6e   absolute path n
27520 61 6d 65 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20  ame in the.  ** 
27530 22 55 6e 69 78 22 20 66 6f 72 6d 61 74 20 6f 6e  "Unix" format on
27540 20 57 69 6e 64 6f 77 73 2e 20 20 54 68 65 72 65   Windows.  There
27550 20 69 73 20 6e 6f 20 65 61 73 79 20 77 61 79 20   is no easy way 
27560 74 6f 20 64 69 66 66 65 72 65 6e 74 69 61 74 65  to differentiate
27570 20 62 65 74 77 65 65 6e 0a 20 20 2a 2a 20 74 68   between.  ** th
27580 65 20 66 69 6e 61 6c 20 74 77 6f 20 63 61 73 65  e final two case
27590 73 3b 20 74 68 65 72 65 66 6f 72 65 2c 20 77 65  s; therefore, we
275a0 20 72 65 74 75 72 6e 20 74 68 65 20 73 61 66 65   return the safe
275b0 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f  r return value o
275c0 66 20 54 52 55 45 0a 20 20 2a 2a 20 73 6f 20 74  f TRUE.  ** so t
275d0 68 61 74 20 63 61 6c 6c 65 72 73 20 6f 66 20 74  hat callers of t
275e0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c  his function wil
275f0 6c 20 73 69 6d 70 6c 79 20 75 73 65 20 69 74 20  l simply use it 
27600 76 65 72 62 61 74 69 6d 2e 0a 20 20 2a 2f 0a 20  verbatim..  */. 
27610 20 69 66 20 28 20 77 69 6e 49 73 44 69 72 53 65   if ( winIsDirSe
27620 70 28 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 29 20  p(zPathname[0]) 
27630 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 52  ){.    return TR
27640 55 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  UE;.  }..  /*.  
27650 2a 2a 20 49 66 20 74 68 65 20 70 61 74 68 20 6e  ** If the path n
27660 61 6d 65 20 73 74 61 72 74 73 20 77 69 74 68 20  ame starts with 
27670 61 20 6c 65 74 74 65 72 20 61 6e 64 20 61 20 63  a letter and a c
27680 6f 6c 6f 6e 20 69 74 20 69 73 20 65 69 74 68 65  olon it is eithe
27690 72 20 61 20 76 6f 6c 75 6d 65 0a 20 20 2a 2a 20  r a volume.  ** 
276a0 72 65 6c 61 74 69 76 65 20 70 61 74 68 20 6f 72  relative path or
276b0 20 61 6e 20 61 62 73 6f 6c 75 74 65 20 70 61 74   an absolute pat
276c0 68 2e 20 20 43 61 6c 6c 65 72 73 20 6f 66 20 74  h.  Callers of t
276d0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73  his function mus
276e0 74 20 6e 6f 74 0a 20 20 2a 2a 20 61 74 74 65 6d  t not.  ** attem
276f0 70 74 20 74 6f 20 74 72 65 61 74 20 69 74 20 61  pt to treat it a
27700 73 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74  s a relative pat
27710 68 20 6e 61 6d 65 20 28 69 2e 65 2e 20 74 68 65  h name (i.e. the
27720 79 20 73 68 6f 75 6c 64 20 73 69 6d 70 6c 79 20  y should simply 
27730 75 73 65 0a 20 20 2a 2a 20 69 74 20 76 65 72 62  use.  ** it verb
27740 61 74 69 6d 29 2e 0a 20 20 2a 2f 0a 20 20 69 66  atim)..  */.  if
27750 20 28 20 77 69 6e 49 73 44 72 69 76 65 4c 65 74   ( winIsDriveLet
27760 74 65 72 41 6e 64 43 6f 6c 6f 6e 28 7a 50 61 74  terAndColon(zPat
27770 68 6e 61 6d 65 29 20 29 7b 0a 20 20 20 20 72 65  hname) ){.    re
27780 74 75 72 6e 20 54 52 55 45 3b 0a 20 20 7d 0a 0a  turn TRUE;.  }..
27790 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20    /*.  ** If we 
277a0 67 65 74 20 74 6f 20 74 68 69 73 20 70 6f 69 6e  get to this poin
277b0 74 2c 20 74 68 65 20 70 61 74 68 20 6e 61 6d 65  t, the path name
277c0 20 73 68 6f 75 6c 64 20 61 6c 6d 6f 73 74 20 63   should almost c
277d0 65 72 74 61 69 6e 6c 79 20 62 65 20 61 20 70 75  ertainly be a pu
277e0 72 65 6c 79 0a 20 20 2a 2a 20 72 65 6c 61 74 69  rely.  ** relati
277f0 76 65 20 6f 6e 65 20 28 69 2e 65 2e 20 6e 6f 74  ve one (i.e. not
27800 20 61 20 55 4e 43 20 6e 61 6d 65 2c 20 6e 6f 74   a UNC name, not
27810 20 61 62 73 6f 6c 75 74 65 2c 20 61 6e 64 20 6e   absolute, and n
27820 6f 74 20 76 6f 6c 75 6d 65 20 72 65 6c 61 74 69  ot volume relati
27830 76 65 29 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75  ve)..  */.  retu
27840 72 6e 20 46 41 4c 53 45 3b 0a 7d 0a 0a 2f 2a 0a  rn FALSE;.}../*.
27850 2a 2a 20 54 75 72 6e 20 61 20 72 65 6c 61 74 69  ** Turn a relati
27860 76 65 20 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f  ve pathname into
27870 20 61 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65   a full pathname
27880 2e 20 20 57 72 69 74 65 20 74 68 65 20 66 75 6c  .  Write the ful
27890 6c 0a 2a 2a 20 70 61 74 68 6e 61 6d 65 20 69 6e  l.** pathname in
278a0 74 6f 20 7a 4f 75 74 5b 5d 2e 20 20 7a 4f 75 74  to zOut[].  zOut
278b0 5b 5d 20 77 69 6c 6c 20 62 65 20 61 74 20 6c 65  [] will be at le
278c0 61 73 74 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  ast pVfs->mxPath
278d0 6e 61 6d 65 0a 2a 2a 20 62 79 74 65 73 20 69 6e  name.** bytes in
278e0 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   size..*/.static
278f0 20 69 6e 74 20 77 69 6e 46 75 6c 6c 50 61 74 68   int winFullPath
27900 6e 61 6d 65 28 0a 20 20 73 71 6c 69 74 65 33 5f  name(.  sqlite3_
27910 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20  vfs *pVfs,      
27920 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
27930 20 74 6f 20 76 66 73 20 6f 62 6a 65 63 74 20 2a   to vfs object *
27940 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
27950 7a 52 65 6c 61 74 69 76 65 2c 20 20 20 20 20 20  zRelative,      
27960 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20 72 65    /* Possibly re
27970 6c 61 74 69 76 65 20 69 6e 70 75 74 20 70 61 74  lative input pat
27980 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 75 6c 6c  h */.  int nFull
27990 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
279a0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
279b0 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 69 6e  output buffer in
279c0 20 62 79 74 65 73 20 2a 2f 0a 20 20 63 68 61 72   bytes */.  char
279d0 20 2a 7a 46 75 6c 6c 20 20 20 20 20 20 20 20 20   *zFull         
279e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74            /* Out
279f0 70 75 74 20 62 75 66 66 65 72 20 2a 2f 0a 29 7b  put buffer */.){
27a00 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  ..#if defined(__
27a10 43 59 47 57 49 4e 5f 5f 29 0a 20 20 53 69 6d 75  CYGWIN__).  Simu
27a20 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
27a30 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
27a40 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   );.  UNUSED_PAR
27a50 41 4d 45 54 45 52 28 6e 46 75 6c 6c 29 3b 0a 20  AMETER(nFull);. 
27a60 20 61 73 73 65 72 74 28 20 6e 46 75 6c 6c 3e 3d   assert( nFull>=
27a70 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
27a80 20 29 3b 0a 20 20 69 66 20 28 20 73 71 6c 69 74   );.  if ( sqlit
27a90 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72  e3_data_director
27aa0 79 20 26 26 20 21 77 69 6e 49 73 56 65 72 62 61  y && !winIsVerba
27ab0 74 69 6d 50 61 74 68 6e 61 6d 65 28 7a 52 65 6c  timPathname(zRel
27ac0 61 74 69 76 65 29 20 29 7b 0a 20 20 20 20 2f 2a  ative) ){.    /*
27ad0 0a 20 20 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 65  .    ** NOTE: We
27ae0 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74   are dealing wit
27af0 68 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74  h a relative pat
27b00 68 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 64  h name and the d
27b10 61 74 61 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ata.    **      
27b20 20 64 69 72 65 63 74 6f 72 79 20 68 61 73 20 62   directory has b
27b30 65 65 6e 20 73 65 74 2e 20 20 54 68 65 72 65 66  een set.  Theref
27b40 6f 72 65 2c 20 75 73 65 20 69 74 20 61 73 20 74  ore, use it as t
27b50 68 65 20 62 61 73 69 73 0a 20 20 20 20 2a 2a 20  he basis.    ** 
27b60 20 20 20 20 20 20 66 6f 72 20 63 6f 6e 76 65 72        for conver
27b70 74 69 6e 67 20 74 68 65 20 72 65 6c 61 74 69 76  ting the relativ
27b80 65 20 70 61 74 68 20 6e 61 6d 65 20 74 6f 20 61  e path name to a
27b90 6e 20 61 62 73 6f 6c 75 74 65 0a 20 20 20 20 2a  n absolute.    *
27ba0 2a 20 20 20 20 20 20 20 6f 6e 65 20 62 79 20 70  *       one by p
27bb0 72 65 70 65 6e 64 69 6e 67 20 74 68 65 20 64 61  repending the da
27bc0 74 61 20 64 69 72 65 63 74 6f 72 79 20 61 6e 64  ta directory and
27bd0 20 61 20 73 6c 61 73 68 2e 0a 20 20 20 20 2a 2f   a slash..    */
27be0 0a 20 20 20 20 63 68 61 72 20 2a 7a 4f 75 74 20  .    char *zOut 
27bf0 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  = sqlite3MallocZ
27c00 65 72 6f 28 20 70 56 66 73 2d 3e 6d 78 50 61 74  ero( pVfs->mxPat
27c10 68 6e 61 6d 65 2b 31 20 29 3b 0a 20 20 20 20 69  hname+1 );.    i
27c20 66 28 20 21 7a 4f 75 74 20 29 7b 0a 20 20 20 20  f( !zOut ){.    
27c30 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
27c40 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  IOERR_NOMEM;.   
27c50 20 7d 0a 20 20 20 20 69 66 28 20 63 79 67 77 69   }.    if( cygwi
27c60 6e 5f 63 6f 6e 76 5f 70 61 74 68 28 0a 20 20 20  n_conv_path(.   
27c70 20 20 20 20 20 20 20 20 20 28 6f 73 49 73 4e 54           (osIsNT
27c80 28 29 20 3f 20 43 43 50 5f 50 4f 53 49 58 5f 54  () ? CCP_POSIX_T
27c90 4f 5f 57 49 4e 5f 57 20 3a 20 43 43 50 5f 50 4f  O_WIN_W : CCP_PO
27ca0 53 49 58 5f 54 4f 5f 57 49 4e 5f 41 29 20 7c 0a  SIX_TO_WIN_A) |.
27cb0 20 20 20 20 20 20 20 20 20 20 20 20 43 43 50 5f              CCP_
27cc0 52 45 4c 41 54 49 56 45 2c 20 7a 52 65 6c 61 74  RELATIVE, zRelat
27cd0 69 76 65 2c 20 7a 4f 75 74 2c 20 70 56 66 73 2d  ive, zOut, pVfs-
27ce0 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3c 30  >mxPathname+1)<0
27cf0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
27d00 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20  3_free(zOut);.  
27d10 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f      return winLo
27d20 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41  gError(SQLITE_CA
27d30 4e 54 4f 50 45 4e 5f 43 4f 4e 56 50 41 54 48 2c  NTOPEN_CONVPATH,
27d40 20 28 44 57 4f 52 44 29 65 72 72 6e 6f 2c 0a 20   (DWORD)errno,. 
27d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27d60 20 20 20 20 20 20 20 20 22 77 69 6e 46 75 6c 6c          "winFull
27d70 50 61 74 68 6e 61 6d 65 31 22 2c 20 7a 52 65 6c  Pathname1", zRel
27d80 61 74 69 76 65 29 3b 0a 20 20 20 20 7d 65 6c 73  ative);.    }els
27d90 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  e{.      char *z
27da0 55 74 66 38 20 3d 20 77 69 6e 43 6f 6e 76 65 72  Utf8 = winConver
27db0 74 54 6f 55 74 66 38 46 69 6c 65 6e 61 6d 65 28  tToUtf8Filename(
27dc0 7a 4f 75 74 29 3b 0a 20 20 20 20 20 20 69 66 28  zOut);.      if(
27dd0 20 21 7a 55 74 66 38 20 29 7b 0a 20 20 20 20 20   !zUtf8 ){.     
27de0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
27df0 7a 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 72  zOut);.        r
27e00 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
27e10 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  RR_NOMEM;.      
27e20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  }.      sqlite3_
27e30 73 6e 70 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75  snprintf(MIN(nFu
27e40 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  ll, pVfs->mxPath
27e50 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25  name), zFull, "%
27e60 73 25 63 25 73 22 2c 0a 20 20 20 20 20 20 20 20  s%c%s",.        
27e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
27e80 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65  qlite3_data_dire
27e90 63 74 6f 72 79 2c 20 77 69 6e 47 65 74 44 69 72  ctory, winGetDir
27ea0 53 65 70 28 29 2c 20 7a 55 74 66 38 29 3b 0a 20  Sep(), zUtf8);. 
27eb0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
27ec0 65 28 7a 55 74 66 38 29 3b 0a 20 20 20 20 20 20  e(zUtf8);.      
27ed0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 75  sqlite3_free(zOu
27ee0 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  t);.    }.  }els
27ef0 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4f 75  e{.    char *zOu
27f00 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  t = sqlite3Mallo
27f10 63 5a 65 72 6f 28 20 70 56 66 73 2d 3e 6d 78 50  cZero( pVfs->mxP
27f20 61 74 68 6e 61 6d 65 2b 31 20 29 3b 0a 20 20 20  athname+1 );.   
27f30 20 69 66 28 20 21 7a 4f 75 74 20 29 7b 0a 20 20   if( !zOut ){.  
27f40 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
27f50 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20  E_IOERR_NOMEM;. 
27f60 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 79 67     }.    if( cyg
27f70 77 69 6e 5f 63 6f 6e 76 5f 70 61 74 68 28 0a 20  win_conv_path(. 
27f80 20 20 20 20 20 20 20 20 20 20 20 28 6f 73 49 73             (osIs
27f90 4e 54 28 29 20 3f 20 43 43 50 5f 50 4f 53 49 58  NT() ? CCP_POSIX
27fa0 5f 54 4f 5f 57 49 4e 5f 57 20 3a 20 43 43 50 5f  _TO_WIN_W : CCP_
27fb0 50 4f 53 49 58 5f 54 4f 5f 57 49 4e 5f 41 29 2c  POSIX_TO_WIN_A),
27fc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 52 65  .            zRe
27fd0 6c 61 74 69 76 65 2c 20 7a 4f 75 74 2c 20 70 56  lative, zOut, pV
27fe0 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
27ff0 29 3c 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  )<0 ){.      sql
28000 69 74 65 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b  ite3_free(zOut);
28010 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69  .      return wi
28020 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
28030 5f 43 41 4e 54 4f 50 45 4e 5f 43 4f 4e 56 50 41  _CANTOPEN_CONVPA
28040 54 48 2c 20 28 44 57 4f 52 44 29 65 72 72 6e 6f  TH, (DWORD)errno
28050 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
28060 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 46             "winF
28070 75 6c 6c 50 61 74 68 6e 61 6d 65 32 22 2c 20 7a  ullPathname2", z
28080 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 20 20 7d  Relative);.    }
28090 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72  else{.      char
280a0 20 2a 7a 55 74 66 38 20 3d 20 77 69 6e 43 6f 6e   *zUtf8 = winCon
280b0 76 65 72 74 54 6f 55 74 66 38 46 69 6c 65 6e 61  vertToUtf8Filena
280c0 6d 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20 20 20  me(zOut);.      
280d0 69 66 28 20 21 7a 55 74 66 38 20 29 7b 0a 20 20  if( !zUtf8 ){.  
280e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
280f0 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20 20 20  ee(zOut);.      
28100 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
28110 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  IOERR_NOMEM;.   
28120 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
28130 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49 4e 28  e3_snprintf(MIN(
28140 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78 50  nFull, pVfs->mxP
28150 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c  athname), zFull,
28160 20 22 25 73 22 2c 20 7a 55 74 66 38 29 3b 0a 20   "%s", zUtf8);. 
28170 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
28180 65 28 7a 55 74 66 38 29 3b 0a 20 20 20 20 20 20  e(zUtf8);.      
28190 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 75  sqlite3_free(zOu
281a0 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  t);.    }.  }.  
281b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
281c0 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 28 53  ;.#endif..#if (S
281d0 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c  QLITE_OS_WINCE |
281e0 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  | SQLITE_OS_WINR
281f0 54 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f  T) && !defined(_
28200 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20 53 69 6d  _CYGWIN__).  Sim
28210 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
28220 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
28230 52 20 29 3b 0a 20 20 2f 2a 20 57 69 6e 43 45 20  R );.  /* WinCE 
28240 68 61 73 20 6e 6f 20 63 6f 6e 63 65 70 74 20 6f  has no concept o
28250 66 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74  f a relative pat
28260 68 6e 61 6d 65 2c 20 6f 72 20 73 6f 20 49 20 61  hname, or so I a
28270 6d 20 74 6f 6c 64 2e 20 2a 2f 0a 20 20 2f 2a 20  m told. */.  /* 
28280 57 69 6e 52 54 20 68 61 73 20 6e 6f 20 77 61 79  WinRT has no way
28290 20 74 6f 20 63 6f 6e 76 65 72 74 20 61 20 72 65   to convert a re
282a0 6c 61 74 69 76 65 20 70 61 74 68 20 74 6f 20 61  lative path to a
282b0 6e 20 61 62 73 6f 6c 75 74 65 20 6f 6e 65 2e 20  n absolute one. 
282c0 2a 2f 0a 20 20 69 66 20 28 20 73 71 6c 69 74 65  */.  if ( sqlite
282d0 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79  3_data_directory
282e0 20 26 26 20 21 77 69 6e 49 73 56 65 72 62 61 74   && !winIsVerbat
282f0 69 6d 50 61 74 68 6e 61 6d 65 28 7a 52 65 6c 61  imPathname(zRela
28300 74 69 76 65 29 20 29 7b 0a 20 20 20 20 2f 2a 0a  tive) ){.    /*.
28310 20 20 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 65 20      ** NOTE: We 
28320 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68  are dealing with
28330 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68   a relative path
28340 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 64 61   name and the da
28350 74 61 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  ta.    **       
28360 64 69 72 65 63 74 6f 72 79 20 68 61 73 20 62 65  directory has be
28370 65 6e 20 73 65 74 2e 20 20 54 68 65 72 65 66 6f  en set.  Therefo
28380 72 65 2c 20 75 73 65 20 69 74 20 61 73 20 74 68  re, use it as th
28390 65 20 62 61 73 69 73 0a 20 20 20 20 2a 2a 20 20  e basis.    **  
283a0 20 20 20 20 20 66 6f 72 20 63 6f 6e 76 65 72 74       for convert
283b0 69 6e 67 20 74 68 65 20 72 65 6c 61 74 69 76 65  ing the relative
283c0 20 70 61 74 68 20 6e 61 6d 65 20 74 6f 20 61 6e   path name to an
283d0 20 61 62 73 6f 6c 75 74 65 0a 20 20 20 20 2a 2a   absolute.    **
283e0 20 20 20 20 20 20 20 6f 6e 65 20 62 79 20 70 72         one by pr
283f0 65 70 65 6e 64 69 6e 67 20 74 68 65 20 64 61 74  epending the dat
28400 61 20 64 69 72 65 63 74 6f 72 79 20 61 6e 64 20  a directory and 
28410 61 20 62 61 63 6b 73 6c 61 73 68 2e 0a 20 20 20  a backslash..   
28420 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   */.    sqlite3_
28430 73 6e 70 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75  snprintf(MIN(nFu
28440 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  ll, pVfs->mxPath
28450 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25  name), zFull, "%
28460 73 25 63 25 73 22 2c 0a 20 20 20 20 20 20 20 20  s%c%s",.        
28470 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
28480 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74  ite3_data_direct
28490 6f 72 79 2c 20 77 69 6e 47 65 74 44 69 72 53 65  ory, winGetDirSe
284a0 70 28 29 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b  p(), zRelative);
284b0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
284c0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d  lite3_snprintf(M
284d0 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e  IN(nFull, pVfs->
284e0 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75  mxPathname), zFu
284f0 6c 6c 2c 20 22 25 73 22 2c 20 7a 52 65 6c 61 74  ll, "%s", zRelat
28500 69 76 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ive);.  }.  retu
28510 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65  rn SQLITE_OK;.#e
28520 6e 64 69 66 0a 0a 23 69 66 20 21 53 51 4c 49 54  ndif..#if !SQLIT
28530 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53  E_OS_WINCE && !S
28540 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26  QLITE_OS_WINRT &
28550 26 20 21 64 65 66 69 6e 65 64 28 5f 5f 43 59 47  & !defined(__CYG
28560 57 49 4e 5f 5f 29 0a 20 20 44 57 4f 52 44 20 6e  WIN__).  DWORD n
28570 42 79 74 65 3b 0a 20 20 76 6f 69 64 20 2a 7a 43  Byte;.  void *zC
28580 6f 6e 76 65 72 74 65 64 3b 0a 20 20 63 68 61 72  onverted;.  char
28590 20 2a 7a 4f 75 74 3b 0a 0a 20 20 2f 2a 20 49 66   *zOut;..  /* If
285a0 20 74 68 69 73 20 70 61 74 68 20 6e 61 6d 65 20   this path name 
285b0 62 65 67 69 6e 73 20 77 69 74 68 20 22 2f 58 3a  begins with "/X:
285c0 22 2c 20 77 68 65 72 65 20 22 58 22 20 69 73 20  ", where "X" is 
285d0 61 6e 79 20 61 6c 70 68 61 62 65 74 69 63 0a 20  any alphabetic. 
285e0 20 2a 2a 20 63 68 61 72 61 63 74 65 72 2c 20 64   ** character, d
285f0 69 73 63 61 72 64 20 74 68 65 20 69 6e 69 74 69  iscard the initi
28600 61 6c 20 22 2f 22 20 66 72 6f 6d 20 74 68 65 20  al "/" from the 
28610 70 61 74 68 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20  pathname..  */. 
28620 20 69 66 28 20 7a 52 65 6c 61 74 69 76 65 5b 30   if( zRelative[0
28630 5d 3d 3d 27 2f 27 20 26 26 20 77 69 6e 49 73 44  ]=='/' && winIsD
28640 72 69 76 65 4c 65 74 74 65 72 41 6e 64 43 6f 6c  riveLetterAndCol
28650 6f 6e 28 7a 52 65 6c 61 74 69 76 65 2b 31 29 20  on(zRelative+1) 
28660 29 7b 0a 20 20 20 20 7a 52 65 6c 61 74 69 76 65  ){.    zRelative
28670 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 74  ++;.  }..  /* It
28680 27 73 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61  's odd to simula
28690 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68  te an io-error h
286a0 65 72 65 2c 20 62 75 74 20 72 65 61 6c 6c 79 20  ere, but really 
286b0 74 68 69 73 20 69 73 20 6a 75 73 74 0a 20 20 2a  this is just.  *
286c0 2a 20 75 73 69 6e 67 20 74 68 65 20 69 6f 2d 65  * using the io-e
286d0 72 72 6f 72 20 69 6e 66 72 61 73 74 72 75 63 74  rror infrastruct
286e0 75 72 65 20 74 6f 20 74 65 73 74 20 74 68 61 74  ure to test that
286f0 20 53 51 4c 69 74 65 20 68 61 6e 64 6c 65 73 20   SQLite handles 
28700 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69  this.  ** functi
28710 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 54 68 69 73  on failing. This
28720 20 66 75 6e 63 74 69 6f 6e 20 63 6f 75 6c 64 20   function could 
28730 66 61 69 6c 20 69 66 2c 20 66 6f 72 20 65 78 61  fail if, for exa
28740 6d 70 6c 65 2c 20 74 68 65 0a 20 20 2a 2a 20 63  mple, the.  ** c
28750 75 72 72 65 6e 74 20 77 6f 72 6b 69 6e 67 20 64  urrent working d
28760 69 72 65 63 74 6f 72 79 20 68 61 73 20 62 65 65  irectory has bee
28770 6e 20 75 6e 6c 69 6e 6b 65 64 2e 0a 20 20 2a 2f  n unlinked..  */
28780 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
28790 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
287a0 45 5f 45 52 52 4f 52 20 29 3b 0a 20 20 69 66 20  E_ERROR );.  if 
287b0 28 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64  ( sqlite3_data_d
287c0 69 72 65 63 74 6f 72 79 20 26 26 20 21 77 69 6e  irectory && !win
287d0 49 73 56 65 72 62 61 74 69 6d 50 61 74 68 6e 61  IsVerbatimPathna
287e0 6d 65 28 7a 52 65 6c 61 74 69 76 65 29 20 29 7b  me(zRelative) ){
287f0 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 4e  .    /*.    ** N
28800 4f 54 45 3a 20 57 65 20 61 72 65 20 64 65 61 6c  OTE: We are deal
28810 69 6e 67 20 77 69 74 68 20 61 20 72 65 6c 61 74  ing with a relat
28820 69 76 65 20 70 61 74 68 20 6e 61 6d 65 20 61 6e  ive path name an
28830 64 20 74 68 65 20 64 61 74 61 0a 20 20 20 20 2a  d the data.    *
28840 2a 20 20 20 20 20 20 20 64 69 72 65 63 74 6f 72  *       director
28850 79 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20  y has been set. 
28860 20 54 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20   Therefore, use 
28870 69 74 20 61 73 20 74 68 65 20 62 61 73 69 73 0a  it as the basis.
28880 20 20 20 20 2a 2a 20 20 20 20 20 20 20 66 6f 72      **       for
28890 20 63 6f 6e 76 65 72 74 69 6e 67 20 74 68 65 20   converting the 
288a0 72 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61  relative path na
288b0 6d 65 20 74 6f 20 61 6e 20 61 62 73 6f 6c 75 74  me to an absolut
288c0 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 6f  e.    **       o
288d0 6e 65 20 62 79 20 70 72 65 70 65 6e 64 69 6e 67  ne by prepending
288e0 20 74 68 65 20 64 61 74 61 20 64 69 72 65 63 74   the data direct
288f0 6f 72 79 20 61 6e 64 20 61 20 62 61 63 6b 73 6c  ory and a backsl
28900 61 73 68 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ash..    */.    
28910 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
28920 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73  (MIN(nFull, pVfs
28930 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a  ->mxPathname), z
28940 46 75 6c 6c 2c 20 22 25 73 25 63 25 73 22 2c 0a  Full, "%s%c%s",.
28950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28960 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64 61 74       sqlite3_dat
28970 61 5f 64 69 72 65 63 74 6f 72 79 2c 20 77 69 6e  a_directory, win
28980 47 65 74 44 69 72 53 65 70 28 29 2c 20 7a 52 65  GetDirSep(), zRe
28990 6c 61 74 69 76 65 29 3b 0a 20 20 20 20 72 65 74  lative);.    ret
289a0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
289b0 20 7d 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64 20   }.  zConverted 
289c0 3d 20 77 69 6e 43 6f 6e 76 65 72 74 46 72 6f 6d  = winConvertFrom
289d0 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 52 65  Utf8Filename(zRe
289e0 6c 61 74 69 76 65 29 3b 0a 20 20 69 66 28 20 7a  lative);.  if( z
289f0 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a  Converted==0 ){.
28a00 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
28a10 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20  E_IOERR_NOMEM;. 
28a20 20 7d 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28   }.  if( osIsNT(
28a30 29 20 29 7b 0a 20 20 20 20 4c 50 57 53 54 52 20  ) ){.    LPWSTR 
28a40 7a 54 65 6d 70 3b 0a 20 20 20 20 6e 42 79 74 65  zTemp;.    nByte
28a50 20 3d 20 6f 73 47 65 74 46 75 6c 6c 50 61 74 68   = osGetFullPath
28a60 4e 61 6d 65 57 28 28 4c 50 43 57 53 54 52 29 7a  NameW((LPCWSTR)z
28a70 43 6f 6e 76 65 72 74 65 64 2c 20 30 2c 20 30 2c  Converted, 0, 0,
28a80 20 30 29 3b 0a 20 20 20 20 69 66 28 20 6e 42 79   0);.    if( nBy
28a90 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  te==0 ){.      s
28aa0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e  qlite3_free(zCon
28ab0 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 72  verted);.      r
28ac0 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f  eturn winLogErro
28ad0 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  r(SQLITE_CANTOPE
28ae0 4e 5f 46 55 4c 4c 50 41 54 48 2c 20 6f 73 47 65  N_FULLPATH, osGe
28af0 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20  tLastError(),.  
28b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b10 20 20 20 20 20 20 20 22 77 69 6e 46 75 6c 6c 50         "winFullP
28b20 61 74 68 6e 61 6d 65 31 22 2c 20 7a 52 65 6c 61  athname1", zRela
28b30 74 69 76 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  tive);.    }.   
28b40 20 6e 42 79 74 65 20 2b 3d 20 33 3b 0a 20 20 20   nByte += 3;.   
28b50 20 7a 54 65 6d 70 20 3d 20 73 71 6c 69 74 65 33   zTemp = sqlite3
28b60 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42 79 74  MallocZero( nByt
28b70 65 2a 73 69 7a 65 6f 66 28 7a 54 65 6d 70 5b 30  e*sizeof(zTemp[0
28b80 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 54  ]) );.    if( zT
28b90 65 6d 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  emp==0 ){.      
28ba0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
28bb0 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20  nverted);.      
28bc0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
28bd0 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ERR_NOMEM;.    }
28be0 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 6f 73 47  .    nByte = osG
28bf0 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57 28  etFullPathNameW(
28c00 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72  (LPCWSTR)zConver
28c10 74 65 64 2c 20 6e 42 79 74 65 2c 20 7a 54 65 6d  ted, nByte, zTem
28c20 70 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 6e  p, 0);.    if( n
28c30 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Byte==0 ){.     
28c40 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
28c50 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20  onverted);.     
28c60 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54   sqlite3_free(zT
28c70 65 6d 70 29 3b 0a 20 20 20 20 20 20 72 65 74 75  emp);.      retu
28c80 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53  rn winLogError(S
28c90 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46  QLITE_CANTOPEN_F
28ca0 55 4c 4c 50 41 54 48 2c 20 6f 73 47 65 74 4c 61  ULLPATH, osGetLa
28cb0 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20  stError(),.     
28cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28cd0 20 20 20 20 22 77 69 6e 46 75 6c 6c 50 61 74 68      "winFullPath
28ce0 6e 61 6d 65 32 22 2c 20 7a 52 65 6c 61 74 69 76  name2", zRelativ
28cf0 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  e);.    }.    sq
28d00 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76  lite3_free(zConv
28d10 65 72 74 65 64 29 3b 0a 20 20 20 20 7a 4f 75 74  erted);.    zOut
28d20 20 3d 20 77 69 6e 55 6e 69 63 6f 64 65 54 6f 55   = winUnicodeToU
28d30 74 66 38 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20  tf8(zTemp);.    
28d40 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 65  sqlite3_free(zTe
28d50 6d 70 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20  mp);.  }.#ifdef 
28d60 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
28d70 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20  _ANSI.  else{.  
28d80 20 20 63 68 61 72 20 2a 7a 54 65 6d 70 3b 0a 20    char *zTemp;. 
28d90 20 20 20 6e 42 79 74 65 20 3d 20 6f 73 47 65 74     nByte = osGet
28da0 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41 28 28 63  FullPathNameA((c
28db0 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c  har*)zConverted,
28dc0 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69   0, 0, 0);.    i
28dd0 66 28 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20  f( nByte==0 ){. 
28de0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
28df0 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
28e00 20 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c       return winL
28e10 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43  ogError(SQLITE_C
28e20 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48  ANTOPEN_FULLPATH
28e30 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  , osGetLastError
28e40 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  (),.            
28e50 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
28e60 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 33 22 2c  nFullPathname3",
28e70 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 20   zRelative);.   
28e80 20 7d 0a 20 20 20 20 6e 42 79 74 65 20 2b 3d 20   }.    nByte += 
28e90 33 3b 0a 20 20 20 20 7a 54 65 6d 70 20 3d 20 73  3;.    zTemp = s
28ea0 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
28eb0 28 20 6e 42 79 74 65 2a 73 69 7a 65 6f 66 28 7a  ( nByte*sizeof(z
28ec0 54 65 6d 70 5b 30 5d 29 20 29 3b 0a 20 20 20 20  Temp[0]) );.    
28ed0 69 66 28 20 7a 54 65 6d 70 3d 3d 30 20 29 7b 0a  if( zTemp==0 ){.
28ee0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
28ef0 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
28f00 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
28f10 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b  ITE_IOERR_NOMEM;
28f20 0a 20 20 20 20 7d 0a 20 20 20 20 6e 42 79 74 65  .    }.    nByte
28f30 20 3d 20 6f 73 47 65 74 46 75 6c 6c 50 61 74 68   = osGetFullPath
28f40 4e 61 6d 65 41 28 28 63 68 61 72 2a 29 7a 43 6f  NameA((char*)zCo
28f50 6e 76 65 72 74 65 64 2c 20 6e 42 79 74 65 2c 20  nverted, nByte, 
28f60 7a 54 65 6d 70 2c 20 30 29 3b 0a 20 20 20 20 69  zTemp, 0);.    i
28f70 66 28 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20  f( nByte==0 ){. 
28f80 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
28f90 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
28fa0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
28fb0 65 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20 20  e(zTemp);.      
28fc0 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72  return winLogErr
28fd0 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  or(SQLITE_CANTOP
28fe0 45 4e 5f 46 55 4c 4c 50 41 54 48 2c 20 6f 73 47  EN_FULLPATH, osG
28ff0 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20  etLastError(),. 
29000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29010 20 20 20 20 20 20 20 20 22 77 69 6e 46 75 6c 6c          "winFull
29020 50 61 74 68 6e 61 6d 65 34 22 2c 20 7a 52 65 6c  Pathname4", zRel
29030 61 74 69 76 65 29 3b 0a 20 20 20 20 7d 0a 20 20  ative);.    }.  
29040 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
29050 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
29060 7a 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 5f 77  zOut = sqlite3_w
29070 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66  in32_mbcs_to_utf
29080 38 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 73 71  8(zTemp);.    sq
29090 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 65 6d 70  lite3_free(zTemp
290a0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
290b0 69 66 28 20 7a 4f 75 74 20 29 7b 0a 20 20 20 20  if( zOut ){.    
290c0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
290d0 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73  (MIN(nFull, pVfs
290e0 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a  ->mxPathname), z
290f0 46 75 6c 6c 2c 20 22 25 73 22 2c 20 7a 4f 75 74  Full, "%s", zOut
29100 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
29110 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20 72  ree(zOut);.    r
29120 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
29130 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
29140 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
29150 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 65 6e  R_NOMEM;.  }.#en
29160 64 69 66 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  dif.}..#ifndef S
29170 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f  QLITE_OMIT_LOAD_
29180 45 58 54 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20  EXTENSION./*.** 
29190 49 6e 74 65 72 66 61 63 65 73 20 66 6f 72 20 6f  Interfaces for o
291a0 70 65 6e 69 6e 67 20 61 20 73 68 61 72 65 64 20  pening a shared 
291b0 6c 69 62 72 61 72 79 2c 20 66 69 6e 64 69 6e 67  library, finding
291c0 20 65 6e 74 72 79 20 70 6f 69 6e 74 73 0a 2a 2a   entry points.**
291d0 20 77 69 74 68 69 6e 20 74 68 65 20 73 68 61 72   within the shar
291e0 65 64 20 6c 69 62 72 61 72 79 2c 20 61 6e 64 20  ed library, and 
291f0 63 6c 6f 73 69 6e 67 20 74 68 65 20 73 68 61 72  closing the shar
29200 65 64 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 73  ed library..*/.s
29210 74 61 74 69 63 20 76 6f 69 64 20 2a 77 69 6e 44  tatic void *winD
29220 6c 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 66  lOpen(sqlite3_vf
29230 73 20 2a 70 56 66 73 2c 20 63 6f 6e 73 74 20 63  s *pVfs, const c
29240 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b  har *zFilename){
29250 0a 20 20 48 41 4e 44 4c 45 20 68 3b 0a 23 69 66  .  HANDLE h;.#if
29260 20 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49   defined(__CYGWI
29270 4e 5f 5f 29 0a 20 20 69 6e 74 20 6e 46 75 6c 6c  N__).  int nFull
29280 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e   = pVfs->mxPathn
29290 61 6d 65 2b 31 3b 0a 20 20 63 68 61 72 20 2a 7a  ame+1;.  char *z
292a0 46 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4d 61  Full = sqlite3Ma
292b0 6c 6c 6f 63 5a 65 72 6f 28 20 6e 46 75 6c 6c 20  llocZero( nFull 
292c0 29 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76  );.  void *zConv
292d0 65 72 74 65 64 20 3d 20 30 3b 0a 20 20 69 66 28  erted = 0;.  if(
292e0 20 7a 46 75 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20   zFull==0 ){.   
292f0 20 4f 53 54 52 41 43 45 28 28 22 44 4c 4f 50 45   OSTRACE(("DLOPE
29300 4e 20 6e 61 6d 65 3d 25 73 2c 20 68 61 6e 64 6c  N name=%s, handl
29310 65 3d 25 70 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61  e=%p\n", zFilena
29320 6d 65 2c 20 28 76 6f 69 64 2a 29 30 29 29 3b 0a  me, (void*)0));.
29330 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
29340 7d 0a 20 20 69 66 28 20 77 69 6e 46 75 6c 6c 50  }.  if( winFullP
29350 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46  athname(pVfs, zF
29360 69 6c 65 6e 61 6d 65 2c 20 6e 46 75 6c 6c 2c 20  ilename, nFull, 
29370 7a 46 75 6c 6c 29 21 3d 53 51 4c 49 54 45 5f 4f  zFull)!=SQLITE_O
29380 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
29390 5f 66 72 65 65 28 7a 46 75 6c 6c 29 3b 0a 20 20  _free(zFull);.  
293a0 20 20 4f 53 54 52 41 43 45 28 28 22 44 4c 4f 50    OSTRACE(("DLOP
293b0 45 4e 20 6e 61 6d 65 3d 25 73 2c 20 68 61 6e 64  EN name=%s, hand
293c0 6c 65 3d 25 70 5c 6e 22 2c 20 7a 46 69 6c 65 6e  le=%p\n", zFilen
293d0 61 6d 65 2c 20 28 76 6f 69 64 2a 29 30 29 29 3b  ame, (void*)0));
293e0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
293f0 20 7d 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64 20   }.  zConverted 
29400 3d 20 77 69 6e 43 6f 6e 76 65 72 74 46 72 6f 6d  = winConvertFrom
29410 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 46 75  Utf8Filename(zFu
29420 6c 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  ll);.  sqlite3_f
29430 72 65 65 28 7a 46 75 6c 6c 29 3b 0a 23 65 6c 73  ree(zFull);.#els
29440 65 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65  e.  void *zConve
29450 72 74 65 64 20 3d 20 77 69 6e 43 6f 6e 76 65 72  rted = winConver
29460 74 46 72 6f 6d 55 74 66 38 46 69 6c 65 6e 61 6d  tFromUtf8Filenam
29470 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  e(zFilename);.  
29480 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
29490 28 70 56 66 73 29 3b 0a 23 65 6e 64 69 66 0a 20  (pVfs);.#endif. 
294a0 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d   if( zConverted=
294b0 3d 30 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43  =0 ){.    OSTRAC
294c0 45 28 28 22 44 4c 4f 50 45 4e 20 6e 61 6d 65 3d  E(("DLOPEN name=
294d0 25 73 2c 20 68 61 6e 64 6c 65 3d 25 70 5c 6e 22  %s, handle=%p\n"
294e0 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 28 76 6f  , zFilename, (vo
294f0 69 64 2a 29 30 29 29 3b 0a 20 20 20 20 72 65 74  id*)0));.    ret
29500 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
29510 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 23 69 66   osIsNT() ){.#if
29520 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
29530 0a 20 20 20 20 68 20 3d 20 6f 73 4c 6f 61 64 50  .    h = osLoadP
29540 61 63 6b 61 67 65 64 4c 69 62 72 61 72 79 28 28  ackagedLibrary((
29550 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74  LPCWSTR)zConvert
29560 65 64 2c 20 30 29 3b 0a 23 65 6c 73 65 0a 20 20  ed, 0);.#else.  
29570 20 20 68 20 3d 20 6f 73 4c 6f 61 64 4c 69 62 72    h = osLoadLibr
29580 61 72 79 57 28 28 4c 50 43 57 53 54 52 29 7a 43  aryW((LPCWSTR)zC
29590 6f 6e 76 65 72 74 65 64 29 3b 0a 23 65 6e 64 69  onverted);.#endi
295a0 66 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c  f.  }.#ifdef SQL
295b0 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
295c0 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 68  SI.  else{.    h
295d0 20 3d 20 6f 73 4c 6f 61 64 4c 69 62 72 61 72 79   = osLoadLibrary
295e0 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72  A((char*)zConver
295f0 74 65 64 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ted);.  }.#endif
29600 0a 20 20 4f 53 54 52 41 43 45 28 28 22 44 4c 4f  .  OSTRACE(("DLO
29610 50 45 4e 20 6e 61 6d 65 3d 25 73 2c 20 68 61 6e  PEN name=%s, han
29620 64 6c 65 3d 25 70 5c 6e 22 2c 20 7a 46 69 6c 65  dle=%p\n", zFile
29630 6e 61 6d 65 2c 20 28 76 6f 69 64 2a 29 68 29 29  name, (void*)h))
29640 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
29650 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
29660 72 65 74 75 72 6e 20 28 76 6f 69 64 2a 29 68 3b  return (void*)h;
29670 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  .}.static void w
29680 69 6e 44 6c 45 72 72 6f 72 28 73 71 6c 69 74 65  inDlError(sqlite
29690 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74  3_vfs *pVfs, int
296a0 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75   nBuf, char *zBu
296b0 66 4f 75 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f  fOut){.  UNUSED_
296c0 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b  PARAMETER(pVfs);
296d0 0a 20 20 77 69 6e 47 65 74 4c 61 73 74 45 72 72  .  winGetLastErr
296e0 6f 72 4d 73 67 28 6f 73 47 65 74 4c 61 73 74 45  orMsg(osGetLastE
296f0 72 72 6f 72 28 29 2c 20 6e 42 75 66 2c 20 7a 42  rror(), nBuf, zB
29700 75 66 4f 75 74 29 3b 0a 7d 0a 73 74 61 74 69 63  ufOut);.}.static
29710 20 76 6f 69 64 20 28 2a 77 69 6e 44 6c 53 79 6d   void (*winDlSym
29720 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56  (sqlite3_vfs *pV
29730 66 73 2c 76 6f 69 64 20 2a 70 48 2c 63 6f 6e 73  fs,void *pH,cons
29740 74 20 63 68 61 72 20 2a 7a 53 79 6d 29 29 28 76  t char *zSym))(v
29750 6f 69 64 29 7b 0a 20 20 46 41 52 50 52 4f 43 20  oid){.  FARPROC 
29760 70 72 6f 63 3b 0a 20 20 55 4e 55 53 45 44 5f 50  proc;.  UNUSED_P
29770 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a  ARAMETER(pVfs);.
29780 20 20 70 72 6f 63 20 3d 20 6f 73 47 65 74 50 72    proc = osGetPr
29790 6f 63 41 64 64 72 65 73 73 41 28 28 48 41 4e 44  ocAddressA((HAND
297a0 4c 45 29 70 48 2c 20 7a 53 79 6d 29 3b 0a 20 20  LE)pH, zSym);.  
297b0 4f 53 54 52 41 43 45 28 28 22 44 4c 53 59 4d 20  OSTRACE(("DLSYM 
297c0 68 61 6e 64 6c 65 3d 25 70 2c 20 73 79 6d 62 6f  handle=%p, symbo
297d0 6c 3d 25 73 2c 20 61 64 64 72 65 73 73 3d 25 70  l=%s, address=%p
297e0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
297f0 28 76 6f 69 64 2a 29 70 48 2c 20 7a 53 79 6d 2c  (void*)pH, zSym,
29800 20 28 76 6f 69 64 2a 29 70 72 6f 63 29 29 3b 0a   (void*)proc));.
29810 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64 28 2a    return (void(*
29820 29 28 76 6f 69 64 29 29 70 72 6f 63 3b 0a 7d 0a  )(void))proc;.}.
29830 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 44  static void winD
29840 6c 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 76  lClose(sqlite3_v
29850 66 73 20 2a 70 56 66 73 2c 20 76 6f 69 64 20 2a  fs *pVfs, void *
29860 70 48 61 6e 64 6c 65 29 7b 0a 20 20 55 4e 55 53  pHandle){.  UNUS
29870 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66  ED_PARAMETER(pVf
29880 73 29 3b 0a 20 20 6f 73 46 72 65 65 4c 69 62 72  s);.  osFreeLibr
29890 61 72 79 28 28 48 41 4e 44 4c 45 29 70 48 61 6e  ary((HANDLE)pHan
298a0 64 6c 65 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  dle);.  OSTRACE(
298b0 28 22 44 4c 43 4c 4f 53 45 20 68 61 6e 64 6c 65  ("DLCLOSE handle
298c0 3d 25 70 5c 6e 22 2c 20 28 76 6f 69 64 2a 29 70  =%p\n", (void*)p
298d0 48 61 6e 64 6c 65 29 29 3b 0a 7d 0a 23 65 6c 73  Handle));.}.#els
298e0 65 20 2f 2a 20 69 66 20 53 51 4c 49 54 45 5f 4f  e /* if SQLITE_O
298f0 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49  MIT_LOAD_EXTENSI
29900 4f 4e 20 69 73 20 64 65 66 69 6e 65 64 3a 20 2a  ON is defined: *
29910 2f 0a 20 20 23 64 65 66 69 6e 65 20 77 69 6e 44  /.  #define winD
29920 6c 4f 70 65 6e 20 20 30 0a 20 20 23 64 65 66 69  lOpen  0.  #defi
29930 6e 65 20 77 69 6e 44 6c 45 72 72 6f 72 20 30 0a  ne winDlError 0.
29940 20 20 23 64 65 66 69 6e 65 20 77 69 6e 44 6c 53    #define winDlS
29950 79 6d 20 20 20 30 0a 20 20 23 64 65 66 69 6e 65  ym   0.  #define
29960 20 77 69 6e 44 6c 43 6c 6f 73 65 20 30 0a 23 65   winDlClose 0.#e
29970 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  ndif.../*.** Wri
29980 74 65 20 75 70 20 74 6f 20 6e 42 75 66 20 62 79  te up to nBuf by
29990 74 65 73 20 6f 66 20 72 61 6e 64 6f 6d 6e 65 73  tes of randomnes
299a0 73 20 69 6e 74 6f 20 7a 42 75 66 2e 0a 2a 2f 0a  s into zBuf..*/.
299b0 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 52 61  static int winRa
299c0 6e 64 6f 6d 6e 65 73 73 28 73 71 6c 69 74 65 33  ndomness(sqlite3
299d0 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20  _vfs *pVfs, int 
299e0 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66  nBuf, char *zBuf
299f0 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a  ){.  int n = 0;.
29a00 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
29a10 45 52 28 70 56 66 73 29 3b 0a 23 69 66 20 64 65  ER(pVfs);.#if de
29a20 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
29a30 54 29 0a 20 20 6e 20 3d 20 6e 42 75 66 3b 0a 20  T).  n = nBuf;. 
29a40 20 6d 65 6d 73 65 74 28 7a 42 75 66 2c 20 30 2c   memset(zBuf, 0,
29a50 20 6e 42 75 66 29 3b 0a 23 65 6c 73 65 0a 20 20   nBuf);.#else.  
29a60 69 66 28 20 73 69 7a 65 6f 66 28 53 59 53 54 45  if( sizeof(SYSTE
29a70 4d 54 49 4d 45 29 3c 3d 6e 42 75 66 2d 6e 20 29  MTIME)<=nBuf-n )
29a80 7b 0a 20 20 20 20 53 59 53 54 45 4d 54 49 4d 45  {.    SYSTEMTIME
29a90 20 78 3b 0a 20 20 20 20 6f 73 47 65 74 53 79 73   x;.    osGetSys
29aa0 74 65 6d 54 69 6d 65 28 26 78 29 3b 0a 20 20 20  temTime(&x);.   
29ab0 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d   memcpy(&zBuf[n]
29ac0 2c 20 26 78 2c 20 73 69 7a 65 6f 66 28 78 29 29  , &x, sizeof(x))
29ad0 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f  ;.    n += sizeo
29ae0 66 28 78 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  f(x);.  }.  if( 
29af0 73 69 7a 65 6f 66 28 44 57 4f 52 44 29 3c 3d 6e  sizeof(DWORD)<=n
29b00 42 75 66 2d 6e 20 29 7b 0a 20 20 20 20 44 57 4f  Buf-n ){.    DWO
29b10 52 44 20 70 69 64 20 3d 20 6f 73 47 65 74 43 75  RD pid = osGetCu
29b20 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
29b30 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42  ;.    memcpy(&zB
29b40 75 66 5b 6e 5d 2c 20 26 70 69 64 2c 20 73 69 7a  uf[n], &pid, siz
29b50 65 6f 66 28 70 69 64 29 29 3b 0a 20 20 20 20 6e  eof(pid));.    n
29b60 20 2b 3d 20 73 69 7a 65 6f 66 28 70 69 64 29 3b   += sizeof(pid);
29b70 0a 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f  .  }.#if SQLITE_
29b80 4f 53 5f 57 49 4e 52 54 0a 20 20 69 66 28 20 73  OS_WINRT.  if( s
29b90 69 7a 65 6f 66 28 55 4c 4f 4e 47 4c 4f 4e 47 29  izeof(ULONGLONG)
29ba0 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20 20  <=nBuf-n ){.    
29bb0 55 4c 4f 4e 47 4c 4f 4e 47 20 63 6e 74 20 3d 20  ULONGLONG cnt = 
29bc0 6f 73 47 65 74 54 69 63 6b 43 6f 75 6e 74 36 34  osGetTickCount64
29bd0 28 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  ();.    memcpy(&
29be0 7a 42 75 66 5b 6e 5d 2c 20 26 63 6e 74 2c 20 73  zBuf[n], &cnt, s
29bf0 69 7a 65 6f 66 28 63 6e 74 29 29 3b 0a 20 20 20  izeof(cnt));.   
29c00 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 63 6e 74   n += sizeof(cnt
29c10 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 69  );.  }.#else.  i
29c20 66 28 20 73 69 7a 65 6f 66 28 44 57 4f 52 44 29  f( sizeof(DWORD)
29c30 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20 20  <=nBuf-n ){.    
29c40 44 57 4f 52 44 20 63 6e 74 20 3d 20 6f 73 47 65  DWORD cnt = osGe
29c50 74 54 69 63 6b 43 6f 75 6e 74 28 29 3b 0a 20 20  tTickCount();.  
29c60 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e    memcpy(&zBuf[n
29c70 5d 2c 20 26 63 6e 74 2c 20 73 69 7a 65 6f 66 28  ], &cnt, sizeof(
29c80 63 6e 74 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20  cnt));.    n += 
29c90 73 69 7a 65 6f 66 28 63 6e 74 29 3b 0a 20 20 7d  sizeof(cnt);.  }
29ca0 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 73 69  .#endif.  if( si
29cb0 7a 65 6f 66 28 4c 41 52 47 45 5f 49 4e 54 45 47  zeof(LARGE_INTEG
29cc0 45 52 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20  ER)<=nBuf-n ){. 
29cd0 20 20 20 4c 41 52 47 45 5f 49 4e 54 45 47 45 52     LARGE_INTEGER
29ce0 20 69 3b 0a 20 20 20 20 6f 73 51 75 65 72 79 50   i;.    osQueryP
29cf0 65 72 66 6f 72 6d 61 6e 63 65 43 6f 75 6e 74 65  erformanceCounte
29d00 72 28 26 69 29 3b 0a 20 20 20 20 6d 65 6d 63 70  r(&i);.    memcp
29d10 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 69 2c 20  y(&zBuf[n], &i, 
29d20 73 69 7a 65 6f 66 28 69 29 29 3b 0a 20 20 20 20  sizeof(i));.    
29d30 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 69 29 3b 0a  n += sizeof(i);.
29d40 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74    }.#endif.  ret
29d50 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  urn n;.}.../*.**
29d60 20 53 6c 65 65 70 20 66 6f 72 20 61 20 6c 69 74   Sleep for a lit
29d70 74 6c 65 20 77 68 69 6c 65 2e 20 20 52 65 74 75  tle while.  Retu
29d80 72 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  rn the amount of
29d90 20 74 69 6d 65 20 73 6c 65 70 74 2e 0a 2a 2f 0a   time slept..*/.
29da0 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 6c  static int winSl
29db0 65 65 70 28 73 71 6c 69 74 65 33 5f 76 66 73 20  eep(sqlite3_vfs 
29dc0 2a 70 56 66 73 2c 20 69 6e 74 20 6d 69 63 72 6f  *pVfs, int micro
29dd0 73 65 63 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  sec){.  sqlite3_
29de0 77 69 6e 33 32 5f 73 6c 65 65 70 28 28 6d 69 63  win32_sleep((mic
29df0 72 6f 73 65 63 2b 39 39 39 29 2f 31 30 30 30 29  rosec+999)/1000)
29e00 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
29e10 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 72 65  ETER(pVfs);.  re
29e20 74 75 72 6e 20 28 28 6d 69 63 72 6f 73 65 63 2b  turn ((microsec+
29e30 39 39 39 29 2f 31 30 30 30 29 2a 31 30 30 30 3b  999)/1000)*1000;
29e40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
29e50 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65  llowing variable
29e60 2c 20 69 66 20 73 65 74 20 74 6f 20 61 20 6e 6f  , if set to a no
29e70 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20 69 73  n-zero value, is
29e80 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 0a   interpreted as.
29e90 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** the number of
29ea0 20 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 31   seconds since 1
29eb0 39 37 30 20 61 6e 64 20 69 73 20 75 73 65 64 20  970 and is used 
29ec0 74 6f 20 73 65 74 20 74 68 65 20 72 65 73 75 6c  to set the resul
29ed0 74 20 6f 66 0a 2a 2a 20 73 71 6c 69 74 65 33 4f  t of.** sqlite3O
29ee0 73 43 75 72 72 65 6e 74 54 69 6d 65 28 29 20 64  sCurrentTime() d
29ef0 75 72 69 6e 67 20 74 65 73 74 69 6e 67 2e 0a 2a  uring testing..*
29f00 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
29f10 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33  TEST.int sqlite3
29f20 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 3d 20  _current_time = 
29f30 30 3b 20 20 2f 2a 20 46 61 6b 65 20 73 79 73 74  0;  /* Fake syst
29f40 65 6d 20 74 69 6d 65 20 69 6e 20 73 65 63 6f 6e  em time in secon
29f50 64 73 20 73 69 6e 63 65 20 31 39 37 30 2e 20 2a  ds since 1970. *
29f60 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  /.#endif../*.** 
29f70 46 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74  Find the current
29f80 20 74 69 6d 65 20 28 69 6e 20 55 6e 69 76 65 72   time (in Univer
29f90 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64 20  sal Coordinated 
29fa0 54 69 6d 65 29 2e 20 20 57 72 69 74 65 20 69 6e  Time).  Write in
29fb0 74 6f 20 2a 70 69 4e 6f 77 0a 2a 2a 20 74 68 65  to *piNow.** the
29fc0 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 61 6e   current time an
29fd0 64 20 64 61 74 65 20 61 73 20 61 20 4a 75 6c 69  d date as a Juli
29fe0 61 6e 20 44 61 79 20 6e 75 6d 62 65 72 20 74 69  an Day number ti
29ff0 6d 65 73 20 38 36 5f 34 30 30 5f 30 30 30 2e 20  mes 86_400_000. 
2a000 20 49 6e 0a 2a 2a 20 6f 74 68 65 72 20 77 6f 72   In.** other wor
2a010 64 73 2c 20 77 72 69 74 65 20 69 6e 74 6f 20 2a  ds, write into *
2a020 70 69 4e 6f 77 20 74 68 65 20 6e 75 6d 62 65 72  piNow the number
2a030 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73   of milliseconds
2a040 20 73 69 6e 63 65 20 74 68 65 20 4a 75 6c 69 61   since the Julia
2a050 6e 0a 2a 2a 20 65 70 6f 63 68 20 6f 66 20 6e 6f  n.** epoch of no
2a060 6f 6e 20 69 6e 20 47 72 65 65 6e 77 69 63 68 20  on in Greenwich 
2a070 6f 6e 20 4e 6f 76 65 6d 62 65 72 20 32 34 2c 20  on November 24, 
2a080 34 37 31 34 20 42 2e 43 20 61 63 63 6f 72 64 69  4714 B.C accordi
2a090 6e 67 20 74 6f 20 74 68 65 0a 2a 2a 20 70 72 6f  ng to the.** pro
2a0a0 6c 65 70 74 69 63 20 47 72 65 67 6f 72 69 61 6e  leptic Gregorian
2a0b0 20 63 61 6c 65 6e 64 61 72 2e 0a 2a 2a 0a 2a 2a   calendar..**.**
2a0c0 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 72 65 74   On success, ret
2a0d0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 20  urn SQLITE_OK.  
2a0e0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  Return SQLITE_ER
2a0f0 52 4f 52 20 69 66 20 74 68 65 20 74 69 6d 65 20  ROR if the time 
2a100 61 6e 64 20 64 61 74 65 0a 2a 2a 20 63 61 6e 6e  and date.** cann
2a110 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a  ot be found..*/.
2a120 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 43 75  static int winCu
2a130 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 73  rrentTimeInt64(s
2a140 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
2a150 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  , sqlite3_int64 
2a160 2a 70 69 4e 6f 77 29 7b 0a 20 20 2f 2a 20 46 49  *piNow){.  /* FI
2a170 4c 45 54 49 4d 45 20 73 74 72 75 63 74 75 72 65  LETIME structure
2a180 20 69 73 20 61 20 36 34 2d 62 69 74 20 76 61 6c   is a 64-bit val
2a190 75 65 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20  ue representing 
2a1a0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20  the number of.  
2a1b0 20 20 20 31 30 30 2d 6e 61 6e 6f 73 65 63 6f 6e     100-nanosecon
2a1c0 64 20 69 6e 74 65 72 76 61 6c 73 20 73 69 6e 63  d intervals sinc
2a1d0 65 20 4a 61 6e 75 61 72 79 20 31 2c 20 31 36 30  e January 1, 160
2a1e0 31 20 28 3d 20 4a 44 20 32 33 30 35 38 31 33 2e  1 (= JD 2305813.
2a1f0 35 29 2e 0a 20 20 2a 2f 0a 20 20 46 49 4c 45 54  5)..  */.  FILET
2a200 49 4d 45 20 66 74 3b 0a 20 20 73 74 61 74 69 63  IME ft;.  static
2a210 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
2a220 6e 74 36 34 20 77 69 6e 46 69 6c 65 74 69 6d 65  nt64 winFiletime
2a230 45 70 6f 63 68 20 3d 20 32 33 30 35 38 31 33 35  Epoch = 23058135
2a240 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  *(sqlite3_int64)
2a250 38 36 34 30 30 30 30 3b 0a 23 69 66 64 65 66 20  8640000;.#ifdef 
2a260 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 74  SQLITE_TEST.  st
2a270 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74  atic const sqlit
2a280 65 33 5f 69 6e 74 36 34 20 75 6e 69 78 45 70 6f  e3_int64 unixEpo
2a290 63 68 20 3d 20 32 34 34 30 35 38 37 35 2a 28 73  ch = 24405875*(s
2a2a0 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 38 36 34  qlite3_int64)864
2a2b0 30 30 30 30 3b 0a 23 65 6e 64 69 66 0a 20 20 2f  0000;.#endif.  /
2a2c0 2a 20 32 5e 33 32 20 2d 20 74 6f 20 61 76 6f 69  * 2^32 - to avoi
2a2d0 64 20 75 73 65 20 6f 66 20 4c 4c 20 61 6e 64 20  d use of LL and 
2a2e0 77 61 72 6e 69 6e 67 73 20 69 6e 20 67 63 63 20  warnings in gcc 
2a2f0 2a 2f 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  */.  static cons
2a300 74 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  t sqlite3_int64 
2a310 6d 61 78 33 32 42 69 74 56 61 6c 75 65 20 3d 0a  max32BitValue =.
2a320 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 69        (sqlite3_i
2a330 6e 74 36 34 29 32 30 30 30 30 30 30 30 30 30 20  nt64)2000000000 
2a340 2b 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  + (sqlite3_int64
2a350 29 32 30 30 30 30 30 30 30 30 30 20 2b 0a 20 20  )2000000000 +.  
2a360 20 20 20 20 28 73 71 6c 69 74 65 33 5f 69 6e 74      (sqlite3_int
2a370 36 34 29 32 39 34 39 36 37 32 39 36 3b 0a 0a 23  64)294967296;..#
2a380 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
2a390 43 45 0a 20 20 53 59 53 54 45 4d 54 49 4d 45 20  CE.  SYSTEMTIME 
2a3a0 74 69 6d 65 3b 0a 20 20 6f 73 47 65 74 53 79 73  time;.  osGetSys
2a3b0 74 65 6d 54 69 6d 65 28 26 74 69 6d 65 29 3b 0a  temTime(&time);.
2a3c0 20 20 2f 2a 20 69 66 20 53 79 73 74 65 6d 54 69    /* if SystemTi
2a3d0 6d 65 54 6f 46 69 6c 65 54 69 6d 65 28 29 20 66  meToFileTime() f
2a3e0 61 69 6c 73 2c 20 69 74 20 72 65 74 75 72 6e 73  ails, it returns
2a3f0 20 7a 65 72 6f 2e 20 2a 2f 0a 20 20 69 66 20 28   zero. */.  if (
2a400 21 6f 73 53 79 73 74 65 6d 54 69 6d 65 54 6f 46  !osSystemTimeToF
2a410 69 6c 65 54 69 6d 65 28 26 74 69 6d 65 2c 26 66  ileTime(&time,&f
2a420 74 29 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  t)){.    return 
2a430 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
2a440 7d 0a 23 65 6c 73 65 0a 20 20 6f 73 47 65 74 53  }.#else.  osGetS
2a450 79 73 74 65 6d 54 69 6d 65 41 73 46 69 6c 65 54  ystemTimeAsFileT
2a460 69 6d 65 28 20 26 66 74 20 29 3b 0a 23 65 6e 64  ime( &ft );.#end
2a470 69 66 0a 0a 20 20 2a 70 69 4e 6f 77 20 3d 20 77  if..  *piNow = w
2a480 69 6e 46 69 6c 65 74 69 6d 65 45 70 6f 63 68 20  inFiletimeEpoch 
2a490 2b 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 28  +.            ((
2a4a0 28 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  ((sqlite3_int64)
2a4b0 66 74 2e 64 77 48 69 67 68 44 61 74 65 54 69 6d  ft.dwHighDateTim
2a4c0 65 29 2a 6d 61 78 33 32 42 69 74 56 61 6c 75 65  e)*max32BitValue
2a4d0 29 20 2b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) +.            
2a4e0 20 20 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36     (sqlite3_int6
2a4f0 34 29 66 74 2e 64 77 4c 6f 77 44 61 74 65 54 69  4)ft.dwLowDateTi
2a500 6d 65 29 2f 28 73 71 6c 69 74 65 33 5f 69 6e 74  me)/(sqlite3_int
2a510 36 34 29 31 30 30 30 30 3b 0a 0a 23 69 66 64 65  64)10000;..#ifde
2a520 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
2a530 69 66 28 20 73 71 6c 69 74 65 33 5f 63 75 72 72  if( sqlite3_curr
2a540 65 6e 74 5f 74 69 6d 65 20 29 7b 0a 20 20 20 20  ent_time ){.    
2a550 2a 70 69 4e 6f 77 20 3d 20 31 30 30 30 2a 28 73  *piNow = 1000*(s
2a560 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 73 71 6c  qlite3_int64)sql
2a570 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d  ite3_current_tim
2a580 65 20 2b 20 75 6e 69 78 45 70 6f 63 68 3b 0a 20  e + unixEpoch;. 
2a590 20 7d 0a 23 65 6e 64 69 66 0a 20 20 55 4e 55 53   }.#endif.  UNUS
2a5a0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66  ED_PARAMETER(pVf
2a5b0 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  s);.  return SQL
2a5c0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
2a5d0 20 46 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e   Find the curren
2a5e0 74 20 74 69 6d 65 20 28 69 6e 20 55 6e 69 76 65  t time (in Unive
2a5f0 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64  rsal Coordinated
2a600 20 54 69 6d 65 29 2e 20 20 57 72 69 74 65 20 74   Time).  Write t
2a610 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 74 69  he.** current ti
2a620 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73 20 61  me and date as a
2a630 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62   Julian Day numb
2a640 65 72 20 69 6e 74 6f 20 2a 70 72 4e 6f 77 20 61  er into *prNow a
2a650 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 30 2e 20  nd.** return 0. 
2a660 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65   Return 1 if the
2a670 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 63   time and date c
2a680 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a  annot be found..
2a690 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
2a6a0 6e 43 75 72 72 65 6e 74 54 69 6d 65 28 73 71 6c  nCurrentTime(sql
2a6b0 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
2a6c0 64 6f 75 62 6c 65 20 2a 70 72 4e 6f 77 29 7b 0a  double *prNow){.
2a6d0 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
2a6e0 74 65 33 5f 69 6e 74 36 34 20 69 3b 0a 20 20 72  te3_int64 i;.  r
2a6f0 63 20 3d 20 77 69 6e 43 75 72 72 65 6e 74 54 69  c = winCurrentTi
2a700 6d 65 49 6e 74 36 34 28 70 56 66 73 2c 20 26 69  meInt64(pVfs, &i
2a710 29 3b 0a 20 20 69 66 28 20 21 72 63 20 29 7b 0a  );.  if( !rc ){.
2a720 20 20 20 20 2a 70 72 4e 6f 77 20 3d 20 69 2f 38      *prNow = i/8
2a730 36 34 30 30 30 30 30 2e 30 3b 0a 20 20 7d 0a 20  6400000.0;.  }. 
2a740 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2a750 2a 0a 2a 2a 20 54 68 65 20 69 64 65 61 20 69 73  *.** The idea is
2a760 20 74 68 61 74 20 74 68 69 73 20 66 75 6e 63 74   that this funct
2a770 69 6f 6e 20 77 6f 72 6b 73 20 6c 69 6b 65 20 61  ion works like a
2a780 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 0a   combination of.
2a790 2a 2a 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28  ** GetLastError(
2a7a0 29 20 61 6e 64 20 46 6f 72 6d 61 74 4d 65 73 73  ) and FormatMess
2a7b0 61 67 65 28 29 20 6f 6e 20 57 69 6e 64 6f 77 73  age() on Windows
2a7c0 20 28 6f 72 20 65 72 72 6e 6f 20 61 6e 64 0a 2a   (or errno and.*
2a7d0 2a 20 73 74 72 65 72 72 6f 72 5f 72 28 29 20 6f  * strerror_r() o
2a7e0 6e 20 55 6e 69 78 29 2e 20 41 66 74 65 72 20 61  n Unix). After a
2a7f0 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72  n error is retur
2a800 6e 65 64 20 62 79 20 61 6e 20 4f 53 0a 2a 2a 20  ned by an OS.** 
2a810 66 75 6e 63 74 69 6f 6e 2c 20 53 51 4c 69 74 65  function, SQLite
2a820 20 63 61 6c 6c 73 20 74 68 69 73 20 66 75 6e 63   calls this func
2a830 74 69 6f 6e 20 77 69 74 68 20 7a 42 75 66 20 70  tion with zBuf p
2a840 6f 69 6e 74 69 6e 67 20 74 6f 0a 2a 2a 20 61 20  ointing to.** a 
2a850 62 75 66 66 65 72 20 6f 66 20 6e 42 75 66 20 62  buffer of nBuf b
2a860 79 74 65 73 2e 20 54 68 65 20 4f 53 20 6c 61 79  ytes. The OS lay
2a870 65 72 20 73 68 6f 75 6c 64 20 70 6f 70 75 6c 61  er should popula
2a880 74 65 20 74 68 65 0a 2a 2a 20 62 75 66 66 65 72  te the.** buffer
2a890 20 77 69 74 68 20 61 20 6e 75 6c 2d 74 65 72 6d   with a nul-term
2a8a0 69 6e 61 74 65 64 20 55 54 46 2d 38 20 65 6e 63  inated UTF-8 enc
2a8b0 6f 64 65 64 20 65 72 72 6f 72 20 6d 65 73 73 61  oded error messa
2a8c0 67 65 0a 2a 2a 20 64 65 73 63 72 69 62 69 6e 67  ge.** describing
2a8d0 20 74 68 65 20 6c 61 73 74 20 49 4f 20 65 72 72   the last IO err
2a8e0 6f 72 20 74 6f 20 68 61 76 65 20 6f 63 63 75 72  or to have occur
2a8f0 72 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 63  red within the c
2a900 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68 72 65 61 64  alling.** thread
2a910 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ..**.** If the e
2a920 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20  rror message is 
2a930 74 6f 6f 20 6c 61 72 67 65 20 66 6f 72 20 74 68  too large for th
2a940 65 20 73 75 70 70 6c 69 65 64 20 62 75 66 66 65  e supplied buffe
2a950 72 2c 0a 2a 2a 20 69 74 20 73 68 6f 75 6c 64 20  r,.** it should 
2a960 62 65 20 74 72 75 6e 63 61 74 65 64 2e 20 54 68  be truncated. Th
2a970 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f  e return value o
2a980 66 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72 0a  f xGetLastError.
2a990 2a 2a 20 69 73 20 7a 65 72 6f 20 69 66 20 74 68  ** is zero if th
2a9a0 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  e error message 
2a9b0 66 69 74 73 20 69 6e 20 74 68 65 20 62 75 66 66  fits in the buff
2a9c0 65 72 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 0a  er, or non-zero.
2a9d0 2a 2a 20 6f 74 68 65 72 77 69 73 65 20 28 69 66  ** otherwise (if
2a9e0 20 74 68 65 20 6d 65 73 73 61 67 65 20 77 61 73   the message was
2a9f0 20 74 72 75 6e 63 61 74 65 64 29 2e 20 49 66 20   truncated). If 
2aa00 6e 6f 6e 2d 7a 65 72 6f 20 69 73 20 72 65 74 75  non-zero is retu
2aa10 72 6e 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 69 74  rned,.** then it
2aa20 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
2aa30 79 20 74 6f 20 69 6e 63 6c 75 64 65 20 74 68 65  y to include the
2aa40 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20   nul-terminator 
2aa50 63 68 61 72 61 63 74 65 72 0a 2a 2a 20 69 6e 20  character.** in 
2aa60 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65  the output buffe
2aa70 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 20 73 75 70  r..**.** Not sup
2aa80 70 6c 79 69 6e 67 20 61 6e 20 65 72 72 6f 72 20  plying an error 
2aa90 6d 65 73 73 61 67 65 20 77 69 6c 6c 20 68 61 76  message will hav
2aaa0 65 20 6e 6f 20 61 64 76 65 72 73 65 20 65 66 66  e no adverse eff
2aab0 65 63 74 0a 2a 2a 20 6f 6e 20 53 51 4c 69 74 65  ect.** on SQLite
2aac0 2e 20 49 74 20 69 73 20 66 69 6e 65 20 74 6f 20  . It is fine to 
2aad0 68 61 76 65 20 61 6e 20 69 6d 70 6c 65 6d 65 6e  have an implemen
2aae0 74 61 74 69 6f 6e 20 74 68 61 74 20 6e 65 76 65  tation that neve
2aaf0 72 0a 2a 2a 20 72 65 74 75 72 6e 73 20 61 6e 20  r.** returns an 
2ab00 65 72 72 6f 72 20 6d 65 73 73 61 67 65 3a 0a 2a  error message:.*
2ab10 2a 0a 2a 2a 20 20 20 69 6e 74 20 78 47 65 74 4c  *.**   int xGetL
2ab20 61 73 74 45 72 72 6f 72 28 73 71 6c 69 74 65 33  astError(sqlite3
2ab30 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20  _vfs *pVfs, int 
2ab40 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66  nBuf, char *zBuf
2ab50 29 7b 0a 2a 2a 20 20 20 20 20 61 73 73 65 72 74  ){.**     assert
2ab60 28 7a 42 75 66 5b 30 5d 3d 3d 27 5c 30 27 29 3b  (zBuf[0]=='\0');
2ab70 0a 2a 2a 20 20 20 20 20 72 65 74 75 72 6e 20 30  .**     return 0
2ab80 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 48  ;.**   }.**.** H
2ab90 6f 77 65 76 65 72 20 69 66 20 61 6e 20 65 72 72  owever if an err
2aba0 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 73 75  or message is su
2abb0 70 70 6c 69 65 64 2c 20 69 74 20 77 69 6c 6c 20  pplied, it will 
2abc0 62 65 20 69 6e 63 6f 72 70 6f 72 61 74 65 64 0a  be incorporated.
2abd0 2a 2a 20 62 79 20 73 71 6c 69 74 65 20 69 6e 74  ** by sqlite int
2abe0 6f 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73  o the error mess
2abf0 61 67 65 20 61 76 61 69 6c 61 62 6c 65 20 74 6f  age available to
2ac00 20 74 68 65 20 75 73 65 72 20 75 73 69 6e 67 0a   the user using.
2ac10 2a 2a 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  ** sqlite3_errms
2ac20 67 28 29 2c 20 70 6f 73 73 69 62 6c 79 20 6d 61  g(), possibly ma
2ac30 6b 69 6e 67 20 49 4f 20 65 72 72 6f 72 73 20 65  king IO errors e
2ac40 61 73 69 65 72 20 74 6f 20 64 65 62 75 67 2e 0a  asier to debug..
2ac50 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
2ac60 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 28 73 71  nGetLastError(sq
2ac70 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
2ac80 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20   int nBuf, char 
2ac90 2a 7a 42 75 66 29 7b 0a 20 20 55 4e 55 53 45 44  *zBuf){.  UNUSED
2aca0 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29  _PARAMETER(pVfs)
2acb0 3b 0a 20 20 72 65 74 75 72 6e 20 77 69 6e 47 65  ;.  return winGe
2acc0 74 4c 61 73 74 45 72 72 6f 72 4d 73 67 28 6f 73  tLastErrorMsg(os
2acd0 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20  GetLastError(), 
2ace0 6e 42 75 66 2c 20 7a 42 75 66 29 3b 0a 7d 0a 0a  nBuf, zBuf);.}..
2acf0 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*.** Initialize
2ad00 20 61 6e 64 20 64 65 69 6e 69 74 69 61 6c 69 7a   and deinitializ
2ad10 65 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20  e the operating 
2ad20 73 79 73 74 65 6d 20 69 6e 74 65 72 66 61 63 65  system interface
2ad30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2ad40 5f 6f 73 5f 69 6e 69 74 28 76 6f 69 64 29 7b 0a  _os_init(void){.
2ad50 20 20 73 74 61 74 69 63 20 73 71 6c 69 74 65 33    static sqlite3
2ad60 5f 76 66 73 20 77 69 6e 56 66 73 20 3d 20 7b 0a  _vfs winVfs = {.
2ad70 20 20 20 20 33 2c 20 20 20 20 20 20 20 20 20 20      3,          
2ad80 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72           /* iVer
2ad90 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 73 69 7a 65  sion */.    size
2ada0 6f 66 28 77 69 6e 46 69 6c 65 29 2c 20 20 20 20  of(winFile),    
2adb0 20 2f 2a 20 73 7a 4f 73 46 69 6c 65 20 2a 2f 0a   /* szOsFile */.
2adc0 20 20 20 20 53 51 4c 49 54 45 5f 57 49 4e 33 32      SQLITE_WIN32
2add0 5f 4d 41 58 5f 50 41 54 48 5f 42 59 54 45 53 2c  _MAX_PATH_BYTES,
2ade0 20 2f 2a 20 6d 78 50 61 74 68 6e 61 6d 65 20 2a   /* mxPathname *
2adf0 2f 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20 20  /.    0,        
2ae00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 4e             /* pN
2ae10 65 78 74 20 2a 2f 0a 20 20 20 20 22 77 69 6e 33  ext */.    "win3
2ae20 32 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  2",             
2ae30 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 20 20  /* zName */.    
2ae40 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
2ae50 20 20 20 20 20 2f 2a 20 70 41 70 70 44 61 74 61       /* pAppData
2ae60 20 2a 2f 0a 20 20 20 20 77 69 6e 4f 70 65 6e 2c   */.    winOpen,
2ae70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ae80 78 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 77 69 6e  xOpen */.    win
2ae90 44 65 6c 65 74 65 2c 20 20 20 20 20 20 20 20 20  Delete,         
2aea0 20 20 2f 2a 20 78 44 65 6c 65 74 65 20 2a 2f 0a    /* xDelete */.
2aeb0 20 20 20 20 77 69 6e 41 63 63 65 73 73 2c 20 20      winAccess,  
2aec0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 41 63 63           /* xAcc
2aed0 65 73 73 20 2a 2f 0a 20 20 20 20 77 69 6e 46 75  ess */.    winFu
2aee0 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 20 20 20 20  llPathname,     
2aef0 2f 2a 20 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65  /* xFullPathname
2af00 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 4f 70 65   */.    winDlOpe
2af10 6e 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  n,           /* 
2af20 78 44 6c 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 77  xDlOpen */.    w
2af30 69 6e 44 6c 45 72 72 6f 72 2c 20 20 20 20 20 20  inDlError,      
2af40 20 20 20 20 2f 2a 20 78 44 6c 45 72 72 6f 72 20      /* xDlError 
2af50 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 53 79 6d 2c  */.    winDlSym,
2af60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2af70 44 6c 53 79 6d 20 2a 2f 0a 20 20 20 20 77 69 6e  DlSym */.    win
2af80 44 6c 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20  DlClose,        
2af90 20 20 2f 2a 20 78 44 6c 43 6c 6f 73 65 20 2a 2f    /* xDlClose */
2afa0 0a 20 20 20 20 77 69 6e 52 61 6e 64 6f 6d 6e 65  .    winRandomne
2afb0 73 73 2c 20 20 20 20 20 20 20 2f 2a 20 78 52 61  ss,       /* xRa
2afc0 6e 64 6f 6d 6e 65 73 73 20 2a 2f 0a 20 20 20 20  ndomness */.    
2afd0 77 69 6e 53 6c 65 65 70 2c 20 20 20 20 20 20 20  winSleep,       
2afe0 20 20 20 20 20 2f 2a 20 78 53 6c 65 65 70 20 2a       /* xSleep *
2aff0 2f 0a 20 20 20 20 77 69 6e 43 75 72 72 65 6e 74  /.    winCurrent
2b000 54 69 6d 65 2c 20 20 20 20 20 20 2f 2a 20 78 43  Time,      /* xC
2b010 75 72 72 65 6e 74 54 69 6d 65 20 2a 2f 0a 20 20  urrentTime */.  
2b020 20 20 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f    winGetLastErro
2b030 72 2c 20 20 20 20 20 2f 2a 20 78 47 65 74 4c 61  r,     /* xGetLa
2b040 73 74 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20 77  stError */.    w
2b050 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74  inCurrentTimeInt
2b060 36 34 2c 20 2f 2a 20 78 43 75 72 72 65 6e 74 54  64, /* xCurrentT
2b070 69 6d 65 49 6e 74 36 34 20 2a 2f 0a 20 20 20 20  imeInt64 */.    
2b080 77 69 6e 53 65 74 53 79 73 74 65 6d 43 61 6c 6c  winSetSystemCall
2b090 2c 20 20 20 20 2f 2a 20 78 53 65 74 53 79 73 74  ,    /* xSetSyst
2b0a0 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20 20 77 69  emCall */.    wi
2b0b0 6e 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20  nGetSystemCall, 
2b0c0 20 20 20 2f 2a 20 78 47 65 74 53 79 73 74 65 6d     /* xGetSystem
2b0d0 43 61 6c 6c 20 2a 2f 0a 20 20 20 20 77 69 6e 4e  Call */.    winN
2b0e0 65 78 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20  extSystemCall,  
2b0f0 20 2f 2a 20 78 4e 65 78 74 53 79 73 74 65 6d 43   /* xNextSystemC
2b100 61 6c 6c 20 2a 2f 0a 20 20 7d 3b 0a 23 69 66 20  all */.  };.#if 
2b110 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
2b120 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20  IN32_HAS_WIDE). 
2b130 20 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f   static sqlite3_
2b140 76 66 73 20 77 69 6e 4c 6f 6e 67 50 61 74 68 56  vfs winLongPathV
2b150 66 73 20 3d 20 7b 0a 20 20 20 20 33 2c 20 20 20  fs = {.    3,   
2b160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b170 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20  /* iVersion */. 
2b180 20 20 20 73 69 7a 65 6f 66 28 77 69 6e 46 69 6c     sizeof(winFil
2b190 65 29 2c 20 20 20 20 20 2f 2a 20 73 7a 4f 73 46  e),     /* szOsF
2b1a0 69 6c 65 20 2a 2f 0a 20 20 20 20 53 51 4c 49 54  ile */.    SQLIT
2b1b0 45 5f 57 49 4e 4e 54 5f 4d 41 58 5f 50 41 54 48  E_WINNT_MAX_PATH
2b1c0 5f 42 59 54 45 53 2c 20 2f 2a 20 6d 78 50 61 74  _BYTES, /* mxPat
2b1d0 68 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 30 2c 20  hname */.    0, 
2b1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b1f0 20 20 2f 2a 20 70 4e 65 78 74 20 2a 2f 0a 20 20    /* pNext */.  
2b200 20 20 22 77 69 6e 33 32 2d 6c 6f 6e 67 70 61 74    "win32-longpat
2b210 68 22 2c 20 20 20 20 2f 2a 20 7a 4e 61 6d 65 20  h",    /* zName 
2b220 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20  */.    0,       
2b230 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70              /* p
2b240 41 70 70 44 61 74 61 20 2a 2f 0a 20 20 20 20 77  AppData */.    w
2b250 69 6e 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20  inOpen,         
2b260 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2a 2f 0a      /* xOpen */.
2b270 20 20 20 20 77 69 6e 44 65 6c 65 74 65 2c 20 20      winDelete,  
2b280 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 65 6c           /* xDel
2b290 65 74 65 20 2a 2f 0a 20 20 20 20 77 69 6e 41 63  ete */.    winAc
2b2a0 63 65 73 73 2c 20 20 20 20 20 20 20 20 20 20 20  cess,           
2b2b0 2f 2a 20 78 41 63 63 65 73 73 20 2a 2f 0a 20 20  /* xAccess */.  
2b2c0 20 20 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d    winFullPathnam
2b2d0 65 2c 20 20 20 20 20 2f 2a 20 78 46 75 6c 6c 50  e,     /* xFullP
2b2e0 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 77  athname */.    w
2b2f0 69 6e 44 6c 4f 70 65 6e 2c 20 20 20 20 20 20 20  inDlOpen,       
2b300 20 20 20 20 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a      /* xDlOpen *
2b310 2f 0a 20 20 20 20 77 69 6e 44 6c 45 72 72 6f 72  /.    winDlError
2b320 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44  ,          /* xD
2b330 6c 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20 77 69  lError */.    wi
2b340 6e 44 6c 53 79 6d 2c 20 20 20 20 20 20 20 20 20  nDlSym,         
2b350 20 20 20 2f 2a 20 78 44 6c 53 79 6d 20 2a 2f 0a     /* xDlSym */.
2b360 20 20 20 20 77 69 6e 44 6c 43 6c 6f 73 65 2c 20      winDlClose, 
2b370 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 43           /* xDlC
2b380 6c 6f 73 65 20 2a 2f 0a 20 20 20 20 77 69 6e 52  lose */.    winR
2b390 61 6e 64 6f 6d 6e 65 73 73 2c 20 20 20 20 20 20  andomness,      
2b3a0 20 2f 2a 20 78 52 61 6e 64 6f 6d 6e 65 73 73 20   /* xRandomness 
2b3b0 2a 2f 0a 20 20 20 20 77 69 6e 53 6c 65 65 70 2c  */.    winSleep,
2b3c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2b3d0 53 6c 65 65 70 20 2a 2f 0a 20 20 20 20 77 69 6e  Sleep */.    win
2b3e0 43 75 72 72 65 6e 74 54 69 6d 65 2c 20 20 20 20  CurrentTime,    
2b3f0 20 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d    /* xCurrentTim
2b400 65 20 2a 2f 0a 20 20 20 20 77 69 6e 47 65 74 4c  e */.    winGetL
2b410 61 73 74 45 72 72 6f 72 2c 20 20 20 20 20 2f 2a  astError,     /*
2b420 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72 20 2a   xGetLastError *
2b430 2f 0a 20 20 20 20 77 69 6e 43 75 72 72 65 6e 74  /.    winCurrent
2b440 54 69 6d 65 49 6e 74 36 34 2c 20 2f 2a 20 78 43  TimeInt64, /* xC
2b450 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 20  urrentTimeInt64 
2b460 2a 2f 0a 20 20 20 20 77 69 6e 53 65 74 53 79 73  */.    winSetSys
2b470 74 65 6d 43 61 6c 6c 2c 20 20 20 20 2f 2a 20 78  temCall,    /* x
2b480 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f  SetSystemCall */
2b490 0a 20 20 20 20 77 69 6e 47 65 74 53 79 73 74 65  .    winGetSyste
2b4a0 6d 43 61 6c 6c 2c 20 20 20 20 2f 2a 20 78 47 65  mCall,    /* xGe
2b4b0 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20  tSystemCall */. 
2b4c0 20 20 20 77 69 6e 4e 65 78 74 53 79 73 74 65 6d     winNextSystem
2b4d0 43 61 6c 6c 2c 20 20 20 2f 2a 20 78 4e 65 78 74  Call,   /* xNext
2b4e0 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20  SystemCall */.  
2b4f0 7d 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  };.#endif..  /* 
2b500 44 6f 75 62 6c 65 2d 63 68 65 63 6b 20 74 68 61  Double-check tha
2b510 74 20 74 68 65 20 61 53 79 73 63 61 6c 6c 5b 5d  t the aSyscall[]
2b520 20 61 72 72 61 79 20 68 61 73 20 62 65 65 6e 20   array has been 
2b530 63 6f 6e 73 74 72 75 63 74 65 64 0a 20 20 2a 2a  constructed.  **
2b540 20 63 6f 72 72 65 63 74 6c 79 2e 20 20 53 65 65   correctly.  See
2b550 20 74 69 63 6b 65 74 20 5b 62 62 33 61 38 36 65   ticket [bb3a86e
2b560 38 39 30 63 38 65 39 36 61 62 5d 20 2a 2f 0a 20  890c8e96ab] */. 
2b570 20 61 73 73 65 72 74 28 20 41 72 72 61 79 53 69   assert( ArraySi
2b580 7a 65 28 61 53 79 73 63 61 6c 6c 29 3d 3d 37 37  ze(aSyscall)==77
2b590 20 29 3b 0a 0a 20 20 2f 2a 20 67 65 74 20 6d 65   );..  /* get me
2b5a0 6d 6f 72 79 20 6d 61 70 20 61 6c 6c 6f 63 61 74  mory map allocat
2b5b0 69 6f 6e 20 67 72 61 6e 75 6c 61 72 69 74 79 20  ion granularity 
2b5c0 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 77 69 6e  */.  memset(&win
2b5d0 53 79 73 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65  SysInfo, 0, size
2b5e0 6f 66 28 53 59 53 54 45 4d 5f 49 4e 46 4f 29 29  of(SYSTEM_INFO))
2b5f0 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ;.#if SQLITE_OS_
2b600 57 49 4e 52 54 0a 20 20 6f 73 47 65 74 4e 61 74  WINRT.  osGetNat
2b610 69 76 65 53 79 73 74 65 6d 49 6e 66 6f 28 26 77  iveSystemInfo(&w
2b620 69 6e 53 79 73 49 6e 66 6f 29 3b 0a 23 65 6c 73  inSysInfo);.#els
2b630 65 0a 20 20 6f 73 47 65 74 53 79 73 74 65 6d 49  e.  osGetSystemI
2b640 6e 66 6f 28 26 77 69 6e 53 79 73 49 6e 66 6f 29  nfo(&winSysInfo)
2b650 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72  ;.#endif.  asser
2b660 74 28 20 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77  t( winSysInfo.dw
2b670 41 6c 6c 6f 63 61 74 69 6f 6e 47 72 61 6e 75 6c  AllocationGranul
2b680 61 72 69 74 79 3e 30 20 29 3b 0a 20 20 61 73 73  arity>0 );.  ass
2b690 65 72 74 28 20 77 69 6e 53 79 73 49 6e 66 6f 2e  ert( winSysInfo.
2b6a0 64 77 50 61 67 65 53 69 7a 65 3e 30 20 29 3b 0a  dwPageSize>0 );.
2b6b0 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72  .  sqlite3_vfs_r
2b6c0 65 67 69 73 74 65 72 28 26 77 69 6e 56 66 73 2c  egister(&winVfs,
2b6d0 20 31 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65   1);..#if define
2b6e0 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
2b6f0 41 53 5f 57 49 44 45 29 0a 20 20 73 71 6c 69 74  AS_WIDE).  sqlit
2b700 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28  e3_vfs_register(
2b710 26 77 69 6e 4c 6f 6e 67 50 61 74 68 56 66 73 2c  &winLongPathVfs,
2b720 20 30 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 72   0);.#endif..  r
2b730 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2b740 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .}..int sqlite3_
2b750 6f 73 5f 65 6e 64 28 76 6f 69 64 29 7b 0a 23 69  os_end(void){.#i
2b760 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
2b770 54 0a 20 20 69 66 28 20 73 6c 65 65 70 4f 62 6a  T.  if( sleepObj
2b780 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 6f 73  !=NULL ){.    os
2b790 43 6c 6f 73 65 48 61 6e 64 6c 65 28 73 6c 65 65  CloseHandle(slee
2b7a0 70 4f 62 6a 29 3b 0a 20 20 20 20 73 6c 65 65 70  pObj);.    sleep
2b7b0 4f 62 6a 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a  Obj = NULL;.  }.
2b7c0 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
2b7d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65  SQLITE_OK;.}..#e
2b7e0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
2b7f0 53 5f 57 49 4e 20 2a 2f 0a                       S_WIN */.