/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact 752a65dc7e6f28379052776dca52ebeaeaffb12f:


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 20 73 79 73 74  e.** target syst
0800: 65 6d 2e 20 20 47 65 74 56 65 72 73 69 6f 6e 45  em.  GetVersionE
0810: 78 20 77 61 73 20 66 69 72 73 74 20 64 65 70 72  x was first depr
0820: 65 63 61 74 65 64 20 69 6e 20 57 69 6e 38 2e 31  ecated in Win8.1
0830: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
0840: 49 54 45 5f 57 49 4e 33 32 5f 47 45 54 56 45 52  ITE_WIN32_GETVER
0850: 53 49 4f 4e 45 58 0a 23 20 20 69 66 20 64 65 66  SIONEX.#  if def
0860: 69 6e 65 64 28 4e 54 44 44 49 5f 56 45 52 53 49  ined(NTDDI_VERSI
0870: 4f 4e 29 20 26 26 20 4e 54 44 44 49 5f 56 45 52  ON) && NTDDI_VER
0880: 53 49 4f 4e 20 3e 3d 20 4e 54 44 44 49 5f 57 49  SION >= NTDDI_WI
0890: 4e 42 4c 55 45 0a 23 20 20 20 20 64 65 66 69 6e  NBLUE.#    defin
08a0: 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 47  e SQLITE_WIN32_G
08b0: 45 54 56 45 52 53 49 4f 4e 45 58 20 20 20 30 20  ETVERSIONEX   0 
08c0: 20 20 2f 2a 20 47 65 74 56 65 72 73 69 6f 6e 45    /* GetVersionE
08d0: 78 28 29 20 69 73 20 64 65 70 72 65 63 61 74 65  x() is deprecate
08e0: 64 20 2a 2f 0a 23 20 20 65 6c 73 65 0a 23 20 20  d */.#  else.#  
08f0: 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f    define SQLITE_
0900: 57 49 4e 33 32 5f 47 45 54 56 45 52 53 49 4f 4e  WIN32_GETVERSION
0910: 45 58 20 20 20 31 20 20 20 2f 2a 20 47 65 74 56  EX   1   /* GetV
0920: 65 72 73 69 6f 6e 45 78 28 29 20 69 73 20 63 75  ersionEx() is cu
0930: 72 72 65 6e 74 20 2a 2f 0a 23 20 20 65 6e 64 69  rrent */.#  endi
0940: 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  f.#endif../*.** 
0950: 54 68 69 73 20 63 6f 6e 73 74 61 6e 74 20 73 68  This constant sh
0960: 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 62 65 20  ould already be 
0970: 64 65 66 69 6e 65 64 20 28 69 6e 20 74 68 65 20  defined (in the 
0980: 22 57 69 6e 44 65 66 2e 68 22 20 53 44 4b 20 66  "WinDef.h" SDK f
0990: 69 6c 65 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  ile)..*/.#ifndef
09a0: 20 4d 41 58 5f 50 41 54 48 0a 23 20 20 64 65 66   MAX_PATH.#  def
09b0: 69 6e 65 20 4d 41 58 5f 50 41 54 48 20 20 20 20  ine MAX_PATH    
09c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09d0: 20 20 28 32 36 30 29 0a 23 65 6e 64 69 66 0a 0a    (260).#endif..
09e0: 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 70 61  /*.** Maximum pa
09f0: 74 68 6e 61 6d 65 20 6c 65 6e 67 74 68 20 28 69  thname length (i
0a00: 6e 20 63 68 61 72 73 29 20 66 6f 72 20 57 69 6e  n chars) for Win
0a10: 33 32 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64  32.  This should
0a20: 20 6e 6f 72 6d 61 6c 6c 79 20 62 65 0a 2a 2a 20   normally be.** 
0a30: 4d 41 58 5f 50 41 54 48 2e 0a 2a 2f 0a 23 69 66  MAX_PATH..*/.#if
0a40: 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  ndef SQLITE_WIN3
0a50: 32 5f 4d 41 58 5f 50 41 54 48 5f 43 48 41 52 53  2_MAX_PATH_CHARS
0a60: 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54  .#  define SQLIT
0a70: 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 50 41 54 48  E_WIN32_MAX_PATH
0a80: 5f 43 48 41 52 53 20 20 20 28 4d 41 58 5f 50 41  _CHARS   (MAX_PA
0a90: 54 48 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  TH).#endif../*.*
0aa0: 2a 20 54 68 69 73 20 63 6f 6e 73 74 61 6e 74 20  * This constant 
0ab0: 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 62  should already b
0ac0: 65 20 64 65 66 69 6e 65 64 20 28 69 6e 20 74 68  e defined (in th
0ad0: 65 20 22 57 69 6e 4e 54 2e 68 22 20 53 44 4b 20  e "WinNT.h" SDK 
0ae0: 66 69 6c 65 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65  file)..*/.#ifnde
0af0: 66 20 55 4e 49 43 4f 44 45 5f 53 54 52 49 4e 47  f UNICODE_STRING
0b00: 5f 4d 41 58 5f 43 48 41 52 53 0a 23 20 20 64 65  _MAX_CHARS.#  de
0b10: 66 69 6e 65 20 55 4e 49 43 4f 44 45 5f 53 54 52  fine UNICODE_STR
0b20: 49 4e 47 5f 4d 41 58 5f 43 48 41 52 53 20 20 20  ING_MAX_CHARS   
0b30: 20 20 20 28 33 32 37 36 37 29 0a 23 65 6e 64 69     (32767).#endi
0b40: 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d  f../*.** Maximum
0b50: 20 70 61 74 68 6e 61 6d 65 20 6c 65 6e 67 74 68   pathname length
0b60: 20 28 69 6e 20 63 68 61 72 73 29 20 66 6f 72 20   (in chars) for 
0b70: 57 69 6e 4e 54 2e 20 20 54 68 69 73 20 73 68 6f  WinNT.  This sho
0b80: 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20 62 65 0a  uld normally be.
0b90: 2a 2a 20 55 4e 49 43 4f 44 45 5f 53 54 52 49 4e  ** UNICODE_STRIN
0ba0: 47 5f 4d 41 58 5f 43 48 41 52 53 2e 0a 2a 2f 0a  G_MAX_CHARS..*/.
0bb0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57  #ifndef SQLITE_W
0bc0: 49 4e 4e 54 5f 4d 41 58 5f 50 41 54 48 5f 43 48  INNT_MAX_PATH_CH
0bd0: 41 52 53 0a 23 20 20 64 65 66 69 6e 65 20 53 51  ARS.#  define SQ
0be0: 4c 49 54 45 5f 57 49 4e 4e 54 5f 4d 41 58 5f 50  LITE_WINNT_MAX_P
0bf0: 41 54 48 5f 43 48 41 52 53 20 20 20 28 55 4e 49  ATH_CHARS   (UNI
0c00: 43 4f 44 45 5f 53 54 52 49 4e 47 5f 4d 41 58 5f  CODE_STRING_MAX_
0c10: 43 48 41 52 53 29 0a 23 65 6e 64 69 66 0a 0a 2f  CHARS).#endif../
0c20: 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 70 61 74  *.** Maximum pat
0c30: 68 6e 61 6d 65 20 6c 65 6e 67 74 68 20 28 69 6e  hname length (in
0c40: 20 62 79 74 65 73 29 20 66 6f 72 20 57 69 6e 33   bytes) for Win3
0c50: 32 2e 20 20 54 68 65 20 4d 41 58 5f 50 41 54 48  2.  The MAX_PATH
0c60: 20 6d 61 63 72 6f 20 69 73 20 69 6e 0a 2a 2a 20   macro is in.** 
0c70: 63 68 61 72 61 63 74 65 72 73 2c 20 73 6f 20 77  characters, so w
0c80: 65 20 61 6c 6c 6f 63 61 74 65 20 34 20 62 79 74  e allocate 4 byt
0c90: 65 73 20 70 65 72 20 63 68 61 72 61 63 74 65 72  es per character
0ca0: 20 61 73 73 75 6d 69 6e 67 20 77 6f 72 73 74 2d   assuming worst-
0cb0: 63 61 73 65 20 6f 66 0a 2a 2a 20 34 2d 62 79 74  case of.** 4-byt
0cc0: 65 73 2d 70 65 72 2d 63 68 61 72 61 63 74 65 72  es-per-character
0cd0: 20 66 6f 72 20 55 54 46 38 2e 0a 2a 2f 0a 23 69   for UTF8..*/.#i
0ce0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  fndef SQLITE_WIN
0cf0: 33 32 5f 4d 41 58 5f 50 41 54 48 5f 42 59 54 45  32_MAX_PATH_BYTE
0d00: 53 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49  S.#  define SQLI
0d10: 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 50 41 54  TE_WIN32_MAX_PAT
0d20: 48 5f 42 59 54 45 53 20 20 20 28 53 51 4c 49 54  H_BYTES   (SQLIT
0d30: 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 50 41 54 48  E_WIN32_MAX_PATH
0d40: 5f 43 48 41 52 53 2a 34 29 0a 23 65 6e 64 69 66  _CHARS*4).#endif
0d50: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20  ../*.** Maximum 
0d60: 70 61 74 68 6e 61 6d 65 20 6c 65 6e 67 74 68 20  pathname length 
0d70: 28 69 6e 20 62 79 74 65 73 29 20 66 6f 72 20 57  (in bytes) for W
0d80: 69 6e 4e 54 2e 20 20 54 68 69 73 20 73 68 6f 75  inNT.  This shou
0d90: 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20 62 65 0a 2a  ld normally be.*
0da0: 2a 20 55 4e 49 43 4f 44 45 5f 53 54 52 49 4e 47  * UNICODE_STRING
0db0: 5f 4d 41 58 5f 43 48 41 52 53 20 2a 20 73 69 7a  _MAX_CHARS * siz
0dc0: 65 6f 66 28 57 43 48 41 52 29 2e 0a 2a 2f 0a 23  eof(WCHAR)..*/.#
0dd0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49  ifndef SQLITE_WI
0de0: 4e 4e 54 5f 4d 41 58 5f 50 41 54 48 5f 42 59 54  NNT_MAX_PATH_BYT
0df0: 45 53 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c  ES.#  define SQL
0e00: 49 54 45 5f 57 49 4e 4e 54 5f 4d 41 58 5f 50 41  ITE_WINNT_MAX_PA
0e10: 54 48 5f 42 59 54 45 53 20 20 20 5c 0a 20 20 20  TH_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 28 73 69 7a 65 6f 66           (sizeof
0e40: 28 57 43 48 41 52 29 20 2a 20 53 51 4c 49 54 45  (WCHAR) * SQLITE
0e50: 5f 57 49 4e 4e 54 5f 4d 41 58 5f 50 41 54 48 5f  _WINNT_MAX_PATH_
0e60: 43 48 41 52 53 29 0a 23 65 6e 64 69 66 0a 0a 2f  CHARS).#endif../
0e70: 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 65 72 72  *.** Maximum err
0e80: 6f 72 20 6d 65 73 73 61 67 65 20 6c 65 6e 67 74  or message lengt
0e90: 68 20 28 69 6e 20 63 68 61 72 73 29 20 66 6f 72  h (in chars) for
0ea0: 20 57 69 6e 52 54 2e 0a 2a 2f 0a 23 69 66 6e 64   WinRT..*/.#ifnd
0eb0: 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ef SQLITE_WIN32_
0ec0: 4d 41 58 5f 45 52 52 4d 53 47 5f 43 48 41 52 53  MAX_ERRMSG_CHARS
0ed0: 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54  .#  define SQLIT
0ee0: 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 45 52 52 4d  E_WIN32_MAX_ERRM
0ef0: 53 47 5f 43 48 41 52 53 20 28 31 30 32 34 29 0a  SG_CHARS (1024).
0f00: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
0f10: 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20 69  turns non-zero i
0f20: 66 20 74 68 65 20 63 68 61 72 61 63 74 65 72 20  f the character 
0f30: 73 68 6f 75 6c 64 20 62 65 20 74 72 65 61 74 65  should be treate
0f40: 64 20 61 73 20 61 20 64 69 72 65 63 74 6f 72 79  d as a directory
0f50: 0a 2a 2a 20 73 65 70 61 72 61 74 6f 72 2e 0a 2a  .** separator..*
0f60: 2f 0a 23 69 66 6e 64 65 66 20 77 69 6e 49 73 44  /.#ifndef winIsD
0f70: 69 72 53 65 70 0a 23 20 20 64 65 66 69 6e 65 20  irSep.#  define 
0f80: 77 69 6e 49 73 44 69 72 53 65 70 28 61 29 20 20  winIsDirSep(a)  
0f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28                ((
0fa0: 28 61 29 20 3d 3d 20 27 2f 27 29 20 7c 7c 20 28  (a) == '/') || (
0fb0: 28 61 29 20 3d 3d 20 27 5c 5c 27 29 29 0a 23 65  (a) == '\\')).#e
0fc0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
0fd0: 20 6d 61 63 72 6f 20 69 73 20 75 73 65 64 20 77   macro is used w
0fe0: 68 65 6e 20 61 20 6c 6f 63 61 6c 20 76 61 72 69  hen a local vari
0ff0: 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f 20 61  able is set to a
1000: 20 76 61 6c 75 65 20 74 68 61 74 20 69 73 0a 2a   value that is.*
1010: 2a 20 5b 73 6f 6d 65 74 69 6d 65 73 5d 20 6e 6f  * [sometimes] no
1020: 74 20 75 73 65 64 20 62 79 20 74 68 65 20 63 6f  t used by the co
1030: 64 65 20 28 65 2e 67 2e 20 76 69 61 20 63 6f 6e  de (e.g. via con
1040: 64 69 74 69 6f 6e 61 6c 20 63 6f 6d 70 69 6c 61  ditional compila
1050: 74 69 6f 6e 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65  tion)..*/.#ifnde
1060: 66 20 55 4e 55 53 45 44 5f 56 41 52 49 41 42 4c  f UNUSED_VARIABL
1070: 45 5f 56 41 4c 55 45 0a 23 20 20 64 65 66 69 6e  E_VALUE.#  defin
1080: 65 20 55 4e 55 53 45 44 5f 56 41 52 49 41 42 4c  e UNUSED_VARIABL
1090: 45 5f 56 41 4c 55 45 28 78 29 20 20 20 20 20 20  E_VALUE(x)      
10a0: 28 76 6f 69 64 29 28 78 29 0a 23 65 6e 64 69 66  (void)(x).#endif
10b0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20  ../*.** Returns 
10c0: 74 68 65 20 63 68 61 72 61 63 74 65 72 20 74 68  the character th
10d0: 61 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65  at should be use
10e0: 64 20 61 73 20 74 68 65 20 64 69 72 65 63 74 6f  d as the directo
10f0: 72 79 20 73 65 70 61 72 61 74 6f 72 2e 0a 2a 2f  ry separator..*/
1100: 0a 23 69 66 6e 64 65 66 20 77 69 6e 47 65 74 44  .#ifndef winGetD
1110: 69 72 53 65 70 0a 23 20 20 64 65 66 69 6e 65 20  irSep.#  define 
1120: 77 69 6e 47 65 74 44 69 72 53 65 70 28 29 20 20  winGetDirSep()  
1130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 27 5c                '\
1140: 5c 27 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  \'.#endif../*.**
1150: 20 44 6f 20 77 65 20 6e 65 65 64 20 74 6f 20 6d   Do we need to m
1160: 61 6e 75 61 6c 6c 79 20 64 65 66 69 6e 65 20 74  anually define t
1170: 68 65 20 57 69 6e 33 32 20 66 69 6c 65 20 6d 61  he Win32 file ma
1180: 70 70 69 6e 67 20 41 50 49 73 20 66 6f 72 20 75  pping APIs for u
1190: 73 65 20 77 69 74 68 20 57 41 4c 0a 2a 2a 20 6d  se with WAL.** m
11a0: 6f 64 65 20 28 65 2e 67 2e 20 74 68 65 73 65 20  ode (e.g. these 
11b0: 41 50 49 73 20 61 72 65 20 61 76 61 69 6c 61 62  APIs are availab
11c0: 6c 65 20 69 6e 20 74 68 65 20 57 69 6e 64 6f 77  le in the Window
11d0: 73 20 43 45 20 53 44 4b 3b 20 68 6f 77 65 76 65  s CE SDK; howeve
11e0: 72 2c 20 74 68 65 79 0a 2a 2a 20 61 72 65 20 6e  r, they.** are n
11f0: 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68  ot present in th
1200: 65 20 68 65 61 64 65 72 20 66 69 6c 65 29 3f 0a  e header file)?.
1210: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 57 49  */.#if SQLITE_WI
1220: 4e 33 32 5f 46 49 4c 45 4d 41 50 50 49 4e 47 5f  N32_FILEMAPPING_
1230: 41 50 49 20 26 26 20 21 64 65 66 69 6e 65 64 28  API && !defined(
1240: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29  SQLITE_OMIT_WAL)
1250: 0a 2f 2a 0a 2a 2a 20 54 77 6f 20 6f 66 20 74 68  ./*.** Two of th
1260: 65 20 66 69 6c 65 20 6d 61 70 70 69 6e 67 20 41  e file mapping A
1270: 50 49 73 20 61 72 65 20 64 69 66 66 65 72 65 6e  PIs are differen
1280: 74 20 75 6e 64 65 72 20 57 69 6e 52 54 2e 20 20  t under WinRT.  
1290: 46 69 67 75 72 65 20 6f 75 74 20 77 68 69 63 68  Figure out which
12a0: 0a 2a 2a 20 73 65 74 20 77 65 20 6e 65 65 64 2e  .** set we need.
12b0: 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  .*/.#if SQLITE_O
12c0: 53 5f 57 49 4e 52 54 0a 57 49 4e 42 41 53 45 41  S_WINRT.WINBASEA
12d0: 50 49 20 48 41 4e 44 4c 45 20 57 49 4e 41 50 49  PI HANDLE WINAPI
12e0: 20 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69   CreateFileMappi
12f0: 6e 67 46 72 6f 6d 41 70 70 28 48 41 4e 44 4c 45  ngFromApp(HANDLE
1300: 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 53 45  , \.        LPSE
1310: 43 55 52 49 54 59 5f 41 54 54 52 49 42 55 54 45  CURITY_ATTRIBUTE
1320: 53 2c 20 55 4c 4f 4e 47 2c 20 55 4c 4f 4e 47 36  S, ULONG, ULONG6
1330: 34 2c 20 4c 50 43 57 53 54 52 29 3b 0a 0a 57 49  4, LPCWSTR);..WI
1340: 4e 42 41 53 45 41 50 49 20 4c 50 56 4f 49 44 20  NBASEAPI LPVOID 
1350: 57 49 4e 41 50 49 20 4d 61 70 56 69 65 77 4f 66  WINAPI MapViewOf
1360: 46 69 6c 65 46 72 6f 6d 41 70 70 28 48 41 4e 44  FileFromApp(HAND
1370: 4c 45 2c 20 55 4c 4f 4e 47 2c 20 55 4c 4f 4e 47  LE, ULONG, ULONG
1380: 36 34 2c 20 53 49 5a 45 5f 54 29 3b 0a 23 65 6c  64, SIZE_T);.#el
1390: 73 65 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  se.#if defined(S
13a0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
13b0: 41 4e 53 49 29 0a 57 49 4e 42 41 53 45 41 50 49  ANSI).WINBASEAPI
13c0: 20 48 41 4e 44 4c 45 20 57 49 4e 41 50 49 20 43   HANDLE WINAPI C
13d0: 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67  reateFileMapping
13e0: 41 28 48 41 4e 44 4c 45 2c 20 4c 50 53 45 43 55  A(HANDLE, LPSECU
13f0: 52 49 54 59 5f 41 54 54 52 49 42 55 54 45 53 2c  RITY_ATTRIBUTES,
1400: 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44   \.        DWORD
1410: 2c 20 44 57 4f 52 44 2c 20 44 57 4f 52 44 2c 20  , DWORD, DWORD, 
1420: 4c 50 43 53 54 52 29 3b 0a 23 65 6e 64 69 66 20  LPCSTR);.#endif 
1430: 2f 2a 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  /* defined(SQLIT
1440: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
1450: 29 20 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65  ) */..#if define
1460: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
1470: 41 53 5f 57 49 44 45 29 0a 57 49 4e 42 41 53 45  AS_WIDE).WINBASE
1480: 41 50 49 20 48 41 4e 44 4c 45 20 57 49 4e 41 50  API HANDLE WINAP
1490: 49 20 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70  I CreateFileMapp
14a0: 69 6e 67 57 28 48 41 4e 44 4c 45 2c 20 4c 50 53  ingW(HANDLE, LPS
14b0: 45 43 55 52 49 54 59 5f 41 54 54 52 49 42 55 54  ECURITY_ATTRIBUT
14c0: 45 53 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57  ES, \.        DW
14d0: 4f 52 44 2c 20 44 57 4f 52 44 2c 20 44 57 4f 52  ORD, DWORD, DWOR
14e0: 44 2c 20 4c 50 43 57 53 54 52 29 3b 0a 23 65 6e  D, LPCWSTR);.#en
14f0: 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53  dif /* defined(S
1500: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
1510: 57 49 44 45 29 20 2a 2f 0a 0a 57 49 4e 42 41 53  WIDE) */..WINBAS
1520: 45 41 50 49 20 4c 50 56 4f 49 44 20 57 49 4e 41  EAPI LPVOID WINA
1530: 50 49 20 4d 61 70 56 69 65 77 4f 66 46 69 6c 65  PI MapViewOfFile
1540: 28 48 41 4e 44 4c 45 2c 20 44 57 4f 52 44 2c 20  (HANDLE, DWORD, 
1550: 44 57 4f 52 44 2c 20 44 57 4f 52 44 2c 20 53 49  DWORD, DWORD, SI
1560: 5a 45 5f 54 29 3b 0a 23 65 6e 64 69 66 20 2f 2a  ZE_T);.#endif /*
1570: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
1580: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20   */../*.** This 
1590: 66 69 6c 65 20 6d 61 70 70 69 6e 67 20 41 50 49  file mapping API
15a0: 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20 62 6f   is common to bo
15b0: 74 68 20 57 69 6e 33 32 20 61 6e 64 20 57 69 6e  th Win32 and Win
15c0: 52 54 2e 0a 2a 2f 0a 57 49 4e 42 41 53 45 41 50  RT..*/.WINBASEAP
15d0: 49 20 42 4f 4f 4c 20 57 49 4e 41 50 49 20 55 6e  I BOOL WINAPI Un
15e0: 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 28 4c 50  mapViewOfFile(LP
15f0: 43 56 4f 49 44 29 3b 0a 23 65 6e 64 69 66 20 2f  CVOID);.#endif /
1600: 2a 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 46  * SQLITE_WIN32_F
1610: 49 4c 45 4d 41 50 50 49 4e 47 5f 41 50 49 20 26  ILEMAPPING_API &
1620: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
1630: 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 2a 2f 0a 0a  E_OMIT_WAL) */..
1640: 2f 2a 0a 2a 2a 20 53 6f 6d 65 20 4d 69 63 72 6f  /*.** Some Micro
1650: 73 6f 66 74 20 63 6f 6d 70 69 6c 65 72 73 20 6c  soft compilers l
1660: 61 63 6b 20 74 68 69 73 20 64 65 66 69 6e 69 74  ack this definit
1670: 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ion..*/.#ifndef 
1680: 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54  INVALID_FILE_ATT
1690: 52 49 42 55 54 45 53 0a 23 20 64 65 66 69 6e 65  RIBUTES.# define
16a0: 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54   INVALID_FILE_AT
16b0: 54 52 49 42 55 54 45 53 20 28 28 44 57 4f 52 44  TRIBUTES ((DWORD
16c0: 29 2d 31 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66  )-1).#endif..#if
16d0: 6e 64 65 66 20 46 49 4c 45 5f 46 4c 41 47 5f 4d  ndef FILE_FLAG_M
16e0: 41 53 4b 0a 23 20 64 65 66 69 6e 65 20 46 49 4c  ASK.# define FIL
16f0: 45 5f 46 4c 41 47 5f 4d 41 53 4b 20 20 20 20 20  E_FLAG_MASK     
1700: 20 20 20 20 20 28 30 78 46 46 33 43 30 30 30 30       (0xFF3C0000
1710: 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  ).#endif..#ifnde
1720: 66 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  f FILE_ATTRIBUTE
1730: 5f 4d 41 53 4b 0a 23 20 64 65 66 69 6e 65 20 46  _MASK.# define F
1740: 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 4d 41  ILE_ATTRIBUTE_MA
1750: 53 4b 20 20 20 20 20 28 30 78 30 30 30 33 46 46  SK     (0x0003FF
1760: 46 37 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  F7).#endif..#ifn
1770: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1780: 57 41 4c 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72  WAL./* Forward r
1790: 65 66 65 72 65 6e 63 65 73 20 74 6f 20 73 74 72  eferences to str
17a0: 75 63 74 75 72 65 73 20 75 73 65 64 20 66 6f 72  uctures used for
17b0: 20 57 41 4c 20 2a 2f 0a 74 79 70 65 64 65 66 20   WAL */.typedef 
17c0: 73 74 72 75 63 74 20 77 69 6e 53 68 6d 20 77 69  struct winShm wi
17d0: 6e 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20  nShm;           
17e0: 2f 2a 20 41 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  /* A connection 
17f0: 74 6f 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  to shared-memory
1800: 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75   */.typedef stru
1810: 63 74 20 77 69 6e 53 68 6d 4e 6f 64 65 20 77 69  ct winShmNode wi
1820: 6e 53 68 6d 4e 6f 64 65 3b 20 20 20 2f 2a 20 41  nShmNode;   /* A
1830: 20 72 65 67 69 6f 6e 20 6f 66 20 73 68 61 72 65   region of share
1840: 64 2d 6d 65 6d 6f 72 79 20 2a 2f 0a 23 65 6e 64  d-memory */.#end
1850: 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 69 6e 43 45 20  if../*.** WinCE 
1860: 6c 61 63 6b 73 20 6e 61 74 69 76 65 20 73 75 70  lacks native sup
1870: 70 6f 72 74 20 66 6f 72 20 66 69 6c 65 20 6c 6f  port for file lo
1880: 63 6b 69 6e 67 20 73 6f 20 77 65 20 68 61 76 65  cking so we have
1890: 20 74 6f 20 66 61 6b 65 20 69 74 0a 2a 2a 20 77   to fake it.** w
18a0: 69 74 68 20 73 6f 6d 65 20 63 6f 64 65 20 6f 66  ith some code of
18b0: 20 6f 75 72 20 6f 77 6e 2e 0a 2a 2f 0a 23 69 66   our own..*/.#if
18c0: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
18d0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
18e0: 77 69 6e 63 65 4c 6f 63 6b 20 7b 0a 20 20 69 6e  winceLock {.  in
18f0: 74 20 6e 52 65 61 64 65 72 73 3b 20 20 20 20 20  t nReaders;     
1900: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
1910: 65 61 64 65 72 20 6c 6f 63 6b 73 20 6f 62 74 61  eader locks obta
1920: 69 6e 65 64 20 2a 2f 0a 20 20 42 4f 4f 4c 20 62  ined */.  BOOL b
1930: 50 65 6e 64 69 6e 67 3b 20 20 20 20 20 20 2f 2a  Pending;      /*
1940: 20 49 6e 64 69 63 61 74 65 73 20 61 20 70 65 6e   Indicates a pen
1950: 64 69 6e 67 20 6c 6f 63 6b 20 68 61 73 20 62 65  ding lock has be
1960: 65 6e 20 6f 62 74 61 69 6e 65 64 20 2a 2f 0a 20  en obtained */. 
1970: 20 42 4f 4f 4c 20 62 52 65 73 65 72 76 65 64 3b   BOOL bReserved;
1980: 20 20 20 20 20 2f 2a 20 49 6e 64 69 63 61 74 65       /* Indicate
1990: 73 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63  s a reserved loc
19a0: 6b 20 68 61 73 20 62 65 65 6e 20 6f 62 74 61 69  k has been obtai
19b0: 6e 65 64 20 2a 2f 0a 20 20 42 4f 4f 4c 20 62 45  ned */.  BOOL bE
19c0: 78 63 6c 75 73 69 76 65 3b 20 20 20 20 2f 2a 20  xclusive;    /* 
19d0: 49 6e 64 69 63 61 74 65 73 20 61 6e 20 65 78 63  Indicates an exc
19e0: 6c 75 73 69 76 65 20 6c 6f 63 6b 20 68 61 73 20  lusive lock has 
19f0: 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 2a 2f  been obtained */
1a00: 0a 7d 20 77 69 6e 63 65 4c 6f 63 6b 3b 0a 23 65  .} winceLock;.#e
1a10: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
1a20: 77 69 6e 46 69 6c 65 20 73 74 72 75 63 74 75 72  winFile structur
1a30: 65 20 69 73 20 61 20 73 75 62 63 6c 61 73 73 20  e is a subclass 
1a40: 6f 66 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  of sqlite3_file*
1a50: 20 73 70 65 63 69 66 69 63 20 74 6f 20 74 68 65   specific to the
1a60: 20 77 69 6e 33 32 0a 2a 2a 20 70 6f 72 74 61 62   win32.** portab
1a70: 69 6c 69 74 79 20 6c 61 79 65 72 2e 0a 2a 2f 0a  ility layer..*/.
1a80: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 77  typedef struct w
1a90: 69 6e 46 69 6c 65 20 77 69 6e 46 69 6c 65 3b 0a  inFile winFile;.
1aa0: 73 74 72 75 63 74 20 77 69 6e 46 69 6c 65 20 7b  struct winFile {
1ab0: 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  .  const sqlite3
1ac0: 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 70 4d 65  _io_methods *pMe
1ad0: 74 68 6f 64 3b 20 2f 2a 2a 2a 20 4d 75 73 74 20  thod; /*** Must 
1ae0: 62 65 20 66 69 72 73 74 20 2a 2a 2a 2f 0a 20 20  be first ***/.  
1af0: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
1b00: 73 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56  s;      /* The V
1b10: 46 53 20 75 73 65 64 20 74 6f 20 6f 70 65 6e 20  FS used to open 
1b20: 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 48  this file */.  H
1b30: 41 4e 44 4c 45 20 68 3b 20 20 20 20 20 20 20 20  ANDLE h;        
1b40: 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65         /* Handle
1b50: 20 66 6f 72 20 61 63 63 65 73 73 69 6e 67 20 74   for accessing t
1b60: 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20  he file */.  u8 
1b70: 6c 6f 63 6b 74 79 70 65 3b 20 20 20 20 20 20 20  locktype;       
1b80: 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20       /* Type of 
1b90: 6c 6f 63 6b 20 63 75 72 72 65 6e 74 6c 79 20 68  lock currently h
1ba0: 65 6c 64 20 6f 6e 20 74 68 69 73 20 66 69 6c 65  eld on this file
1bb0: 20 2a 2f 0a 20 20 73 68 6f 72 74 20 73 68 61 72   */.  short shar
1bc0: 65 64 4c 6f 63 6b 42 79 74 65 3b 20 20 20 2f 2a  edLockByte;   /*
1bd0: 20 52 61 6e 64 6f 6d 6c 79 20 63 68 6f 73 65 6e   Randomly chosen
1be0: 20 62 79 74 65 20 75 73 65 64 20 61 73 20 61 20   byte used as a 
1bf0: 73 68 61 72 65 64 20 6c 6f 63 6b 20 2a 2f 0a 20  shared lock */. 
1c00: 20 75 38 20 63 74 72 6c 46 6c 61 67 73 3b 20 20   u8 ctrlFlags;  
1c10: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
1c20: 73 2e 20 20 53 65 65 20 57 49 4e 46 49 4c 45 5f  s.  See WINFILE_
1c30: 2a 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 44 57 4f  * below */.  DWO
1c40: 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 20 20 20  RD lastErrno;   
1c50: 20 20 20 20 20 2f 2a 20 54 68 65 20 57 69 6e 64       /* The Wind
1c60: 6f 77 73 20 65 72 72 6e 6f 20 66 72 6f 6d 20 74  ows errno from t
1c70: 68 65 20 6c 61 73 74 20 49 2f 4f 20 65 72 72 6f  he last I/O erro
1c80: 72 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  r */.#ifndef SQL
1c90: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 77  ITE_OMIT_WAL.  w
1ca0: 69 6e 53 68 6d 20 2a 70 53 68 6d 3b 20 20 20 20  inShm *pShm;    
1cb0: 20 20 20 20 20 20 20 2f 2a 20 49 6e 73 74 61 6e         /* Instan
1cc0: 63 65 20 6f 66 20 73 68 61 72 65 64 20 6d 65 6d  ce of shared mem
1cd0: 6f 72 79 20 6f 6e 20 74 68 69 73 20 66 69 6c 65  ory on this file
1ce0: 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 63 6f 6e   */.#endif.  con
1cf0: 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 3b 20  st char *zPath; 
1d00: 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20 70 61 74       /* Full pat
1d10: 68 6e 61 6d 65 20 6f 66 20 74 68 69 73 20 66 69  hname of this fi
1d20: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 43 68  le */.  int szCh
1d30: 75 6e 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  unk;            
1d40: 2f 2a 20 43 68 75 6e 6b 20 73 69 7a 65 20 63 6f  /* Chunk size co
1d50: 6e 66 69 67 75 72 65 64 20 62 79 20 46 43 4e 54  nfigured by FCNT
1d60: 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 20 2a 2f 0a  L_CHUNK_SIZE */.
1d70: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
1d80: 4e 43 45 0a 20 20 4c 50 57 53 54 52 20 7a 44 65  NCE.  LPWSTR zDe
1d90: 6c 65 74 65 4f 6e 43 6c 6f 73 65 3b 20 20 2f 2a  leteOnClose;  /*
1da0: 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f   Name of file to
1db0: 20 64 65 6c 65 74 65 20 77 68 65 6e 20 63 6c 6f   delete when clo
1dc0: 73 69 6e 67 20 2a 2f 0a 20 20 48 41 4e 44 4c 45  sing */.  HANDLE
1dd0: 20 68 4d 75 74 65 78 3b 20 20 20 20 20 20 20 20   hMutex;        
1de0: 20 20 2f 2a 20 4d 75 74 65 78 20 75 73 65 64 20    /* Mutex used 
1df0: 74 6f 20 63 6f 6e 74 72 6f 6c 20 61 63 63 65 73  to control acces
1e00: 73 20 74 6f 20 73 68 61 72 65 64 20 6c 6f 63 6b  s to shared lock
1e10: 20 2a 2f 0a 20 20 48 41 4e 44 4c 45 20 68 53 68   */.  HANDLE hSh
1e20: 61 72 65 64 3b 20 20 20 20 20 20 20 20 20 2f 2a  ared;         /*
1e30: 20 53 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 73   Shared memory s
1e40: 65 67 6d 65 6e 74 20 75 73 65 64 20 66 6f 72 20  egment used for 
1e50: 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20 77 69 6e  locking */.  win
1e60: 63 65 4c 6f 63 6b 20 6c 6f 63 61 6c 3b 20 20 20  ceLock local;   
1e70: 20 20 20 20 20 2f 2a 20 4c 6f 63 6b 73 20 6f 62       /* Locks ob
1e80: 74 61 69 6e 65 64 20 62 79 20 74 68 69 73 20 69  tained by this i
1e90: 6e 73 74 61 6e 63 65 20 6f 66 20 77 69 6e 46 69  nstance of winFi
1ea0: 6c 65 20 2a 2f 0a 20 20 77 69 6e 63 65 4c 6f 63  le */.  winceLoc
1eb0: 6b 20 2a 73 68 61 72 65 64 3b 20 20 20 20 20 20  k *shared;      
1ec0: 2f 2a 20 47 6c 6f 62 61 6c 20 73 68 61 72 65 64  /* Global shared
1ed0: 20 6c 6f 63 6b 20 6d 65 6d 6f 72 79 20 66 6f 72   lock memory for
1ee0: 20 74 68 65 20 66 69 6c 65 20 20 2a 2f 0a 23 65   the file  */.#e
1ef0: 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
1f00: 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
1f10: 20 20 69 6e 74 20 6e 46 65 74 63 68 4f 75 74 3b    int nFetchOut;
1f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f30: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 75 74  /* Number of out
1f40: 73 74 61 6e 64 69 6e 67 20 78 46 65 74 63 68 20  standing xFetch 
1f50: 72 65 66 65 72 65 6e 63 65 73 20 2a 2f 0a 20 20  references */.  
1f60: 48 41 4e 44 4c 45 20 68 4d 61 70 3b 20 20 20 20  HANDLE hMap;    
1f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f80: 20 48 61 6e 64 6c 65 20 66 6f 72 20 61 63 63 65   Handle for acce
1f90: 73 73 69 6e 67 20 6d 65 6d 6f 72 79 20 6d 61 70  ssing memory map
1fa0: 70 69 6e 67 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  ping */.  void *
1fb0: 70 4d 61 70 52 65 67 69 6f 6e 3b 20 20 20 20 20  pMapRegion;     
1fc0: 20 20 20 20 20 20 20 20 2f 2a 20 41 72 65 61 20          /* Area 
1fd0: 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64 20 2a 2f  memory mapped */
1fe0: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
1ff0: 20 6d 6d 61 70 53 69 7a 65 3b 20 20 20 20 20 20   mmapSize;      
2000: 20 2f 2a 20 55 73 61 62 6c 65 20 73 69 7a 65 20   /* Usable size 
2010: 6f 66 20 6d 61 70 70 65 64 20 72 65 67 69 6f 6e  of mapped region
2020: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
2030: 74 36 34 20 6d 6d 61 70 53 69 7a 65 41 63 74 75  t64 mmapSizeActu
2040: 61 6c 3b 20 2f 2a 20 41 63 74 75 61 6c 20 73 69  al; /* Actual si
2050: 7a 65 20 6f 66 20 6d 61 70 70 65 64 20 72 65 67  ze of mapped reg
2060: 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ion */.  sqlite3
2070: 5f 69 6e 74 36 34 20 6d 6d 61 70 53 69 7a 65 4d  _int64 mmapSizeM
2080: 61 78 3b 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67  ax;    /* Config
2090: 75 72 65 64 20 46 43 4e 54 4c 5f 4d 4d 41 50 5f  ured FCNTL_MMAP_
20a0: 53 49 5a 45 20 76 61 6c 75 65 20 2a 2f 0a 23 65  SIZE value */.#e
20b0: 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  ndif.};../*.** A
20c0: 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 20 66 6f  llowed values fo
20d0: 72 20 77 69 6e 46 69 6c 65 2e 63 74 72 6c 46 6c  r winFile.ctrlFl
20e0: 61 67 73 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 57  ags.*/.#define W
20f0: 49 4e 46 49 4c 45 5f 52 44 4f 4e 4c 59 20 20 20  INFILE_RDONLY   
2100: 20 20 20 20 20 20 20 30 78 30 32 20 20 20 2f 2a         0x02   /*
2110: 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 72   Connection is r
2120: 65 61 64 20 6f 6e 6c 79 20 2a 2f 0a 23 64 65 66  ead only */.#def
2130: 69 6e 65 20 57 49 4e 46 49 4c 45 5f 50 45 52 53  ine WINFILE_PERS
2140: 49 53 54 5f 57 41 4c 20 20 20 20 20 30 78 30 34  IST_WAL     0x04
2150: 20 20 20 2f 2a 20 50 65 72 73 69 73 74 65 6e 74     /* Persistent
2160: 20 57 41 4c 20 6d 6f 64 65 20 2a 2f 0a 23 64 65   WAL mode */.#de
2170: 66 69 6e 65 20 57 49 4e 46 49 4c 45 5f 50 53 4f  fine WINFILE_PSO
2180: 57 20 20 20 20 20 20 20 20 20 20 20 20 30 78 31  W            0x1
2190: 30 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4f  0   /* SQLITE_IO
21a0: 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56  CAP_POWERSAFE_OV
21b0: 45 52 57 52 49 54 45 20 2a 2f 0a 0a 2f 2a 0a 20  ERWRITE */../*. 
21c0: 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68  * The size of th
21d0: 65 20 62 75 66 66 65 72 20 75 73 65 64 20 62 79  e buffer used by
21e0: 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 77   sqlite3_win32_w
21f0: 72 69 74 65 5f 64 65 62 75 67 28 29 2e 0a 20 2a  rite_debug().. *
2200: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
2210: 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53  _WIN32_DBG_BUF_S
2220: 49 5a 45 0a 23 20 20 64 65 66 69 6e 65 20 53 51  IZE.#  define SQ
2230: 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42  LITE_WIN32_DBG_B
2240: 55 46 5f 53 49 5a 45 20 20 20 28 28 69 6e 74 29  UF_SIZE   ((int)
2250: 28 34 30 39 36 2d 73 69 7a 65 6f 66 28 44 57 4f  (4096-sizeof(DWO
2260: 52 44 29 29 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  RD))).#endif../*
2270: 0a 20 2a 20 54 68 65 20 76 61 6c 75 65 20 75 73  . * The value us
2280: 65 64 20 77 69 74 68 20 73 71 6c 69 74 65 33 5f  ed with sqlite3_
2290: 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74  win32_set_direct
22a0: 6f 72 79 28 29 20 74 6f 20 73 70 65 63 69 66 79  ory() to specify
22b0: 20 74 68 61 74 0a 20 2a 20 74 68 65 20 64 61 74   that. * the dat
22c0: 61 20 64 69 72 65 63 74 6f 72 79 20 73 68 6f 75  a directory shou
22d0: 6c 64 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 20  ld be changed.. 
22e0: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
22f0: 45 5f 57 49 4e 33 32 5f 44 41 54 41 5f 44 49 52  E_WIN32_DATA_DIR
2300: 45 43 54 4f 52 59 5f 54 59 50 45 0a 23 20 20 64  ECTORY_TYPE.#  d
2310: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e  efine SQLITE_WIN
2320: 33 32 5f 44 41 54 41 5f 44 49 52 45 43 54 4f 52  32_DATA_DIRECTOR
2330: 59 5f 54 59 50 45 20 28 31 29 0a 23 65 6e 64 69  Y_TYPE (1).#endi
2340: 66 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20 76 61 6c  f../*. * The val
2350: 75 65 20 75 73 65 64 20 77 69 74 68 20 73 71 6c  ue used with sql
2360: 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64  ite3_win32_set_d
2370: 69 72 65 63 74 6f 72 79 28 29 20 74 6f 20 73 70  irectory() to sp
2380: 65 63 69 66 79 20 74 68 61 74 0a 20 2a 20 74 68  ecify that. * th
2390: 65 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65  e temporary dire
23a0: 63 74 6f 72 79 20 73 68 6f 75 6c 64 20 62 65 20  ctory should be 
23b0: 63 68 61 6e 67 65 64 2e 0a 20 2a 2f 0a 23 69 66  changed.. */.#if
23c0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  ndef SQLITE_WIN3
23d0: 32 5f 54 45 4d 50 5f 44 49 52 45 43 54 4f 52 59  2_TEMP_DIRECTORY
23e0: 5f 54 59 50 45 0a 23 20 20 64 65 66 69 6e 65 20  _TYPE.#  define 
23f0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 54 45 4d  SQLITE_WIN32_TEM
2400: 50 5f 44 49 52 45 43 54 4f 52 59 5f 54 59 50 45  P_DIRECTORY_TYPE
2410: 20 28 32 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a   (2).#endif../*.
2420: 20 2a 20 49 66 20 63 6f 6d 70 69 6c 65 64 20 77   * If compiled w
2430: 69 74 68 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ith SQLITE_WIN32
2440: 5f 4d 41 4c 4c 4f 43 20 6f 6e 20 57 69 6e 64 6f  _MALLOC on Windo
2450: 77 73 2c 20 77 65 20 77 69 6c 6c 20 75 73 65 20  ws, we will use 
2460: 74 68 65 0a 20 2a 20 76 61 72 69 6f 75 73 20 57  the. * various W
2470: 69 6e 33 32 20 41 50 49 20 68 65 61 70 20 66 75  in32 API heap fu
2480: 6e 63 74 69 6f 6e 73 20 69 6e 73 74 65 61 64 20  nctions instead 
2490: 6f 66 20 6f 75 72 20 6f 77 6e 2e 0a 20 2a 2f 0a  of our own.. */.
24a0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49  #ifdef SQLITE_WI
24b0: 4e 33 32 5f 4d 41 4c 4c 4f 43 0a 0a 2f 2a 0a 20  N32_MALLOC../*. 
24c0: 2a 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 6e  * If this is non
24d0: 2d 7a 65 72 6f 2c 20 61 6e 20 69 73 6f 6c 61 74  -zero, an isolat
24e0: 65 64 20 68 65 61 70 20 77 69 6c 6c 20 62 65 20  ed heap will be 
24f0: 63 72 65 61 74 65 64 20 62 79 20 74 68 65 20 6e  created by the n
2500: 61 74 69 76 65 20 57 69 6e 33 32 0a 20 2a 20 61  ative Win32. * a
2510: 6c 6c 6f 63 61 74 6f 72 20 73 75 62 73 79 73 74  llocator subsyst
2520: 65 6d 3b 20 6f 74 68 65 72 77 69 73 65 2c 20 74  em; otherwise, t
2530: 68 65 20 64 65 66 61 75 6c 74 20 70 72 6f 63 65  he default proce
2540: 73 73 20 68 65 61 70 20 77 69 6c 6c 20 62 65 20  ss heap will be 
2550: 75 73 65 64 2e 20 20 54 68 69 73 0a 20 2a 20 73  used.  This. * s
2560: 65 74 74 69 6e 67 20 68 61 73 20 6e 6f 20 65 66  etting has no ef
2570: 66 65 63 74 20 77 68 65 6e 20 63 6f 6d 70 69 6c  fect when compil
2580: 69 6e 67 20 66 6f 72 20 57 69 6e 52 54 2e 20 20  ing for WinRT.  
2590: 42 79 20 64 65 66 61 75 6c 74 2c 20 74 68 69 73  By default, this
25a0: 20 69 73 20 65 6e 61 62 6c 65 64 0a 20 2a 20 61   is enabled. * a
25b0: 6e 64 20 61 6e 20 69 73 6f 6c 61 74 65 64 20 68  nd an isolated h
25c0: 65 61 70 20 77 69 6c 6c 20 62 65 20 63 72 65 61  eap will be crea
25d0: 74 65 64 20 74 6f 20 73 74 6f 72 65 20 61 6c 6c  ted to store all
25e0: 20 61 6c 6c 6f 63 61 74 65 64 20 64 61 74 61 2e   allocated data.
25f0: 0a 20 2a 0a 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  . *. ***********
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 0a 20 2a 20 57 41 52 4e 49 4e 47 3a 20  ***. * WARNING: 
2650: 49 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20  It is important 
2660: 74 6f 20 6e 6f 74 65 20 74 68 61 74 20 77 68 65  to note that whe
2670: 6e 20 74 68 69 73 20 73 65 74 74 69 6e 67 20 69  n this setting i
2680: 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64 20 74  s non-zero and t
2690: 68 65 0a 20 2a 20 20 20 20 20 20 20 20 20 20 77  he. *          w
26a0: 69 6e 4d 65 6d 53 68 75 74 64 6f 77 6e 20 66 75  inMemShutdown fu
26b0: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
26c0: 20 28 65 2e 67 2e 20 62 79 20 74 68 65 20 73 71   (e.g. by the sq
26d0: 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 0a 20  lite3_shutdown. 
26e0: 2a 20 20 20 20 20 20 20 20 20 20 66 75 6e 63 74  *          funct
26f0: 69 6f 6e 29 2c 20 61 6c 6c 20 64 61 74 61 20 74  ion), all data t
2700: 68 61 74 20 77 61 73 20 61 6c 6c 6f 63 61 74 65  hat was allocate
2710: 64 20 75 73 69 6e 67 20 74 68 65 20 69 73 6f 6c  d using the isol
2720: 61 74 65 64 20 68 65 61 70 20 77 69 6c 6c 0a 20  ated heap will. 
2730: 2a 20 20 20 20 20 20 20 20 20 20 62 65 20 66 72  *          be fr
2740: 65 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  eed immediately 
2750: 61 6e 64 20 61 6e 79 20 61 74 74 65 6d 70 74 20  and any attempt 
2760: 74 6f 20 61 63 63 65 73 73 20 61 6e 79 20 6f 66  to access any of
2770: 20 74 68 61 74 20 66 72 65 65 64 0a 20 2a 20 20   that freed. *  
2780: 20 20 20 20 20 20 20 20 64 61 74 61 20 77 69 6c          data wil
2790: 6c 20 61 6c 6d 6f 73 74 20 63 65 72 74 61 69 6e  l almost certain
27a0: 6c 79 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20  ly result in an 
27b0: 69 6d 6d 65 64 69 61 74 65 20 61 63 63 65 73 73  immediate access
27c0: 20 76 69 6f 6c 61 74 69 6f 6e 2e 0a 20 2a 2a 2a   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 0a 20 2a 2f 0a  ***********. */.
2820: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57  #ifndef SQLITE_W
2830: 49 4e 33 32 5f 48 45 41 50 5f 43 52 45 41 54 45  IN32_HEAP_CREATE
2840: 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54  .#  define SQLIT
2850: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 43 52 45  E_WIN32_HEAP_CRE
2860: 41 54 45 20 20 20 20 28 54 52 55 45 29 0a 23 65  ATE    (TRUE).#e
2870: 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20  ndif../*. * The 
2880: 69 6e 69 74 69 61 6c 20 73 69 7a 65 20 6f 66 20  initial size of 
2890: 74 68 65 20 57 69 6e 33 32 2d 73 70 65 63 69 66  the Win32-specif
28a0: 69 63 20 68 65 61 70 2e 20 20 54 68 69 73 20 76  ic heap.  This v
28b0: 61 6c 75 65 20 6d 61 79 20 62 65 20 7a 65 72 6f  alue may be zero
28c0: 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  .. */.#ifndef SQ
28d0: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
28e0: 49 4e 49 54 5f 53 49 5a 45 0a 23 20 20 64 65 66  INIT_SIZE.#  def
28f0: 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ine SQLITE_WIN32
2900: 5f 48 45 41 50 5f 49 4e 49 54 5f 53 49 5a 45 20  _HEAP_INIT_SIZE 
2910: 28 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  ((SQLITE_DEFAULT
2920: 5f 43 41 43 48 45 5f 53 49 5a 45 29 20 2a 20 5c  _CACHE_SIZE) * \
2930: 0a 20 20 20 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 28 53 51 4c 49 54 45 5f          (SQLITE_
2960: 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
2970: 45 29 20 2b 20 34 31 39 34 33 30 34 29 0a 23 65  E) + 4194304).#e
2980: 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20  ndif../*. * The 
2990: 6d 61 78 69 6d 75 6d 20 73 69 7a 65 20 6f 66 20  maximum size of 
29a0: 74 68 65 20 57 69 6e 33 32 2d 73 70 65 63 69 66  the Win32-specif
29b0: 69 63 20 68 65 61 70 2e 20 20 54 68 69 73 20 76  ic heap.  This v
29c0: 61 6c 75 65 20 6d 61 79 20 62 65 20 7a 65 72 6f  alue may be zero
29d0: 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  .. */.#ifndef SQ
29e0: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
29f0: 4d 41 58 5f 53 49 5a 45 0a 23 20 20 64 65 66 69  MAX_SIZE.#  defi
2a00: 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ne SQLITE_WIN32_
2a10: 48 45 41 50 5f 4d 41 58 5f 53 49 5a 45 20 20 28  HEAP_MAX_SIZE  (
2a20: 30 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a  0).#endif../*. *
2a30: 20 54 68 65 20 65 78 74 72 61 20 66 6c 61 67 73   The extra flags
2a40: 20 74 6f 20 75 73 65 20 69 6e 20 63 61 6c 6c 73   to use in calls
2a50: 20 74 6f 20 74 68 65 20 57 69 6e 33 32 20 68 65   to the Win32 he
2a60: 61 70 20 41 50 49 73 2e 20 20 54 68 69 73 20 76  ap APIs.  This v
2a70: 61 6c 75 65 20 6d 61 79 20 62 65 0a 20 2a 20 7a  alue may be. * z
2a80: 65 72 6f 20 66 6f 72 20 74 68 65 20 64 65 66 61  ero for the defa
2a90: 75 6c 74 20 62 65 68 61 76 69 6f 72 2e 0a 20 2a  ult behavior.. *
2aa0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
2ab0: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47  _WIN32_HEAP_FLAG
2ac0: 53 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49  S.#  define SQLI
2ad0: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c  TE_WIN32_HEAP_FL
2ae0: 41 47 53 20 20 20 20 20 28 30 29 0a 23 65 6e 64  AGS     (0).#end
2af0: 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 77  if.../*.** The w
2b00: 69 6e 4d 65 6d 44 61 74 61 20 73 74 72 75 63 74  inMemData struct
2b10: 75 72 65 20 73 74 6f 72 65 73 20 69 6e 66 6f 72  ure stores infor
2b20: 6d 61 74 69 6f 6e 20 72 65 71 75 69 72 65 64 20  mation required 
2b30: 62 79 20 74 68 65 20 57 69 6e 33 32 2d 73 70 65  by the Win32-spe
2b40: 63 69 66 69 63 0a 2a 2a 20 73 71 6c 69 74 65 33  cific.** sqlite3
2b50: 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 69 6d 70  _mem_methods imp
2b60: 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2f 0a  lementation..*/.
2b70: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 77  typedef struct w
2b80: 69 6e 4d 65 6d 44 61 74 61 20 77 69 6e 4d 65 6d  inMemData winMem
2b90: 44 61 74 61 3b 0a 73 74 72 75 63 74 20 77 69 6e  Data;.struct win
2ba0: 4d 65 6d 44 61 74 61 20 7b 0a 23 69 66 6e 64 65  MemData {.#ifnde
2bb0: 66 20 4e 44 45 42 55 47 0a 20 20 75 33 32 20 6d  f NDEBUG.  u32 m
2bc0: 61 67 69 63 31 3b 20 20 20 2f 2a 20 4d 61 67 69  agic1;   /* Magi
2bd0: 63 20 6e 75 6d 62 65 72 20 74 6f 20 64 65 74 65  c number to dete
2be0: 63 74 20 73 74 72 75 63 74 75 72 65 20 63 6f 72  ct structure cor
2bf0: 72 75 70 74 69 6f 6e 2e 20 2a 2f 0a 23 65 6e 64  ruption. */.#end
2c00: 69 66 0a 20 20 48 41 4e 44 4c 45 20 68 48 65 61  if.  HANDLE hHea
2c10: 70 3b 20 2f 2a 20 54 68 65 20 68 61 6e 64 6c 65  p; /* The handle
2c20: 20 74 6f 20 6f 75 72 20 68 65 61 70 2e 20 2a 2f   to our heap. */
2c30: 0a 20 20 42 4f 4f 4c 20 62 4f 77 6e 65 64 3b 20  .  BOOL bOwned; 
2c40: 20 2f 2a 20 44 6f 20 77 65 20 6f 77 6e 20 74 68   /* Do we own th
2c50: 65 20 68 65 61 70 20 28 69 2e 65 2e 20 64 65 73  e heap (i.e. des
2c60: 74 72 6f 79 20 69 74 20 6f 6e 20 73 68 75 74 64  troy it on shutd
2c70: 6f 77 6e 29 3f 20 2a 2f 0a 23 69 66 6e 64 65 66  own)? */.#ifndef
2c80: 20 4e 44 45 42 55 47 0a 20 20 75 33 32 20 6d 61   NDEBUG.  u32 ma
2c90: 67 69 63 32 3b 20 20 20 2f 2a 20 4d 61 67 69 63  gic2;   /* Magic
2ca0: 20 6e 75 6d 62 65 72 20 74 6f 20 64 65 74 65 63   number to detec
2cb0: 74 20 73 74 72 75 63 74 75 72 65 20 63 6f 72 72  t structure corr
2cc0: 75 70 74 69 6f 6e 2e 20 2a 2f 0a 23 65 6e 64 69  uption. */.#endi
2cd0: 66 0a 7d 3b 0a 0a 23 69 66 6e 64 65 66 20 4e 44  f.};..#ifndef ND
2ce0: 45 42 55 47 0a 23 64 65 66 69 6e 65 20 57 49 4e  EBUG.#define WIN
2cf0: 4d 45 4d 5f 4d 41 47 49 43 31 20 20 20 20 20 30  MEM_MAGIC1     0
2d00: 78 34 32 62 32 38 33 30 62 0a 23 64 65 66 69 6e  x42b2830b.#defin
2d10: 65 20 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 32 20  e WINMEM_MAGIC2 
2d20: 20 20 20 20 30 78 62 64 34 64 37 63 66 34 0a 23      0xbd4d7cf4.#
2d30: 65 6e 64 69 66 0a 0a 73 74 61 74 69 63 20 73 74  endif..static st
2d40: 72 75 63 74 20 77 69 6e 4d 65 6d 44 61 74 61 20  ruct winMemData 
2d50: 77 69 6e 5f 6d 65 6d 5f 64 61 74 61 20 3d 20 7b  win_mem_data = {
2d60: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
2d70: 20 20 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 31 2c    WINMEM_MAGIC1,
2d80: 0a 23 65 6e 64 69 66 0a 20 20 4e 55 4c 4c 2c 20  .#endif.  NULL, 
2d90: 46 41 4c 53 45 0a 23 69 66 6e 64 65 66 20 4e 44  FALSE.#ifndef ND
2da0: 45 42 55 47 0a 20 20 2c 57 49 4e 4d 45 4d 5f 4d  EBUG.  ,WINMEM_M
2db0: 41 47 49 43 32 0a 23 65 6e 64 69 66 0a 7d 3b 0a  AGIC2.#endif.};.
2dc0: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
2dd0: 23 64 65 66 69 6e 65 20 77 69 6e 4d 65 6d 41 73  #define winMemAs
2de0: 73 65 72 74 4d 61 67 69 63 31 28 29 20 61 73 73  sertMagic1() ass
2df0: 65 72 74 28 20 77 69 6e 5f 6d 65 6d 5f 64 61 74  ert( win_mem_dat
2e00: 61 2e 6d 61 67 69 63 31 3d 3d 57 49 4e 4d 45 4d  a.magic1==WINMEM
2e10: 5f 4d 41 47 49 43 31 20 29 0a 23 64 65 66 69 6e  _MAGIC1 ).#defin
2e20: 65 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61  e winMemAssertMa
2e30: 67 69 63 32 28 29 20 61 73 73 65 72 74 28 20 77  gic2() assert( w
2e40: 69 6e 5f 6d 65 6d 5f 64 61 74 61 2e 6d 61 67 69  in_mem_data.magi
2e50: 63 32 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49 43  c2==WINMEM_MAGIC
2e60: 32 20 29 0a 23 64 65 66 69 6e 65 20 77 69 6e 4d  2 ).#define winM
2e70: 65 6d 41 73 73 65 72 74 4d 61 67 69 63 28 29 20  emAssertMagic() 
2e80: 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67   winMemAssertMag
2e90: 69 63 31 28 29 3b 20 77 69 6e 4d 65 6d 41 73 73  ic1(); winMemAss
2ea0: 65 72 74 4d 61 67 69 63 32 28 29 3b 0a 23 65 6c  ertMagic2();.#el
2eb0: 73 65 0a 23 64 65 66 69 6e 65 20 77 69 6e 4d 65  se.#define winMe
2ec0: 6d 41 73 73 65 72 74 4d 61 67 69 63 28 29 0a 23  mAssertMagic().#
2ed0: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 77  endif..#define w
2ee0: 69 6e 4d 65 6d 47 65 74 44 61 74 61 50 74 72 28  inMemGetDataPtr(
2ef0: 29 20 20 26 77 69 6e 5f 6d 65 6d 5f 64 61 74 61  )  &win_mem_data
2f00: 0a 23 64 65 66 69 6e 65 20 77 69 6e 4d 65 6d 47  .#define winMemG
2f10: 65 74 48 65 61 70 28 29 20 20 20 20 20 77 69 6e  etHeap()     win
2f20: 5f 6d 65 6d 5f 64 61 74 61 2e 68 48 65 61 70 0a  _mem_data.hHeap.
2f30: 23 64 65 66 69 6e 65 20 77 69 6e 4d 65 6d 47 65  #define winMemGe
2f40: 74 4f 77 6e 65 64 28 29 20 20 20 20 77 69 6e 5f  tOwned()    win_
2f50: 6d 65 6d 5f 64 61 74 61 2e 62 4f 77 6e 65 64 0a  mem_data.bOwned.
2f60: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 77 69  .static void *wi
2f70: 6e 4d 65 6d 4d 61 6c 6c 6f 63 28 69 6e 74 20 6e  nMemMalloc(int n
2f80: 42 79 74 65 73 29 3b 0a 73 74 61 74 69 63 20 76  Bytes);.static v
2f90: 6f 69 64 20 77 69 6e 4d 65 6d 46 72 65 65 28 76  oid winMemFree(v
2fa0: 6f 69 64 20 2a 70 50 72 69 6f 72 29 3b 0a 73 74  oid *pPrior);.st
2fb0: 61 74 69 63 20 76 6f 69 64 20 2a 77 69 6e 4d 65  atic void *winMe
2fc0: 6d 52 65 61 6c 6c 6f 63 28 76 6f 69 64 20 2a 70  mRealloc(void *p
2fd0: 50 72 69 6f 72 2c 20 69 6e 74 20 6e 42 79 74 65  Prior, int nByte
2fe0: 73 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77  s);.static int w
2ff0: 69 6e 4d 65 6d 53 69 7a 65 28 76 6f 69 64 20 2a  inMemSize(void *
3000: 70 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77  p);.static int w
3010: 69 6e 4d 65 6d 52 6f 75 6e 64 75 70 28 69 6e 74  inMemRoundup(int
3020: 20 6e 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20   n);.static int 
3030: 77 69 6e 4d 65 6d 49 6e 69 74 28 76 6f 69 64 20  winMemInit(void 
3040: 2a 70 41 70 70 44 61 74 61 29 3b 0a 73 74 61 74  *pAppData);.stat
3050: 69 63 20 76 6f 69 64 20 77 69 6e 4d 65 6d 53 68  ic void winMemSh
3060: 75 74 64 6f 77 6e 28 76 6f 69 64 20 2a 70 41 70  utdown(void *pAp
3070: 70 44 61 74 61 29 3b 0a 0a 63 6f 6e 73 74 20 73  pData);..const s
3080: 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f  qlite3_mem_metho
3090: 64 73 20 2a 73 71 6c 69 74 65 33 4d 65 6d 47 65  ds *sqlite3MemGe
30a0: 74 57 69 6e 33 32 28 76 6f 69 64 29 3b 0a 23 65  tWin32(void);.#e
30b0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 57  ndif /* SQLITE_W
30c0: 49 4e 33 32 5f 4d 41 4c 4c 4f 43 20 2a 2f 0a 0a  IN32_MALLOC */..
30d0: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
30e0: 69 6e 67 20 76 61 72 69 61 62 6c 65 20 69 73 20  ing variable is 
30f0: 28 6e 6f 72 6d 61 6c 6c 79 29 20 73 65 74 20 6f  (normally) set o
3100: 6e 63 65 20 61 6e 64 20 6e 65 76 65 72 20 63 68  nce and never ch
3110: 61 6e 67 65 73 0a 2a 2a 20 74 68 65 72 65 61 66  anges.** thereaf
3120: 74 65 72 2e 20 20 49 74 20 72 65 63 6f 72 64 73  ter.  It records
3130: 20 77 68 65 74 68 65 72 20 74 68 65 20 6f 70 65   whether the ope
3140: 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69 73  rating system is
3150: 20 57 69 6e 39 78 0a 2a 2a 20 6f 72 20 57 69 6e   Win9x.** or Win
3160: 4e 54 2e 0a 2a 2a 0a 2a 2a 20 30 3a 20 20 20 4f  NT..**.** 0:   O
3170: 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
3180: 75 6e 6b 6e 6f 77 6e 2e 0a 2a 2a 20 31 3a 20 20  unknown..** 1:  
3190: 20 4f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   Operating syste
31a0: 6d 20 69 73 20 57 69 6e 39 78 2e 0a 2a 2a 20 32  m is Win9x..** 2
31b0: 3a 20 20 20 4f 70 65 72 61 74 69 6e 67 20 73 79  :   Operating sy
31c0: 73 74 65 6d 20 69 73 20 57 69 6e 4e 54 2e 0a 2a  stem is WinNT..*
31d0: 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65 72 20 74 6f  *.** In order to
31e0: 20 66 61 63 69 6c 69 74 61 74 65 20 74 65 73 74   facilitate test
31f0: 69 6e 67 20 6f 6e 20 61 20 57 69 6e 4e 54 20 73  ing on a WinNT s
3200: 79 73 74 65 6d 2c 20 74 68 65 20 74 65 73 74 20  ystem, the test 
3210: 66 69 78 74 75 72 65 0a 2a 2a 20 63 61 6e 20 6d  fixture.** can m
3220: 61 6e 75 61 6c 6c 79 20 73 65 74 20 74 68 69 73  anually set this
3230: 20 76 61 6c 75 65 20 74 6f 20 31 20 74 6f 20 65   value to 1 to e
3240: 6d 75 6c 61 74 65 20 57 69 6e 39 38 20 62 65 68  mulate Win98 beh
3250: 61 76 69 6f 72 2e 0a 2a 2f 0a 23 69 66 64 65 66  avior..*/.#ifdef
3260: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 4c 4f 4e   SQLITE_TEST.LON
3270: 47 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 56  G SQLITE_WIN32_V
3280: 4f 4c 41 54 49 4c 45 20 73 71 6c 69 74 65 33 5f  OLATILE sqlite3_
3290: 6f 73 5f 74 79 70 65 20 3d 20 30 3b 0a 23 65 6c  os_type = 0;.#el
32a0: 73 65 0a 73 74 61 74 69 63 20 4c 4f 4e 47 20 53  se.static LONG S
32b0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 56 4f 4c 41  QLITE_WIN32_VOLA
32c0: 54 49 4c 45 20 73 71 6c 69 74 65 33 5f 6f 73 5f  TILE sqlite3_os_
32d0: 74 79 70 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66  type = 0;.#endif
32e0: 0a 0a 23 69 66 6e 64 65 66 20 53 59 53 43 41 4c  ..#ifndef SYSCAL
32f0: 4c 0a 23 20 20 64 65 66 69 6e 65 20 53 59 53 43  L.#  define SYSC
3300: 41 4c 4c 20 73 71 6c 69 74 65 33 5f 73 79 73 63  ALL sqlite3_sysc
3310: 61 6c 6c 5f 70 74 72 0a 23 65 6e 64 69 66 0a 0a  all_ptr.#endif..
3320: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
3330: 69 6f 6e 20 69 73 20 6e 6f 74 20 61 76 61 69 6c  ion is not avail
3340: 61 62 6c 65 20 6f 6e 20 57 69 6e 64 6f 77 73 20  able on Windows 
3350: 43 45 20 6f 72 20 57 69 6e 52 54 2e 0a 20 2a 2f  CE or WinRT.. */
3360: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
3370: 57 49 4e 43 45 20 7c 7c 20 53 51 4c 49 54 45 5f  WINCE || SQLITE_
3380: 4f 53 5f 57 49 4e 52 54 0a 23 20 20 64 65 66 69  OS_WINRT.#  defi
3390: 6e 65 20 6f 73 41 72 65 46 69 6c 65 41 70 69 73  ne osAreFileApis
33a0: 41 4e 53 49 28 29 20 20 20 20 20 20 20 31 0a 23  ANSI()       1.#
33b0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6e  endif../*.** Man
33c0: 79 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 61  y system calls a
33d0: 72 65 20 61 63 63 65 73 73 65 64 20 74 68 72 6f  re accessed thro
33e0: 75 67 68 20 70 6f 69 6e 74 65 72 2d 74 6f 2d 66  ugh pointer-to-f
33f0: 75 6e 63 74 69 6f 6e 73 20 73 6f 20 74 68 61 74  unctions so that
3400: 0a 2a 2a 20 74 68 65 79 20 6d 61 79 20 62 65 20  .** they may be 
3410: 6f 76 65 72 72 69 64 64 65 6e 20 61 74 20 72 75  overridden at ru
3420: 6e 74 69 6d 65 20 74 6f 20 66 61 63 69 6c 69 74  ntime to facilit
3430: 61 74 65 20 66 61 75 6c 74 20 69 6e 6a 65 63 74  ate fault inject
3440: 69 6f 6e 20 64 75 72 69 6e 67 0a 2a 2a 20 74 65  ion during.** te
3450: 73 74 69 6e 67 20 61 6e 64 20 73 61 6e 64 62 6f  sting and sandbo
3460: 78 69 6e 67 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  xing.  The follo
3470: 77 69 6e 67 20 61 72 72 61 79 20 68 6f 6c 64 73  wing array holds
3480: 20 74 68 65 20 6e 61 6d 65 73 20 61 6e 64 20 70   the names and p
3490: 6f 69 6e 74 65 72 73 0a 2a 2a 20 74 6f 20 61 6c  ointers.** to al
34a0: 6c 20 6f 76 65 72 72 69 64 65 61 62 6c 65 20 73  l overrideable s
34b0: 79 73 74 65 6d 20 63 61 6c 6c 73 2e 0a 2a 2f 0a  ystem calls..*/.
34c0: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 77 69  static struct wi
34d0: 6e 5f 73 79 73 63 61 6c 6c 20 7b 0a 20 20 63 6f  n_syscall {.  co
34e0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  nst char *zName;
34f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
3500: 61 6d 65 20 6f 66 20 74 68 65 20 73 79 73 74 65  ame of the syste
3510: 6d 20 63 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69  m call */.  sqli
3520: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20  te3_syscall_ptr 
3530: 70 43 75 72 72 65 6e 74 3b 20 2f 2a 20 43 75 72  pCurrent; /* Cur
3540: 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 74 68  rent value of th
3550: 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 2a 2f  e system call */
3560: 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61  .  sqlite3_sysca
3570: 6c 6c 5f 70 74 72 20 70 44 65 66 61 75 6c 74 3b  ll_ptr pDefault;
3580: 20 2f 2a 20 44 65 66 61 75 6c 74 20 76 61 6c 75   /* Default valu
3590: 65 20 2a 2f 0a 7d 20 61 53 79 73 63 61 6c 6c 5b  e */.} aSyscall[
35a0: 5d 20 3d 20 7b 0a 23 69 66 20 21 53 51 4c 49 54  ] = {.#if !SQLIT
35b0: 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53  E_OS_WINCE && !S
35c0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
35d0: 20 7b 20 22 41 72 65 46 69 6c 65 41 70 69 73 41   { "AreFileApisA
35e0: 4e 53 49 22 2c 20 20 20 20 20 20 20 20 20 28 53  NSI",         (S
35f0: 59 53 43 41 4c 4c 29 41 72 65 46 69 6c 65 41 70  YSCALL)AreFileAp
3600: 69 73 41 4e 53 49 2c 20 20 20 20 20 20 20 20 20  isANSI,         
3610: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
3620: 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49 22  AreFileApisANSI"
3630: 2c 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41  ,         (SYSCA
3640: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
3650: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
3660: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
3670: 20 6f 73 41 72 65 46 69 6c 65 41 70 69 73 41 4e   osAreFileApisAN
3680: 53 49 0a 23 64 65 66 69 6e 65 20 6f 73 41 72 65  SI.#define osAre
3690: 46 69 6c 65 41 70 69 73 41 4e 53 49 20 28 28 42  FileApisANSI ((B
36a0: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 56 4f 49  OOL(WINAPI*)(VOI
36b0: 44 29 29 61 53 79 73 63 61 6c 6c 5b 30 5d 2e 70  D))aSyscall[0].p
36c0: 43 75 72 72 65 6e 74 29 0a 23 65 6e 64 69 66 0a  Current).#endif.
36d0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
36e0: 49 4e 43 45 20 26 26 20 64 65 66 69 6e 65 64 28  INCE && defined(
36f0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
3700: 5f 57 49 44 45 29 0a 20 20 7b 20 22 43 68 61 72  _WIDE).  { "Char
3710: 4c 6f 77 65 72 57 22 2c 20 20 20 20 20 20 20 20  LowerW",        
3720: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43        (SYSCALL)C
3730: 68 61 72 4c 6f 77 65 72 57 2c 20 20 20 20 20 20  harLowerW,      
3740: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
3750: 73 65 0a 20 20 7b 20 22 43 68 61 72 4c 6f 77 65  se.  { "CharLowe
3760: 72 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  rW",            
3770: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
3780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3790: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
37a0: 0a 23 64 65 66 69 6e 65 20 6f 73 43 68 61 72 4c  .#define osCharL
37b0: 6f 77 65 72 57 20 28 28 4c 50 57 53 54 52 28 57  owerW ((LPWSTR(W
37c0: 49 4e 41 50 49 2a 29 28 4c 50 57 53 54 52 29 29  INAPI*)(LPWSTR))
37d0: 61 53 79 73 63 61 6c 6c 5b 31 5d 2e 70 43 75 72  aSyscall[1].pCur
37e0: 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54  rent)..#if SQLIT
37f0: 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 64 65  E_OS_WINCE && de
3800: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
3810: 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b  32_HAS_WIDE).  {
3820: 20 22 43 68 61 72 55 70 70 65 72 57 22 2c 20 20   "CharUpperW",  
3830: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
3840: 43 41 4c 4c 29 43 68 61 72 55 70 70 65 72 57 2c  CALL)CharUpperW,
3850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
3860: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 68  },.#else.  { "Ch
3870: 61 72 55 70 70 65 72 57 22 2c 20 20 20 20 20 20  arUpperW",      
3880: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
3890: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
38a0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
38b0: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
38c0: 73 43 68 61 72 55 70 70 65 72 57 20 28 28 4c 50  sCharUpperW ((LP
38d0: 57 53 54 52 28 57 49 4e 41 50 49 2a 29 28 4c 50  WSTR(WINAPI*)(LP
38e0: 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 32  WSTR))aSyscall[2
38f0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
3900: 20 22 43 6c 6f 73 65 48 61 6e 64 6c 65 22 2c 20   "CloseHandle", 
3910: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
3920: 43 41 4c 4c 29 43 6c 6f 73 65 48 61 6e 64 6c 65  CALL)CloseHandle
3930: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20  ,             0 
3940: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 6c  },..#define osCl
3950: 6f 73 65 48 61 6e 64 6c 65 20 28 28 42 4f 4f 4c  oseHandle ((BOOL
3960: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
3970: 29 29 61 53 79 73 63 61 6c 6c 5b 33 5d 2e 70 43  ))aSyscall[3].pC
3980: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66  urrent)..#if def
3990: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
39a0: 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20  2_HAS_ANSI).  { 
39b0: 22 43 72 65 61 74 65 46 69 6c 65 41 22 2c 20 20  "CreateFileA",  
39c0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
39d0: 41 4c 4c 29 43 72 65 61 74 65 46 69 6c 65 41 2c  ALL)CreateFileA,
39e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
39f0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65  ,.#else.  { "Cre
3a00: 61 74 65 46 69 6c 65 41 22 2c 20 20 20 20 20 20  ateFileA",      
3a10: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
3a20: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
3a30: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
3a40: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
3a50: 43 72 65 61 74 65 46 69 6c 65 41 20 28 28 48 41  CreateFileA ((HA
3a60: 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50  NDLE(WINAPI*)(LP
3a70: 43 53 54 52 2c 44 57 4f 52 44 2c 44 57 4f 52 44  CSTR,DWORD,DWORD
3a80: 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 53 45  , \.        LPSE
3a90: 43 55 52 49 54 59 5f 41 54 54 52 49 42 55 54 45  CURITY_ATTRIBUTE
3aa0: 53 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 48 41  S,DWORD,DWORD,HA
3ab0: 4e 44 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 34  NDLE))aSyscall[4
3ac0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
3ad0: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
3ae0: 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  T && defined(SQL
3af0: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
3b00: 44 45 29 0a 20 20 7b 20 22 43 72 65 61 74 65 46  DE).  { "CreateF
3b10: 69 6c 65 57 22 2c 20 20 20 20 20 20 20 20 20 20  ileW",          
3b20: 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72 65 61     (SYSCALL)Crea
3b30: 74 65 46 69 6c 65 57 2c 20 20 20 20 20 20 20 20  teFileW,        
3b40: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
3b50: 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65 57    { "CreateFileW
3b60: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ",             (
3b70: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
3b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b90: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
3ba0: 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65 46 69  efine osCreateFi
3bb0: 6c 65 57 20 28 28 48 41 4e 44 4c 45 28 57 49 4e  leW ((HANDLE(WIN
3bc0: 41 50 49 2a 29 28 4c 50 43 57 53 54 52 2c 44 57  API*)(LPCWSTR,DW
3bd0: 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20  ORD,DWORD, \.   
3be0: 20 20 20 20 20 4c 50 53 45 43 55 52 49 54 59 5f       LPSECURITY_
3bf0: 41 54 54 52 49 42 55 54 45 53 2c 44 57 4f 52 44  ATTRIBUTES,DWORD
3c00: 2c 44 57 4f 52 44 2c 48 41 4e 44 4c 45 29 29 61  ,DWORD,HANDLE))a
3c10: 53 79 73 63 61 6c 6c 5b 35 5d 2e 70 43 75 72 72  Syscall[5].pCurr
3c20: 65 6e 74 29 0a 0a 23 69 66 20 28 21 53 51 4c 49  ent)..#if (!SQLI
3c30: 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64  TE_OS_WINRT && d
3c40: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
3c50: 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 20 26 26  N32_HAS_ANSI) &&
3c60: 20 5c 0a 20 20 20 20 20 20 20 20 21 64 65 66 69   \.        !defi
3c70: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
3c80: 57 41 4c 29 29 0a 20 20 7b 20 22 43 72 65 61 74  WAL)).  { "Creat
3c90: 65 46 69 6c 65 4d 61 70 70 69 6e 67 41 22 2c 20  eFileMappingA", 
3ca0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72       (SYSCALL)Cr
3cb0: 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 41  eateFileMappingA
3cc0: 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73  ,      0 },.#els
3cd0: 65 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c  e.  { "CreateFil
3ce0: 65 4d 61 70 70 69 6e 67 41 22 2c 20 20 20 20 20  eMappingA",     
3cf0: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
3d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d10: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
3d20: 23 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65  #define osCreate
3d30: 46 69 6c 65 4d 61 70 70 69 6e 67 41 20 28 28 48  FileMappingA ((H
3d40: 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 48  ANDLE(WINAPI*)(H
3d50: 41 4e 44 4c 45 2c 4c 50 53 45 43 55 52 49 54 59  ANDLE,LPSECURITY
3d60: 5f 41 54 54 52 49 42 55 54 45 53 2c 20 5c 0a 20  _ATTRIBUTES, \. 
3d70: 20 20 20 20 20 20 20 44 57 4f 52 44 2c 44 57 4f         DWORD,DWO
3d80: 52 44 2c 44 57 4f 52 44 2c 4c 50 43 53 54 52 29  RD,DWORD,LPCSTR)
3d90: 29 61 53 79 73 63 61 6c 6c 5b 36 5d 2e 70 43 75  )aSyscall[6].pCu
3da0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49  rrent)..#if SQLI
3db0: 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 28  TE_OS_WINCE || (
3dc0: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
3dd0: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
3de0: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
3df0: 45 29 20 26 26 20 5c 0a 20 20 20 20 20 20 20 20  E) && \.        
3e00: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
3e10: 4f 4d 49 54 5f 57 41 4c 29 29 0a 20 20 7b 20 22  OMIT_WAL)).  { "
3e20: 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e  CreateFileMappin
3e30: 67 57 22 2c 20 20 20 20 20 20 28 53 59 53 43 41  gW",      (SYSCA
3e40: 4c 4c 29 43 72 65 61 74 65 46 69 6c 65 4d 61 70  LL)CreateFileMap
3e50: 70 69 6e 67 57 2c 20 20 20 20 20 20 30 20 7d 2c  pingW,      0 },
3e60: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65 61  .#else.  { "Crea
3e70: 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 22 2c  teFileMappingW",
3e80: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
3e90: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3ea0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
3eb0: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43  dif..#define osC
3ec0: 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67  reateFileMapping
3ed0: 57 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50  W ((HANDLE(WINAP
3ee0: 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 50 53 45 43  I*)(HANDLE,LPSEC
3ef0: 55 52 49 54 59 5f 41 54 54 52 49 42 55 54 45 53  URITY_ATTRIBUTES
3f00: 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52  , \.        DWOR
3f10: 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 4c 50  D,DWORD,DWORD,LP
3f20: 43 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b  CWSTR))aSyscall[
3f30: 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  7].pCurrent)..#i
3f40: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
3f50: 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  RT && defined(SQ
3f60: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57  LITE_WIN32_HAS_W
3f70: 49 44 45 29 0a 20 20 7b 20 22 43 72 65 61 74 65  IDE).  { "Create
3f80: 4d 75 74 65 78 57 22 2c 20 20 20 20 20 20 20 20  MutexW",        
3f90: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72 65      (SYSCALL)Cre
3fa0: 61 74 65 4d 75 74 65 78 57 2c 20 20 20 20 20 20  ateMutexW,      
3fb0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
3fc0: 0a 20 20 7b 20 22 43 72 65 61 74 65 4d 75 74 65  .  { "CreateMute
3fd0: 78 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  xW",            
3fe0: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
3ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4000: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
4010: 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65 4d  define osCreateM
4020: 75 74 65 78 57 20 28 28 48 41 4e 44 4c 45 28 57  utexW ((HANDLE(W
4030: 49 4e 41 50 49 2a 29 28 4c 50 53 45 43 55 52 49  INAPI*)(LPSECURI
4040: 54 59 5f 41 54 54 52 49 42 55 54 45 53 2c 42 4f  TY_ATTRIBUTES,BO
4050: 4f 4c 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  OL, \.        LP
4060: 43 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b  CWSTR))aSyscall[
4070: 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  8].pCurrent)..#i
4080: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
4090: 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29  _WIN32_HAS_ANSI)
40a0: 0a 20 20 7b 20 22 44 65 6c 65 74 65 46 69 6c 65  .  { "DeleteFile
40b0: 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  A",             
40c0: 28 53 59 53 43 41 4c 4c 29 44 65 6c 65 74 65 46  (SYSCALL)DeleteF
40d0: 69 6c 65 41 2c 20 20 20 20 20 20 20 20 20 20 20  ileA,           
40e0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
40f0: 20 22 44 65 6c 65 74 65 46 69 6c 65 41 22 2c 20   "DeleteFileA", 
4100: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
4110: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
4120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
4130: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
4140: 6e 65 20 6f 73 44 65 6c 65 74 65 46 69 6c 65 41  ne osDeleteFileA
4150: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
4160: 28 4c 50 43 53 54 52 29 29 61 53 79 73 63 61 6c  (LPCSTR))aSyscal
4170: 6c 5b 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  l[9].pCurrent)..
4180: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
4190: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
41a0: 45 29 0a 20 20 7b 20 22 44 65 6c 65 74 65 46 69  E).  { "DeleteFi
41b0: 6c 65 57 22 2c 20 20 20 20 20 20 20 20 20 20 20  leW",           
41c0: 20 20 28 53 59 53 43 41 4c 4c 29 44 65 6c 65 74    (SYSCALL)Delet
41d0: 65 46 69 6c 65 57 2c 20 20 20 20 20 20 20 20 20  eFileW,         
41e0: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
41f0: 20 7b 20 22 44 65 6c 65 74 65 46 69 6c 65 57 22   { "DeleteFileW"
4200: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ,             (S
4210: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
4220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4230: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
4240: 66 69 6e 65 20 6f 73 44 65 6c 65 74 65 46 69 6c  fine osDeleteFil
4250: 65 57 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  eW ((BOOL(WINAPI
4260: 2a 29 28 4c 50 43 57 53 54 52 29 29 61 53 79 73  *)(LPCWSTR))aSys
4270: 63 61 6c 6c 5b 31 30 5d 2e 70 43 75 72 72 65 6e  call[10].pCurren
4280: 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  t)..#if SQLITE_O
4290: 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 46 69 6c  S_WINCE.  { "Fil
42a0: 65 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65  eTimeToLocalFile
42b0: 54 69 6d 65 22 2c 20 28 53 59 53 43 41 4c 4c 29  Time", (SYSCALL)
42c0: 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63 61 6c 46  FileTimeToLocalF
42d0: 69 6c 65 54 69 6d 65 2c 20 30 20 7d 2c 0a 23 65  ileTime, 0 },.#e
42e0: 6c 73 65 0a 20 20 7b 20 22 46 69 6c 65 54 69 6d  lse.  { "FileTim
42f0: 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65  eToLocalFileTime
4300: 22 2c 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20  ", (SYSCALL)0,  
4310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4320: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
4330: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46 69 6c 65  ..#define osFile
4340: 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54  TimeToLocalFileT
4350: 69 6d 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  ime ((BOOL(WINAP
4360: 49 2a 29 28 43 4f 4e 53 54 20 46 49 4c 45 54 49  I*)(CONST FILETI
4370: 4d 45 2a 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c  ME*, \.        L
4380: 50 46 49 4c 45 54 49 4d 45 29 29 61 53 79 73 63  PFILETIME))aSysc
4390: 61 6c 6c 5b 31 31 5d 2e 70 43 75 72 72 65 6e 74  all[11].pCurrent
43a0: 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  )..#if SQLITE_OS
43b0: 5f 57 49 4e 43 45 0a 20 20 7b 20 22 46 69 6c 65  _WINCE.  { "File
43c0: 54 69 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d 65  TimeToSystemTime
43d0: 22 2c 20 20 20 20 28 53 59 53 43 41 4c 4c 29 46  ",    (SYSCALL)F
43e0: 69 6c 65 54 69 6d 65 54 6f 53 79 73 74 65 6d 54  ileTimeToSystemT
43f0: 69 6d 65 2c 20 20 20 20 30 20 7d 2c 0a 23 65 6c  ime,    0 },.#el
4400: 73 65 0a 20 20 7b 20 22 46 69 6c 65 54 69 6d 65  se.  { "FileTime
4410: 54 6f 53 79 73 74 65 6d 54 69 6d 65 22 2c 20 20  ToSystemTime",  
4420: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
4430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4440: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
4450: 0a 23 64 65 66 69 6e 65 20 6f 73 46 69 6c 65 54  .#define osFileT
4460: 69 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 20  imeToSystemTime 
4470: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
4480: 43 4f 4e 53 54 20 46 49 4c 45 54 49 4d 45 2a 2c  CONST FILETIME*,
4490: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 53 59 53   \.        LPSYS
44a0: 54 45 4d 54 49 4d 45 29 29 61 53 79 73 63 61 6c  TEMTIME))aSyscal
44b0: 6c 5b 31 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[12].pCurrent).
44c0: 0a 20 20 7b 20 22 46 6c 75 73 68 46 69 6c 65 42  .  { "FlushFileB
44d0: 75 66 66 65 72 73 22 2c 20 20 20 20 20 20 20 20  uffers",        
44e0: 28 53 59 53 43 41 4c 4c 29 46 6c 75 73 68 46 69  (SYSCALL)FlushFi
44f0: 6c 65 42 75 66 66 65 72 73 2c 20 20 20 20 20 20  leBuffers,      
4500: 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20    0 },..#define 
4510: 6f 73 46 6c 75 73 68 46 69 6c 65 42 75 66 66 65  osFlushFileBuffe
4520: 72 73 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  rs ((BOOL(WINAPI
4530: 2a 29 28 48 41 4e 44 4c 45 29 29 61 53 79 73 63  *)(HANDLE))aSysc
4540: 61 6c 6c 5b 31 33 5d 2e 70 43 75 72 72 65 6e 74  all[13].pCurrent
4550: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  )..#if defined(S
4560: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
4570: 41 4e 53 49 29 0a 20 20 7b 20 22 46 6f 72 6d 61  ANSI).  { "Forma
4580: 74 4d 65 73 73 61 67 65 41 22 2c 20 20 20 20 20  tMessageA",     
4590: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 46 6f       (SYSCALL)Fo
45a0: 72 6d 61 74 4d 65 73 73 61 67 65 41 2c 20 20 20  rmatMessageA,   
45b0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
45c0: 65 0a 20 20 7b 20 22 46 6f 72 6d 61 74 4d 65 73  e.  { "FormatMes
45d0: 73 61 67 65 41 22 2c 20 20 20 20 20 20 20 20 20  sageA",         
45e0: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
45f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4600: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
4610: 23 64 65 66 69 6e 65 20 6f 73 46 6f 72 6d 61 74  #define osFormat
4620: 4d 65 73 73 61 67 65 41 20 28 28 44 57 4f 52 44  MessageA ((DWORD
4630: 28 57 49 4e 41 50 49 2a 29 28 44 57 4f 52 44 2c  (WINAPI*)(DWORD,
4640: 4c 50 43 56 4f 49 44 2c 44 57 4f 52 44 2c 44 57  LPCVOID,DWORD,DW
4650: 4f 52 44 2c 4c 50 53 54 52 2c 20 5c 0a 20 20 20  ORD,LPSTR, \.   
4660: 20 20 20 20 20 44 57 4f 52 44 2c 76 61 5f 6c 69       DWORD,va_li
4670: 73 74 2a 29 29 61 53 79 73 63 61 6c 6c 5b 31 34  st*))aSyscall[14
4680: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
4690: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
46a0: 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a  WIN32_HAS_WIDE).
46b0: 20 20 7b 20 22 46 6f 72 6d 61 74 4d 65 73 73 61    { "FormatMessa
46c0: 67 65 57 22 2c 20 20 20 20 20 20 20 20 20 20 28  geW",          (
46d0: 53 59 53 43 41 4c 4c 29 46 6f 72 6d 61 74 4d 65  SYSCALL)FormatMe
46e0: 73 73 61 67 65 57 2c 20 20 20 20 20 20 20 20 20  ssageW,         
46f0: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
4700: 22 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 57 22  "FormatMessageW"
4710: 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43  ,          (SYSC
4720: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
4730: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
4740: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
4750: 65 20 6f 73 46 6f 72 6d 61 74 4d 65 73 73 61 67  e osFormatMessag
4760: 65 57 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50  eW ((DWORD(WINAP
4770: 49 2a 29 28 44 57 4f 52 44 2c 4c 50 43 56 4f 49  I*)(DWORD,LPCVOI
4780: 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 4c 50  D,DWORD,DWORD,LP
4790: 57 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20  WSTR, \.        
47a0: 44 57 4f 52 44 2c 76 61 5f 6c 69 73 74 2a 29 29  DWORD,va_list*))
47b0: 61 53 79 73 63 61 6c 6c 5b 31 35 5d 2e 70 43 75  aSyscall[15].pCu
47c0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 64 65 66  rrent)..#if !def
47d0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
47e0: 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 29  _LOAD_EXTENSION)
47f0: 0a 20 20 7b 20 22 46 72 65 65 4c 69 62 72 61 72  .  { "FreeLibrar
4800: 79 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  y",             
4810: 28 53 59 53 43 41 4c 4c 29 46 72 65 65 4c 69 62  (SYSCALL)FreeLib
4820: 72 61 72 79 2c 20 20 20 20 20 20 20 20 20 20 20  rary,           
4830: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
4840: 20 22 46 72 65 65 4c 69 62 72 61 72 79 22 2c 20   "FreeLibrary", 
4850: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
4860: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
4870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
4880: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
4890: 6e 65 20 6f 73 46 72 65 65 4c 69 62 72 61 72 79  ne osFreeLibrary
48a0: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
48b0: 28 48 4d 4f 44 55 4c 45 29 29 61 53 79 73 63 61  (HMODULE))aSysca
48c0: 6c 6c 5b 31 36 5d 2e 70 43 75 72 72 65 6e 74 29  ll[16].pCurrent)
48d0: 0a 0a 20 20 7b 20 22 47 65 74 43 75 72 72 65 6e  ..  { "GetCurren
48e0: 74 50 72 6f 63 65 73 73 49 64 22 2c 20 20 20 20  tProcessId",    
48f0: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 43 75 72   (SYSCALL)GetCur
4900: 72 65 6e 74 50 72 6f 63 65 73 73 49 64 2c 20 20  rentProcessId,  
4910: 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65     0 },..#define
4920: 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
4930: 63 65 73 73 49 64 20 28 28 44 57 4f 52 44 28 57  cessId ((DWORD(W
4940: 49 4e 41 50 49 2a 29 28 56 4f 49 44 29 29 61 53  INAPI*)(VOID))aS
4950: 79 73 63 61 6c 6c 5b 31 37 5d 2e 70 43 75 72 72  yscall[17].pCurr
4960: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
4970: 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 64 65  E_OS_WINCE && de
4980: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
4990: 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b  32_HAS_ANSI).  {
49a0: 20 22 47 65 74 44 69 73 6b 46 72 65 65 53 70 61   "GetDiskFreeSpa
49b0: 63 65 41 22 2c 20 20 20 20 20 20 20 28 53 59 53  ceA",       (SYS
49c0: 43 41 4c 4c 29 47 65 74 44 69 73 6b 46 72 65 65  CALL)GetDiskFree
49d0: 53 70 61 63 65 41 2c 20 20 20 20 20 20 20 30 20  SpaceA,       0 
49e0: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65  },.#else.  { "Ge
49f0: 74 44 69 73 6b 46 72 65 65 53 70 61 63 65 41 22  tDiskFreeSpaceA"
4a00: 2c 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c  ,       (SYSCALL
4a10: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
4a20: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
4a30: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
4a40: 73 47 65 74 44 69 73 6b 46 72 65 65 53 70 61 63  sGetDiskFreeSpac
4a50: 65 41 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  eA ((BOOL(WINAPI
4a60: 2a 29 28 4c 50 43 53 54 52 2c 4c 50 44 57 4f 52  *)(LPCSTR,LPDWOR
4a70: 44 2c 4c 50 44 57 4f 52 44 2c 4c 50 44 57 4f 52  D,LPDWORD,LPDWOR
4a80: 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 44  D, \.        LPD
4a90: 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 31  WORD))aSyscall[1
4aa0: 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  8].pCurrent)..#i
4ab0: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
4ac0: 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53  CE && !SQLITE_OS
4ad0: 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65  _WINRT && define
4ae0: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
4af0: 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 47 65  AS_WIDE).  { "Ge
4b00: 74 44 69 73 6b 46 72 65 65 53 70 61 63 65 57 22  tDiskFreeSpaceW"
4b10: 2c 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c  ,       (SYSCALL
4b20: 29 47 65 74 44 69 73 6b 46 72 65 65 53 70 61 63  )GetDiskFreeSpac
4b30: 65 57 2c 20 20 20 20 20 20 20 30 20 7d 2c 0a 23  eW,       0 },.#
4b40: 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 44 69 73  else.  { "GetDis
4b50: 6b 46 72 65 65 53 70 61 63 65 57 22 2c 20 20 20  kFreeSpaceW",   
4b60: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
4b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b80: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
4b90: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  f..#define osGet
4ba0: 44 69 73 6b 46 72 65 65 53 70 61 63 65 57 20 28  DiskFreeSpaceW (
4bb0: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c  (BOOL(WINAPI*)(L
4bc0: 50 43 57 53 54 52 2c 4c 50 44 57 4f 52 44 2c 4c  PCWSTR,LPDWORD,L
4bd0: 50 44 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 20  PDWORD,LPDWORD, 
4be0: 5c 0a 20 20 20 20 20 20 20 20 4c 50 44 57 4f 52  \.        LPDWOR
4bf0: 44 29 29 61 53 79 73 63 61 6c 6c 5b 31 39 5d 2e  D))aSyscall[19].
4c00: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64  pCurrent)..#if d
4c10: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
4c20: 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20  N32_HAS_ANSI).  
4c30: 7b 20 22 47 65 74 46 69 6c 65 41 74 74 72 69 62  { "GetFileAttrib
4c40: 75 74 65 73 41 22 2c 20 20 20 20 20 20 28 53 59  utesA",      (SY
4c50: 53 43 41 4c 4c 29 47 65 74 46 69 6c 65 41 74 74  SCALL)GetFileAtt
4c60: 72 69 62 75 74 65 73 41 2c 20 20 20 20 20 20 30  ributesA,      0
4c70: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47   },.#else.  { "G
4c80: 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
4c90: 41 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c  A",      (SYSCAL
4ca0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
4cb0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
4cc0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
4cd0: 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75  osGetFileAttribu
4ce0: 74 65 73 41 20 28 28 44 57 4f 52 44 28 57 49 4e  tesA ((DWORD(WIN
4cf0: 41 50 49 2a 29 28 4c 50 43 53 54 52 29 29 61 53  API*)(LPCSTR))aS
4d00: 79 73 63 61 6c 6c 5b 32 30 5d 2e 70 43 75 72 72  yscall[20].pCurr
4d10: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
4d20: 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65  E_OS_WINRT && de
4d30: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
4d40: 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b  32_HAS_WIDE).  {
4d50: 20 22 47 65 74 46 69 6c 65 41 74 74 72 69 62 75   "GetFileAttribu
4d60: 74 65 73 57 22 2c 20 20 20 20 20 20 28 53 59 53  tesW",      (SYS
4d70: 43 41 4c 4c 29 47 65 74 46 69 6c 65 41 74 74 72  CALL)GetFileAttr
4d80: 69 62 75 74 65 73 57 2c 20 20 20 20 20 20 30 20  ibutesW,      0 
4d90: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65  },.#else.  { "Ge
4da0: 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 57  tFileAttributesW
4db0: 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c  ",      (SYSCALL
4dc0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
4dd0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
4de0: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
4df0: 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74  sGetFileAttribut
4e00: 65 73 57 20 28 28 44 57 4f 52 44 28 57 49 4e 41  esW ((DWORD(WINA
4e10: 50 49 2a 29 28 4c 50 43 57 53 54 52 29 29 61 53  PI*)(LPCWSTR))aS
4e20: 79 73 63 61 6c 6c 5b 32 31 5d 2e 70 43 75 72 72  yscall[21].pCurr
4e30: 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65  ent)..#if define
4e40: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
4e50: 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 47 65  AS_WIDE).  { "Ge
4e60: 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 45  tFileAttributesE
4e70: 78 57 22 2c 20 20 20 20 28 53 59 53 43 41 4c 4c  xW",    (SYSCALL
4e80: 29 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74  )GetFileAttribut
4e90: 65 73 45 78 57 2c 20 20 20 20 30 20 7d 2c 0a 23  esExW,    0 },.#
4ea0: 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46 69 6c  else.  { "GetFil
4eb0: 65 41 74 74 72 69 62 75 74 65 73 45 78 57 22 2c  eAttributesExW",
4ec0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
4ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ee0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
4ef0: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  f..#define osGet
4f00: 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 45 78  FileAttributesEx
4f10: 57 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  W ((BOOL(WINAPI*
4f20: 29 28 4c 50 43 57 53 54 52 2c 47 45 54 5f 46 49  )(LPCWSTR,GET_FI
4f30: 4c 45 45 58 5f 49 4e 46 4f 5f 4c 45 56 45 4c 53  LEEX_INFO_LEVELS
4f40: 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 56 4f  , \.        LPVO
4f50: 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 32 32 5d  ID))aSyscall[22]
4f60: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
4f70: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
4f80: 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 53 69 7a  .  { "GetFileSiz
4f90: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
4fa0: 28 53 59 53 43 41 4c 4c 29 47 65 74 46 69 6c 65  (SYSCALL)GetFile
4fb0: 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20  Size,           
4fc0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
4fd0: 20 22 47 65 74 46 69 6c 65 53 69 7a 65 22 2c 20   "GetFileSize", 
4fe0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
4ff0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
5000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
5010: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
5020: 6e 65 20 6f 73 47 65 74 46 69 6c 65 53 69 7a 65  ne osGetFileSize
5030: 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a   ((DWORD(WINAPI*
5040: 29 28 48 41 4e 44 4c 45 2c 4c 50 44 57 4f 52 44  )(HANDLE,LPDWORD
5050: 29 29 61 53 79 73 63 61 6c 6c 5b 32 33 5d 2e 70  ))aSyscall[23].p
5060: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53  Current)..#if !S
5070: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26  QLITE_OS_WINCE &
5080: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
5090: 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29  _WIN32_HAS_ANSI)
50a0: 0a 20 20 7b 20 22 47 65 74 46 75 6c 6c 50 61 74  .  { "GetFullPat
50b0: 68 4e 61 6d 65 41 22 2c 20 20 20 20 20 20 20 20  hNameA",        
50c0: 28 53 59 53 43 41 4c 4c 29 47 65 74 46 75 6c 6c  (SYSCALL)GetFull
50d0: 50 61 74 68 4e 61 6d 65 41 2c 20 20 20 20 20 20  PathNameA,      
50e0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
50f0: 20 22 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d   "GetFullPathNam
5100: 65 41 22 2c 20 20 20 20 20 20 20 20 28 53 59 53  eA",        (SYS
5110: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
5120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
5130: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
5140: 6e 65 20 6f 73 47 65 74 46 75 6c 6c 50 61 74 68  ne osGetFullPath
5150: 4e 61 6d 65 41 20 28 28 44 57 4f 52 44 28 57 49  NameA ((DWORD(WI
5160: 4e 41 50 49 2a 29 28 4c 50 43 53 54 52 2c 44 57  NAPI*)(LPCSTR,DW
5170: 4f 52 44 2c 4c 50 53 54 52 2c 20 5c 0a 20 20 20  ORD,LPSTR, \.   
5180: 20 20 20 20 20 4c 50 53 54 52 2a 29 29 61 53 79       LPSTR*))aSy
5190: 73 63 61 6c 6c 5b 32 34 5d 2e 70 43 75 72 72 65  scall[24].pCurre
51a0: 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  nt)..#if !SQLITE
51b0: 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51  _OS_WINCE && !SQ
51c0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
51d0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
51e0: 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a  WIN32_HAS_WIDE).
51f0: 20 20 7b 20 22 47 65 74 46 75 6c 6c 50 61 74 68    { "GetFullPath
5200: 4e 61 6d 65 57 22 2c 20 20 20 20 20 20 20 20 28  NameW",        (
5210: 53 59 53 43 41 4c 4c 29 47 65 74 46 75 6c 6c 50  SYSCALL)GetFullP
5220: 61 74 68 4e 61 6d 65 57 2c 20 20 20 20 20 20 20  athNameW,       
5230: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
5240: 22 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65  "GetFullPathName
5250: 57 22 2c 20 20 20 20 20 20 20 20 28 53 59 53 43  W",        (SYSC
5260: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
5270: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
5280: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
5290: 65 20 6f 73 47 65 74 46 75 6c 6c 50 61 74 68 4e  e osGetFullPathN
52a0: 61 6d 65 57 20 28 28 44 57 4f 52 44 28 57 49 4e  ameW ((DWORD(WIN
52b0: 41 50 49 2a 29 28 4c 50 43 57 53 54 52 2c 44 57  API*)(LPCWSTR,DW
52c0: 4f 52 44 2c 4c 50 57 53 54 52 2c 20 5c 0a 20 20  ORD,LPWSTR, \.  
52d0: 20 20 20 20 20 20 4c 50 57 53 54 52 2a 29 29 61        LPWSTR*))a
52e0: 53 79 73 63 61 6c 6c 5b 32 35 5d 2e 70 43 75 72  Syscall[25].pCur
52f0: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 47 65 74 4c  rent)..  { "GetL
5300: 61 73 74 45 72 72 6f 72 22 2c 20 20 20 20 20 20  astError",      
5310: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47        (SYSCALL)G
5320: 65 74 4c 61 73 74 45 72 72 6f 72 2c 20 20 20 20  etLastError,    
5330: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64          0 },..#d
5340: 65 66 69 6e 65 20 6f 73 47 65 74 4c 61 73 74 45  efine osGetLastE
5350: 72 72 6f 72 20 28 28 44 57 4f 52 44 28 57 49 4e  rror ((DWORD(WIN
5360: 41 50 49 2a 29 28 56 4f 49 44 29 29 61 53 79 73  API*)(VOID))aSys
5370: 63 61 6c 6c 5b 32 36 5d 2e 70 43 75 72 72 65 6e  call[26].pCurren
5380: 74 29 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  t)..#if !defined
5390: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41  (SQLITE_OMIT_LOA
53a0: 44 5f 45 58 54 45 4e 53 49 4f 4e 29 0a 23 69 66  D_EXTENSION).#if
53b0: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
53c0: 0a 20 20 2f 2a 20 54 68 65 20 47 65 74 50 72 6f  .  /* The GetPro
53d0: 63 41 64 64 72 65 73 73 41 28 29 20 72 6f 75 74  cAddressA() rout
53e0: 69 6e 65 20 69 73 20 6f 6e 6c 79 20 61 76 61 69  ine is only avai
53f0: 6c 61 62 6c 65 20 6f 6e 20 57 69 6e 64 6f 77 73  lable on Windows
5400: 20 43 45 2e 20 2a 2f 0a 20 20 7b 20 22 47 65 74   CE. */.  { "Get
5410: 50 72 6f 63 41 64 64 72 65 73 73 41 22 2c 20 20  ProcAddressA",  
5420: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
5430: 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 41 2c  GetProcAddressA,
5440: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
5450: 6c 73 65 0a 20 20 2f 2a 20 41 6c 6c 20 6f 74 68  lse.  /* All oth
5460: 65 72 20 57 69 6e 64 6f 77 73 20 70 6c 61 74 66  er Windows platf
5470: 6f 72 6d 73 20 65 78 70 65 63 74 20 47 65 74 50  orms expect GetP
5480: 72 6f 63 41 64 64 72 65 73 73 28 29 20 74 6f 20  rocAddress() to 
5490: 74 61 6b 65 0a 20 20 2a 2a 20 61 6e 20 41 4e 53  take.  ** an ANS
54a0: 49 20 73 74 72 69 6e 67 20 72 65 67 61 72 64 6c  I string regardl
54b0: 65 73 73 20 6f 66 20 74 68 65 20 5f 55 4e 49 43  ess of the _UNIC
54c0: 4f 44 45 20 73 65 74 74 69 6e 67 20 2a 2f 0a 20  ODE setting */. 
54d0: 20 7b 20 22 47 65 74 50 72 6f 63 41 64 64 72 65   { "GetProcAddre
54e0: 73 73 41 22 2c 20 20 20 20 20 20 20 20 20 28 53  ssA",         (S
54f0: 59 53 43 41 4c 4c 29 47 65 74 50 72 6f 63 41 64  YSCALL)GetProcAd
5500: 64 72 65 73 73 2c 20 20 20 20 20 20 20 20 20 20  dress,          
5510: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 65 6c 73  0 },.#endif.#els
5520: 65 0a 20 20 7b 20 22 47 65 74 50 72 6f 63 41 64  e.  { "GetProcAd
5530: 64 72 65 73 73 41 22 2c 20 20 20 20 20 20 20 20  dressA",        
5540: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
5550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5560: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
5570: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 50 72 6f  #define osGetPro
5580: 63 41 64 64 72 65 73 73 41 20 28 28 46 41 52 50  cAddressA ((FARP
5590: 52 4f 43 28 57 49 4e 41 50 49 2a 29 28 48 4d 4f  ROC(WINAPI*)(HMO
55a0: 44 55 4c 45 2c 20 5c 0a 20 20 20 20 20 20 20 20  DULE, \.        
55b0: 4c 50 43 53 54 52 29 29 61 53 79 73 63 61 6c 6c  LPCSTR))aSyscall
55c0: 5b 32 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [27].pCurrent)..
55d0: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
55e0: 49 4e 52 54 0a 20 20 7b 20 22 47 65 74 53 79 73  INRT.  { "GetSys
55f0: 74 65 6d 49 6e 66 6f 22 2c 20 20 20 20 20 20 20  temInfo",       
5600: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74      (SYSCALL)Get
5610: 53 79 73 74 65 6d 49 6e 66 6f 2c 20 20 20 20 20  SystemInfo,     
5620: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
5630: 0a 20 20 7b 20 22 47 65 74 53 79 73 74 65 6d 49  .  { "GetSystemI
5640: 6e 66 6f 22 2c 20 20 20 20 20 20 20 20 20 20 20  nfo",           
5650: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
5660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5670: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
5680: 64 65 66 69 6e 65 20 6f 73 47 65 74 53 79 73 74  define osGetSyst
5690: 65 6d 49 6e 66 6f 20 28 28 56 4f 49 44 28 57 49  emInfo ((VOID(WI
56a0: 4e 41 50 49 2a 29 28 4c 50 53 59 53 54 45 4d 5f  NAPI*)(LPSYSTEM_
56b0: 49 4e 46 4f 29 29 61 53 79 73 63 61 6c 6c 5b 32  INFO))aSyscall[2
56c0: 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  8].pCurrent)..  
56d0: 7b 20 22 47 65 74 53 79 73 74 65 6d 54 69 6d 65  { "GetSystemTime
56e0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ",           (SY
56f0: 53 43 41 4c 4c 29 47 65 74 53 79 73 74 65 6d 54  SCALL)GetSystemT
5700: 69 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20 30  ime,           0
5710: 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47   },..#define osG
5720: 65 74 53 79 73 74 65 6d 54 69 6d 65 20 28 28 56  etSystemTime ((V
5730: 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 4c 50 53  OID(WINAPI*)(LPS
5740: 59 53 54 45 4d 54 49 4d 45 29 29 61 53 79 73 63  YSTEMTIME))aSysc
5750: 61 6c 6c 5b 32 39 5d 2e 70 43 75 72 72 65 6e 74  all[29].pCurrent
5760: 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  )..#if !SQLITE_O
5770: 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 47 65 74  S_WINCE.  { "Get
5780: 53 79 73 74 65 6d 54 69 6d 65 41 73 46 69 6c 65  SystemTimeAsFile
5790: 54 69 6d 65 22 2c 20 28 53 59 53 43 41 4c 4c 29  Time", (SYSCALL)
57a0: 47 65 74 53 79 73 74 65 6d 54 69 6d 65 41 73 46  GetSystemTimeAsF
57b0: 69 6c 65 54 69 6d 65 2c 20 30 20 7d 2c 0a 23 65  ileTime, 0 },.#e
57c0: 6c 73 65 0a 20 20 7b 20 22 47 65 74 53 79 73 74  lse.  { "GetSyst
57d0: 65 6d 54 69 6d 65 41 73 46 69 6c 65 54 69 6d 65  emTimeAsFileTime
57e0: 22 2c 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20  ", (SYSCALL)0,  
57f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5800: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
5810: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 53  ..#define osGetS
5820: 79 73 74 65 6d 54 69 6d 65 41 73 46 69 6c 65 54  ystemTimeAsFileT
5830: 69 6d 65 20 28 28 56 4f 49 44 28 57 49 4e 41 50  ime ((VOID(WINAP
5840: 49 2a 29 28 20 5c 0a 20 20 20 20 20 20 20 20 4c  I*)( \.        L
5850: 50 46 49 4c 45 54 49 4d 45 29 29 61 53 79 73 63  PFILETIME))aSysc
5860: 61 6c 6c 5b 33 30 5d 2e 70 43 75 72 72 65 6e 74  all[30].pCurrent
5870: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  )..#if defined(S
5880: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
5890: 41 4e 53 49 29 0a 20 20 7b 20 22 47 65 74 54 65  ANSI).  { "GetTe
58a0: 6d 70 50 61 74 68 41 22 2c 20 20 20 20 20 20 20  mpPathA",       
58b0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65       (SYSCALL)Ge
58c0: 74 54 65 6d 70 50 61 74 68 41 2c 20 20 20 20 20  tTempPathA,     
58d0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
58e0: 65 0a 20 20 7b 20 22 47 65 74 54 65 6d 70 50 61  e.  { "GetTempPa
58f0: 74 68 41 22 2c 20 20 20 20 20 20 20 20 20 20 20  thA",           
5900: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
5910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5920: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
5930: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 54 65 6d  #define osGetTem
5940: 70 50 61 74 68 41 20 28 28 44 57 4f 52 44 28 57  pPathA ((DWORD(W
5950: 49 4e 41 50 49 2a 29 28 44 57 4f 52 44 2c 4c 50  INAPI*)(DWORD,LP
5960: 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 33 31  STR))aSyscall[31
5970: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
5980: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
5990: 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  T && defined(SQL
59a0: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
59b0: 44 45 29 0a 20 20 7b 20 22 47 65 74 54 65 6d 70  DE).  { "GetTemp
59c0: 50 61 74 68 57 22 2c 20 20 20 20 20 20 20 20 20  PathW",         
59d0: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 54     (SYSCALL)GetT
59e0: 65 6d 70 50 61 74 68 57 2c 20 20 20 20 20 20 20  empPathW,       
59f0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
5a00: 20 20 7b 20 22 47 65 74 54 65 6d 70 50 61 74 68    { "GetTempPath
5a10: 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28  W",            (
5a20: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
5a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a40: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
5a50: 65 66 69 6e 65 20 6f 73 47 65 74 54 65 6d 70 50  efine osGetTempP
5a60: 61 74 68 57 20 28 28 44 57 4f 52 44 28 57 49 4e  athW ((DWORD(WIN
5a70: 41 50 49 2a 29 28 44 57 4f 52 44 2c 4c 50 57 53  API*)(DWORD,LPWS
5a80: 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 33 32 5d  TR))aSyscall[32]
5a90: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
5aa0: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
5ab0: 0a 20 20 7b 20 22 47 65 74 54 69 63 6b 43 6f 75  .  { "GetTickCou
5ac0: 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  nt",            
5ad0: 28 53 59 53 43 41 4c 4c 29 47 65 74 54 69 63 6b  (SYSCALL)GetTick
5ae0: 43 6f 75 6e 74 2c 20 20 20 20 20 20 20 20 20 20  Count,          
5af0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
5b00: 20 22 47 65 74 54 69 63 6b 43 6f 75 6e 74 22 2c   "GetTickCount",
5b10: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
5b20: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
5b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
5b40: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
5b50: 6e 65 20 6f 73 47 65 74 54 69 63 6b 43 6f 75 6e  ne osGetTickCoun
5b60: 74 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49  t ((DWORD(WINAPI
5b70: 2a 29 28 56 4f 49 44 29 29 61 53 79 73 63 61 6c  *)(VOID))aSyscal
5b80: 6c 5b 33 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[33].pCurrent).
5b90: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
5ba0: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
5bb0: 53 49 29 20 26 26 20 64 65 66 69 6e 65 64 28 53  SI) && defined(S
5bc0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 47 45 54 56  QLITE_WIN32_GETV
5bd0: 45 52 53 49 4f 4e 45 58 29 20 26 26 20 5c 0a 20  ERSIONEX) && \. 
5be0: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 57 49         SQLITE_WI
5bf0: 4e 33 32 5f 47 45 54 56 45 52 53 49 4f 4e 45 58  N32_GETVERSIONEX
5c00: 0a 20 20 7b 20 22 47 65 74 56 65 72 73 69 6f 6e  .  { "GetVersion
5c10: 45 78 41 22 2c 20 20 20 20 20 20 20 20 20 20 20  ExA",           
5c20: 28 53 59 53 43 41 4c 4c 29 47 65 74 56 65 72 73  (SYSCALL)GetVers
5c30: 69 6f 6e 45 78 41 2c 20 20 20 20 20 20 20 20 20  ionExA,         
5c40: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
5c50: 20 22 47 65 74 56 65 72 73 69 6f 6e 45 78 41 22   "GetVersionExA"
5c60: 2c 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53  ,           (SYS
5c70: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
5c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
5c90: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
5ca0: 6e 65 20 6f 73 47 65 74 56 65 72 73 69 6f 6e 45  ne osGetVersionE
5cb0: 78 41 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  xA ((BOOL(WINAPI
5cc0: 2a 29 28 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  *)( \.        LP
5cd0: 4f 53 56 45 52 53 49 4f 4e 49 4e 46 4f 41 29 29  OSVERSIONINFOA))
5ce0: 61 53 79 73 63 61 6c 6c 5b 33 34 5d 2e 70 43 75  aSyscall[34].pCu
5cf0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c  rrent)..#if !SQL
5d00: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20  ITE_OS_WINRT && 
5d10: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
5d20: 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 20 26  IN32_HAS_WIDE) &
5d30: 26 20 5c 0a 20 20 20 20 20 20 20 20 64 65 66 69  & \.        defi
5d40: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
5d50: 5f 47 45 54 56 45 52 53 49 4f 4e 45 58 29 20 26  _GETVERSIONEX) &
5d60: 26 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 47  & SQLITE_WIN32_G
5d70: 45 54 56 45 52 53 49 4f 4e 45 58 0a 20 20 7b 20  ETVERSIONEX.  { 
5d80: 22 47 65 74 56 65 72 73 69 6f 6e 45 78 57 22 2c  "GetVersionExW",
5d90: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
5da0: 41 4c 4c 29 47 65 74 56 65 72 73 69 6f 6e 45 78  ALL)GetVersionEx
5db0: 57 2c 20 20 20 20 20 20 20 20 20 20 20 30 20 7d  W,           0 }
5dc0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74  ,.#else.  { "Get
5dd0: 56 65 72 73 69 6f 6e 45 78 57 22 2c 20 20 20 20  VersionExW",    
5de0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
5df0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
5e00: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
5e10: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
5e20: 47 65 74 56 65 72 73 69 6f 6e 45 78 57 20 28 28  GetVersionExW ((
5e30: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 20 5c  BOOL(WINAPI*)( \
5e40: 0a 20 20 20 20 20 20 20 20 4c 50 4f 53 56 45 52  .        LPOSVER
5e50: 53 49 4f 4e 49 4e 46 4f 57 29 29 61 53 79 73 63  SIONINFOW))aSysc
5e60: 61 6c 6c 5b 33 35 5d 2e 70 43 75 72 72 65 6e 74  all[35].pCurrent
5e70: 29 0a 0a 20 20 7b 20 22 48 65 61 70 41 6c 6c 6f  )..  { "HeapAllo
5e80: 63 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  c",             
5e90: 20 20 28 53 59 53 43 41 4c 4c 29 48 65 61 70 41    (SYSCALL)HeapA
5ea0: 6c 6c 6f 63 2c 20 20 20 20 20 20 20 20 20 20 20  lloc,           
5eb0: 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e      0 },..#defin
5ec0: 65 20 6f 73 48 65 61 70 41 6c 6c 6f 63 20 28 28  e osHeapAlloc ((
5ed0: 4c 50 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28  LPVOID(WINAPI*)(
5ee0: 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 20 5c 0a  HANDLE,DWORD, \.
5ef0: 20 20 20 20 20 20 20 20 53 49 5a 45 5f 54 29 29          SIZE_T))
5f00: 61 53 79 73 63 61 6c 6c 5b 33 36 5d 2e 70 43 75  aSyscall[36].pCu
5f10: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c  rrent)..#if !SQL
5f20: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b  ITE_OS_WINRT.  {
5f30: 20 22 48 65 61 70 43 72 65 61 74 65 22 2c 20 20   "HeapCreate",  
5f40: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
5f50: 43 41 4c 4c 29 48 65 61 70 43 72 65 61 74 65 2c  CALL)HeapCreate,
5f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
5f70: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 48 65  },.#else.  { "He
5f80: 61 70 43 72 65 61 74 65 22 2c 20 20 20 20 20 20  apCreate",      
5f90: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
5fa0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
5fb0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
5fc0: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
5fd0: 73 48 65 61 70 43 72 65 61 74 65 20 28 28 48 41  sHeapCreate ((HA
5fe0: 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 44 57  NDLE(WINAPI*)(DW
5ff0: 4f 52 44 2c 53 49 5a 45 5f 54 2c 20 5c 0a 20 20  ORD,SIZE_T, \.  
6000: 20 20 20 20 20 20 53 49 5a 45 5f 54 29 29 61 53        SIZE_T))aS
6010: 79 73 63 61 6c 6c 5b 33 37 5d 2e 70 43 75 72 72  yscall[37].pCurr
6020: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
6030: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22  E_OS_WINRT.  { "
6040: 48 65 61 70 44 65 73 74 72 6f 79 22 2c 20 20 20  HeapDestroy",   
6050: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
6060: 4c 4c 29 48 65 61 70 44 65 73 74 72 6f 79 2c 20  LL)HeapDestroy, 
6070: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
6080: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 48 65 61 70  .#else.  { "Heap
6090: 44 65 73 74 72 6f 79 22 2c 20 20 20 20 20 20 20  Destroy",       
60a0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
60b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
60c0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
60d0: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48  dif..#define osH
60e0: 65 61 70 44 65 73 74 72 6f 79 20 28 28 42 4f 4f  eapDestroy ((BOO
60f0: 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  L(WINAPI*)(HANDL
6100: 45 29 29 61 53 79 73 63 61 6c 6c 5b 33 38 5d 2e  E))aSyscall[38].
6110: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
6120: 48 65 61 70 46 72 65 65 22 2c 20 20 20 20 20 20  HeapFree",      
6130: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
6140: 4c 4c 29 48 65 61 70 46 72 65 65 2c 20 20 20 20  LL)HeapFree,    
6150: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
6160: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 61 70  ..#define osHeap
6170: 46 72 65 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41  Free ((BOOL(WINA
6180: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52  PI*)(HANDLE,DWOR
6190: 44 2c 4c 50 56 4f 49 44 29 29 61 53 79 73 63 61  D,LPVOID))aSysca
61a0: 6c 6c 5b 33 39 5d 2e 70 43 75 72 72 65 6e 74 29  ll[39].pCurrent)
61b0: 0a 0a 20 20 7b 20 22 48 65 61 70 52 65 41 6c 6c  ..  { "HeapReAll
61c0: 6f 63 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  oc",            
61d0: 20 28 53 59 53 43 41 4c 4c 29 48 65 61 70 52 65   (SYSCALL)HeapRe
61e0: 41 6c 6c 6f 63 2c 20 20 20 20 20 20 20 20 20 20  Alloc,          
61f0: 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65     0 },..#define
6200: 20 6f 73 48 65 61 70 52 65 41 6c 6c 6f 63 20 28   osHeapReAlloc (
6210: 28 4c 50 56 4f 49 44 28 57 49 4e 41 50 49 2a 29  (LPVOID(WINAPI*)
6220: 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 4c 50  (HANDLE,DWORD,LP
6230: 56 4f 49 44 2c 20 5c 0a 20 20 20 20 20 20 20 20  VOID, \.        
6240: 53 49 5a 45 5f 54 29 29 61 53 79 73 63 61 6c 6c  SIZE_T))aSyscall
6250: 5b 34 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [40].pCurrent)..
6260: 20 20 7b 20 22 48 65 61 70 53 69 7a 65 22 2c 20    { "HeapSize", 
6270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
6280: 53 59 53 43 41 4c 4c 29 48 65 61 70 53 69 7a 65  SYSCALL)HeapSize
6290: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
62a0: 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f   0 },..#define o
62b0: 73 48 65 61 70 53 69 7a 65 20 28 28 53 49 5a 45  sHeapSize ((SIZE
62c0: 5f 54 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44  _T(WINAPI*)(HAND
62d0: 4c 45 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20  LE,DWORD, \.    
62e0: 20 20 20 20 4c 50 43 56 4f 49 44 29 29 61 53 79      LPCVOID))aSy
62f0: 73 63 61 6c 6c 5b 34 31 5d 2e 70 43 75 72 72 65  scall[41].pCurre
6300: 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  nt)..#if !SQLITE
6310: 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 48  _OS_WINRT.  { "H
6320: 65 61 70 56 61 6c 69 64 61 74 65 22 2c 20 20 20  eapValidate",   
6330: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
6340: 4c 29 48 65 61 70 56 61 6c 69 64 61 74 65 2c 20  L)HeapValidate, 
6350: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
6360: 23 65 6c 73 65 0a 20 20 7b 20 22 48 65 61 70 56  #else.  { "HeapV
6370: 61 6c 69 64 61 74 65 22 2c 20 20 20 20 20 20 20  alidate",       
6380: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
6390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
63a0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
63b0: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65  if..#define osHe
63c0: 61 70 56 61 6c 69 64 61 74 65 20 28 28 42 4f 4f  apValidate ((BOO
63d0: 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  L(WINAPI*)(HANDL
63e0: 45 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20  E,DWORD, \.     
63f0: 20 20 20 4c 50 43 56 4f 49 44 29 29 61 53 79 73     LPCVOID))aSys
6400: 63 61 6c 6c 5b 34 32 5d 2e 70 43 75 72 72 65 6e  call[42].pCurren
6410: 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  t)..#if !SQLITE_
6420: 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c  OS_WINCE && !SQL
6430: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b  ITE_OS_WINRT.  {
6440: 20 22 48 65 61 70 43 6f 6d 70 61 63 74 22 2c 20   "HeapCompact", 
6450: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
6460: 43 41 4c 4c 29 48 65 61 70 43 6f 6d 70 61 63 74  CALL)HeapCompact
6470: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20  ,             0 
6480: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 48 65  },.#else.  { "He
6490: 61 70 43 6f 6d 70 61 63 74 22 2c 20 20 20 20 20  apCompact",     
64a0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
64b0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
64c0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
64d0: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
64e0: 73 48 65 61 70 43 6f 6d 70 61 63 74 20 28 28 55  sHeapCompact ((U
64f0: 49 4e 54 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  INT(WINAPI*)(HAN
6500: 44 4c 45 2c 44 57 4f 52 44 29 29 61 53 79 73 63  DLE,DWORD))aSysc
6510: 61 6c 6c 5b 34 33 5d 2e 70 43 75 72 72 65 6e 74  all[43].pCurrent
6520: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  )..#if defined(S
6530: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
6540: 41 4e 53 49 29 20 26 26 20 21 64 65 66 69 6e 65  ANSI) && !define
6550: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f  d(SQLITE_OMIT_LO
6560: 41 44 5f 45 58 54 45 4e 53 49 4f 4e 29 0a 20 20  AD_EXTENSION).  
6570: 7b 20 22 4c 6f 61 64 4c 69 62 72 61 72 79 41 22  { "LoadLibraryA"
6580: 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ,            (SY
6590: 53 43 41 4c 4c 29 4c 6f 61 64 4c 69 62 72 61 72  SCALL)LoadLibrar
65a0: 79 41 2c 20 20 20 20 20 20 20 20 20 20 20 20 30  yA,            0
65b0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4c   },.#else.  { "L
65c0: 6f 61 64 4c 69 62 72 61 72 79 41 22 2c 20 20 20  oadLibraryA",   
65d0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
65e0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
65f0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
6600: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
6610: 6f 73 4c 6f 61 64 4c 69 62 72 61 72 79 41 20 28  osLoadLibraryA (
6620: 28 48 4d 4f 44 55 4c 45 28 57 49 4e 41 50 49 2a  (HMODULE(WINAPI*
6630: 29 28 4c 50 43 53 54 52 29 29 61 53 79 73 63 61  )(LPCSTR))aSysca
6640: 6c 6c 5b 34 34 5d 2e 70 43 75 72 72 65 6e 74 29  ll[44].pCurrent)
6650: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
6660: 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65  _WINRT && define
6670: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
6680: 41 53 5f 57 49 44 45 29 20 26 26 20 5c 0a 20 20  AS_WIDE) && \.  
6690: 20 20 20 20 20 20 21 64 65 66 69 6e 65 64 28 53        !defined(S
66a0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f  QLITE_OMIT_LOAD_
66b0: 45 58 54 45 4e 53 49 4f 4e 29 0a 20 20 7b 20 22  EXTENSION).  { "
66c0: 4c 6f 61 64 4c 69 62 72 61 72 79 57 22 2c 20 20  LoadLibraryW",  
66d0: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
66e0: 4c 4c 29 4c 6f 61 64 4c 69 62 72 61 72 79 57 2c  LL)LoadLibraryW,
66f0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
6700: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 61 64  .#else.  { "Load
6710: 4c 69 62 72 61 72 79 57 22 2c 20 20 20 20 20 20  LibraryW",      
6720: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
6730: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
6740: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
6750: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4c  dif..#define osL
6760: 6f 61 64 4c 69 62 72 61 72 79 57 20 28 28 48 4d  oadLibraryW ((HM
6770: 4f 44 55 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c  ODULE(WINAPI*)(L
6780: 50 43 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c  PCWSTR))aSyscall
6790: 5b 34 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [45].pCurrent)..
67a0: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
67b0: 49 4e 52 54 0a 20 20 7b 20 22 4c 6f 63 61 6c 46  INRT.  { "LocalF
67c0: 72 65 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ree",           
67d0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f 63      (SYSCALL)Loc
67e0: 61 6c 46 72 65 65 2c 20 20 20 20 20 20 20 20 20  alFree,         
67f0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
6800: 0a 20 20 7b 20 22 4c 6f 63 61 6c 46 72 65 65 22  .  { "LocalFree"
6810: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
6820: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
6830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6840: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
6850: 64 65 66 69 6e 65 20 6f 73 4c 6f 63 61 6c 46 72  define osLocalFr
6860: 65 65 20 28 28 48 4c 4f 43 41 4c 28 57 49 4e 41  ee ((HLOCAL(WINA
6870: 50 49 2a 29 28 48 4c 4f 43 41 4c 29 29 61 53 79  PI*)(HLOCAL))aSy
6880: 73 63 61 6c 6c 5b 34 36 5d 2e 70 43 75 72 72 65  scall[46].pCurre
6890: 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  nt)..#if !SQLITE
68a0: 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51  _OS_WINCE && !SQ
68b0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
68c0: 7b 20 22 4c 6f 63 6b 46 69 6c 65 22 2c 20 20 20  { "LockFile",   
68d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
68e0: 53 43 41 4c 4c 29 4c 6f 63 6b 46 69 6c 65 2c 20  SCALL)LockFile, 
68f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
6900: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4c   },.#else.  { "L
6910: 6f 63 6b 46 69 6c 65 22 2c 20 20 20 20 20 20 20  ockFile",       
6920: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
6930: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
6940: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
6950: 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
6960: 6f 73 4c 6f 63 6b 46 69 6c 65 0a 23 64 65 66 69  osLockFile.#defi
6970: 6e 65 20 6f 73 4c 6f 63 6b 46 69 6c 65 20 28 28  ne osLockFile ((
6980: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41  BOOL(WINAPI*)(HA
6990: 4e 44 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44  NDLE,DWORD,DWORD
69a0: 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20  ,DWORD, \.      
69b0: 20 20 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c    DWORD))aSyscal
69c0: 6c 5b 34 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[47].pCurrent).
69d0: 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 53 51 4c  #endif..#if !SQL
69e0: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 7b  ITE_OS_WINCE.  {
69f0: 20 22 4c 6f 63 6b 46 69 6c 65 45 78 22 2c 20 20   "LockFileEx",  
6a00: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
6a10: 43 41 4c 4c 29 4c 6f 63 6b 46 69 6c 65 45 78 2c  CALL)LockFileEx,
6a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
6a30: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f  },.#else.  { "Lo
6a40: 63 6b 46 69 6c 65 45 78 22 2c 20 20 20 20 20 20  ckFileEx",      
6a50: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
6a60: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
6a70: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
6a80: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 6f  endif..#ifndef o
6a90: 73 4c 6f 63 6b 46 69 6c 65 45 78 0a 23 64 65 66  sLockFileEx.#def
6aa0: 69 6e 65 20 6f 73 4c 6f 63 6b 46 69 6c 65 45 78  ine osLockFileEx
6ab0: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
6ac0: 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 44 57  (HANDLE,DWORD,DW
6ad0: 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c  ORD,DWORD,DWORD,
6ae0: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 4f 56 45   \.        LPOVE
6af0: 52 4c 41 50 50 45 44 29 29 61 53 79 73 63 61 6c  RLAPPED))aSyscal
6b00: 6c 5b 34 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[48].pCurrent).
6b10: 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49  #endif..#if SQLI
6b20: 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 28  TE_OS_WINCE || (
6b30: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
6b40: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
6b50: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 29 0a 20  ITE_OMIT_WAL)). 
6b60: 20 7b 20 22 4d 61 70 56 69 65 77 4f 66 46 69 6c   { "MapViewOfFil
6b70: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 53  e",           (S
6b80: 59 53 43 41 4c 4c 29 4d 61 70 56 69 65 77 4f 66  YSCALL)MapViewOf
6b90: 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  File,           
6ba0: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
6bb0: 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 22 2c 20  MapViewOfFile", 
6bc0: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
6bd0: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
6be0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
6bf0: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
6c00: 20 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 6c 65   osMapViewOfFile
6c10: 20 28 28 4c 50 56 4f 49 44 28 57 49 4e 41 50 49   ((LPVOID(WINAPI
6c20: 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c  *)(HANDLE,DWORD,
6c30: 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20  DWORD,DWORD, \. 
6c40: 20 20 20 20 20 20 20 53 49 5a 45 5f 54 29 29 61         SIZE_T))a
6c50: 53 79 73 63 61 6c 6c 5b 34 39 5d 2e 70 43 75 72  Syscall[49].pCur
6c60: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 4d 75 6c 74  rent)..  { "Mult
6c70: 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 22  iByteToWideChar"
6c80: 2c 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4d  ,     (SYSCALL)M
6c90: 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43 68  ultiByteToWideCh
6ca0: 61 72 2c 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64  ar,     0 },..#d
6cb0: 65 66 69 6e 65 20 6f 73 4d 75 6c 74 69 42 79 74  efine osMultiByt
6cc0: 65 54 6f 57 69 64 65 43 68 61 72 20 28 28 69 6e  eToWideChar ((in
6cd0: 74 28 57 49 4e 41 50 49 2a 29 28 55 49 4e 54 2c  t(WINAPI*)(UINT,
6ce0: 44 57 4f 52 44 2c 4c 50 43 53 54 52 2c 69 6e 74  DWORD,LPCSTR,int
6cf0: 2c 4c 50 57 53 54 52 2c 20 5c 0a 20 20 20 20 20  ,LPWSTR, \.     
6d00: 20 20 20 69 6e 74 29 29 61 53 79 73 63 61 6c 6c     int))aSyscall
6d10: 5b 35 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [50].pCurrent)..
6d20: 20 20 7b 20 22 51 75 65 72 79 50 65 72 66 6f 72    { "QueryPerfor
6d30: 6d 61 6e 63 65 43 6f 75 6e 74 65 72 22 2c 20 28  manceCounter", (
6d40: 53 59 53 43 41 4c 4c 29 51 75 65 72 79 50 65 72  SYSCALL)QueryPer
6d50: 66 6f 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72 2c  formanceCounter,
6d60: 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f   0 },..#define o
6d70: 73 51 75 65 72 79 50 65 72 66 6f 72 6d 61 6e 63  sQueryPerformanc
6d80: 65 43 6f 75 6e 74 65 72 20 28 28 42 4f 4f 4c 28  eCounter ((BOOL(
6d90: 57 49 4e 41 50 49 2a 29 28 20 5c 0a 20 20 20 20  WINAPI*)( \.    
6da0: 20 20 20 20 4c 41 52 47 45 5f 49 4e 54 45 47 45      LARGE_INTEGE
6db0: 52 2a 29 29 61 53 79 73 63 61 6c 6c 5b 35 31 5d  R*))aSyscall[51]
6dc0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
6dd0: 22 52 65 61 64 46 69 6c 65 22 2c 20 20 20 20 20  "ReadFile",     
6de0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
6df0: 41 4c 4c 29 52 65 61 64 46 69 6c 65 2c 20 20 20  ALL)ReadFile,   
6e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
6e10: 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 52 65 61  ,..#define osRea
6e20: 64 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e  dFile ((BOOL(WIN
6e30: 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 50 56  API*)(HANDLE,LPV
6e40: 4f 49 44 2c 44 57 4f 52 44 2c 4c 50 44 57 4f 52  OID,DWORD,LPDWOR
6e50: 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 4f  D, \.        LPO
6e60: 56 45 52 4c 41 50 50 45 44 29 29 61 53 79 73 63  VERLAPPED))aSysc
6e70: 61 6c 6c 5b 35 32 5d 2e 70 43 75 72 72 65 6e 74  all[52].pCurrent
6e80: 29 0a 0a 20 20 7b 20 22 53 65 74 45 6e 64 4f 66  )..  { "SetEndOf
6e90: 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20  File",          
6ea0: 20 20 28 53 59 53 43 41 4c 4c 29 53 65 74 45 6e    (SYSCALL)SetEn
6eb0: 64 4f 66 46 69 6c 65 2c 20 20 20 20 20 20 20 20  dOfFile,        
6ec0: 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e      0 },..#defin
6ed0: 65 20 6f 73 53 65 74 45 6e 64 4f 66 46 69 6c 65  e osSetEndOfFile
6ee0: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
6ef0: 28 48 41 4e 44 4c 45 29 29 61 53 79 73 63 61 6c  (HANDLE))aSyscal
6f00: 6c 5b 35 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[53].pCurrent).
6f10: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
6f20: 57 49 4e 52 54 0a 20 20 7b 20 22 53 65 74 46 69  WINRT.  { "SetFi
6f30: 6c 65 50 6f 69 6e 74 65 72 22 2c 20 20 20 20 20  lePointer",     
6f40: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 53 65       (SYSCALL)Se
6f50: 74 46 69 6c 65 50 6f 69 6e 74 65 72 2c 20 20 20  tFilePointer,   
6f60: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
6f70: 65 0a 20 20 7b 20 22 53 65 74 46 69 6c 65 50 6f  e.  { "SetFilePo
6f80: 69 6e 74 65 72 22 2c 20 20 20 20 20 20 20 20 20  inter",         
6f90: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
6fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6fb0: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
6fc0: 23 64 65 66 69 6e 65 20 6f 73 53 65 74 46 69 6c  #define osSetFil
6fd0: 65 50 6f 69 6e 74 65 72 20 28 28 44 57 4f 52 44  ePointer ((DWORD
6fe0: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
6ff0: 2c 4c 4f 4e 47 2c 50 4c 4f 4e 47 2c 20 5c 0a 20  ,LONG,PLONG, \. 
7000: 20 20 20 20 20 20 20 44 57 4f 52 44 29 29 61 53         DWORD))aS
7010: 79 73 63 61 6c 6c 5b 35 34 5d 2e 70 43 75 72 72  yscall[54].pCurr
7020: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
7030: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22  E_OS_WINRT.  { "
7040: 53 6c 65 65 70 22 2c 20 20 20 20 20 20 20 20 20  Sleep",         
7050: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
7060: 4c 4c 29 53 6c 65 65 70 2c 20 20 20 20 20 20 20  LL)Sleep,       
7070: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
7080: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 53 6c 65 65  .#else.  { "Slee
7090: 70 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  p",             
70a0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
70b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
70c0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
70d0: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 53  dif..#define osS
70e0: 6c 65 65 70 20 28 28 56 4f 49 44 28 57 49 4e 41  leep ((VOID(WINA
70f0: 50 49 2a 29 28 44 57 4f 52 44 29 29 61 53 79 73  PI*)(DWORD))aSys
7100: 63 61 6c 6c 5b 35 35 5d 2e 70 43 75 72 72 65 6e  call[55].pCurren
7110: 74 29 0a 0a 20 20 7b 20 22 53 79 73 74 65 6d 54  t)..  { "SystemT
7120: 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65 22 2c 20  imeToFileTime", 
7130: 20 20 20 28 53 59 53 43 41 4c 4c 29 53 79 73 74     (SYSCALL)Syst
7140: 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65  emTimeToFileTime
7150: 2c 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69  ,    0 },..#defi
7160: 6e 65 20 6f 73 53 79 73 74 65 6d 54 69 6d 65 54  ne osSystemTimeT
7170: 6f 46 69 6c 65 54 69 6d 65 20 28 28 42 4f 4f 4c  oFileTime ((BOOL
7180: 28 57 49 4e 41 50 49 2a 29 28 43 4f 4e 53 54 20  (WINAPI*)(CONST 
7190: 53 59 53 54 45 4d 54 49 4d 45 2a 2c 20 5c 0a 20  SYSTEMTIME*, \. 
71a0: 20 20 20 20 20 20 20 4c 50 46 49 4c 45 54 49 4d         LPFILETIM
71b0: 45 29 29 61 53 79 73 63 61 6c 6c 5b 35 36 5d 2e  E))aSyscall[56].
71c0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
71d0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
71e0: 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  && !SQLITE_OS_WI
71f0: 4e 52 54 0a 20 20 7b 20 22 55 6e 6c 6f 63 6b 46  NRT.  { "UnlockF
7200: 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ile",           
7210: 20 20 20 28 53 59 53 43 41 4c 4c 29 55 6e 6c 6f     (SYSCALL)Unlo
7220: 63 6b 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20  ckFile,         
7230: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
7240: 20 20 7b 20 22 55 6e 6c 6f 63 6b 46 69 6c 65 22    { "UnlockFile"
7250: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ,              (
7260: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
7270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7280: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 69   0 },.#endif..#i
7290: 66 6e 64 65 66 20 6f 73 55 6e 6c 6f 63 6b 46 69  fndef osUnlockFi
72a0: 6c 65 0a 23 64 65 66 69 6e 65 20 6f 73 55 6e 6c  le.#define osUnl
72b0: 6f 63 6b 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57  ockFile ((BOOL(W
72c0: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44  INAPI*)(HANDLE,D
72d0: 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44  WORD,DWORD,DWORD
72e0: 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52  , \.        DWOR
72f0: 44 29 29 61 53 79 73 63 61 6c 6c 5b 35 37 5d 2e  D))aSyscall[57].
7300: 70 43 75 72 72 65 6e 74 29 0a 23 65 6e 64 69 66  pCurrent).#endif
7310: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
7320: 5f 57 49 4e 43 45 0a 20 20 7b 20 22 55 6e 6c 6f  _WINCE.  { "Unlo
7330: 63 6b 46 69 6c 65 45 78 22 2c 20 20 20 20 20 20  ckFileEx",      
7340: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 55        (SYSCALL)U
7350: 6e 6c 6f 63 6b 46 69 6c 65 45 78 2c 20 20 20 20  nlockFileEx,    
7360: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
7370: 73 65 0a 20 20 7b 20 22 55 6e 6c 6f 63 6b 46 69  se.  { "UnlockFi
7380: 6c 65 45 78 22 2c 20 20 20 20 20 20 20 20 20 20  leEx",          
7390: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
73a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
73b0: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
73c0: 0a 23 64 65 66 69 6e 65 20 6f 73 55 6e 6c 6f 63  .#define osUnloc
73d0: 6b 46 69 6c 65 45 78 20 28 28 42 4f 4f 4c 28 57  kFileEx ((BOOL(W
73e0: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44  INAPI*)(HANDLE,D
73f0: 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44  WORD,DWORD,DWORD
7400: 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 4f 56  , \.        LPOV
7410: 45 52 4c 41 50 50 45 44 29 29 61 53 79 73 63 61  ERLAPPED))aSysca
7420: 6c 6c 5b 35 38 5d 2e 70 43 75 72 72 65 6e 74 29  ll[58].pCurrent)
7430: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
7440: 57 49 4e 43 45 20 7c 7c 20 21 64 65 66 69 6e 65  WINCE || !define
7450: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  d(SQLITE_OMIT_WA
7460: 4c 29 0a 20 20 7b 20 22 55 6e 6d 61 70 56 69 65  L).  { "UnmapVie
7470: 77 4f 66 46 69 6c 65 22 2c 20 20 20 20 20 20 20  wOfFile",       
7480: 20 20 28 53 59 53 43 41 4c 4c 29 55 6e 6d 61 70    (SYSCALL)Unmap
7490: 56 69 65 77 4f 66 46 69 6c 65 2c 20 20 20 20 20  ViewOfFile,     
74a0: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
74b0: 20 7b 20 22 55 6e 6d 61 70 56 69 65 77 4f 66 46   { "UnmapViewOfF
74c0: 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 28 53  ile",         (S
74d0: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
74e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
74f0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
7500: 66 69 6e 65 20 6f 73 55 6e 6d 61 70 56 69 65 77  fine osUnmapView
7510: 4f 66 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49  OfFile ((BOOL(WI
7520: 4e 41 50 49 2a 29 28 4c 50 43 56 4f 49 44 29 29  NAPI*)(LPCVOID))
7530: 61 53 79 73 63 61 6c 6c 5b 35 39 5d 2e 70 43 75  aSyscall[59].pCu
7540: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 57 69 64  rrent)..  { "Wid
7550: 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65  eCharToMultiByte
7560: 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29  ",     (SYSCALL)
7570: 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42  WideCharToMultiB
7580: 79 74 65 2c 20 20 20 20 20 30 20 7d 2c 0a 0a 23  yte,     0 },..#
7590: 64 65 66 69 6e 65 20 6f 73 57 69 64 65 43 68 61  define osWideCha
75a0: 72 54 6f 4d 75 6c 74 69 42 79 74 65 20 28 28 69  rToMultiByte ((i
75b0: 6e 74 28 57 49 4e 41 50 49 2a 29 28 55 49 4e 54  nt(WINAPI*)(UINT
75c0: 2c 44 57 4f 52 44 2c 4c 50 43 57 53 54 52 2c 69  ,DWORD,LPCWSTR,i
75d0: 6e 74 2c 4c 50 53 54 52 2c 69 6e 74 2c 20 5c 0a  nt,LPSTR,int, \.
75e0: 20 20 20 20 20 20 20 20 4c 50 43 53 54 52 2c 4c          LPCSTR,L
75f0: 50 42 4f 4f 4c 29 29 61 53 79 73 63 61 6c 6c 5b  PBOOL))aSyscall[
7600: 36 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  60].pCurrent).. 
7610: 20 7b 20 22 57 72 69 74 65 46 69 6c 65 22 2c 20   { "WriteFile", 
7620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
7630: 59 53 43 41 4c 4c 29 57 72 69 74 65 46 69 6c 65  YSCALL)WriteFile
7640: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
7650: 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73  0 },..#define os
7660: 57 72 69 74 65 46 69 6c 65 20 28 28 42 4f 4f 4c  WriteFile ((BOOL
7670: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
7680: 2c 4c 50 43 56 4f 49 44 2c 44 57 4f 52 44 2c 4c  ,LPCVOID,DWORD,L
7690: 50 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20  PDWORD, \.      
76a0: 20 20 4c 50 4f 56 45 52 4c 41 50 50 45 44 29 29    LPOVERLAPPED))
76b0: 61 53 79 73 63 61 6c 6c 5b 36 31 5d 2e 70 43 75  aSyscall[61].pCu
76c0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49  rrent)..#if SQLI
76d0: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20  TE_OS_WINRT.  { 
76e0: 22 43 72 65 61 74 65 45 76 65 6e 74 45 78 57 22  "CreateEventExW"
76f0: 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43  ,          (SYSC
7700: 41 4c 4c 29 43 72 65 61 74 65 45 76 65 6e 74 45  ALL)CreateEventE
7710: 78 57 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d  xW,          0 }
7720: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65  ,.#else.  { "Cre
7730: 61 74 65 45 76 65 6e 74 45 78 57 22 2c 20 20 20  ateEventExW",   
7740: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
7750: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
7760: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
7770: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
7780: 43 72 65 61 74 65 45 76 65 6e 74 45 78 57 20 28  CreateEventExW (
7790: 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29  (HANDLE(WINAPI*)
77a0: 28 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54 52  (LPSECURITY_ATTR
77b0: 49 42 55 54 45 53 2c 4c 50 43 57 53 54 52 2c 20  IBUTES,LPCWSTR, 
77c0: 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44 2c  \.        DWORD,
77d0: 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b  DWORD))aSyscall[
77e0: 36 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  62].pCurrent)..#
77f0: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
7800: 4e 52 54 0a 20 20 7b 20 22 57 61 69 74 46 6f 72  NRT.  { "WaitFor
7810: 53 69 6e 67 6c 65 4f 62 6a 65 63 74 22 2c 20 20  SingleObject",  
7820: 20 20 20 28 53 59 53 43 41 4c 4c 29 57 61 69 74     (SYSCALL)Wait
7830: 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 2c  ForSingleObject,
7840: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
7850: 20 20 7b 20 22 57 61 69 74 46 6f 72 53 69 6e 67    { "WaitForSing
7860: 6c 65 4f 62 6a 65 63 74 22 2c 20 20 20 20 20 28  leObject",     (
7870: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
7880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7890: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
78a0: 65 66 69 6e 65 20 6f 73 57 61 69 74 46 6f 72 53  efine osWaitForS
78b0: 69 6e 67 6c 65 4f 62 6a 65 63 74 20 28 28 44 57  ingleObject ((DW
78c0: 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  ORD(WINAPI*)(HAN
78d0: 44 4c 45 2c 20 5c 0a 20 20 20 20 20 20 20 20 44  DLE, \.        D
78e0: 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 36  WORD))aSyscall[6
78f0: 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  3].pCurrent)..#i
7900: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
7910: 43 45 0a 20 20 7b 20 22 57 61 69 74 46 6f 72 53  CE.  { "WaitForS
7920: 69 6e 67 6c 65 4f 62 6a 65 63 74 45 78 22 2c 20  ingleObjectEx", 
7930: 20 20 28 53 59 53 43 41 4c 4c 29 57 61 69 74 46    (SYSCALL)WaitF
7940: 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 45 78  orSingleObjectEx
7950: 2c 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20  ,   0 },.#else. 
7960: 20 7b 20 22 57 61 69 74 46 6f 72 53 69 6e 67 6c   { "WaitForSingl
7970: 65 4f 62 6a 65 63 74 45 78 22 2c 20 20 20 28 53  eObjectEx",   (S
7980: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
7990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
79a0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
79b0: 66 69 6e 65 20 6f 73 57 61 69 74 46 6f 72 53 69  fine osWaitForSi
79c0: 6e 67 6c 65 4f 62 6a 65 63 74 45 78 20 28 28 44  ngleObjectEx ((D
79d0: 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 48 41  WORD(WINAPI*)(HA
79e0: 4e 44 4c 45 2c 44 57 4f 52 44 2c 20 5c 0a 20 20  NDLE,DWORD, \.  
79f0: 20 20 20 20 20 20 42 4f 4f 4c 29 29 61 53 79 73        BOOL))aSys
7a00: 63 61 6c 6c 5b 36 34 5d 2e 70 43 75 72 72 65 6e  call[64].pCurren
7a10: 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  t)..#if SQLITE_O
7a20: 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 53 65 74  S_WINRT.  { "Set
7a30: 46 69 6c 65 50 6f 69 6e 74 65 72 45 78 22 2c 20  FilePointerEx", 
7a40: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
7a50: 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 45 78  SetFilePointerEx
7a60: 2c 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65  ,        0 },.#e
7a70: 6c 73 65 0a 20 20 7b 20 22 53 65 74 46 69 6c 65  lse.  { "SetFile
7a80: 50 6f 69 6e 74 65 72 45 78 22 2c 20 20 20 20 20  PointerEx",     
7a90: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
7aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ab0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
7ac0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 53 65 74 46  ..#define osSetF
7ad0: 69 6c 65 50 6f 69 6e 74 65 72 45 78 20 28 28 42  ilePointerEx ((B
7ae0: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  OOL(WINAPI*)(HAN
7af0: 44 4c 45 2c 4c 41 52 47 45 5f 49 4e 54 45 47 45  DLE,LARGE_INTEGE
7b00: 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 50 4c 41  R, \.        PLA
7b10: 52 47 45 5f 49 4e 54 45 47 45 52 2c 44 57 4f 52  RGE_INTEGER,DWOR
7b20: 44 29 29 61 53 79 73 63 61 6c 6c 5b 36 35 5d 2e  D))aSyscall[65].
7b30: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53  pCurrent)..#if S
7b40: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
7b50: 20 7b 20 22 47 65 74 46 69 6c 65 49 6e 66 6f 72   { "GetFileInfor
7b60: 6d 61 74 69 6f 6e 42 79 48 61 6e 64 6c 65 45 78  mationByHandleEx
7b70: 22 2c 20 28 53 59 53 43 41 4c 4c 29 47 65 74 46  ", (SYSCALL)GetF
7b80: 69 6c 65 49 6e 66 6f 72 6d 61 74 69 6f 6e 42 79  ileInformationBy
7b90: 48 61 6e 64 6c 65 45 78 2c 20 30 20 7d 2c 0a 23  HandleEx, 0 },.#
7ba0: 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46 69 6c  else.  { "GetFil
7bb0: 65 49 6e 66 6f 72 6d 61 74 69 6f 6e 42 79 48 61  eInformationByHa
7bc0: 6e 64 6c 65 45 78 22 2c 20 28 53 59 53 43 41 4c  ndleEx", (SYSCAL
7bd0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
7be0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
7bf0: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  f..#define osGet
7c00: 46 69 6c 65 49 6e 66 6f 72 6d 61 74 69 6f 6e 42  FileInformationB
7c10: 79 48 61 6e 64 6c 65 45 78 20 28 28 42 4f 4f 4c  yHandleEx ((BOOL
7c20: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
7c30: 2c 20 5c 0a 20 20 20 20 20 20 20 20 46 49 4c 45  , \.        FILE
7c40: 5f 49 4e 46 4f 5f 42 59 5f 48 41 4e 44 4c 45 5f  _INFO_BY_HANDLE_
7c50: 43 4c 41 53 53 2c 4c 50 56 4f 49 44 2c 44 57 4f  CLASS,LPVOID,DWO
7c60: 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 36 36 5d  RD))aSyscall[66]
7c70: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
7c80: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20  SQLITE_OS_WINRT 
7c90: 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
7ca0: 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 0a 20 20 7b  TE_OMIT_WAL).  {
7cb0: 20 22 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 46   "MapViewOfFileF
7cc0: 72 6f 6d 41 70 70 22 2c 20 20 20 20 28 53 59 53  romApp",    (SYS
7cd0: 43 41 4c 4c 29 4d 61 70 56 69 65 77 4f 66 46 69  CALL)MapViewOfFi
7ce0: 6c 65 46 72 6f 6d 41 70 70 2c 20 20 20 20 30 20  leFromApp,    0 
7cf0: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4d 61  },.#else.  { "Ma
7d00: 70 56 69 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41  pViewOfFileFromA
7d10: 70 70 22 2c 20 20 20 20 28 53 59 53 43 41 4c 4c  pp",    (SYSCALL
7d20: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
7d30: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
7d40: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
7d50: 73 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 46 72  sMapViewOfFileFr
7d60: 6f 6d 41 70 70 20 28 28 4c 50 56 4f 49 44 28 57  omApp ((LPVOID(W
7d70: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 55  INAPI*)(HANDLE,U
7d80: 4c 4f 4e 47 2c 55 4c 4f 4e 47 36 34 2c 20 5c 0a  LONG,ULONG64, \.
7d90: 20 20 20 20 20 20 20 20 53 49 5a 45 5f 54 29 29          SIZE_T))
7da0: 61 53 79 73 63 61 6c 6c 5b 36 37 5d 2e 70 43 75  aSyscall[67].pCu
7db0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49  rrent)..#if SQLI
7dc0: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20  TE_OS_WINRT.  { 
7dd0: 22 43 72 65 61 74 65 46 69 6c 65 32 22 2c 20 20  "CreateFile2",  
7de0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
7df0: 41 4c 4c 29 43 72 65 61 74 65 46 69 6c 65 32 2c  ALL)CreateFile2,
7e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
7e10: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65  ,.#else.  { "Cre
7e20: 61 74 65 46 69 6c 65 32 22 2c 20 20 20 20 20 20  ateFile2",      
7e30: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
7e40: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
7e50: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
7e60: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
7e70: 43 72 65 61 74 65 46 69 6c 65 32 20 28 28 48 41  CreateFile2 ((HA
7e80: 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50  NDLE(WINAPI*)(LP
7e90: 43 57 53 54 52 2c 44 57 4f 52 44 2c 44 57 4f 52  CWSTR,DWORD,DWOR
7ea0: 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20  D,DWORD, \.     
7eb0: 20 20 20 4c 50 43 52 45 41 54 45 46 49 4c 45 32     LPCREATEFILE2
7ec0: 5f 45 58 54 45 4e 44 45 44 5f 50 41 52 41 4d 45  _EXTENDED_PARAME
7ed0: 54 45 52 53 29 29 61 53 79 73 63 61 6c 6c 5b 36  TERS))aSyscall[6
7ee0: 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  8].pCurrent)..#i
7ef0: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
7f00: 54 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  T && !defined(SQ
7f10: 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45  LITE_OMIT_LOAD_E
7f20: 58 54 45 4e 53 49 4f 4e 29 0a 20 20 7b 20 22 4c  XTENSION).  { "L
7f30: 6f 61 64 50 61 63 6b 61 67 65 64 4c 69 62 72 61  oadPackagedLibra
7f40: 72 79 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c  ry",     (SYSCAL
7f50: 4c 29 4c 6f 61 64 50 61 63 6b 61 67 65 64 4c 69  L)LoadPackagedLi
7f60: 62 72 61 72 79 2c 20 20 20 20 20 30 20 7d 2c 0a  brary,     0 },.
7f70: 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 61 64 50  #else.  { "LoadP
7f80: 61 63 6b 61 67 65 64 4c 69 62 72 61 72 79 22 2c  ackagedLibrary",
7f90: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
7fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7fb0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
7fc0: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4c 6f  if..#define osLo
7fd0: 61 64 50 61 63 6b 61 67 65 64 4c 69 62 72 61 72  adPackagedLibrar
7fe0: 79 20 28 28 48 4d 4f 44 55 4c 45 28 57 49 4e 41  y ((HMODULE(WINA
7ff0: 50 49 2a 29 28 4c 50 43 57 53 54 52 2c 20 5c 0a  PI*)(LPCWSTR, \.
8000: 20 20 20 20 20 20 20 20 44 57 4f 52 44 29 29 61          DWORD))a
8010: 53 79 73 63 61 6c 6c 5b 36 39 5d 2e 70 43 75 72  Syscall[69].pCur
8020: 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54  rent)..#if SQLIT
8030: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22  E_OS_WINRT.  { "
8040: 47 65 74 54 69 63 6b 43 6f 75 6e 74 36 34 22 2c  GetTickCount64",
8050: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
8060: 4c 4c 29 47 65 74 54 69 63 6b 43 6f 75 6e 74 36  LL)GetTickCount6
8070: 34 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c  4,          0 },
8080: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 54  .#else.  { "GetT
8090: 69 63 6b 43 6f 75 6e 74 36 34 22 2c 20 20 20 20  ickCount64",    
80a0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
80b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
80c0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
80d0: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47  dif..#define osG
80e0: 65 74 54 69 63 6b 43 6f 75 6e 74 36 34 20 28 28  etTickCount64 ((
80f0: 55 4c 4f 4e 47 4c 4f 4e 47 28 57 49 4e 41 50 49  ULONGLONG(WINAPI
8100: 2a 29 28 56 4f 49 44 29 29 61 53 79 73 63 61 6c  *)(VOID))aSyscal
8110: 6c 5b 37 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[70].pCurrent).
8120: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
8130: 49 4e 52 54 0a 20 20 7b 20 22 47 65 74 4e 61 74  INRT.  { "GetNat
8140: 69 76 65 53 79 73 74 65 6d 49 6e 66 6f 22 2c 20  iveSystemInfo", 
8150: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74      (SYSCALL)Get
8160: 4e 61 74 69 76 65 53 79 73 74 65 6d 49 6e 66 6f  NativeSystemInfo
8170: 2c 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65  ,     0 },.#else
8180: 0a 20 20 7b 20 22 47 65 74 4e 61 74 69 76 65 53  .  { "GetNativeS
8190: 79 73 74 65 6d 49 6e 66 6f 22 2c 20 20 20 20 20  ystemInfo",     
81a0: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
81b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
81c0: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
81d0: 64 65 66 69 6e 65 20 6f 73 47 65 74 4e 61 74 69  define osGetNati
81e0: 76 65 53 79 73 74 65 6d 49 6e 66 6f 20 28 28 56  veSystemInfo ((V
81f0: 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 20 5c 0a  OID(WINAPI*)( \.
8200: 20 20 20 20 20 20 20 20 4c 50 53 59 53 54 45 4d          LPSYSTEM
8210: 5f 49 4e 46 4f 29 29 61 53 79 73 63 61 6c 6c 5b  _INFO))aSyscall[
8220: 37 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  71].pCurrent)..#
8230: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
8240: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
8250: 29 0a 20 20 7b 20 22 4f 75 74 70 75 74 44 65 62  ).  { "OutputDeb
8260: 75 67 53 74 72 69 6e 67 41 22 2c 20 20 20 20 20  ugStringA",     
8270: 20 28 53 59 53 43 41 4c 4c 29 4f 75 74 70 75 74   (SYSCALL)Output
8280: 44 65 62 75 67 53 74 72 69 6e 67 41 2c 20 20 20  DebugStringA,   
8290: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
82a0: 7b 20 22 4f 75 74 70 75 74 44 65 62 75 67 53 74  { "OutputDebugSt
82b0: 72 69 6e 67 41 22 2c 20 20 20 20 20 20 28 53 59  ringA",      (SY
82c0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
82d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
82e0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
82f0: 69 6e 65 20 6f 73 4f 75 74 70 75 74 44 65 62 75  ine osOutputDebu
8300: 67 53 74 72 69 6e 67 41 20 28 28 56 4f 49 44 28  gStringA ((VOID(
8310: 57 49 4e 41 50 49 2a 29 28 4c 50 43 53 54 52 29  WINAPI*)(LPCSTR)
8320: 29 61 53 79 73 63 61 6c 6c 5b 37 32 5d 2e 70 43  )aSyscall[72].pC
8330: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66  urrent)..#if def
8340: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
8350: 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20  2_HAS_WIDE).  { 
8360: 22 4f 75 74 70 75 74 44 65 62 75 67 53 74 72 69  "OutputDebugStri
8370: 6e 67 57 22 2c 20 20 20 20 20 20 28 53 59 53 43  ngW",      (SYSC
8380: 41 4c 4c 29 4f 75 74 70 75 74 44 65 62 75 67 53  ALL)OutputDebugS
8390: 74 72 69 6e 67 57 2c 20 20 20 20 20 20 30 20 7d  tringW,      0 }
83a0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4f 75 74  ,.#else.  { "Out
83b0: 70 75 74 44 65 62 75 67 53 74 72 69 6e 67 57 22  putDebugStringW"
83c0: 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29  ,      (SYSCALL)
83d0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
83e0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
83f0: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
8400: 4f 75 74 70 75 74 44 65 62 75 67 53 74 72 69 6e  OutputDebugStrin
8410: 67 57 20 28 28 56 4f 49 44 28 57 49 4e 41 50 49  gW ((VOID(WINAPI
8420: 2a 29 28 4c 50 43 57 53 54 52 29 29 61 53 79 73  *)(LPCWSTR))aSys
8430: 63 61 6c 6c 5b 37 33 5d 2e 70 43 75 72 72 65 6e  call[73].pCurren
8440: 74 29 0a 0a 20 20 7b 20 22 47 65 74 50 72 6f 63  t)..  { "GetProc
8450: 65 73 73 48 65 61 70 22 2c 20 20 20 20 20 20 20  essHeap",       
8460: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 50     (SYSCALL)GetP
8470: 72 6f 63 65 73 73 48 65 61 70 2c 20 20 20 20 20  rocessHeap,     
8480: 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69       0 },..#defi
8490: 6e 65 20 6f 73 47 65 74 50 72 6f 63 65 73 73 48  ne osGetProcessH
84a0: 65 61 70 20 28 28 48 41 4e 44 4c 45 28 57 49 4e  eap ((HANDLE(WIN
84b0: 41 50 49 2a 29 28 56 4f 49 44 29 29 61 53 79 73  API*)(VOID))aSys
84c0: 63 61 6c 6c 5b 37 34 5d 2e 70 43 75 72 72 65 6e  call[74].pCurren
84d0: 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  t)..#if SQLITE_O
84e0: 53 5f 57 49 4e 52 54 20 26 26 20 21 64 65 66 69  S_WINRT && !defi
84f0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
8500: 57 41 4c 29 0a 20 20 7b 20 22 43 72 65 61 74 65  WAL).  { "Create
8510: 46 69 6c 65 4d 61 70 70 69 6e 67 46 72 6f 6d 41  FileMappingFromA
8520: 70 70 22 2c 20 28 53 59 53 43 41 4c 4c 29 43 72  pp", (SYSCALL)Cr
8530: 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 46  eateFileMappingF
8540: 72 6f 6d 41 70 70 2c 20 30 20 7d 2c 0a 23 65 6c  romApp, 0 },.#el
8550: 73 65 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69  se.  { "CreateFi
8560: 6c 65 4d 61 70 70 69 6e 67 46 72 6f 6d 41 70 70  leMappingFromApp
8570: 22 2c 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20  ", (SYSCALL)0,  
8580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8590: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
85a0: 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74  .#define osCreat
85b0: 65 46 69 6c 65 4d 61 70 70 69 6e 67 46 72 6f 6d  eFileMappingFrom
85c0: 41 70 70 20 28 28 48 41 4e 44 4c 45 28 57 49 4e  App ((HANDLE(WIN
85d0: 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 20 5c 0a  API*)(HANDLE, \.
85e0: 20 20 20 20 20 20 20 20 4c 50 53 45 43 55 52 49          LPSECURI
85f0: 54 59 5f 41 54 54 52 49 42 55 54 45 53 2c 55 4c  TY_ATTRIBUTES,UL
8600: 4f 4e 47 2c 55 4c 4f 4e 47 36 34 2c 4c 50 43 57  ONG,ULONG64,LPCW
8610: 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 37 35  STR))aSyscall[75
8620: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 2f 2a 0a  ].pCurrent)../*.
8630: 2a 2a 20 4e 4f 54 45 3a 20 4f 6e 20 73 6f 6d 65  ** NOTE: On some
8640: 20 73 75 62 2d 70 6c 61 74 66 6f 72 6d 73 2c 20   sub-platforms, 
8650: 74 68 65 20 49 6e 74 65 72 6c 6f 63 6b 65 64 43  the InterlockedC
8660: 6f 6d 70 61 72 65 45 78 63 68 61 6e 67 65 20 22  ompareExchange "
8670: 66 75 6e 63 74 69 6f 6e 22 0a 2a 2a 20 20 20 20  function".**    
8680: 20 20 20 69 73 20 72 65 61 6c 6c 79 20 6a 75 73     is really jus
8690: 74 20 61 20 6d 61 63 72 6f 20 74 68 61 74 20 75  t a macro that u
86a0: 73 65 73 20 61 20 63 6f 6d 70 69 6c 65 72 20 69  ses a compiler i
86b0: 6e 74 72 69 6e 73 69 63 20 28 65 2e 67 2e 20 78  ntrinsic (e.g. x
86c0: 36 34 29 2e 0a 2a 2a 20 20 20 20 20 20 20 53 6f  64)..**       So
86d0: 20 64 6f 20 6e 6f 74 20 74 72 79 20 74 6f 20 6d   do not try to m
86e0: 61 6b 65 20 74 68 69 73 20 69 73 20 69 6e 74 6f  ake this is into
86f0: 20 61 20 72 65 64 65 66 69 6e 61 62 6c 65 20 69   a redefinable i
8700: 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 23 69 66  nterface..*/.#if
8710: 20 64 65 66 69 6e 65 64 28 49 6e 74 65 72 6c 6f   defined(Interlo
8720: 63 6b 65 64 43 6f 6d 70 61 72 65 45 78 63 68 61  ckedCompareExcha
8730: 6e 67 65 29 0a 20 20 7b 20 22 49 6e 74 65 72 6c  nge).  { "Interl
8740: 6f 63 6b 65 64 43 6f 6d 70 61 72 65 45 78 63 68  ockedCompareExch
8750: 61 6e 67 65 22 2c 20 28 53 59 53 43 41 4c 4c 29  ange", (SYSCALL)
8760: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
8770: 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66        0 },..#def
8780: 69 6e 65 20 6f 73 49 6e 74 65 72 6c 6f 63 6b 65  ine osInterlocke
8790: 64 43 6f 6d 70 61 72 65 45 78 63 68 61 6e 67 65  dCompareExchange
87a0: 20 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70   InterlockedComp
87b0: 61 72 65 45 78 63 68 61 6e 67 65 0a 23 65 6c 73  areExchange.#els
87c0: 65 0a 20 20 7b 20 22 49 6e 74 65 72 6c 6f 63 6b  e.  { "Interlock
87d0: 65 64 43 6f 6d 70 61 72 65 45 78 63 68 61 6e 67  edCompareExchang
87e0: 65 22 2c 20 28 53 59 53 43 41 4c 4c 29 49 6e 74  e", (SYSCALL)Int
87f0: 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72 65 45  erlockedCompareE
8800: 78 63 68 61 6e 67 65 2c 20 30 20 7d 2c 0a 0a 23  xchange, 0 },..#
8810: 64 65 66 69 6e 65 20 6f 73 49 6e 74 65 72 6c 6f  define osInterlo
8820: 63 6b 65 64 43 6f 6d 70 61 72 65 45 78 63 68 61  ckedCompareExcha
8830: 6e 67 65 20 28 28 4c 4f 4e 47 28 57 49 4e 41 50  nge ((LONG(WINAP
8840: 49 2a 29 28 4c 4f 4e 47 20 5c 0a 20 20 20 20 20  I*)(LONG \.     
8850: 20 20 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f     SQLITE_WIN32_
8860: 56 4f 4c 41 54 49 4c 45 2a 2c 20 4c 4f 4e 47 2c  VOLATILE*, LONG,
8870: 4c 4f 4e 47 29 29 61 53 79 73 63 61 6c 6c 5b 37  LONG))aSyscall[7
8880: 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 23 65 6e  6].pCurrent).#en
8890: 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 49  dif /* defined(I
88a0: 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72  nterlockedCompar
88b0: 65 45 78 63 68 61 6e 67 65 29 20 2a 2f 0a 0a 7d  eExchange) */..}
88c0: 3b 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  ; /* End of the 
88d0: 6f 76 65 72 72 69 64 65 61 62 6c 65 20 73 79 73  overrideable sys
88e0: 74 65 6d 20 63 61 6c 6c 73 20 2a 2f 0a 0a 2f 2a  tem calls */../*
88f0: 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20  .** This is the 
8900: 78 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 29  xSetSystemCall()
8910: 20 6d 65 74 68 6f 64 20 6f 66 20 73 71 6c 69 74   method of sqlit
8920: 65 33 5f 76 66 73 20 66 6f 72 20 61 6c 6c 20 6f  e3_vfs for all o
8930: 66 20 74 68 65 0a 2a 2a 20 22 77 69 6e 33 32 22  f the.** "win32"
8940: 20 56 46 53 65 73 2e 20 20 52 65 74 75 72 6e 20   VFSes.  Return 
8950: 53 51 4c 49 54 45 5f 4f 4b 20 6f 70 6f 6e 20 73  SQLITE_OK opon s
8960: 75 63 63 65 73 73 66 75 6c 6c 79 20 75 70 64 61  uccessfully upda
8970: 74 69 6e 67 20 74 68 65 0a 2a 2a 20 73 79 73 74  ting the.** syst
8980: 65 6d 20 63 61 6c 6c 20 70 6f 69 6e 74 65 72 2c  em call pointer,
8990: 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f   or SQLITE_NOTFO
89a0: 55 4e 44 20 69 66 20 74 68 65 72 65 20 69 73 20  UND if there is 
89b0: 6e 6f 20 63 6f 6e 66 69 67 75 72 61 62 6c 65 0a  no configurable.
89c0: 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6e  ** system call n
89d0: 61 6d 65 64 20 7a 4e 61 6d 65 2e 0a 2a 2f 0a 73  amed zName..*/.s
89e0: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 65 74  tatic int winSet
89f0: 53 79 73 74 65 6d 43 61 6c 6c 28 0a 20 20 73 71  SystemCall(.  sq
8a00: 6c 69 74 65 33 5f 76 66 73 20 2a 70 4e 6f 74 55  lite3_vfs *pNotU
8a10: 73 65 64 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  sed,        /* T
8a20: 68 65 20 56 46 53 20 70 6f 69 6e 74 65 72 2e 20  he VFS pointer. 
8a30: 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 63   Not used */.  c
8a40: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
8a50: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
8a60: 4e 61 6d 65 20 6f 66 20 73 79 73 74 65 6d 20 63  Name of system c
8a70: 61 6c 6c 20 74 6f 20 6f 76 65 72 72 69 64 65 20  all to override 
8a80: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73  */.  sqlite3_sys
8a90: 63 61 6c 6c 5f 70 74 72 20 70 4e 65 77 46 75 6e  call_ptr pNewFun
8aa0: 63 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f  c  /* Pointer to
8ab0: 20 6e 65 77 20 73 79 73 74 65 6d 20 63 61 6c 6c   new system call
8ac0: 20 76 61 6c 75 65 20 2a 2f 0a 29 7b 0a 20 20 75   value */.){.  u
8ad0: 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20  nsigned int i;. 
8ae0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
8af0: 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 0a 20 20 55 4e  _NOTFOUND;..  UN
8b00: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
8b10: 4e 6f 74 55 73 65 64 29 3b 0a 20 20 69 66 28 20  NotUsed);.  if( 
8b20: 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  zName==0 ){.    
8b30: 2f 2a 20 49 66 20 6e 6f 20 7a 4e 61 6d 65 20 69  /* If no zName i
8b40: 73 20 67 69 76 65 6e 2c 20 72 65 73 74 6f 72 65  s given, restore
8b50: 20 61 6c 6c 20 73 79 73 74 65 6d 20 63 61 6c 6c   all system call
8b60: 73 20 74 6f 20 74 68 65 69 72 20 64 65 66 61 75  s to their defau
8b70: 6c 74 0a 20 20 20 20 2a 2a 20 73 65 74 74 69 6e  lt.    ** settin
8b80: 67 73 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55  gs and return NU
8b90: 4c 4c 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  LL.    */.    rc
8ba0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
8bb0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a    for(i=0; i<siz
8bc0: 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69  eof(aSyscall)/si
8bd0: 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d  zeof(aSyscall[0]
8be0: 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ); i++){.      i
8bf0: 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70  f( aSyscall[i].p
8c00: 44 65 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20  Default ){.     
8c10: 20 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70     aSyscall[i].p
8c20: 43 75 72 72 65 6e 74 20 3d 20 61 53 79 73 63 61  Current = aSysca
8c30: 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3b 0a  ll[i].pDefault;.
8c40: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
8c50: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66  }else{.    /* If
8c60: 20 7a 4e 61 6d 65 20 69 73 20 73 70 65 63 69 66   zName is specif
8c70: 69 65 64 2c 20 6f 70 65 72 61 74 65 20 6f 6e 20  ied, operate on 
8c80: 6f 6e 6c 79 20 74 68 65 20 6f 6e 65 20 73 79 73  only the one sys
8c90: 74 65 6d 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20  tem call.    ** 
8ca0: 73 70 65 63 69 66 69 65 64 2e 0a 20 20 20 20 2a  specified..    *
8cb0: 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  /.    for(i=0; i
8cc0: 3c 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c  <sizeof(aSyscall
8cd0: 29 2f 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c  )/sizeof(aSyscal
8ce0: 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  l[0]); i++){.   
8cf0: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e     if( strcmp(zN
8d00: 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d  ame, aSyscall[i]
8d10: 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20  .zName)==0 ){.  
8d20: 20 20 20 20 20 20 69 66 28 20 61 53 79 73 63 61        if( aSysca
8d30: 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3d 3d  ll[i].pDefault==
8d40: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  0 ){.          a
8d50: 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61  Syscall[i].pDefa
8d60: 75 6c 74 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69  ult = aSyscall[i
8d70: 5d 2e 70 43 75 72 72 65 6e 74 3b 0a 20 20 20 20  ].pCurrent;.    
8d80: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63      }.        rc
8d90: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
8da0: 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 46 75        if( pNewFu
8db0: 6e 63 3d 3d 30 20 29 20 70 4e 65 77 46 75 6e 63  nc==0 ) pNewFunc
8dc0: 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70   = aSyscall[i].p
8dd0: 44 65 66 61 75 6c 74 3b 0a 20 20 20 20 20 20 20  Default;.       
8de0: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75   aSyscall[i].pCu
8df0: 72 72 65 6e 74 20 3d 20 70 4e 65 77 46 75 6e 63  rrent = pNewFunc
8e00: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
8e10: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
8e20: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
8e30: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
8e40: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20 73  the value of a s
8e50: 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 52 65 74  ystem call.  Ret
8e60: 75 72 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e 61 6d  urn NULL if zNam
8e70: 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 72 65  e is not a.** re
8e80: 63 6f 67 6e 69 7a 65 64 20 73 79 73 74 65 6d 20  cognized system 
8e90: 63 61 6c 6c 20 6e 61 6d 65 2e 20 20 4e 55 4c 4c  call name.  NULL
8ea0: 20 69 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65   is also returne
8eb0: 64 20 69 66 20 74 68 65 20 73 79 73 74 65 6d 20  d if the system 
8ec0: 63 61 6c 6c 0a 2a 2a 20 69 73 20 63 75 72 72 65  call.** is curre
8ed0: 6e 74 6c 79 20 75 6e 64 65 66 69 6e 65 64 2e 0a  ntly undefined..
8ee0: 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65  */.static sqlite
8ef0: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 77 69  3_syscall_ptr wi
8f00: 6e 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 0a  nGetSystemCall(.
8f10: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
8f20: 4e 6f 74 55 73 65 64 2c 0a 20 20 63 6f 6e 73 74  NotUsed,.  const
8f30: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 0a 29 7b 0a   char *zName.){.
8f40: 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69    unsigned int i
8f50: 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ;..  UNUSED_PARA
8f60: 4d 45 54 45 52 28 70 4e 6f 74 55 73 65 64 29 3b  METER(pNotUsed);
8f70: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69  .  for(i=0; i<si
8f80: 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73  zeof(aSyscall)/s
8f90: 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30  izeof(aSyscall[0
8fa0: 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ]); i++){.    if
8fb0: 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20  ( strcmp(zName, 
8fc0: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d  aSyscall[i].zNam
8fd0: 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 61  e)==0 ) return a
8fe0: 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72  Syscall[i].pCurr
8ff0: 65 6e 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ent;.  }.  retur
9000: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n 0;.}../*.** Re
9010: 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66  turn the name of
9020: 20 74 68 65 20 66 69 72 73 74 20 73 79 73 74 65   the first syste
9030: 6d 20 63 61 6c 6c 20 61 66 74 65 72 20 7a 4e 61  m call after zNa
9040: 6d 65 2e 20 20 49 66 20 7a 4e 61 6d 65 3d 3d 4e  me.  If zName==N
9050: 55 4c 4c 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75  ULL.** then retu
9060: 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  rn the name of t
9070: 68 65 20 66 69 72 73 74 20 73 79 73 74 65 6d 20  he first system 
9080: 63 61 6c 6c 2e 20 20 52 65 74 75 72 6e 20 4e 55  call.  Return NU
9090: 4c 4c 20 69 66 20 7a 4e 61 6d 65 0a 2a 2a 20 69  LL if zName.** i
90a0: 73 20 74 68 65 20 6c 61 73 74 20 73 79 73 74 65  s the last syste
90b0: 6d 20 63 61 6c 6c 20 6f 72 20 69 66 20 7a 4e 61  m call or if zNa
90c0: 6d 65 20 69 73 20 6e 6f 74 20 74 68 65 20 6e 61  me is not the na
90d0: 6d 65 20 6f 66 20 61 20 76 61 6c 69 64 0a 2a 2a  me of a valid.**
90e0: 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 0a 2a 2f   system call..*/
90f0: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
9100: 61 72 20 2a 77 69 6e 4e 65 78 74 53 79 73 74 65  ar *winNextSyste
9110: 6d 43 61 6c 6c 28 73 71 6c 69 74 65 33 5f 76 66  mCall(sqlite3_vf
9120: 73 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  s *p, const char
9130: 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20   *zName){.  int 
9140: 69 20 3d 20 2d 31 3b 0a 0a 20 20 55 4e 55 53 45  i = -1;..  UNUSE
9150: 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b 0a  D_PARAMETER(p);.
9160: 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20    if( zName ){. 
9170: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72     for(i=0; i<Ar
9180: 72 61 79 53 69 7a 65 28 61 53 79 73 63 61 6c 6c  raySize(aSyscall
9190: 29 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  )-1; i++){.     
91a0: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d   if( strcmp(zNam
91b0: 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a  e, aSyscall[i].z
91c0: 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b  Name)==0 ) break
91d0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f  ;.    }.  }.  fo
91e0: 72 28 69 2b 2b 3b 20 69 3c 41 72 72 61 79 53 69  r(i++; i<ArraySi
91f0: 7a 65 28 61 53 79 73 63 61 6c 6c 29 3b 20 69 2b  ze(aSyscall); i+
9200: 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 53 79 73  +){.    if( aSys
9210: 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74  call[i].pCurrent
9220: 21 3d 30 20 29 20 72 65 74 75 72 6e 20 61 53 79  !=0 ) return aSy
9230: 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a  scall[i].zName;.
9240: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
9250: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
9260: 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 0a 2f 2a  _WIN32_MALLOC./*
9270: 0a 2a 2a 20 49 66 20 61 20 57 69 6e 33 32 20 6e  .** If a Win32 n
9280: 61 74 69 76 65 20 68 65 61 70 20 68 61 73 20 62  ative heap has b
9290: 65 65 6e 20 63 6f 6e 66 69 67 75 72 65 64 2c 20  een configured, 
92a0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69  this function wi
92b0: 6c 6c 20 61 74 74 65 6d 70 74 20 74 6f 0a 2a 2a  ll attempt to.**
92c0: 20 63 6f 6d 70 61 63 74 20 69 74 2e 20 20 55 70   compact it.  Up
92d0: 6f 6e 20 73 75 63 63 65 73 73 2c 20 53 51 4c 49  on success, SQLI
92e0: 54 45 5f 4f 4b 20 77 69 6c 6c 20 62 65 20 72 65  TE_OK will be re
92f0: 74 75 72 6e 65 64 2e 20 20 55 70 6f 6e 20 66 61  turned.  Upon fa
9300: 69 6c 75 72 65 2c 20 6f 6e 65 0a 2a 2a 20 6f 66  ilure, one.** of
9310: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 53   SQLITE_NOMEM, S
9320: 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 6f 72 20  QLITE_ERROR, or 
9330: 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20  SQLITE_NOTFOUND 
9340: 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
9350: 2e 20 20 54 68 65 0a 2a 2a 20 22 70 6e 4c 61 72  .  The.** "pnLar
9360: 67 65 73 74 22 20 61 72 67 75 6d 65 6e 74 2c 20  gest" argument, 
9370: 69 66 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 77 69 6c  if non-zero, wil
9380: 6c 20 62 65 20 75 73 65 64 20 74 6f 20 72 65 74  l be used to ret
9390: 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20  urn the size of 
93a0: 74 68 65 0a 2a 2a 20 6c 61 72 67 65 73 74 20 63  the.** largest c
93b0: 6f 6d 6d 69 74 74 65 64 20 66 72 65 65 20 62 6c  ommitted free bl
93c0: 6f 63 6b 20 69 6e 20 74 68 65 20 68 65 61 70 2c  ock in the heap,
93d0: 20 69 6e 20 62 79 74 65 73 2e 0a 2a 2f 0a 69 6e   in bytes..*/.in
93e0: 74 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  t sqlite3_win32_
93f0: 63 6f 6d 70 61 63 74 5f 68 65 61 70 28 4c 50 55  compact_heap(LPU
9400: 49 4e 54 20 70 6e 4c 61 72 67 65 73 74 29 7b 0a  INT pnLargest){.
9410: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
9420: 45 5f 4f 4b 3b 0a 20 20 55 49 4e 54 20 6e 4c 61  E_OK;.  UINT nLa
9430: 72 67 65 73 74 20 3d 20 30 3b 0a 20 20 48 41 4e  rgest = 0;.  HAN
9440: 44 4c 45 20 68 48 65 61 70 3b 0a 0a 20 20 77 69  DLE hHeap;..  wi
9450: 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63 28  nMemAssertMagic(
9460: 29 3b 0a 20 20 68 48 65 61 70 20 3d 20 77 69 6e  );.  hHeap = win
9470: 4d 65 6d 47 65 74 48 65 61 70 28 29 3b 0a 20 20  MemGetHeap();.  
9480: 61 73 73 65 72 74 28 20 68 48 65 61 70 21 3d 30  assert( hHeap!=0
9490: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48   );.  assert( hH
94a0: 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e  eap!=INVALID_HAN
94b0: 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66  DLE_VALUE );.#if
94c0: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
94d0: 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  T && defined(SQL
94e0: 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43  ITE_WIN32_MALLOC
94f0: 5f 56 41 4c 49 44 41 54 45 29 0a 20 20 61 73 73  _VALIDATE).  ass
9500: 65 72 74 28 20 6f 73 48 65 61 70 56 61 6c 69 64  ert( osHeapValid
9510: 61 74 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54  ate(hHeap, SQLIT
9520: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41  E_WIN32_HEAP_FLA
9530: 47 53 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23 65 6e  GS, NULL) );.#en
9540: 64 69 66 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  dif.#if !SQLITE_
9550: 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c  OS_WINCE && !SQL
9560: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 69  ITE_OS_WINRT.  i
9570: 66 28 20 28 6e 4c 61 72 67 65 73 74 3d 6f 73 48  f( (nLargest=osH
9580: 65 61 70 43 6f 6d 70 61 63 74 28 68 48 65 61 70  eapCompact(hHeap
9590: 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  , SQLITE_WIN32_H
95a0: 45 41 50 5f 46 4c 41 47 53 29 29 3d 3d 30 20 29  EAP_FLAGS))==0 )
95b0: 7b 0a 20 20 20 20 44 57 4f 52 44 20 6c 61 73 74  {.    DWORD last
95c0: 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
95d0: 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 69 66  tError();.    if
95e0: 28 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 4e 4f 5f  ( lastErrno==NO_
95f0: 45 52 52 4f 52 20 29 7b 0a 20 20 20 20 20 20 73  ERROR ){.      s
9600: 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
9610: 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64  E_NOMEM, "failed
9620: 20 74 6f 20 48 65 61 70 43 6f 6d 70 61 63 74 20   to HeapCompact 
9630: 28 6e 6f 20 73 70 61 63 65 29 2c 20 68 65 61 70  (no space), heap
9640: 3d 25 70 22 2c 0a 20 20 20 20 20 20 20 20 20 20  =%p",.          
9650: 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 68          (void*)h
9660: 48 65 61 70 29 3b 0a 20 20 20 20 20 20 72 63 20  Heap);.      rc 
9670: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
9680: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
9690: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
96a0: 49 54 45 5f 45 52 52 4f 52 2c 20 22 66 61 69 6c  ITE_ERROR, "fail
96b0: 65 64 20 74 6f 20 48 65 61 70 43 6f 6d 70 61 63  ed to HeapCompac
96c0: 74 20 28 25 6c 75 29 2c 20 68 65 61 70 3d 25 70  t (%lu), heap=%p
96d0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
96e0: 20 20 20 20 20 6f 73 47 65 74 4c 61 73 74 45 72       osGetLastEr
96f0: 72 6f 72 28 29 2c 20 28 76 6f 69 64 2a 29 68 48  ror(), (void*)hH
9700: 65 61 70 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  eap);.      rc =
9710: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
9720: 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20     }.  }.#else. 
9730: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
9740: 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 2c 20 22 66  ITE_NOTFOUND, "f
9750: 61 69 6c 65 64 20 74 6f 20 48 65 61 70 43 6f 6d  ailed to HeapCom
9760: 70 61 63 74 2c 20 68 65 61 70 3d 25 70 22 2c 0a  pact, heap=%p",.
9770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76                (v
9780: 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a 20 20 72  oid*)hHeap);.  r
9790: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f  c = SQLITE_NOTFO
97a0: 55 4e 44 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66  UND;.#endif.  if
97b0: 28 20 70 6e 4c 61 72 67 65 73 74 20 29 20 2a 70  ( pnLargest ) *p
97c0: 6e 4c 61 72 67 65 73 74 20 3d 20 6e 4c 61 72 67  nLargest = nLarg
97d0: 65 73 74 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  est;.  return rc
97e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 20  ;.}../*.** If a 
97f0: 57 69 6e 33 32 20 6e 61 74 69 76 65 20 68 65 61  Win32 native hea
9800: 70 20 68 61 73 20 62 65 65 6e 20 63 6f 6e 66 69  p has been confi
9810: 67 75 72 65 64 2c 20 74 68 69 73 20 66 75 6e 63  gured, this func
9820: 74 69 6f 6e 20 77 69 6c 6c 20 61 74 74 65 6d 70  tion will attemp
9830: 74 20 74 6f 0a 2a 2a 20 64 65 73 74 72 6f 79 20  t to.** destroy 
9840: 61 6e 64 20 72 65 63 72 65 61 74 65 20 69 74 2e  and recreate it.
9850: 20 20 49 66 20 74 68 65 20 57 69 6e 33 32 20 6e    If the Win32 n
9860: 61 74 69 76 65 20 68 65 61 70 20 69 73 20 6e 6f  ative heap is no
9870: 74 20 69 73 6f 6c 61 74 65 64 20 61 6e 64 2f 6f  t isolated and/o
9880: 72 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33  r.** the sqlite3
9890: 5f 6d 65 6d 6f 72 79 5f 75 73 65 64 28 29 20 66  _memory_used() f
98a0: 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  unction does not
98b0: 20 72 65 74 75 72 6e 20 7a 65 72 6f 2c 20 53 51   return zero, SQ
98c0: 4c 49 54 45 5f 42 55 53 59 20 77 69 6c 6c 0a 2a  LITE_BUSY will.*
98d0: 2a 20 62 65 20 72 65 74 75 72 6e 65 64 20 61 6e  * be returned an
98e0: 64 20 6e 6f 20 63 68 61 6e 67 65 73 20 77 69 6c  d no changes wil
98f0: 6c 20 62 65 20 6d 61 64 65 20 74 6f 20 74 68 65  l be made to the
9900: 20 57 69 6e 33 32 20 6e 61 74 69 76 65 20 68 65   Win32 native he
9910: 61 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ap..*/.int sqlit
9920: 65 33 5f 77 69 6e 33 32 5f 72 65 73 65 74 5f 68  e3_win32_reset_h
9930: 65 61 70 28 29 7b 0a 20 20 69 6e 74 20 72 63 3b  eap(){.  int rc;
9940: 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20  .  MUTEX_LOGIC( 
9950: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 70  sqlite3_mutex *p
9960: 4d 61 73 74 65 72 3b 20 29 20 2f 2a 20 54 68 65  Master; ) /* The
9970: 20 6d 61 69 6e 20 73 74 61 74 69 63 20 6d 75 74   main static mut
9980: 65 78 20 2a 2f 0a 20 20 4d 55 54 45 58 5f 4c 4f  ex */.  MUTEX_LO
9990: 47 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  GIC( sqlite3_mut
99a0: 65 78 20 2a 70 4d 65 6d 3b 20 29 20 20 20 20 2f  ex *pMem; )    /
99b0: 2a 20 54 68 65 20 6d 65 6d 73 79 73 20 73 74 61  * The memsys sta
99c0: 74 69 63 20 6d 75 74 65 78 20 2a 2f 0a 20 20 4d  tic mutex */.  M
99d0: 55 54 45 58 5f 4c 4f 47 49 43 28 20 70 4d 61 73  UTEX_LOGIC( pMas
99e0: 74 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 75 74  ter = sqlite3Mut
99f0: 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
9a00: 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54  UTEX_STATIC_MAST
9a10: 45 52 29 3b 20 29 0a 20 20 4d 55 54 45 58 5f 4c  ER); ).  MUTEX_L
9a20: 4f 47 49 43 28 20 70 4d 65 6d 20 3d 20 73 71 6c  OGIC( pMem = sql
9a30: 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
9a40: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
9a50: 49 43 5f 4d 45 4d 29 3b 20 29 0a 20 20 73 71 6c  IC_MEM); ).  sql
9a60: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
9a70: 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 73 71 6c  (pMaster);.  sql
9a80: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
9a90: 28 70 4d 65 6d 29 3b 0a 20 20 77 69 6e 4d 65 6d  (pMem);.  winMem
9aa0: 41 73 73 65 72 74 4d 61 67 69 63 28 29 3b 0a 20  AssertMagic();. 
9ab0: 20 69 66 28 20 77 69 6e 4d 65 6d 47 65 74 48 65   if( winMemGetHe
9ac0: 61 70 28 29 21 3d 4e 55 4c 4c 20 26 26 20 77 69  ap()!=NULL && wi
9ad0: 6e 4d 65 6d 47 65 74 4f 77 6e 65 64 28 29 20 26  nMemGetOwned() &
9ae0: 26 20 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79  & sqlite3_memory
9af0: 5f 75 73 65 64 28 29 3d 3d 30 20 29 7b 0a 20 20  _used()==0 ){.  
9b00: 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 41 74 20 74    /*.    ** At t
9b10: 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 72 65  his point, there
9b20: 20 73 68 6f 75 6c 64 20 62 65 20 6e 6f 20 6f 75   should be no ou
9b30: 74 73 74 61 6e 64 69 6e 67 20 6d 65 6d 6f 72 79  tstanding memory
9b40: 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 6f 6e 0a   allocations on.
9b50: 20 20 20 20 2a 2a 20 74 68 65 20 68 65 61 70 2e      ** the heap.
9b60: 20 20 41 6c 73 6f 2c 20 73 69 6e 63 65 20 62 6f    Also, since bo
9b70: 74 68 20 74 68 65 20 6d 61 73 74 65 72 20 61 6e  th the master an
9b80: 64 20 6d 65 6d 73 79 73 20 6c 6f 63 6b 73 20 61  d memsys locks a
9b90: 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 20 20 20  re currently.   
9ba0: 20 2a 2a 20 62 65 69 6e 67 20 68 65 6c 64 20 62   ** being held b
9bb0: 79 20 75 73 2c 20 6e 6f 20 6f 74 68 65 72 20 66  y us, no other f
9bc0: 75 6e 63 74 69 6f 6e 20 28 69 2e 65 2e 20 66 72  unction (i.e. fr
9bd0: 6f 6d 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61  om another threa
9be0: 64 29 20 73 68 6f 75 6c 64 0a 20 20 20 20 2a 2a  d) should.    **
9bf0: 20 62 65 20 61 62 6c 65 20 74 6f 20 65 76 65 6e   be able to even
9c00: 20 61 63 63 65 73 73 20 74 68 65 20 68 65 61 70   access the heap
9c10: 2e 20 20 41 74 74 65 6d 70 74 20 74 6f 20 64 65  .  Attempt to de
9c20: 73 74 72 6f 79 20 61 6e 64 20 72 65 63 72 65 61  stroy and recrea
9c30: 74 65 20 6f 75 72 0a 20 20 20 20 2a 2a 20 69 73  te our.    ** is
9c40: 6f 6c 61 74 65 64 20 57 69 6e 33 32 20 6e 61 74  olated Win32 nat
9c50: 69 76 65 20 68 65 61 70 20 6e 6f 77 2e 0a 20 20  ive heap now..  
9c60: 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
9c70: 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29   winMemGetHeap()
9c80: 21 3d 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 61 73  !=NULL );.    as
9c90: 73 65 72 74 28 20 77 69 6e 4d 65 6d 47 65 74 4f  sert( winMemGetO
9ca0: 77 6e 65 64 28 29 20 29 3b 0a 20 20 20 20 61 73  wned() );.    as
9cb0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 65  sert( sqlite3_me
9cc0: 6d 6f 72 79 5f 75 73 65 64 28 29 3d 3d 30 20 29  mory_used()==0 )
9cd0: 3b 0a 20 20 20 20 77 69 6e 4d 65 6d 53 68 75 74  ;.    winMemShut
9ce0: 64 6f 77 6e 28 77 69 6e 4d 65 6d 47 65 74 44 61  down(winMemGetDa
9cf0: 74 61 50 74 72 28 29 29 3b 0a 20 20 20 20 61 73  taPtr());.    as
9d00: 73 65 72 74 28 20 77 69 6e 4d 65 6d 47 65 74 48  sert( winMemGetH
9d10: 65 61 70 28 29 3d 3d 4e 55 4c 4c 20 29 3b 0a 20  eap()==NULL );. 
9d20: 20 20 20 61 73 73 65 72 74 28 20 21 77 69 6e 4d     assert( !winM
9d30: 65 6d 47 65 74 4f 77 6e 65 64 28 29 20 29 3b 0a  emGetOwned() );.
9d40: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
9d50: 74 65 33 5f 6d 65 6d 6f 72 79 5f 75 73 65 64 28  te3_memory_used(
9d60: 29 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d  )==0 );.    rc =
9d70: 20 77 69 6e 4d 65 6d 49 6e 69 74 28 77 69 6e 4d   winMemInit(winM
9d80: 65 6d 47 65 74 44 61 74 61 50 74 72 28 29 29 3b  emGetDataPtr());
9d90: 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21  .    assert( rc!
9da0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 77 69  =SQLITE_OK || wi
9db0: 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 21 3d 4e  nMemGetHeap()!=N
9dc0: 55 4c 4c 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ULL );.    asser
9dd0: 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
9de0: 20 7c 7c 20 77 69 6e 4d 65 6d 47 65 74 4f 77 6e   || winMemGetOwn
9df0: 65 64 28 29 20 29 3b 0a 20 20 20 20 61 73 73 65  ed() );.    asse
9e00: 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
9e10: 4b 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 65 6d  K || sqlite3_mem
9e20: 6f 72 79 5f 75 73 65 64 28 29 3d 3d 30 20 29 3b  ory_used()==0 );
9e30: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
9e40: 0a 20 20 20 20 2a 2a 20 54 68 65 20 57 69 6e 33  .    ** The Win3
9e50: 32 20 6e 61 74 69 76 65 20 68 65 61 70 20 63 61  2 native heap ca
9e60: 6e 6e 6f 74 20 62 65 20 6d 6f 64 69 66 69 65 64  nnot be modified
9e70: 20 62 65 63 61 75 73 65 20 69 74 20 6d 61 79 20   because it may 
9e80: 62 65 20 69 6e 20 75 73 65 2e 0a 20 20 20 20 2a  be in use..    *
9e90: 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  /.    rc = SQLIT
9ea0: 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 20 20 73 71  E_BUSY;.  }.  sq
9eb0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
9ec0: 65 28 70 4d 65 6d 29 3b 0a 20 20 73 71 6c 69 74  e(pMem);.  sqlit
9ed0: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70  e3_mutex_leave(p
9ee0: 4d 61 73 74 65 72 29 3b 0a 20 20 72 65 74 75 72  Master);.  retur
9ef0: 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  n rc;.}.#endif /
9f00: 2a 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d  * SQLITE_WIN32_M
9f10: 41 4c 4c 4f 43 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ALLOC */../*.** 
9f20: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6f 75  This function ou
9f30: 74 70 75 74 73 20 74 68 65 20 73 70 65 63 69 66  tputs the specif
9f40: 69 65 64 20 28 41 4e 53 49 29 20 73 74 72 69 6e  ied (ANSI) strin
9f50: 67 20 74 6f 20 74 68 65 20 57 69 6e 33 32 20 64  g to the Win32 d
9f60: 65 62 75 67 67 65 72 0a 2a 2a 20 28 69 66 20 61  ebugger.** (if a
9f70: 76 61 69 6c 61 62 6c 65 29 2e 0a 2a 2f 0a 0a 76  vailable)..*/..v
9f80: 6f 69 64 20 73 71 6c 69 74 65 33 5f 77 69 6e 33  oid sqlite3_win3
9f90: 32 5f 77 72 69 74 65 5f 64 65 62 75 67 28 63 6f  2_write_debug(co
9fa0: 6e 73 74 20 63 68 61 72 20 2a 7a 42 75 66 2c 20  nst char *zBuf, 
9fb0: 69 6e 74 20 6e 42 75 66 29 7b 0a 20 20 63 68 61  int nBuf){.  cha
9fc0: 72 20 7a 44 62 67 42 75 66 5b 53 51 4c 49 54 45  r zDbgBuf[SQLITE
9fd0: 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53  _WIN32_DBG_BUF_S
9fe0: 49 5a 45 5d 3b 0a 20 20 69 6e 74 20 6e 4d 69 6e  IZE];.  int nMin
9ff0: 20 3d 20 4d 49 4e 28 6e 42 75 66 2c 20 28 53 51   = MIN(nBuf, (SQ
a000: 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42  LITE_WIN32_DBG_B
a010: 55 46 5f 53 49 5a 45 20 2d 20 31 29 29 3b 20 2f  UF_SIZE - 1)); /
a020: 2a 20 6d 61 79 20 62 65 20 6e 65 67 61 74 69 76  * may be negativ
a030: 65 2e 20 2a 2f 0a 20 20 69 66 28 20 6e 4d 69 6e  e. */.  if( nMin
a040: 3c 2d 31 20 29 20 6e 4d 69 6e 20 3d 20 2d 31 3b  <-1 ) nMin = -1;
a050: 20 2f 2a 20 61 6c 6c 20 6e 65 67 61 74 69 76 65   /* all negative
a060: 20 76 61 6c 75 65 73 20 62 65 63 6f 6d 65 20 2d   values become -
a070: 31 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  1. */.  assert( 
a080: 6e 4d 69 6e 3d 3d 2d 31 20 7c 7c 20 6e 4d 69 6e  nMin==-1 || nMin
a090: 3d 3d 30 20 7c 7c 20 6e 4d 69 6e 3c 53 51 4c 49  ==0 || nMin<SQLI
a0a0: 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46  TE_WIN32_DBG_BUF
a0b0: 5f 53 49 5a 45 20 29 3b 0a 23 69 66 20 64 65 66  _SIZE );.#if def
a0c0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
a0d0: 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 69 66  2_HAS_ANSI).  if
a0e0: 28 20 6e 4d 69 6e 3e 30 20 29 7b 0a 20 20 20 20  ( nMin>0 ){.    
a0f0: 6d 65 6d 73 65 74 28 7a 44 62 67 42 75 66 2c 20  memset(zDbgBuf, 
a100: 30 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  0, SQLITE_WIN32_
a110: 44 42 47 5f 42 55 46 5f 53 49 5a 45 29 3b 0a 20  DBG_BUF_SIZE);. 
a120: 20 20 20 6d 65 6d 63 70 79 28 7a 44 62 67 42 75     memcpy(zDbgBu
a130: 66 2c 20 7a 42 75 66 2c 20 6e 4d 69 6e 29 3b 0a  f, zBuf, nMin);.
a140: 20 20 20 20 6f 73 4f 75 74 70 75 74 44 65 62 75      osOutputDebu
a150: 67 53 74 72 69 6e 67 41 28 7a 44 62 67 42 75 66  gStringA(zDbgBuf
a160: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
a170: 6f 73 4f 75 74 70 75 74 44 65 62 75 67 53 74 72  osOutputDebugStr
a180: 69 6e 67 41 28 7a 42 75 66 29 3b 0a 20 20 7d 0a  ingA(zBuf);.  }.
a190: 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 53 51  #elif defined(SQ
a1a0: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57  LITE_WIN32_HAS_W
a1b0: 49 44 45 29 0a 20 20 6d 65 6d 73 65 74 28 7a 44  IDE).  memset(zD
a1c0: 62 67 42 75 66 2c 20 30 2c 20 53 51 4c 49 54 45  bgBuf, 0, SQLITE
a1d0: 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53  _WIN32_DBG_BUF_S
a1e0: 49 5a 45 29 3b 0a 20 20 69 66 20 28 20 6f 73 4d  IZE);.  if ( osM
a1f0: 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43 68  ultiByteToWideCh
a200: 61 72 28 0a 20 20 20 20 20 20 20 20 20 20 6f 73  ar(.          os
a210: 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49 28  AreFileApisANSI(
a220: 29 20 3f 20 43 50 5f 41 43 50 20 3a 20 43 50 5f  ) ? CP_ACP : CP_
a230: 4f 45 4d 43 50 2c 20 30 2c 20 7a 42 75 66 2c 0a  OEMCP, 0, zBuf,.
a240: 20 20 20 20 20 20 20 20 20 20 6e 4d 69 6e 2c 20            nMin, 
a250: 28 4c 50 57 53 54 52 29 7a 44 62 67 42 75 66 2c  (LPWSTR)zDbgBuf,
a260: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42   SQLITE_WIN32_DB
a270: 47 5f 42 55 46 5f 53 49 5a 45 2f 73 69 7a 65 6f  G_BUF_SIZE/sizeo
a280: 66 28 57 43 48 41 52 29 29 3c 3d 30 20 29 7b 0a  f(WCHAR))<=0 ){.
a290: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
a2a0: 20 20 6f 73 4f 75 74 70 75 74 44 65 62 75 67 53    osOutputDebugS
a2b0: 74 72 69 6e 67 57 28 28 4c 50 43 57 53 54 52 29  tringW((LPCWSTR)
a2c0: 7a 44 62 67 42 75 66 29 3b 0a 23 65 6c 73 65 0a  zDbgBuf);.#else.
a2d0: 20 20 69 66 28 20 6e 4d 69 6e 3e 30 20 29 7b 0a    if( nMin>0 ){.
a2e0: 20 20 20 20 6d 65 6d 73 65 74 28 7a 44 62 67 42      memset(zDbgB
a2f0: 75 66 2c 20 30 2c 20 53 51 4c 49 54 45 5f 57 49  uf, 0, SQLITE_WI
a300: 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45  N32_DBG_BUF_SIZE
a310: 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 44  );.    memcpy(zD
a320: 62 67 42 75 66 2c 20 7a 42 75 66 2c 20 6e 4d 69  bgBuf, zBuf, nMi
a330: 6e 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  n);.    fprintf(
a340: 73 74 64 65 72 72 2c 20 22 25 73 22 2c 20 7a 44  stderr, "%s", zD
a350: 62 67 42 75 66 29 3b 0a 20 20 7d 65 6c 73 65 7b  bgBuf);.  }else{
a360: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64  .    fprintf(std
a370: 65 72 72 2c 20 22 25 73 22 2c 20 7a 42 75 66 29  err, "%s", zBuf)
a380: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a  ;.  }.#endif.}..
a390: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
a3a0: 69 6e 67 20 72 6f 75 74 69 6e 65 20 73 75 73 70  ing routine susp
a3b0: 65 6e 64 73 20 74 68 65 20 63 75 72 72 65 6e 74  ends the current
a3c0: 20 74 68 72 65 61 64 20 66 6f 72 20 61 74 20 6c   thread for at l
a3d0: 65 61 73 74 20 6d 73 0a 2a 2a 20 6d 69 6c 6c 69  east ms.** milli
a3e0: 73 65 63 6f 6e 64 73 2e 20 20 54 68 69 73 20 69  seconds.  This i
a3f0: 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20  s equivalent to 
a400: 74 68 65 20 57 69 6e 33 32 20 53 6c 65 65 70 28  the Win32 Sleep(
a410: 29 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a  ) interface..*/.
a420: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
a430: 4e 52 54 0a 73 74 61 74 69 63 20 48 41 4e 44 4c  NRT.static HANDL
a440: 45 20 73 6c 65 65 70 4f 62 6a 20 3d 20 4e 55 4c  E sleepObj = NUL
a450: 4c 3b 0a 23 65 6e 64 69 66 0a 0a 76 6f 69 64 20  L;.#endif..void 
a460: 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c  sqlite3_win32_sl
a470: 65 65 70 28 44 57 4f 52 44 20 6d 69 6c 6c 69 73  eep(DWORD millis
a480: 65 63 6f 6e 64 73 29 7b 0a 23 69 66 20 53 51 4c  econds){.#if SQL
a490: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 69  ITE_OS_WINRT.  i
a4a0: 66 20 28 20 73 6c 65 65 70 4f 62 6a 3d 3d 4e 55  f ( sleepObj==NU
a4b0: 4c 4c 20 29 7b 0a 20 20 20 20 73 6c 65 65 70 4f  LL ){.    sleepO
a4c0: 62 6a 20 3d 20 6f 73 43 72 65 61 74 65 45 76 65  bj = osCreateEve
a4d0: 6e 74 45 78 57 28 4e 55 4c 4c 2c 20 4e 55 4c 4c  ntExW(NULL, NULL
a4e0: 2c 20 43 52 45 41 54 45 5f 45 56 45 4e 54 5f 4d  , CREATE_EVENT_M
a4f0: 41 4e 55 41 4c 5f 52 45 53 45 54 2c 0a 20 20 20  ANUAL_RESET,.   
a500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a510: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 59 4e               SYN
a520: 43 48 52 4f 4e 49 5a 45 29 3b 0a 20 20 7d 0a 20  CHRONIZE);.  }. 
a530: 20 61 73 73 65 72 74 28 20 73 6c 65 65 70 4f 62   assert( sleepOb
a540: 6a 21 3d 4e 55 4c 4c 20 29 3b 0a 20 20 6f 73 57  j!=NULL );.  osW
a550: 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65  aitForSingleObje
a560: 63 74 45 78 28 73 6c 65 65 70 4f 62 6a 2c 20 6d  ctEx(sleepObj, m
a570: 69 6c 6c 69 73 65 63 6f 6e 64 73 2c 20 46 41 4c  illiseconds, FAL
a580: 53 45 29 3b 0a 23 65 6c 73 65 0a 20 20 6f 73 53  SE);.#else.  osS
a590: 6c 65 65 70 28 6d 69 6c 6c 69 73 65 63 6f 6e 64  leep(millisecond
a5a0: 73 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 69  s);.#endif.}..#i
a5b0: 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52  f SQLITE_MAX_WOR
a5c0: 4b 45 52 5f 54 48 52 45 41 44 53 3e 30 20 26 26  KER_THREADS>0 &&
a5d0: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43   !SQLITE_OS_WINC
a5e0: 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f  E && !SQLITE_OS_
a5f0: 57 49 4e 52 54 20 26 26 20 5c 0a 20 20 20 20 20  WINRT && \.     
a600: 20 20 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44     SQLITE_THREAD
a610: 53 41 46 45 3e 30 0a 44 57 4f 52 44 20 73 71 6c  SAFE>0.DWORD sql
a620: 69 74 65 33 57 69 6e 33 32 57 61 69 74 28 48 41  ite3Win32Wait(HA
a630: 4e 44 4c 45 20 68 4f 62 6a 65 63 74 29 7b 0a 20  NDLE hObject){. 
a640: 20 44 57 4f 52 44 20 72 63 3b 0a 20 20 77 68 69   DWORD rc;.  whi
a650: 6c 65 28 20 28 72 63 20 3d 20 6f 73 57 61 69 74  le( (rc = osWait
a660: 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 45  ForSingleObjectE
a670: 78 28 68 4f 62 6a 65 63 74 2c 20 49 4e 46 49 4e  x(hObject, INFIN
a680: 49 54 45 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ITE,.           
a690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a6a0: 20 20 20 20 20 20 20 20 20 20 20 20 54 52 55 45              TRUE
a6b0: 29 29 3d 3d 57 41 49 54 5f 49 4f 5f 43 4f 4d 50  ))==WAIT_IO_COMP
a6c0: 4c 45 54 49 4f 4e 20 29 7b 7d 0a 20 20 72 65 74  LETION ){}.  ret
a6d0: 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
a6e0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
a6f0: 72 75 65 20 28 6e 6f 6e 2d 7a 65 72 6f 29 20 69  rue (non-zero) i
a700: 66 20 77 65 20 61 72 65 20 72 75 6e 6e 69 6e 67  f we are running
a710: 20 75 6e 64 65 72 20 57 69 6e 4e 54 2c 20 57 69   under WinNT, Wi
a720: 6e 32 4b 2c 20 57 69 6e 58 50 2c 0a 2a 2a 20 6f  n2K, WinXP,.** o
a730: 72 20 57 69 6e 43 45 2e 20 20 52 65 74 75 72 6e  r WinCE.  Return
a740: 20 66 61 6c 73 65 20 28 7a 65 72 6f 29 20 66 6f   false (zero) fo
a750: 72 20 57 69 6e 39 35 2c 20 57 69 6e 39 38 2c 20  r Win95, Win98, 
a760: 6f 72 20 57 69 6e 4d 45 2e 0a 2a 2a 0a 2a 2a 20  or WinME..**.** 
a770: 48 65 72 65 20 69 73 20 61 6e 20 69 6e 74 65 72  Here is an inter
a780: 65 73 74 69 6e 67 20 6f 62 73 65 72 76 61 74 69  esting observati
a790: 6f 6e 3a 20 20 57 69 6e 39 35 2c 20 57 69 6e 39  on:  Win95, Win9
a7a0: 38 2c 20 61 6e 64 20 57 69 6e 4d 45 20 6c 61 63  8, and WinME lac
a7b0: 6b 0a 2a 2a 20 74 68 65 20 4c 6f 63 6b 46 69 6c  k.** the LockFil
a7c0: 65 45 78 28 29 20 41 50 49 2e 20 20 42 75 74 20  eEx() API.  But 
a7d0: 77 65 20 63 61 6e 20 73 74 69 6c 6c 20 73 74 61  we can still sta
a7e0: 74 69 63 61 6c 6c 79 20 6c 69 6e 6b 20 61 67 61  tically link aga
a7f0: 69 6e 73 74 20 74 68 61 74 0a 2a 2a 20 41 50 49  inst that.** API
a800: 20 61 73 20 6c 6f 6e 67 20 61 73 20 77 65 20 64   as long as we d
a810: 6f 6e 27 74 20 63 61 6c 6c 20 69 74 20 77 68 65  on't call it whe
a820: 6e 20 72 75 6e 6e 69 6e 67 20 57 69 6e 39 35 2f  n running Win95/
a830: 39 38 2f 4d 45 2e 20 20 41 20 63 61 6c 6c 20 74  98/ME.  A call t
a840: 6f 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  o.** this routin
a850: 65 20 69 73 20 75 73 65 64 20 74 6f 20 64 65 74  e is used to det
a860: 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20 68 6f  ermine if the ho
a870: 73 74 20 69 73 20 57 69 6e 39 35 2f 39 38 2f 4d  st is Win95/98/M
a880: 45 20 6f 72 0a 2a 2a 20 57 69 6e 4e 54 2f 32 4b  E or.** WinNT/2K
a890: 2f 58 50 20 73 6f 20 74 68 61 74 20 77 65 20 77  /XP so that we w
a8a0: 69 6c 6c 20 6b 6e 6f 77 20 77 68 65 74 68 65 72  ill know whether
a8b0: 20 6f 72 20 6e 6f 74 20 77 65 20 63 61 6e 20 73   or not we can s
a8c0: 61 66 65 6c 79 20 63 61 6c 6c 0a 2a 2a 20 74 68  afely call.** th
a8d0: 65 20 4c 6f 63 6b 46 69 6c 65 45 78 28 29 20 41  e LockFileEx() A
a8e0: 50 49 2e 0a 2a 2f 0a 0a 23 69 66 20 21 64 65 66  PI..*/..#if !def
a8f0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
a900: 32 5f 47 45 54 56 45 52 53 49 4f 4e 45 58 29 20  2_GETVERSIONEX) 
a910: 7c 7c 20 21 53 51 4c 49 54 45 5f 57 49 4e 33 32  || !SQLITE_WIN32
a920: 5f 47 45 54 56 45 52 53 49 4f 4e 45 58 0a 23 20  _GETVERSIONEX.# 
a930: 64 65 66 69 6e 65 20 6f 73 49 73 4e 54 28 29 20  define osIsNT() 
a940: 20 28 31 29 0a 23 65 6c 69 66 20 53 51 4c 49 54   (1).#elif SQLIT
a950: 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 53 51  E_OS_WINCE || SQ
a960: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 7c 7c  LITE_OS_WINRT ||
a970: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
a980: 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29  _WIN32_HAS_ANSI)
a990: 0a 23 20 64 65 66 69 6e 65 20 6f 73 49 73 4e 54  .# define osIsNT
a9a0: 28 29 20 20 28 31 29 0a 23 65 6c 69 66 20 21 64  ()  (1).#elif !d
a9b0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
a9c0: 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 23 20  N32_HAS_WIDE).# 
a9d0: 64 65 66 69 6e 65 20 6f 73 49 73 4e 54 28 29 20  define osIsNT() 
a9e0: 20 28 30 29 0a 23 65 6c 73 65 0a 23 20 64 65 66   (0).#else.# def
a9f0: 69 6e 65 20 6f 73 49 73 4e 54 28 29 20 20 28 28  ine osIsNT()  ((
aa00: 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 3d  sqlite3_os_type=
aa10: 3d 32 29 20 7c 7c 20 73 71 6c 69 74 65 33 5f 77  =2) || sqlite3_w
aa20: 69 6e 33 32 5f 69 73 5f 6e 74 28 29 29 0a 23 65  in32_is_nt()).#e
aa30: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
aa40: 20 66 75 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d   function determ
aa50: 69 6e 65 73 20 69 66 20 74 68 65 20 6d 61 63 68  ines if the mach
aa60: 69 6e 65 20 69 73 20 72 75 6e 6e 69 6e 67 20 61  ine is running a
aa70: 20 76 65 72 73 69 6f 6e 20 6f 66 20 57 69 6e 64   version of Wind
aa80: 6f 77 73 0a 2a 2a 20 62 61 73 65 64 20 6f 6e 20  ows.** based on 
aa90: 74 68 65 20 4e 54 20 6b 65 72 6e 65 6c 2e 0a 2a  the NT kernel..*
aaa0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 69  /.int sqlite3_wi
aab0: 6e 33 32 5f 69 73 5f 6e 74 28 76 6f 69 64 29 7b  n32_is_nt(void){
aac0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
aad0: 49 4e 52 54 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4e  INRT.  /*.  ** N
aae0: 4f 54 45 3a 20 54 68 65 20 57 69 6e 52 54 20 73  OTE: The WinRT s
aaf0: 75 62 2d 70 6c 61 74 66 6f 72 6d 20 69 73 20 61  ub-platform is a
ab00: 6c 77 61 79 73 20 61 73 73 75 6d 65 64 20 74 6f  lways assumed to
ab10: 20 62 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65   be based on the
ab20: 20 4e 54 0a 20 20 2a 2a 20 20 20 20 20 20 20 6b   NT.  **       k
ab30: 65 72 6e 65 6c 2e 0a 20 20 2a 2f 0a 20 20 72 65  ernel..  */.  re
ab40: 74 75 72 6e 20 31 3b 0a 23 65 6c 69 66 20 64 65  turn 1;.#elif de
ab50: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
ab60: 33 32 5f 47 45 54 56 45 52 53 49 4f 4e 45 58 29  32_GETVERSIONEX)
ab70: 20 26 26 20 53 51 4c 49 54 45 5f 57 49 4e 33 32   && SQLITE_WIN32
ab80: 5f 47 45 54 56 45 52 53 49 4f 4e 45 58 0a 20 20  _GETVERSIONEX.  
ab90: 69 66 28 20 6f 73 49 6e 74 65 72 6c 6f 63 6b 65  if( osInterlocke
aba0: 64 43 6f 6d 70 61 72 65 45 78 63 68 61 6e 67 65  dCompareExchange
abb0: 28 26 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70  (&sqlite3_os_typ
abc0: 65 2c 20 30 2c 20 30 29 3d 3d 30 20 29 7b 0a 23  e, 0, 0)==0 ){.#
abd0: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
abe0: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
abf0: 29 0a 20 20 20 20 4f 53 56 45 52 53 49 4f 4e 49  ).    OSVERSIONI
ac00: 4e 46 4f 41 20 73 49 6e 66 6f 3b 0a 20 20 20 20  NFOA sInfo;.    
ac10: 73 49 6e 66 6f 2e 64 77 4f 53 56 65 72 73 69 6f  sInfo.dwOSVersio
ac20: 6e 49 6e 66 6f 53 69 7a 65 20 3d 20 73 69 7a 65  nInfoSize = size
ac30: 6f 66 28 73 49 6e 66 6f 29 3b 0a 20 20 20 20 6f  of(sInfo);.    o
ac40: 73 47 65 74 56 65 72 73 69 6f 6e 45 78 41 28 26  sGetVersionExA(&
ac50: 73 49 6e 66 6f 29 3b 0a 20 20 20 20 6f 73 49 6e  sInfo);.    osIn
ac60: 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72 65  terlockedCompare
ac70: 45 78 63 68 61 6e 67 65 28 26 73 71 6c 69 74 65  Exchange(&sqlite
ac80: 33 5f 6f 73 5f 74 79 70 65 2c 0a 20 20 20 20 20  3_os_type,.     
ac90: 20 20 20 28 73 49 6e 66 6f 2e 64 77 50 6c 61 74     (sInfo.dwPlat
aca0: 66 6f 72 6d 49 64 20 3d 3d 20 56 45 52 5f 50 4c  formId == VER_PL
acb0: 41 54 46 4f 52 4d 5f 57 49 4e 33 32 5f 4e 54 29  ATFORM_WIN32_NT)
acc0: 20 3f 20 32 20 3a 20 31 2c 20 30 29 3b 0a 23 65   ? 2 : 1, 0);.#e
acd0: 6c 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  lif defined(SQLI
ace0: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
acf0: 45 29 0a 20 20 20 20 4f 53 56 45 52 53 49 4f 4e  E).    OSVERSION
ad00: 49 4e 46 4f 57 20 73 49 6e 66 6f 3b 0a 20 20 20  INFOW sInfo;.   
ad10: 20 73 49 6e 66 6f 2e 64 77 4f 53 56 65 72 73 69   sInfo.dwOSVersi
ad20: 6f 6e 49 6e 66 6f 53 69 7a 65 20 3d 20 73 69 7a  onInfoSize = siz
ad30: 65 6f 66 28 73 49 6e 66 6f 29 3b 0a 20 20 20 20  eof(sInfo);.    
ad40: 6f 73 47 65 74 56 65 72 73 69 6f 6e 45 78 57 28  osGetVersionExW(
ad50: 26 73 49 6e 66 6f 29 3b 0a 20 20 20 20 6f 73 49  &sInfo);.    osI
ad60: 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72  nterlockedCompar
ad70: 65 45 78 63 68 61 6e 67 65 28 26 73 71 6c 69 74  eExchange(&sqlit
ad80: 65 33 5f 6f 73 5f 74 79 70 65 2c 0a 20 20 20 20  e3_os_type,.    
ad90: 20 20 20 20 28 73 49 6e 66 6f 2e 64 77 50 6c 61      (sInfo.dwPla
ada0: 74 66 6f 72 6d 49 64 20 3d 3d 20 56 45 52 5f 50  tformId == VER_P
adb0: 4c 41 54 46 4f 52 4d 5f 57 49 4e 33 32 5f 4e 54  LATFORM_WIN32_NT
adc0: 29 20 3f 20 32 20 3a 20 31 2c 20 30 29 3b 0a 23  ) ? 2 : 1, 0);.#
add0: 65 6e 64 69 66 0a 20 20 7d 0a 20 20 72 65 74 75  endif.  }.  retu
ade0: 72 6e 20 6f 73 49 6e 74 65 72 6c 6f 63 6b 65 64  rn osInterlocked
adf0: 43 6f 6d 70 61 72 65 45 78 63 68 61 6e 67 65 28  CompareExchange(
ae00: 26 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65  &sqlite3_os_type
ae10: 2c 20 32 2c 20 32 29 3d 3d 32 3b 0a 23 65 6c 69  , 2, 2)==2;.#eli
ae20: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
ae30: 72 65 74 75 72 6e 20 6f 73 49 6e 74 65 72 6c 6f  return osInterlo
ae40: 63 6b 65 64 43 6f 6d 70 61 72 65 45 78 63 68 61  ckedCompareExcha
ae50: 6e 67 65 28 26 73 71 6c 69 74 65 33 5f 6f 73 5f  nge(&sqlite3_os_
ae60: 74 79 70 65 2c 20 32 2c 20 32 29 3d 3d 32 3b 0a  type, 2, 2)==2;.
ae70: 23 65 6c 73 65 0a 20 20 2f 2a 0a 20 20 2a 2a 20  #else.  /*.  ** 
ae80: 4e 4f 54 45 3a 20 41 6c 6c 20 73 75 62 2d 70 6c  NOTE: All sub-pl
ae90: 61 74 66 6f 72 6d 73 20 77 68 65 72 65 20 74 68  atforms where th
aea0: 65 20 47 65 74 56 65 72 73 69 6f 6e 45 78 5b 41  e GetVersionEx[A
aeb0: 57 5d 20 66 75 6e 63 74 69 6f 6e 73 20 61 72 65  W] functions are
aec0: 0a 20 20 2a 2a 20 20 20 20 20 20 20 64 65 70 72  .  **       depr
aed0: 65 63 61 74 65 64 20 61 72 65 20 61 6c 77 61 79  ecated are alway
aee0: 73 20 61 73 73 75 6d 65 64 20 74 6f 20 62 65 20  s assumed to be 
aef0: 62 61 73 65 64 20 6f 6e 20 74 68 65 20 4e 54 20  based on the NT 
af00: 6b 65 72 6e 65 6c 2e 0a 20 20 2a 2f 0a 20 20 72  kernel..  */.  r
af10: 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a  eturn 1;.#endif.
af20: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
af30: 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 0a 2f 2a  _WIN32_MALLOC./*
af40: 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79  .** Allocate nBy
af50: 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 2e 0a 2a  tes of memory..*
af60: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 77  /.static void *w
af70: 69 6e 4d 65 6d 4d 61 6c 6c 6f 63 28 69 6e 74 20  inMemMalloc(int 
af80: 6e 42 79 74 65 73 29 7b 0a 20 20 48 41 4e 44 4c  nBytes){.  HANDL
af90: 45 20 68 48 65 61 70 3b 0a 20 20 76 6f 69 64 20  E hHeap;.  void 
afa0: 2a 70 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73 73  *p;..  winMemAss
afb0: 65 72 74 4d 61 67 69 63 28 29 3b 0a 20 20 68 48  ertMagic();.  hH
afc0: 65 61 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74 48  eap = winMemGetH
afd0: 65 61 70 28 29 3b 0a 20 20 61 73 73 65 72 74 28  eap();.  assert(
afe0: 20 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61   hHeap!=0 );.  a
aff0: 73 73 65 72 74 28 20 68 48 65 61 70 21 3d 49 4e  ssert( hHeap!=IN
b000: 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c  VALID_HANDLE_VAL
b010: 55 45 20 29 3b 0a 23 69 66 20 21 53 51 4c 49 54  UE );.#if !SQLIT
b020: 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65  E_OS_WINRT && de
b030: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
b040: 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41  32_MALLOC_VALIDA
b050: 54 45 29 0a 20 20 61 73 73 65 72 74 28 20 6f 73  TE).  assert( os
b060: 48 65 61 70 56 61 6c 69 64 61 74 65 28 68 48 65  HeapValidate(hHe
b070: 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ap, SQLITE_WIN32
b080: 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 4e 55 4c  _HEAP_FLAGS, NUL
b090: 4c 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61  L) );.#endif.  a
b0a0: 73 73 65 72 74 28 20 6e 42 79 74 65 73 3e 3d 30  ssert( nBytes>=0
b0b0: 20 29 3b 0a 20 20 70 20 3d 20 6f 73 48 65 61 70   );.  p = osHeap
b0c0: 41 6c 6c 6f 63 28 68 48 65 61 70 2c 20 53 51 4c  Alloc(hHeap, SQL
b0d0: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46  ITE_WIN32_HEAP_F
b0e0: 4c 41 47 53 2c 20 28 53 49 5a 45 5f 54 29 6e 42  LAGS, (SIZE_T)nB
b0f0: 79 74 65 73 29 3b 0a 20 20 69 66 28 20 21 70 20  ytes);.  if( !p 
b100: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c  ){.    sqlite3_l
b110: 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c  og(SQLITE_NOMEM,
b120: 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65 61 70   "failed to Heap
b130: 41 6c 6c 6f 63 20 25 75 20 62 79 74 65 73 20 28  Alloc %u bytes (
b140: 25 6c 75 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a  %lu), heap=%p",.
b150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b160: 6e 42 79 74 65 73 2c 20 6f 73 47 65 74 4c 61 73  nBytes, osGetLas
b170: 74 45 72 72 6f 72 28 29 2c 20 28 76 6f 69 64 2a  tError(), (void*
b180: 29 68 48 65 61 70 29 3b 0a 20 20 7d 0a 20 20 72  )hHeap);.  }.  r
b190: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
b1a0: 2a 20 46 72 65 65 20 6d 65 6d 6f 72 79 2e 0a 2a  * Free memory..*
b1b0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69  /.static void wi
b1c0: 6e 4d 65 6d 46 72 65 65 28 76 6f 69 64 20 2a 70  nMemFree(void *p
b1d0: 50 72 69 6f 72 29 7b 0a 20 20 48 41 4e 44 4c 45  Prior){.  HANDLE
b1e0: 20 68 48 65 61 70 3b 0a 0a 20 20 77 69 6e 4d 65   hHeap;..  winMe
b1f0: 6d 41 73 73 65 72 74 4d 61 67 69 63 28 29 3b 0a  mAssertMagic();.
b200: 20 20 68 48 65 61 70 20 3d 20 77 69 6e 4d 65 6d    hHeap = winMem
b210: 47 65 74 48 65 61 70 28 29 3b 0a 20 20 61 73 73  GetHeap();.  ass
b220: 65 72 74 28 20 68 48 65 61 70 21 3d 30 20 29 3b  ert( hHeap!=0 );
b230: 0a 20 20 61 73 73 65 72 74 28 20 68 48 65 61 70  .  assert( hHeap
b240: 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  !=INVALID_HANDLE
b250: 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66 20 21 53  _VALUE );.#if !S
b260: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26  QLITE_OS_WINRT &
b270: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
b280: 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41  _WIN32_MALLOC_VA
b290: 4c 49 44 41 54 45 29 0a 20 20 61 73 73 65 72 74  LIDATE).  assert
b2a0: 28 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74 65  ( osHeapValidate
b2b0: 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57  (hHeap, SQLITE_W
b2c0: 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c  IN32_HEAP_FLAGS,
b2d0: 20 70 50 72 69 6f 72 29 20 29 3b 0a 23 65 6e 64   pPrior) );.#end
b2e0: 69 66 0a 20 20 69 66 28 20 21 70 50 72 69 6f 72  if.  if( !pPrior
b2f0: 20 29 20 72 65 74 75 72 6e 3b 20 2f 2a 20 50 61   ) return; /* Pa
b300: 73 73 69 6e 67 20 4e 55 4c 4c 20 74 6f 20 48 65  ssing NULL to He
b310: 61 70 46 72 65 65 20 69 73 20 75 6e 64 65 66 69  apFree is undefi
b320: 6e 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 21 6f  ned. */.  if( !o
b330: 73 48 65 61 70 46 72 65 65 28 68 48 65 61 70 2c  sHeapFree(hHeap,
b340: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
b350: 41 50 5f 46 4c 41 47 53 2c 20 70 50 72 69 6f 72  AP_FLAGS, pPrior
b360: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
b370: 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45  _log(SQLITE_NOME
b380: 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65  M, "failed to He
b390: 61 70 46 72 65 65 20 62 6c 6f 63 6b 20 25 70 20  apFree block %p 
b3a0: 28 25 6c 75 29 2c 20 68 65 61 70 3d 25 70 22 2c  (%lu), heap=%p",
b3b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b3c0: 20 70 50 72 69 6f 72 2c 20 6f 73 47 65 74 4c 61   pPrior, osGetLa
b3d0: 73 74 45 72 72 6f 72 28 29 2c 20 28 76 6f 69 64  stError(), (void
b3e0: 2a 29 68 48 65 61 70 29 3b 0a 20 20 7d 0a 7d 0a  *)hHeap);.  }.}.
b3f0: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
b400: 65 20 73 69 7a 65 20 6f 66 20 61 6e 20 65 78 69  e size of an exi
b410: 73 74 69 6e 67 20 6d 65 6d 6f 72 79 20 61 6c 6c  sting memory all
b420: 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69  ocation.*/.stati
b430: 63 20 76 6f 69 64 20 2a 77 69 6e 4d 65 6d 52 65  c void *winMemRe
b440: 61 6c 6c 6f 63 28 76 6f 69 64 20 2a 70 50 72 69  alloc(void *pPri
b450: 6f 72 2c 20 69 6e 74 20 6e 42 79 74 65 73 29 7b  or, int nBytes){
b460: 0a 20 20 48 41 4e 44 4c 45 20 68 48 65 61 70 3b  .  HANDLE hHeap;
b470: 0a 20 20 76 6f 69 64 20 2a 70 3b 0a 0a 20 20 77  .  void *p;..  w
b480: 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63  inMemAssertMagic
b490: 28 29 3b 0a 20 20 68 48 65 61 70 20 3d 20 77 69  ();.  hHeap = wi
b4a0: 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 3b 0a 20  nMemGetHeap();. 
b4b0: 20 61 73 73 65 72 74 28 20 68 48 65 61 70 21 3d   assert( hHeap!=
b4c0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68  0 );.  assert( h
b4d0: 48 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41  Heap!=INVALID_HA
b4e0: 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69  NDLE_VALUE );.#i
b4f0: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
b500: 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  RT && defined(SQ
b510: 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f  LITE_WIN32_MALLO
b520: 43 5f 56 41 4c 49 44 41 54 45 29 0a 20 20 61 73  C_VALIDATE).  as
b530: 73 65 72 74 28 20 6f 73 48 65 61 70 56 61 6c 69  sert( osHeapVali
b540: 64 61 74 65 28 68 48 65 61 70 2c 20 53 51 4c 49  date(hHeap, SQLI
b550: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c  TE_WIN32_HEAP_FL
b560: 41 47 53 2c 20 70 50 72 69 6f 72 29 20 29 3b 0a  AGS, pPrior) );.
b570: 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28  #endif.  assert(
b580: 20 6e 42 79 74 65 73 3e 3d 30 20 29 3b 0a 20 20   nBytes>=0 );.  
b590: 69 66 28 20 21 70 50 72 69 6f 72 20 29 7b 0a 20  if( !pPrior ){. 
b5a0: 20 20 20 70 20 3d 20 6f 73 48 65 61 70 41 6c 6c     p = osHeapAll
b5b0: 6f 63 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45  oc(hHeap, SQLITE
b5c0: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47  _WIN32_HEAP_FLAG
b5d0: 53 2c 20 28 53 49 5a 45 5f 54 29 6e 42 79 74 65  S, (SIZE_T)nByte
b5e0: 73 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  s);.  }else{.   
b5f0: 20 70 20 3d 20 6f 73 48 65 61 70 52 65 41 6c 6c   p = osHeapReAll
b600: 6f 63 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45  oc(hHeap, SQLITE
b610: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47  _WIN32_HEAP_FLAG
b620: 53 2c 20 70 50 72 69 6f 72 2c 20 28 53 49 5a 45  S, pPrior, (SIZE
b630: 5f 54 29 6e 42 79 74 65 73 29 3b 0a 20 20 7d 0a  _T)nBytes);.  }.
b640: 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20    if( !p ){.    
b650: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49  sqlite3_log(SQLI
b660: 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65  TE_NOMEM, "faile
b670: 64 20 74 6f 20 25 73 20 25 75 20 62 79 74 65 73  d to %s %u bytes
b680: 20 28 25 6c 75 29 2c 20 68 65 61 70 3d 25 70 22   (%lu), heap=%p"
b690: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
b6a0: 20 20 70 50 72 69 6f 72 20 3f 20 22 48 65 61 70    pPrior ? "Heap
b6b0: 52 65 41 6c 6c 6f 63 22 20 3a 20 22 48 65 61 70  ReAlloc" : "Heap
b6c0: 41 6c 6c 6f 63 22 2c 20 6e 42 79 74 65 73 2c 20  Alloc", nBytes, 
b6d0: 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
b6e0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
b6f0: 20 20 28 76 6f 69 64 2a 29 68 48 65 61 70 29 3b    (void*)hHeap);
b700: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b  .  }.  return p;
b710: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
b720: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61 6e 20   the size of an 
b730: 6f 75 74 73 74 61 6e 64 69 6e 67 20 61 6c 6c 6f  outstanding allo
b740: 63 61 74 69 6f 6e 2c 20 69 6e 20 62 79 74 65 73  cation, in bytes
b750: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
b760: 77 69 6e 4d 65 6d 53 69 7a 65 28 76 6f 69 64 20  winMemSize(void 
b770: 2a 70 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 48  *p){.  HANDLE hH
b780: 65 61 70 3b 0a 20 20 53 49 5a 45 5f 54 20 6e 3b  eap;.  SIZE_T n;
b790: 0a 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65 72 74  ..  winMemAssert
b7a0: 4d 61 67 69 63 28 29 3b 0a 20 20 68 48 65 61 70  Magic();.  hHeap
b7b0: 20 3d 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70   = winMemGetHeap
b7c0: 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48  ();.  assert( hH
b7d0: 65 61 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  eap!=0 );.  asse
b7e0: 72 74 28 20 68 48 65 61 70 21 3d 49 4e 56 41 4c  rt( hHeap!=INVAL
b7f0: 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20  ID_HANDLE_VALUE 
b800: 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  );.#if !SQLITE_O
b810: 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e  S_WINRT && defin
b820: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
b830: 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29  MALLOC_VALIDATE)
b840: 0a 20 20 61 73 73 65 72 74 28 20 6f 73 48 65 61  .  assert( osHea
b850: 70 56 61 6c 69 64 61 74 65 28 68 48 65 61 70 2c  pValidate(hHeap,
b860: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
b870: 41 50 5f 46 4c 41 47 53 2c 20 70 29 20 29 3b 0a  AP_FLAGS, p) );.
b880: 23 65 6e 64 69 66 0a 20 20 69 66 28 20 21 70 20  #endif.  if( !p 
b890: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 20  ) return 0;.  n 
b8a0: 3d 20 6f 73 48 65 61 70 53 69 7a 65 28 68 48 65  = osHeapSize(hHe
b8b0: 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ap, SQLITE_WIN32
b8c0: 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 70 29 3b  _HEAP_FLAGS, p);
b8d0: 0a 20 20 69 66 28 20 6e 3d 3d 28 53 49 5a 45 5f  .  if( n==(SIZE_
b8e0: 54 29 2d 31 20 29 7b 0a 20 20 20 20 73 71 6c 69  T)-1 ){.    sqli
b8f0: 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e  te3_log(SQLITE_N
b900: 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f  OMEM, "failed to
b910: 20 48 65 61 70 53 69 7a 65 20 62 6c 6f 63 6b 20   HeapSize block 
b920: 25 70 20 28 25 6c 75 29 2c 20 68 65 61 70 3d 25  %p (%lu), heap=%
b930: 70 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  p",.            
b940: 20 20 20 20 70 2c 20 6f 73 47 65 74 4c 61 73 74      p, osGetLast
b950: 45 72 72 6f 72 28 29 2c 20 28 76 6f 69 64 2a 29  Error(), (void*)
b960: 68 48 65 61 70 29 3b 0a 20 20 20 20 72 65 74 75  hHeap);.    retu
b970: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 0;.  }.  retu
b980: 72 6e 20 28 69 6e 74 29 6e 3b 0a 7d 0a 0a 2f 2a  rn (int)n;.}../*
b990: 0a 2a 2a 20 52 6f 75 6e 64 20 75 70 20 61 20 72  .** Round up a r
b9a0: 65 71 75 65 73 74 20 73 69 7a 65 20 74 6f 20 74  equest size to t
b9b0: 68 65 20 6e 65 78 74 20 76 61 6c 69 64 20 61 6c  he next valid al
b9c0: 6c 6f 63 61 74 69 6f 6e 20 73 69 7a 65 2e 0a 2a  location size..*
b9d0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
b9e0: 4d 65 6d 52 6f 75 6e 64 75 70 28 69 6e 74 20 6e  MemRoundup(int n
b9f0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d  ){.  return n;.}
ba00: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
ba10: 7a 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 2e 0a  ze this module..
ba20: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
ba30: 6e 4d 65 6d 49 6e 69 74 28 76 6f 69 64 20 2a 70  nMemInit(void *p
ba40: 41 70 70 44 61 74 61 29 7b 0a 20 20 77 69 6e 4d  AppData){.  winM
ba50: 65 6d 44 61 74 61 20 2a 70 57 69 6e 4d 65 6d 44  emData *pWinMemD
ba60: 61 74 61 20 3d 20 28 77 69 6e 4d 65 6d 44 61 74  ata = (winMemDat
ba70: 61 20 2a 29 70 41 70 70 44 61 74 61 3b 0a 0a 20  a *)pAppData;.. 
ba80: 20 69 66 28 20 21 70 57 69 6e 4d 65 6d 44 61 74   if( !pWinMemDat
ba90: 61 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  a ) return SQLIT
baa0: 45 5f 45 52 52 4f 52 3b 0a 20 20 61 73 73 65 72  E_ERROR;.  asser
bab0: 74 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e  t( pWinMemData->
bac0: 6d 61 67 69 63 31 3d 3d 57 49 4e 4d 45 4d 5f 4d  magic1==WINMEM_M
bad0: 41 47 49 43 31 20 29 3b 0a 20 20 61 73 73 65 72  AGIC1 );.  asser
bae0: 74 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e  t( pWinMemData->
baf0: 6d 61 67 69 63 32 3d 3d 57 49 4e 4d 45 4d 5f 4d  magic2==WINMEM_M
bb00: 41 47 49 43 32 20 29 3b 0a 0a 23 69 66 20 21 53  AGIC2 );..#if !S
bb10: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26  QLITE_OS_WINRT &
bb20: 26 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  & SQLITE_WIN32_H
bb30: 45 41 50 5f 43 52 45 41 54 45 0a 20 20 69 66 28  EAP_CREATE.  if(
bb40: 20 21 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68   !pWinMemData->h
bb50: 48 65 61 70 20 29 7b 0a 20 20 20 20 44 57 4f 52  Heap ){.    DWOR
bb60: 44 20 64 77 49 6e 69 74 69 61 6c 53 69 7a 65 20  D dwInitialSize 
bb70: 3d 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  = SQLITE_WIN32_H
bb80: 45 41 50 5f 49 4e 49 54 5f 53 49 5a 45 3b 0a 20  EAP_INIT_SIZE;. 
bb90: 20 20 20 44 57 4f 52 44 20 64 77 4d 61 78 69 6d     DWORD dwMaxim
bba0: 75 6d 53 69 7a 65 20 3d 20 28 44 57 4f 52 44 29  umSize = (DWORD)
bbb0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
bbc0: 66 69 67 2e 6e 48 65 61 70 3b 0a 20 20 20 20 69  fig.nHeap;.    i
bbd0: 66 28 20 64 77 4d 61 78 69 6d 75 6d 53 69 7a 65  f( dwMaximumSize
bbe0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 64 77 4d  ==0 ){.      dwM
bbf0: 61 78 69 6d 75 6d 53 69 7a 65 20 3d 20 53 51 4c  aximumSize = SQL
bc00: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 4d  ITE_WIN32_HEAP_M
bc10: 41 58 5f 53 49 5a 45 3b 0a 20 20 20 20 7d 65 6c  AX_SIZE;.    }el
bc20: 73 65 20 69 66 28 20 64 77 49 6e 69 74 69 61 6c  se if( dwInitial
bc30: 53 69 7a 65 3e 64 77 4d 61 78 69 6d 75 6d 53 69  Size>dwMaximumSi
bc40: 7a 65 20 29 7b 0a 20 20 20 20 20 20 64 77 49 6e  ze ){.      dwIn
bc50: 69 74 69 61 6c 53 69 7a 65 20 3d 20 64 77 4d 61  itialSize = dwMa
bc60: 78 69 6d 75 6d 53 69 7a 65 3b 0a 20 20 20 20 7d  ximumSize;.    }
bc70: 0a 20 20 20 20 70 57 69 6e 4d 65 6d 44 61 74 61  .    pWinMemData
bc80: 2d 3e 68 48 65 61 70 20 3d 20 6f 73 48 65 61 70  ->hHeap = osHeap
bc90: 43 72 65 61 74 65 28 53 51 4c 49 54 45 5f 57 49  Create(SQLITE_WI
bca0: 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 0a  N32_HEAP_FLAGS,.
bcb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bcc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bcd0: 20 20 20 20 20 20 64 77 49 6e 69 74 69 61 6c 53        dwInitialS
bce0: 69 7a 65 2c 20 64 77 4d 61 78 69 6d 75 6d 53 69  ize, dwMaximumSi
bcf0: 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70 57  ze);.    if( !pW
bd00: 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70  inMemData->hHeap
bd10: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
bd20: 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d  3_log(SQLITE_NOM
bd30: 45 4d 2c 0a 20 20 20 20 20 20 20 20 20 20 22 66  EM,.          "f
bd40: 61 69 6c 65 64 20 74 6f 20 48 65 61 70 43 72 65  ailed to HeapCre
bd50: 61 74 65 20 28 25 6c 75 29 2c 20 66 6c 61 67 73  ate (%lu), flags
bd60: 3d 25 75 2c 20 69 6e 69 74 53 69 7a 65 3d 25 6c  =%u, initSize=%l
bd70: 75 2c 20 6d 61 78 53 69 7a 65 3d 25 6c 75 22 2c  u, maxSize=%lu",
bd80: 0a 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74  .          osGet
bd90: 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 53 51 4c  LastError(), SQL
bda0: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46  ITE_WIN32_HEAP_F
bdb0: 4c 41 47 53 2c 20 64 77 49 6e 69 74 69 61 6c 53  LAGS, dwInitialS
bdc0: 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20 64  ize,.          d
bdd0: 77 4d 61 78 69 6d 75 6d 53 69 7a 65 29 3b 0a 20  wMaximumSize);. 
bde0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
bdf0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
be00: 20 20 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d      pWinMemData-
be10: 3e 62 4f 77 6e 65 64 20 3d 20 54 52 55 45 3b 0a  >bOwned = TRUE;.
be20: 20 20 20 20 61 73 73 65 72 74 28 20 70 57 69 6e      assert( pWin
be30: 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20  MemData->bOwned 
be40: 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 70  );.  }.#else.  p
be50: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61  WinMemData->hHea
be60: 70 20 3d 20 6f 73 47 65 74 50 72 6f 63 65 73 73  p = osGetProcess
be70: 48 65 61 70 28 29 3b 0a 20 20 69 66 28 20 21 70  Heap();.  if( !p
be80: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61  WinMemData->hHea
be90: 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  p ){.    sqlite3
bea0: 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45  _log(SQLITE_NOME
beb0: 4d 2c 0a 20 20 20 20 20 20 20 20 22 66 61 69 6c  M,.        "fail
bec0: 65 64 20 74 6f 20 47 65 74 50 72 6f 63 65 73 73  ed to GetProcess
bed0: 48 65 61 70 20 28 25 6c 75 29 22 2c 20 6f 73 47  Heap (%lu)", osG
bee0: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29 3b 0a  etLastError());.
bef0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
bf00: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70  E_NOMEM;.  }.  p
bf10: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e  WinMemData->bOwn
bf20: 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20 61 73  ed = FALSE;.  as
bf30: 73 65 72 74 28 20 21 70 57 69 6e 4d 65 6d 44 61  sert( !pWinMemDa
bf40: 74 61 2d 3e 62 4f 77 6e 65 64 20 29 3b 0a 23 65  ta->bOwned );.#e
bf50: 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 70  ndif.  assert( p
bf60: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61  WinMemData->hHea
bf70: 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  p!=0 );.  assert
bf80: 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68  ( pWinMemData->h
bf90: 48 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41  Heap!=INVALID_HA
bfa0: 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69  NDLE_VALUE );.#i
bfb0: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
bfc0: 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  RT && defined(SQ
bfd0: 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f  LITE_WIN32_MALLO
bfe0: 43 5f 56 41 4c 49 44 41 54 45 29 0a 20 20 61 73  C_VALIDATE).  as
bff0: 73 65 72 74 28 20 6f 73 48 65 61 70 56 61 6c 69  sert( osHeapVali
c000: 64 61 74 65 28 70 57 69 6e 4d 65 6d 44 61 74 61  date(pWinMemData
c010: 2d 3e 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f  ->hHeap, SQLITE_
c020: 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53  WIN32_HEAP_FLAGS
c030: 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23 65 6e 64 69  , NULL) );.#endi
c040: 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  f.  return SQLIT
c050: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  E_OK;.}../*.** D
c060: 65 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 69 73  einitialize this
c070: 20 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a 73 74 61 74   module..*/.stat
c080: 69 63 20 76 6f 69 64 20 77 69 6e 4d 65 6d 53 68  ic void winMemSh
c090: 75 74 64 6f 77 6e 28 76 6f 69 64 20 2a 70 41 70  utdown(void *pAp
c0a0: 70 44 61 74 61 29 7b 0a 20 20 77 69 6e 4d 65 6d  pData){.  winMem
c0b0: 44 61 74 61 20 2a 70 57 69 6e 4d 65 6d 44 61 74  Data *pWinMemDat
c0c0: 61 20 3d 20 28 77 69 6e 4d 65 6d 44 61 74 61 20  a = (winMemData 
c0d0: 2a 29 70 41 70 70 44 61 74 61 3b 0a 0a 20 20 69  *)pAppData;..  i
c0e0: 66 28 20 21 70 57 69 6e 4d 65 6d 44 61 74 61 20  f( !pWinMemData 
c0f0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
c100: 72 74 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d  rt( pWinMemData-
c110: 3e 6d 61 67 69 63 31 3d 3d 57 49 4e 4d 45 4d 5f  >magic1==WINMEM_
c120: 4d 41 47 49 43 31 20 29 3b 0a 20 20 61 73 73 65  MAGIC1 );.  asse
c130: 72 74 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d  rt( pWinMemData-
c140: 3e 6d 61 67 69 63 32 3d 3d 57 49 4e 4d 45 4d 5f  >magic2==WINMEM_
c150: 4d 41 47 49 43 32 20 29 3b 0a 0a 20 20 69 66 28  MAGIC2 );..  if(
c160: 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48   pWinMemData->hH
c170: 65 61 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72  eap ){.    asser
c180: 74 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e  t( pWinMemData->
c190: 68 48 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48  hHeap!=INVALID_H
c1a0: 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23  ANDLE_VALUE );.#
c1b0: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
c1c0: 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53  NRT && defined(S
c1d0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c  QLITE_WIN32_MALL
c1e0: 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a 20 20 20  OC_VALIDATE).   
c1f0: 20 61 73 73 65 72 74 28 20 6f 73 48 65 61 70 56   assert( osHeapV
c200: 61 6c 69 64 61 74 65 28 70 57 69 6e 4d 65 6d 44  alidate(pWinMemD
c210: 61 74 61 2d 3e 68 48 65 61 70 2c 20 53 51 4c 49  ata->hHeap, SQLI
c220: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c  TE_WIN32_HEAP_FL
c230: 41 47 53 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23 65  AGS, NULL) );.#e
c240: 6e 64 69 66 0a 20 20 20 20 69 66 28 20 70 57 69  ndif.    if( pWi
c250: 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64  nMemData->bOwned
c260: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 6f   ){.      if( !o
c270: 73 48 65 61 70 44 65 73 74 72 6f 79 28 70 57 69  sHeapDestroy(pWi
c280: 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 29  nMemData->hHeap)
c290: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
c2a0: 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e  te3_log(SQLITE_N
c2b0: 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f  OMEM, "failed to
c2c0: 20 48 65 61 70 44 65 73 74 72 6f 79 20 28 25 6c   HeapDestroy (%l
c2d0: 75 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20  u), heap=%p",.  
c2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c2f0: 20 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72    osGetLastError
c300: 28 29 2c 20 28 76 6f 69 64 2a 29 70 57 69 6e 4d  (), (void*)pWinM
c310: 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 29 3b 0a  emData->hHeap);.
c320: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 57        }.      pW
c330: 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65  inMemData->bOwne
c340: 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d  d = FALSE;.    }
c350: 0a 20 20 20 20 70 57 69 6e 4d 65 6d 44 61 74 61  .    pWinMemData
c360: 2d 3e 68 48 65 61 70 20 3d 20 4e 55 4c 4c 3b 0a  ->hHeap = NULL;.
c370: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70    }.}../*.** Pop
c380: 75 6c 61 74 65 20 74 68 65 20 6c 6f 77 2d 6c 65  ulate the low-le
c390: 76 65 6c 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  vel memory alloc
c3a0: 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 70  ation function p
c3b0: 6f 69 6e 74 65 72 73 20 69 6e 0a 2a 2a 20 73 71  ointers in.** sq
c3c0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
c3d0: 67 2e 6d 20 77 69 74 68 20 70 6f 69 6e 74 65 72  g.m with pointer
c3e0: 73 20 74 6f 20 74 68 65 20 72 6f 75 74 69 6e 65  s to the routine
c3f0: 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 2e 20  s in this file. 
c400: 54 68 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73  The.** arguments
c410: 20 73 70 65 63 69 66 79 20 74 68 65 20 62 6c 6f   specify the blo
c420: 63 6b 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20  ck of memory to 
c430: 6d 61 6e 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  manage..**.** Th
c440: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e  is routine is on
c450: 6c 79 20 63 61 6c 6c 65 64 20 62 79 20 73 71 6c  ly called by sql
c460: 69 74 65 33 5f 63 6f 6e 66 69 67 28 29 2c 20 61  ite3_config(), a
c470: 6e 64 20 74 68 65 72 65 66 6f 72 65 0a 2a 2a 20  nd therefore.** 
c480: 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20  is not required 
c490: 74 6f 20 62 65 20 74 68 72 65 61 64 73 61 66 65  to be threadsafe
c4a0: 20 28 69 74 20 69 73 20 6e 6f 74 29 2e 0a 2a 2f   (it is not)..*/
c4b0: 0a 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d  .const sqlite3_m
c4c0: 65 6d 5f 6d 65 74 68 6f 64 73 20 2a 73 71 6c 69  em_methods *sqli
c4d0: 74 65 33 4d 65 6d 47 65 74 57 69 6e 33 32 28 76  te3MemGetWin32(v
c4e0: 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20 63  oid){.  static c
c4f0: 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 65 6d  onst sqlite3_mem
c500: 5f 6d 65 74 68 6f 64 73 20 77 69 6e 4d 65 6d 4d  _methods winMemM
c510: 65 74 68 6f 64 73 20 3d 20 7b 0a 20 20 20 20 77  ethods = {.    w
c520: 69 6e 4d 65 6d 4d 61 6c 6c 6f 63 2c 0a 20 20 20  inMemMalloc,.   
c530: 20 77 69 6e 4d 65 6d 46 72 65 65 2c 0a 20 20 20   winMemFree,.   
c540: 20 77 69 6e 4d 65 6d 52 65 61 6c 6c 6f 63 2c 0a   winMemRealloc,.
c550: 20 20 20 20 77 69 6e 4d 65 6d 53 69 7a 65 2c 0a      winMemSize,.
c560: 20 20 20 20 77 69 6e 4d 65 6d 52 6f 75 6e 64 75      winMemRoundu
c570: 70 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 49 6e 69  p,.    winMemIni
c580: 74 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 53 68 75  t,.    winMemShu
c590: 74 64 6f 77 6e 2c 0a 20 20 20 20 26 77 69 6e 5f  tdown,.    &win_
c5a0: 6d 65 6d 5f 64 61 74 61 0a 20 20 7d 3b 0a 20 20  mem_data.  };.  
c5b0: 72 65 74 75 72 6e 20 26 77 69 6e 4d 65 6d 4d 65  return &winMemMe
c5c0: 74 68 6f 64 73 3b 0a 7d 0a 0a 76 6f 69 64 20 73  thods;.}..void s
c5d0: 71 6c 69 74 65 33 4d 65 6d 53 65 74 44 65 66 61  qlite3MemSetDefa
c5e0: 75 6c 74 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c  ult(void){.  sql
c5f0: 69 74 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49  ite3_config(SQLI
c600: 54 45 5f 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f 43  TE_CONFIG_MALLOC
c610: 2c 20 73 71 6c 69 74 65 33 4d 65 6d 47 65 74 57  , sqlite3MemGetW
c620: 69 6e 33 32 28 29 29 3b 0a 7d 0a 23 65 6e 64 69  in32());.}.#endi
c630: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 57 49 4e 33  f /* SQLITE_WIN3
c640: 32 5f 4d 41 4c 4c 4f 43 20 2a 2f 0a 0a 2f 2a 0a  2_MALLOC */../*.
c650: 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 55 54 46  ** Convert a UTF
c660: 2d 38 20 73 74 72 69 6e 67 20 74 6f 20 4d 69 63  -8 string to Mic
c670: 72 6f 73 6f 66 74 20 55 6e 69 63 6f 64 65 20 28  rosoft Unicode (
c680: 55 54 46 2d 31 36 3f 29 2e 0a 2a 2a 0a 2a 2a 20  UTF-16?)..**.** 
c690: 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68  Space to hold th
c6a0: 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e  e returned strin
c6b0: 67 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72  g is obtained fr
c6c0: 6f 6d 20 6d 61 6c 6c 6f 63 2e 0a 2a 2f 0a 73 74  om malloc..*/.st
c6d0: 61 74 69 63 20 4c 50 57 53 54 52 20 77 69 6e 55  atic LPWSTR winU
c6e0: 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 63 6f 6e  tf8ToUnicode(con
c6f0: 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
c700: 6d 65 29 7b 0a 20 20 69 6e 74 20 6e 43 68 61 72  me){.  int nChar
c710: 3b 0a 20 20 4c 50 57 53 54 52 20 7a 57 69 64 65  ;.  LPWSTR zWide
c720: 46 69 6c 65 6e 61 6d 65 3b 0a 0a 20 20 6e 43 68  Filename;..  nCh
c730: 61 72 20 3d 20 6f 73 4d 75 6c 74 69 42 79 74 65  ar = osMultiByte
c740: 54 6f 57 69 64 65 43 68 61 72 28 43 50 5f 55 54  ToWideChar(CP_UT
c750: 46 38 2c 20 30 2c 20 7a 46 69 6c 65 6e 61 6d 65  F8, 0, zFilename
c760: 2c 20 2d 31 2c 20 4e 55 4c 4c 2c 20 30 29 3b 0a  , -1, NULL, 0);.
c770: 20 20 69 66 28 20 6e 43 68 61 72 3d 3d 30 20 29    if( nChar==0 )
c780: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
c790: 20 20 7d 0a 20 20 7a 57 69 64 65 46 69 6c 65 6e    }.  zWideFilen
c7a0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  ame = sqlite3Mal
c7b0: 6c 6f 63 5a 65 72 6f 28 20 6e 43 68 61 72 2a 73  locZero( nChar*s
c7c0: 69 7a 65 6f 66 28 7a 57 69 64 65 46 69 6c 65 6e  izeof(zWideFilen
c7d0: 61 6d 65 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28  ame[0]) );.  if(
c7e0: 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 3d 3d   zWideFilename==
c7f0: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
c800: 30 3b 0a 20 20 7d 0a 20 20 6e 43 68 61 72 20 3d  0;.  }.  nChar =
c810: 20 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f 57 69   osMultiByteToWi
c820: 64 65 43 68 61 72 28 43 50 5f 55 54 46 38 2c 20  deChar(CP_UTF8, 
c830: 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31  0, zFilename, -1
c840: 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c  , zWideFilename,
c850: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
c860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c870: 20 6e 43 68 61 72 29 3b 0a 20 20 69 66 28 20 6e   nChar);.  if( n
c880: 43 68 61 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73  Char==0 ){.    s
c890: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 57 69 64  qlite3_free(zWid
c8a0: 65 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  eFilename);.    
c8b0: 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 20 3d 20  zWideFilename = 
c8c0: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
c8d0: 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 3b 0a 7d  zWideFilename;.}
c8e0: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  ../*.** Convert 
c8f0: 4d 69 63 72 6f 73 6f 66 74 20 55 6e 69 63 6f 64  Microsoft Unicod
c900: 65 20 74 6f 20 55 54 46 2d 38 2e 20 20 53 70 61  e to UTF-8.  Spa
c910: 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72  ce to hold the r
c920: 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69  eturned string i
c930: 73 0a 2a 2a 20 6f 62 74 61 69 6e 65 64 20 66 72  s.** obtained fr
c940: 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  om sqlite3_mallo
c950: 63 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  c()..*/.static c
c960: 68 61 72 20 2a 77 69 6e 55 6e 69 63 6f 64 65 54  har *winUnicodeT
c970: 6f 55 74 66 38 28 4c 50 43 57 53 54 52 20 7a 57  oUtf8(LPCWSTR zW
c980: 69 64 65 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20  ideFilename){.  
c990: 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 63 68 61  int nByte;.  cha
c9a0: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a 0a 20  r *zFilename;.. 
c9b0: 20 6e 42 79 74 65 20 3d 20 6f 73 57 69 64 65 43   nByte = osWideC
c9c0: 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 28 43  harToMultiByte(C
c9d0: 50 5f 55 54 46 38 2c 20 30 2c 20 7a 57 69 64 65  P_UTF8, 0, zWide
c9e0: 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 30 2c  Filename, -1, 0,
c9f0: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28   0, 0, 0);.  if(
ca00: 20 6e 42 79 74 65 20 3d 3d 20 30 20 29 7b 0a 20   nByte == 0 ){. 
ca10: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
ca20: 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 73  .  zFilename = s
ca30: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
ca40: 28 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28  ( nByte );.  if(
ca50: 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b   zFilename==0 ){
ca60: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
ca70: 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73 57   }.  nByte = osW
ca80: 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79  ideCharToMultiBy
ca90: 74 65 28 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a  te(CP_UTF8, 0, z
caa0: 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c 20 2d 31  WideFilename, -1
cab0: 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 42 79  , zFilename, nBy
cac0: 74 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  te,.            
cad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cae0: 20 20 20 20 30 2c 20 30 29 3b 0a 20 20 69 66 28      0, 0);.  if(
caf0: 20 6e 42 79 74 65 20 3d 3d 20 30 20 29 7b 0a 20   nByte == 0 ){. 
cb00: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
cb10: 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  zFilename);.    
cb20: 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20  zFilename = 0;. 
cb30: 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 46 69 6c   }.  return zFil
cb40: 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ename;.}../*.** 
cb50: 43 6f 6e 76 65 72 74 20 61 6e 20 41 4e 53 49 20  Convert an ANSI 
cb60: 73 74 72 69 6e 67 20 74 6f 20 4d 69 63 72 6f 73  string to Micros
cb70: 6f 66 74 20 55 6e 69 63 6f 64 65 2c 20 62 61 73  oft Unicode, bas
cb80: 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 63 75 72  ed on the.** cur
cb90: 72 65 6e 74 20 63 6f 64 65 70 61 67 65 20 73 65  rent codepage se
cba0: 74 74 69 6e 67 73 20 66 6f 72 20 66 69 6c 65 20  ttings for file 
cbb0: 61 70 69 73 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63  apis..**.** Spac
cbc0: 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65  e to hold the re
cbd0: 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73  turned string is
cbe0: 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 66 72 6f   obtained.** fro
cbf0: 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  m sqlite3_malloc
cc00: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4c 50 57 53  ..*/.static LPWS
cc10: 54 52 20 77 69 6e 4d 62 63 73 54 6f 55 6e 69 63  TR winMbcsToUnic
cc20: 6f 64 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ode(const char *
cc30: 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 6e  zFilename){.  in
cc40: 74 20 6e 42 79 74 65 3b 0a 20 20 4c 50 57 53 54  t nByte;.  LPWST
cc50: 52 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 3b  R zMbcsFilename;
cc60: 0a 20 20 69 6e 74 20 63 6f 64 65 70 61 67 65 20  .  int codepage 
cc70: 3d 20 6f 73 41 72 65 46 69 6c 65 41 70 69 73 41  = osAreFileApisA
cc80: 4e 53 49 28 29 20 3f 20 43 50 5f 41 43 50 20 3a  NSI() ? CP_ACP :
cc90: 20 43 50 5f 4f 45 4d 43 50 3b 0a 0a 20 20 6e 42   CP_OEMCP;..  nB
cca0: 79 74 65 20 3d 20 6f 73 4d 75 6c 74 69 42 79 74  yte = osMultiByt
ccb0: 65 54 6f 57 69 64 65 43 68 61 72 28 63 6f 64 65  eToWideChar(code
ccc0: 70 61 67 65 2c 20 30 2c 20 7a 46 69 6c 65 6e 61  page, 0, zFilena
ccd0: 6d 65 2c 20 2d 31 2c 20 4e 55 4c 4c 2c 0a 20 20  me, -1, NULL,.  
cce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ccf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 29                0)
cd00: 2a 73 69 7a 65 6f 66 28 57 43 48 41 52 29 3b 0a  *sizeof(WCHAR);.
cd10: 20 20 69 66 28 20 6e 42 79 74 65 3d 3d 30 20 29    if( nByte==0 )
cd20: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
cd30: 20 20 7d 0a 20 20 7a 4d 62 63 73 46 69 6c 65 6e    }.  zMbcsFilen
cd40: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  ame = sqlite3Mal
cd50: 6c 6f 63 5a 65 72 6f 28 20 6e 42 79 74 65 2a 73  locZero( nByte*s
cd60: 69 7a 65 6f 66 28 7a 4d 62 63 73 46 69 6c 65 6e  izeof(zMbcsFilen
cd70: 61 6d 65 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28  ame[0]) );.  if(
cd80: 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 3d 3d   zMbcsFilename==
cd90: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
cda0: 30 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d  0;.  }.  nByte =
cdb0: 20 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f 57 69   osMultiByteToWi
cdc0: 64 65 43 68 61 72 28 63 6f 64 65 70 61 67 65 2c  deChar(codepage,
cdd0: 20 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d   0, zFilename, -
cde0: 31 2c 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65  1, zMbcsFilename
cdf0: 2c 0a 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 20                  
ce10: 20 20 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20    nByte);.  if( 
ce20: 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nByte==0 ){.    
ce30: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 62  sqlite3_free(zMb
ce40: 63 73 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  csFilename);.   
ce50: 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 20 3d   zMbcsFilename =
ce60: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
ce70: 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 3b 0a   zMbcsFilename;.
ce80: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  }../*.** Convert
ce90: 20 4d 69 63 72 6f 73 6f 66 74 20 55 6e 69 63 6f   Microsoft Unico
cea0: 64 65 20 74 6f 20 6d 75 6c 74 69 2d 62 79 74 65  de to multi-byte
ceb0: 20 63 68 61 72 61 63 74 65 72 20 73 74 72 69 6e   character strin
cec0: 67 2c 20 62 61 73 65 64 20 6f 6e 20 74 68 65 0a  g, based on the.
ced0: 2a 2a 20 75 73 65 72 27 73 20 41 4e 53 49 20 63  ** user's ANSI c
cee0: 6f 64 65 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 53  odepage..**.** S
cef0: 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  pace to hold the
cf00: 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67   returned string
cf10: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   is obtained fro
cf20: 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c  m.** sqlite3_mal
cf30: 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  loc()..*/.static
cf40: 20 63 68 61 72 20 2a 77 69 6e 55 6e 69 63 6f 64   char *winUnicod
cf50: 65 54 6f 4d 62 63 73 28 4c 50 43 57 53 54 52 20  eToMbcs(LPCWSTR 
cf60: 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 29 7b 0a  zWideFilename){.
cf70: 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 63    int nByte;.  c
cf80: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a  har *zFilename;.
cf90: 20 20 69 6e 74 20 63 6f 64 65 70 61 67 65 20 3d    int codepage =
cfa0: 20 6f 73 41 72 65 46 69 6c 65 41 70 69 73 41 4e   osAreFileApisAN
cfb0: 53 49 28 29 20 3f 20 43 50 5f 41 43 50 20 3a 20  SI() ? CP_ACP : 
cfc0: 43 50 5f 4f 45 4d 43 50 3b 0a 0a 20 20 6e 42 79  CP_OEMCP;..  nBy
cfd0: 74 65 20 3d 20 6f 73 57 69 64 65 43 68 61 72 54  te = osWideCharT
cfe0: 6f 4d 75 6c 74 69 42 79 74 65 28 63 6f 64 65 70  oMultiByte(codep
cff0: 61 67 65 2c 20 30 2c 20 7a 57 69 64 65 46 69 6c  age, 0, zWideFil
d000: 65 6e 61 6d 65 2c 20 2d 31 2c 20 30 2c 20 30 2c  ename, -1, 0, 0,
d010: 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e 42   0, 0);.  if( nB
d020: 79 74 65 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20  yte == 0 ){.    
d030: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
d040: 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c 69  zFilename = sqli
d050: 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e  te3MallocZero( n
d060: 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20 7a 46  Byte );.  if( zF
d070: 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  ilename==0 ){.  
d080: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
d090: 20 20 6e 42 79 74 65 20 3d 20 6f 73 57 69 64 65    nByte = osWide
d0a0: 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 28  CharToMultiByte(
d0b0: 63 6f 64 65 70 61 67 65 2c 20 30 2c 20 7a 57 69  codepage, 0, zWi
d0c0: 64 65 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20  deFilename, -1, 
d0d0: 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20  zFilename,.     
d0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d0f0: 20 20 20 20 20 20 20 20 20 20 20 6e 42 79 74 65             nByte
d100: 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e  , 0, 0);.  if( n
d110: 42 79 74 65 20 3d 3d 20 30 20 29 7b 0a 20 20 20  Byte == 0 ){.   
d120: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46   sqlite3_free(zF
d130: 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 46  ilename);.    zF
d140: 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d  ilename = 0;.  }
d150: 0a 20 20 72 65 74 75 72 6e 20 7a 46 69 6c 65 6e  .  return zFilen
d160: 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  ame;.}../*.** Co
d170: 6e 76 65 72 74 20 6d 75 6c 74 69 62 79 74 65 20  nvert multibyte 
d180: 63 68 61 72 61 63 74 65 72 20 73 74 72 69 6e 67  character string
d190: 20 74 6f 20 55 54 46 2d 38 2e 20 20 53 70 61 63   to UTF-8.  Spac
d1a0: 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 2a 2a  e to hold the.**
d1b0: 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67   returned string
d1c0: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   is obtained fro
d1d0: 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  m sqlite3_malloc
d1e0: 28 29 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c  ()..*/.char *sql
d1f0: 69 74 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f  ite3_win32_mbcs_
d200: 74 6f 5f 75 74 66 38 28 63 6f 6e 73 74 20 63 68  to_utf8(const ch
d210: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a  ar *zFilename){.
d220: 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d    char *zFilenam
d230: 65 55 74 66 38 3b 0a 20 20 4c 50 57 53 54 52 20  eUtf8;.  LPWSTR 
d240: 7a 54 6d 70 57 69 64 65 3b 0a 0a 20 20 7a 54 6d  zTmpWide;..  zTm
d250: 70 57 69 64 65 20 3d 20 77 69 6e 4d 62 63 73 54  pWide = winMbcsT
d260: 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61  oUnicode(zFilena
d270: 6d 65 29 3b 0a 20 20 69 66 28 20 7a 54 6d 70 57  me);.  if( zTmpW
d280: 69 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ide==0 ){.    re
d290: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 46  turn 0;.  }.  zF
d2a0: 69 6c 65 6e 61 6d 65 55 74 66 38 20 3d 20 77 69  ilenameUtf8 = wi
d2b0: 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 7a  nUnicodeToUtf8(z
d2c0: 54 6d 70 57 69 64 65 29 3b 0a 20 20 73 71 6c 69  TmpWide);.  sqli
d2d0: 74 65 33 5f 66 72 65 65 28 7a 54 6d 70 57 69 64  te3_free(zTmpWid
d2e0: 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 46 69  e);.  return zFi
d2f0: 6c 65 6e 61 6d 65 55 74 66 38 3b 0a 7d 0a 0a 2f  lenameUtf8;.}../
d300: 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 55 54 46  *.** Convert UTF
d310: 2d 38 20 74 6f 20 6d 75 6c 74 69 62 79 74 65 20  -8 to multibyte 
d320: 63 68 61 72 61 63 74 65 72 20 73 74 72 69 6e 67  character string
d330: 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  .  Space to hold
d340: 20 74 68 65 0a 2a 2a 20 72 65 74 75 72 6e 65 64   the.** returned
d350: 20 73 74 72 69 6e 67 20 69 73 20 6f 62 74 61 69   string is obtai
d360: 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ned from sqlite3
d370: 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 63 68  _malloc()..*/.ch
d380: 61 72 20 2a 73 71 6c 69 74 65 33 5f 77 69 6e 33  ar *sqlite3_win3
d390: 32 5f 75 74 66 38 5f 74 6f 5f 6d 62 63 73 28 63  2_utf8_to_mbcs(c
d3a0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
d3b0: 6e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a  name){.  char *z
d3c0: 46 69 6c 65 6e 61 6d 65 4d 62 63 73 3b 0a 20 20  FilenameMbcs;.  
d3d0: 4c 50 57 53 54 52 20 7a 54 6d 70 57 69 64 65 3b  LPWSTR zTmpWide;
d3e0: 0a 0a 20 20 7a 54 6d 70 57 69 64 65 20 3d 20 77  ..  zTmpWide = w
d3f0: 69 6e 55 74 66 38 54 6f 55 6e 69 63 6f 64 65 28  inUtf8ToUnicode(
d400: 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66  zFilename);.  if
d410: 28 20 7a 54 6d 70 57 69 64 65 3d 3d 30 20 29 7b  ( zTmpWide==0 ){
d420: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
d430: 20 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 4d 62   }.  zFilenameMb
d440: 63 73 20 3d 20 77 69 6e 55 6e 69 63 6f 64 65 54  cs = winUnicodeT
d450: 6f 4d 62 63 73 28 7a 54 6d 70 57 69 64 65 29 3b  oMbcs(zTmpWide);
d460: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
d470: 7a 54 6d 70 57 69 64 65 29 3b 0a 20 20 72 65 74  zTmpWide);.  ret
d480: 75 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 4d 62 63  urn zFilenameMbc
d490: 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  s;.}../*.** This
d4a0: 20 66 75 6e 63 74 69 6f 6e 20 73 65 74 73 20 74   function sets t
d4b0: 68 65 20 64 61 74 61 20 64 69 72 65 63 74 6f 72  he data director
d4c0: 79 20 6f 72 20 74 68 65 20 74 65 6d 70 6f 72 61  y or the tempora
d4d0: 72 79 20 64 69 72 65 63 74 6f 72 79 20 62 61 73  ry directory bas
d4e0: 65 64 20 6f 6e 0a 2a 2a 20 74 68 65 20 70 72 6f  ed on.** the pro
d4f0: 76 69 64 65 64 20 61 72 67 75 6d 65 6e 74 73 2e  vided arguments.
d500: 20 20 54 68 65 20 74 79 70 65 20 61 72 67 75 6d    The type argum
d510: 65 6e 74 20 6d 75 73 74 20 62 65 20 31 20 69 6e  ent must be 1 in
d520: 20 6f 72 64 65 72 20 74 6f 20 73 65 74 20 74 68   order to set th
d530: 65 0a 2a 2a 20 64 61 74 61 20 64 69 72 65 63 74  e.** data direct
d540: 6f 72 79 20 6f 72 20 32 20 69 6e 20 6f 72 64 65  ory or 2 in orde
d550: 72 20 74 6f 20 73 65 74 20 74 68 65 20 74 65 6d  r to set the tem
d560: 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72 79  porary directory
d570: 2e 20 20 54 68 65 20 7a 56 61 6c 75 65 0a 2a 2a  .  The zValue.**
d580: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65   argument is the
d590: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 69 72   name of the dir
d5a0: 65 63 74 6f 72 79 20 74 6f 20 75 73 65 2e 20 20  ectory to use.  
d5b0: 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
d5c0: 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 53 51 4c 49   will be.** SQLI
d5d0: 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73  TE_OK if success
d5e0: 66 75 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ful..*/.int sqli
d5f0: 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69  te3_win32_set_di
d600: 72 65 63 74 6f 72 79 28 44 57 4f 52 44 20 74 79  rectory(DWORD ty
d610: 70 65 2c 20 4c 50 43 57 53 54 52 20 7a 56 61 6c  pe, LPCWSTR zVal
d620: 75 65 29 7b 0a 20 20 63 68 61 72 20 2a 2a 70 70  ue){.  char **pp
d630: 44 69 72 65 63 74 6f 72 79 20 3d 20 30 3b 0a 23  Directory = 0;.#
d640: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
d650: 49 54 5f 41 55 54 4f 49 4e 49 54 0a 20 20 69 6e  IT_AUTOINIT.  in
d660: 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 69  t rc = sqlite3_i
d670: 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20 69  nitialize();.  i
d680: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
d690: 63 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20  c;.#endif.  if( 
d6a0: 74 79 70 65 3d 3d 53 51 4c 49 54 45 5f 57 49 4e  type==SQLITE_WIN
d6b0: 33 32 5f 44 41 54 41 5f 44 49 52 45 43 54 4f 52  32_DATA_DIRECTOR
d6c0: 59 5f 54 59 50 45 20 29 7b 0a 20 20 20 20 70 70  Y_TYPE ){.    pp
d6d0: 44 69 72 65 63 74 6f 72 79 20 3d 20 26 73 71 6c  Directory = &sql
d6e0: 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74  ite3_data_direct
d6f0: 6f 72 79 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ory;.  }else if(
d700: 20 74 79 70 65 3d 3d 53 51 4c 49 54 45 5f 57 49   type==SQLITE_WI
d710: 4e 33 32 5f 54 45 4d 50 5f 44 49 52 45 43 54 4f  N32_TEMP_DIRECTO
d720: 52 59 5f 54 59 50 45 20 29 7b 0a 20 20 20 20 70  RY_TYPE ){.    p
d730: 70 44 69 72 65 63 74 6f 72 79 20 3d 20 26 73 71  pDirectory = &sq
d740: 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63  lite3_temp_direc
d750: 74 6f 72 79 3b 0a 20 20 7d 0a 20 20 61 73 73 65  tory;.  }.  asse
d760: 72 74 28 20 21 70 70 44 69 72 65 63 74 6f 72 79  rt( !ppDirectory
d770: 20 7c 7c 20 74 79 70 65 3d 3d 53 51 4c 49 54 45   || type==SQLITE
d780: 5f 57 49 4e 33 32 5f 44 41 54 41 5f 44 49 52 45  _WIN32_DATA_DIRE
d790: 43 54 4f 52 59 5f 54 59 50 45 0a 20 20 20 20 20  CTORY_TYPE.     
d7a0: 20 20 20 20 20 7c 7c 20 74 79 70 65 3d 3d 53 51       || type==SQ
d7b0: 4c 49 54 45 5f 57 49 4e 33 32 5f 54 45 4d 50 5f  LITE_WIN32_TEMP_
d7c0: 44 49 52 45 43 54 4f 52 59 5f 54 59 50 45 0a 20  DIRECTORY_TYPE. 
d7d0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70   );.  assert( !p
d7e0: 70 44 69 72 65 63 74 6f 72 79 20 7c 7c 20 73 71  pDirectory || sq
d7f0: 6c 69 74 65 33 4d 65 6d 64 65 62 75 67 48 61 73  lite3MemdebugHas
d800: 54 79 70 65 28 2a 70 70 44 69 72 65 63 74 6f 72  Type(*ppDirector
d810: 79 2c 20 4d 45 4d 54 59 50 45 5f 48 45 41 50 29  y, MEMTYPE_HEAP)
d820: 20 29 3b 0a 20 20 69 66 28 20 70 70 44 69 72 65   );.  if( ppDire
d830: 63 74 6f 72 79 20 29 7b 0a 20 20 20 20 63 68 61  ctory ){.    cha
d840: 72 20 2a 7a 56 61 6c 75 65 55 74 66 38 20 3d 20  r *zValueUtf8 = 
d850: 30 3b 0a 20 20 20 20 69 66 28 20 7a 56 61 6c 75  0;.    if( zValu
d860: 65 20 26 26 20 7a 56 61 6c 75 65 5b 30 5d 20 29  e && zValue[0] )
d870: 7b 0a 20 20 20 20 20 20 7a 56 61 6c 75 65 55 74  {.      zValueUt
d880: 66 38 20 3d 20 77 69 6e 55 6e 69 63 6f 64 65 54  f8 = winUnicodeT
d890: 6f 55 74 66 38 28 7a 56 61 6c 75 65 29 3b 0a 20  oUtf8(zValue);. 
d8a0: 20 20 20 20 20 69 66 20 28 20 7a 56 61 6c 75 65       if ( zValue
d8b0: 55 74 66 38 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Utf8==0 ){.     
d8c0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
d8d0: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a  _NOMEM;.      }.
d8e0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
d8f0: 33 5f 66 72 65 65 28 2a 70 70 44 69 72 65 63 74  3_free(*ppDirect
d900: 6f 72 79 29 3b 0a 20 20 20 20 2a 70 70 44 69 72  ory);.    *ppDir
d910: 65 63 74 6f 72 79 20 3d 20 7a 56 61 6c 75 65 55  ectory = zValueU
d920: 74 66 38 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  tf8;.    return 
d930: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
d940: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
d950: 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  RROR;.}../*.** T
d960: 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
d970: 6f 66 20 77 69 6e 47 65 74 4c 61 73 74 45 72 72  of winGetLastErr
d980: 6f 72 4d 73 67 0a 2a 2a 20 69 73 20 7a 65 72 6f  orMsg.** is zero
d990: 20 69 66 20 74 68 65 20 65 72 72 6f 72 20 6d 65   if the error me
d9a0: 73 73 61 67 65 20 66 69 74 73 20 69 6e 20 74 68  ssage fits in th
d9b0: 65 20 62 75 66 66 65 72 2c 20 6f 72 20 6e 6f 6e  e buffer, or non
d9c0: 2d 7a 65 72 6f 0a 2a 2a 20 6f 74 68 65 72 77 69  -zero.** otherwi
d9d0: 73 65 20 28 69 66 20 74 68 65 20 6d 65 73 73 61  se (if the messa
d9e0: 67 65 20 77 61 73 20 74 72 75 6e 63 61 74 65 64  ge was truncated
d9f0: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
da00: 20 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f 72   winGetLastError
da10: 4d 73 67 28 44 57 4f 52 44 20 6c 61 73 74 45 72  Msg(DWORD lastEr
da20: 72 6e 6f 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63  rno, int nBuf, c
da30: 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 2f 2a  har *zBuf){.  /*
da40: 20 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 20 72   FormatMessage r
da50: 65 74 75 72 6e 73 20 30 20 6f 6e 20 66 61 69 6c  eturns 0 on fail
da60: 75 72 65 2e 20 20 4f 74 68 65 72 77 69 73 65 20  ure.  Otherwise 
da70: 69 74 0a 20 20 2a 2a 20 72 65 74 75 72 6e 73 20  it.  ** returns 
da80: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 54 43  the number of TC
da90: 48 41 52 73 20 77 72 69 74 74 65 6e 20 74 6f 20  HARs written to 
daa0: 74 68 65 20 6f 75 74 70 75 74 0a 20 20 2a 2a 20  the output.  ** 
dab0: 62 75 66 66 65 72 2c 20 65 78 63 6c 75 64 69 6e  buffer, excludin
dac0: 67 20 74 68 65 20 74 65 72 6d 69 6e 61 74 69 6e  g the terminatin
dad0: 67 20 6e 75 6c 6c 20 63 68 61 72 2e 0a 20 20 2a  g null char..  *
dae0: 2f 0a 20 20 44 57 4f 52 44 20 64 77 4c 65 6e 20  /.  DWORD dwLen 
daf0: 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 4f 75  = 0;.  char *zOu
db00: 74 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 6f 73  t = 0;..  if( os
db10: 49 73 4e 54 28 29 20 29 7b 0a 23 69 66 20 53 51  IsNT() ){.#if SQ
db20: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
db30: 20 20 57 43 48 41 52 20 7a 54 65 6d 70 57 69 64    WCHAR zTempWid
db40: 65 5b 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d  e[SQLITE_WIN32_M
db50: 41 58 5f 45 52 52 4d 53 47 5f 43 48 41 52 53 2b  AX_ERRMSG_CHARS+
db60: 31 5d 3b 0a 20 20 20 20 64 77 4c 65 6e 20 3d 20  1];.    dwLen = 
db70: 6f 73 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 57  osFormatMessageW
db80: 28 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f  (FORMAT_MESSAGE_
db90: 46 52 4f 4d 5f 53 59 53 54 45 4d 20 7c 0a 20 20  FROM_SYSTEM |.  
dba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dbb0: 20 20 20 20 20 20 20 20 20 20 20 46 4f 52 4d 41             FORMA
dbc0: 54 5f 4d 45 53 53 41 47 45 5f 49 47 4e 4f 52 45  T_MESSAGE_IGNORE
dbd0: 5f 49 4e 53 45 52 54 53 2c 0a 20 20 20 20 20 20  _INSERTS,.      
dbe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dbf0: 20 20 20 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20         NULL,.   
dc00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc10: 20 20 20 20 20 20 20 20 20 20 6c 61 73 74 45 72            lastEr
dc20: 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
dc30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc40: 20 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20    0,.           
dc50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc60: 20 20 7a 54 65 6d 70 57 69 64 65 2c 0a 20 20 20    zTempWide,.   
dc70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc80: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
dc90: 5f 57 49 4e 33 32 5f 4d 41 58 5f 45 52 52 4d 53  _WIN32_MAX_ERRMS
dca0: 47 5f 43 48 41 52 53 2c 0a 20 20 20 20 20 20 20  G_CHARS,.       
dcb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dcc0: 20 20 20 20 20 20 30 29 3b 0a 23 65 6c 73 65 0a        0);.#else.
dcd0: 20 20 20 20 4c 50 57 53 54 52 20 7a 54 65 6d 70      LPWSTR zTemp
dce0: 57 69 64 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  Wide = NULL;.   
dcf0: 20 64 77 4c 65 6e 20 3d 20 6f 73 46 6f 72 6d 61   dwLen = osForma
dd00: 74 4d 65 73 73 61 67 65 57 28 46 4f 52 4d 41 54  tMessageW(FORMAT
dd10: 5f 4d 45 53 53 41 47 45 5f 41 4c 4c 4f 43 41 54  _MESSAGE_ALLOCAT
dd20: 45 5f 42 55 46 46 45 52 20 7c 0a 20 20 20 20 20  E_BUFFER |.     
dd30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd40: 20 20 20 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d          FORMAT_M
dd50: 45 53 53 41 47 45 5f 46 52 4f 4d 5f 53 59 53 54  ESSAGE_FROM_SYST
dd60: 45 4d 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  EM |.           
dd70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd80: 20 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45    FORMAT_MESSAGE
dd90: 5f 49 47 4e 4f 52 45 5f 49 4e 53 45 52 54 53 2c  _IGNORE_INSERTS,
dda0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ddb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4e 55                NU
ddc0: 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  LL,.            
ddd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dde0: 20 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20   lastErrno,.    
ddf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de00: 20 20 20 20 20 20 20 20 20 30 2c 0a 20 20 20 20           0,.    
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 20 28 4c 50 57 53 54 52           (LPWSTR
de30: 29 20 26 7a 54 65 6d 70 57 69 64 65 2c 0a 20 20  ) &zTempWide,.  
de40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de50: 20 20 20 20 20 20 20 20 20 20 20 30 2c 0a 20 20             0,.  
de60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de70: 20 20 20 20 20 20 20 20 20 20 20 30 29 3b 0a 23             0);.#
de80: 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 64 77  endif.    if( dw
de90: 4c 65 6e 20 3e 20 30 20 29 7b 0a 20 20 20 20 20  Len > 0 ){.     
dea0: 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 61 20 62   /* allocate a b
deb0: 75 66 66 65 72 20 61 6e 64 20 63 6f 6e 76 65 72  uffer and conver
dec0: 74 20 74 6f 20 55 54 46 38 20 2a 2f 0a 20 20 20  t to UTF8 */.   
ded0: 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42     sqlite3BeginB
dee0: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
def0: 20 20 20 20 20 7a 4f 75 74 20 3d 20 77 69 6e 55       zOut = winU
df00: 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 54 65  nicodeToUtf8(zTe
df10: 6d 70 57 69 64 65 29 3b 0a 20 20 20 20 20 20 73  mpWide);.      s
df20: 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
df30: 61 6c 6c 6f 63 28 29 3b 0a 23 69 66 20 21 53 51  alloc();.#if !SQ
df40: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
df50: 20 20 20 20 2f 2a 20 66 72 65 65 20 74 68 65 20      /* free the 
df60: 73 79 73 74 65 6d 20 62 75 66 66 65 72 20 61 6c  system buffer al
df70: 6c 6f 63 61 74 65 64 20 62 79 20 46 6f 72 6d 61  located by Forma
df80: 74 4d 65 73 73 61 67 65 20 2a 2f 0a 20 20 20 20  tMessage */.    
df90: 20 20 6f 73 4c 6f 63 61 6c 46 72 65 65 28 7a 54    osLocalFree(zT
dfa0: 65 6d 70 57 69 64 65 29 3b 0a 23 65 6e 64 69 66  empWide);.#endif
dfb0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66 64 65  .    }.  }.#ifde
dfc0: 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  f SQLITE_WIN32_H
dfd0: 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a  AS_ANSI.  else{.
dfe0: 20 20 20 20 63 68 61 72 20 2a 7a 54 65 6d 70 20      char *zTemp 
dff0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 64 77 4c 65  = NULL;.    dwLe
e000: 6e 20 3d 20 6f 73 46 6f 72 6d 61 74 4d 65 73 73  n = osFormatMess
e010: 61 67 65 41 28 46 4f 52 4d 41 54 5f 4d 45 53 53  ageA(FORMAT_MESS
e020: 41 47 45 5f 41 4c 4c 4f 43 41 54 45 5f 42 55 46  AGE_ALLOCATE_BUF
e030: 46 45 52 20 7c 0a 20 20 20 20 20 20 20 20 20 20  FER |.          
e040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e050: 20 20 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47     FORMAT_MESSAG
e060: 45 5f 46 52 4f 4d 5f 53 59 53 54 45 4d 20 7c 0a  E_FROM_SYSTEM |.
e070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e080: 20 20 20 20 20 20 20 20 20 20 20 20 20 46 4f 52               FOR
e090: 4d 41 54 5f 4d 45 53 53 41 47 45 5f 49 47 4e 4f  MAT_MESSAGE_IGNO
e0a0: 52 45 5f 49 4e 53 45 52 54 53 2c 0a 20 20 20 20  RE_INSERTS,.    
e0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e0c0: 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 0a 20           NULL,. 
e0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e0e0: 20 20 20 20 20 20 20 20 20 20 20 20 6c 61 73 74              last
e0f0: 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  Errno,.         
e100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e110: 20 20 20 20 30 2c 0a 20 20 20 20 20 20 20 20 20      0,.         
e120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e130: 20 20 20 20 28 4c 50 53 54 52 29 20 26 7a 54 65      (LPSTR) &zTe
e140: 6d 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  mp,.            
e150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e160: 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
e170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e180: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 64 77 4c   0);.    if( dwL
e190: 65 6e 20 3e 20 30 20 29 7b 0a 20 20 20 20 20 20  en > 0 ){.      
e1a0: 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 61 20 62 75  /* allocate a bu
e1b0: 66 66 65 72 20 61 6e 64 20 63 6f 6e 76 65 72 74  ffer and convert
e1c0: 20 74 6f 20 55 54 46 38 20 2a 2f 0a 20 20 20 20   to UTF8 */.    
e1d0: 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
e1e0: 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
e1f0: 20 20 20 20 7a 4f 75 74 20 3d 20 73 71 6c 69 74      zOut = sqlit
e200: 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f  e3_win32_mbcs_to
e210: 5f 75 74 66 38 28 7a 54 65 6d 70 29 3b 0a 20 20  _utf8(zTemp);.  
e220: 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65      sqlite3EndBe
e230: 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
e240: 20 20 20 20 2f 2a 20 66 72 65 65 20 74 68 65 20      /* free the 
e250: 73 79 73 74 65 6d 20 62 75 66 66 65 72 20 61 6c  system buffer al
e260: 6c 6f 63 61 74 65 64 20 62 79 20 46 6f 72 6d 61  located by Forma
e270: 74 4d 65 73 73 61 67 65 20 2a 2f 0a 20 20 20 20  tMessage */.    
e280: 20 20 6f 73 4c 6f 63 61 6c 46 72 65 65 28 7a 54    osLocalFree(zT
e290: 65 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  emp);.    }.  }.
e2a0: 23 65 6e 64 69 66 0a 20 20 69 66 28 20 30 20 3d  #endif.  if( 0 =
e2b0: 3d 20 64 77 4c 65 6e 20 29 7b 0a 20 20 20 20 73  = dwLen ){.    s
e2c0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
e2d0: 6e 42 75 66 2c 20 7a 42 75 66 2c 20 22 4f 73 45  nBuf, zBuf, "OsE
e2e0: 72 72 6f 72 20 30 78 25 6c 78 20 28 25 6c 75 29  rror 0x%lx (%lu)
e2f0: 22 2c 20 6c 61 73 74 45 72 72 6e 6f 2c 20 6c 61  ", lastErrno, la
e300: 73 74 45 72 72 6e 6f 29 3b 0a 20 20 7d 65 6c 73  stErrno);.  }els
e310: 65 7b 0a 20 20 20 20 2f 2a 20 63 6f 70 79 20 61  e{.    /* copy a
e320: 20 6d 61 78 69 6d 75 6d 20 6f 66 20 6e 42 75 66   maximum of nBuf
e330: 20 63 68 61 72 73 20 74 6f 20 6f 75 74 70 75 74   chars to output
e340: 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 20 20 73   buffer */.    s
e350: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
e360: 6e 42 75 66 2c 20 7a 42 75 66 2c 20 22 25 73 22  nBuf, zBuf, "%s"
e370: 2c 20 7a 4f 75 74 29 3b 0a 20 20 20 20 2f 2a 20  , zOut);.    /* 
e380: 66 72 65 65 20 74 68 65 20 55 54 46 38 20 62 75  free the UTF8 bu
e390: 66 66 65 72 20 2a 2f 0a 20 20 20 20 73 71 6c 69  ffer */.    sqli
e3a0: 74 65 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a  te3_free(zOut);.
e3b0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
e3c0: 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  }../*.**.** This
e3d0: 20 66 75 6e 63 74 69 6f 6e 20 2d 20 77 69 6e 4c   function - winL
e3e0: 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 29 20  ogErrorAtLine() 
e3f0: 2d 20 69 73 20 6f 6e 6c 79 20 65 76 65 72 20 63  - is only ever c
e400: 61 6c 6c 65 64 20 76 69 61 20 74 68 65 20 6d 61  alled via the ma
e410: 63 72 6f 0a 2a 2a 20 77 69 6e 4c 6f 67 45 72 72  cro.** winLogErr
e420: 6f 72 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  or()..**.** This
e430: 20 72 6f 75 74 69 6e 65 20 69 73 20 69 6e 76 6f   routine is invo
e440: 6b 65 64 20 61 66 74 65 72 20 61 6e 20 65 72 72  ked after an err
e450: 6f 72 20 6f 63 63 75 72 73 20 69 6e 20 61 6e 20  or occurs in an 
e460: 4f 53 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20  OS function..** 
e470: 49 74 20 6c 6f 67 73 20 61 20 6d 65 73 73 61 67  It logs a messag
e480: 65 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f  e using sqlite3_
e490: 6c 6f 67 28 29 20 63 6f 6e 74 61 69 6e 69 6e 67  log() containing
e4a0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c   the current val
e4b0: 75 65 20 6f 66 0a 2a 2a 20 65 72 72 6f 72 20 63  ue of.** error c
e4c0: 6f 64 65 20 61 6e 64 2c 20 69 66 20 70 6f 73 73  ode and, if poss
e4d0: 69 62 6c 65 2c 20 74 68 65 20 68 75 6d 61 6e 2d  ible, the human-
e4e0: 72 65 61 64 61 62 6c 65 20 65 71 75 69 76 61 6c  readable equival
e4f0: 65 6e 74 20 66 72 6f 6d 0a 2a 2a 20 46 6f 72 6d  ent from.** Form
e500: 61 74 4d 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a 2a  atMessage..**.**
e510: 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   The first argum
e520: 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74 68  ent passed to th
e530: 65 20 6d 61 63 72 6f 20 73 68 6f 75 6c 64 20 62  e macro should b
e540: 65 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  e the error code
e550: 20 74 68 61 74 0a 2a 2a 20 77 69 6c 6c 20 62 65   that.** will be
e560: 20 72 65 74 75 72 6e 65 64 20 74 6f 20 53 51 4c   returned to SQL
e570: 69 74 65 20 28 65 2e 67 2e 20 53 51 4c 49 54 45  ite (e.g. SQLITE
e580: 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 2c 20 53  _IOERR_DELETE, S
e590: 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 29 2e  QLITE_CANTOPEN).
e5a0: 0a 2a 2a 20 54 68 65 20 74 77 6f 20 73 75 62 73  .** The two subs
e5b0: 65 71 75 65 6e 74 20 61 72 67 75 6d 65 6e 74 73  equent arguments
e5c0: 20 73 68 6f 75 6c 64 20 62 65 20 74 68 65 20 6e   should be the n
e5d0: 61 6d 65 20 6f 66 20 74 68 65 20 4f 53 20 66 75  ame of the OS fu
e5e0: 6e 63 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 66  nction that.** f
e5f0: 61 69 6c 65 64 20 61 6e 64 20 74 68 65 20 61 73  ailed and the as
e600: 73 6f 63 69 61 74 65 64 20 66 69 6c 65 2d 73 79  sociated file-sy
e610: 73 74 65 6d 20 70 61 74 68 2c 20 69 66 20 61 6e  stem path, if an
e620: 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 77 69  y..*/.#define wi
e630: 6e 4c 6f 67 45 72 72 6f 72 28 61 2c 62 2c 63 2c  nLogError(a,b,c,
e640: 64 29 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72  d)   winLogError
e650: 41 74 4c 69 6e 65 28 61 2c 62 2c 63 2c 64 2c 5f  AtLine(a,b,c,d,_
e660: 5f 4c 49 4e 45 5f 5f 29 0a 73 74 61 74 69 63 20  _LINE__).static 
e670: 69 6e 74 20 77 69 6e 4c 6f 67 45 72 72 6f 72 41  int winLogErrorA
e680: 74 4c 69 6e 65 28 0a 20 20 69 6e 74 20 65 72 72  tLine(.  int err
e690: 63 6f 64 65 2c 20 20 20 20 20 20 20 20 20 20 20  code,           
e6a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 69           /* SQLi
e6b0: 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f  te error code */
e6c0: 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72  .  DWORD lastErr
e6d0: 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  no,             
e6e0: 20 20 20 2f 2a 20 57 69 6e 33 32 20 6c 61 73 74     /* Win32 last
e6f0: 20 65 72 72 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73   error */.  cons
e700: 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 2c 20 20  t char *zFunc,  
e710: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
e720: 61 6d 65 20 6f 66 20 4f 53 20 66 75 6e 63 74 69  ame of OS functi
e730: 6f 6e 20 74 68 61 74 20 66 61 69 6c 65 64 20 2a  on that failed *
e740: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
e750: 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20 20 20  zPath,          
e760: 20 20 20 20 2f 2a 20 46 69 6c 65 20 70 61 74 68      /* File path
e770: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
e780: 20 65 72 72 6f 72 20 2a 2f 0a 20 20 69 6e 74 20   error */.  int 
e790: 69 4c 69 6e 65 20 20 20 20 20 20 20 20 20 20 20  iLine           
e7a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
e7b0: 6f 75 72 63 65 20 6c 69 6e 65 20 6e 75 6d 62 65  ource line numbe
e7c0: 72 20 77 68 65 72 65 20 65 72 72 6f 72 20 6f 63  r where error oc
e7d0: 63 75 72 72 65 64 20 2a 2f 0a 29 7b 0a 20 20 63  curred */.){.  c
e7e0: 68 61 72 20 7a 4d 73 67 5b 35 30 30 5d 3b 20 20  har zMsg[500];  
e7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e800: 2a 20 48 75 6d 61 6e 20 72 65 61 64 61 62 6c 65  * Human readable
e810: 20 65 72 72 6f 72 20 74 65 78 74 20 2a 2f 0a 20   error text */. 
e820: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
e830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e840: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
e850: 20 2a 2f 0a 0a 20 20 7a 4d 73 67 5b 30 5d 20 3d   */..  zMsg[0] =
e860: 20 30 3b 0a 20 20 77 69 6e 47 65 74 4c 61 73 74   0;.  winGetLast
e870: 45 72 72 6f 72 4d 73 67 28 6c 61 73 74 45 72 72  ErrorMsg(lastErr
e880: 6e 6f 2c 20 73 69 7a 65 6f 66 28 7a 4d 73 67 29  no, sizeof(zMsg)
e890: 2c 20 7a 4d 73 67 29 3b 0a 20 20 61 73 73 65 72  , zMsg);.  asser
e8a0: 74 28 20 65 72 72 63 6f 64 65 21 3d 53 51 4c 49  t( errcode!=SQLI
e8b0: 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20 7a  TE_OK );.  if( z
e8c0: 50 61 74 68 3d 3d 30 20 29 20 7a 50 61 74 68 20  Path==0 ) zPath 
e8d0: 3d 20 22 22 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  = "";.  for(i=0;
e8e0: 20 7a 4d 73 67 5b 69 5d 20 26 26 20 7a 4d 73 67   zMsg[i] && zMsg
e8f0: 5b 69 5d 21 3d 27 5c 72 27 20 26 26 20 7a 4d 73  [i]!='\r' && zMs
e900: 67 5b 69 5d 21 3d 27 5c 6e 27 3b 20 69 2b 2b 29  g[i]!='\n'; i++)
e910: 7b 7d 0a 20 20 7a 4d 73 67 5b 69 5d 20 3d 20 30  {}.  zMsg[i] = 0
e920: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28  ;.  sqlite3_log(
e930: 65 72 72 63 6f 64 65 2c 0a 20 20 20 20 20 20 22  errcode,.      "
e940: 6f 73 5f 77 69 6e 2e 63 3a 25 64 3a 20 28 25 6c  os_win.c:%d: (%l
e950: 75 29 20 25 73 28 25 73 29 20 2d 20 25 73 22 2c  u) %s(%s) - %s",
e960: 0a 20 20 20 20 20 20 69 4c 69 6e 65 2c 20 6c 61  .      iLine, la
e970: 73 74 45 72 72 6e 6f 2c 20 7a 46 75 6e 63 2c 20  stErrno, zFunc, 
e980: 7a 50 61 74 68 2c 20 7a 4d 73 67 0a 20 20 29 3b  zPath, zMsg.  );
e990: 0a 0a 20 20 72 65 74 75 72 6e 20 65 72 72 63 6f  ..  return errco
e9a0: 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  de;.}../*.** The
e9b0: 20 6e 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73   number of times
e9c0: 20 74 68 61 74 20 61 20 52 65 61 64 46 69 6c 65   that a ReadFile
e9d0: 28 29 2c 20 57 72 69 74 65 46 69 6c 65 28 29 2c  (), WriteFile(),
e9e0: 20 61 6e 64 20 44 65 6c 65 74 65 46 69 6c 65 28   and DeleteFile(
e9f0: 29 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 74  ).** will be ret
ea00: 72 69 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 61  ried following a
ea10: 20 6c 6f 63 6b 69 6e 67 20 65 72 72 6f 72 20 2d   locking error -
ea20: 20 70 72 6f 62 61 62 6c 79 20 63 61 75 73 65 64   probably caused
ea30: 20 62 79 0a 2a 2a 20 61 6e 74 69 76 69 72 75 73   by.** antivirus
ea40: 20 73 6f 66 74 77 61 72 65 2e 20 20 41 6c 73 6f   software.  Also
ea50: 20 74 68 65 20 69 6e 69 74 69 61 6c 20 64 65 6c   the initial del
ea60: 61 79 20 62 65 66 6f 72 65 20 74 68 65 20 66 69  ay before the fi
ea70: 72 73 74 20 72 65 74 72 79 2e 0a 2a 2a 20 54 68  rst retry..** Th
ea80: 65 20 64 65 6c 61 79 20 69 6e 63 72 65 61 73 65  e delay increase
ea90: 73 20 6c 69 6e 65 61 72 6c 79 20 77 69 74 68 20  s linearly with 
eaa0: 65 61 63 68 20 72 65 74 72 79 2e 0a 2a 2f 0a 23  each retry..*/.#
eab0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49  ifndef SQLITE_WI
eac0: 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 0a  N32_IOERR_RETRY.
ead0: 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  # define SQLITE_
eae0: 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52  WIN32_IOERR_RETR
eaf0: 59 20 31 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e  Y 10.#endif.#ifn
eb00: 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  def SQLITE_WIN32
eb10: 5f 49 4f 45 52 52 5f 52 45 54 52 59 5f 44 45 4c  _IOERR_RETRY_DEL
eb20: 41 59 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49  AY.# define SQLI
eb30: 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52  TE_WIN32_IOERR_R
eb40: 45 54 52 59 5f 44 45 4c 41 59 20 32 35 0a 23 65  ETRY_DELAY 25.#e
eb50: 6e 64 69 66 0a 73 74 61 74 69 63 20 69 6e 74 20  ndif.static int 
eb60: 77 69 6e 49 6f 65 72 72 52 65 74 72 79 20 3d 20  winIoerrRetry = 
eb70: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45  SQLITE_WIN32_IOE
eb80: 52 52 5f 52 45 54 52 59 3b 0a 73 74 61 74 69 63  RR_RETRY;.static
eb90: 20 69 6e 74 20 77 69 6e 49 6f 65 72 72 52 65 74   int winIoerrRet
eba0: 72 79 44 65 6c 61 79 20 3d 20 53 51 4c 49 54 45  ryDelay = SQLITE
ebb0: 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54  _WIN32_IOERR_RET
ebc0: 52 59 5f 44 45 4c 41 59 3b 0a 0a 2f 2a 0a 2a 2a  RY_DELAY;../*.**
ebd0: 20 54 68 65 20 22 77 69 6e 49 6f 65 72 72 43 61   The "winIoerrCa
ebe0: 6e 52 65 74 72 79 31 22 20 6d 61 63 72 6f 20 69  nRetry1" macro i
ebf0: 73 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d  s used to determ
ec00: 69 6e 65 20 69 66 20 61 20 70 61 72 74 69 63 75  ine if a particu
ec10: 6c 61 72 20 49 2f 4f 0a 2a 2a 20 65 72 72 6f 72  lar I/O.** error
ec20: 20 63 6f 64 65 20 6f 62 74 61 69 6e 65 64 20 76   code obtained v
ec30: 69 61 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28  ia GetLastError(
ec40: 29 20 69 73 20 65 6c 69 67 69 62 6c 65 20 74 6f  ) is eligible to
ec50: 20 62 65 20 72 65 74 72 69 65 64 2e 20 20 49 74   be retried.  It
ec60: 0a 2a 2a 20 6d 75 73 74 20 61 63 63 65 70 74 20  .** must accept 
ec70: 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 44  the error code D
ec80: 57 4f 52 44 20 61 73 20 69 74 73 20 6f 6e 6c 79  WORD as its only
ec90: 20 61 72 67 75 6d 65 6e 74 20 61 6e 64 20 73 68   argument and sh
eca0: 6f 75 6c 64 20 72 65 74 75 72 6e 0a 2a 2a 20 6e  ould return.** n
ecb0: 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 65  on-zero if the e
ecc0: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 74 72 61  rror code is tra
ecd0: 6e 73 69 65 6e 74 20 69 6e 20 6e 61 74 75 72 65  nsient in nature
ece0: 20 61 6e 64 20 74 68 65 20 6f 70 65 72 61 74 69   and the operati
ecf0: 6f 6e 0a 2a 2a 20 72 65 73 70 6f 6e 73 69 62 6c  on.** responsibl
ed00: 65 20 66 6f 72 20 67 65 6e 65 72 61 74 69 6e 67  e for generating
ed10: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 65 72   the original er
ed20: 72 6f 72 20 6d 69 67 68 74 20 73 75 63 63 65 65  ror might succee
ed30: 64 20 75 70 6f 6e 20 62 65 69 6e 67 0a 2a 2a 20  d upon being.** 
ed40: 72 65 74 72 69 65 64 2e 20 20 54 68 65 20 61 72  retried.  The ar
ed50: 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 6d  gument to this m
ed60: 61 63 72 6f 20 73 68 6f 75 6c 64 20 62 65 20 61  acro should be a
ed70: 20 76 61 72 69 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a   variable..**.**
ed80: 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 61   Additionally, a
ed90: 20 6d 61 63 72 6f 20 6e 61 6d 65 64 20 22 77 69   macro named "wi
eda0: 6e 49 6f 65 72 72 43 61 6e 52 65 74 72 79 32 22  nIoerrCanRetry2"
edb0: 20 6d 61 79 20 62 65 20 64 65 66 69 6e 65 64 2e   may be defined.
edc0: 20 20 49 66 20 69 74 0a 2a 2a 20 69 73 20 64 65    If it.** is de
edd0: 66 69 6e 65 64 2c 20 69 74 20 77 69 6c 6c 20 62  fined, it will b
ede0: 65 20 63 6f 6e 73 75 6c 74 65 64 20 6f 6e 6c 79  e consulted only
edf0: 20 77 68 65 6e 20 74 68 65 20 6d 61 63 72 6f 20   when the macro 
ee00: 22 77 69 6e 49 6f 65 72 72 43 61 6e 52 65 74 72  "winIoerrCanRetr
ee10: 79 31 22 0a 2a 2a 20 72 65 74 75 72 6e 73 20 7a  y1".** returns z
ee20: 65 72 6f 2e 20 20 54 68 65 20 22 77 69 6e 49 6f  ero.  The "winIo
ee30: 65 72 72 43 61 6e 52 65 74 72 79 32 22 20 6d 61  errCanRetry2" ma
ee40: 63 72 6f 20 69 73 20 63 6f 6d 70 6c 65 74 65 6c  cro is completel
ee50: 79 20 6f 70 74 69 6f 6e 61 6c 20 61 6e 64 0a 2a  y optional and.*
ee60: 2a 20 6d 61 79 20 62 65 20 75 73 65 64 20 74 6f  * may be used to
ee70: 20 69 6e 63 6c 75 64 65 20 61 64 64 69 74 69 6f   include additio
ee80: 6e 61 6c 20 65 72 72 6f 72 20 63 6f 64 65 73 20  nal error codes 
ee90: 69 6e 20 74 68 65 20 73 65 74 20 74 68 61 74 20  in the set that 
eea0: 73 68 6f 75 6c 64 0a 2a 2a 20 72 65 73 75 6c 74  should.** result
eeb0: 20 69 6e 20 74 68 65 20 66 61 69 6c 69 6e 67 20   in the failing 
eec0: 49 2f 4f 20 6f 70 65 72 61 74 69 6f 6e 20 62 65  I/O operation be
eed0: 69 6e 67 20 72 65 74 72 69 65 64 20 62 79 20 74  ing retried by t
eee0: 68 65 20 63 61 6c 6c 65 72 2e 20 20 49 66 0a 2a  he caller.  If.*
eef0: 2a 20 64 65 66 69 6e 65 64 2c 20 74 68 65 20 22  * defined, the "
ef00: 77 69 6e 49 6f 65 72 72 43 61 6e 52 65 74 72 79  winIoerrCanRetry
ef10: 32 22 20 6d 61 63 72 6f 20 6d 75 73 74 20 65 78  2" macro must ex
ef20: 68 69 62 69 74 20 65 78 74 65 72 6e 61 6c 20 73  hibit external s
ef30: 65 6d 61 6e 74 69 63 73 0a 2a 2a 20 69 64 65 6e  emantics.** iden
ef40: 74 69 63 61 6c 20 74 6f 20 74 68 6f 73 65 20 6f  tical to those o
ef50: 66 20 74 68 65 20 22 77 69 6e 49 6f 65 72 72 43  f the "winIoerrC
ef60: 61 6e 52 65 74 72 79 31 22 20 6d 61 63 72 6f 2e  anRetry1" macro.
ef70: 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .*/.#if !defined
ef80: 28 77 69 6e 49 6f 65 72 72 43 61 6e 52 65 74 72  (winIoerrCanRetr
ef90: 79 31 29 0a 23 64 65 66 69 6e 65 20 77 69 6e 49  y1).#define winI
efa0: 6f 65 72 72 43 61 6e 52 65 74 72 79 31 28 61 29  oerrCanRetry1(a)
efb0: 20 28 28 28 61 29 3d 3d 45 52 52 4f 52 5f 41 43   (((a)==ERROR_AC
efc0: 43 45 53 53 5f 44 45 4e 49 45 44 29 20 20 20 20  CESS_DENIED)    
efd0: 20 20 20 20 7c 7c 20 5c 0a 20 20 20 20 20 20 20      || \.       
efe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eff0: 20 20 20 20 20 20 20 28 28 61 29 3d 3d 45 52 52         ((a)==ERR
f000: 4f 52 5f 53 48 41 52 49 4e 47 5f 56 49 4f 4c 41  OR_SHARING_VIOLA
f010: 54 49 4f 4e 29 20 20 20 20 7c 7c 20 5c 0a 20 20  TION)    || \.  
f020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f030: 20 20 20 20 20 20 20 20 20 20 20 20 28 28 61 29              ((a)
f040: 3d 3d 45 52 52 4f 52 5f 4c 4f 43 4b 5f 56 49 4f  ==ERROR_LOCK_VIO
f050: 4c 41 54 49 4f 4e 29 20 20 20 20 20 20 20 7c 7c  LATION)       ||
f060: 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   \.             
f070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f080: 20 28 28 61 29 3d 3d 45 52 52 4f 52 5f 44 45 56   ((a)==ERROR_DEV
f090: 5f 4e 4f 54 5f 45 58 49 53 54 29 20 20 20 20 20  _NOT_EXIST)     
f0a0: 20 20 20 7c 7c 20 5c 0a 20 20 20 20 20 20 20 20     || \.        
f0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f0c0: 20 20 20 20 20 20 28 28 61 29 3d 3d 45 52 52 4f        ((a)==ERRO
f0d0: 52 5f 4e 45 54 4e 41 4d 45 5f 44 45 4c 45 54 45  R_NETNAME_DELETE
f0e0: 44 29 20 20 20 20 20 20 7c 7c 20 5c 0a 20 20 20  D)      || \.   
f0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f100: 20 20 20 20 20 20 20 20 20 20 20 28 28 61 29 3d             ((a)=
f110: 3d 45 52 52 4f 52 5f 53 45 4d 5f 54 49 4d 45 4f  =ERROR_SEM_TIMEO
f120: 55 54 29 20 20 20 20 20 20 20 20 20 20 7c 7c 20  UT)          || 
f130: 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  \.              
f140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f150: 28 28 61 29 3d 3d 45 52 52 4f 52 5f 4e 45 54 57  ((a)==ERROR_NETW
f160: 4f 52 4b 5f 55 4e 52 45 41 43 48 41 42 4c 45 29  ORK_UNREACHABLE)
f170: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
f180: 49 66 20 61 20 52 65 61 64 46 69 6c 65 28 29 20  If a ReadFile() 
f190: 6f 72 20 57 72 69 74 65 46 69 6c 65 28 29 20 65  or WriteFile() e
f1a0: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 69 6e 76  rror occurs, inv
f1b0: 6f 6b 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  oke this routine
f1c0: 0a 2a 2a 20 74 6f 20 73 65 65 20 69 66 20 69 74  .** to see if it
f1d0: 20 73 68 6f 75 6c 64 20 62 65 20 72 65 74 72 69   should be retri
f1e0: 65 64 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45  ed.  Return TRUE
f1f0: 20 74 6f 20 72 65 74 72 79 2e 20 20 52 65 74 75   to retry.  Retu
f200: 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 74 6f 20 67  rn FALSE.** to g
f210: 69 76 65 20 75 70 20 77 69 74 68 20 61 6e 20 65  ive up with an e
f220: 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rror..*/.static 
f230: 69 6e 74 20 77 69 6e 52 65 74 72 79 49 6f 65 72  int winRetryIoer
f240: 72 28 69 6e 74 20 2a 70 6e 52 65 74 72 79 2c 20  r(int *pnRetry, 
f250: 44 57 4f 52 44 20 2a 70 45 72 72 6f 72 29 7b 0a  DWORD *pError){.
f260: 20 20 44 57 4f 52 44 20 65 20 3d 20 6f 73 47 65    DWORD e = osGe
f270: 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
f280: 69 66 28 20 2a 70 6e 52 65 74 72 79 3e 3d 77 69  if( *pnRetry>=wi
f290: 6e 49 6f 65 72 72 52 65 74 72 79 20 29 7b 0a 20  nIoerrRetry ){. 
f2a0: 20 20 20 69 66 28 20 70 45 72 72 6f 72 20 29 7b     if( pError ){
f2b0: 0a 20 20 20 20 20 20 2a 70 45 72 72 6f 72 20 3d  .      *pError =
f2c0: 20 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65   e;.    }.    re
f2d0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
f2e0: 28 20 77 69 6e 49 6f 65 72 72 43 61 6e 52 65 74  ( winIoerrCanRet
f2f0: 72 79 31 28 65 29 20 29 7b 0a 20 20 20 20 73 71  ry1(e) ){.    sq
f300: 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65  lite3_win32_slee
f310: 70 28 77 69 6e 49 6f 65 72 72 52 65 74 72 79 44  p(winIoerrRetryD
f320: 65 6c 61 79 2a 28 31 2b 2a 70 6e 52 65 74 72 79  elay*(1+*pnRetry
f330: 29 29 3b 0a 20 20 20 20 2b 2b 2a 70 6e 52 65 74  ));.    ++*pnRet
f340: 72 79 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  ry;.    return 1
f350: 3b 0a 20 20 7d 0a 23 69 66 20 64 65 66 69 6e 65  ;.  }.#if define
f360: 64 28 77 69 6e 49 6f 65 72 72 43 61 6e 52 65 74  d(winIoerrCanRet
f370: 72 79 32 29 0a 20 20 65 6c 73 65 20 69 66 28 20  ry2).  else if( 
f380: 77 69 6e 49 6f 65 72 72 43 61 6e 52 65 74 72 79  winIoerrCanRetry
f390: 32 28 65 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  2(e) ){.    sqli
f3a0: 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28  te3_win32_sleep(
f3b0: 77 69 6e 49 6f 65 72 72 52 65 74 72 79 44 65 6c  winIoerrRetryDel
f3c0: 61 79 2a 28 31 2b 2a 70 6e 52 65 74 72 79 29 29  ay*(1+*pnRetry))
f3d0: 3b 0a 20 20 20 20 2b 2b 2a 70 6e 52 65 74 72 79  ;.    ++*pnRetry
f3e0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
f3f0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28    }.#endif.  if(
f400: 20 70 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 2a   pError ){.    *
f410: 70 45 72 72 6f 72 20 3d 20 65 3b 0a 20 20 7d 0a  pError = e;.  }.
f420: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
f430: 2a 0a 2a 2a 20 4c 6f 67 20 61 20 49 2f 4f 20 65  *.** Log a I/O e
f440: 72 72 6f 72 20 72 65 74 72 79 20 65 70 69 73 6f  rror retry episo
f450: 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  de..*/.static vo
f460: 69 64 20 77 69 6e 4c 6f 67 49 6f 65 72 72 28 69  id winLogIoerr(i
f470: 6e 74 20 6e 52 65 74 72 79 29 7b 0a 20 20 69 66  nt nRetry){.  if
f480: 28 20 6e 52 65 74 72 79 20 29 7b 0a 20 20 20 20  ( nRetry ){.    
f490: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49  sqlite3_log(SQLI
f4a0: 54 45 5f 49 4f 45 52 52 2c 0a 20 20 20 20 20 20  TE_IOERR,.      
f4b0: 22 64 65 6c 61 79 65 64 20 25 64 6d 73 20 66 6f  "delayed %dms fo
f4c0: 72 20 6c 6f 63 6b 2f 73 68 61 72 69 6e 67 20 63  r lock/sharing c
f4d0: 6f 6e 66 6c 69 63 74 22 2c 0a 20 20 20 20 20 20  onflict",.      
f4e0: 77 69 6e 49 6f 65 72 72 52 65 74 72 79 44 65 6c  winIoerrRetryDel
f4f0: 61 79 2a 6e 52 65 74 72 79 2a 28 6e 52 65 74 72  ay*nRetry*(nRetr
f500: 79 2b 31 29 2f 32 0a 20 20 20 20 29 3b 0a 20 20  y+1)/2.    );.  
f510: 7d 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  }.}..#if SQLITE_
f520: 4f 53 5f 57 49 4e 43 45 0a 2f 2a 2a 2a 2a 2a 2a  OS_WINCE./******
f530: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f540: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f550: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f560: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f570: 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 65 63 74  ***.** This sect
f580: 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64  ion contains cod
f590: 65 20 66 6f 72 20 57 69 6e 43 45 20 6f 6e 6c 79  e for WinCE only
f5a0: 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65  ..*/.#if !define
f5b0: 64 28 53 51 4c 49 54 45 5f 4d 53 56 43 5f 4c 4f  d(SQLITE_MSVC_LO
f5c0: 43 41 4c 54 49 4d 45 5f 41 50 49 29 20 7c 7c 20  CALTIME_API) || 
f5d0: 21 53 51 4c 49 54 45 5f 4d 53 56 43 5f 4c 4f 43  !SQLITE_MSVC_LOC
f5e0: 41 4c 54 49 4d 45 5f 41 50 49 0a 2f 2a 0a 2a 2a  ALTIME_API./*.**
f5f0: 20 54 68 65 20 4d 53 56 43 20 43 52 54 20 6f 6e   The MSVC CRT on
f600: 20 57 69 6e 64 6f 77 73 20 43 45 20 6d 61 79 20   Windows CE may 
f610: 6e 6f 74 20 68 61 76 65 20 61 20 6c 6f 63 61 6c  not have a local
f620: 74 69 6d 65 28 29 20 66 75 6e 63 74 69 6f 6e 2e  time() function.
f630: 20 20 53 6f 0a 2a 2a 20 63 72 65 61 74 65 20 61    So.** create a
f640: 20 73 75 62 73 74 69 74 75 74 65 2e 0a 2a 2f 0a   substitute..*/.
f650: 23 69 6e 63 6c 75 64 65 20 3c 74 69 6d 65 2e 68  #include <time.h
f660: 3e 0a 73 74 72 75 63 74 20 74 6d 20 2a 5f 5f 63  >.struct tm *__c
f670: 64 65 63 6c 20 6c 6f 63 61 6c 74 69 6d 65 28 63  decl localtime(c
f680: 6f 6e 73 74 20 74 69 6d 65 5f 74 20 2a 74 29 0a  onst time_t *t).
f690: 7b 0a 20 20 73 74 61 74 69 63 20 73 74 72 75 63  {.  static struc
f6a0: 74 20 74 6d 20 79 3b 0a 20 20 46 49 4c 45 54 49  t tm y;.  FILETI
f6b0: 4d 45 20 75 54 6d 2c 20 6c 54 6d 3b 0a 20 20 53  ME uTm, lTm;.  S
f6c0: 59 53 54 45 4d 54 49 4d 45 20 70 54 6d 3b 0a 20  YSTEMTIME pTm;. 
f6d0: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 74   sqlite3_int64 t
f6e0: 36 34 3b 0a 20 20 74 36 34 20 3d 20 2a 74 3b 0a  64;.  t64 = *t;.
f6f0: 20 20 74 36 34 20 3d 20 28 74 36 34 20 2b 20 31    t64 = (t64 + 1
f700: 31 36 34 34 34 37 33 36 30 30 29 2a 31 30 30 30  1644473600)*1000
f710: 30 30 30 30 3b 0a 20 20 75 54 6d 2e 64 77 4c 6f  0000;.  uTm.dwLo
f720: 77 44 61 74 65 54 69 6d 65 20 3d 20 28 44 57 4f  wDateTime = (DWO
f730: 52 44 29 28 74 36 34 20 26 20 30 78 46 46 46 46  RD)(t64 & 0xFFFF
f740: 46 46 46 46 29 3b 0a 20 20 75 54 6d 2e 64 77 48  FFFF);.  uTm.dwH
f750: 69 67 68 44 61 74 65 54 69 6d 65 3d 20 28 44 57  ighDateTime= (DW
f760: 4f 52 44 29 28 74 36 34 20 3e 3e 20 33 32 29 3b  ORD)(t64 >> 32);
f770: 0a 20 20 6f 73 46 69 6c 65 54 69 6d 65 54 6f 4c  .  osFileTimeToL
f780: 6f 63 61 6c 46 69 6c 65 54 69 6d 65 28 26 75 54  ocalFileTime(&uT
f790: 6d 2c 26 6c 54 6d 29 3b 0a 20 20 6f 73 46 69 6c  m,&lTm);.  osFil
f7a0: 65 54 69 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d  eTimeToSystemTim
f7b0: 65 28 26 6c 54 6d 2c 26 70 54 6d 29 3b 0a 20 20  e(&lTm,&pTm);.  
f7c0: 79 2e 74 6d 5f 79 65 61 72 20 3d 20 70 54 6d 2e  y.tm_year = pTm.
f7d0: 77 59 65 61 72 20 2d 20 31 39 30 30 3b 0a 20 20  wYear - 1900;.  
f7e0: 79 2e 74 6d 5f 6d 6f 6e 20 3d 20 70 54 6d 2e 77  y.tm_mon = pTm.w
f7f0: 4d 6f 6e 74 68 20 2d 20 31 3b 0a 20 20 79 2e 74  Month - 1;.  y.t
f800: 6d 5f 77 64 61 79 20 3d 20 70 54 6d 2e 77 44 61  m_wday = pTm.wDa
f810: 79 4f 66 57 65 65 6b 3b 0a 20 20 79 2e 74 6d 5f  yOfWeek;.  y.tm_
f820: 6d 64 61 79 20 3d 20 70 54 6d 2e 77 44 61 79 3b  mday = pTm.wDay;
f830: 0a 20 20 79 2e 74 6d 5f 68 6f 75 72 20 3d 20 70  .  y.tm_hour = p
f840: 54 6d 2e 77 48 6f 75 72 3b 0a 20 20 79 2e 74 6d  Tm.wHour;.  y.tm
f850: 5f 6d 69 6e 20 3d 20 70 54 6d 2e 77 4d 69 6e 75  _min = pTm.wMinu
f860: 74 65 3b 0a 20 20 79 2e 74 6d 5f 73 65 63 20 3d  te;.  y.tm_sec =
f870: 20 70 54 6d 2e 77 53 65 63 6f 6e 64 3b 0a 20 20   pTm.wSecond;.  
f880: 72 65 74 75 72 6e 20 26 79 3b 0a 7d 0a 23 65 6e  return &y;.}.#en
f890: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 48 41 4e  dif..#define HAN
f8a0: 44 4c 45 5f 54 4f 5f 57 49 4e 46 49 4c 45 28 61  DLE_TO_WINFILE(a
f8b0: 29 20 28 77 69 6e 46 69 6c 65 2a 29 26 28 28 63  ) (winFile*)&((c
f8c0: 68 61 72 2a 29 61 29 5b 2d 28 69 6e 74 29 6f 66  har*)a)[-(int)of
f8d0: 66 73 65 74 6f 66 28 77 69 6e 46 69 6c 65 2c 68  fsetof(winFile,h
f8e0: 29 5d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72  )]../*.** Acquir
f8f0: 65 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  e a lock on the 
f900: 68 61 6e 64 6c 65 20 68 0a 2a 2f 0a 73 74 61 74  handle h.*/.stat
f910: 69 63 20 76 6f 69 64 20 77 69 6e 63 65 4d 75 74  ic void winceMut
f920: 65 78 41 63 71 75 69 72 65 28 48 41 4e 44 4c 45  exAcquire(HANDLE
f930: 20 68 29 7b 0a 20 20 20 44 57 4f 52 44 20 64 77   h){.   DWORD dw
f940: 45 72 72 3b 0a 20 20 20 64 6f 20 7b 0a 20 20 20  Err;.   do {.   
f950: 20 20 64 77 45 72 72 20 3d 20 6f 73 57 61 69 74    dwErr = osWait
f960: 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 28  ForSingleObject(
f970: 68 2c 20 49 4e 46 49 4e 49 54 45 29 3b 0a 20 20  h, INFINITE);.  
f980: 20 7d 20 77 68 69 6c 65 20 28 64 77 45 72 72 20   } while (dwErr 
f990: 21 3d 20 57 41 49 54 5f 4f 42 4a 45 43 54 5f 30  != WAIT_OBJECT_0
f9a0: 20 26 26 20 64 77 45 72 72 20 21 3d 20 57 41 49   && dwErr != WAI
f9b0: 54 5f 41 42 41 4e 44 4f 4e 45 44 29 3b 0a 7d 0a  T_ABANDONED);.}.
f9c0: 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20  /*.** Release a 
f9d0: 6c 6f 63 6b 20 61 63 71 75 69 72 65 64 20 62 79  lock acquired by
f9e0: 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71 75 69   winceMutexAcqui
f9f0: 72 65 28 29 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  re().*/.#define 
fa00: 77 69 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73  winceMutexReleas
fa10: 65 28 68 29 20 52 65 6c 65 61 73 65 4d 75 74 65  e(h) ReleaseMute
fa20: 78 28 68 29 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  x(h)../*.** Crea
fa30: 74 65 20 74 68 65 20 6d 75 74 65 78 20 61 6e 64  te the mutex and
fa40: 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 75   shared memory u
fa50: 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20  sed for locking 
fa60: 69 6e 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 64  in the file.** d
fa70: 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 0a  escriptor pFile.
fa80: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
fa90: 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b 28 63 6f  nceCreateLock(co
faa0: 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
fab0: 61 6d 65 2c 20 77 69 6e 46 69 6c 65 20 2a 70 46  ame, winFile *pF
fac0: 69 6c 65 29 7b 0a 20 20 4c 50 57 53 54 52 20 7a  ile){.  LPWSTR z
fad0: 54 6f 6b 3b 0a 20 20 4c 50 57 53 54 52 20 7a 4e  Tok;.  LPWSTR zN
fae0: 61 6d 65 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73  ame;.  DWORD las
faf0: 74 45 72 72 6e 6f 3b 0a 20 20 42 4f 4f 4c 20 62  tErrno;.  BOOL b
fb00: 4c 6f 67 67 65 64 20 3d 20 46 41 4c 53 45 3b 0a  Logged = FALSE;.
fb10: 20 20 42 4f 4f 4c 20 62 49 6e 69 74 20 3d 20 54    BOOL bInit = T
fb20: 52 55 45 3b 0a 0a 20 20 7a 4e 61 6d 65 20 3d 20  RUE;..  zName = 
fb30: 77 69 6e 55 74 66 38 54 6f 55 6e 69 63 6f 64 65  winUtf8ToUnicode
fb40: 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69  (zFilename);.  i
fb50: 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20  f( zName==0 ){. 
fb60: 20 20 20 2f 2a 20 6f 75 74 20 6f 66 20 6d 65 6d     /* out of mem
fb70: 6f 72 79 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  ory */.    retur
fb80: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  n SQLITE_IOERR_N
fb90: 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  OMEM;.  }..  /* 
fba0: 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6c  Initialize the l
fbb0: 6f 63 61 6c 20 6c 6f 63 6b 64 61 74 61 20 2a 2f  ocal lockdata */
fbc0: 0a 20 20 6d 65 6d 73 65 74 28 26 70 46 69 6c 65  .  memset(&pFile
fbd0: 2d 3e 6c 6f 63 61 6c 2c 20 30 2c 20 73 69 7a 65  ->local, 0, size
fbe0: 6f 66 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 29  of(pFile->local)
fbf0: 29 3b 0a 0a 20 20 2f 2a 20 52 65 70 6c 61 63 65  );..  /* Replace
fc00: 20 74 68 65 20 62 61 63 6b 73 6c 61 73 68 65 73   the backslashes
fc10: 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 6e 61   from the filena
fc20: 6d 65 20 61 6e 64 20 6c 6f 77 65 72 63 61 73 65  me and lowercase
fc30: 20 69 74 0a 20 20 2a 2a 20 74 6f 20 64 65 72 69   it.  ** to deri
fc40: 76 65 20 61 20 6d 75 74 65 78 20 6e 61 6d 65 2e  ve a mutex name.
fc50: 20 2a 2f 0a 20 20 7a 54 6f 6b 20 3d 20 6f 73 43   */.  zTok = osC
fc60: 68 61 72 4c 6f 77 65 72 57 28 7a 4e 61 6d 65 29  harLowerW(zName)
fc70: 3b 0a 20 20 66 6f 72 20 28 3b 2a 7a 54 6f 6b 3b  ;.  for (;*zTok;
fc80: 7a 54 6f 6b 2b 2b 29 7b 0a 20 20 20 20 69 66 20  zTok++){.    if 
fc90: 28 2a 7a 54 6f 6b 20 3d 3d 20 27 5c 5c 27 29 20  (*zTok == '\\') 
fca0: 2a 7a 54 6f 6b 20 3d 20 27 5f 27 3b 0a 20 20 7d  *zTok = '_';.  }
fcb0: 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 2f 6f 70  ..  /* Create/op
fcc0: 65 6e 20 74 68 65 20 6e 61 6d 65 64 20 6d 75 74  en the named mut
fcd0: 65 78 20 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e 68  ex */.  pFile->h
fce0: 4d 75 74 65 78 20 3d 20 6f 73 43 72 65 61 74 65  Mutex = osCreate
fcf0: 4d 75 74 65 78 57 28 4e 55 4c 4c 2c 20 46 41 4c  MutexW(NULL, FAL
fd00: 53 45 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 69 66  SE, zName);.  if
fd10: 20 28 21 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78   (!pFile->hMutex
fd20: 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  ){.    pFile->la
fd30: 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
fd40: 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
fd50: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4e 61  sqlite3_free(zNa
fd60: 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  me);.    return 
fd70: 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
fd80: 54 45 5f 49 4f 45 52 52 2c 20 70 46 69 6c 65 2d  TE_IOERR, pFile-
fd90: 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20  >lastErrno,.    
fda0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fdb0: 20 20 20 22 77 69 6e 63 65 43 72 65 61 74 65 4c     "winceCreateL
fdc0: 6f 63 6b 31 22 2c 20 7a 46 69 6c 65 6e 61 6d 65  ock1", zFilename
fdd0: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71  );.  }..  /* Acq
fde0: 75 69 72 65 20 74 68 65 20 6d 75 74 65 78 20 62  uire the mutex b
fdf0: 65 66 6f 72 65 20 63 6f 6e 74 69 6e 75 69 6e 67  efore continuing
fe00: 20 2a 2f 0a 20 20 77 69 6e 63 65 4d 75 74 65 78   */.  winceMutex
fe10: 41 63 71 75 69 72 65 28 70 46 69 6c 65 2d 3e 68  Acquire(pFile->h
fe20: 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 53 69  Mutex);..  /* Si
fe30: 6e 63 65 20 74 68 65 20 6e 61 6d 65 73 20 6f 66  nce the names of
fe40: 20 6e 61 6d 65 64 20 6d 75 74 65 78 65 73 2c 20   named mutexes, 
fe50: 73 65 6d 61 70 68 6f 72 65 73 2c 20 66 69 6c 65  semaphores, file
fe60: 20 6d 61 70 70 69 6e 67 73 20 65 74 63 20 61 72   mappings etc ar
fe70: 65 0a 20 20 2a 2a 20 63 61 73 65 2d 73 65 6e 73  e.  ** case-sens
fe80: 69 74 69 76 65 2c 20 74 61 6b 65 20 61 64 76 61  itive, take adva
fe90: 6e 74 61 67 65 20 6f 66 20 74 68 61 74 20 62 79  ntage of that by
fea0: 20 75 70 70 65 72 63 61 73 69 6e 67 20 74 68 65   uppercasing the
feb0: 20 6d 75 74 65 78 20 6e 61 6d 65 0a 20 20 2a 2a   mutex name.  **
fec0: 20 61 6e 64 20 75 73 69 6e 67 20 74 68 61 74 20   and using that 
fed0: 61 73 20 74 68 65 20 73 68 61 72 65 64 20 66 69  as the shared fi
fee0: 6c 65 6d 61 70 70 69 6e 67 20 6e 61 6d 65 2e 0a  lemapping name..
fef0: 20 20 2a 2f 0a 20 20 6f 73 43 68 61 72 55 70 70    */.  osCharUpp
ff00: 65 72 57 28 7a 4e 61 6d 65 29 3b 0a 20 20 70 46  erW(zName);.  pF
ff10: 69 6c 65 2d 3e 68 53 68 61 72 65 64 20 3d 20 6f  ile->hShared = o
ff20: 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69  sCreateFileMappi
ff30: 6e 67 57 28 49 4e 56 41 4c 49 44 5f 48 41 4e 44  ngW(INVALID_HAND
ff40: 4c 45 5f 56 41 4c 55 45 2c 20 4e 55 4c 4c 2c 0a  LE_VALUE, NULL,.
ff50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff70: 20 20 20 20 20 20 20 20 50 41 47 45 5f 52 45 41          PAGE_REA
ff80: 44 57 52 49 54 45 2c 20 30 2c 20 73 69 7a 65 6f  DWRITE, 0, sizeo
ff90: 66 28 77 69 6e 63 65 4c 6f 63 6b 29 2c 0a 20 20  f(winceLock),.  
ffa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ffb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ffc0: 20 20 20 20 20 20 7a 4e 61 6d 65 29 3b 0a 0a 20        zName);.. 
ffd0: 20 2f 2a 20 53 65 74 20 61 20 66 6c 61 67 20 74   /* Set a flag t
ffe0: 68 61 74 20 69 6e 64 69 63 61 74 65 73 20 77 65  hat indicates we
fff0: 27 72 65 20 74 68 65 20 66 69 72 73 74 20 74 6f  're the first to
10000 20 63 72 65 61 74 65 20 74 68 65 20 6d 65 6d 6f   create the memo
10010 72 79 20 73 6f 20 69 74 0a 20 20 2a 2a 20 6d 75  ry so it.  ** mu
10020 73 74 20 62 65 20 7a 65 72 6f 2d 69 6e 69 74 69  st be zero-initi
10030 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 6c 61 73 74  alized */.  last
10040 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
10050 74 45 72 72 6f 72 28 29 3b 0a 20 20 69 66 20 28  tError();.  if (
10060 6c 61 73 74 45 72 72 6e 6f 20 3d 3d 20 45 52 52  lastErrno == ERR
10070 4f 52 5f 41 4c 52 45 41 44 59 5f 45 58 49 53 54  OR_ALREADY_EXIST
10080 53 29 7b 0a 20 20 20 20 62 49 6e 69 74 20 3d 20  S){.    bInit = 
10090 46 41 4c 53 45 3b 0a 20 20 7d 0a 0a 20 20 73 71  FALSE;.  }..  sq
100a0 6c 69 74 65 33 5f 66 72 65 65 28 7a 4e 61 6d 65  lite3_free(zName
100b0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 73  );..  /* If we s
100c0 75 63 63 65 65 64 65 64 20 69 6e 20 6d 61 6b 69  ucceeded in maki
100d0 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6d 65  ng the shared me
100e0 6d 6f 72 79 20 68 61 6e 64 6c 65 2c 20 6d 61 70  mory handle, map
100f0 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 46   it. */.  if( pF
10100 69 6c 65 2d 3e 68 53 68 61 72 65 64 20 29 7b 0a  ile->hShared ){.
10110 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65      pFile->share
10120 64 20 3d 20 28 77 69 6e 63 65 4c 6f 63 6b 2a 29  d = (winceLock*)
10130 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 28  osMapViewOfFile(
10140 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 2c 0a  pFile->hShared,.
10150 20 20 20 20 20 20 20 20 20 20 20 20 20 46 49 4c               FIL
10160 45 5f 4d 41 50 5f 52 45 41 44 7c 46 49 4c 45 5f  E_MAP_READ|FILE_
10170 4d 41 50 5f 57 52 49 54 45 2c 20 30 2c 20 30 2c  MAP_WRITE, 0, 0,
10180 20 73 69 7a 65 6f 66 28 77 69 6e 63 65 4c 6f 63   sizeof(winceLoc
10190 6b 29 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20 6d  k));.    /* If m
101a0 61 70 70 69 6e 67 20 66 61 69 6c 65 64 2c 20 63  apping failed, c
101b0 6c 6f 73 65 20 74 68 65 20 73 68 61 72 65 64 20  lose the shared 
101c0 6d 65 6d 6f 72 79 20 68 61 6e 64 6c 65 20 61 6e  memory handle an
101d0 64 20 65 72 61 73 65 20 69 74 20 2a 2f 0a 20 20  d erase it */.  
101e0 20 20 69 66 28 20 21 70 46 69 6c 65 2d 3e 73 68    if( !pFile->sh
101f0 61 72 65 64 20 29 7b 0a 20 20 20 20 20 20 70 46  ared ){.      pF
10200 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
10210 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
10220 29 3b 0a 20 20 20 20 20 20 77 69 6e 4c 6f 67 45  );.      winLogE
10230 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
10240 52 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  R, pFile->lastEr
10250 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
10260 20 20 20 20 20 20 20 22 77 69 6e 63 65 43 72 65         "winceCre
10270 61 74 65 4c 6f 63 6b 32 22 2c 20 7a 46 69 6c 65  ateLock2", zFile
10280 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62 4c 6f  name);.      bLo
10290 67 67 65 64 20 3d 20 54 52 55 45 3b 0a 20 20 20  gged = TRUE;.   
102a0 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65     osCloseHandle
102b0 28 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 29  (pFile->hShared)
102c0 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68  ;.      pFile->h
102d0 53 68 61 72 65 64 20 3d 20 4e 55 4c 4c 3b 0a 20  Shared = NULL;. 
102e0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
102f0 66 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  f shared memory 
10300 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63 72 65  could not be cre
10310 61 74 65 64 2c 20 74 68 65 6e 20 63 6c 6f 73 65  ated, then close
10320 20 74 68 65 20 6d 75 74 65 78 20 61 6e 64 20 66   the mutex and f
10330 61 69 6c 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ail */.  if( pFi
10340 6c 65 2d 3e 68 53 68 61 72 65 64 3d 3d 4e 55 4c  le->hShared==NUL
10350 4c 20 29 7b 0a 20 20 20 20 69 66 28 20 21 62 4c  L ){.    if( !bL
10360 6f 67 67 65 64 20 29 7b 0a 20 20 20 20 20 20 70  ogged ){.      p
10370 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
10380 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20  = lastErrno;.   
10390 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53     winLogError(S
103a0 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 70 46 69  QLITE_IOERR, pFi
103b0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20  le->lastErrno,. 
103c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
103d0 20 22 77 69 6e 63 65 43 72 65 61 74 65 4c 6f 63   "winceCreateLoc
103e0 6b 33 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b  k3", zFilename);
103f0 0a 20 20 20 20 20 20 62 4c 6f 67 67 65 64 20 3d  .      bLogged =
10400 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 20   TRUE;.    }.   
10410 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c 65 61   winceMutexRelea
10420 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78  se(pFile->hMutex
10430 29 3b 0a 20 20 20 20 6f 73 43 6c 6f 73 65 48 61  );.    osCloseHa
10440 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74  ndle(pFile->hMut
10450 65 78 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  ex);.    pFile->
10460 68 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 20  hMutex = NULL;. 
10470 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
10480 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a 0a 20 20 2f  _IOERR;.  }..  /
10490 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
104a0 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69   shared memory i
104b0 66 20 77 65 27 72 65 20 73 75 70 70 6f 73 65 64  f we're supposed
104c0 20 74 6f 20 2a 2f 0a 20 20 69 66 28 20 62 49 6e   to */.  if( bIn
104d0 69 74 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74  it ){.    memset
104e0 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2c 20  (pFile->shared, 
104f0 30 2c 20 73 69 7a 65 6f 66 28 77 69 6e 63 65 4c  0, sizeof(winceL
10500 6f 63 6b 29 29 3b 0a 20 20 7d 0a 0a 20 20 77 69  ock));.  }..  wi
10510 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28  nceMutexRelease(
10520 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a  pFile->hMutex);.
10530 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10540 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73  OK;.}../*.** Des
10550 74 72 6f 79 20 74 68 65 20 70 61 72 74 20 6f 66  troy the part of
10560 20 77 69 6e 46 69 6c 65 20 74 68 61 74 20 64 65   winFile that de
10570 61 6c 73 20 77 69 74 68 20 77 69 6e 63 65 20 6c  als with wince l
10580 6f 63 6b 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ocks.*/.static v
10590 6f 69 64 20 77 69 6e 63 65 44 65 73 74 72 6f 79  oid winceDestroy
105a0 4c 6f 63 6b 28 77 69 6e 46 69 6c 65 20 2a 70 46  Lock(winFile *pF
105b0 69 6c 65 29 7b 0a 20 20 69 66 20 28 70 46 69 6c  ile){.  if (pFil
105c0 65 2d 3e 68 4d 75 74 65 78 29 7b 0a 20 20 20 20  e->hMutex){.    
105d0 2f 2a 20 41 63 71 75 69 72 65 20 74 68 65 20 6d  /* Acquire the m
105e0 75 74 65 78 20 2a 2f 0a 20 20 20 20 77 69 6e 63  utex */.    winc
105f0 65 4d 75 74 65 78 41 63 71 75 69 72 65 28 70 46  eMutexAcquire(pF
10600 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 0a 20  ile->hMutex);.. 
10610 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77     /* The follow
10620 69 6e 67 20 62 6c 6f 63 6b 73 20 73 68 6f 75 6c  ing blocks shoul
10630 64 20 70 72 6f 62 61 62 6c 79 20 61 73 73 65 72  d probably asser
10640 74 20 69 6e 20 64 65 62 75 67 20 6d 6f 64 65 2c  t in debug mode,
10650 20 62 75 74 20 74 68 65 79 0a 20 20 20 20 20 20   but they.      
10660 20 61 72 65 20 74 6f 20 63 6c 65 61 6e 75 70 20   are to cleanup 
10670 69 6e 20 63 61 73 65 20 61 6e 79 20 6c 6f 63 6b  in case any lock
10680 73 20 72 65 6d 61 69 6e 65 64 20 6f 70 65 6e 20  s remained open 
10690 2a 2f 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65  */.    if (pFile
106a0 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73  ->local.nReaders
106b0 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
106c0 73 68 61 72 65 64 2d 3e 6e 52 65 61 64 65 72 73  shared->nReaders
106d0 20 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   --;.    }.    i
106e0 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e  f (pFile->local.
106f0 62 52 65 73 65 72 76 65 64 29 7b 0a 20 20 20 20  bReserved){.    
10700 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d    pFile->shared-
10710 3e 62 52 65 73 65 72 76 65 64 20 3d 20 46 41 4c  >bReserved = FAL
10720 53 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  SE;.    }.    if
10730 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62   (pFile->local.b
10740 50 65 6e 64 69 6e 67 29 7b 0a 20 20 20 20 20 20  Pending){.      
10750 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62  pFile->shared->b
10760 50 65 6e 64 69 6e 67 20 3d 20 46 41 4c 53 45 3b  Pending = FALSE;
10770 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 70  .    }.    if (p
10780 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63  File->local.bExc
10790 6c 75 73 69 76 65 29 7b 0a 20 20 20 20 20 20 70  lusive){.      p
107a0 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 45  File->shared->bE
107b0 78 63 6c 75 73 69 76 65 20 3d 20 46 41 4c 53 45  xclusive = FALSE
107c0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
107d0 44 65 2d 72 65 66 65 72 65 6e 63 65 20 61 6e 64  De-reference and
107e0 20 63 6c 6f 73 65 20 6f 75 72 20 63 6f 70 79 20   close our copy 
107f0 6f 66 20 74 68 65 20 73 68 61 72 65 64 20 6d 65  of the shared me
10800 6d 6f 72 79 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  mory handle */. 
10810 20 20 20 6f 73 55 6e 6d 61 70 56 69 65 77 4f 66     osUnmapViewOf
10820 46 69 6c 65 28 70 46 69 6c 65 2d 3e 73 68 61 72  File(pFile->shar
10830 65 64 29 3b 0a 20 20 20 20 6f 73 43 6c 6f 73 65  ed);.    osClose
10840 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 53  Handle(pFile->hS
10850 68 61 72 65 64 29 3b 0a 0a 20 20 20 20 2f 2a 20  hared);..    /* 
10860 44 6f 6e 65 20 77 69 74 68 20 74 68 65 20 6d 75  Done with the mu
10870 74 65 78 20 2a 2f 0a 20 20 20 20 77 69 6e 63 65  tex */.    wince
10880 4d 75 74 65 78 52 65 6c 65 61 73 65 28 70 46 69  MutexRelease(pFi
10890 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 20  le->hMutex);.   
108a0 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70   osCloseHandle(p
108b0 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20  File->hMutex);. 
108c0 20 20 20 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78     pFile->hMutex
108d0 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 7d 0a 0a   = NULL;.  }.}..
108e0 2f 2a 0a 2a 2a 20 41 6e 20 69 6d 70 6c 65 6d 65  /*.** An impleme
108f0 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 4c  ntation of the L
10900 6f 63 6b 46 69 6c 65 28 29 20 41 50 49 20 6f 66  ockFile() API of
10910 20 57 69 6e 64 6f 77 73 20 66 6f 72 20 43 45 0a   Windows for CE.
10920 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77  */.static BOOL w
10930 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 28 0a 20 20  inceLockFile(.  
10940 4c 50 48 41 4e 44 4c 45 20 70 68 46 69 6c 65 2c  LPHANDLE phFile,
10950 0a 20 20 44 57 4f 52 44 20 64 77 46 69 6c 65 4f  .  DWORD dwFileO
10960 66 66 73 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52  ffsetLow,.  DWOR
10970 44 20 64 77 46 69 6c 65 4f 66 66 73 65 74 48 69  D dwFileOffsetHi
10980 67 68 2c 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d  gh,.  DWORD nNum
10990 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b  berOfBytesToLock
109a0 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6e 4e 75  Low,.  DWORD nNu
109b0 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63  mberOfBytesToLoc
109c0 6b 48 69 67 68 0a 29 7b 0a 20 20 77 69 6e 46 69  kHigh.){.  winFi
109d0 6c 65 20 2a 70 46 69 6c 65 20 3d 20 48 41 4e 44  le *pFile = HAND
109e0 4c 45 5f 54 4f 5f 57 49 4e 46 49 4c 45 28 70 68  LE_TO_WINFILE(ph
109f0 46 69 6c 65 29 3b 0a 20 20 42 4f 4f 4c 20 62 52  File);.  BOOL bR
10a00 65 74 75 72 6e 20 3d 20 46 41 4c 53 45 3b 0a 0a  eturn = FALSE;..
10a10 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
10a20 45 52 28 64 77 46 69 6c 65 4f 66 66 73 65 74 48  ER(dwFileOffsetH
10a30 69 67 68 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  igh);.  UNUSED_P
10a40 41 52 41 4d 45 54 45 52 28 6e 4e 75 6d 62 65 72  ARAMETER(nNumber
10a50 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 48 69 67  OfBytesToLockHig
10a60 68 29 3b 0a 0a 20 20 69 66 20 28 21 70 46 69 6c  h);..  if (!pFil
10a70 65 2d 3e 68 4d 75 74 65 78 29 20 72 65 74 75 72  e->hMutex) retur
10a80 6e 20 54 52 55 45 3b 0a 20 20 77 69 6e 63 65 4d  n TRUE;.  winceM
10a90 75 74 65 78 41 63 71 75 69 72 65 28 70 46 69 6c  utexAcquire(pFil
10aa0 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 0a 20 20 2f  e->hMutex);..  /
10ab0 2a 20 57 61 6e 74 69 6e 67 20 61 6e 20 65 78 63  * Wanting an exc
10ac0 6c 75 73 69 76 65 20 6c 6f 63 6b 3f 20 2a 2f 0a  lusive lock? */.
10ad0 20 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73    if (dwFileOffs
10ae0 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29  etLow == (DWORD)
10af0 53 48 41 52 45 44 5f 46 49 52 53 54 0a 20 20 20  SHARED_FIRST.   
10b00 20 20 20 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66      && nNumberOf
10b10 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d  BytesToLockLow =
10b20 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f  = (DWORD)SHARED_
10b30 53 49 5a 45 29 7b 0a 20 20 20 20 69 66 20 28 70  SIZE){.    if (p
10b40 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 6e 52  File->shared->nR
10b50 65 61 64 65 72 73 20 3d 3d 20 30 20 26 26 20 70  eaders == 0 && p
10b60 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 45  File->shared->bE
10b70 78 63 6c 75 73 69 76 65 20 3d 3d 20 30 29 7b 0a  xclusive == 0){.
10b80 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68         pFile->sh
10b90 61 72 65 64 2d 3e 62 45 78 63 6c 75 73 69 76 65  ared->bExclusive
10ba0 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20 20   = TRUE;.       
10bb0 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78  pFile->local.bEx
10bc0 63 6c 75 73 69 76 65 20 3d 20 54 52 55 45 3b 0a  clusive = TRUE;.
10bd0 20 20 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d         bReturn =
10be0 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d   TRUE;.    }.  }
10bf0 0a 0a 20 20 2f 2a 20 57 61 6e 74 20 61 20 72 65  ..  /* Want a re
10c00 61 64 2d 6f 6e 6c 79 20 6c 6f 63 6b 3f 20 2a 2f  ad-only lock? */
10c10 0a 20 20 65 6c 73 65 20 69 66 20 28 64 77 46 69  .  else if (dwFi
10c20 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28  leOffsetLow == (
10c30 44 57 4f 52 44 29 53 48 41 52 45 44 5f 46 49 52  DWORD)SHARED_FIR
10c40 53 54 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  ST &&.          
10c50 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54   nNumberOfBytesT
10c60 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a  oLockLow == 1){.
10c70 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 73      if (pFile->s
10c80 68 61 72 65 64 2d 3e 62 45 78 63 6c 75 73 69 76  hared->bExclusiv
10c90 65 20 3d 3d 20 30 29 7b 0a 20 20 20 20 20 20 70  e == 0){.      p
10ca0 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61  File->local.nRea
10cb0 64 65 72 73 20 2b 2b 3b 0a 20 20 20 20 20 20 69  ders ++;.      i
10cc0 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e  f (pFile->local.
10cd0 6e 52 65 61 64 65 72 73 20 3d 3d 20 31 29 7b 0a  nReaders == 1){.
10ce0 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73          pFile->s
10cf0 68 61 72 65 64 2d 3e 6e 52 65 61 64 65 72 73 20  hared->nReaders 
10d00 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
10d10 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45    bReturn = TRUE
10d20 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
10d30 2a 20 57 61 6e 74 20 61 20 70 65 6e 64 69 6e 67  * Want a pending
10d40 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 65 6c 73 65   lock? */.  else
10d50 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65   if (dwFileOffse
10d60 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 50  tLow == (DWORD)P
10d70 45 4e 44 49 4e 47 5f 42 59 54 45 0a 20 20 20 20  ENDING_BYTE.    
10d80 20 20 20 20 20 20 20 26 26 20 6e 4e 75 6d 62 65         && nNumbe
10d90 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f  rOfBytesToLockLo
10da0 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20 2f 2a 20  w == 1){.    /* 
10db0 49 66 20 6e 6f 20 70 65 6e 64 69 6e 67 20 6c 6f  If no pending lo
10dc0 63 6b 20 68 61 73 20 62 65 65 6e 20 61 63 71 75  ck has been acqu
10dd0 69 72 65 64 2c 20 74 68 65 6e 20 61 63 71 75 69  ired, then acqui
10de0 72 65 20 69 74 20 2a 2f 0a 20 20 20 20 69 66 20  re it */.    if 
10df0 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e  (pFile->shared->
10e00 62 50 65 6e 64 69 6e 67 20 3d 3d 20 30 29 20 7b  bPending == 0) {
10e10 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68  .      pFile->sh
10e20 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e 67 20 3d  ared->bPending =
10e30 20 54 52 55 45 3b 0a 20 20 20 20 20 20 70 46 69   TRUE;.      pFi
10e40 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69  le->local.bPendi
10e50 6e 67 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20  ng = TRUE;.     
10e60 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b   bReturn = TRUE;
10e70 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
10e80 20 57 61 6e 74 20 61 20 72 65 73 65 72 76 65 64   Want a reserved
10e90 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 65 6c 73 65   lock? */.  else
10ea0 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65   if (dwFileOffse
10eb0 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 52  tLow == (DWORD)R
10ec0 45 53 45 52 56 45 44 5f 42 59 54 45 0a 20 20 20  ESERVED_BYTE.   
10ed0 20 20 20 20 20 20 20 20 26 26 20 6e 4e 75 6d 62          && nNumb
10ee0 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c  erOfBytesToLockL
10ef0 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20 69 66  ow == 1){.    if
10f00 20 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d   (pFile->shared-
10f10 3e 62 52 65 73 65 72 76 65 64 20 3d 3d 20 30 29  >bReserved == 0)
10f20 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e   {.      pFile->
10f30 73 68 61 72 65 64 2d 3e 62 52 65 73 65 72 76 65  shared->bReserve
10f40 64 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20  d = TRUE;.      
10f50 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65  pFile->local.bRe
10f60 73 65 72 76 65 64 20 3d 20 54 52 55 45 3b 0a 20  served = TRUE;. 
10f70 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54       bReturn = T
10f80 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  RUE;.    }.  }..
10f90 20 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c 65    winceMutexRele
10fa0 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65  ase(pFile->hMute
10fb0 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 52 65  x);.  return bRe
10fc0 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  turn;.}../*.** A
10fd0 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  n implementation
10fe0 20 6f 66 20 74 68 65 20 55 6e 6c 6f 63 6b 46 69   of the UnlockFi
10ff0 6c 65 20 41 50 49 20 6f 66 20 57 69 6e 64 6f 77  le API of Window
11000 73 20 66 6f 72 20 43 45 0a 2a 2f 0a 73 74 61 74  s for CE.*/.stat
11010 69 63 20 42 4f 4f 4c 20 77 69 6e 63 65 55 6e 6c  ic BOOL winceUnl
11020 6f 63 6b 46 69 6c 65 28 0a 20 20 4c 50 48 41 4e  ockFile(.  LPHAN
11030 44 4c 45 20 70 68 46 69 6c 65 2c 0a 20 20 44 57  DLE phFile,.  DW
11040 4f 52 44 20 64 77 46 69 6c 65 4f 66 66 73 65 74  ORD dwFileOffset
11050 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 64 77 46  Low,.  DWORD dwF
11060 69 6c 65 4f 66 66 73 65 74 48 69 67 68 2c 0a 20  ileOffsetHigh,. 
11070 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66   DWORD nNumberOf
11080 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77  BytesToUnlockLow
11090 2c 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65  ,.  DWORD nNumbe
110a0 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b  rOfBytesToUnlock
110b0 48 69 67 68 0a 29 7b 0a 20 20 77 69 6e 46 69 6c  High.){.  winFil
110c0 65 20 2a 70 46 69 6c 65 20 3d 20 48 41 4e 44 4c  e *pFile = HANDL
110d0 45 5f 54 4f 5f 57 49 4e 46 49 4c 45 28 70 68 46  E_TO_WINFILE(phF
110e0 69 6c 65 29 3b 0a 20 20 42 4f 4f 4c 20 62 52 65  ile);.  BOOL bRe
110f0 74 75 72 6e 20 3d 20 46 41 4c 53 45 3b 0a 0a 20  turn = FALSE;.. 
11100 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
11110 52 28 64 77 46 69 6c 65 4f 66 66 73 65 74 48 69  R(dwFileOffsetHi
11120 67 68 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  gh);.  UNUSED_PA
11130 52 41 4d 45 54 45 52 28 6e 4e 75 6d 62 65 72 4f  RAMETER(nNumberO
11140 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 48 69  fBytesToUnlockHi
11150 67 68 29 3b 0a 0a 20 20 69 66 20 28 21 70 46 69  gh);..  if (!pFi
11160 6c 65 2d 3e 68 4d 75 74 65 78 29 20 72 65 74 75  le->hMutex) retu
11170 72 6e 20 54 52 55 45 3b 0a 20 20 77 69 6e 63 65  rn TRUE;.  wince
11180 4d 75 74 65 78 41 63 71 75 69 72 65 28 70 46 69  MutexAcquire(pFi
11190 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 0a 20 20  le->hMutex);..  
111a0 2f 2a 20 52 65 6c 65 61 73 69 6e 67 20 61 20 72  /* Releasing a r
111b0 65 61 64 65 72 20 6c 6f 63 6b 20 6f 72 20 61 6e  eader lock or an
111c0 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
111d0 2a 2f 0a 20 20 69 66 20 28 64 77 46 69 6c 65 4f  */.  if (dwFileO
111e0 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f  ffsetLow == (DWO
111f0 52 44 29 53 48 41 52 45 44 5f 46 49 52 53 54 29  RD)SHARED_FIRST)
11200 7b 0a 20 20 20 20 2f 2a 20 44 69 64 20 77 65 20  {.    /* Did we 
11210 68 61 76 65 20 61 6e 20 65 78 63 6c 75 73 69 76  have an exclusiv
11220 65 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 20 20 69  e lock? */.    i
11230 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e  f (pFile->local.
11240 62 45 78 63 6c 75 73 69 76 65 29 7b 0a 20 20 20  bExclusive){.   
11250 20 20 20 61 73 73 65 72 74 28 6e 4e 75 6d 62 65     assert(nNumbe
11260 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b  rOfBytesToUnlock
11270 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48  Low == (DWORD)SH
11280 41 52 45 44 5f 53 49 5a 45 29 3b 0a 20 20 20 20  ARED_SIZE);.    
11290 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62    pFile->local.b
112a0 45 78 63 6c 75 73 69 76 65 20 3d 20 46 41 4c 53  Exclusive = FALS
112b0 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  E;.      pFile->
112c0 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75 73 69  shared->bExclusi
112d0 76 65 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20  ve = FALSE;.    
112e0 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45    bReturn = TRUE
112f0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
11300 44 69 64 20 77 65 20 6a 75 73 74 20 68 61 76 65  Did we just have
11310 20 61 20 72 65 61 64 65 72 20 6c 6f 63 6b 3f 20   a reader lock? 
11320 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69 66 20 28  */.    else if (
11330 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65  pFile->local.nRe
11340 61 64 65 72 73 29 7b 0a 20 20 20 20 20 20 61 73  aders){.      as
11350 73 65 72 74 28 6e 4e 75 6d 62 65 72 4f 66 42 79  sert(nNumberOfBy
11360 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d  tesToUnlockLow =
11370 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f  = (DWORD)SHARED_
11380 53 49 5a 45 0a 20 20 20 20 20 20 20 20 20 20 20  SIZE.           
11390 20 20 7c 7c 20 6e 4e 75 6d 62 65 72 4f 66 42 79    || nNumberOfBy
113a0 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d  tesToUnlockLow =
113b0 3d 20 31 29 3b 0a 20 20 20 20 20 20 70 46 69 6c  = 1);.      pFil
113c0 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72  e->local.nReader
113d0 73 20 2d 2d 3b 0a 20 20 20 20 20 20 69 66 20 28  s --;.      if (
113e0 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65  pFile->local.nRe
113f0 61 64 65 72 73 20 3d 3d 20 30 29 0a 20 20 20 20  aders == 0).    
11400 20 20 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c    {.        pFil
11410 65 2d 3e 73 68 61 72 65 64 2d 3e 6e 52 65 61 64  e->shared->nRead
11420 65 72 73 20 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a  ers --;.      }.
11430 20 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20        bReturn = 
11440 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  TRUE;.    }.  }.
11450 0a 20 20 2f 2a 20 52 65 6c 65 61 73 69 6e 67 20  .  /* Releasing 
11460 61 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 20 2a  a pending lock *
11470 2f 0a 20 20 65 6c 73 65 20 69 66 20 28 64 77 46  /.  else if (dwF
11480 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20  ileOffsetLow == 
11490 28 44 57 4f 52 44 29 50 45 4e 44 49 4e 47 5f 42  (DWORD)PENDING_B
114a0 59 54 45 0a 20 20 20 20 20 20 20 20 20 20 20 26  YTE.           &
114b0 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  & nNumberOfBytes
114c0 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31  ToUnlockLow == 1
114d0 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65  ){.    if (pFile
114e0 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67  ->local.bPending
114f0 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
11500 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67 20 3d  local.bPending =
11510 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 70 46   FALSE;.      pF
11520 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50 65  ile->shared->bPe
11530 6e 64 69 6e 67 20 3d 20 46 41 4c 53 45 3b 0a 20  nding = FALSE;. 
11540 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54       bReturn = T
11550 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  RUE;.    }.  }. 
11560 20 2f 2a 20 52 65 6c 65 61 73 69 6e 67 20 61 20   /* Releasing a 
11570 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 2a 2f  reserved lock */
11580 0a 20 20 65 6c 73 65 20 69 66 20 28 64 77 46 69  .  else if (dwFi
11590 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28  leOffsetLow == (
115a0 44 57 4f 52 44 29 52 45 53 45 52 56 45 44 5f 42  DWORD)RESERVED_B
115b0 59 54 45 0a 20 20 20 20 20 20 20 20 20 20 20 26  YTE.           &
115c0 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  & nNumberOfBytes
115d0 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31  ToUnlockLow == 1
115e0 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65  ){.    if (pFile
115f0 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76 65  ->local.bReserve
11600 64 29 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  d) {.      pFile
11610 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76 65  ->local.bReserve
11620 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20  d = FALSE;.     
11630 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e   pFile->shared->
11640 62 52 65 73 65 72 76 65 64 20 3d 20 46 41 4c 53  bReserved = FALS
11650 45 3b 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e  E;.      bReturn
11660 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20   = TRUE;.    }. 
11670 20 7d 0a 0a 20 20 77 69 6e 63 65 4d 75 74 65 78   }..  winceMutex
11680 52 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68  Release(pFile->h
11690 4d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  Mutex);.  return
116a0 20 62 52 65 74 75 72 6e 3b 0a 7d 0a 2f 2a 0a 2a   bReturn;.}./*.*
116b0 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 73 70 65  * End of the spe
116c0 63 69 61 6c 20 63 6f 64 65 20 66 6f 72 20 77 69  cial code for wi
116d0 6e 63 65 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  nce.************
116e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
116f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11700 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11710 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11720 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  */.#endif /* SQL
11730 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 2a 2f 0a  ITE_OS_WINCE */.
11740 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 61 20 66 69  ./*.** Lock a fi
11750 6c 65 20 72 65 67 69 6f 6e 2e 0a 2a 2f 0a 73 74  le region..*/.st
11760 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 4c 6f 63  atic BOOL winLoc
11770 6b 46 69 6c 65 28 0a 20 20 4c 50 48 41 4e 44 4c  kFile(.  LPHANDL
11780 45 20 70 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52  E phFile,.  DWOR
11790 44 20 66 6c 61 67 73 2c 0a 20 20 44 57 4f 52 44  D flags,.  DWORD
117a0 20 6f 66 66 73 65 74 4c 6f 77 2c 0a 20 20 44 57   offsetLow,.  DW
117b0 4f 52 44 20 6f 66 66 73 65 74 48 69 67 68 2c 0a  ORD offsetHigh,.
117c0 20 20 44 57 4f 52 44 20 6e 75 6d 42 79 74 65 73    DWORD numBytes
117d0 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6e 75 6d  Low,.  DWORD num
117e0 42 79 74 65 73 48 69 67 68 0a 29 7b 0a 23 69 66  BytesHigh.){.#if
117f0 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
11800 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4e 4f 54 45 3a  .  /*.  ** NOTE:
11810 20 57 69 6e 64 6f 77 73 20 43 45 20 69 73 20 68   Windows CE is h
11820 61 6e 64 6c 65 64 20 64 69 66 66 65 72 65 6e 74  andled different
11830 6c 79 20 68 65 72 65 20 64 75 65 20 69 74 73 20  ly here due its 
11840 6c 61 63 6b 20 6f 66 20 74 68 65 20 57 69 6e 33  lack of the Win3
11850 32 0a 20 20 2a 2a 20 20 20 20 20 20 20 41 50 49  2.  **       API
11860 20 4c 6f 63 6b 46 69 6c 65 2e 0a 20 20 2a 2f 0a   LockFile..  */.
11870 20 20 72 65 74 75 72 6e 20 77 69 6e 63 65 4c 6f    return winceLo
11880 63 6b 46 69 6c 65 28 70 68 46 69 6c 65 2c 20 6f  ckFile(phFile, o
11890 66 66 73 65 74 4c 6f 77 2c 20 6f 66 66 73 65 74  ffsetLow, offset
118a0 48 69 67 68 2c 0a 20 20 20 20 20 20 20 20 20 20  High,.          
118b0 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 75 6d               num
118c0 42 79 74 65 73 4c 6f 77 2c 20 6e 75 6d 42 79 74  BytesLow, numByt
118d0 65 73 48 69 67 68 29 3b 0a 23 65 6c 73 65 0a 20  esHigh);.#else. 
118e0 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b   if( osIsNT() ){
118f0 0a 20 20 20 20 4f 56 45 52 4c 41 50 50 45 44 20  .    OVERLAPPED 
11900 6f 76 6c 70 3b 0a 20 20 20 20 6d 65 6d 73 65 74  ovlp;.    memset
11910 28 26 6f 76 6c 70 2c 20 30 2c 20 73 69 7a 65 6f  (&ovlp, 0, sizeo
11920 66 28 4f 56 45 52 4c 41 50 50 45 44 29 29 3b 0a  f(OVERLAPPED));.
11930 20 20 20 20 6f 76 6c 70 2e 4f 66 66 73 65 74 20      ovlp.Offset 
11940 3d 20 6f 66 66 73 65 74 4c 6f 77 3b 0a 20 20 20  = offsetLow;.   
11950 20 6f 76 6c 70 2e 4f 66 66 73 65 74 48 69 67 68   ovlp.OffsetHigh
11960 20 3d 20 6f 66 66 73 65 74 48 69 67 68 3b 0a 20   = offsetHigh;. 
11970 20 20 20 72 65 74 75 72 6e 20 6f 73 4c 6f 63 6b     return osLock
11980 46 69 6c 65 45 78 28 2a 70 68 46 69 6c 65 2c 20  FileEx(*phFile, 
11990 66 6c 61 67 73 2c 20 30 2c 20 6e 75 6d 42 79 74  flags, 0, numByt
119a0 65 73 4c 6f 77 2c 20 6e 75 6d 42 79 74 65 73 48  esLow, numBytesH
119b0 69 67 68 2c 20 26 6f 76 6c 70 29 3b 0a 20 20 7d  igh, &ovlp);.  }
119c0 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
119d0 20 6f 73 4c 6f 63 6b 46 69 6c 65 28 2a 70 68 46   osLockFile(*phF
119e0 69 6c 65 2c 20 6f 66 66 73 65 74 4c 6f 77 2c 20  ile, offsetLow, 
119f0 6f 66 66 73 65 74 48 69 67 68 2c 20 6e 75 6d 42  offsetHigh, numB
11a00 79 74 65 73 4c 6f 77 2c 0a 20 20 20 20 20 20 20  ytesLow,.       
11a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
11a20 75 6d 42 79 74 65 73 48 69 67 68 29 3b 0a 20 20  umBytesHigh);.  
11a30 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  }.#endif.}../*.*
11a40 2a 20 55 6e 6c 6f 63 6b 20 61 20 66 69 6c 65 20  * Unlock a file 
11a50 72 65 67 69 6f 6e 2e 0a 20 2a 2f 0a 73 74 61 74  region.. */.stat
11a60 69 63 20 42 4f 4f 4c 20 77 69 6e 55 6e 6c 6f 63  ic BOOL winUnloc
11a70 6b 46 69 6c 65 28 0a 20 20 4c 50 48 41 4e 44 4c  kFile(.  LPHANDL
11a80 45 20 70 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52  E phFile,.  DWOR
11a90 44 20 6f 66 66 73 65 74 4c 6f 77 2c 0a 20 20 44  D offsetLow,.  D
11aa0 57 4f 52 44 20 6f 66 66 73 65 74 48 69 67 68 2c  WORD offsetHigh,
11ab0 0a 20 20 44 57 4f 52 44 20 6e 75 6d 42 79 74 65  .  DWORD numByte
11ac0 73 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6e 75  sLow,.  DWORD nu
11ad0 6d 42 79 74 65 73 48 69 67 68 0a 29 7b 0a 23 69  mBytesHigh.){.#i
11ae0 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
11af0 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4e 4f 54 45  E.  /*.  ** NOTE
11b00 3a 20 57 69 6e 64 6f 77 73 20 43 45 20 69 73 20  : Windows CE is 
11b10 68 61 6e 64 6c 65 64 20 64 69 66 66 65 72 65 6e  handled differen
11b20 74 6c 79 20 68 65 72 65 20 64 75 65 20 69 74 73  tly here due its
11b30 20 6c 61 63 6b 20 6f 66 20 74 68 65 20 57 69 6e   lack of the Win
11b40 33 32 0a 20 20 2a 2a 20 20 20 20 20 20 20 41 50  32.  **       AP
11b50 49 20 55 6e 6c 6f 63 6b 46 69 6c 65 2e 0a 20 20  I UnlockFile..  
11b60 2a 2f 0a 20 20 72 65 74 75 72 6e 20 77 69 6e 63  */.  return winc
11b70 65 55 6e 6c 6f 63 6b 46 69 6c 65 28 70 68 46 69  eUnlockFile(phFi
11b80 6c 65 2c 20 6f 66 66 73 65 74 4c 6f 77 2c 20 6f  le, offsetLow, o
11b90 66 66 73 65 74 48 69 67 68 2c 0a 20 20 20 20 20  ffsetHigh,.     
11ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11bb0 20 20 20 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c      numBytesLow,
11bc0 20 6e 75 6d 42 79 74 65 73 48 69 67 68 29 3b 0a   numBytesHigh);.
11bd0 23 65 6c 73 65 0a 20 20 69 66 28 20 6f 73 49 73  #else.  if( osIs
11be0 4e 54 28 29 20 29 7b 0a 20 20 20 20 4f 56 45 52  NT() ){.    OVER
11bf0 4c 41 50 50 45 44 20 6f 76 6c 70 3b 0a 20 20 20  LAPPED ovlp;.   
11c00 20 6d 65 6d 73 65 74 28 26 6f 76 6c 70 2c 20 30   memset(&ovlp, 0
11c10 2c 20 73 69 7a 65 6f 66 28 4f 56 45 52 4c 41 50  , sizeof(OVERLAP
11c20 50 45 44 29 29 3b 0a 20 20 20 20 6f 76 6c 70 2e  PED));.    ovlp.
11c30 4f 66 66 73 65 74 20 3d 20 6f 66 66 73 65 74 4c  Offset = offsetL
11c40 6f 77 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66 66  ow;.    ovlp.Off
11c50 73 65 74 48 69 67 68 20 3d 20 6f 66 66 73 65 74  setHigh = offset
11c60 48 69 67 68 3b 0a 20 20 20 20 72 65 74 75 72 6e  High;.    return
11c70 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 28   osUnlockFileEx(
11c80 2a 70 68 46 69 6c 65 2c 20 30 2c 20 6e 75 6d 42  *phFile, 0, numB
11c90 79 74 65 73 4c 6f 77 2c 20 6e 75 6d 42 79 74 65  ytesLow, numByte
11ca0 73 48 69 67 68 2c 20 26 6f 76 6c 70 29 3b 0a 20  sHigh, &ovlp);. 
11cb0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
11cc0 72 6e 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 28  rn osUnlockFile(
11cd0 2a 70 68 46 69 6c 65 2c 20 6f 66 66 73 65 74 4c  *phFile, offsetL
11ce0 6f 77 2c 20 6f 66 66 73 65 74 48 69 67 68 2c 20  ow, offsetHigh, 
11cf0 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 0a 20 20 20  numBytesLow,.   
11d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d10 20 20 20 20 20 6e 75 6d 42 79 74 65 73 48 69 67       numBytesHig
11d20 68 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d  h);.  }.#endif.}
11d30 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
11d40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11d50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11d60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11d70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11d80 0a 2a 2a 20 54 68 65 20 6e 65 78 74 20 67 72 6f  .** The next gro
11d90 75 70 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 69  up of routines i
11da0 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 49 2f 4f  mplement the I/O
11db0 20 6d 65 74 68 6f 64 73 20 73 70 65 63 69 66 69   methods specifi
11dc0 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 73 71 6c  ed.** by the sql
11dd0 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
11de0 6f 62 6a 65 63 74 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a  object..********
11df0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11e00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11e10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11e20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11e30 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53  ******/../*.** S
11e40 6f 6d 65 20 4d 69 63 72 6f 73 6f 66 74 20 63 6f  ome Microsoft co
11e50 6d 70 69 6c 65 72 73 20 6c 61 63 6b 20 74 68 69  mpilers lack thi
11e60 73 20 64 65 66 69 6e 69 74 69 6f 6e 2e 0a 2a 2f  s definition..*/
11e70 0a 23 69 66 6e 64 65 66 20 49 4e 56 41 4c 49 44  .#ifndef INVALID
11e80 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45  _SET_FILE_POINTE
11e90 52 0a 23 20 64 65 66 69 6e 65 20 49 4e 56 41 4c  R.# define INVAL
11ea0 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e  ID_SET_FILE_POIN
11eb0 54 45 52 20 28 28 44 57 4f 52 44 29 2d 31 29 0a  TER ((DWORD)-1).
11ec0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  #endif../*.** Mo
11ed0 76 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  ve the current p
11ee0 6f 73 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 66  osition of the f
11ef0 69 6c 65 20 68 61 6e 64 6c 65 20 70 61 73 73 65  ile handle passe
11f00 64 20 61 73 20 74 68 65 20 66 69 72 73 74 0a 2a  d as the first.*
11f10 2a 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 6f 66  * argument to of
11f20 66 73 65 74 20 69 4f 66 66 73 65 74 20 77 69 74  fset iOffset wit
11f30 68 69 6e 20 74 68 65 20 66 69 6c 65 2e 20 49 66  hin the file. If
11f40 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74   successful, ret
11f50 75 72 6e 20 30 2e 0a 2a 2a 20 4f 74 68 65 72 77  urn 0..** Otherw
11f60 69 73 65 2c 20 73 65 74 20 70 46 69 6c 65 2d 3e  ise, set pFile->
11f70 6c 61 73 74 45 72 72 6e 6f 20 61 6e 64 20 72 65  lastErrno and re
11f80 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a  turn non-zero..*
11f90 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
11fa0 53 65 65 6b 46 69 6c 65 28 77 69 6e 46 69 6c 65  SeekFile(winFile
11fb0 20 2a 70 46 69 6c 65 2c 20 73 71 6c 69 74 65 33   *pFile, sqlite3
11fc0 5f 69 6e 74 36 34 20 69 4f 66 66 73 65 74 29 7b  _int64 iOffset){
11fd0 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
11fe0 57 49 4e 52 54 0a 20 20 4c 4f 4e 47 20 75 70 70  WINRT.  LONG upp
11ff0 65 72 42 69 74 73 3b 20 20 20 20 20 20 20 20 20  erBits;         
12000 20 20 20 20 20 20 20 20 2f 2a 20 4d 6f 73 74 20          /* Most 
12010 73 69 67 2e 20 33 32 20 62 69 74 73 20 6f 66 20  sig. 32 bits of 
12020 6e 65 77 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20  new offset */.  
12030 4c 4f 4e 47 20 6c 6f 77 65 72 42 69 74 73 3b 20  LONG lowerBits; 
12040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12050 2f 2a 20 4c 65 61 73 74 20 73 69 67 2e 20 33 32  /* Least sig. 32
12060 20 62 69 74 73 20 6f 66 20 6e 65 77 20 6f 66 66   bits of new off
12070 73 65 74 20 2a 2f 0a 20 20 44 57 4f 52 44 20 64  set */.  DWORD d
12080 77 52 65 74 3b 20 20 20 20 20 20 20 20 20 20 20  wRet;           
12090 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
120a0 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 53 65  e returned by Se
120b0 74 46 69 6c 65 50 6f 69 6e 74 65 72 28 29 20 2a  tFilePointer() *
120c0 2f 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72  /.  DWORD lastEr
120d0 72 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  rno;            
120e0 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74      /* Value ret
120f0 75 72 6e 65 64 20 62 79 20 47 65 74 4c 61 73 74  urned by GetLast
12100 45 72 72 6f 72 28 29 20 2a 2f 0a 0a 20 20 4f 53  Error() */..  OS
12110 54 52 41 43 45 28 28 22 53 45 45 4b 20 66 69 6c  TRACE(("SEEK fil
12120 65 3d 25 70 2c 20 6f 66 66 73 65 74 3d 25 6c 6c  e=%p, offset=%ll
12130 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  d\n", pFile->h, 
12140 69 4f 66 66 73 65 74 29 29 3b 0a 0a 20 20 75 70  iOffset));..  up
12150 70 65 72 42 69 74 73 20 3d 20 28 4c 4f 4e 47 29  perBits = (LONG)
12160 28 28 69 4f 66 66 73 65 74 3e 3e 33 32 29 20 26  ((iOffset>>32) &
12170 20 30 78 37 66 66 66 66 66 66 66 29 3b 0a 20 20   0x7fffffff);.  
12180 6c 6f 77 65 72 42 69 74 73 20 3d 20 28 4c 4f 4e  lowerBits = (LON
12190 47 29 28 69 4f 66 66 73 65 74 20 26 20 30 78 66  G)(iOffset & 0xf
121a0 66 66 66 66 66 66 66 29 3b 0a 0a 20 20 2f 2a 20  fffffff);..  /* 
121b0 41 50 49 20 6f 64 64 69 74 79 3a 20 49 66 20 73  API oddity: If s
121c0 75 63 63 65 73 73 66 75 6c 2c 20 53 65 74 46 69  uccessful, SetFi
121d0 6c 65 50 6f 69 6e 74 65 72 28 29 20 72 65 74 75  lePointer() retu
121e0 72 6e 73 20 61 20 64 77 6f 72 64 0a 20 20 2a 2a  rns a dword.  **
121f0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
12200 6c 6f 77 65 72 20 33 32 2d 62 69 74 73 20 6f 66  lower 32-bits of
12210 20 74 68 65 20 6e 65 77 20 66 69 6c 65 2d 6f 66   the new file-of
12220 66 73 65 74 2e 20 4f 72 2c 20 69 66 20 69 74 20  fset. Or, if it 
12230 66 61 69 6c 73 2c 0a 20 20 2a 2a 20 69 74 20 72  fails,.  ** it r
12240 65 74 75 72 6e 73 20 49 4e 56 41 4c 49 44 5f 53  eturns INVALID_S
12250 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 2e  ET_FILE_POINTER.
12260 20 48 6f 77 65 76 65 72 20 61 63 63 6f 72 64 69   However accordi
12270 6e 67 20 74 6f 20 4d 53 44 4e 2c 0a 20 20 2a 2a  ng to MSDN,.  **
12280 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c   INVALID_SET_FIL
12290 45 5f 50 4f 49 4e 54 45 52 20 6d 61 79 20 61 6c  E_POINTER may al
122a0 73 6f 20 62 65 20 61 20 76 61 6c 69 64 20 6e 65  so be a valid ne
122b0 77 20 6f 66 66 73 65 74 2e 20 53 6f 20 74 6f 20  w offset. So to 
122c0 64 65 74 65 72 6d 69 6e 65 0a 20 20 2a 2a 20 77  determine.  ** w
122d0 68 65 74 68 65 72 20 61 6e 20 65 72 72 6f 72 20  hether an error 
122e0 68 61 73 20 61 63 74 75 61 6c 6c 79 20 6f 63 63  has actually occ
122f0 75 72 72 65 64 2c 20 69 74 20 69 73 20 61 6c 73  urred, it is als
12300 6f 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 63  o necessary to c
12310 61 6c 6c 0a 20 20 2a 2a 20 47 65 74 4c 61 73 74  all.  ** GetLast
12320 45 72 72 6f 72 28 29 2e 0a 20 20 2a 2f 0a 20 20  Error()..  */.  
12330 64 77 52 65 74 20 3d 20 6f 73 53 65 74 46 69 6c  dwRet = osSetFil
12340 65 50 6f 69 6e 74 65 72 28 70 46 69 6c 65 2d 3e  ePointer(pFile->
12350 68 2c 20 6c 6f 77 65 72 42 69 74 73 2c 20 26 75  h, lowerBits, &u
12360 70 70 65 72 42 69 74 73 2c 20 46 49 4c 45 5f 42  pperBits, FILE_B
12370 45 47 49 4e 29 3b 0a 0a 20 20 69 66 28 20 28 64  EGIN);..  if( (d
12380 77 52 65 74 3d 3d 49 4e 56 41 4c 49 44 5f 53 45  wRet==INVALID_SE
12390 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 0a 20  T_FILE_POINTER. 
123a0 20 20 20 20 20 26 26 20 28 28 6c 61 73 74 45 72       && ((lastEr
123b0 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
123c0 72 72 6f 72 28 29 29 21 3d 4e 4f 5f 45 52 52 4f  rror())!=NO_ERRO
123d0 52 29 29 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  R)) ){.    pFile
123e0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61  ->lastErrno = la
123f0 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 77 69 6e  stErrno;.    win
12400 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
12410 49 4f 45 52 52 5f 53 45 45 4b 2c 20 70 46 69 6c  IOERR_SEEK, pFil
12420 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20  e->lastErrno,.  
12430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
12440 69 6e 53 65 65 6b 46 69 6c 65 22 2c 20 70 46 69  inSeekFile", pFi
12450 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20  le->zPath);.    
12460 4f 53 54 52 41 43 45 28 28 22 53 45 45 4b 20 66  OSTRACE(("SEEK f
12470 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  ile=%p, rc=SQLIT
12480 45 5f 49 4f 45 52 52 5f 53 45 45 4b 5c 6e 22 2c  E_IOERR_SEEK\n",
12490 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20   pFile->h));.   
124a0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a   return 1;.  }..
124b0 20 20 4f 53 54 52 41 43 45 28 28 22 53 45 45 4b    OSTRACE(("SEEK
124c0 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c   file=%p, rc=SQL
124d0 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65  ITE_OK\n", pFile
124e0 2d 3e 68 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  ->h));.  return 
124f0 30 3b 0a 23 65 6c 73 65 0a 20 20 2f 2a 0a 20 20  0;.#else.  /*.  
12500 2a 2a 20 53 61 6d 65 20 61 73 20 61 62 6f 76 65  ** Same as above
12510 2c 20 65 78 63 65 70 74 20 74 68 61 74 20 74 68  , except that th
12520 69 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  is implementatio
12530 6e 20 77 6f 72 6b 73 20 66 6f 72 20 57 69 6e 52  n works for WinR
12540 54 2e 0a 20 20 2a 2f 0a 0a 20 20 4c 41 52 47 45  T..  */..  LARGE
12550 5f 49 4e 54 45 47 45 52 20 78 3b 20 20 20 20 20  _INTEGER x;     
12560 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
12570 65 20 6e 65 77 20 6f 66 66 73 65 74 20 2a 2f 0a  e new offset */.
12580 20 20 42 4f 4f 4c 20 62 52 65 74 3b 20 20 20 20    BOOL bRet;    
12590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
125a0 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72    /* Value retur
125b0 6e 65 64 20 62 79 20 53 65 74 46 69 6c 65 50 6f  ned by SetFilePo
125c0 69 6e 74 65 72 45 78 28 29 20 2a 2f 0a 0a 20 20  interEx() */..  
125d0 78 2e 51 75 61 64 50 61 72 74 20 3d 20 69 4f 66  x.QuadPart = iOf
125e0 66 73 65 74 3b 0a 20 20 62 52 65 74 20 3d 20 6f  fset;.  bRet = o
125f0 73 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 45  sSetFilePointerE
12600 78 28 70 46 69 6c 65 2d 3e 68 2c 20 78 2c 20 30  x(pFile->h, x, 0
12610 2c 20 46 49 4c 45 5f 42 45 47 49 4e 29 3b 0a 0a  , FILE_BEGIN);..
12620 20 20 69 66 28 21 62 52 65 74 29 7b 0a 20 20 20    if(!bRet){.   
12630 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
12640 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
12650 6f 72 28 29 3b 0a 20 20 20 20 77 69 6e 4c 6f 67  or();.    winLog
12660 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
12670 52 52 5f 53 45 45 4b 2c 20 70 46 69 6c 65 2d 3e  RR_SEEK, pFile->
12680 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  lastErrno,.     
12690 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 53             "winS
126a0 65 65 6b 46 69 6c 65 22 2c 20 70 46 69 6c 65 2d  eekFile", pFile-
126b0 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 4f 53 54  >zPath);.    OST
126c0 52 41 43 45 28 28 22 53 45 45 4b 20 66 69 6c 65  RACE(("SEEK file
126d0 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49  =%p, rc=SQLITE_I
126e0 4f 45 52 52 5f 53 45 45 4b 5c 6e 22 2c 20 70 46  OERR_SEEK\n", pF
126f0 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65  ile->h));.    re
12700 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 4f  turn 1;.  }..  O
12710 53 54 52 41 43 45 28 28 22 53 45 45 4b 20 66 69  STRACE(("SEEK fi
12720 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
12730 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  _OK\n", pFile->h
12740 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  ));.  return 0;.
12750 23 65 6e 64 69 66 0a 7d 0a 0a 23 69 66 20 53 51  #endif.}..#if SQ
12760 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
12770 5a 45 3e 30 0a 2f 2a 20 46 6f 72 77 61 72 64 20  ZE>0./* Forward 
12780 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 56 46  references to VF
12790 53 20 68 65 6c 70 65 72 20 6d 65 74 68 6f 64 73  S helper methods
127a0 20 75 73 65 64 20 66 6f 72 20 6d 65 6d 6f 72 79   used for memory
127b0 20 6d 61 70 70 65 64 20 66 69 6c 65 73 20 2a 2f   mapped files */
127c0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d  .static int winM
127d0 61 70 66 69 6c 65 28 77 69 6e 46 69 6c 65 2a 2c  apfile(winFile*,
127e0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 3b   sqlite3_int64);
127f0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 55  .static int winU
12800 6e 6d 61 70 66 69 6c 65 28 77 69 6e 46 69 6c 65  nmapfile(winFile
12810 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  *);.#endif../*.*
12820 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a  * Close a file..
12830 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 72 65 70 6f  **.** It is repo
12840 72 74 65 64 20 74 68 61 74 20 61 6e 20 61 74 74  rted that an att
12850 65 6d 70 74 20 74 6f 20 63 6c 6f 73 65 20 61 20  empt to close a 
12860 68 61 6e 64 6c 65 20 6d 69 67 68 74 20 73 6f 6d  handle might som
12870 65 74 69 6d 65 73 0a 2a 2a 20 66 61 69 6c 2e 20  etimes.** fail. 
12880 20 54 68 69 73 20 69 73 20 61 20 76 65 72 79 20   This is a very 
12890 75 6e 72 65 61 73 6f 6e 61 62 6c 65 20 72 65 73  unreasonable res
128a0 75 6c 74 2c 20 62 75 74 20 57 69 6e 64 6f 77 73  ult, but Windows
128b0 20 69 73 20 6e 6f 74 6f 72 69 6f 75 73 0a 2a 2a   is notorious.**
128c0 20 66 6f 72 20 62 65 69 6e 67 20 75 6e 72 65 61   for being unrea
128d0 73 6f 6e 61 62 6c 65 20 73 6f 20 49 20 64 6f 20  sonable so I do 
128e0 6e 6f 74 20 64 6f 75 62 74 20 74 68 61 74 20 69  not doubt that i
128f0 74 20 6d 69 67 68 74 20 68 61 70 70 65 6e 2e 20  t might happen. 
12900 20 49 66 0a 2a 2a 20 74 68 65 20 63 6c 6f 73 65   If.** the close
12910 20 66 61 69 6c 73 2c 20 77 65 20 70 61 75 73 65   fails, we pause
12920 20 66 6f 72 20 31 30 30 20 6d 69 6c 6c 69 73 65   for 100 millise
12930 63 6f 6e 64 73 20 61 6e 64 20 74 72 79 20 61 67  conds and try ag
12940 61 69 6e 2e 20 20 41 73 0a 2a 2a 20 6d 61 6e 79  ain.  As.** many
12950 20 61 73 20 4d 58 5f 43 4c 4f 53 45 5f 41 54 54   as MX_CLOSE_ATT
12960 45 4d 50 54 20 61 74 74 65 6d 70 74 73 20 74 6f  EMPT attempts to
12970 20 63 6c 6f 73 65 20 74 68 65 20 68 61 6e 64 6c   close the handl
12980 65 20 61 72 65 20 6d 61 64 65 20 62 65 66 6f 72  e are made befor
12990 65 0a 2a 2a 20 67 69 76 69 6e 67 20 75 70 20 61  e.** giving up a
129a0 6e 64 20 72 65 74 75 72 6e 69 6e 67 20 61 6e 20  nd returning an 
129b0 65 72 72 6f 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e  error..*/.#defin
129c0 65 20 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d  e MX_CLOSE_ATTEM
129d0 50 54 20 33 0a 73 74 61 74 69 63 20 69 6e 74 20  PT 3.static int 
129e0 77 69 6e 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  winClose(sqlite3
129f0 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 69 6e  _file *id){.  in
12a00 74 20 72 63 2c 20 63 6e 74 20 3d 20 30 3b 0a 20  t rc, cnt = 0;. 
12a10 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20   winFile *pFile 
12a20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a  = (winFile*)id;.
12a30 0a 20 20 61 73 73 65 72 74 28 20 69 64 21 3d 30  .  assert( id!=0
12a40 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   );.#ifndef SQLI
12a50 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 61 73  TE_OMIT_WAL.  as
12a60 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 70 53 68  sert( pFile->pSh
12a70 6d 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a 20  m==0 );.#endif. 
12a80 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
12a90 68 21 3d 4e 55 4c 4c 20 26 26 20 70 46 69 6c 65  h!=NULL && pFile
12aa0 2d 3e 68 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e  ->h!=INVALID_HAN
12ab0 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 20 20 4f  DLE_VALUE );.  O
12ac0 53 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20 66  STRACE(("CLOSE f
12ad0 69 6c 65 3d 25 70 5c 6e 22 2c 20 70 46 69 6c 65  ile=%p\n", pFile
12ae0 2d 3e 68 29 29 3b 0a 0a 23 69 66 20 53 51 4c 49  ->h));..#if SQLI
12af0 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
12b00 3e 30 0a 20 20 77 69 6e 55 6e 6d 61 70 66 69 6c  >0.  winUnmapfil
12b10 65 28 70 46 69 6c 65 29 3b 0a 23 65 6e 64 69 66  e(pFile);.#endif
12b20 0a 0a 20 20 64 6f 7b 0a 20 20 20 20 72 63 20 3d  ..  do{.    rc =
12b30 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70   osCloseHandle(p
12b40 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 20 20 2f 2a  File->h);.    /*
12b50 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
12b60 28 20 72 63 3d 30 3b 20 63 6e 74 3d 4d 58 5f 43  ( rc=0; cnt=MX_C
12b70 4c 4f 53 45 5f 41 54 54 45 4d 50 54 3b 20 29 3b  LOSE_ATTEMPT; );
12b80 20 2a 2f 0a 20 20 7d 77 68 69 6c 65 28 20 72 63   */.  }while( rc
12b90 3d 3d 30 20 26 26 20 2b 2b 63 6e 74 20 3c 20 4d  ==0 && ++cnt < M
12ba0 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d 50 54 20  X_CLOSE_ATTEMPT 
12bb0 26 26 20 28 73 71 6c 69 74 65 33 5f 77 69 6e 33  && (sqlite3_win3
12bc0 32 5f 73 6c 65 65 70 28 31 30 30 29 2c 20 31 29  2_sleep(100), 1)
12bd0 20 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f   );.#if SQLITE_O
12be0 53 5f 57 49 4e 43 45 0a 23 64 65 66 69 6e 65 20  S_WINCE.#define 
12bf0 57 49 4e 43 45 5f 44 45 4c 45 54 49 4f 4e 5f 41  WINCE_DELETION_A
12c00 54 54 45 4d 50 54 53 20 33 0a 20 20 77 69 6e 63  TTEMPTS 3.  winc
12c10 65 44 65 73 74 72 6f 79 4c 6f 63 6b 28 70 46 69  eDestroyLock(pFi
12c20 6c 65 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65  le);.  if( pFile
12c30 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65  ->zDeleteOnClose
12c40 20 29 7b 0a 20 20 20 20 69 6e 74 20 63 6e 74 20   ){.    int cnt 
12c50 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 0a  = 0;.    while(.
12c60 20 20 20 20 20 20 20 20 20 20 20 6f 73 44 65 6c             osDel
12c70 65 74 65 46 69 6c 65 57 28 70 46 69 6c 65 2d 3e  eteFileW(pFile->
12c80 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 29 3d  zDeleteOnClose)=
12c90 3d 30 0a 20 20 20 20 20 20 20 20 26 26 20 6f 73  =0.        && os
12ca0 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
12cb0 73 57 28 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74  sW(pFile->zDelet
12cc0 65 4f 6e 43 6c 6f 73 65 29 21 3d 30 78 66 66 66  eOnClose)!=0xfff
12cd0 66 66 66 66 66 0a 20 20 20 20 20 20 20 20 26 26  fffff.        &&
12ce0 20 63 6e 74 2b 2b 20 3c 20 57 49 4e 43 45 5f 44   cnt++ < WINCE_D
12cf0 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d 50 54 53  ELETION_ATTEMPTS
12d00 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 73  .    ){.       s
12d10 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65  qlite3_win32_sle
12d20 65 70 28 31 30 30 29 3b 20 20 2f 2a 20 57 61 69  ep(100);  /* Wai
12d30 74 20 61 20 6c 69 74 74 6c 65 20 62 65 66 6f 72  t a little befor
12d40 65 20 74 72 79 69 6e 67 20 61 67 61 69 6e 20 2a  e trying again *
12d50 2f 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  /.    }.    sqli
12d60 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e  te3_free(pFile->
12d70 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 29 3b  zDeleteOnClose);
12d80 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
12d90 28 20 72 63 20 29 7b 0a 20 20 20 20 70 46 69 6c  ( rc ){.    pFil
12da0 65 2d 3e 68 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d  e->h = NULL;.  }
12db0 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2d  .  OpenCounter(-
12dc0 31 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  1);.  OSTRACE(("
12dd0 43 4c 4f 53 45 20 66 69 6c 65 3d 25 70 2c 20 72  CLOSE file=%p, r
12de0 63 3d 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  c=%s\n", pFile->
12df0 68 2c 20 72 63 20 3f 20 22 6f 6b 22 20 3a 20 22  h, rc ? "ok" : "
12e00 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 72 65 74  failed"));.  ret
12e10 75 72 6e 20 72 63 20 3f 20 53 51 4c 49 54 45 5f  urn rc ? SQLITE_
12e20 4f 4b 0a 20 20 20 20 20 20 20 20 20 20 20 20 3a  OK.            :
12e30 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
12e40 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 2c  ITE_IOERR_CLOSE,
12e50 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
12e60 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
12e70 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
12e80 6e 43 6c 6f 73 65 22 2c 20 70 46 69 6c 65 2d 3e  nClose", pFile->
12e90 7a 50 61 74 68 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  zPath);.}../*.**
12ea0 20 52 65 61 64 20 64 61 74 61 20 66 72 6f 6d 20   Read data from 
12eb0 61 20 66 69 6c 65 20 69 6e 74 6f 20 61 20 62 75  a file into a bu
12ec0 66 66 65 72 2e 20 20 52 65 74 75 72 6e 20 53 51  ffer.  Return SQ
12ed0 4c 49 54 45 5f 4f 4b 20 69 66 20 61 6c 6c 0a 2a  LITE_OK if all.*
12ee0 2a 20 62 79 74 65 73 20 77 65 72 65 20 72 65 61  * bytes were rea
12ef0 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 61  d successfully a
12f00 6e 64 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20  nd SQLITE_IOERR 
12f10 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73  if anything goes
12f20 0a 2a 2a 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74  .** wrong..*/.st
12f30 61 74 69 63 20 69 6e 74 20 77 69 6e 52 65 61 64  atic int winRead
12f40 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
12f50 20 2a 69 64 2c 20 20 20 20 20 20 20 20 20 20 2f   *id,          /
12f60 2a 20 46 69 6c 65 20 74 6f 20 72 65 61 64 20 66  * File to read f
12f70 72 6f 6d 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  rom */.  void *p
12f80 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 20 20  Buf,            
12f90 20 20 20 20 2f 2a 20 57 72 69 74 65 20 63 6f 6e      /* Write con
12fa0 74 65 6e 74 20 69 6e 74 6f 20 74 68 69 73 20 62  tent into this b
12fb0 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 61  uffer */.  int a
12fc0 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  mt,             
12fd0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
12fe0 6f 66 20 62 79 74 65 73 20 74 6f 20 72 65 61 64  of bytes to read
12ff0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
13000 74 36 34 20 6f 66 66 73 65 74 20 20 20 20 20 20  t64 offset      
13010 20 2f 2a 20 42 65 67 69 6e 20 72 65 61 64 69 6e   /* Begin readin
13020 67 20 61 74 20 74 68 69 73 20 6f 66 66 73 65 74  g at this offset
13030 20 2a 2f 0a 29 7b 0a 23 69 66 20 21 53 51 4c 49   */.){.#if !SQLI
13040 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 4f 56  TE_OS_WINCE.  OV
13050 45 52 4c 41 50 50 45 44 20 6f 76 65 72 6c 61 70  ERLAPPED overlap
13060 70 65 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ped;          /*
13070 20 54 68 65 20 6f 66 66 73 65 74 20 66 6f 72 20   The offset for 
13080 52 65 61 64 46 69 6c 65 2e 20 2a 2f 0a 23 65 6e  ReadFile. */.#en
13090 64 69 66 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70  dif.  winFile *p
130a0 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a  File = (winFile*
130b0 29 69 64 3b 20 20 2f 2a 20 66 69 6c 65 20 68 61  )id;  /* file ha
130c0 6e 64 6c 65 20 2a 2f 0a 20 20 44 57 4f 52 44 20  ndle */.  DWORD 
130d0 6e 52 65 61 64 3b 20 20 20 20 20 20 20 20 20 20  nRead;          
130e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
130f0 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 63 74  ber of bytes act
13100 75 61 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d 20  ually read from 
13110 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  file */.  int nR
13120 65 74 72 79 20 3d 20 30 3b 20 20 20 20 20 20 20  etry = 0;       
13130 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
13140 62 65 72 20 6f 66 20 72 65 74 72 79 73 20 2a 2f  ber of retrys */
13150 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 21 3d  ..  assert( id!=
13160 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  0 );.  assert( a
13170 6d 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  mt>0 );.  assert
13180 28 20 6f 66 66 73 65 74 3e 3d 30 20 29 3b 0a 20  ( offset>=0 );. 
13190 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
131a0 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49  (return SQLITE_I
131b0 4f 45 52 52 5f 52 45 41 44 29 3b 0a 20 20 4f 53  OERR_READ);.  OS
131c0 54 52 41 43 45 28 28 22 52 45 41 44 20 66 69 6c  TRACE(("READ fil
131d0 65 3d 25 70 2c 20 62 75 66 66 65 72 3d 25 70 2c  e=%p, buffer=%p,
131e0 20 61 6d 6f 75 6e 74 3d 25 64 2c 20 6f 66 66 73   amount=%d, offs
131f0 65 74 3d 25 6c 6c 64 2c 20 6c 6f 63 6b 3d 25 64  et=%lld, lock=%d
13200 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
13210 70 46 69 6c 65 2d 3e 68 2c 20 70 42 75 66 2c 20  pFile->h, pBuf, 
13220 61 6d 74 2c 20 6f 66 66 73 65 74 2c 20 70 46 69  amt, offset, pFi
13230 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29 3b 0a  le->locktype));.
13240 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
13250 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 2f 2a  MMAP_SIZE>0.  /*
13260 20 44 65 61 6c 20 77 69 74 68 20 61 73 20 6d 75   Deal with as mu
13270 63 68 20 6f 66 20 74 68 69 73 20 72 65 61 64 20  ch of this read 
13280 72 65 71 75 65 73 74 20 61 73 20 70 6f 73 73 69  request as possi
13290 62 6c 65 20 62 79 20 74 72 61 6e 73 66 65 72 69  ble by transferi
132a0 6e 67 0a 20 20 2a 2a 20 64 61 74 61 20 66 72 6f  ng.  ** data fro
132b0 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20 6d 61 70  m the memory map
132c0 70 69 6e 67 20 75 73 69 6e 67 20 6d 65 6d 63 70  ping using memcp
132d0 79 28 29 2e 20 20 2a 2f 0a 20 20 69 66 28 20 6f  y().  */.  if( o
132e0 66 66 73 65 74 3c 70 46 69 6c 65 2d 3e 6d 6d 61  ffset<pFile->mma
132f0 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 69 66 28  pSize ){.    if(
13300 20 6f 66 66 73 65 74 2b 61 6d 74 20 3c 3d 20 70   offset+amt <= p
13310 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29  File->mmapSize )
13320 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70  {.      memcpy(p
13330 42 75 66 2c 20 26 28 28 75 38 20 2a 29 28 70 46  Buf, &((u8 *)(pF
13340 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29  ile->pMapRegion)
13350 29 5b 6f 66 66 73 65 74 5d 2c 20 61 6d 74 29 3b  )[offset], amt);
13360 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
13370 22 52 45 41 44 2d 4d 4d 41 50 20 66 69 6c 65 3d  "READ-MMAP file=
13380 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b  %p, rc=SQLITE_OK
13390 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  \n", pFile->h));
133a0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
133b0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c  LITE_OK;.    }el
133c0 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43  se{.      int nC
133d0 6f 70 79 20 3d 20 28 69 6e 74 29 28 70 46 69 6c  opy = (int)(pFil
133e0 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 2d 20 6f 66  e->mmapSize - of
133f0 66 73 65 74 29 3b 0a 20 20 20 20 20 20 6d 65 6d  fset);.      mem
13400 63 70 79 28 70 42 75 66 2c 20 26 28 28 75 38 20  cpy(pBuf, &((u8 
13410 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65  *)(pFile->pMapRe
13420 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20  gion))[offset], 
13430 6e 43 6f 70 79 29 3b 0a 20 20 20 20 20 20 70 42  nCopy);.      pB
13440 75 66 20 3d 20 26 28 28 75 38 20 2a 29 70 42 75  uf = &((u8 *)pBu
13450 66 29 5b 6e 43 6f 70 79 5d 3b 0a 20 20 20 20 20  f)[nCopy];.     
13460 20 61 6d 74 20 2d 3d 20 6e 43 6f 70 79 3b 0a 20   amt -= nCopy;. 
13470 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 6e       offset += n
13480 43 6f 70 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Copy;.    }.  }.
13490 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49  #endif..#if SQLI
134a0 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 69 66  TE_OS_WINCE.  if
134b0 28 20 77 69 6e 53 65 65 6b 46 69 6c 65 28 70 46  ( winSeekFile(pF
134c0 69 6c 65 2c 20 6f 66 66 73 65 74 29 20 29 7b 0a  ile, offset) ){.
134d0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 52 45      OSTRACE(("RE
134e0 41 44 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53  AD file=%p, rc=S
134f0 51 4c 49 54 45 5f 46 55 4c 4c 5c 6e 22 2c 20 70  QLITE_FULL\n", p
13500 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72  File->h));.    r
13510 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c  eturn SQLITE_FUL
13520 4c 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20  L;.  }.  while( 
13530 21 6f 73 52 65 61 64 46 69 6c 65 28 70 46 69 6c  !osReadFile(pFil
13540 65 2d 3e 68 2c 20 70 42 75 66 2c 20 61 6d 74 2c  e->h, pBuf, amt,
13550 20 26 6e 52 65 61 64 2c 20 30 29 20 29 7b 0a 23   &nRead, 0) ){.#
13560 65 6c 73 65 0a 20 20 6d 65 6d 73 65 74 28 26 6f  else.  memset(&o
13570 76 65 72 6c 61 70 70 65 64 2c 20 30 2c 20 73 69  verlapped, 0, si
13580 7a 65 6f 66 28 4f 56 45 52 4c 41 50 50 45 44 29  zeof(OVERLAPPED)
13590 29 3b 0a 20 20 6f 76 65 72 6c 61 70 70 65 64 2e  );.  overlapped.
135a0 4f 66 66 73 65 74 20 3d 20 28 4c 4f 4e 47 29 28  Offset = (LONG)(
135b0 6f 66 66 73 65 74 20 26 20 30 78 66 66 66 66 66  offset & 0xfffff
135c0 66 66 66 29 3b 0a 20 20 6f 76 65 72 6c 61 70 70  fff);.  overlapp
135d0 65 64 2e 4f 66 66 73 65 74 48 69 67 68 20 3d 20  ed.OffsetHigh = 
135e0 28 4c 4f 4e 47 29 28 28 6f 66 66 73 65 74 3e 3e  (LONG)((offset>>
135f0 33 32 29 20 26 20 30 78 37 66 66 66 66 66 66 66  32) & 0x7fffffff
13600 29 3b 0a 20 20 77 68 69 6c 65 28 20 21 6f 73 52  );.  while( !osR
13610 65 61 64 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68  eadFile(pFile->h
13620 2c 20 70 42 75 66 2c 20 61 6d 74 2c 20 26 6e 52  , pBuf, amt, &nR
13630 65 61 64 2c 20 26 6f 76 65 72 6c 61 70 70 65 64  ead, &overlapped
13640 29 20 26 26 0a 20 20 20 20 20 20 20 20 20 6f 73  ) &&.         os
13650 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 21 3d  GetLastError()!=
13660 45 52 52 4f 52 5f 48 41 4e 44 4c 45 5f 45 4f 46  ERROR_HANDLE_EOF
13670 20 29 7b 0a 23 65 6e 64 69 66 0a 20 20 20 20 44   ){.#endif.    D
13680 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a  WORD lastErrno;.
13690 20 20 20 20 69 66 28 20 77 69 6e 52 65 74 72 79      if( winRetry
136a0 49 6f 65 72 72 28 26 6e 52 65 74 72 79 2c 20 26  Ioerr(&nRetry, &
136b0 6c 61 73 74 45 72 72 6e 6f 29 20 29 20 63 6f 6e  lastErrno) ) con
136c0 74 69 6e 75 65 3b 0a 20 20 20 20 70 46 69 6c 65  tinue;.    pFile
136d0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61  ->lastErrno = la
136e0 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 4f 53 54  stErrno;.    OST
136f0 52 41 43 45 28 28 22 52 45 41 44 20 66 69 6c 65  RACE(("READ file
13700 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49  =%p, rc=SQLITE_I
13710 4f 45 52 52 5f 52 45 41 44 5c 6e 22 2c 20 70 46  OERR_READ\n", pF
13720 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65  ile->h));.    re
13730 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72  turn winLogError
13740 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45  (SQLITE_IOERR_RE
13750 41 44 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  AD, pFile->lastE
13760 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
13770 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
13780 6e 52 65 61 64 22 2c 20 70 46 69 6c 65 2d 3e 7a  nRead", pFile->z
13790 50 61 74 68 29 3b 0a 20 20 7d 0a 20 20 77 69 6e  Path);.  }.  win
137a0 4c 6f 67 49 6f 65 72 72 28 6e 52 65 74 72 79 29  LogIoerr(nRetry)
137b0 3b 0a 20 20 69 66 28 20 6e 52 65 61 64 3c 28 44  ;.  if( nRead<(D
137c0 57 4f 52 44 29 61 6d 74 20 29 7b 0a 20 20 20 20  WORD)amt ){.    
137d0 2f 2a 20 55 6e 72 65 61 64 20 70 61 72 74 73 20  /* Unread parts 
137e0 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 6d 75  of the buffer mu
137f0 73 74 20 62 65 20 7a 65 72 6f 2d 66 69 6c 6c 65  st be zero-fille
13800 64 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28  d */.    memset(
13810 26 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b 6e  &((char*)pBuf)[n
13820 52 65 61 64 5d 2c 20 30 2c 20 61 6d 74 2d 6e 52  Read], 0, amt-nR
13830 65 61 64 29 3b 0a 20 20 20 20 4f 53 54 52 41 43  ead);.    OSTRAC
13840 45 28 28 22 52 45 41 44 20 66 69 6c 65 3d 25 70  E(("READ file=%p
13850 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52  , rc=SQLITE_IOER
13860 52 5f 53 48 4f 52 54 5f 52 45 41 44 5c 6e 22 2c  R_SHORT_READ\n",
13870 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20   pFile->h));.   
13880 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
13890 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 3b  OERR_SHORT_READ;
138a0 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28  .  }..  OSTRACE(
138b0 28 22 52 45 41 44 20 66 69 6c 65 3d 25 70 2c 20  ("READ file=%p, 
138c0 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c  rc=SQLITE_OK\n",
138d0 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 72   pFile->h));.  r
138e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
138f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  .}../*.** Write 
13900 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75 66 66  data from a buff
13910 65 72 20 69 6e 74 6f 20 61 20 66 69 6c 65 2e 20  er into a file. 
13920 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
13930 4b 20 6f 6e 20 73 75 63 63 65 73 73 0a 2a 2a 20  K on success.** 
13940 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72  or some other er
13950 72 6f 72 20 63 6f 64 65 20 6f 6e 20 66 61 69 6c  ror code on fail
13960 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ure..*/.static i
13970 6e 74 20 77 69 6e 57 72 69 74 65 28 0a 20 20 73  nt winWrite(.  s
13980 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
13990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
139a0 2a 20 46 69 6c 65 20 74 6f 20 77 72 69 74 65 20  * File to write 
139b0 69 6e 74 6f 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  into */.  const 
139c0 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20  void *pBuf,     
139d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
139e0 20 62 79 74 65 73 20 74 6f 20 62 65 20 77 72 69   bytes to be wri
139f0 74 74 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 61 6d  tten */.  int am
13a00 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
13a10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
13a20 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20  ber of bytes to 
13a30 77 72 69 74 65 20 2a 2f 0a 20 20 73 71 6c 69 74  write */.  sqlit
13a40 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 20  e3_int64 offset 
13a50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
13a60 66 73 65 74 20 69 6e 74 6f 20 74 68 65 20 66 69  fset into the fi
13a70 6c 65 20 74 6f 20 62 65 67 69 6e 20 77 72 69 74  le to begin writ
13a80 69 6e 67 20 61 74 20 2a 2f 0a 29 7b 0a 20 20 69  ing at */.){.  i
13a90 6e 74 20 72 63 20 3d 20 30 3b 20 20 20 20 20 20  nt rc = 0;      
13aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13ab0 2a 20 54 72 75 65 20 69 66 20 65 72 72 6f 72 20  * True if error 
13ac0 68 61 73 20 6f 63 63 75 72 72 65 64 2c 20 65 6c  has occurred, el
13ad0 73 65 20 66 61 6c 73 65 20 2a 2f 0a 20 20 77 69  se false */.  wi
13ae0 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  nFile *pFile = (
13af0 77 69 6e 46 69 6c 65 2a 29 69 64 3b 20 20 2f 2a  winFile*)id;  /*
13b00 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a   File handle */.
13b10 20 20 69 6e 74 20 6e 52 65 74 72 79 20 3d 20 30    int nRetry = 0
13b20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
13b30 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
13b40 65 74 72 69 65 73 20 2a 2f 0a 0a 20 20 61 73 73  etries */..  ass
13b50 65 72 74 28 20 61 6d 74 3e 30 20 29 3b 0a 20 20  ert( amt>0 );.  
13b60 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
13b70 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
13b80 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45  or(return SQLITE
13b90 5f 49 4f 45 52 52 5f 57 52 49 54 45 29 3b 0a 20  _IOERR_WRITE);. 
13ba0 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c   SimulateDiskful
13bb0 6c 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51  lError(return SQ
13bc0 4c 49 54 45 5f 46 55 4c 4c 29 3b 0a 0a 20 20 4f  LITE_FULL);..  O
13bd0 53 54 52 41 43 45 28 28 22 57 52 49 54 45 20 66  STRACE(("WRITE f
13be0 69 6c 65 3d 25 70 2c 20 62 75 66 66 65 72 3d 25  ile=%p, buffer=%
13bf0 70 2c 20 61 6d 6f 75 6e 74 3d 25 64 2c 20 6f 66  p, amount=%d, of
13c00 66 73 65 74 3d 25 6c 6c 64 2c 20 6c 6f 63 6b 3d  fset=%lld, lock=
13c10 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
13c20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70 42 75 66    pFile->h, pBuf
13c30 2c 20 61 6d 74 2c 20 6f 66 66 73 65 74 2c 20 70  , amt, offset, p
13c40 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29  File->locktype))
13c50 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  ;..#if SQLITE_MA
13c60 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
13c70 2f 2a 20 44 65 61 6c 20 77 69 74 68 20 61 73 20  /* Deal with as 
13c80 6d 75 63 68 20 6f 66 20 74 68 69 73 20 77 72 69  much of this wri
13c90 74 65 20 72 65 71 75 65 73 74 20 61 73 20 70 6f  te request as po
13ca0 73 73 69 62 6c 65 20 62 79 20 74 72 61 6e 73 66  ssible by transf
13cb0 65 72 69 6e 67 0a 20 20 2a 2a 20 64 61 74 61 20  ering.  ** data 
13cc0 66 72 6f 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20  from the memory 
13cd0 6d 61 70 70 69 6e 67 20 75 73 69 6e 67 20 6d 65  mapping using me
13ce0 6d 63 70 79 28 29 2e 20 20 2a 2f 0a 20 20 69 66  mcpy().  */.  if
13cf0 28 20 6f 66 66 73 65 74 3c 70 46 69 6c 65 2d 3e  ( offset<pFile->
13d00 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20  mmapSize ){.    
13d10 69 66 28 20 6f 66 66 73 65 74 2b 61 6d 74 20 3c  if( offset+amt <
13d20 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a  = pFile->mmapSiz
13d30 65 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  e ){.      memcp
13d40 79 28 26 28 28 75 38 20 2a 29 28 70 46 69 6c 65  y(&((u8 *)(pFile
13d50 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f  ->pMapRegion))[o
13d60 66 66 73 65 74 5d 2c 20 70 42 75 66 2c 20 61 6d  ffset], pBuf, am
13d70 74 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43  t);.      OSTRAC
13d80 45 28 28 22 57 52 49 54 45 2d 4d 4d 41 50 20 66  E(("WRITE-MMAP f
13d90 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  ile=%p, rc=SQLIT
13da0 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  E_OK\n", pFile->
13db0 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  h));.      retur
13dc0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
13dd0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
13de0 74 20 6e 43 6f 70 79 20 3d 20 28 69 6e 74 29 28  t nCopy = (int)(
13df0 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20  pFile->mmapSize 
13e00 2d 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 20  - offset);.     
13e10 20 6d 65 6d 63 70 79 28 26 28 28 75 38 20 2a 29   memcpy(&((u8 *)
13e20 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69  (pFile->pMapRegi
13e30 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20 70 42  on))[offset], pB
13e40 75 66 2c 20 6e 43 6f 70 79 29 3b 0a 20 20 20 20  uf, nCopy);.    
13e50 20 20 70 42 75 66 20 3d 20 26 28 28 75 38 20 2a    pBuf = &((u8 *
13e60 29 70 42 75 66 29 5b 6e 43 6f 70 79 5d 3b 0a 20  )pBuf)[nCopy];. 
13e70 20 20 20 20 20 61 6d 74 20 2d 3d 20 6e 43 6f 70       amt -= nCop
13e80 79 3b 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20  y;.      offset 
13e90 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 7d 0a  += nCopy;.    }.
13ea0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20    }.#endif..#if 
13eb0 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
13ec0 20 20 72 63 20 3d 20 77 69 6e 53 65 65 6b 46 69    rc = winSeekFi
13ed0 6c 65 28 70 46 69 6c 65 2c 20 6f 66 66 73 65 74  le(pFile, offset
13ee0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29  );.  if( rc==0 )
13ef0 7b 0a 23 65 6c 73 65 0a 20 20 7b 0a 23 65 6e 64  {.#else.  {.#end
13f00 69 66 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  if.#if !SQLITE_O
13f10 53 5f 57 49 4e 43 45 0a 20 20 20 20 4f 56 45 52  S_WINCE.    OVER
13f20 4c 41 50 50 45 44 20 6f 76 65 72 6c 61 70 70 65  LAPPED overlappe
13f30 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  d;        /* The
13f40 20 6f 66 66 73 65 74 20 66 6f 72 20 57 72 69 74   offset for Writ
13f50 65 46 69 6c 65 2e 20 2a 2f 0a 23 65 6e 64 69 66  eFile. */.#endif
13f60 0a 20 20 20 20 75 38 20 2a 61 52 65 6d 20 3d 20  .    u8 *aRem = 
13f70 28 75 38 20 2a 29 70 42 75 66 3b 20 20 20 20 20  (u8 *)pBuf;     
13f80 20 20 20 2f 2a 20 44 61 74 61 20 79 65 74 20 74     /* Data yet t
13f90 6f 20 62 65 20 77 72 69 74 74 65 6e 20 2a 2f 0a  o be written */.
13fa0 20 20 20 20 69 6e 74 20 6e 52 65 6d 20 3d 20 61      int nRem = a
13fb0 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  mt;             
13fc0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
13fd0 79 74 65 73 20 79 65 74 20 74 6f 20 62 65 20 77  ytes yet to be w
13fe0 72 69 74 74 65 6e 20 2a 2f 0a 20 20 20 20 44 57  ritten */.    DW
13ff0 4f 52 44 20 6e 57 72 69 74 65 3b 20 20 20 20 20  ORD nWrite;     
14000 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
14010 79 74 65 73 20 77 72 69 74 74 65 6e 20 62 79 20  ytes written by 
14020 65 61 63 68 20 57 72 69 74 65 46 69 6c 65 28 29  each WriteFile()
14030 20 63 61 6c 6c 20 2a 2f 0a 20 20 20 20 44 57 4f   call */.    DWO
14040 52 44 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 4e  RD lastErrno = N
14050 4f 5f 45 52 52 4f 52 3b 20 20 20 2f 2a 20 56 61  O_ERROR;   /* Va
14060 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
14070 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 20 2a  GetLastError() *
14080 2f 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  /..#if !SQLITE_O
14090 53 5f 57 49 4e 43 45 0a 20 20 20 20 6d 65 6d 73  S_WINCE.    mems
140a0 65 74 28 26 6f 76 65 72 6c 61 70 70 65 64 2c 20  et(&overlapped, 
140b0 30 2c 20 73 69 7a 65 6f 66 28 4f 56 45 52 4c 41  0, sizeof(OVERLA
140c0 50 50 45 44 29 29 3b 0a 20 20 20 20 6f 76 65 72  PPED));.    over
140d0 6c 61 70 70 65 64 2e 4f 66 66 73 65 74 20 3d 20  lapped.Offset = 
140e0 28 4c 4f 4e 47 29 28 6f 66 66 73 65 74 20 26 20  (LONG)(offset & 
140f0 30 78 66 66 66 66 66 66 66 66 29 3b 0a 20 20 20  0xffffffff);.   
14100 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66 66 73   overlapped.Offs
14110 65 74 48 69 67 68 20 3d 20 28 4c 4f 4e 47 29 28  etHigh = (LONG)(
14120 28 6f 66 66 73 65 74 3e 3e 33 32 29 20 26 20 30  (offset>>32) & 0
14130 78 37 66 66 66 66 66 66 66 29 3b 0a 23 65 6e 64  x7fffffff);.#end
14140 69 66 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 6e  if..    while( n
14150 52 65 6d 3e 30 20 29 7b 0a 23 69 66 20 53 51 4c  Rem>0 ){.#if SQL
14160 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 20  ITE_OS_WINCE.   
14170 20 20 20 69 66 28 20 21 6f 73 57 72 69 74 65 46     if( !osWriteF
14180 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 61 52  ile(pFile->h, aR
14190 65 6d 2c 20 6e 52 65 6d 2c 20 26 6e 57 72 69 74  em, nRem, &nWrit
141a0 65 2c 20 30 29 20 29 7b 0a 23 65 6c 73 65 0a 20  e, 0) ){.#else. 
141b0 20 20 20 20 20 69 66 28 20 21 6f 73 57 72 69 74       if( !osWrit
141c0 65 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20  eFile(pFile->h, 
141d0 61 52 65 6d 2c 20 6e 52 65 6d 2c 20 26 6e 57 72  aRem, nRem, &nWr
141e0 69 74 65 2c 20 26 6f 76 65 72 6c 61 70 70 65 64  ite, &overlapped
141f0 29 20 29 7b 0a 23 65 6e 64 69 66 0a 20 20 20 20  ) ){.#endif.    
14200 20 20 20 20 69 66 28 20 77 69 6e 52 65 74 72 79      if( winRetry
14210 49 6f 65 72 72 28 26 6e 52 65 74 72 79 2c 20 26  Ioerr(&nRetry, &
14220 6c 61 73 74 45 72 72 6e 6f 29 20 29 20 63 6f 6e  lastErrno) ) con
14230 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 62  tinue;.        b
14240 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
14250 20 20 20 20 61 73 73 65 72 74 28 20 6e 57 72 69      assert( nWri
14260 74 65 3d 3d 30 20 7c 7c 20 6e 57 72 69 74 65 3c  te==0 || nWrite<
14270 3d 28 44 57 4f 52 44 29 6e 52 65 6d 20 29 3b 0a  =(DWORD)nRem );.
14280 20 20 20 20 20 20 69 66 28 20 6e 57 72 69 74 65        if( nWrite
14290 3d 3d 30 20 7c 7c 20 6e 57 72 69 74 65 3e 28 44  ==0 || nWrite>(D
142a0 57 4f 52 44 29 6e 52 65 6d 20 29 7b 0a 20 20 20  WORD)nRem ){.   
142b0 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d       lastErrno =
142c0 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
142d0 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
142e0 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 20 21 53  ;.      }.#if !S
142f0 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20  QLITE_OS_WINCE. 
14300 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 6e       offset += n
14310 57 72 69 74 65 3b 0a 20 20 20 20 20 20 6f 76 65  Write;.      ove
14320 72 6c 61 70 70 65 64 2e 4f 66 66 73 65 74 20 3d  rlapped.Offset =
14330 20 28 4c 4f 4e 47 29 28 6f 66 66 73 65 74 20 26   (LONG)(offset &
14340 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a 20 20   0xffffffff);.  
14350 20 20 20 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f      overlapped.O
14360 66 66 73 65 74 48 69 67 68 20 3d 20 28 4c 4f 4e  ffsetHigh = (LON
14370 47 29 28 28 6f 66 66 73 65 74 3e 3e 33 32 29 20  G)((offset>>32) 
14380 26 20 30 78 37 66 66 66 66 66 66 66 29 3b 0a 23  & 0x7fffffff);.#
14390 65 6e 64 69 66 0a 20 20 20 20 20 20 61 52 65 6d  endif.      aRem
143a0 20 2b 3d 20 6e 57 72 69 74 65 3b 0a 20 20 20 20   += nWrite;.    
143b0 20 20 6e 52 65 6d 20 2d 3d 20 6e 57 72 69 74 65    nRem -= nWrite
143c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
143d0 6e 52 65 6d 3e 30 20 29 7b 0a 20 20 20 20 20 20  nRem>0 ){.      
143e0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
143f0 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20   = lastErrno;.  
14400 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
14410 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 20  }.  }..  if( rc 
14420 29 7b 0a 20 20 20 20 69 66 28 20 20 20 28 20 70  ){.    if(   ( p
14430 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3d  File->lastErrno=
14440 3d 45 52 52 4f 52 5f 48 41 4e 44 4c 45 5f 44 49  =ERROR_HANDLE_DI
14450 53 4b 5f 46 55 4c 4c 20 29 0a 20 20 20 20 20 20  SK_FULL ).      
14460 20 7c 7c 20 28 20 70 46 69 6c 65 2d 3e 6c 61 73   || ( pFile->las
14470 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 44 49  tErrno==ERROR_DI
14480 53 4b 5f 46 55 4c 4c 20 29 29 7b 0a 20 20 20 20  SK_FULL )){.    
14490 20 20 4f 53 54 52 41 43 45 28 28 22 57 52 49 54    OSTRACE(("WRIT
144a0 45 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51  E file=%p, rc=SQ
144b0 4c 49 54 45 5f 46 55 4c 4c 5c 6e 22 2c 20 70 46  LITE_FULL\n", pF
144c0 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20  ile->h));.      
144d0 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72  return winLogErr
144e0 6f 72 28 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20  or(SQLITE_FULL, 
144f0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
14500 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
14510 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 57             "winW
14520 72 69 74 65 31 22 2c 20 70 46 69 6c 65 2d 3e 7a  rite1", pFile->z
14530 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Path);.    }.   
14540 20 4f 53 54 52 41 43 45 28 28 22 57 52 49 54 45   OSTRACE(("WRITE
14550 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c   file=%p, rc=SQL
14560 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 5c  ITE_IOERR_WRITE\
14570 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  n", pFile->h));.
14580 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f      return winLo
14590 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
145a0 45 52 52 5f 57 52 49 54 45 2c 20 70 46 69 6c 65  ERR_WRITE, pFile
145b0 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20  ->lastErrno,.   
145c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
145d0 20 20 20 20 22 77 69 6e 57 72 69 74 65 32 22 2c      "winWrite2",
145e0 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
145f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 69 6e    }else{.    win
14600 4c 6f 67 49 6f 65 72 72 28 6e 52 65 74 72 79 29  LogIoerr(nRetry)
14610 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28  ;.  }.  OSTRACE(
14620 28 22 57 52 49 54 45 20 66 69 6c 65 3d 25 70 2c  ("WRITE file=%p,
14630 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22   rc=SQLITE_OK\n"
14640 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
14650 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
14660 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63  ;.}../*.** Trunc
14670 61 74 65 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65  ate an open file
14680 20 74 6f 20 61 20 73 70 65 63 69 66 69 65 64 20   to a specified 
14690 73 69 7a 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69  size.*/.static i
146a0 6e 74 20 77 69 6e 54 72 75 6e 63 61 74 65 28 73  nt winTruncate(s
146b0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
146c0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e   sqlite3_int64 n
146d0 42 79 74 65 29 7b 0a 20 20 77 69 6e 46 69 6c 65  Byte){.  winFile
146e0 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69   *pFile = (winFi
146f0 6c 65 2a 29 69 64 3b 20 20 2f 2a 20 46 69 6c 65  le*)id;  /* File
14700 20 68 61 6e 64 6c 65 20 6f 62 6a 65 63 74 20 2a   handle object *
14710 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
14720 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
14730 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
14740 64 65 20 66 6f 72 20 74 68 69 73 20 66 75 6e 63  de for this func
14750 74 69 6f 6e 20 2a 2f 0a 20 20 44 57 4f 52 44 20  tion */.  DWORD 
14760 6c 61 73 74 45 72 72 6e 6f 3b 0a 0a 20 20 61 73  lastErrno;..  as
14770 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
14780 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
14790 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49  (return SQLITE_I
147a0 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 29 3b 0a  OERR_TRUNCATE);.
147b0 20 20 4f 53 54 52 41 43 45 28 28 22 54 52 55 4e    OSTRACE(("TRUN
147c0 43 41 54 45 20 66 69 6c 65 3d 25 70 2c 20 73 69  CATE file=%p, si
147d0 7a 65 3d 25 6c 6c 64 2c 20 6c 6f 63 6b 3d 25 64  ze=%lld, lock=%d
147e0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
147f0 70 46 69 6c 65 2d 3e 68 2c 20 6e 42 79 74 65 2c  pFile->h, nByte,
14800 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
14810 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  ));..  /* If the
14820 20 75 73 65 72 20 68 61 73 20 63 6f 6e 66 69 67   user has config
14830 75 72 65 64 20 61 20 63 68 75 6e 6b 2d 73 69 7a  ured a chunk-siz
14840 65 20 66 6f 72 20 74 68 69 73 20 66 69 6c 65 2c  e for this file,
14850 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20   truncate the.  
14860 2a 2a 20 66 69 6c 65 20 73 6f 20 74 68 61 74 20  ** file so that 
14870 69 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61  it consists of a
14880 6e 20 69 6e 74 65 67 65 72 20 6e 75 6d 62 65 72  n integer number
14890 20 6f 66 20 63 68 75 6e 6b 73 20 28 69 2e 65 2e   of chunks (i.e.
148a0 20 74 68 65 0a 20 20 2a 2a 20 61 63 74 75 61 6c   the.  ** actual
148b0 20 66 69 6c 65 20 73 69 7a 65 20 61 66 74 65 72   file size after
148c0 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 6d   the operation m
148d0 61 79 20 62 65 20 6c 61 72 67 65 72 20 74 68 61  ay be larger tha
148e0 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64 0a  n the requested.
148f0 20 20 2a 2a 20 73 69 7a 65 29 2e 0a 20 20 2a 2f    ** size)..  */
14900 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a  .  if( pFile->sz
14910 43 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 6e  Chunk>0 ){.    n
14920 42 79 74 65 20 3d 20 28 28 6e 42 79 74 65 20 2b  Byte = ((nByte +
14930 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20   pFile->szChunk 
14940 2d 20 31 29 2f 70 46 69 6c 65 2d 3e 73 7a 43 68  - 1)/pFile->szCh
14950 75 6e 6b 29 20 2a 20 70 46 69 6c 65 2d 3e 73 7a  unk) * pFile->sz
14960 43 68 75 6e 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Chunk;.  }..  /*
14970 20 53 65 74 45 6e 64 4f 66 46 69 6c 65 28 29 20   SetEndOfFile() 
14980 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f  returns non-zero
14990 20 77 68 65 6e 20 73 75 63 63 65 73 73 66 75 6c   when successful
149a0 2c 20 6f 72 20 7a 65 72 6f 20 77 68 65 6e 20 69  , or zero when i
149b0 74 20 66 61 69 6c 73 2e 20 2a 2f 0a 20 20 69 66  t fails. */.  if
149c0 28 20 77 69 6e 53 65 65 6b 46 69 6c 65 28 70 46  ( winSeekFile(pF
149d0 69 6c 65 2c 20 6e 42 79 74 65 29 20 29 7b 0a 20  ile, nByte) ){. 
149e0 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72     rc = winLogEr
149f0 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
14a00 5f 54 52 55 4e 43 41 54 45 2c 20 70 46 69 6c 65  _TRUNCATE, pFile
14a10 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20  ->lastErrno,.   
14a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a30 20 20 22 77 69 6e 54 72 75 6e 63 61 74 65 31 22    "winTruncate1"
14a40 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  , pFile->zPath);
14a50 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 30 3d 3d  .  }else if( 0==
14a60 6f 73 53 65 74 45 6e 64 4f 66 46 69 6c 65 28 70  osSetEndOfFile(p
14a70 46 69 6c 65 2d 3e 68 29 20 26 26 0a 20 20 20 20  File->h) &&.    
14a80 20 20 20 20 20 20 20 20 28 28 6c 61 73 74 45 72          ((lastEr
14a90 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
14aa0 72 72 6f 72 28 29 29 21 3d 45 52 52 4f 52 5f 55  rror())!=ERROR_U
14ab0 53 45 52 5f 4d 41 50 50 45 44 5f 46 49 4c 45 29  SER_MAPPED_FILE)
14ac0 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c   ){.    pFile->l
14ad0 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45  astErrno = lastE
14ae0 72 72 6e 6f 3b 0a 20 20 20 20 72 63 20 3d 20 77  rrno;.    rc = w
14af0 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
14b00 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45  E_IOERR_TRUNCATE
14b10 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  , pFile->lastErr
14b20 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
14b30 20 20 20 20 20 20 20 20 20 22 77 69 6e 54 72 75           "winTru
14b40 6e 63 61 74 65 32 22 2c 20 70 46 69 6c 65 2d 3e  ncate2", pFile->
14b50 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 0a 23 69 66  zPath);.  }..#if
14b60 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
14b70 5f 53 49 5a 45 3e 30 0a 20 20 2f 2a 20 49 66 20  _SIZE>0.  /* If 
14b80 74 68 65 20 66 69 6c 65 20 77 61 73 20 74 72 75  the file was tru
14b90 6e 63 61 74 65 64 20 74 6f 20 61 20 73 69 7a 65  ncated to a size
14ba0 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68   smaller than th
14bb0 65 20 63 75 72 72 65 6e 74 6c 79 0a 20 20 2a 2a  e currently.  **
14bc0 20 6d 61 70 70 65 64 20 72 65 67 69 6f 6e 2c 20   mapped region, 
14bd0 72 65 64 75 63 65 20 74 68 65 20 65 66 66 65 63  reduce the effec
14be0 74 69 76 65 20 6d 61 70 70 69 6e 67 20 73 69 7a  tive mapping siz
14bf0 65 20 61 73 20 77 65 6c 6c 2e 20 53 51 4c 69 74  e as well. SQLit
14c00 65 20 77 69 6c 6c 0a 20 20 2a 2a 20 75 73 65 20  e will.  ** use 
14c10 72 65 61 64 28 29 20 61 6e 64 20 77 72 69 74 65  read() and write
14c20 28 29 20 74 6f 20 61 63 63 65 73 73 20 64 61 74  () to access dat
14c30 61 20 62 65 79 6f 6e 64 20 74 68 69 73 20 70 6f  a beyond this po
14c40 69 6e 74 20 66 72 6f 6d 20 6e 6f 77 20 6f 6e 2e  int from now on.
14c50 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  .  */.  if( pFil
14c60 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 26 26  e->pMapRegion &&
14c70 20 6e 42 79 74 65 3c 70 46 69 6c 65 2d 3e 6d 6d   nByte<pFile->mm
14c80 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 70 46  apSize ){.    pF
14c90 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d 20  ile->mmapSize = 
14ca0 6e 42 79 74 65 3b 0a 20 20 7d 0a 23 65 6e 64 69  nByte;.  }.#endi
14cb0 66 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54  f..  OSTRACE(("T
14cc0 52 55 4e 43 41 54 45 20 66 69 6c 65 3d 25 70 2c  RUNCATE file=%p,
14cd0 20 72 63 3d 25 73 5c 6e 22 2c 20 70 46 69 6c 65   rc=%s\n", pFile
14ce0 2d 3e 68 2c 20 73 71 6c 69 74 65 33 45 72 72 4e  ->h, sqlite3ErrN
14cf0 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 72 65 74  ame(rc)));.  ret
14d00 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65  urn rc;.}..#ifde
14d10 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a  f SQLITE_TEST./*
14d20 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75  .** Count the nu
14d30 6d 62 65 72 20 6f 66 20 66 75 6c 6c 73 79 6e 63  mber of fullsync
14d40 73 20 61 6e 64 20 6e 6f 72 6d 61 6c 20 73 79 6e  s and normal syn
14d50 63 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  cs.  This is use
14d60 64 20 74 6f 20 74 65 73 74 0a 2a 2a 20 74 68 61  d to test.** tha
14d70 74 20 73 79 6e 63 73 20 61 6e 64 20 66 75 6c 6c  t syncs and full
14d80 73 79 6e 63 73 20 61 72 65 20 6f 63 63 75 72 69  syncs are occuri
14d90 6e 67 20 61 74 20 74 68 65 20 72 69 67 68 74 20  ng at the right 
14da0 74 69 6d 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  times..*/.int sq
14db0 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74  lite3_sync_count
14dc0 20 3d 20 30 3b 0a 69 6e 74 20 73 71 6c 69 74 65   = 0;.int sqlite
14dd0 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74  3_fullsync_count
14de0 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a   = 0;.#endif../*
14df0 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c  .** Make sure al
14e00 6c 20 77 72 69 74 65 73 20 74 6f 20 61 20 70 61  l writes to a pa
14e10 72 74 69 63 75 6c 61 72 20 66 69 6c 65 20 61 72  rticular file ar
14e20 65 20 63 6f 6d 6d 69 74 74 65 64 20 74 6f 20 64  e committed to d
14e30 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  isk..*/.static i
14e40 6e 74 20 77 69 6e 53 79 6e 63 28 73 71 6c 69 74  nt winSync(sqlit
14e50 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
14e60 20 66 6c 61 67 73 29 7b 0a 23 69 66 6e 64 65 66   flags){.#ifndef
14e70 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a   SQLITE_NO_SYNC.
14e80 20 20 2f 2a 0a 20 20 2a 2a 20 55 73 65 64 20 6f    /*.  ** Used o
14e90 6e 6c 79 20 77 68 65 6e 20 53 51 4c 49 54 45 5f  nly when SQLITE_
14ea0 4e 4f 5f 53 59 4e 43 20 69 73 20 6e 6f 74 20 64  NO_SYNC is not d
14eb0 65 66 69 6e 65 64 2e 0a 20 20 20 2a 2f 0a 20 20  efined..   */.  
14ec0 42 4f 4f 4c 20 72 63 3b 0a 23 65 6e 64 69 66 0a  BOOL rc;.#endif.
14ed0 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45  #if !defined(NDE
14ee0 42 55 47 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  BUG) || !defined
14ef0 28 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 29  (SQLITE_NO_SYNC)
14f00 20 7c 7c 20 5c 0a 20 20 20 20 28 64 65 66 69 6e   || \.    (defin
14f10 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20  ed(SQLITE_TEST) 
14f20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
14f30 45 5f 44 45 42 55 47 29 29 0a 20 20 2f 2a 0a 20  E_DEBUG)).  /*. 
14f40 20 2a 2a 20 55 73 65 64 20 77 68 65 6e 20 53 51   ** Used when SQ
14f50 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 69 73 20  LITE_NO_SYNC is 
14f60 6e 6f 74 20 64 65 66 69 6e 65 64 20 61 6e 64 20  not defined and 
14f70 62 79 20 74 68 65 20 61 73 73 65 72 74 28 29 20  by the assert() 
14f80 61 6e 64 2f 6f 72 0a 20 20 2a 2a 20 4f 53 54 52  and/or.  ** OSTR
14f90 41 43 45 28 29 20 6d 61 63 72 6f 73 2e 0a 20 20  ACE() macros..  
14fa0 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70   */.  winFile *p
14fb0 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a  File = (winFile*
14fc0 29 69 64 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55  )id;.#else.  UNU
14fd0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 69 64  SED_PARAMETER(id
14fe0 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73  );.#endif..  ass
14ff0 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
15000 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 6f 6e  /* Check that on
15010 65 20 6f 66 20 53 51 4c 49 54 45 5f 53 59 4e 43  e of SQLITE_SYNC
15020 5f 4e 4f 52 4d 41 4c 20 6f 72 20 46 55 4c 4c 20  _NORMAL or FULL 
15030 77 61 73 20 70 61 73 73 65 64 20 2a 2f 0a 20 20  was passed */.  
15040 61 73 73 65 72 74 28 28 66 6c 61 67 73 26 30 78  assert((flags&0x
15050 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43  0F)==SQLITE_SYNC
15060 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20 20 7c 7c  _NORMAL.      ||
15070 20 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53   (flags&0x0F)==S
15080 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 0a  QLITE_SYNC_FULL.
15090 20 20 29 3b 0a 0a 20 20 2f 2a 20 55 6e 69 78 20    );..  /* Unix 
150a0 63 61 6e 6e 6f 74 2c 20 62 75 74 20 73 6f 6d 65  cannot, but some
150b0 20 73 79 73 74 65 6d 73 20 6d 61 79 20 72 65 74   systems may ret
150c0 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20  urn SQLITE_FULL 
150d0 66 72 6f 6d 20 68 65 72 65 2e 20 54 68 69 73 0a  from here. This.
150e0 20 20 2a 2a 20 6c 69 6e 65 20 69 73 20 74 6f 20    ** line is to 
150f0 74 65 73 74 20 74 68 61 74 20 64 6f 69 6e 67 20  test that doing 
15100 73 6f 20 64 6f 65 73 20 6e 6f 74 20 63 61 75 73  so does not caus
15110 65 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73 2e 0a  e any problems..
15120 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 44    */.  SimulateD
15130 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28 20 72 65  iskfullError( re
15140 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c  turn SQLITE_FULL
15150 20 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28   );..  OSTRACE((
15160 22 53 59 4e 43 20 66 69 6c 65 3d 25 70 2c 20 66  "SYNC file=%p, f
15170 6c 61 67 73 3d 25 78 2c 20 6c 6f 63 6b 3d 25 64  lags=%x, lock=%d
15180 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
15190 70 46 69 6c 65 2d 3e 68 2c 20 66 6c 61 67 73 2c  pFile->h, flags,
151a0 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
151b0 29 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ));..#ifndef SQL
151c0 49 54 45 5f 54 45 53 54 0a 20 20 55 4e 55 53 45  ITE_TEST.  UNUSE
151d0 44 5f 50 41 52 41 4d 45 54 45 52 28 66 6c 61 67  D_PARAMETER(flag
151e0 73 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28 20  s);.#else.  if( 
151f0 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51  (flags&0x0F)==SQ
15200 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 20 29  LITE_SYNC_FULL )
15210 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 75  {.    sqlite3_fu
15220 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a  llsync_count++;.
15230 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73 79    }.  sqlite3_sy
15240 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64  nc_count++;.#end
15250 69 66 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 63  if..  /* If we c
15260 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 74 68 65  ompiled with the
15270 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20   SQLITE_NO_SYNC 
15280 66 6c 61 67 2c 20 74 68 65 6e 20 73 79 6e 63 69  flag, then synci
15290 6e 67 20 69 73 20 61 0a 20 20 2a 2a 20 6e 6f 2d  ng is a.  ** no-
152a0 6f 70 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  op.  */.#ifdef S
152b0 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20  QLITE_NO_SYNC.  
152c0 4f 53 54 52 41 43 45 28 28 22 53 59 4e 43 2d 4e  OSTRACE(("SYNC-N
152d0 4f 50 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53  OP file=%p, rc=S
152e0 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69  QLITE_OK\n", pFi
152f0 6c 65 2d 3e 68 29 29 3b 0a 20 20 72 65 74 75 72  le->h));.  retur
15300 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c  n SQLITE_OK;.#el
15310 73 65 0a 20 20 72 63 20 3d 20 6f 73 46 6c 75 73  se.  rc = osFlus
15320 68 46 69 6c 65 42 75 66 66 65 72 73 28 70 46 69  hFileBuffers(pFi
15330 6c 65 2d 3e 68 29 3b 0a 20 20 53 69 6d 75 6c 61  le->h);.  Simula
15340 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d 46 41  teIOError( rc=FA
15350 4c 53 45 20 29 3b 0a 20 20 69 66 28 20 72 63 20  LSE );.  if( rc 
15360 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  ){.    OSTRACE((
15370 22 53 59 4e 43 20 66 69 6c 65 3d 25 70 2c 20 72  "SYNC file=%p, r
15380 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20  c=SQLITE_OK\n", 
15390 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20  pFile->h));.    
153a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
153b0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
153c0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
153d0 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
153e0 28 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28  ();.    OSTRACE(
153f0 28 22 53 59 4e 43 20 66 69 6c 65 3d 25 70 2c 20  ("SYNC file=%p, 
15400 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rc=SQLITE_IOERR_
15410 46 53 59 4e 43 5c 6e 22 2c 20 70 46 69 6c 65 2d  FSYNC\n", pFile-
15420 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  >h));.    return
15430 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
15440 49 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43 2c  ITE_IOERR_FSYNC,
15450 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
15460 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
15470 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 53 79            "winSy
15480 6e 63 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  nc", pFile->zPat
15490 68 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d  h);.  }.#endif.}
154a0 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e  ../*.** Determin
154b0 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69  e the current si
154c0 7a 65 20 6f 66 20 61 20 66 69 6c 65 20 69 6e 20  ze of a file in 
154d0 62 79 74 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20  bytes.*/.static 
154e0 69 6e 74 20 77 69 6e 46 69 6c 65 53 69 7a 65 28  int winFileSize(
154f0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
15500 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  , sqlite3_int64 
15510 2a 70 53 69 7a 65 29 7b 0a 20 20 77 69 6e 46 69  *pSize){.  winFi
15520 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e  le *pFile = (win
15530 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20  File*)id;.  int 
15540 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
15550 0a 20 20 61 73 73 65 72 74 28 20 69 64 21 3d 30  .  assert( id!=0
15560 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53   );.  assert( pS
15570 69 7a 65 21 3d 30 20 29 3b 0a 20 20 53 69 6d 75  ize!=0 );.  Simu
15580 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75  lateIOError(retu
15590 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
155a0 46 53 54 41 54 29 3b 0a 20 20 4f 53 54 52 41 43  FSTAT);.  OSTRAC
155b0 45 28 28 22 53 49 5a 45 20 66 69 6c 65 3d 25 70  E(("SIZE file=%p
155c0 2c 20 70 53 69 7a 65 3d 25 70 5c 6e 22 2c 20 70  , pSize=%p\n", p
155d0 46 69 6c 65 2d 3e 68 2c 20 70 53 69 7a 65 29 29  File->h, pSize))
155e0 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  ;..#if SQLITE_OS
155f0 5f 57 49 4e 52 54 0a 20 20 7b 0a 20 20 20 20 46  _WINRT.  {.    F
15600 49 4c 45 5f 53 54 41 4e 44 41 52 44 5f 49 4e 46  ILE_STANDARD_INF
15610 4f 20 69 6e 66 6f 3b 0a 20 20 20 20 69 66 28 20  O info;.    if( 
15620 6f 73 47 65 74 46 69 6c 65 49 6e 66 6f 72 6d 61  osGetFileInforma
15630 74 69 6f 6e 42 79 48 61 6e 64 6c 65 45 78 28 70  tionByHandleEx(p
15640 46 69 6c 65 2d 3e 68 2c 20 46 69 6c 65 53 74 61  File->h, FileSta
15650 6e 64 61 72 64 49 6e 66 6f 2c 0a 20 20 20 20 20  ndardInfo,.     
15660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15680 26 69 6e 66 6f 2c 20 73 69 7a 65 6f 66 28 69 6e  &info, sizeof(in
15690 66 6f 29 29 20 29 7b 0a 20 20 20 20 20 20 2a 70  fo)) ){.      *p
156a0 53 69 7a 65 20 3d 20 69 6e 66 6f 2e 45 6e 64 4f  Size = info.EndO
156b0 66 46 69 6c 65 2e 51 75 61 64 50 61 72 74 3b 0a  fFile.QuadPart;.
156c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
156d0 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
156e0 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
156f0 6f 72 28 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  or();.      rc =
15700 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
15710 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 2c  ITE_IOERR_FSTAT,
15720 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
15730 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
15740 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 46 69            "winFi
15750 6c 65 53 69 7a 65 22 2c 20 70 46 69 6c 65 2d 3e  leSize", pFile->
15760 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20  zPath);.    }.  
15770 7d 0a 23 65 6c 73 65 0a 20 20 7b 0a 20 20 20 20  }.#else.  {.    
15780 44 57 4f 52 44 20 75 70 70 65 72 42 69 74 73 3b  DWORD upperBits;
15790 0a 20 20 20 20 44 57 4f 52 44 20 6c 6f 77 65 72  .    DWORD lower
157a0 42 69 74 73 3b 0a 20 20 20 20 44 57 4f 52 44 20  Bits;.    DWORD 
157b0 6c 61 73 74 45 72 72 6e 6f 3b 0a 0a 20 20 20 20  lastErrno;..    
157c0 6c 6f 77 65 72 42 69 74 73 20 3d 20 6f 73 47 65  lowerBits = osGe
157d0 74 46 69 6c 65 53 69 7a 65 28 70 46 69 6c 65 2d  tFileSize(pFile-
157e0 3e 68 2c 20 26 75 70 70 65 72 42 69 74 73 29 3b  >h, &upperBits);
157f0 0a 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 28 28  .    *pSize = ((
15800 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 75  (sqlite3_int64)u
15810 70 70 65 72 42 69 74 73 29 3c 3c 33 32 29 20 2b  pperBits)<<32) +
15820 20 6c 6f 77 65 72 42 69 74 73 3b 0a 20 20 20 20   lowerBits;.    
15830 69 66 28 20 20 20 28 6c 6f 77 65 72 42 69 74 73  if(   (lowerBits
15840 20 3d 3d 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45   == INVALID_FILE
15850 5f 53 49 5a 45 29 0a 20 20 20 20 20 20 20 26 26  _SIZE).       &&
15860 20 28 28 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f   ((lastErrno = o
15870 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29  sGetLastError())
15880 21 3d 4e 4f 5f 45 52 52 4f 52 29 20 29 7b 0a 20  !=NO_ERROR) ){. 
15890 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
158a0 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e  Errno = lastErrn
158b0 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69  o;.      rc = wi
158c0 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
158d0 5f 49 4f 45 52 52 5f 46 53 54 41 54 2c 20 70 46  _IOERR_FSTAT, pF
158e0 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a  ile->lastErrno,.
158f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15900 20 20 20 20 20 20 20 22 77 69 6e 46 69 6c 65 53         "winFileS
15910 69 7a 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61  ize", pFile->zPa
15920 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  th);.    }.  }.#
15930 65 6e 64 69 66 0a 20 20 4f 53 54 52 41 43 45 28  endif.  OSTRACE(
15940 28 22 53 49 5a 45 20 66 69 6c 65 3d 25 70 2c 20  ("SIZE file=%p, 
15950 70 53 69 7a 65 3d 25 70 2c 20 2a 70 53 69 7a 65  pSize=%p, *pSize
15960 3d 25 6c 6c 64 2c 20 72 63 3d 25 73 5c 6e 22 2c  =%lld, rc=%s\n",
15970 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c  .           pFil
15980 65 2d 3e 68 2c 20 70 53 69 7a 65 2c 20 2a 70 53  e->h, pSize, *pS
15990 69 7a 65 2c 20 73 71 6c 69 74 65 33 45 72 72 4e  ize, sqlite3ErrN
159a0 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 72 65 74  ame(rc)));.  ret
159b0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
159c0 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49   LOCKFILE_FAIL_I
159d0 4d 4d 45 44 49 41 54 45 4c 59 20 69 73 20 75 6e  MMEDIATELY is un
159e0 64 65 66 69 6e 65 64 20 6f 6e 20 73 6f 6d 65 20  defined on some 
159f0 57 69 6e 64 6f 77 73 20 73 79 73 74 65 6d 73 2e  Windows systems.
15a00 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4c 4f 43 4b  .*/.#ifndef LOCK
15a10 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49  FILE_FAIL_IMMEDI
15a20 41 54 45 4c 59 0a 23 20 64 65 66 69 6e 65 20 4c  ATELY.# define L
15a30 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d  OCKFILE_FAIL_IMM
15a40 45 44 49 41 54 45 4c 59 20 31 0a 23 65 6e 64 69  EDIATELY 1.#endi
15a50 66 0a 0a 23 69 66 6e 64 65 66 20 4c 4f 43 4b 46  f..#ifndef LOCKF
15a60 49 4c 45 5f 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ILE_EXCLUSIVE_LO
15a70 43 4b 0a 23 20 64 65 66 69 6e 65 20 4c 4f 43 4b  CK.# define LOCK
15a80 46 49 4c 45 5f 45 58 43 4c 55 53 49 56 45 5f 4c  FILE_EXCLUSIVE_L
15a90 4f 43 4b 20 32 0a 23 65 6e 64 69 66 0a 0a 2f 2a  OCK 2.#endif../*
15aa0 0a 2a 2a 20 48 69 73 74 6f 72 69 63 61 6c 6c 79  .** Historically
15ab0 2c 20 53 51 4c 69 74 65 20 68 61 73 20 75 73 65  , SQLite has use
15ac0 64 20 62 6f 74 68 20 74 68 65 20 4c 6f 63 6b 46  d both the LockF
15ad0 69 6c 65 20 61 6e 64 20 4c 6f 63 6b 46 69 6c 65  ile and LockFile
15ae0 45 78 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2a  Ex functions..**
15af0 20 57 68 65 6e 20 74 68 65 20 4c 6f 63 6b 46 69   When the LockFi
15b00 6c 65 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20  le function was 
15b10 75 73 65 64 2c 20 69 74 20 77 61 73 20 61 6c 77  used, it was alw
15b20 61 79 73 20 65 78 70 65 63 74 65 64 20 74 6f 20  ays expected to 
15b30 66 61 69 6c 0a 2a 2a 20 69 6d 6d 65 64 69 61 74  fail.** immediat
15b40 65 6c 79 20 69 66 20 74 68 65 20 6c 6f 63 6b 20  ely if the lock 
15b50 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 6f 62 74  could not be obt
15b60 61 69 6e 65 64 2e 20 20 41 6c 73 6f 2c 20 69 74  ained.  Also, it
15b70 20 61 6c 77 61 79 73 20 65 78 70 65 63 74 65 64   always expected
15b80 20 74 6f 0a 2a 2a 20 6f 62 74 61 69 6e 20 61 6e   to.** obtain an
15b90 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e   exclusive lock.
15ba0 20 20 54 68 65 73 65 20 66 6c 61 67 73 20 61 72    These flags ar
15bb0 65 20 75 73 65 64 20 77 69 74 68 20 74 68 65 20  e used with the 
15bc0 4c 6f 63 6b 46 69 6c 65 45 78 20 66 75 6e 63 74  LockFileEx funct
15bd0 69 6f 6e 0a 2a 2a 20 61 6e 64 20 72 65 66 6c 65  ion.** and refle
15be0 63 74 20 74 68 6f 73 65 20 65 78 70 65 63 74 61  ct those expecta
15bf0 74 69 6f 6e 73 3b 20 74 68 65 72 65 66 6f 72 65  tions; therefore
15c00 2c 20 74 68 65 79 20 73 68 6f 75 6c 64 20 6e 6f  , they should no
15c10 74 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2f  t be changed..*/
15c20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
15c30 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53 0a 23  LOCKFILE_FLAGS.#
15c40 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 4c   define SQLITE_L
15c50 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53 20 20 20  OCKFILE_FLAGS   
15c60 28 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49  (LOCKFILE_FAIL_I
15c70 4d 4d 45 44 49 41 54 45 4c 59 20 7c 20 5c 0a 20  MMEDIATELY | \. 
15c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ca0 20 4c 4f 43 4b 46 49 4c 45 5f 45 58 43 4c 55 53   LOCKFILE_EXCLUS
15cb0 49 56 45 5f 4c 4f 43 4b 29 0a 23 65 6e 64 69 66  IVE_LOCK).#endif
15cc0 0a 0a 2f 2a 0a 2a 2a 20 43 75 72 72 65 6e 74 6c  ../*.** Currentl
15cd0 79 2c 20 53 51 4c 69 74 65 20 6e 65 76 65 72 20  y, SQLite never 
15ce0 63 61 6c 6c 73 20 74 68 65 20 4c 6f 63 6b 46 69  calls the LockFi
15cf0 6c 65 45 78 20 66 75 6e 63 74 69 6f 6e 20 77 69  leEx function wi
15d00 74 68 6f 75 74 20 77 61 6e 74 69 6e 67 20 74 68  thout wanting th
15d10 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 66 61 69  e.** call to fai
15d20 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 69 66  l immediately if
15d30 20 74 68 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74   the lock cannot
15d40 20 62 65 20 6f 62 74 61 69 6e 65 64 2e 0a 2a 2f   be obtained..*/
15d50 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
15d60 4c 4f 43 4b 46 49 4c 45 45 58 5f 46 4c 41 47 53  LOCKFILEEX_FLAGS
15d70 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  .# define SQLITE
15d80 5f 4c 4f 43 4b 46 49 4c 45 45 58 5f 46 4c 41 47  _LOCKFILEEX_FLAG
15d90 53 20 28 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c  S (LOCKFILE_FAIL
15da0 5f 49 4d 4d 45 44 49 41 54 45 4c 59 29 0a 23 65  _IMMEDIATELY).#e
15db0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75  ndif../*.** Acqu
15dc0 69 72 65 20 61 20 72 65 61 64 65 72 20 6c 6f 63  ire a reader loc
15dd0 6b 2e 0a 2a 2a 20 44 69 66 66 65 72 65 6e 74 20  k..** Different 
15de0 41 50 49 20 72 6f 75 74 69 6e 65 73 20 61 72 65  API routines are
15df0 20 63 61 6c 6c 65 64 20 64 65 70 65 6e 64 69 6e   called dependin
15e00 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20  g on whether or 
15e10 6e 6f 74 20 74 68 69 73 0a 2a 2a 20 69 73 20 57  not this.** is W
15e20 69 6e 39 78 20 6f 72 20 57 69 6e 4e 54 2e 0a 2a  in9x or WinNT..*
15e30 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
15e40 47 65 74 52 65 61 64 4c 6f 63 6b 28 77 69 6e 46  GetReadLock(winF
15e50 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69  ile *pFile){.  i
15e60 6e 74 20 72 65 73 3b 0a 20 20 4f 53 54 52 41 43  nt res;.  OSTRAC
15e70 45 28 28 22 52 45 41 44 2d 4c 4f 43 4b 20 66 69  E(("READ-LOCK fi
15e80 6c 65 3d 25 70 2c 20 6c 6f 63 6b 3d 25 64 5c 6e  le=%p, lock=%d\n
15e90 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69  ", pFile->h, pFi
15ea0 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29 3b 0a  le->locktype));.
15eb0 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29    if( osIsNT() )
15ec0 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  {.#if SQLITE_OS_
15ed0 57 49 4e 43 45 0a 20 20 20 20 2f 2a 0a 20 20 20  WINCE.    /*.   
15ee0 20 2a 2a 20 4e 4f 54 45 3a 20 57 69 6e 64 6f 77   ** NOTE: Window
15ef0 73 20 43 45 20 69 73 20 68 61 6e 64 6c 65 64 20  s CE is handled 
15f00 64 69 66 66 65 72 65 6e 74 6c 79 20 68 65 72 65  differently here
15f10 20 64 75 65 20 69 74 73 20 6c 61 63 6b 20 6f 66   due its lack of
15f20 20 74 68 65 20 57 69 6e 33 32 0a 20 20 20 20 2a   the Win32.    *
15f30 2a 20 20 20 20 20 20 20 41 50 49 20 4c 6f 63 6b  *       API Lock
15f40 46 69 6c 65 45 78 2e 0a 20 20 20 20 2a 2f 0a 20  FileEx..    */. 
15f50 20 20 20 72 65 73 20 3d 20 77 69 6e 63 65 4c 6f     res = winceLo
15f60 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68  ckFile(&pFile->h
15f70 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20  , SHARED_FIRST, 
15f80 30 2c 20 31 2c 20 30 29 3b 0a 23 65 6c 73 65 0a  0, 1, 0);.#else.
15f90 20 20 20 20 72 65 73 20 3d 20 77 69 6e 4c 6f 63      res = winLoc
15fa0 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c  kFile(&pFile->h,
15fb0 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45   SQLITE_LOCKFILE
15fc0 45 58 5f 46 4c 41 47 53 2c 20 53 48 41 52 45 44  EX_FLAGS, SHARED
15fd0 5f 46 49 52 53 54 2c 20 30 2c 0a 20 20 20 20 20  _FIRST, 0,.     
15fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ff0 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29   SHARED_SIZE, 0)
16000 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 69 66  ;.#endif.  }.#if
16010 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  def SQLITE_WIN32
16020 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65  _HAS_ANSI.  else
16030 7b 0a 20 20 20 20 69 6e 74 20 6c 6b 3b 0a 20 20  {.    int lk;.  
16040 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d    sqlite3_random
16050 6e 65 73 73 28 73 69 7a 65 6f 66 28 6c 6b 29 2c  ness(sizeof(lk),
16060 20 26 6c 6b 29 3b 0a 20 20 20 20 70 46 69 6c 65   &lk);.    pFile
16070 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65  ->sharedLockByte
16080 20 3d 20 28 73 68 6f 72 74 29 28 28 6c 6b 20 26   = (short)((lk &
16090 20 30 78 37 66 66 66 66 66 66 66 29 25 28 53 48   0x7fffffff)%(SH
160a0 41 52 45 44 5f 53 49 5a 45 20 2d 20 31 29 29 3b  ARED_SIZE - 1));
160b0 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e 4c 6f  .    res = winLo
160c0 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68  ckFile(&pFile->h
160d0 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c  , SQLITE_LOCKFIL
160e0 45 5f 46 4c 41 47 53 2c 0a 20 20 20 20 20 20 20  E_FLAGS,.       
160f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
16100 48 41 52 45 44 5f 46 49 52 53 54 2b 70 46 69 6c  HARED_FIRST+pFil
16110 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74  e->sharedLockByt
16120 65 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d  e, 0, 1, 0);.  }
16130 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 72 65  .#endif.  if( re
16140 73 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20 70 46  s == 0 ){.    pF
16150 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
16160 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
16170 29 3b 0a 20 20 20 20 2f 2a 20 4e 6f 20 6e 65 65  );.    /* No nee
16180 64 20 74 6f 20 6c 6f 67 20 61 20 66 61 69 6c 75  d to log a failu
16190 72 65 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20  re to lock */.  
161a0 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52 45  }.  OSTRACE(("RE
161b0 41 44 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c  AD-LOCK file=%p,
161c0 20 72 65 73 75 6c 74 3d 25 64 5c 6e 22 2c 20 70   result=%d\n", p
161d0 46 69 6c 65 2d 3e 68 2c 20 72 65 73 29 29 3b 0a  File->h, res));.
161e0 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a    return res;.}.
161f0 0a 2f 2a 0a 2a 2a 20 55 6e 64 6f 20 61 20 72 65  ./*.** Undo a re
16200 61 64 6c 6f 63 6b 0a 2a 2f 0a 73 74 61 74 69 63  adlock.*/.static
16210 20 69 6e 74 20 77 69 6e 55 6e 6c 6f 63 6b 52 65   int winUnlockRe
16220 61 64 4c 6f 63 6b 28 77 69 6e 46 69 6c 65 20 2a  adLock(winFile *
16230 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20 72 65  pFile){.  int re
16240 73 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45  s;.  DWORD lastE
16250 72 72 6e 6f 3b 0a 20 20 4f 53 54 52 41 43 45 28  rrno;.  OSTRACE(
16260 28 22 52 45 41 44 2d 55 4e 4c 4f 43 4b 20 66 69  ("READ-UNLOCK fi
16270 6c 65 3d 25 70 2c 20 6c 6f 63 6b 3d 25 64 5c 6e  le=%p, lock=%d\n
16280 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69  ", pFile->h, pFi
16290 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29 3b 0a  le->locktype));.
162a0 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29    if( osIsNT() )
162b0 7b 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e 55  {.    res = winU
162c0 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65  nlockFile(&pFile
162d0 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53  ->h, SHARED_FIRS
162e0 54 2c 20 30 2c 20 53 48 41 52 45 44 5f 53 49 5a  T, 0, SHARED_SIZ
162f0 45 2c 20 30 29 3b 0a 20 20 7d 0a 23 69 66 64 65  E, 0);.  }.#ifde
16300 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  f SQLITE_WIN32_H
16310 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a  AS_ANSI.  else{.
16320 20 20 20 20 72 65 73 20 3d 20 77 69 6e 55 6e 6c      res = winUnl
16330 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e  ockFile(&pFile->
16340 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b  h, SHARED_FIRST+
16350 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63  pFile->sharedLoc
16360 6b 42 79 74 65 2c 20 30 2c 20 31 2c 20 30 29 3b  kByte, 0, 1, 0);
16370 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
16380 28 20 72 65 73 3d 3d 30 20 26 26 20 28 28 6c 61  ( res==0 && ((la
16390 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
163a0 61 73 74 45 72 72 6f 72 28 29 29 21 3d 45 52 52  astError())!=ERR
163b0 4f 52 5f 4e 4f 54 5f 4c 4f 43 4b 45 44 29 20 29  OR_NOT_LOCKED) )
163c0 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73  {.    pFile->las
163d0 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72  tErrno = lastErr
163e0 6e 6f 3b 0a 20 20 20 20 77 69 6e 4c 6f 67 45 72  no;.    winLogEr
163f0 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
16400 5f 55 4e 4c 4f 43 4b 2c 20 70 46 69 6c 65 2d 3e  _UNLOCK, pFile->
16410 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  lastErrno,.     
16420 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 55             "winU
16430 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 22 2c 20  nlockReadLock", 
16440 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
16450 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52   }.  OSTRACE(("R
16460 45 41 44 2d 55 4e 4c 4f 43 4b 20 66 69 6c 65 3d  EAD-UNLOCK file=
16470 25 70 2c 20 72 65 73 75 6c 74 3d 25 64 5c 6e 22  %p, result=%d\n"
16480 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 65 73 29  , pFile->h, res)
16490 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b  );.  return res;
164a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74  .}../*.** Lock t
164b0 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65  he file with the
164c0 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20   lock specified 
164d0 62 79 20 70 61 72 61 6d 65 74 65 72 20 6c 6f 63  by parameter loc
164e0 6b 74 79 70 65 20 2d 20 6f 6e 65 0a 2a 2a 20 6f  ktype - one.** o
164f0 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  f the following:
16500 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53  .**.**     (1) S
16510 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  HARED_LOCK.**   
16520 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c    (2) RESERVED_L
16530 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50  OCK.**     (3) P
16540 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20  ENDING_LOCK.**  
16550 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45     (4) EXCLUSIVE
16560 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65  _LOCK.**.** Some
16570 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65  times when reque
16580 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73  sting one lock s
16590 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c  tate, additional
165a0 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20   lock states.** 
165b0 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20  are inserted in 
165c0 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f  between.  The lo
165d0 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c  cking might fail
165e0 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c   on one of the l
165f0 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69  ater.** transiti
16600 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20  ons leaving the 
16610 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66 65  lock state diffe
16620 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69  rent from what i
16630 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a  t started but.**
16640 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20   still short of 
16650 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66  its goal.  The f
16660 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73  ollowing chart s
16670 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64  hows the allowed
16680 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
16690 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65 64  and the inserted
166a0 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74   intermediate st
166b0 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55  ates:.**.**    U
166c0 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45  NLOCKED -> SHARE
166d0 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
166e0 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20  > RESERVED.**   
166f0 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44   SHARED -> (PEND
16700 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
16710 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44  E.**    RESERVED
16720 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e   -> (PENDING) ->
16730 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20   EXCLUSIVE.**   
16740 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c   PENDING -> EXCL
16750 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73  USIVE.**.** This
16760 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e   routine will on
16770 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f  ly increase a lo
16780 63 6b 2e 20 20 54 68 65 20 77 69 6e 55 6e 6c 6f  ck.  The winUnlo
16790 63 6b 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  ck() routine.** 
167a0 65 72 61 73 65 73 20 61 6c 6c 20 6c 6f 63 6b 73  erases all locks
167b0 20 61 74 20 6f 6e 63 65 20 61 6e 64 20 72 65 74   at once and ret
167c0 75 72 6e 73 20 75 73 20 69 6d 6d 65 64 69 61 74  urns us immediat
167d0 65 6c 79 20 74 6f 20 6c 6f 63 6b 69 6e 67 20 6c  ely to locking l
167e0 65 76 65 6c 20 30 2e 0a 2a 2a 20 49 74 20 69 73  evel 0..** It is
167f0 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f   not possible to
16800 20 6c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69   lower the locki
16810 6e 67 20 6c 65 76 65 6c 20 6f 6e 65 20 73 74 65  ng level one ste
16820 70 20 61 74 20 61 20 74 69 6d 65 2e 20 20 59 6f  p at a time.  Yo
16830 75 0a 2a 2a 20 6d 75 73 74 20 67 6f 20 73 74 72  u.** must go str
16840 61 69 67 68 74 20 74 6f 20 6c 6f 63 6b 69 6e 67  aight to locking
16850 20 6c 65 76 65 6c 20 30 2e 0a 2a 2f 0a 73 74 61   level 0..*/.sta
16860 74 69 63 20 69 6e 74 20 77 69 6e 4c 6f 63 6b 28  tic int winLock(
16870 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
16880 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b  , int locktype){
16890 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
168a0 54 45 5f 4f 4b 3b 20 20 20 20 2f 2a 20 52 65 74  TE_OK;    /* Ret
168b0 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 75  urn code from su
168c0 62 72 6f 75 74 69 6e 65 73 20 2a 2f 0a 20 20 69  broutines */.  i
168d0 6e 74 20 72 65 73 20 3d 20 31 3b 20 20 20 20 20  nt res = 1;     
168e0 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
168f0 6f 66 20 61 20 57 69 6e 64 6f 77 73 20 6c 6f 63  of a Windows loc
16900 6b 20 63 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20  k call */.  int 
16910 6e 65 77 4c 6f 63 6b 74 79 70 65 3b 20 20 20 20  newLocktype;    
16920 20 20 20 2f 2a 20 53 65 74 20 70 46 69 6c 65 2d     /* Set pFile-
16930 3e 6c 6f 63 6b 74 79 70 65 20 74 6f 20 74 68 69  >locktype to thi
16940 73 20 76 61 6c 75 65 20 62 65 66 6f 72 65 20 65  s value before e
16950 78 69 74 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20  xiting */.  int 
16960 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d  gotPendingLock =
16970 20 30 3b 2f 2a 20 54 72 75 65 20 69 66 20 77 65   0;/* True if we
16980 20 61 63 71 75 69 72 65 64 20 61 20 50 45 4e 44   acquired a PEND
16990 49 4e 47 20 6c 6f 63 6b 20 74 68 69 73 20 74 69  ING lock this ti
169a0 6d 65 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 20  me */.  winFile 
169b0 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c  *pFile = (winFil
169c0 65 2a 29 69 64 3b 0a 20 20 44 57 4f 52 44 20 6c  e*)id;.  DWORD l
169d0 61 73 74 45 72 72 6e 6f 20 3d 20 4e 4f 5f 45 52  astErrno = NO_ER
169e0 52 4f 52 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ROR;..  assert( 
169f0 69 64 21 3d 30 20 29 3b 0a 20 20 4f 53 54 52 41  id!=0 );.  OSTRA
16a00 43 45 28 28 22 4c 4f 43 4b 20 66 69 6c 65 3d 25  CE(("LOCK file=%
16a10 70 2c 20 6f 6c 64 4c 6f 63 6b 3d 25 64 28 25 64  p, oldLock=%d(%d
16a20 29 2c 20 6e 65 77 4c 6f 63 6b 3d 25 64 5c 6e 22  ), newLock=%d\n"
16a30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69  ,.           pFi
16a40 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f  le->h, pFile->lo
16a50 63 6b 74 79 70 65 2c 20 70 46 69 6c 65 2d 3e 73  cktype, pFile->s
16a60 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 6c  haredLockByte, l
16a70 6f 63 6b 74 79 70 65 29 29 3b 0a 0a 20 20 2f 2a  ocktype));..  /*
16a80 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 72   If there is alr
16a90 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74  eady a lock of t
16aa0 68 69 73 20 74 79 70 65 20 6f 72 20 6d 6f 72 65  his type or more
16ab0 20 72 65 73 74 72 69 63 74 69 76 65 20 6f 6e 20   restrictive on 
16ac0 74 68 65 0a 20 20 2a 2a 20 4f 73 46 69 6c 65 2c  the.  ** OsFile,
16ad0 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e   do nothing. Don
16ae0 27 74 20 75 73 65 20 74 68 65 20 65 6e 64 5f 6c  't use the end_l
16af0 6f 63 6b 3a 20 65 78 69 74 20 70 61 74 68 2c 20  ock: exit path, 
16b00 61 73 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 4f  as.  ** sqlite3O
16b10 73 45 6e 74 65 72 4d 75 74 65 78 28 29 20 68 61  sEnterMutex() ha
16b20 73 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c 65 64  sn't been called
16b30 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   yet..  */.  if(
16b40 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
16b50 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20  >=locktype ){.  
16b60 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b    OSTRACE(("LOCK
16b70 2d 48 45 4c 44 20 66 69 6c 65 3d 25 70 2c 20 72  -HELD file=%p, r
16b80 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20  c=SQLITE_OK\n", 
16b90 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20  pFile->h));.    
16ba0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
16bb0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  ;.  }..  /* Make
16bc0 20 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 69 6e   sure the lockin
16bd0 67 20 73 65 71 75 65 6e 63 65 20 69 73 20 63 6f  g sequence is co
16be0 72 72 65 63 74 0a 20 20 2a 2f 0a 20 20 61 73 73  rrect.  */.  ass
16bf0 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ert( pFile->lock
16c00 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c  type!=NO_LOCK ||
16c10 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45   locktype==SHARE
16c20 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  D_LOCK );.  asse
16c30 72 74 28 20 6c 6f 63 6b 74 79 70 65 21 3d 50 45  rt( locktype!=PE
16c40 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20  NDING_LOCK );.  
16c50 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65  assert( locktype
16c60 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  !=RESERVED_LOCK 
16c70 7c 7c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  || pFile->lockty
16c80 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe==SHARED_LOCK 
16c90 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 6b 20 74 68  );..  /* Lock th
16ca0 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 62  e PENDING_LOCK b
16cb0 79 74 65 20 69 66 20 77 65 20 6e 65 65 64 20 74  yte if we need t
16cc0 6f 20 61 63 71 75 69 72 65 20 61 20 50 45 4e 44  o acquire a PEND
16cd0 49 4e 47 20 6c 6f 63 6b 20 6f 72 0a 20 20 2a 2a  ING lock or.  **
16ce0 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e 20   a SHARED lock. 
16cf0 20 49 66 20 77 65 20 61 72 65 20 61 63 71 75 69   If we are acqui
16d00 72 69 6e 67 20 61 20 53 48 41 52 45 44 20 6c 6f  ring a SHARED lo
16d10 63 6b 2c 20 74 68 65 20 61 63 71 75 69 73 69 74  ck, the acquisit
16d20 69 6f 6e 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20  ion of.  ** the 
16d30 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 62 79 74  PENDING_LOCK byt
16d40 65 20 69 73 20 74 65 6d 70 6f 72 61 72 79 2e 0a  e is temporary..
16d50 20 20 2a 2f 0a 20 20 6e 65 77 4c 6f 63 6b 74 79    */.  newLockty
16d60 70 65 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  pe = pFile->lock
16d70 74 79 70 65 3b 0a 20 20 69 66 28 20 20 20 28 70  type;.  if(   (p
16d80 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d  File->locktype==
16d90 4e 4f 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 7c 7c  NO_LOCK).     ||
16da0 20 28 20 20 20 28 6c 6f 63 6b 74 79 70 65 3d 3d   (   (locktype==
16db0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a  EXCLUSIVE_LOCK).
16dc0 20 20 20 20 20 20 20 20 20 26 26 20 28 70 46 69           && (pFi
16dd0 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 52 45  le->locktype==RE
16de0 53 45 52 56 45 44 5f 4c 4f 43 4b 29 29 0a 20 20  SERVED_LOCK)).  
16df0 29 7b 0a 20 20 20 20 69 6e 74 20 63 6e 74 20 3d  ){.    int cnt =
16e00 20 33 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 63   3;.    while( c
16e10 6e 74 2d 2d 3e 30 20 26 26 20 28 72 65 73 20 3d  nt-->0 && (res =
16e20 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46   winLockFile(&pF
16e30 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c  ile->h, SQLITE_L
16e40 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53 2c 0a 20  OCKFILE_FLAGS,. 
16e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e70 20 20 20 20 20 20 20 20 50 45 4e 44 49 4e 47 5f          PENDING_
16e80 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 29 3d  BYTE, 0, 1, 0))=
16e90 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  =0 ){.      /* T
16ea0 72 79 20 33 20 74 69 6d 65 73 20 74 6f 20 67 65  ry 3 times to ge
16eb0 74 20 74 68 65 20 70 65 6e 64 69 6e 67 20 6c 6f  t the pending lo
16ec0 63 6b 2e 20 20 54 68 69 73 20 69 73 20 6e 65 65  ck.  This is nee
16ed0 64 65 64 20 74 6f 20 77 6f 72 6b 0a 20 20 20 20  ded to work.    
16ee0 20 20 2a 2a 20 61 72 6f 75 6e 64 20 70 72 6f 62    ** around prob
16ef0 6c 65 6d 73 20 63 61 75 73 65 64 20 62 79 20 69  lems caused by i
16f00 6e 64 65 78 69 6e 67 20 61 6e 64 2f 6f 72 20 61  ndexing and/or a
16f10 6e 74 69 2d 76 69 72 75 73 20 73 6f 66 74 77 61  nti-virus softwa
16f20 72 65 20 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 57  re on.      ** W
16f30 69 6e 64 6f 77 73 20 73 79 73 74 65 6d 73 2e 0a  indows systems..
16f40 20 20 20 20 20 20 2a 2a 20 49 66 20 79 6f 75 20        ** If you 
16f50 61 72 65 20 75 73 69 6e 67 20 74 68 69 73 20 63  are using this c
16f60 6f 64 65 20 61 73 20 61 20 6d 6f 64 65 6c 20 66  ode as a model f
16f70 6f 72 20 61 6c 74 65 72 6e 61 74 69 76 65 20 56  or alternative V
16f80 46 53 65 73 2c 20 64 6f 20 6e 6f 74 0a 20 20 20  FSes, do not.   
16f90 20 20 20 2a 2a 20 63 6f 70 79 20 74 68 69 73 20     ** copy this 
16fa0 72 65 74 72 79 20 6c 6f 67 69 63 2e 20 20 49 74  retry logic.  It
16fb0 20 69 73 20 61 20 68 61 63 6b 20 69 6e 74 65 6e   is a hack inten
16fc0 64 65 64 20 66 6f 72 20 57 69 6e 64 6f 77 73 20  ded for Windows 
16fd0 6f 6e 6c 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  only..      */. 
16fe0 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d       lastErrno =
16ff0 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
17000 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  );.      OSTRACE
17010 28 28 22 4c 4f 43 4b 2d 50 45 4e 44 49 4e 47 2d  (("LOCK-PENDING-
17020 46 41 49 4c 20 66 69 6c 65 3d 25 70 2c 20 63 6f  FAIL file=%p, co
17030 75 6e 74 3d 25 64 2c 20 72 65 73 75 6c 74 3d 25  unt=%d, result=%
17040 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
17050 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 63       pFile->h, c
17060 6e 74 2c 20 72 65 73 29 29 3b 0a 20 20 20 20 20  nt, res));.     
17070 20 69 66 28 20 6c 61 73 74 45 72 72 6e 6f 3d 3d   if( lastErrno==
17080 45 52 52 4f 52 5f 49 4e 56 41 4c 49 44 5f 48 41  ERROR_INVALID_HA
17090 4e 44 4c 45 20 29 7b 0a 20 20 20 20 20 20 20 20  NDLE ){.        
170a0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
170b0 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20   = lastErrno;.  
170c0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
170d0 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20  E_IOERR_LOCK;.  
170e0 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
170f0 4c 4f 43 4b 2d 46 41 49 4c 20 66 69 6c 65 3d 25  LOCK-FAIL file=%
17100 70 2c 20 63 6f 75 6e 74 3d 25 64 2c 20 72 63 3d  p, count=%d, rc=
17110 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
17120 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68          pFile->h
17130 2c 20 63 6e 74 2c 20 73 71 6c 69 74 65 33 45 72  , cnt, sqlite3Er
17140 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 20  rName(rc)));.   
17150 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
17160 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
17170 28 20 63 6e 74 20 29 20 73 71 6c 69 74 65 33 5f  ( cnt ) sqlite3_
17180 77 69 6e 33 32 5f 73 6c 65 65 70 28 31 29 3b 0a  win32_sleep(1);.
17190 20 20 20 20 7d 0a 20 20 20 20 67 6f 74 50 65 6e      }.    gotPen
171a0 64 69 6e 67 4c 6f 63 6b 20 3d 20 72 65 73 3b 0a  dingLock = res;.
171b0 20 20 20 20 69 66 28 20 21 72 65 73 20 29 7b 0a      if( !res ){.
171c0 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 20        lastErrno 
171d0 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
171e0 28 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ();.    }.  }.. 
171f0 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20 73 68   /* Acquire a sh
17200 61 72 65 64 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20  ared lock.  */. 
17210 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53   if( locktype==S
17220 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 72 65  HARED_LOCK && re
17230 73 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  s ){.    assert(
17240 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
17250 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  ==NO_LOCK );.   
17260 20 72 65 73 20 3d 20 77 69 6e 47 65 74 52 65 61   res = winGetRea
17270 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20  dLock(pFile);.  
17280 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20    if( res ){.   
17290 20 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d     newLocktype =
172a0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20   SHARED_LOCK;.  
172b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c    }else{.      l
172c0 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
172d0 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
172e0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71   }.  }..  /* Acq
172f0 75 69 72 65 20 61 20 52 45 53 45 52 56 45 44 20  uire a RESERVED 
17300 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20  lock.  */.  if( 
17310 6c 6f 63 6b 74 79 70 65 3d 3d 52 45 53 45 52 56  locktype==RESERV
17320 45 44 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20 29  ED_LOCK && res )
17330 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46  {.    assert( pF
17340 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53  ile->locktype==S
17350 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
17360 20 20 72 65 73 20 3d 20 77 69 6e 4c 6f 63 6b 46    res = winLockF
17370 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53  ile(&pFile->h, S
17380 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46  QLITE_LOCKFILE_F
17390 4c 41 47 53 2c 20 52 45 53 45 52 56 45 44 5f 42  LAGS, RESERVED_B
173a0 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20  YTE, 0, 1, 0);. 
173b0 20 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20     if( res ){.  
173c0 20 20 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20      newLocktype 
173d0 3d 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 3b  = RESERVED_LOCK;
173e0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
173f0 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73    lastErrno = os
17400 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
17410 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
17420 41 63 71 75 69 72 65 20 61 20 50 45 4e 44 49 4e  Acquire a PENDIN
17430 47 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66  G lock.  */.  if
17440 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c  ( locktype==EXCL
17450 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 72 65  USIVE_LOCK && re
17460 73 20 29 7b 0a 20 20 20 20 6e 65 77 4c 6f 63 6b  s ){.    newLock
17470 74 79 70 65 20 3d 20 50 45 4e 44 49 4e 47 5f 4c  type = PENDING_L
17480 4f 43 4b 3b 0a 20 20 20 20 67 6f 74 50 65 6e 64  OCK;.    gotPend
17490 69 6e 67 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 7d  ingLock = 0;.  }
174a0 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61  ..  /* Acquire a
174b0 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
174c0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b  .  */.  if( lock
174d0 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f  type==EXCLUSIVE_
174e0 4c 4f 43 4b 20 26 26 20 72 65 73 20 29 7b 0a 20  LOCK && res ){. 
174f0 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65     assert( pFile
17500 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 53 48 41 52  ->locktype>=SHAR
17510 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72  ED_LOCK );.    r
17520 65 73 20 3d 20 77 69 6e 55 6e 6c 6f 63 6b 52 65  es = winUnlockRe
17530 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20  adLock(pFile);. 
17540 20 20 20 72 65 73 20 3d 20 77 69 6e 4c 6f 63 6b     res = winLock
17550 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20  File(&pFile->h, 
17560 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f  SQLITE_LOCKFILE_
17570 46 4c 41 47 53 2c 20 53 48 41 52 45 44 5f 46 49  FLAGS, SHARED_FI
17580 52 53 54 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  RST, 0,.        
17590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 48                SH
175a0 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20  ARED_SIZE, 0);. 
175b0 20 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20     if( res ){.  
175c0 20 20 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20      newLocktype 
175d0 3d 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  = EXCLUSIVE_LOCK
175e0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
175f0 20 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f     lastErrno = o
17600 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b  sGetLastError();
17610 0a 20 20 20 20 20 20 77 69 6e 47 65 74 52 65 61  .      winGetRea
17620 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20  dLock(pFile);.  
17630 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
17640 20 77 65 20 61 72 65 20 68 6f 6c 64 69 6e 67 20   we are holding 
17650 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 74  a PENDING lock t
17660 68 61 74 20 6f 75 67 68 74 20 74 6f 20 62 65 20  hat ought to be 
17670 72 65 6c 65 61 73 65 64 2c 20 74 68 65 6e 0a 20  released, then. 
17680 20 2a 2a 20 72 65 6c 65 61 73 65 20 69 74 20 6e   ** release it n
17690 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 67  ow..  */.  if( g
176a0 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 26 26  otPendingLock &&
176b0 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45   locktype==SHARE
176c0 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 77 69  D_LOCK ){.    wi
176d0 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69  nUnlockFile(&pFi
176e0 6c 65 2d 3e 68 2c 20 50 45 4e 44 49 4e 47 5f 42  le->h, PENDING_B
176f0 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20  YTE, 0, 1, 0);. 
17700 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20   }..  /* Update 
17710 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65  the state of the
17720 20 6c 6f 63 6b 20 68 61 73 20 68 65 6c 64 20 69   lock has held i
17730 6e 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  n the file descr
17740 69 70 74 6f 72 20 74 68 65 6e 0a 20 20 2a 2a 20  iptor then.  ** 
17750 72 65 74 75 72 6e 20 74 68 65 20 61 70 70 72 6f  return the appro
17760 70 72 69 61 74 65 20 72 65 73 75 6c 74 20 63 6f  priate result co
17770 64 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  de..  */.  if( r
17780 65 73 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  es ){.    rc = S
17790 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
177a0 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  e{.    pFile->la
177b0 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72  stErrno = lastEr
177c0 72 6e 6f 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  rno;.    rc = SQ
177d0 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 4f  LITE_BUSY;.    O
177e0 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 2d 46 41  STRACE(("LOCK-FA
177f0 49 4c 20 66 69 6c 65 3d 25 70 2c 20 77 61 6e 74  IL file=%p, want
17800 65 64 3d 25 64 2c 20 67 6f 74 3d 25 64 5c 6e 22  ed=%d, got=%d\n"
17810 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 70  ,.             p
17820 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70  File->h, locktyp
17830 65 2c 20 6e 65 77 4c 6f 63 6b 74 79 70 65 29 29  e, newLocktype))
17840 3b 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 6c  ;.  }.  pFile->l
17850 6f 63 6b 74 79 70 65 20 3d 20 28 75 38 29 6e 65  ocktype = (u8)ne
17860 77 4c 6f 63 6b 74 79 70 65 3b 0a 20 20 4f 53 54  wLocktype;.  OST
17870 52 41 43 45 28 28 22 4c 4f 43 4b 20 66 69 6c 65  RACE(("LOCK file
17880 3d 25 70 2c 20 6c 6f 63 6b 3d 25 64 2c 20 72 63  =%p, lock=%d, rc
17890 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%s\n",.        
178a0 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69     pFile->h, pFi
178b0 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 73 71  le->locktype, sq
178c0 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29  lite3ErrName(rc)
178d0 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ));.  return rc;
178e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
178f0 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66  outine checks if
17900 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53 45   there is a RESE
17910 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f  RVED lock held o
17920 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a  n the specified.
17930 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73 20  ** file by this 
17940 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f  or any other pro
17950 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61 20  cess. If such a 
17960 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 72 65  lock is held, re
17970 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f  turn.** non-zero
17980 2c 20 6f 74 68 65 72 77 69 73 65 20 7a 65 72 6f  , otherwise zero
17990 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
179a0 77 69 6e 43 68 65 63 6b 52 65 73 65 72 76 65 64  winCheckReserved
179b0 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
179c0 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73  e *id, int *pRes
179d0 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72 65 73 3b  Out){.  int res;
179e0 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  .  winFile *pFil
179f0 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64  e = (winFile*)id
17a00 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  ;..  SimulateIOE
17a10 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
17a20 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52  ITE_IOERR_CHECKR
17a30 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a  ESERVEDLOCK; );.
17a40 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 53 54    OSTRACE(("TEST
17a50 2d 57 52 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70  -WR-LOCK file=%p
17a60 2c 20 70 52 65 73 4f 75 74 3d 25 70 5c 6e 22 2c  , pResOut=%p\n",
17a70 20 70 46 69 6c 65 2d 3e 68 2c 20 70 52 65 73 4f   pFile->h, pResO
17a80 75 74 29 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  ut));..  assert(
17a90 20 69 64 21 3d 30 20 29 3b 0a 20 20 69 66 28 20   id!=0 );.  if( 
17aa0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e  pFile->locktype>
17ab0 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29  =RESERVED_LOCK )
17ac0 7b 0a 20 20 20 20 72 65 73 20 3d 20 31 3b 0a 20  {.    res = 1;. 
17ad0 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 53     OSTRACE(("TES
17ae0 54 2d 57 52 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25  T-WR-LOCK file=%
17af0 70 2c 20 72 65 73 75 6c 74 3d 25 64 20 28 6c 6f  p, result=%d (lo
17b00 63 61 6c 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  cal)\n", pFile->
17b10 68 2c 20 72 65 73 29 29 3b 0a 20 20 7d 65 6c 73  h, res));.  }els
17b20 65 7b 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e  e{.    res = win
17b30 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d  LockFile(&pFile-
17b40 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46  >h, SQLITE_LOCKF
17b50 49 4c 45 45 58 5f 46 4c 41 47 53 2c 52 45 53 45  ILEEX_FLAGS,RESE
17b60 52 56 45 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c  RVED_BYTE, 0, 1,
17b70 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73   0);.    if( res
17b80 20 29 7b 0a 20 20 20 20 20 20 77 69 6e 55 6e 6c   ){.      winUnl
17b90 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e  ockFile(&pFile->
17ba0 68 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45  h, RESERVED_BYTE
17bb0 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  , 0, 1, 0);.    
17bc0 7d 0a 20 20 20 20 72 65 73 20 3d 20 21 72 65 73  }.    res = !res
17bd0 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  ;.    OSTRACE(("
17be0 54 45 53 54 2d 57 52 2d 4c 4f 43 4b 20 66 69 6c  TEST-WR-LOCK fil
17bf0 65 3d 25 70 2c 20 72 65 73 75 6c 74 3d 25 64 20  e=%p, result=%d 
17c00 28 72 65 6d 6f 74 65 29 5c 6e 22 2c 20 70 46 69  (remote)\n", pFi
17c10 6c 65 2d 3e 68 2c 20 72 65 73 29 29 3b 0a 20 20  le->h, res));.  
17c20 7d 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72  }.  *pResOut = r
17c30 65 73 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  es;.  OSTRACE(("
17c40 54 45 53 54 2d 57 52 2d 4c 4f 43 4b 20 66 69 6c  TEST-WR-LOCK fil
17c50 65 3d 25 70 2c 20 70 52 65 73 4f 75 74 3d 25 70  e=%p, pResOut=%p
17c60 2c 20 2a 70 52 65 73 4f 75 74 3d 25 64 2c 20 72  , *pResOut=%d, r
17c70 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a  c=SQLITE_OK\n",.
17c80 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
17c90 2d 3e 68 2c 20 70 52 65 73 4f 75 74 2c 20 2a 70  ->h, pResOut, *p
17ca0 52 65 73 4f 75 74 29 29 3b 0a 20 20 72 65 74 75  ResOut));.  retu
17cb0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
17cc0 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65  ./*.** Lower the
17cd0 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
17ce0 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
17cf0 72 20 69 64 20 74 6f 20 6c 6f 63 6b 74 79 70 65  r id to locktype
17d00 2e 20 20 6c 6f 63 6b 74 79 70 65 0a 2a 2a 20 6d  .  locktype.** m
17d10 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f  ust be either NO
17d20 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f  _LOCK or SHARED_
17d30 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  LOCK..**.** If t
17d40 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
17d50 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73   of the file des
17d60 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61  criptor is alrea
17d70 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a  dy at or below.*
17d80 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  * the requested 
17d90 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74  locking level, t
17da0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
17db0 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 74   no-op..**.** It
17dc0 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
17dd0 20 66 6f 72 20 74 68 69 73 20 72 6f 75 74 69 6e   for this routin
17de0 65 20 74 6f 20 66 61 69 6c 20 69 66 20 74 68 65  e to fail if the
17df0 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
17e00 0a 2a 2a 20 69 73 20 4e 4f 5f 4c 4f 43 4b 2e 20  .** is NO_LOCK. 
17e10 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   If the second a
17e20 72 67 75 6d 65 6e 74 20 69 73 20 53 48 41 52 45  rgument is SHARE
17e30 44 5f 4c 4f 43 4b 20 74 68 65 6e 20 74 68 69 73  D_LOCK then this
17e40 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 69 67 68   routine.** migh
17e50 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  t return SQLITE_
17e60 49 4f 45 52 52 3b 0a 2a 2f 0a 73 74 61 74 69 63  IOERR;.*/.static
17e70 20 69 6e 74 20 77 69 6e 55 6e 6c 6f 63 6b 28 73   int winUnlock(s
17e80 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
17e90 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a   int locktype){.
17ea0 20 20 69 6e 74 20 74 79 70 65 3b 0a 20 20 77 69    int type;.  wi
17eb0 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  nFile *pFile = (
17ec0 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69  winFile*)id;.  i
17ed0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
17ee0 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  K;.  assert( pFi
17ef0 6c 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  le!=0 );.  asser
17f00 74 28 20 6c 6f 63 6b 74 79 70 65 3c 3d 53 48 41  t( locktype<=SHA
17f10 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 4f 53  RED_LOCK );.  OS
17f20 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 66  TRACE(("UNLOCK f
17f30 69 6c 65 3d 25 70 2c 20 6f 6c 64 4c 6f 63 6b 3d  ile=%p, oldLock=
17f40 25 64 28 25 64 29 2c 20 6e 65 77 4c 6f 63 6b 3d  %d(%d), newLock=
17f50 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
17f60 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c    pFile->h, pFil
17f70 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 70 46 69  e->locktype, pFi
17f80 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79  le->sharedLockBy
17f90 74 65 2c 20 6c 6f 63 6b 74 79 70 65 29 29 3b 0a  te, locktype));.
17fa0 20 20 74 79 70 65 20 3d 20 70 46 69 6c 65 2d 3e    type = pFile->
17fb0 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 69 66 28 20  locktype;.  if( 
17fc0 74 79 70 65 3e 3d 45 58 43 4c 55 53 49 56 45 5f  type>=EXCLUSIVE_
17fd0 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 77 69 6e 55  LOCK ){.    winU
17fe0 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65  nlockFile(&pFile
17ff0 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53  ->h, SHARED_FIRS
18000 54 2c 20 30 2c 20 53 48 41 52 45 44 5f 53 49 5a  T, 0, SHARED_SIZ
18010 45 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 6c  E, 0);.    if( l
18020 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f  ocktype==SHARED_
18030 4c 4f 43 4b 20 26 26 20 21 77 69 6e 47 65 74 52  LOCK && !winGetR
18040 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29 20 29  eadLock(pFile) )
18050 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  {.      /* This 
18060 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 68 61 70  should never hap
18070 70 65 6e 2e 20 20 57 65 20 73 68 6f 75 6c 64 20  pen.  We should 
18080 61 6c 77 61 79 73 20 62 65 20 61 62 6c 65 20 74  always be able t
18090 6f 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 63 71  o.      ** reacq
180a0 75 69 72 65 20 74 68 65 20 72 65 61 64 20 6c 6f  uire the read lo
180b0 63 6b 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d  ck */.      rc =
180c0 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
180d0 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
180e0 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  , osGetLastError
180f0 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  (),.            
18100 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 55             "winU
18110 6e 6c 6f 63 6b 22 2c 20 70 46 69 6c 65 2d 3e 7a  nlock", pFile->z
18120 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Path);.    }.  }
18130 0a 20 20 69 66 28 20 74 79 70 65 3e 3d 52 45 53  .  if( type>=RES
18140 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  ERVED_LOCK ){.  
18150 20 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28    winUnlockFile(
18160 26 70 46 69 6c 65 2d 3e 68 2c 20 52 45 53 45 52  &pFile->h, RESER
18170 56 45 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20  VED_BYTE, 0, 1, 
18180 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6c 6f  0);.  }.  if( lo
18190 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20  cktype==NO_LOCK 
181a0 26 26 20 74 79 70 65 3e 3d 53 48 41 52 45 44 5f  && type>=SHARED_
181b0 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 77 69 6e 55  LOCK ){.    winU
181c0 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 28 70 46  nlockReadLock(pF
181d0 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ile);.  }.  if( 
181e0 74 79 70 65 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f  type>=PENDING_LO
181f0 43 4b 20 29 7b 0a 20 20 20 20 77 69 6e 55 6e 6c  CK ){.    winUnl
18200 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e  ockFile(&pFile->
18210 68 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c  h, PENDING_BYTE,
18220 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 20   0, 1, 0);.  }. 
18230 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
18240 20 3d 20 28 75 38 29 6c 6f 63 6b 74 79 70 65 3b   = (u8)locktype;
18250 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c  .  OSTRACE(("UNL
18260 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6c 6f 63  OCK file=%p, loc
18270 6b 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a  k=%d, rc=%s\n",.
18280 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
18290 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ->h, pFile->lock
182a0 74 79 70 65 2c 20 73 71 6c 69 74 65 33 45 72 72  type, sqlite3Err
182b0 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 72 65  Name(rc)));.  re
182c0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
182d0 2a 20 49 66 20 2a 70 41 72 67 20 69 73 20 69 6e  * If *pArg is in
182e0 69 74 69 61 6c 6c 79 20 6e 65 67 61 74 69 76 65  itially negative
182f0 20 74 68 65 6e 20 74 68 69 73 20 69 73 20 61 20   then this is a 
18300 71 75 65 72 79 2e 20 20 53 65 74 20 2a 70 41 72  query.  Set *pAr
18310 67 20 74 6f 0a 2a 2a 20 31 20 6f 72 20 30 20 64  g to.** 1 or 0 d
18320 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74  epending on whet
18330 68 65 72 20 6f 72 20 6e 6f 74 20 62 69 74 20 6d  her or not bit m
18340 61 73 6b 20 6f 66 20 70 46 69 6c 65 2d 3e 63 74  ask of pFile->ct
18350 72 6c 46 6c 61 67 73 20 69 73 20 73 65 74 2e 0a  rlFlags is set..
18360 2a 2a 0a 2a 2a 20 49 66 20 2a 70 41 72 67 20 69  **.** If *pArg i
18370 73 20 30 20 6f 72 20 31 2c 20 74 68 65 6e 20 63  s 0 or 1, then c
18380 6c 65 61 72 20 6f 72 20 73 65 74 20 74 68 65 20  lear or set the 
18390 6d 61 73 6b 20 62 69 74 20 6f 66 20 70 46 69 6c  mask bit of pFil
183a0 65 2d 3e 63 74 72 6c 46 6c 61 67 73 2e 0a 2a 2f  e->ctrlFlags..*/
183b0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e  .static void win
183c0 4d 6f 64 65 42 69 74 28 77 69 6e 46 69 6c 65 20  ModeBit(winFile 
183d0 2a 70 46 69 6c 65 2c 20 75 6e 73 69 67 6e 65 64  *pFile, unsigned
183e0 20 63 68 61 72 20 6d 61 73 6b 2c 20 69 6e 74 20   char mask, int 
183f0 2a 70 41 72 67 29 7b 0a 20 20 69 66 28 20 2a 70  *pArg){.  if( *p
18400 41 72 67 3c 30 20 29 7b 0a 20 20 20 20 2a 70 41  Arg<0 ){.    *pA
18410 72 67 20 3d 20 28 70 46 69 6c 65 2d 3e 63 74 72  rg = (pFile->ctr
18420 6c 46 6c 61 67 73 20 26 20 6d 61 73 6b 29 21 3d  lFlags & mask)!=
18430 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28  0;.  }else if( (
18440 2a 70 41 72 67 29 3d 3d 30 20 29 7b 0a 20 20 20  *pArg)==0 ){.   
18450 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67   pFile->ctrlFlag
18460 73 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 7d 65  s &= ~mask;.  }e
18470 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  lse{.    pFile->
18480 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 6d 61 73  ctrlFlags |= mas
18490 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 46 6f 72  k;.  }.}../* For
184a0 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 73 20  ward references 
184b0 74 6f 20 56 46 53 20 68 65 6c 70 65 72 20 6d 65  to VFS helper me
184c0 74 68 6f 64 73 20 75 73 65 64 20 66 6f 72 20 74  thods used for t
184d0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20 2a  emporary files *
184e0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
184f0 47 65 74 54 65 6d 70 6e 61 6d 65 28 73 71 6c 69  GetTempname(sqli
18500 74 65 33 5f 76 66 73 20 2a 2c 20 63 68 61 72 20  te3_vfs *, char 
18510 2a 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  **);.static int 
18520 77 69 6e 49 73 44 69 72 28 63 6f 6e 73 74 20 76  winIsDir(const v
18530 6f 69 64 20 2a 29 3b 0a 73 74 61 74 69 63 20 42  oid *);.static B
18540 4f 4f 4c 20 77 69 6e 49 73 44 72 69 76 65 4c 65  OOL winIsDriveLe
18550 74 74 65 72 41 6e 64 43 6f 6c 6f 6e 28 63 6f 6e  tterAndColon(con
18560 73 74 20 63 68 61 72 20 2a 29 3b 0a 0a 2f 2a 0a  st char *);../*.
18570 2a 2a 20 43 6f 6e 74 72 6f 6c 20 61 6e 64 20 71  ** Control and q
18580 75 65 72 79 20 6f 66 20 74 68 65 20 6f 70 65 6e  uery of the open
18590 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f   file handle..*/
185a0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 46  .static int winF
185b0 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74  ileControl(sqlit
185c0 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
185d0 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72 67 29   op, void *pArg)
185e0 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69  {.  winFile *pFi
185f0 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69  le = (winFile*)i
18600 64 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 46  d;.  OSTRACE(("F
18610 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 6f 70  CNTL file=%p, op
18620 3d 25 64 2c 20 70 41 72 67 3d 25 70 5c 6e 22 2c  =%d, pArg=%p\n",
18630 20 70 46 69 6c 65 2d 3e 68 2c 20 6f 70 2c 20 70   pFile->h, op, p
18640 41 72 67 29 29 3b 0a 20 20 73 77 69 74 63 68 28  Arg));.  switch(
18650 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20   op ){.    case 
18660 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43  SQLITE_FCNTL_LOC
18670 4b 53 54 41 54 45 3a 20 7b 0a 20 20 20 20 20 20  KSTATE: {.      
18680 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 70 46  *(int*)pArg = pF
18690 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20  ile->locktype;. 
186a0 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46       OSTRACE(("F
186b0 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63  CNTL file=%p, rc
186c0 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70  =SQLITE_OK\n", p
186d0 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20  File->h));.     
186e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
186f0 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
18700 65 20 53 51 4c 49 54 45 5f 4c 41 53 54 5f 45 52  e SQLITE_LAST_ER
18710 52 4e 4f 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69  RNO: {.      *(i
18720 6e 74 2a 29 70 41 72 67 20 3d 20 28 69 6e 74 29  nt*)pArg = (int)
18730 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
18740 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  ;.      OSTRACE(
18750 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c  ("FCNTL file=%p,
18760 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22   rc=SQLITE_OK\n"
18770 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
18780 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
18790 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
187a0 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
187b0 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 3a 20 7b 0a  L_CHUNK_SIZE: {.
187c0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 7a 43        pFile->szC
187d0 68 75 6e 6b 20 3d 20 2a 28 69 6e 74 20 2a 29 70  hunk = *(int *)p
187e0 41 72 67 3b 0a 20 20 20 20 20 20 4f 53 54 52 41  Arg;.      OSTRA
187f0 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d  CE(("FCNTL file=
18800 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b  %p, rc=SQLITE_OK
18810 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  \n", pFile->h));
18820 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
18830 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
18840 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
18850 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 3a 20  CNTL_SIZE_HINT: 
18860 7b 0a 20 20 20 20 20 20 69 66 28 20 70 46 69 6c  {.      if( pFil
18870 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20 29 7b 0a  e->szChunk>0 ){.
18880 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
18890 69 6e 74 36 34 20 6f 6c 64 53 7a 3b 0a 20 20 20  int64 oldSz;.   
188a0 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 77 69       int rc = wi
188b0 6e 46 69 6c 65 53 69 7a 65 28 69 64 2c 20 26 6f  nFileSize(id, &o
188c0 6c 64 53 7a 29 3b 0a 20 20 20 20 20 20 20 20 69  ldSz);.        i
188d0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
188e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
188f0 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 65 77 53  lite3_int64 newS
18900 7a 20 3d 20 2a 28 73 71 6c 69 74 65 33 5f 69 6e  z = *(sqlite3_in
18910 74 36 34 2a 29 70 41 72 67 3b 0a 20 20 20 20 20  t64*)pArg;.     
18920 20 20 20 20 20 69 66 28 20 6e 65 77 53 7a 3e 6f       if( newSz>o
18930 6c 64 53 7a 20 29 7b 0a 20 20 20 20 20 20 20 20  ldSz ){.        
18940 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
18950 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20  rorBenign(1);.  
18960 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77            rc = w
18970 69 6e 54 72 75 6e 63 61 74 65 28 69 64 2c 20 6e  inTruncate(id, n
18980 65 77 53 7a 29 3b 0a 20 20 20 20 20 20 20 20 20  ewSz);.         
18990 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
189a0 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20  orBenign(0);.   
189b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
189c0 20 7d 0a 20 20 20 20 20 20 20 20 4f 53 54 52 41   }.        OSTRA
189d0 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d  CE(("FCNTL file=
189e0 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 20 70 46  %p, rc=%s\n", pF
189f0 69 6c 65 2d 3e 68 2c 20 73 71 6c 69 74 65 33 45  ile->h, sqlite3E
18a00 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20  rrName(rc)));.  
18a10 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
18a20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 4f  .      }.      O
18a30 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66  STRACE(("FCNTL f
18a40 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  ile=%p, rc=SQLIT
18a50 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  E_OK\n", pFile->
18a60 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  h));.      retur
18a70 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
18a80 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
18a90 54 45 5f 46 43 4e 54 4c 5f 50 45 52 53 49 53 54  TE_FCNTL_PERSIST
18aa0 5f 57 41 4c 3a 20 7b 0a 20 20 20 20 20 20 69 6e  _WAL: {.      in
18ab0 74 20 62 50 65 72 73 69 73 74 20 3d 20 2a 28 69  t bPersist = *(i
18ac0 6e 74 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20  nt*)pArg;.      
18ad0 69 66 28 20 62 50 65 72 73 69 73 74 3c 30 20 29  if( bPersist<0 )
18ae0 7b 0a 20 20 20 20 20 20 20 20 2a 28 69 6e 74 2a  {.        *(int*
18af0 29 70 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e 62  )pArg = pFile->b
18b00 50 65 72 73 69 73 74 57 61 6c 3b 0a 20 20 20 20  PersistWal;.    
18b10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
18b20 20 70 46 69 6c 65 2d 3e 62 50 65 72 73 69 73 74   pFile->bPersist
18b30 57 61 6c 20 3d 20 62 50 65 72 73 69 73 74 21 3d  Wal = bPersist!=
18b40 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
18b50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
18b60 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
18b70 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50  e SQLITE_FCNTL_P
18b80 45 52 53 49 53 54 5f 57 41 4c 3a 20 7b 0a 20 20  ERSIST_WAL: {.  
18b90 20 20 20 20 77 69 6e 4d 6f 64 65 42 69 74 28 70      winModeBit(p
18ba0 46 69 6c 65 2c 20 57 49 4e 46 49 4c 45 5f 50 45  File, WINFILE_PE
18bb0 52 53 49 53 54 5f 57 41 4c 2c 20 28 69 6e 74 2a  RSIST_WAL, (int*
18bc0 29 70 41 72 67 29 3b 0a 20 20 20 20 20 20 4f 53  )pArg);.      OS
18bd0 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69  TRACE(("FCNTL fi
18be0 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
18bf0 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  _OK\n", pFile->h
18c00 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
18c10 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
18c20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
18c30 45 5f 46 43 4e 54 4c 5f 50 4f 57 45 52 53 41 46  E_FCNTL_POWERSAF
18c40 45 5f 4f 56 45 52 57 52 49 54 45 3a 20 7b 0a 20  E_OVERWRITE: {. 
18c50 20 20 20 20 20 77 69 6e 4d 6f 64 65 42 69 74 28       winModeBit(
18c60 70 46 69 6c 65 2c 20 57 49 4e 46 49 4c 45 5f 50  pFile, WINFILE_P
18c70 53 4f 57 2c 20 28 69 6e 74 2a 29 70 41 72 67 29  SOW, (int*)pArg)
18c80 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  ;.      OSTRACE(
18c90 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c  ("FCNTL file=%p,
18ca0 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22   rc=SQLITE_OK\n"
18cb0 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
18cc0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
18cd0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
18ce0 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
18cf0 4c 5f 56 46 53 4e 41 4d 45 3a 20 7b 0a 20 20 20  L_VFSNAME: {.   
18d00 20 20 20 2a 28 63 68 61 72 2a 2a 29 70 41 72 67     *(char**)pArg
18d10 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
18d20 74 66 28 22 25 73 22 2c 20 70 46 69 6c 65 2d 3e  tf("%s", pFile->
18d30 70 56 66 73 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pVfs->zName);.  
18d40 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46 43      OSTRACE(("FC
18d50 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  NTL file=%p, rc=
18d60 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46  SQLITE_OK\n", pF
18d70 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20  ile->h));.      
18d80 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
18d90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
18da0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 57 49   SQLITE_FCNTL_WI
18db0 4e 33 32 5f 41 56 5f 52 45 54 52 59 3a 20 7b 0a  N32_AV_RETRY: {.
18dc0 20 20 20 20 20 20 69 6e 74 20 2a 61 20 3d 20 28        int *a = (
18dd0 69 6e 74 2a 29 70 41 72 67 3b 0a 20 20 20 20 20  int*)pArg;.     
18de0 20 69 66 28 20 61 5b 30 5d 3e 30 20 29 7b 0a 20   if( a[0]>0 ){. 
18df0 20 20 20 20 20 20 20 77 69 6e 49 6f 65 72 72 52         winIoerrR
18e00 65 74 72 79 20 3d 20 61 5b 30 5d 3b 0a 20 20 20  etry = a[0];.   
18e10 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
18e20 20 20 61 5b 30 5d 20 3d 20 77 69 6e 49 6f 65 72    a[0] = winIoer
18e30 72 52 65 74 72 79 3b 0a 20 20 20 20 20 20 7d 0a  rRetry;.      }.
18e40 20 20 20 20 20 20 69 66 28 20 61 5b 31 5d 3e 30        if( a[1]>0
18e50 20 29 7b 0a 20 20 20 20 20 20 20 20 77 69 6e 49   ){.        winI
18e60 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79 20 3d  oerrRetryDelay =
18e70 20 61 5b 31 5d 3b 0a 20 20 20 20 20 20 7d 65 6c   a[1];.      }el
18e80 73 65 7b 0a 20 20 20 20 20 20 20 20 61 5b 31 5d  se{.        a[1]
18e90 20 3d 20 77 69 6e 49 6f 65 72 72 52 65 74 72 79   = winIoerrRetry
18ea0 44 65 6c 61 79 3b 0a 20 20 20 20 20 20 7d 0a 20  Delay;.      }. 
18eb0 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46       OSTRACE(("F
18ec0 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63  CNTL file=%p, rc
18ed0 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70  =SQLITE_OK\n", p
18ee0 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20  File->h));.     
18ef0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
18f00 4b 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20  K;.    }.#ifdef 
18f10 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 20 20  SQLITE_TEST.    
18f20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
18f30 4c 5f 57 49 4e 33 32 5f 53 45 54 5f 48 41 4e 44  L_WIN32_SET_HAND
18f40 4c 45 3a 20 7b 0a 20 20 20 20 20 20 4c 50 48 41  LE: {.      LPHA
18f50 4e 44 4c 45 20 70 68 46 69 6c 65 20 3d 20 28 4c  NDLE phFile = (L
18f60 50 48 41 4e 44 4c 45 29 70 41 72 67 3b 0a 20 20  PHANDLE)pArg;.  
18f70 20 20 20 20 48 41 4e 44 4c 45 20 68 4f 6c 64 46      HANDLE hOldF
18f80 69 6c 65 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a  ile = pFile->h;.
18f90 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 20 3d        pFile->h =
18fa0 20 2a 70 68 46 69 6c 65 3b 0a 20 20 20 20 20 20   *phFile;.      
18fb0 2a 70 68 46 69 6c 65 20 3d 20 68 4f 6c 64 46 69  *phFile = hOldFi
18fc0 6c 65 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43  le;.      OSTRAC
18fd0 45 28 28 22 46 43 4e 54 4c 20 6f 6c 64 46 69 6c  E(("FCNTL oldFil
18fe0 65 3d 25 70 2c 20 6e 65 77 46 69 6c 65 3d 25 70  e=%p, newFile=%p
18ff0 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e  , rc=SQLITE_OK\n
19000 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
19010 20 20 68 4f 6c 64 46 69 6c 65 2c 20 70 46 69 6c    hOldFile, pFil
19020 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65  e->h));.      re
19030 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
19040 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
19050 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
19060 54 4c 5f 54 45 4d 50 46 49 4c 45 4e 41 4d 45 3a  TL_TEMPFILENAME:
19070 20 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a   {.      char *z
19080 54 46 69 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20  TFile = 0;.     
19090 20 69 6e 74 20 72 63 20 3d 20 77 69 6e 47 65 74   int rc = winGet
190a0 54 65 6d 70 6e 61 6d 65 28 70 46 69 6c 65 2d 3e  Tempname(pFile->
190b0 70 56 66 73 2c 20 26 7a 54 46 69 6c 65 29 3b 0a  pVfs, &zTFile);.
190c0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
190d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
190e0 20 20 20 2a 28 63 68 61 72 2a 2a 29 70 41 72 67     *(char**)pArg
190f0 20 3d 20 7a 54 46 69 6c 65 3b 0a 20 20 20 20 20   = zTFile;.     
19100 20 7d 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45   }.      OSTRACE
19110 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70  (("FCNTL file=%p
19120 2c 20 72 63 3d 25 73 5c 6e 22 2c 20 70 46 69 6c  , rc=%s\n", pFil
19130 65 2d 3e 68 2c 20 73 71 6c 69 74 65 33 45 72 72  e->h, sqlite3Err
19140 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 20 20  Name(rc)));.    
19150 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
19160 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41   }.#if SQLITE_MA
19170 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
19180 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
19190 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 3a 20 7b  NTL_MMAP_SIZE: {
191a0 0a 20 20 20 20 20 20 69 36 34 20 6e 65 77 4c 69  .      i64 newLi
191b0 6d 69 74 20 3d 20 2a 28 69 36 34 2a 29 70 41 72  mit = *(i64*)pAr
191c0 67 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20  g;.      int rc 
191d0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
191e0 20 20 20 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e     if( newLimit>
191f0 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
19200 66 69 67 2e 6d 78 4d 6d 61 70 20 29 7b 0a 20 20  fig.mxMmap ){.  
19210 20 20 20 20 20 20 6e 65 77 4c 69 6d 69 74 20 3d        newLimit =
19220 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
19230 6e 66 69 67 2e 6d 78 4d 6d 61 70 3b 0a 20 20 20  nfig.mxMmap;.   
19240 20 20 20 7d 0a 20 20 20 20 20 20 2a 28 69 36 34     }.      *(i64
19250 2a 29 70 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e  *)pArg = pFile->
19260 6d 6d 61 70 53 69 7a 65 4d 61 78 3b 0a 20 20 20  mmapSizeMax;.   
19270 20 20 20 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e     if( newLimit>
19280 3d 30 20 26 26 20 6e 65 77 4c 69 6d 69 74 21 3d  =0 && newLimit!=
19290 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d  pFile->mmapSizeM
192a0 61 78 20 26 26 20 70 46 69 6c 65 2d 3e 6e 46 65  ax && pFile->nFe
192b0 74 63 68 4f 75 74 3d 3d 30 20 29 7b 0a 20 20 20  tchOut==0 ){.   
192c0 20 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70       pFile->mmap
192d0 53 69 7a 65 4d 61 78 20 3d 20 6e 65 77 4c 69 6d  SizeMax = newLim
192e0 69 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  it;.        if( 
192f0 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 3e  pFile->mmapSize>
19300 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77  0 ){.          w
19310 69 6e 55 6e 6d 61 70 66 69 6c 65 28 70 46 69 6c  inUnmapfile(pFil
19320 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  e);.          rc
19330 20 3d 20 77 69 6e 4d 61 70 66 69 6c 65 28 70 46   = winMapfile(pF
19340 69 6c 65 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20  ile, -1);.      
19350 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
19360 20 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54    OSTRACE(("FCNT
19370 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73  L file=%p, rc=%s
19380 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 73  \n", pFile->h, s
19390 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63  qlite3ErrName(rc
193a0 29 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  )));.      retur
193b0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  n rc;.    }.#end
193c0 69 66 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45  if.  }.  OSTRACE
193d0 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70  (("FCNTL file=%p
193e0 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 54 46  , rc=SQLITE_NOTF
193f0 4f 55 4e 44 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  OUND\n", pFile->
19400 68 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  h));.  return SQ
19410 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 7d  LITE_NOTFOUND;.}
19420 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
19430 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69  he sector size i
19440 6e 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 75  n bytes of the u
19450 6e 64 65 72 6c 79 69 6e 67 20 62 6c 6f 63 6b 20  nderlying block 
19460 64 65 76 69 63 65 20 66 6f 72 0a 2a 2a 20 74 68  device for.** th
19470 65 20 73 70 65 63 69 66 69 65 64 20 66 69 6c 65  e specified file
19480 2e 20 54 68 69 73 20 69 73 20 61 6c 6d 6f 73 74  . This is almost
19490 20 61 6c 77 61 79 73 20 35 31 32 20 62 79 74 65   always 512 byte
194a0 73 2c 20 62 75 74 20 6d 61 79 20 62 65 0a 2a 2a  s, but may be.**
194b0 20 6c 61 72 67 65 72 20 66 6f 72 20 73 6f 6d 65   larger for some
194c0 20 64 65 76 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20   devices..**.** 
194d0 53 51 4c 69 74 65 20 63 6f 64 65 20 61 73 73 75  SQLite code assu
194e0 6d 65 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f  mes this functio
194f0 6e 20 63 61 6e 6e 6f 74 20 66 61 69 6c 2e 20 49  n cannot fail. I
19500 74 20 61 6c 73 6f 20 61 73 73 75 6d 65 73 20 74  t also assumes t
19510 68 61 74 0a 2a 2a 20 69 66 20 74 77 6f 20 66 69  hat.** if two fi
19520 6c 65 73 20 61 72 65 20 63 72 65 61 74 65 64 20  les are created 
19530 69 6e 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65  in the same file
19540 2d 73 79 73 74 65 6d 20 64 69 72 65 63 74 6f 72  -system director
19550 79 20 28 69 2e 65 2e 0a 2a 2a 20 61 20 64 61 74  y (i.e..** a dat
19560 61 62 61 73 65 20 61 6e 64 20 69 74 73 20 6a 6f  abase and its jo
19570 75 72 6e 61 6c 20 66 69 6c 65 29 20 74 68 61 74  urnal file) that
19580 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65   the sector size
19590 20 77 69 6c 6c 20 62 65 20 74 68 65 0a 2a 2a 20   will be the.** 
195a0 73 61 6d 65 20 66 6f 72 20 62 6f 74 68 2e 0a 2a  same for both..*
195b0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
195c0 53 65 63 74 6f 72 53 69 7a 65 28 73 71 6c 69 74  SectorSize(sqlit
195d0 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20  e3_file *id){.  
195e0 28 76 6f 69 64 29 69 64 3b 0a 20 20 72 65 74 75  (void)id;.  retu
195f0 72 6e 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  rn SQLITE_DEFAUL
19600 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 7d  T_SECTOR_SIZE;.}
19610 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
19620 20 76 65 63 74 6f 72 20 6f 66 20 64 65 76 69 63   vector of devic
19630 65 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63  e characteristic
19640 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
19650 20 77 69 6e 44 65 76 69 63 65 43 68 61 72 61 63   winDeviceCharac
19660 74 65 72 69 73 74 69 63 73 28 73 71 6c 69 74 65  teristics(sqlite
19670 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 77  3_file *id){.  w
19680 69 6e 46 69 6c 65 20 2a 70 20 3d 20 28 77 69 6e  inFile *p = (win
19690 46 69 6c 65 2a 29 69 64 3b 0a 20 20 72 65 74 75  File*)id;.  retu
196a0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  rn SQLITE_IOCAP_
196b0 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e  UNDELETABLE_WHEN
196c0 5f 4f 50 45 4e 20 7c 0a 20 20 20 20 20 20 20 20  _OPEN |.        
196d0 20 28 28 70 2d 3e 63 74 72 6c 46 6c 61 67 73 20   ((p->ctrlFlags 
196e0 26 20 57 49 4e 46 49 4c 45 5f 50 53 4f 57 29 3f  & WINFILE_PSOW)?
196f0 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57  SQLITE_IOCAP_POW
19700 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45  ERSAFE_OVERWRITE
19710 3a 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 69  :0);.}../*.** Wi
19720 6e 64 6f 77 73 20 77 69 6c 6c 20 6f 6e 6c 79 20  ndows will only 
19730 6c 65 74 20 79 6f 75 20 63 72 65 61 74 65 20 66  let you create f
19740 69 6c 65 20 76 69 65 77 20 6d 61 70 70 69 6e 67  ile view mapping
19750 73 0a 2a 2a 20 6f 6e 20 61 6c 6c 6f 63 61 74 69  s.** on allocati
19760 6f 6e 20 73 69 7a 65 20 67 72 61 6e 75 6c 61 72  on size granular
19770 69 74 79 20 62 6f 75 6e 64 61 72 69 65 73 2e 0a  ity boundaries..
19780 2a 2a 20 44 75 72 69 6e 67 20 73 71 6c 69 74 65  ** During sqlite
19790 33 5f 6f 73 5f 69 6e 69 74 28 29 20 77 65 20 64  3_os_init() we d
197a0 6f 20 61 20 47 65 74 53 79 73 74 65 6d 49 6e 66  o a GetSystemInf
197b0 6f 28 29 0a 2a 2a 20 74 6f 20 67 65 74 20 74 68  o().** to get th
197c0 65 20 67 72 61 6e 75 6c 61 72 69 74 79 20 73 69  e granularity si
197d0 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 59  ze..*/.static SY
197e0 53 54 45 4d 5f 49 4e 46 4f 20 77 69 6e 53 79 73  STEM_INFO winSys
197f0 49 6e 66 6f 3b 0a 0a 23 69 66 6e 64 65 66 20 53  Info;..#ifndef S
19800 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 0a  QLITE_OMIT_WAL..
19810 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e  /*.** Helper fun
19820 63 74 69 6f 6e 73 20 74 6f 20 6f 62 74 61 69 6e  ctions to obtain
19830 20 61 6e 64 20 72 65 6c 69 6e 71 75 69 73 68 20   and relinquish 
19840 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78  the global mutex
19850 2e 20 54 68 65 0a 2a 2a 20 67 6c 6f 62 61 6c 20  . The.** global 
19860 6d 75 74 65 78 20 69 73 20 75 73 65 64 20 74 6f  mutex is used to
19870 20 70 72 6f 74 65 63 74 20 74 68 65 20 77 69 6e   protect the win
19880 4c 6f 63 6b 49 6e 66 6f 20 6f 62 6a 65 63 74 73  LockInfo objects
19890 20 75 73 65 64 20 62 79 0a 2a 2a 20 74 68 69 73   used by.** this
198a0 20 66 69 6c 65 2c 20 61 6c 6c 20 6f 66 20 77 68   file, all of wh
198b0 69 63 68 20 6d 61 79 20 62 65 20 73 68 61 72 65  ich may be share
198c0 64 20 62 79 20 6d 75 6c 74 69 70 6c 65 20 74 68  d by multiple th
198d0 72 65 61 64 73 2e 0a 2a 2a 0a 2a 2a 20 46 75 6e  reads..**.** Fun
198e0 63 74 69 6f 6e 20 77 69 6e 53 68 6d 4d 75 74 65  ction winShmMute
198f0 78 48 65 6c 64 28 29 20 69 73 20 75 73 65 64 20  xHeld() is used 
19900 74 6f 20 61 73 73 65 72 74 28 29 20 74 68 61 74  to assert() that
19910 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65   the global mute
19920 78 0a 2a 2a 20 69 73 20 68 65 6c 64 20 77 68 65  x.** is held whe
19930 6e 20 72 65 71 75 69 72 65 64 2e 20 54 68 69 73  n required. This
19940 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c   function is onl
19950 79 20 75 73 65 64 20 61 73 20 70 61 72 74 20 6f  y used as part o
19960 66 20 61 73 73 65 72 74 28 29 0a 2a 2a 20 73 74  f assert().** st
19970 61 74 65 6d 65 6e 74 73 2e 20 65 2e 67 2e 0a 2a  atements. e.g..*
19980 2a 0a 2a 2a 20 20 20 77 69 6e 53 68 6d 45 6e 74  *.**   winShmEnt
19990 65 72 4d 75 74 65 78 28 29 0a 2a 2a 20 20 20 20  erMutex().**    
199a0 20 61 73 73 65 72 74 28 20 77 69 6e 53 68 6d 4d   assert( winShmM
199b0 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 2a 2a  utexHeld() );.**
199c0 20 20 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75     winShmLeaveMu
199d0 74 65 78 28 29 0a 2a 2f 0a 73 74 61 74 69 63 20  tex().*/.static 
199e0 76 6f 69 64 20 77 69 6e 53 68 6d 45 6e 74 65 72  void winShmEnter
199f0 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a 20 20 73  Mutex(void){.  s
19a00 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
19a10 65 72 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41  er(sqlite3MutexA
19a20 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
19a30 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29  X_STATIC_MASTER)
19a40 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  );.}.static void
19a50 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65   winShmLeaveMute
19a60 78 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74  x(void){.  sqlit
19a70 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73  e3_mutex_leave(s
19a80 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
19a90 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
19aa0 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d  ATIC_MASTER));.}
19ab0 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
19ac0 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 68  static int winSh
19ad0 6d 4d 75 74 65 78 48 65 6c 64 28 76 6f 69 64 29  mMutexHeld(void)
19ae0 20 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69   {.  return sqli
19af0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 73  te3_mutex_held(s
19b00 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
19b10 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
19b20 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d  ATIC_MASTER));.}
19b30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f  .#endif../*.** O
19b40 62 6a 65 63 74 20 75 73 65 64 20 74 6f 20 72 65  bject used to re
19b50 70 72 65 73 65 6e 74 20 61 20 73 69 6e 67 6c 65  present a single
19b60 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 6e 64   file opened and
19b70 20 6d 6d 61 70 70 65 64 20 74 6f 20 70 72 6f 76   mmapped to prov
19b80 69 64 65 0a 2a 2a 20 73 68 61 72 65 64 20 6d 65  ide.** shared me
19b90 6d 6f 72 79 2e 20 20 57 68 65 6e 20 6d 75 6c 74  mory.  When mult
19ba0 69 70 6c 65 20 74 68 72 65 61 64 73 20 61 6c 6c  iple threads all
19bb0 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 73   reference the s
19bc0 61 6d 65 0a 2a 2a 20 6c 6f 67 2d 73 75 6d 6d 61  ame.** log-summa
19bd0 72 79 2c 20 65 61 63 68 20 74 68 72 65 61 64 20  ry, each thread 
19be0 68 61 73 20 69 74 73 20 6f 77 6e 20 77 69 6e 46  has its own winF
19bf0 69 6c 65 20 6f 62 6a 65 63 74 2c 20 62 75 74 20  ile object, but 
19c00 74 68 65 79 20 61 6c 6c 0a 2a 2a 20 70 6f 69 6e  they all.** poin
19c10 74 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 69 6e  t to a single in
19c20 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f  stance of this o
19c30 62 6a 65 63 74 2e 20 20 49 6e 20 6f 74 68 65 72  bject.  In other
19c40 20 77 6f 72 64 73 2c 20 65 61 63 68 0a 2a 2a 20   words, each.** 
19c50 6c 6f 67 2d 73 75 6d 6d 61 72 79 20 69 73 20 6f  log-summary is o
19c60 70 65 6e 65 64 20 6f 6e 6c 79 20 6f 6e 63 65 20  pened only once 
19c70 70 65 72 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a  per process..**.
19c80 2a 2a 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65  ** winShmMutexHe
19c90 6c 64 28 29 20 6d 75 73 74 20 62 65 20 74 72 75  ld() must be tru
19ca0 65 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20  e when creating 
19cb0 6f 72 20 64 65 73 74 72 6f 79 69 6e 67 0a 2a 2a  or destroying.**
19cc0 20 74 68 69 73 20 6f 62 6a 65 63 74 20 6f 72 20   this object or 
19cd0 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 6f 72  while reading or
19ce0 20 77 72 69 74 69 6e 67 20 74 68 65 20 66 6f 6c   writing the fol
19cf0 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 3a 0a 2a  lowing fields:.*
19d00 2a 0a 2a 2a 20 20 20 20 20 20 6e 52 65 66 0a 2a  *.**      nRef.*
19d10 2a 20 20 20 20 20 20 70 4e 65 78 74 0a 2a 2a 0a  *      pNext.**.
19d20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
19d30 20 66 69 65 6c 64 73 20 61 72 65 20 72 65 61 64   fields are read
19d40 2d 6f 6e 6c 79 20 61 66 74 65 72 20 74 68 65 20  -only after the 
19d50 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61 74 65  object is create
19d60 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 66 69  d:.**.**      fi
19d70 64 0a 2a 2a 20 20 20 20 20 20 7a 46 69 6c 65 6e  d.**      zFilen
19d80 61 6d 65 0a 2a 2a 0a 2a 2a 20 45 69 74 68 65 72  ame.**.** Either
19d90 20 77 69 6e 53 68 6d 4e 6f 64 65 2e 6d 75 74 65   winShmNode.mute
19da0 78 20 6d 75 73 74 20 62 65 20 68 65 6c 64 20 6f  x must be held o
19db0 72 20 77 69 6e 53 68 6d 4e 6f 64 65 2e 6e 52 65  r winShmNode.nRe
19dc0 66 3d 3d 30 20 61 6e 64 0a 2a 2a 20 77 69 6e 53  f==0 and.** winS
19dd0 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 69 73  hmMutexHeld() is
19de0 20 74 72 75 65 20 77 68 65 6e 20 72 65 61 64 69   true when readi
19df0 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 61 6e  ng or writing an
19e00 79 20 6f 74 68 65 72 20 66 69 65 6c 64 0a 2a 2a  y other field.**
19e10 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75   in this structu
19e20 72 65 2e 0a 2a 2a 0a 2a 2f 0a 73 74 72 75 63 74  re..**.*/.struct
19e30 20 77 69 6e 53 68 6d 4e 6f 64 65 20 7b 0a 20 20   winShmNode {.  
19e40 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d  sqlite3_mutex *m
19e50 75 74 65 78 3b 20 20 20 20 20 20 2f 2a 20 4d 75  utex;      /* Mu
19e60 74 65 78 20 74 6f 20 61 63 63 65 73 73 20 74 68  tex to access th
19e70 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63  is object */.  c
19e80 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20  har *zFilename; 
19e90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
19ea0 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 2a 2f  e of the file */
19eb0 0a 20 20 77 69 6e 46 69 6c 65 20 68 46 69 6c 65  .  winFile hFile
19ec0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
19ed0 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 66 72 6f   File handle fro
19ee0 6d 20 77 69 6e 4f 70 65 6e 20 2a 2f 0a 0a 20 20  m winOpen */..  
19ef0 69 6e 74 20 73 7a 52 65 67 69 6f 6e 3b 20 20 20  int szRegion;   
19f00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
19f10 7a 65 20 6f 66 20 73 68 61 72 65 64 2d 6d 65 6d  ze of shared-mem
19f20 6f 72 79 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20  ory regions */. 
19f30 20 69 6e 74 20 6e 52 65 67 69 6f 6e 3b 20 20 20   int nRegion;   
19f40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
19f50 69 7a 65 20 6f 66 20 61 72 72 61 79 20 61 70 52  ize of array apR
19f60 65 67 69 6f 6e 20 2a 2f 0a 20 20 73 74 72 75 63  egion */.  struc
19f70 74 20 53 68 6d 52 65 67 69 6f 6e 20 7b 0a 20 20  t ShmRegion {.  
19f80 20 20 48 41 4e 44 4c 45 20 68 4d 61 70 3b 20 20    HANDLE hMap;  
19f90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
19fa0 6c 65 20 68 61 6e 64 6c 65 20 66 72 6f 6d 20 43  le handle from C
19fb0 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67  reateFileMapping
19fc0 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 4d   */.    void *pM
19fd0 61 70 3b 0a 20 20 7d 20 2a 61 52 65 67 69 6f 6e  ap;.  } *aRegion
19fe0 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72  ;.  DWORD lastEr
19ff0 72 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f  rno;           /
1a000 2a 20 54 68 65 20 57 69 6e 64 6f 77 73 20 65 72  * The Windows er
1a010 72 6e 6f 20 66 72 6f 6d 20 74 68 65 20 6c 61 73  rno from the las
1a020 74 20 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a 0a  t I/O error */..
1a030 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20    int nRef;     
1a040 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a050 4e 75 6d 62 65 72 20 6f 66 20 77 69 6e 53 68 6d  Number of winShm
1a060 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e   objects pointin
1a070 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a 20 20 77  g to this */.  w
1a080 69 6e 53 68 6d 20 2a 70 46 69 72 73 74 3b 20 20  inShm *pFirst;  
1a090 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
1a0a0 20 77 69 6e 53 68 6d 20 6f 62 6a 65 63 74 73 20   winShm objects 
1a0b0 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 69 73  pointing to this
1a0c0 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65   */.  winShmNode
1a0d0 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20   *pNext;        
1a0e0 20 2f 2a 20 4e 65 78 74 20 69 6e 20 6c 69 73 74   /* Next in list
1a0f0 20 6f 66 20 61 6c 6c 20 77 69 6e 53 68 6d 4e 6f   of all winShmNo
1a100 64 65 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 23 69  de objects */.#i
1a110 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
1a120 47 0a 20 20 75 38 20 6e 65 78 74 53 68 6d 49 64  G.  u8 nextShmId
1a130 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1a140 2a 20 4e 65 78 74 20 61 76 61 69 6c 61 62 6c 65  * Next available
1a150 20 77 69 6e 53 68 6d 2e 69 64 20 76 61 6c 75 65   winShm.id value
1a160 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f   */.#endif.};../
1a170 2a 0a 2a 2a 20 41 20 67 6c 6f 62 61 6c 20 61 72  *.** A global ar
1a180 72 61 79 20 6f 66 20 61 6c 6c 20 77 69 6e 53 68  ray of all winSh
1a190 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 73 2e 0a 2a  mNode objects..*
1a1a0 2a 0a 2a 2a 20 54 68 65 20 77 69 6e 53 68 6d 4d  *.** The winShmM
1a1b0 75 74 65 78 48 65 6c 64 28 29 20 6d 75 73 74 20  utexHeld() must 
1a1c0 62 65 20 74 72 75 65 20 77 68 69 6c 65 20 72 65  be true while re
1a1d0 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ading or writing
1a1e0 20 74 68 69 73 20 6c 69 73 74 2e 0a 2a 2f 0a 73   this list..*/.s
1a1f0 74 61 74 69 63 20 77 69 6e 53 68 6d 4e 6f 64 65  tatic winShmNode
1a200 20 2a 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74   *winShmNodeList
1a210 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 53 74 72   = 0;../*.** Str
1a220 75 63 74 75 72 65 20 75 73 65 64 20 69 6e 74 65  ucture used inte
1a230 72 6e 61 6c 6c 79 20 62 79 20 74 68 69 73 20 56  rnally by this V
1a240 46 53 20 74 6f 20 72 65 63 6f 72 64 20 74 68 65  FS to record the
1a250 20 73 74 61 74 65 20 6f 66 20 61 6e 0a 2a 2a 20   state of an.** 
1a260 6f 70 65 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f  open shared memo
1a270 72 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a  ry connection..*
1a280 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
1a290 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20 69 6e  ng fields are in
1a2a0 69 74 69 61 6c 69 7a 65 64 20 77 68 65 6e 20 74  itialized when t
1a2b0 68 69 73 20 6f 62 6a 65 63 74 20 69 73 20 63 72  his object is cr
1a2c0 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20 61 72 65  eated and.** are
1a2d0 20 72 65 61 64 2d 6f 6e 6c 79 20 74 68 65 72 65   read-only there
1a2e0 61 66 74 65 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  after:.**.**    
1a2f0 77 69 6e 53 68 6d 2e 70 53 68 6d 4e 6f 64 65 0a  winShm.pShmNode.
1a300 2a 2a 20 20 20 20 77 69 6e 53 68 6d 2e 69 64 0a  **    winShm.id.
1a310 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 74 68 65 72 20  **.** All other 
1a320 66 69 65 6c 64 73 20 61 72 65 20 72 65 61 64 2f  fields are read/
1a330 77 72 69 74 65 2e 20 20 54 68 65 20 77 69 6e 53  write.  The winS
1a340 68 6d 2e 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  hm.pShmNode->mut
1a350 65 78 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a  ex must be held.
1a360 2a 2a 20 77 68 69 6c 65 20 61 63 63 65 73 73 69  ** while accessi
1a370 6e 67 20 61 6e 79 20 72 65 61 64 2f 77 72 69 74  ng any read/writ
1a380 65 20 66 69 65 6c 64 73 2e 0a 2a 2f 0a 73 74 72  e fields..*/.str
1a390 75 63 74 20 77 69 6e 53 68 6d 20 7b 0a 20 20 77  uct winShm {.  w
1a3a0 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e  inShmNode *pShmN
1a3b0 6f 64 65 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  ode;      /* The
1a3c0 20 75 6e 64 65 72 6c 79 69 6e 67 20 77 69 6e 53   underlying winS
1a3d0 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 2a 2f  hmNode object */
1a3e0 0a 20 20 77 69 6e 53 68 6d 20 2a 70 4e 65 78 74  .  winShm *pNext
1a3f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1a400 20 4e 65 78 74 20 77 69 6e 53 68 6d 20 77 69 74   Next winShm wit
1a410 68 20 74 68 65 20 73 61 6d 65 20 77 69 6e 53 68  h the same winSh
1a420 6d 4e 6f 64 65 20 2a 2f 0a 20 20 75 38 20 68 61  mNode */.  u8 ha
1a430 73 4d 75 74 65 78 3b 20 20 20 20 20 20 20 20 20  sMutex;         
1a440 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
1a450 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 77 69 6e   holding the win
1a460 53 68 6d 4e 6f 64 65 20 6d 75 74 65 78 20 2a 2f  ShmNode mutex */
1a470 0a 20 20 75 31 36 20 73 68 61 72 65 64 4d 61 73  .  u16 sharedMas
1a480 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  k;            /*
1a490 20 4d 61 73 6b 20 6f 66 20 73 68 61 72 65 64 20   Mask of shared 
1a4a0 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20  locks held */.  
1a4b0 75 31 36 20 65 78 63 6c 4d 61 73 6b 3b 20 20 20  u16 exclMask;   
1a4c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
1a4d0 73 6b 20 6f 66 20 65 78 63 6c 75 73 69 76 65 20  sk of exclusive 
1a4e0 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 23 69  locks held */.#i
1a4f0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
1a500 47 0a 20 20 75 38 20 69 64 3b 20 20 20 20 20 20  G.  u8 id;      
1a510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a520 2a 20 49 64 20 6f 66 20 74 68 69 73 20 63 6f 6e  * Id of this con
1a530 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 69 74 73  nection with its
1a540 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 23   winShmNode */.#
1a550 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  endif.};../*.** 
1a560 43 6f 6e 73 74 61 6e 74 73 20 75 73 65 64 20 66  Constants used f
1a570 6f 72 20 6c 6f 63 6b 69 6e 67 0a 2a 2f 0a 23 64  or locking.*/.#d
1a580 65 66 69 6e 65 20 57 49 4e 5f 53 48 4d 5f 42 41  efine WIN_SHM_BA
1a590 53 45 20 20 20 28 28 32 32 2b 53 51 4c 49 54 45  SE   ((22+SQLITE
1a5a0 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 2a 34 29 20 20  _SHM_NLOCK)*4)  
1a5b0 20 20 20 20 20 20 2f 2a 20 66 69 72 73 74 20 6c        /* first l
1a5c0 6f 63 6b 20 62 79 74 65 20 2a 2f 0a 23 64 65 66  ock byte */.#def
1a5d0 69 6e 65 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 20  ine WIN_SHM_DMS 
1a5e0 20 20 20 28 57 49 4e 5f 53 48 4d 5f 42 41 53 45     (WIN_SHM_BASE
1a5f0 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43  +SQLITE_SHM_NLOC
1a600 4b 29 20 20 2f 2a 20 64 65 61 64 6d 61 6e 20 73  K)  /* deadman s
1a610 77 69 74 63 68 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  witch */../*.** 
1a620 41 70 70 6c 79 20 61 64 76 69 73 6f 72 79 20 6c  Apply advisory l
1a630 6f 63 6b 73 20 66 6f 72 20 61 6c 6c 20 6e 20 62  ocks for all n b
1a640 79 74 65 73 20 62 65 67 69 6e 6e 69 6e 67 20 61  ytes beginning a
1a650 74 20 6f 66 73 74 2e 0a 2a 2f 0a 23 64 65 66 69  t ofst..*/.#defi
1a660 6e 65 20 5f 53 48 4d 5f 55 4e 4c 43 4b 20 20 31  ne _SHM_UNLCK  1
1a670 0a 23 64 65 66 69 6e 65 20 5f 53 48 4d 5f 52 44  .#define _SHM_RD
1a680 4c 43 4b 20 20 32 0a 23 64 65 66 69 6e 65 20 5f  LCK  2.#define _
1a690 53 48 4d 5f 57 52 4c 43 4b 20 20 33 0a 73 74 61  SHM_WRLCK  3.sta
1a6a0 74 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 53 79  tic int winShmSy
1a6b0 73 74 65 6d 4c 6f 63 6b 28 0a 20 20 77 69 6e 53  stemLock(.  winS
1a6c0 68 6d 4e 6f 64 65 20 2a 70 46 69 6c 65 2c 20 20  hmNode *pFile,  
1a6d0 20 20 2f 2a 20 41 70 70 6c 79 20 6c 6f 63 6b 73    /* Apply locks
1a6e0 20 74 6f 20 74 68 69 73 20 6f 70 65 6e 20 73 68   to this open sh
1a6f0 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d  ared-memory segm
1a700 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 6f 63  ent */.  int loc
1a710 6b 54 79 70 65 2c 20 20 20 20 20 20 20 20 20 2f  kType,         /
1a720 2a 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20 5f 53  * _SHM_UNLCK, _S
1a730 48 4d 5f 52 44 4c 43 4b 2c 20 6f 72 20 5f 53 48  HM_RDLCK, or _SH
1a740 4d 5f 57 52 4c 43 4b 20 2a 2f 0a 20 20 69 6e 74  M_WRLCK */.  int
1a750 20 6f 66 73 74 2c 20 20 20 20 20 20 20 20 20 20   ofst,          
1a760 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
1a770 66 69 72 73 74 20 62 79 74 65 20 74 6f 20 62 65  first byte to be
1a780 20 6c 6f 63 6b 65 64 2f 75 6e 6c 6f 63 6b 65 64   locked/unlocked
1a790 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 20   */.  int nByte 
1a7a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1a7b0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
1a7c0 6f 20 6c 6f 63 6b 20 6f 72 20 75 6e 6c 6f 63 6b  o lock or unlock
1a7d0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
1a7e0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
1a7f0 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66 6f  * Result code fo
1a800 72 6d 20 4c 6f 63 6b 2f 55 6e 6c 6f 63 6b 46 69  rm Lock/UnlockFi
1a810 6c 65 45 78 28 29 20 2a 2f 0a 0a 20 20 2f 2a 20  leEx() */..  /* 
1a820 41 63 63 65 73 73 20 74 6f 20 74 68 65 20 77 69  Access to the wi
1a830 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20  nShmNode object 
1a840 69 73 20 73 65 72 69 61 6c 69 7a 65 64 20 62 79  is serialized by
1a850 20 74 68 65 20 63 61 6c 6c 65 72 20 2a 2f 0a 20   the caller */. 
1a860 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1a870 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 46 69 6c  _mutex_held(pFil
1a880 65 2d 3e 6d 75 74 65 78 29 20 7c 7c 20 70 46 69  e->mutex) || pFi
1a890 6c 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a  le->nRef==0 );..
1a8a0 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d    OSTRACE(("SHM-
1a8b0 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6c 6f  LOCK file=%p, lo
1a8c0 63 6b 3d 25 64 2c 20 6f 66 66 73 65 74 3d 25 64  ck=%d, offset=%d
1a8d0 2c 20 73 69 7a 65 3d 25 64 5c 6e 22 2c 0a 20 20  , size=%d\n",.  
1a8e0 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
1a8f0 68 46 69 6c 65 2e 68 2c 20 6c 6f 63 6b 54 79 70  hFile.h, lockTyp
1a900 65 2c 20 6f 66 73 74 2c 20 6e 42 79 74 65 29 29  e, ofst, nByte))
1a910 3b 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73 65 2f  ;..  /* Release/
1a920 41 63 71 75 69 72 65 20 74 68 65 20 73 79 73 74  Acquire the syst
1a930 65 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b 20 2a 2f  em-level lock */
1a940 0a 20 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d  .  if( lockType=
1a950 3d 5f 53 48 4d 5f 55 4e 4c 43 4b 20 29 7b 0a 20  =_SHM_UNLCK ){. 
1a960 20 20 20 72 63 20 3d 20 77 69 6e 55 6e 6c 6f 63     rc = winUnloc
1a970 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 46  kFile(&pFile->hF
1a980 69 6c 65 2e 68 2c 20 6f 66 73 74 2c 20 30 2c 20  ile.h, ofst, 0, 
1a990 6e 42 79 74 65 2c 20 30 29 3b 0a 20 20 7d 65 6c  nByte, 0);.  }el
1a9a0 73 65 7b 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69  se{.    /* Initi
1a9b0 61 6c 69 7a 65 20 74 68 65 20 6c 6f 63 6b 69 6e  alize the lockin
1a9c0 67 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a  g parameters */.
1a9d0 20 20 20 20 44 57 4f 52 44 20 64 77 46 6c 61 67      DWORD dwFlag
1a9e0 73 20 3d 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49  s = LOCKFILE_FAI
1a9f0 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 3b 0a 20  L_IMMEDIATELY;. 
1aa00 20 20 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 20     if( lockType 
1aa10 3d 3d 20 5f 53 48 4d 5f 57 52 4c 43 4b 20 29 20  == _SHM_WRLCK ) 
1aa20 64 77 46 6c 61 67 73 20 7c 3d 20 4c 4f 43 4b 46  dwFlags |= LOCKF
1aa30 49 4c 45 5f 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ILE_EXCLUSIVE_LO
1aa40 43 4b 3b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e  CK;.    rc = win
1aa50 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d  LockFile(&pFile-
1aa60 3e 68 46 69 6c 65 2e 68 2c 20 64 77 46 6c 61 67  >hFile.h, dwFlag
1aa70 73 2c 20 6f 66 73 74 2c 20 30 2c 20 6e 42 79 74  s, ofst, 0, nByt
1aa80 65 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  e, 0);.  }..  if
1aa90 28 20 72 63 21 3d 20 30 20 29 7b 0a 20 20 20 20  ( rc!= 0 ){.    
1aaa0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1aab0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46 69    }else{.    pFi
1aac0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
1aad0 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
1aae0 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  );.    rc = SQLI
1aaf0 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a 20 20  TE_BUSY;.  }..  
1ab00 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f  OSTRACE(("SHM-LO
1ab10 43 4b 20 66 69 6c 65 3d 25 70 2c 20 66 75 6e 63  CK file=%p, func
1ab20 3d 25 73 2c 20 65 72 72 6e 6f 3d 25 6c 75 2c 20  =%s, errno=%lu, 
1ab30 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  rc=%s\n",.      
1ab40 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 46 69 6c       pFile->hFil
1ab50 65 2e 68 2c 20 28 6c 6f 63 6b 54 79 70 65 20 3d  e.h, (lockType =
1ab60 3d 20 5f 53 48 4d 5f 55 4e 4c 43 4b 29 20 3f 20  = _SHM_UNLCK) ? 
1ab70 22 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 22 20  "winUnlockFile" 
1ab80 3a 0a 20 20 20 20 20 20 20 20 20 20 20 22 77 69  :.           "wi
1ab90 6e 4c 6f 63 6b 46 69 6c 65 22 2c 20 70 46 69 6c  nLockFile", pFil
1aba0 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 20 73 71  e->lastErrno, sq
1abb0 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29  lite3ErrName(rc)
1abc0 29 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63  ));..  return rc
1abd0 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20  ;.}../* Forward 
1abe0 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 56 46  references to VF
1abf0 53 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 73 74 61  S methods */.sta
1ac00 74 69 63 20 69 6e 74 20 77 69 6e 4f 70 65 6e 28  tic int winOpen(
1ac10 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c 63 6f 6e  sqlite3_vfs*,con
1ac20 73 74 20 63 68 61 72 2a 2c 73 71 6c 69 74 65 33  st char*,sqlite3
1ac30 5f 66 69 6c 65 2a 2c 69 6e 74 2c 69 6e 74 2a 29  _file*,int,int*)
1ac40 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  ;.static int win
1ac50 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 5f 76  Delete(sqlite3_v
1ac60 66 73 20 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a  fs *,const char*
1ac70 2c 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50 75  ,int);../*.** Pu
1ac80 72 67 65 20 74 68 65 20 77 69 6e 53 68 6d 4e 6f  rge the winShmNo
1ac90 64 65 4c 69 73 74 20 6c 69 73 74 20 6f 66 20 61  deList list of a
1aca0 6c 6c 20 65 6e 74 72 69 65 73 20 77 69 74 68 20  ll entries with 
1acb0 77 69 6e 53 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d  winShmNode.nRef=
1acc0 3d 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  =0..**.** This i
1acd0 73 20 6e 6f 74 20 61 20 56 46 53 20 73 68 61 72  s not a VFS shar
1ace0 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 74 68 6f 64  ed-memory method
1acf0 3b 20 69 74 20 69 73 20 61 20 75 74 69 6c 69 74  ; it is a utilit
1ad00 79 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65  y function calle
1ad10 64 0a 2a 2a 20 62 79 20 56 46 53 20 73 68 61 72  d.** by VFS shar
1ad20 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 74 68 6f 64  ed-memory method
1ad30 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
1ad40 64 20 77 69 6e 53 68 6d 50 75 72 67 65 28 73 71  d winShmPurge(sq
1ad50 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
1ad60 20 69 6e 74 20 64 65 6c 65 74 65 46 6c 61 67 29   int deleteFlag)
1ad70 7b 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a  {.  winShmNode *
1ad80 2a 70 70 3b 0a 20 20 77 69 6e 53 68 6d 4e 6f 64  *pp;.  winShmNod
1ad90 65 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20  e *p;.  assert( 
1ada0 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28  winShmMutexHeld(
1adb0 29 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  ) );.  OSTRACE((
1adc0 22 53 48 4d 2d 50 55 52 47 45 20 70 69 64 3d 25  "SHM-PURGE pid=%
1add0 6c 75 2c 20 64 65 6c 65 74 65 46 6c 61 67 3d 25  lu, deleteFlag=%
1ade0 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
1adf0 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
1ae00 63 65 73 73 49 64 28 29 2c 20 64 65 6c 65 74 65  cessId(), delete
1ae10 46 6c 61 67 29 29 3b 0a 20 20 70 70 20 3d 20 26  Flag));.  pp = &
1ae20 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 3b 0a  winShmNodeList;.
1ae30 20 20 77 68 69 6c 65 28 20 28 70 20 3d 20 2a 70    while( (p = *p
1ae40 70 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  p)!=0 ){.    if(
1ae50 20 70 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20   p->nRef==0 ){. 
1ae60 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
1ae70 20 20 69 66 28 20 70 2d 3e 6d 75 74 65 78 20 29    if( p->mutex )
1ae80 7b 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  { sqlite3_mutex_
1ae90 66 72 65 65 28 70 2d 3e 6d 75 74 65 78 29 3b 20  free(p->mutex); 
1aea0 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  }.      for(i=0;
1aeb0 20 69 3c 70 2d 3e 6e 52 65 67 69 6f 6e 3b 20 69   i<p->nRegion; i
1aec0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 42 4f 4f  ++){.        BOO
1aed0 4c 20 62 52 63 20 3d 20 6f 73 55 6e 6d 61 70 56  L bRc = osUnmapV
1aee0 69 65 77 4f 66 46 69 6c 65 28 70 2d 3e 61 52 65  iewOfFile(p->aRe
1aef0 67 69 6f 6e 5b 69 5d 2e 70 4d 61 70 29 3b 0a 20  gion[i].pMap);. 
1af00 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28         OSTRACE((
1af10 22 53 48 4d 2d 50 55 52 47 45 2d 55 4e 4d 41 50  "SHM-PURGE-UNMAP
1af20 20 70 69 64 3d 25 6c 75 2c 20 72 65 67 69 6f 6e   pid=%lu, region
1af30 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20  =%d, rc=%s\n",. 
1af40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1af50 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
1af60 65 73 73 49 64 28 29 2c 20 69 2c 20 62 52 63 20  essId(), i, bRc 
1af70 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64  ? "ok" : "failed
1af80 22 29 29 3b 0a 20 20 20 20 20 20 20 20 55 4e 55  "));.        UNU
1af90 53 45 44 5f 56 41 52 49 41 42 4c 45 5f 56 41 4c  SED_VARIABLE_VAL
1afa0 55 45 28 62 52 63 29 3b 0a 20 20 20 20 20 20 20  UE(bRc);.       
1afb0 20 62 52 63 20 3d 20 6f 73 43 6c 6f 73 65 48 61   bRc = osCloseHa
1afc0 6e 64 6c 65 28 70 2d 3e 61 52 65 67 69 6f 6e 5b  ndle(p->aRegion[
1afd0 69 5d 2e 68 4d 61 70 29 3b 0a 20 20 20 20 20 20  i].hMap);.      
1afe0 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d    OSTRACE(("SHM-
1aff0 50 55 52 47 45 2d 43 4c 4f 53 45 20 70 69 64 3d  PURGE-CLOSE pid=
1b000 25 6c 75 2c 20 72 65 67 69 6f 6e 3d 25 64 2c 20  %lu, region=%d, 
1b010 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  rc=%s\n",.      
1b020 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74             osGet
1b030 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
1b040 28 29 2c 20 69 2c 20 62 52 63 20 3f 20 22 6f 6b  (), i, bRc ? "ok
1b050 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a  " : "failed"));.
1b060 20 20 20 20 20 20 20 20 55 4e 55 53 45 44 5f 56          UNUSED_V
1b070 41 52 49 41 42 4c 45 5f 56 41 4c 55 45 28 62 52  ARIABLE_VALUE(bR
1b080 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  c);.      }.    
1b090 20 20 69 66 28 20 70 2d 3e 68 46 69 6c 65 2e 68    if( p->hFile.h
1b0a0 21 3d 4e 55 4c 4c 20 26 26 20 70 2d 3e 68 46 69  !=NULL && p->hFi
1b0b0 6c 65 2e 68 21 3d 49 4e 56 41 4c 49 44 5f 48 41  le.h!=INVALID_HA
1b0c0 4e 44 4c 45 5f 56 41 4c 55 45 20 29 7b 0a 20 20  NDLE_VALUE ){.  
1b0d0 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
1b0e0 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a  ErrorBenign(1);.
1b0f0 20 20 20 20 20 20 20 20 77 69 6e 43 6c 6f 73 65          winClose
1b100 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  ((sqlite3_file *
1b110 29 26 70 2d 3e 68 46 69 6c 65 29 3b 0a 20 20 20  )&p->hFile);.   
1b120 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45       SimulateIOE
1b130 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20  rrorBenign(0);. 
1b140 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1b150 20 64 65 6c 65 74 65 46 6c 61 67 20 29 7b 0a 20   deleteFlag ){. 
1b160 20 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49         SimulateI
1b170 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b  OErrorBenign(1);
1b180 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1b190 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
1b1a0 63 28 29 3b 0a 20 20 20 20 20 20 20 20 77 69 6e  c();.        win
1b1b0 44 65 6c 65 74 65 28 70 56 66 73 2c 20 70 2d 3e  Delete(pVfs, p->
1b1c0 7a 46 69 6c 65 6e 61 6d 65 2c 20 30 29 3b 0a 20  zFilename, 0);. 
1b1d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e         sqlite3En
1b1e0 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
1b1f0 0a 20 20 20 20 20 20 20 20 53 69 6d 75 6c 61 74  .        Simulat
1b200 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30  eIOErrorBenign(0
1b210 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1b220 20 2a 70 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b   *pp = p->pNext;
1b230 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
1b240 72 65 65 28 70 2d 3e 61 52 65 67 69 6f 6e 29 3b  ree(p->aRegion);
1b250 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
1b260 72 65 65 28 70 29 3b 0a 20 20 20 20 7d 65 6c 73  ree(p);.    }els
1b270 65 7b 0a 20 20 20 20 20 20 70 70 20 3d 20 26 70  e{.      pp = &p
1b280 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  ->pNext;.    }. 
1b290 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e   }.}../*.** Open
1b2a0 20 74 68 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f   the shared-memo
1b2b0 72 79 20 61 72 65 61 20 61 73 73 6f 63 69 61 74  ry area associat
1b2c0 65 64 20 77 69 74 68 20 64 61 74 61 62 61 73 65  ed with database
1b2d0 20 66 69 6c 65 20 70 44 62 46 64 2e 0a 2a 2a 0a   file pDbFd..**.
1b2e0 2a 2a 20 57 68 65 6e 20 6f 70 65 6e 69 6e 67 20  ** When opening 
1b2f0 61 20 6e 65 77 20 73 68 61 72 65 64 2d 6d 65 6d  a new shared-mem
1b300 6f 72 79 20 66 69 6c 65 2c 20 69 66 20 6e 6f 20  ory file, if no 
1b310 6f 74 68 65 72 20 69 6e 73 74 61 6e 63 65 73 20  other instances 
1b320 6f 66 20 74 68 61 74 0a 2a 2a 20 66 69 6c 65 20  of that.** file 
1b330 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70  are currently op
1b340 65 6e 2c 20 69 6e 20 74 68 69 73 20 70 72 6f 63  en, in this proc
1b350 65 73 73 20 6f 72 20 69 6e 20 6f 74 68 65 72 20  ess or in other 
1b360 70 72 6f 63 65 73 73 65 73 2c 20 74 68 65 6e 0a  processes, then.
1b370 2a 2a 20 74 68 65 20 66 69 6c 65 20 6d 75 73 74  ** the file must
1b380 20 62 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f   be truncated to
1b390 20 7a 65 72 6f 20 6c 65 6e 67 74 68 20 6f 72 20   zero length or 
1b3a0 68 61 76 65 20 69 74 73 20 68 65 61 64 65 72 20  have its header 
1b3b0 63 6c 65 61 72 65 64 2e 0a 2a 2f 0a 73 74 61 74  cleared..*/.stat
1b3c0 69 63 20 69 6e 74 20 77 69 6e 4f 70 65 6e 53 68  ic int winOpenSh
1b3d0 61 72 65 64 4d 65 6d 6f 72 79 28 77 69 6e 46 69  aredMemory(winFi
1b3e0 6c 65 20 2a 70 44 62 46 64 29 7b 0a 20 20 73 74  le *pDbFd){.  st
1b3f0 72 75 63 74 20 77 69 6e 53 68 6d 20 2a 70 3b 20  ruct winShm *p; 
1b400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b410 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74 69   /* The connecti
1b420 6f 6e 20 74 6f 20 62 65 20 6f 70 65 6e 65 64 20  on to be opened 
1b430 2a 2f 0a 20 20 73 74 72 75 63 74 20 77 69 6e 53  */.  struct winS
1b440 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65  hmNode *pShmNode
1b450 20 3d 20 30 3b 20 20 20 2f 2a 20 54 68 65 20 75   = 0;   /* The u
1b460 6e 64 65 72 6c 79 69 6e 67 20 6d 6d 61 70 70 65  nderlying mmappe
1b470 64 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  d file */.  int 
1b480 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
1b490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b4a0 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f  * Result code */
1b4b0 0a 20 20 73 74 72 75 63 74 20 77 69 6e 53 68 6d  .  struct winShm
1b4c0 4e 6f 64 65 20 2a 70 4e 65 77 3b 20 20 20 20 20  Node *pNew;     
1b4d0 20 20 20 20 20 20 2f 2a 20 4e 65 77 6c 79 20 61        /* Newly a
1b4e0 6c 6c 6f 63 61 74 65 64 20 77 69 6e 53 68 6d 4e  llocated winShmN
1b4f0 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61  ode */.  int nNa
1b500 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  me;             
1b510 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1b520 69 7a 65 20 6f 66 20 7a 4e 61 6d 65 20 69 6e 20  ize of zName in 
1b530 62 79 74 65 73 20 2a 2f 0a 0a 20 20 61 73 73 65  bytes */..  asse
1b540 72 74 28 20 70 44 62 46 64 2d 3e 70 53 68 6d 3d  rt( pDbFd->pShm=
1b550 3d 30 20 29 3b 20 20 20 20 2f 2a 20 4e 6f 74 20  =0 );    /* Not 
1b560 70 72 65 76 69 6f 75 73 6c 79 20 6f 70 65 6e 65  previously opene
1b570 64 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  d */..  /* Alloc
1b580 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 74 68  ate space for th
1b590 65 20 6e 65 77 20 73 71 6c 69 74 65 33 5f 73 68  e new sqlite3_sh
1b5a0 6d 20 6f 62 6a 65 63 74 2e 20 20 41 6c 73 6f 20  m object.  Also 
1b5b0 73 70 65 63 75 6c 61 74 69 76 65 6c 79 0a 20 20  speculatively.  
1b5c0 2a 2a 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63  ** allocate spac
1b5d0 65 20 66 6f 72 20 61 20 6e 65 77 20 77 69 6e 53  e for a new winS
1b5e0 68 6d 4e 6f 64 65 20 61 6e 64 20 66 69 6c 65 6e  hmNode and filen
1b5f0 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 70 20 3d 20  ame..  */.  p = 
1b600 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
1b610 6f 28 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b  o( sizeof(*p) );
1b620 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
1b630 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
1b640 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 6e 4e 61 6d 65  R_NOMEM;.  nName
1b650 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
1b660 33 30 28 70 44 62 46 64 2d 3e 7a 50 61 74 68 29  30(pDbFd->zPath)
1b670 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
1b680 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69  e3MallocZero( si
1b690 7a 65 6f 66 28 2a 70 53 68 6d 4e 6f 64 65 29 20  zeof(*pShmNode) 
1b6a0 2b 20 6e 4e 61 6d 65 20 2b 20 31 37 20 29 3b 0a  + nName + 17 );.
1b6b0 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b    if( pNew==0 ){
1b6c0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
1b6d0 65 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  e(p);.    return
1b6e0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
1b6f0 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d  MEM;.  }.  pNew-
1b700 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68  >zFilename = (ch
1b710 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20  ar*)&pNew[1];.  
1b720 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
1b730 28 6e 4e 61 6d 65 2b 31 35 2c 20 70 4e 65 77 2d  (nName+15, pNew-
1b740 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 25 73 2d  >zFilename, "%s-
1b750 73 68 6d 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61  shm", pDbFd->zPa
1b760 74 68 29 3b 0a 20 20 73 71 6c 69 74 65 33 46 69  th);.  sqlite3Fi
1b770 6c 65 53 75 66 66 69 78 33 28 70 44 62 46 64 2d  leSuffix3(pDbFd-
1b780 3e 7a 50 61 74 68 2c 20 70 4e 65 77 2d 3e 7a 46  >zPath, pNew->zF
1b790 69 6c 65 6e 61 6d 65 29 3b 0a 0a 20 20 2f 2a 20  ilename);..  /* 
1b7a0 4c 6f 6f 6b 20 74 6f 20 73 65 65 20 69 66 20 74  Look to see if t
1b7b0 68 65 72 65 20 69 73 20 61 6e 20 65 78 69 73 74  here is an exist
1b7c0 69 6e 67 20 77 69 6e 53 68 6d 4e 6f 64 65 20 74  ing winShmNode t
1b7d0 68 61 74 20 63 61 6e 20 62 65 20 75 73 65 64 2e  hat can be used.
1b7e0 0a 20 20 2a 2a 20 49 66 20 6e 6f 20 6d 61 74 63  .  ** If no matc
1b7f0 68 69 6e 67 20 77 69 6e 53 68 6d 4e 6f 64 65 20  hing winShmNode 
1b800 63 75 72 72 65 6e 74 6c 79 20 65 78 69 73 74 73  currently exists
1b810 2c 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 6f  , create a new o
1b820 6e 65 2e 0a 20 20 2a 2f 0a 20 20 77 69 6e 53 68  ne..  */.  winSh
1b830 6d 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  mEnterMutex();. 
1b840 20 66 6f 72 28 70 53 68 6d 4e 6f 64 65 20 3d 20   for(pShmNode = 
1b850 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 3b 20  winShmNodeList; 
1b860 70 53 68 6d 4e 6f 64 65 3b 20 70 53 68 6d 4e 6f  pShmNode; pShmNo
1b870 64 65 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 4e 65  de=pShmNode->pNe
1b880 78 74 29 7b 0a 20 20 20 20 2f 2a 20 54 42 44 20  xt){.    /* TBD 
1b890 6e 65 65 64 20 74 6f 20 63 6f 6d 65 20 75 70 20  need to come up 
1b8a0 77 69 74 68 20 62 65 74 74 65 72 20 6d 61 74 63  with better matc
1b8b0 68 20 68 65 72 65 2e 20 20 50 65 72 68 61 70 73  h here.  Perhaps
1b8c0 0a 20 20 20 20 2a 2a 20 75 73 65 20 46 49 4c 45  .    ** use FILE
1b8d0 5f 49 44 5f 42 4f 54 48 5f 44 49 52 5f 49 4e 46  _ID_BOTH_DIR_INF
1b8e0 4f 20 53 74 72 75 63 74 75 72 65 2e 0a 20 20 20  O Structure..   
1b8f0 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69   */.    if( sqli
1b900 74 65 33 53 74 72 49 43 6d 70 28 70 53 68 6d 4e  te3StrICmp(pShmN
1b910 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20  ode->zFilename, 
1b920 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29  pNew->zFilename)
1b930 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  ==0 ) break;.  }
1b940 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 20  .  if( pShmNode 
1b950 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
1b960 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 7d 65 6c  ree(pNew);.  }el
1b970 73 65 7b 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65  se{.    pShmNode
1b980 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 70 4e 65   = pNew;.    pNe
1b990 77 20 3d 20 30 3b 0a 20 20 20 20 28 28 77 69 6e  w = 0;.    ((win
1b9a0 46 69 6c 65 2a 29 28 26 70 53 68 6d 4e 6f 64 65  File*)(&pShmNode
1b9b0 2d 3e 68 46 69 6c 65 29 29 2d 3e 68 20 3d 20 49  ->hFile))->h = I
1b9c0 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
1b9d0 4c 55 45 3b 0a 20 20 20 20 70 53 68 6d 4e 6f 64  LUE;.    pShmNod
1b9e0 65 2d 3e 70 4e 65 78 74 20 3d 20 77 69 6e 53 68  e->pNext = winSh
1b9f0 6d 4e 6f 64 65 4c 69 73 74 3b 0a 20 20 20 20 77  mNodeList;.    w
1ba00 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 20 3d 20  inShmNodeList = 
1ba10 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20 20 20 70  pShmNode;..    p
1ba20 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20 3d  ShmNode->mutex =
1ba30 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61   sqlite3_mutex_a
1ba40 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
1ba50 58 5f 46 41 53 54 29 3b 0a 20 20 20 20 69 66 28  X_FAST);.    if(
1ba60 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78   pShmNode->mutex
1ba70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
1ba80 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  = SQLITE_IOERR_N
1ba90 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f  OMEM;.      goto
1baa0 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20   shm_open_err;. 
1bab0 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 77     }..    rc = w
1bac0 69 6e 4f 70 65 6e 28 70 44 62 46 64 2d 3e 70 56  inOpen(pDbFd->pV
1bad0 66 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  fs,.            
1bae0 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a       pShmNode->z
1baf0 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20 20 20 20  Filename,       
1bb00 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
1bb10 20 74 68 65 20 66 69 6c 65 20 28 55 54 46 2d 38   the file (UTF-8
1bb20 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  ) */.           
1bb30 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 66        (sqlite3_f
1bb40 69 6c 65 2a 29 26 70 53 68 6d 4e 6f 64 65 2d 3e  ile*)&pShmNode->
1bb50 68 46 69 6c 65 2c 20 20 2f 2a 20 46 69 6c 65 20  hFile,  /* File 
1bb60 68 61 6e 64 6c 65 20 68 65 72 65 20 2a 2f 0a 20  handle here */. 
1bb70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb80 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20  SQLITE_OPEN_WAL 
1bb90 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  | SQLITE_OPEN_RE
1bba0 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45  ADWRITE | SQLITE
1bbb0 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c 0a 20 20  _OPEN_CREATE,.  
1bbc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
1bbd0 29 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54  );.    if( SQLIT
1bbe0 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20  E_OK!=rc ){.    
1bbf0 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f    goto shm_open_
1bc00 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  err;.    }..    
1bc10 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
1bc20 69 66 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65  if another proce
1bc30 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68  ss is holding th
1bc40 65 20 64 65 61 64 2d 6d 61 6e 20 73 77 69 74 63  e dead-man switc
1bc50 68 2e 0a 20 20 20 20 2a 2a 20 49 66 20 6e 6f 74  h..    ** If not
1bc60 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 66  , truncate the f
1bc70 69 6c 65 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67  ile to zero leng
1bc80 74 68 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  th..    */.    i
1bc90 66 28 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c  f( winShmSystemL
1bca0 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53  ock(pShmNode, _S
1bcb0 48 4d 5f 57 52 4c 43 4b 2c 20 57 49 4e 5f 53 48  HM_WRLCK, WIN_SH
1bcc0 4d 5f 44 4d 53 2c 20 31 29 3d 3d 53 51 4c 49 54  M_DMS, 1)==SQLIT
1bcd0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
1bce0 20 3d 20 77 69 6e 54 72 75 6e 63 61 74 65 28 28   = winTruncate((
1bcf0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 26  sqlite3_file *)&
1bd00 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c  pShmNode->hFile,
1bd10 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
1bd20 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1bd30 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e          rc = win
1bd40 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
1bd50 49 4f 45 52 52 5f 53 48 4d 4f 50 45 4e 2c 20 6f  IOERR_SHMOPEN, o
1bd60 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c  sGetLastError(),
1bd70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1bd80 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 4f 70            "winOp
1bd90 65 6e 53 68 6d 22 2c 20 70 44 62 46 64 2d 3e 7a  enShm", pDbFd->z
1bda0 50 61 74 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Path);.      }. 
1bdb0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
1bdc0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1bdd0 20 20 20 20 77 69 6e 53 68 6d 53 79 73 74 65 6d      winShmSystem
1bde0 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f  Lock(pShmNode, _
1bdf0 53 48 4d 5f 55 4e 4c 43 4b 2c 20 57 49 4e 5f 53  SHM_UNLCK, WIN_S
1be00 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20 20 20 20  HM_DMS, 1);.    
1be10 20 20 72 63 20 3d 20 77 69 6e 53 68 6d 53 79 73    rc = winShmSys
1be20 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65  temLock(pShmNode
1be30 2c 20 5f 53 48 4d 5f 52 44 4c 43 4b 2c 20 57 49  , _SHM_RDLCK, WI
1be40 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20  N_SHM_DMS, 1);. 
1be50 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 20     }.    if( rc 
1be60 29 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f  ) goto shm_open_
1be70 65 72 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  err;.  }..  /* M
1be80 61 6b 65 20 74 68 65 20 6e 65 77 20 63 6f 6e 6e  ake the new conn
1be90 65 63 74 69 6f 6e 20 61 20 63 68 69 6c 64 20 6f  ection a child o
1bea0 66 20 74 68 65 20 77 69 6e 53 68 6d 4e 6f 64 65  f the winShmNode
1beb0 20 2a 2f 0a 20 20 70 2d 3e 70 53 68 6d 4e 6f 64   */.  p->pShmNod
1bec0 65 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 23 69  e = pShmNode;.#i
1bed0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
1bee0 47 0a 20 20 70 2d 3e 69 64 20 3d 20 70 53 68 6d  G.  p->id = pShm
1bef0 4e 6f 64 65 2d 3e 6e 65 78 74 53 68 6d 49 64 2b  Node->nextShmId+
1bf00 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 70 53 68 6d  +;.#endif.  pShm
1bf10 4e 6f 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20  Node->nRef++;.  
1bf20 70 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20 70 3b  pDbFd->pShm = p;
1bf30 0a 20 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75  .  winShmLeaveMu
1bf40 74 65 78 28 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  tex();..  /* The
1bf50 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
1bf60 20 6f 6e 20 70 53 68 6d 4e 6f 64 65 20 68 61 73   on pShmNode has
1bf70 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69 6e   already been in
1bf80 63 72 65 6d 65 6e 74 65 64 20 75 6e 64 65 72 0a  cremented under.
1bf90 20 20 2a 2a 20 74 68 65 20 63 6f 76 65 72 20 6f    ** the cover o
1bfa0 66 20 74 68 65 20 77 69 6e 53 68 6d 45 6e 74 65  f the winShmEnte
1bfb0 72 4d 75 74 65 78 28 29 20 6d 75 74 65 78 20 61  rMutex() mutex a
1bfc0 6e 64 20 74 68 65 20 70 6f 69 6e 74 65 72 20 66  nd the pointer f
1bfd0 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 6e 65 77  rom the.  ** new
1bfe0 20 28 73 74 72 75 63 74 20 77 69 6e 53 68 6d 29   (struct winShm)
1bff0 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20 70   object to the p
1c000 53 68 6d 4e 6f 64 65 20 68 61 73 20 62 65 65 6e  ShmNode has been
1c010 20 73 65 74 2e 20 41 6c 6c 20 74 68 61 74 20 69   set. All that i
1c020 73 0a 20 20 2a 2a 20 6c 65 66 74 20 74 6f 20 64  s.  ** left to d
1c030 6f 20 69 73 20 74 6f 20 6c 69 6e 6b 20 74 68 65  o is to link the
1c040 20 6e 65 77 20 6f 62 6a 65 63 74 20 69 6e 74 6f   new object into
1c050 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74   the linked list
1c060 20 73 74 61 72 74 69 6e 67 0a 20 20 2a 2a 20 61   starting.  ** a
1c070 74 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72  t pShmNode->pFir
1c080 73 74 2e 20 54 68 69 73 20 6d 75 73 74 20 62 65  st. This must be
1c090 20 64 6f 6e 65 20 77 68 69 6c 65 20 68 6f 6c 64   done while hold
1c0a0 69 6e 67 20 74 68 65 20 70 53 68 6d 4e 6f 64 65  ing the pShmNode
1c0b0 2d 3e 6d 75 74 65 78 0a 20 20 2a 2a 20 6d 75 74  ->mutex.  ** mut
1c0c0 65 78 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ex..  */.  sqlit
1c0d0 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70  e3_mutex_enter(p
1c0e0 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b  ShmNode->mutex);
1c0f0 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53  .  p->pNext = pS
1c100 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 0a  hmNode->pFirst;.
1c110 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72    pShmNode->pFir
1c120 73 74 20 3d 20 70 3b 0a 20 20 73 71 6c 69 74 65  st = p;.  sqlite
1c130 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53  3_mutex_leave(pS
1c140 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
1c150 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1c160 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68  OK;..  /* Jump h
1c170 65 72 65 20 6f 6e 20 61 6e 79 20 65 72 72 6f 72  ere on any error
1c180 20 2a 2f 0a 73 68 6d 5f 6f 70 65 6e 5f 65 72 72   */.shm_open_err
1c190 3a 0a 20 20 77 69 6e 53 68 6d 53 79 73 74 65 6d  :.  winShmSystem
1c1a0 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f  Lock(pShmNode, _
1c1b0 53 48 4d 5f 55 4e 4c 43 4b 2c 20 57 49 4e 5f 53  SHM_UNLCK, WIN_S
1c1c0 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20 20 77 69  HM_DMS, 1);.  wi
1c1d0 6e 53 68 6d 50 75 72 67 65 28 70 44 62 46 64 2d  nShmPurge(pDbFd-
1c1e0 3e 70 56 66 73 2c 20 30 29 3b 20 20 20 20 20 20  >pVfs, 0);      
1c1f0 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 66 72 65  /* This call fre
1c200 65 73 20 70 53 68 6d 4e 6f 64 65 20 69 66 20 72  es pShmNode if r
1c210 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 73 71 6c  equired */.  sql
1c220 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
1c230 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65  sqlite3_free(pNe
1c240 77 29 3b 0a 20 20 77 69 6e 53 68 6d 4c 65 61 76  w);.  winShmLeav
1c250 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74 75  eMutex();.  retu
1c260 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1c270 43 6c 6f 73 65 20 61 20 63 6f 6e 6e 65 63 74 69  Close a connecti
1c280 6f 6e 20 74 6f 20 73 68 61 72 65 64 2d 6d 65 6d  on to shared-mem
1c290 6f 72 79 2e 20 20 44 65 6c 65 74 65 20 74 68 65  ory.  Delete the
1c2a0 20 75 6e 64 65 72 6c 79 69 6e 67 0a 2a 2a 20 73   underlying.** s
1c2b0 74 6f 72 61 67 65 20 69 66 20 64 65 6c 65 74 65  torage if delete
1c2c0 46 6c 61 67 20 69 73 20 74 72 75 65 2e 0a 2a 2f  Flag is true..*/
1c2d0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53  .static int winS
1c2e0 68 6d 55 6e 6d 61 70 28 0a 20 20 73 71 6c 69 74  hmUnmap(.  sqlit
1c2f0 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20  e3_file *fd,    
1c300 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
1c310 65 20 68 6f 6c 64 69 6e 67 20 73 68 61 72 65 64  e holding shared
1c320 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74   memory */.  int
1c330 20 64 65 6c 65 74 65 46 6c 61 67 20 20 20 20 20   deleteFlag     
1c340 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74          /* Delet
1c350 65 20 61 66 74 65 72 20 63 6c 6f 73 69 6e 67 20  e after closing 
1c360 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20  if true */.){.  
1c370 77 69 6e 46 69 6c 65 20 2a 70 44 62 46 64 3b 20  winFile *pDbFd; 
1c380 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
1c390 65 20 68 6f 6c 64 69 6e 67 20 73 68 61 72 65 64  e holding shared
1c3a0 2d 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 77 69 6e  -memory */.  win
1c3b0 53 68 6d 20 2a 70 3b 20 20 20 20 20 20 20 20 20  Shm *p;         
1c3c0 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63     /* The connec
1c3d0 74 69 6f 6e 20 74 6f 20 62 65 20 63 6c 6f 73 65  tion to be close
1c3e0 64 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f 64  d */.  winShmNod
1c3f0 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 2f 2a 20  e *pShmNode; /* 
1c400 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 73  The underlying s
1c410 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c  hared-memory fil
1c420 65 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 2a  e */.  winShm **
1c430 70 70 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  pp;          /* 
1c440 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
1c450 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74   sibling connect
1c460 69 6f 6e 73 20 2a 2f 0a 0a 20 20 70 44 62 46 64  ions */..  pDbFd
1c470 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66 64 3b   = (winFile*)fd;
1c480 0a 20 20 70 20 3d 20 70 44 62 46 64 2d 3e 70 53  .  p = pDbFd->pS
1c490 68 6d 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  hm;.  if( p==0 )
1c4a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1c4b0 4b 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20  K;.  pShmNode = 
1c4c0 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20  p->pShmNode;..  
1c4d0 2f 2a 20 52 65 6d 6f 76 65 20 63 6f 6e 6e 65 63  /* Remove connec
1c4e0 74 69 6f 6e 20 70 20 66 72 6f 6d 20 74 68 65 20  tion p from the 
1c4f0 73 65 74 20 6f 66 20 63 6f 6e 6e 65 63 74 69 6f  set of connectio
1c500 6e 73 20 61 73 73 6f 63 69 61 74 65 64 0a 20 20  ns associated.  
1c510 2a 2a 20 77 69 74 68 20 70 53 68 6d 4e 6f 64 65  ** with pShmNode
1c520 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   */.  sqlite3_mu
1c530 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f  tex_enter(pShmNo
1c540 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 66 6f  de->mutex);.  fo
1c550 72 28 70 70 3d 26 70 53 68 6d 4e 6f 64 65 2d 3e  r(pp=&pShmNode->
1c560 70 46 69 72 73 74 3b 20 28 2a 70 70 29 21 3d 70  pFirst; (*pp)!=p
1c570 3b 20 70 70 20 3d 20 26 28 2a 70 70 29 2d 3e 70  ; pp = &(*pp)->p
1c580 4e 65 78 74 29 7b 7d 0a 20 20 2a 70 70 20 3d 20  Next){}.  *pp = 
1c590 70 2d 3e 70 4e 65 78 74 3b 0a 0a 20 20 2f 2a 20  p->pNext;..  /* 
1c5a0 46 72 65 65 20 74 68 65 20 63 6f 6e 6e 65 63 74  Free the connect
1c5b0 69 6f 6e 20 70 20 2a 2f 0a 20 20 73 71 6c 69 74  ion p */.  sqlit
1c5c0 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 70 44  e3_free(p);.  pD
1c5d0 62 46 64 2d 3e 70 53 68 6d 20 3d 20 30 3b 0a 20  bFd->pShm = 0;. 
1c5e0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
1c5f0 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  eave(pShmNode->m
1c600 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  utex);..  /* If 
1c610 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 20 68  pShmNode->nRef h
1c620 61 73 20 72 65 61 63 68 65 64 20 30 2c 20 74 68  as reached 0, th
1c630 65 6e 20 63 6c 6f 73 65 20 74 68 65 20 75 6e 64  en close the und
1c640 65 72 6c 79 69 6e 67 0a 20 20 2a 2a 20 73 68 61  erlying.  ** sha
1c650 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c  red-memory file,
1c660 20 74 6f 6f 20 2a 2f 0a 20 20 77 69 6e 53 68 6d   too */.  winShm
1c670 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
1c680 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65  assert( pShmNode
1c690 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70 53  ->nRef>0 );.  pS
1c6a0 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a  hmNode->nRef--;.
1c6b0 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e    if( pShmNode->
1c6c0 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 77  nRef==0 ){.    w
1c6d0 69 6e 53 68 6d 50 75 72 67 65 28 70 44 62 46 64  inShmPurge(pDbFd
1c6e0 2d 3e 70 56 66 73 2c 20 64 65 6c 65 74 65 46 6c  ->pVfs, deleteFl
1c6f0 61 67 29 3b 0a 20 20 7d 0a 20 20 77 69 6e 53 68  ag);.  }.  winSh
1c700 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 0a  mLeaveMutex();..
1c710 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1c720 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  OK;.}../*.** Cha
1c730 6e 67 65 20 74 68 65 20 6c 6f 63 6b 20 73 74 61  nge the lock sta
1c740 74 65 20 66 6f 72 20 61 20 73 68 61 72 65 64 2d  te for a shared-
1c750 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 2e 0a  memory segment..
1c760 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
1c770 6e 53 68 6d 4c 6f 63 6b 28 0a 20 20 73 71 6c 69  nShmLock(.  sqli
1c780 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20  te3_file *fd,   
1c790 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
1c7a0 73 65 20 66 69 6c 65 20 68 6f 6c 64 69 6e 67 20  se file holding 
1c7b0 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  the shared memor
1c7c0 79 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c  y */.  int ofst,
1c7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c7e0 20 20 2f 2a 20 46 69 72 73 74 20 6c 6f 63 6b 20    /* First lock 
1c7f0 74 6f 20 61 63 71 75 69 72 65 20 6f 72 20 72 65  to acquire or re
1c800 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  lease */.  int n
1c810 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1c820 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1c830 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 61 63 71 75  of locks to acqu
1c840 69 72 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a  ire or release *
1c850 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20  /.  int flags   
1c860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c870 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74  * What to do wit
1c880 68 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 29 7b  h the lock */.){
1c890 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 44 62 46  .  winFile *pDbF
1c8a0 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66 64  d = (winFile*)fd
1c8b0 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e  ;        /* Conn
1c8c0 65 63 74 69 6f 6e 20 68 6f 6c 64 69 6e 67 20 73  ection holding s
1c8d0 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a  hared memory */.
1c8e0 20 20 77 69 6e 53 68 6d 20 2a 70 20 3d 20 70 44    winShm *p = pD
1c8f0 62 46 64 2d 3e 70 53 68 6d 3b 20 20 20 20 20 20  bFd->pShm;      
1c900 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
1c910 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 62 65 69  hared memory bei
1c920 6e 67 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 77  ng locked */.  w
1c930 69 6e 53 68 6d 20 2a 70 58 3b 20 20 20 20 20 20  inShm *pX;      
1c940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c950 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70       /* For loop
1c960 69 6e 67 20 6f 76 65 72 20 61 6c 6c 20 73 69 62  ing over all sib
1c970 6c 69 6e 67 73 20 2a 2f 0a 20 20 77 69 6e 53 68  lings */.  winSh
1c980 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 20  mNode *pShmNode 
1c990 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20  = p->pShmNode;. 
1c9a0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1c9b0 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
1c9c0 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
1c9d0 20 63 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20 6d   code */.  u16 m
1c9e0 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ask;            
1c9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca00 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b   /* Mask of lock
1ca10 73 20 74 6f 20 74 61 6b 65 20 6f 72 20 72 65 6c  s to take or rel
1ca20 65 61 73 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ease */..  asser
1ca30 74 28 20 6f 66 73 74 3e 3d 30 20 26 26 20 6f 66  t( ofst>=0 && of
1ca40 73 74 2b 6e 3c 3d 53 51 4c 49 54 45 5f 53 48 4d  st+n<=SQLITE_SHM
1ca50 5f 4e 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  _NLOCK );.  asse
1ca60 72 74 28 20 6e 3e 3d 31 20 29 3b 0a 20 20 61 73  rt( n>=1 );.  as
1ca70 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 28 53 51  sert( flags==(SQ
1ca80 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20  LITE_SHM_LOCK | 
1ca90 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45  SQLITE_SHM_SHARE
1caa0 44 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61  D).       || fla
1cab0 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f  gs==(SQLITE_SHM_
1cac0 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48  LOCK | SQLITE_SH
1cad0 4d 5f 45 58 43 4c 55 53 49 56 45 29 0a 20 20 20  M_EXCLUSIVE).   
1cae0 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53      || flags==(S
1caf0 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b  QLITE_SHM_UNLOCK
1cb00 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48   | SQLITE_SHM_SH
1cb10 41 52 45 44 29 0a 20 20 20 20 20 20 20 7c 7c 20  ARED).       || 
1cb20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53  flags==(SQLITE_S
1cb30 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49  HM_UNLOCK | SQLI
1cb40 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45  TE_SHM_EXCLUSIVE
1cb50 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  ) );.  assert( n
1cb60 3d 3d 31 20 7c 7c 20 28 66 6c 61 67 73 20 26 20  ==1 || (flags & 
1cb70 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55  SQLITE_SHM_EXCLU
1cb80 53 49 56 45 29 21 3d 30 20 29 3b 0a 0a 20 20 6d  SIVE)!=0 );..  m
1cb90 61 73 6b 20 3d 20 28 75 31 36 29 28 28 31 55 3c  ask = (u16)((1U<
1cba0 3c 28 6f 66 73 74 2b 6e 29 29 20 2d 20 28 31 55  <(ofst+n)) - (1U
1cbb0 3c 3c 6f 66 73 74 29 29 3b 0a 20 20 61 73 73 65  <<ofst));.  asse
1cbc0 72 74 28 20 6e 3e 31 20 7c 7c 20 6d 61 73 6b 3d  rt( n>1 || mask=
1cbd0 3d 28 31 3c 3c 6f 66 73 74 29 20 29 3b 0a 20 20  =(1<<ofst) );.  
1cbe0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
1cbf0 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  ter(pShmNode->mu
1cc00 74 65 78 29 3b 0a 20 20 69 66 28 20 66 6c 61 67  tex);.  if( flag
1cc10 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 55  s & SQLITE_SHM_U
1cc20 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 75 31 36  NLOCK ){.    u16
1cc30 20 61 6c 6c 4d 61 73 6b 20 3d 20 30 3b 20 2f 2a   allMask = 0; /*
1cc40 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 68   Mask of locks h
1cc50 65 6c 64 20 62 79 20 73 69 62 6c 69 6e 67 73 20  eld by siblings 
1cc60 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 65 20 69  */..    /* See i
1cc70 66 20 61 6e 79 20 73 69 62 6c 69 6e 67 73 20 68  f any siblings h
1cc80 6f 6c 64 20 74 68 69 73 20 73 61 6d 65 20 6c 6f  old this same lo
1cc90 63 6b 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58  ck */.    for(pX
1cca0 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73  =pShmNode->pFirs
1ccb0 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e  t; pX; pX=pX->pN
1ccc0 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ext){.      if( 
1ccd0 70 58 3d 3d 70 20 29 20 63 6f 6e 74 69 6e 75 65  pX==p ) continue
1cce0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1ccf0 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20  (pX->exclMask & 
1cd00 28 70 2d 3e 65 78 63 6c 4d 61 73 6b 7c 70 2d 3e  (p->exclMask|p->
1cd10 73 68 61 72 65 64 4d 61 73 6b 29 29 3d 3d 30 20  sharedMask))==0 
1cd20 29 3b 0a 20 20 20 20 20 20 61 6c 6c 4d 61 73 6b  );.      allMask
1cd30 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d 61   |= pX->sharedMa
1cd40 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  sk;.    }..    /
1cd50 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 73 79 73  * Unlock the sys
1cd60 74 65 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b 73 20  tem-level locks 
1cd70 2a 2f 0a 20 20 20 20 69 66 28 20 28 6d 61 73 6b  */.    if( (mask
1cd80 20 26 20 61 6c 6c 4d 61 73 6b 29 3d 3d 30 20 29   & allMask)==0 )
1cd90 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e  {.      rc = win
1cda0 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53  ShmSystemLock(pS
1cdb0 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55 4e 4c  hmNode, _SHM_UNL
1cdc0 43 4b 2c 20 6f 66 73 74 2b 57 49 4e 5f 53 48 4d  CK, ofst+WIN_SHM
1cdd0 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 7d  _BASE, n);.    }
1cde0 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
1cdf0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1ce00 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 64 6f 20 74  }..    /* Undo t
1ce10 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 73 20 2a  he local locks *
1ce20 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
1ce30 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1ce40 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20   p->exclMask &= 
1ce50 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 2d 3e  ~mask;.      p->
1ce60 73 68 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d  sharedMask &= ~m
1ce70 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  ask;.    }.  }el
1ce80 73 65 20 69 66 28 20 66 6c 61 67 73 20 26 20 53  se if( flags & S
1ce90 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44  QLITE_SHM_SHARED
1cea0 20 29 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c 53   ){.    u16 allS
1ceb0 68 61 72 65 64 20 3d 20 30 3b 20 20 2f 2a 20 55  hared = 0;  /* U
1cec0 6e 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73 20 68 65  nion of locks he
1ced0 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e  ld by connection
1cee0 73 20 6f 74 68 65 72 20 74 68 61 6e 20 22 70 22  s other than "p"
1cef0 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64   */..    /* Find
1cf00 20 6f 75 74 20 77 68 69 63 68 20 73 68 61 72 65   out which share
1cf10 64 20 6c 6f 63 6b 73 20 61 72 65 20 61 6c 72 65  d locks are alre
1cf20 61 64 79 20 68 65 6c 64 20 62 79 20 73 69 62 6c  ady held by sibl
1cf30 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e  ing connections.
1cf40 0a 20 20 20 20 2a 2a 20 49 66 20 61 6e 79 20 73  .    ** If any s
1cf50 69 62 6c 69 6e 67 20 61 6c 72 65 61 64 79 20 68  ibling already h
1cf60 6f 6c 64 73 20 61 6e 20 65 78 63 6c 75 73 69 76  olds an exclusiv
1cf70 65 20 6c 6f 63 6b 2c 20 67 6f 20 61 68 65 61 64  e lock, go ahead
1cf80 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 20 20   and return.    
1cf90 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a  ** SQLITE_BUSY..
1cfa0 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70      */.    for(p
1cfb0 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72  X=pShmNode->pFir
1cfc0 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70  st; pX; pX=pX->p
1cfd0 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28  Next){.      if(
1cfe0 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26   (pX->exclMask &
1cff0 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20   mask)!=0 ){.   
1d000 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1d010 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 62  _BUSY;.        b
1d020 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
1d030 20 20 20 20 61 6c 6c 53 68 61 72 65 64 20 7c 3d      allShared |=
1d040 20 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b   pX->sharedMask;
1d050 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47  .    }..    /* G
1d060 65 74 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20  et shared locks 
1d070 61 74 20 74 68 65 20 73 79 73 74 65 6d 20 6c 65  at the system le
1d080 76 65 6c 2c 20 69 66 20 6e 65 63 65 73 73 61 72  vel, if necessar
1d090 79 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d  y */.    if( rc=
1d0a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1d0b0 20 20 20 20 69 66 28 20 28 61 6c 6c 53 68 61 72      if( (allShar
1d0c0 65 64 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29 7b  ed & mask)==0 ){
1d0d0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 69  .        rc = wi
1d0e0 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70  nShmSystemLock(p
1d0f0 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 52 44  ShmNode, _SHM_RD
1d100 4c 43 4b 2c 20 6f 66 73 74 2b 57 49 4e 5f 53 48  LCK, ofst+WIN_SH
1d110 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20  M_BASE, n);.    
1d120 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1d130 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1d140 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
1d150 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20 6c      /* Get the l
1d160 6f 63 61 6c 20 73 68 61 72 65 64 20 6c 6f 63 6b  ocal shared lock
1d170 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d  s */.    if( rc=
1d180 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1d190 20 20 20 20 70 2d 3e 73 68 61 72 65 64 4d 61 73      p->sharedMas
1d1a0 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 7d  k |= mask;.    }
1d1b0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
1d1c0 20 4d 61 6b 65 20 73 75 72 65 20 6e 6f 20 73 69   Make sure no si
1d1d0 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e  bling connection
1d1e0 73 20 68 6f 6c 64 20 6c 6f 63 6b 73 20 74 68 61  s hold locks tha
1d1f0 74 20 77 69 6c 6c 20 62 6c 6f 63 6b 20 74 68 69  t will block thi
1d200 73 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 2e 20 20  s.    ** lock.  
1d210 49 66 20 61 6e 79 20 64 6f 2c 20 72 65 74 75 72  If any do, retur
1d220 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 20 72 69  n SQLITE_BUSY ri
1d230 67 68 74 20 61 77 61 79 2e 0a 20 20 20 20 2a 2f  ght away..    */
1d240 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d  .    for(pX=pShm
1d250 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58  Node->pFirst; pX
1d260 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b  ; pX=pX->pNext){
1d270 0a 20 20 20 20 20 20 69 66 28 20 28 70 58 2d 3e  .      if( (pX->
1d280 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29  exclMask & mask)
1d290 21 3d 30 20 7c 7c 20 28 70 58 2d 3e 73 68 61 72  !=0 || (pX->shar
1d2a0 65 64 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d  edMask & mask)!=
1d2b0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
1d2c0 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
1d2d0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1d2e0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
1d2f0 20 2f 2a 20 47 65 74 20 74 68 65 20 65 78 63 6c   /* Get the excl
1d300 75 73 69 76 65 20 6c 6f 63 6b 73 20 61 74 20 74  usive locks at t
1d310 68 65 20 73 79 73 74 65 6d 20 6c 65 76 65 6c 2e  he system level.
1d320 20 20 54 68 65 6e 20 69 66 20 73 75 63 63 65 73    Then if succes
1d330 73 66 75 6c 0a 20 20 20 20 2a 2a 20 61 6c 73 6f  sful.    ** also
1d340 20 6d 61 72 6b 20 74 68 65 20 6c 6f 63 61 6c 20   mark the local 
1d350 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 73 20 62 65  connection as be
1d360 69 6e 67 20 6c 6f 63 6b 65 64 2e 0a 20 20 20 20  ing locked..    
1d370 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
1d380 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1d390 20 20 72 63 20 3d 20 77 69 6e 53 68 6d 53 79 73    rc = winShmSys
1d3a0 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65  temLock(pShmNode
1d3b0 2c 20 5f 53 48 4d 5f 57 52 4c 43 4b 2c 20 6f 66  , _SHM_WRLCK, of
1d3c0 73 74 2b 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2c  st+WIN_SHM_BASE,
1d3d0 20 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   n);.      if( r
1d3e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1d3f0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1d400 28 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26  (p->sharedMask &
1d410 20 6d 61 73 6b 29 3d 3d 30 20 29 3b 0a 20 20 20   mask)==0 );.   
1d420 20 20 20 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b       p->exclMask
1d430 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20   |= mask;.      
1d440 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  }.    }.  }.  sq
1d450 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
1d460 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  e(pShmNode->mute
1d470 78 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  x);.  OSTRACE(("
1d480 53 48 4d 2d 4c 4f 43 4b 20 70 69 64 3d 25 6c 75  SHM-LOCK pid=%lu
1d490 2c 20 69 64 3d 25 64 2c 20 73 68 61 72 65 64 4d  , id=%d, sharedM
1d4a0 61 73 6b 3d 25 30 33 78 2c 20 65 78 63 6c 4d 61  ask=%03x, exclMa
1d4b0 73 6b 3d 25 30 33 78 2c 20 72 63 3d 25 73 5c 6e  sk=%03x, rc=%s\n
1d4c0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73  ",.           os
1d4d0 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
1d4e0 73 49 64 28 29 2c 20 70 2d 3e 69 64 2c 20 70 2d  sId(), p->id, p-
1d4f0 3e 73 68 61 72 65 64 4d 61 73 6b 2c 20 70 2d 3e  >sharedMask, p->
1d500 65 78 63 6c 4d 61 73 6b 2c 0a 20 20 20 20 20 20  exclMask,.      
1d510 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 4e       sqlite3ErrN
1d520 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 72 65 74  ame(rc)));.  ret
1d530 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1d540 20 49 6d 70 6c 65 6d 65 6e 74 20 61 20 6d 65 6d   Implement a mem
1d550 6f 72 79 20 62 61 72 72 69 65 72 20 6f 72 20 6d  ory barrier or m
1d560 65 6d 6f 72 79 20 66 65 6e 63 65 20 6f 6e 20 73  emory fence on s
1d570 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e 0a 2a 2a  hared memory..**
1d580 0a 2a 2a 20 41 6c 6c 20 6c 6f 61 64 73 20 61 6e  .** All loads an
1d590 64 20 73 74 6f 72 65 73 20 62 65 67 75 6e 20 62  d stores begun b
1d5a0 65 66 6f 72 65 20 74 68 65 20 62 61 72 72 69 65  efore the barrie
1d5b0 72 20 6d 75 73 74 20 63 6f 6d 70 6c 65 74 65 20  r must complete 
1d5c0 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 20 6c 6f  before.** any lo
1d5d0 61 64 20 6f 72 20 73 74 6f 72 65 20 62 65 67 75  ad or store begu
1d5e0 6e 20 61 66 74 65 72 20 74 68 65 20 62 61 72 72  n after the barr
1d5f0 69 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ier..*/.static v
1d600 6f 69 64 20 77 69 6e 53 68 6d 42 61 72 72 69 65  oid winShmBarrie
1d610 72 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  r(.  sqlite3_fil
1d620 65 20 2a 66 64 20 20 20 20 20 20 20 20 20 20 2f  e *fd          /
1d630 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c 64 69  * Database holdi
1d640 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6d 65  ng the shared me
1d650 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 55 4e 55  mory */.){.  UNU
1d660 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66 64  SED_PARAMETER(fd
1d670 29 3b 0a 20 20 2f 2a 20 4d 65 6d 6f 72 79 42 61  );.  /* MemoryBa
1d680 72 72 69 65 72 28 29 3b 20 2f 2f 20 64 6f 65 73  rrier(); // does
1d690 20 6e 6f 74 20 77 6f 72 6b 20 2d 2d 20 64 6f 20   not work -- do 
1d6a0 6e 6f 74 20 6b 6e 6f 77 20 77 68 79 20 6e 6f 74  not know why not
1d6b0 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 45 6e 74 65   */.  winShmEnte
1d6c0 72 4d 75 74 65 78 28 29 3b 0a 20 20 77 69 6e 53  rMutex();.  winS
1d6d0 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  hmLeaveMutex();.
1d6e0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
1d6f0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
1d700 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 70 6f 69   to obtain a poi
1d710 6e 74 65 72 20 74 6f 20 72 65 67 69 6f 6e 20 69  nter to region i
1d720 52 65 67 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a  Region of the.**
1d730 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61   shared-memory a
1d740 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
1d750 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1d760 20 66 64 2e 20 53 68 61 72 65 64 2d 6d 65 6d 6f   fd. Shared-memo
1d770 72 79 20 72 65 67 69 6f 6e 73 0a 2a 2a 20 61 72  ry regions.** ar
1d780 65 20 6e 75 6d 62 65 72 65 64 20 73 74 61 72 74  e numbered start
1d790 69 6e 67 20 66 72 6f 6d 20 7a 65 72 6f 2e 20 45  ing from zero. E
1d7a0 61 63 68 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  ach shared-memor
1d7b0 79 20 72 65 67 69 6f 6e 20 69 73 20 73 7a 52 65  y region is szRe
1d7c0 67 69 6f 6e 0a 2a 2a 20 62 79 74 65 73 20 69 6e  gion.** bytes in
1d7d0 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   size..**.** If 
1d7e0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
1d7f0 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
1d800 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  s returned and *
1d810 70 70 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c  pp is set to NUL
1d820 4c 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  L..**.** Otherwi
1d830 73 65 2c 20 69 66 20 74 68 65 20 69 73 57 72 69  se, if the isWri
1d840 74 65 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  te parameter is 
1d850 30 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73  0 and the reques
1d860 74 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  ted shared-memor
1d870 79 0a 2a 2a 20 72 65 67 69 6f 6e 20 68 61 73 20  y.** region has 
1d880 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  not been allocat
1d890 65 64 20 28 62 79 20 61 6e 79 20 63 6c 69 65 6e  ed (by any clien
1d8a0 74 2c 20 69 6e 63 6c 75 64 69 6e 67 20 6f 6e 65  t, including one
1d8b0 20 72 75 6e 6e 69 6e 67 20 69 6e 20 61 0a 2a 2a   running in a.**
1d8c0 20 73 65 70 61 72 61 74 65 20 70 72 6f 63 65 73   separate proces
1d8d0 73 29 2c 20 74 68 65 6e 20 2a 70 70 20 69 73 20  s), then *pp is 
1d8e0 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20  set to NULL and 
1d8f0 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
1d900 65 64 2e 20 49 66 0a 2a 2a 20 69 73 57 72 69 74  ed. If.** isWrit
1d910 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e  e is non-zero an
1d920 64 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  d the requested 
1d930 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65  shared-memory re
1d940 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20 79 65 74  gion has not yet
1d950 0a 2a 2a 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  .** been allocat
1d960 65 64 2c 20 69 74 20 69 73 20 61 6c 6c 6f 63 61  ed, it is alloca
1d970 74 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ted by this func
1d980 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  tion..**.** If t
1d990 68 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  he shared-memory
1d9a0 20 72 65 67 69 6f 6e 20 68 61 73 20 61 6c 72 65   region has alre
1d9b0 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  ady been allocat
1d9c0 65 64 20 6f 72 20 69 73 20 61 6c 6c 6f 63 61 74  ed or is allocat
1d9d0 65 64 20 62 79 0a 2a 2a 20 74 68 69 73 20 63 61  ed by.** this ca
1d9e0 6c 6c 20 61 73 20 64 65 73 63 72 69 62 65 64 20  ll as described 
1d9f0 61 62 6f 76 65 2c 20 74 68 65 6e 20 69 74 20 69  above, then it i
1da00 73 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 74 68  s mapped into th
1da10 69 73 20 70 72 6f 63 65 73 73 65 73 0a 2a 2a 20  is processes.** 
1da20 61 64 64 72 65 73 73 20 73 70 61 63 65 20 28 69  address space (i
1da30 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65  f it is not alre
1da40 61 64 79 29 2c 20 2a 70 70 20 69 73 20 73 65 74  ady), *pp is set
1da50 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
1da60 20 6d 61 70 70 65 64 0a 2a 2a 20 6d 65 6d 6f 72   mapped.** memor
1da70 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  y and SQLITE_OK 
1da80 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
1da90 74 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 4d 61  tic int winShmMa
1daa0 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  p(.  sqlite3_fil
1dab0 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20  e *fd,          
1dac0 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 6f       /* Handle o
1dad0 70 65 6e 20 6f 6e 20 64 61 74 61 62 61 73 65 20  pen on database 
1dae0 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52  file */.  int iR
1daf0 65 67 69 6f 6e 2c 20 20 20 20 20 20 20 20 20 20  egion,          
1db00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
1db10 69 6f 6e 20 74 6f 20 72 65 74 72 69 65 76 65 20  ion to retrieve 
1db20 2a 2f 0a 20 20 69 6e 74 20 73 7a 52 65 67 69 6f  */.  int szRegio
1db30 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
1db40 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1db50 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  regions */.  int
1db60 20 69 73 57 72 69 74 65 2c 20 20 20 20 20 20 20   isWrite,       
1db70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1db80 54 72 75 65 20 74 6f 20 65 78 74 65 6e 64 20 66  True to extend f
1db90 69 6c 65 20 69 66 20 6e 65 63 65 73 73 61 72 79  ile if necessary
1dba0 20 2a 2f 0a 20 20 76 6f 69 64 20 76 6f 6c 61 74   */.  void volat
1dbb0 69 6c 65 20 2a 2a 70 70 20 20 20 20 20 20 20 20  ile **pp        
1dbc0 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 61        /* OUT: Ma
1dbd0 70 70 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29  pped memory */.)
1dbe0 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 44 62  {.  winFile *pDb
1dbf0 46 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66  Fd = (winFile*)f
1dc00 64 3b 0a 20 20 77 69 6e 53 68 6d 20 2a 70 20 3d  d;.  winShm *p =
1dc10 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20   pDbFd->pShm;.  
1dc20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d  winShmNode *pShm
1dc30 4e 6f 64 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d  Node;.  int rc =
1dc40 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69   SQLITE_OK;..  i
1dc50 66 28 20 21 70 20 29 7b 0a 20 20 20 20 72 63 20  f( !p ){.    rc 
1dc60 3d 20 77 69 6e 4f 70 65 6e 53 68 61 72 65 64 4d  = winOpenSharedM
1dc70 65 6d 6f 72 79 28 70 44 62 46 64 29 3b 0a 20 20  emory(pDbFd);.  
1dc80 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1dc90 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
1dca0 0a 20 20 20 20 70 20 3d 20 70 44 62 46 64 2d 3e  .    p = pDbFd->
1dcb0 70 53 68 6d 3b 0a 20 20 7d 0a 20 20 70 53 68 6d  pShm;.  }.  pShm
1dcc0 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f  Node = p->pShmNo
1dcd0 64 65 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 6d  de;..  sqlite3_m
1dce0 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e  utex_enter(pShmN
1dcf0 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61  ode->mutex);.  a
1dd00 73 73 65 72 74 28 20 73 7a 52 65 67 69 6f 6e 3d  ssert( szRegion=
1dd10 3d 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67  =pShmNode->szReg
1dd20 69 6f 6e 20 7c 7c 20 70 53 68 6d 4e 6f 64 65 2d  ion || pShmNode-
1dd30 3e 6e 52 65 67 69 6f 6e 3d 3d 30 20 29 3b 0a 0a  >nRegion==0 );..
1dd40 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e    if( pShmNode->
1dd50 6e 52 65 67 69 6f 6e 3c 3d 69 52 65 67 69 6f 6e  nRegion<=iRegion
1dd60 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53   ){.    struct S
1dd70 68 6d 52 65 67 69 6f 6e 20 2a 61 70 4e 65 77 3b  hmRegion *apNew;
1dd80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
1dd90 77 20 61 52 65 67 69 6f 6e 5b 5d 20 61 72 72 61  w aRegion[] arra
1dda0 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79  y */.    int nBy
1ddb0 74 65 20 3d 20 28 69 52 65 67 69 6f 6e 2b 31 29  te = (iRegion+1)
1ddc0 2a 73 7a 52 65 67 69 6f 6e 3b 20 20 2f 2a 20 4d  *szRegion;  /* M
1ddd0 69 6e 69 6d 75 6d 20 72 65 71 75 69 72 65 64 20  inimum required 
1dde0 66 69 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20  file size */.   
1ddf0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73   sqlite3_int64 s
1de00 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  z;              
1de10 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73      /* Current s
1de20 69 7a 65 20 6f 66 20 77 61 6c 2d 69 6e 64 65 78  ize of wal-index
1de30 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 70 53   file */..    pS
1de40 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f 6e  hmNode->szRegion
1de50 20 3d 20 73 7a 52 65 67 69 6f 6e 3b 0a 0a 20 20   = szRegion;..  
1de60 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74    /* The request
1de70 65 64 20 72 65 67 69 6f 6e 20 69 73 20 6e 6f 74  ed region is not
1de80 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 74 68 69   mapped into thi
1de90 73 20 70 72 6f 63 65 73 73 65 73 20 61 64 64 72  s processes addr
1dea0 65 73 73 20 73 70 61 63 65 2e 0a 20 20 20 20 2a  ess space..    *
1deb0 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
1dec0 66 20 69 74 20 68 61 73 20 62 65 65 6e 20 61 6c  f it has been al
1ded0 6c 6f 63 61 74 65 64 20 28 69 2e 65 2e 20 69 66  located (i.e. if
1dee0 20 74 68 65 20 77 61 6c 2d 69 6e 64 65 78 20 66   the wal-index f
1def0 69 6c 65 20 69 73 0a 20 20 20 20 2a 2a 20 6c 61  ile is.    ** la
1df00 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 63 6f  rge enough to co
1df10 6e 74 61 69 6e 20 74 68 65 20 72 65 71 75 65 73  ntain the reques
1df20 74 65 64 20 72 65 67 69 6f 6e 29 2e 0a 20 20 20  ted region)..   
1df30 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 77 69 6e   */.    rc = win
1df40 46 69 6c 65 53 69 7a 65 28 28 73 71 6c 69 74 65  FileSize((sqlite
1df50 33 5f 66 69 6c 65 20 2a 29 26 70 53 68 6d 4e 6f  3_file *)&pShmNo
1df60 64 65 2d 3e 68 46 69 6c 65 2c 20 26 73 7a 29 3b  de->hFile, &sz);
1df70 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1df80 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1df90 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72  rc = winLogError
1dfa0 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  (SQLITE_IOERR_SH
1dfb0 4d 53 49 5a 45 2c 20 6f 73 47 65 74 4c 61 73 74  MSIZE, osGetLast
1dfc0 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20  Error(),.       
1dfd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dfe0 22 77 69 6e 53 68 6d 4d 61 70 31 22 2c 20 70 44  "winShmMap1", pD
1dff0 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  bFd->zPath);.   
1e000 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f     goto shmpage_
1e010 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  out;.    }..    
1e020 69 66 28 20 73 7a 3c 6e 42 79 74 65 20 29 7b 0a  if( sz<nByte ){.
1e030 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71        /* The req
1e040 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72 65  uested memory re
1e050 67 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 65 78  gion does not ex
1e060 69 73 74 2e 20 49 66 20 69 73 57 72 69 74 65 20  ist. If isWrite 
1e070 69 73 20 73 65 74 20 74 6f 0a 20 20 20 20 20 20  is set to.      
1e080 2a 2a 20 7a 65 72 6f 2c 20 65 78 69 74 20 65 61  ** zero, exit ea
1e090 72 6c 79 2e 20 2a 70 70 20 77 69 6c 6c 20 62 65  rly. *pp will be
1e0a0 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64   set to NULL and
1e0b0 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
1e0c0 6e 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ned..      **.  
1e0d0 20 20 20 20 2a 2a 20 41 6c 74 65 72 6e 61 74 69      ** Alternati
1e0e0 76 65 6c 79 2c 20 69 66 20 69 73 57 72 69 74 65  vely, if isWrite
1e0f0 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 75 73   is non-zero, us
1e100 65 20 66 74 72 75 6e 63 61 74 65 28 29 20 74 6f  e ftruncate() to
1e110 20 61 6c 6c 6f 63 61 74 65 0a 20 20 20 20 20 20   allocate.      
1e120 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ** the requested
1e130 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 2e 0a   memory region..
1e140 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
1e150 66 28 20 21 69 73 57 72 69 74 65 20 29 20 67 6f  f( !isWrite ) go
1e160 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a  to shmpage_out;.
1e170 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 54 72        rc = winTr
1e180 75 6e 63 61 74 65 28 28 73 71 6c 69 74 65 33 5f  uncate((sqlite3_
1e190 66 69 6c 65 20 2a 29 26 70 53 68 6d 4e 6f 64 65  file *)&pShmNode
1e1a0 2d 3e 68 46 69 6c 65 2c 20 6e 42 79 74 65 29 3b  ->hFile, nByte);
1e1b0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
1e1c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1e1d0 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45      rc = winLogE
1e1e0 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
1e1f0 52 5f 53 48 4d 53 49 5a 45 2c 20 6f 73 47 65 74  R_SHMSIZE, osGet
1e200 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20  LastError(),.   
1e210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e220 20 20 20 20 20 20 22 77 69 6e 53 68 6d 4d 61 70        "winShmMap
1e230 32 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 68  2", pDbFd->zPath
1e240 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  );.        goto 
1e250 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20  shmpage_out;.   
1e260 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
1e270 2f 2a 20 4d 61 70 20 74 68 65 20 72 65 71 75 65  /* Map the reque
1e280 73 74 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69  sted memory regi
1e290 6f 6e 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f  on into this pro
1e2a0 63 65 73 73 65 73 20 61 64 64 72 65 73 73 20 73  cesses address s
1e2b0 70 61 63 65 2e 20 2a 2f 0a 20 20 20 20 61 70 4e  pace. */.    apN
1e2c0 65 77 20 3d 20 28 73 74 72 75 63 74 20 53 68 6d  ew = (struct Shm
1e2d0 52 65 67 69 6f 6e 20 2a 29 73 71 6c 69 74 65 33  Region *)sqlite3
1e2e0 5f 72 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20  _realloc(.      
1e2f0 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67    pShmNode->aReg
1e300 69 6f 6e 2c 20 28 69 52 65 67 69 6f 6e 2b 31 29  ion, (iRegion+1)
1e310 2a 73 69 7a 65 6f 66 28 61 70 4e 65 77 5b 30 5d  *sizeof(apNew[0]
1e320 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28  ).    );.    if(
1e330 20 21 61 70 4e 65 77 20 29 7b 0a 20 20 20 20 20   !apNew ){.     
1e340 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
1e350 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  RR_NOMEM;.      
1e360 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74  goto shmpage_out
1e370 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 68 6d  ;.    }.    pShm
1e380 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 20 3d 20  Node->aRegion = 
1e390 61 70 4e 65 77 3b 0a 0a 20 20 20 20 77 68 69 6c  apNew;..    whil
1e3a0 65 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  e( pShmNode->nRe
1e3b0 67 69 6f 6e 3c 3d 69 52 65 67 69 6f 6e 20 29 7b  gion<=iRegion ){
1e3c0 0a 20 20 20 20 20 20 48 41 4e 44 4c 45 20 68 4d  .      HANDLE hM
1e3d0 61 70 20 3d 20 4e 55 4c 4c 3b 20 20 20 20 20 20  ap = NULL;      
1e3e0 20 20 20 2f 2a 20 66 69 6c 65 2d 6d 61 70 70 69     /* file-mappi
1e3f0 6e 67 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 20  ng handle */.   
1e400 20 20 20 76 6f 69 64 20 2a 70 4d 61 70 20 3d 20     void *pMap = 
1e410 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
1e420 2a 20 4d 61 70 70 65 64 20 6d 65 6d 6f 72 79 20  * Mapped memory 
1e430 72 65 67 69 6f 6e 20 2a 2f 0a 0a 23 69 66 20 53  region */..#if S
1e440 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
1e450 20 20 20 20 20 68 4d 61 70 20 3d 20 6f 73 43 72       hMap = osCr
1e460 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 46  eateFileMappingF
1e470 72 6f 6d 41 70 70 28 70 53 68 6d 4e 6f 64 65 2d  romApp(pShmNode-
1e480 3e 68 46 69 6c 65 2e 68 2c 0a 20 20 20 20 20 20  >hFile.h,.      
1e490 20 20 20 20 4e 55 4c 4c 2c 20 50 41 47 45 5f 52      NULL, PAGE_R
1e4a0 45 41 44 57 52 49 54 45 2c 20 6e 42 79 74 65 2c  EADWRITE, nByte,
1e4b0 20 4e 55 4c 4c 0a 20 20 20 20 20 20 29 3b 0a 23   NULL.      );.#
1e4c0 65 6c 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  elif defined(SQL
1e4d0 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
1e4e0 44 45 29 0a 20 20 20 20 20 20 68 4d 61 70 20 3d  DE).      hMap =
1e4f0 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70   osCreateFileMap
1e500 70 69 6e 67 57 28 70 53 68 6d 4e 6f 64 65 2d 3e  pingW(pShmNode->
1e510 68 46 69 6c 65 2e 68 2c 0a 20 20 20 20 20 20 20  hFile.h,.       
1e520 20 20 20 4e 55 4c 4c 2c 20 50 41 47 45 5f 52 45     NULL, PAGE_RE
1e530 41 44 57 52 49 54 45 2c 20 30 2c 20 6e 42 79 74  ADWRITE, 0, nByt
1e540 65 2c 20 4e 55 4c 4c 0a 20 20 20 20 20 20 29 3b  e, NULL.      );
1e550 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 53  .#elif defined(S
1e560 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
1e570 41 4e 53 49 29 0a 20 20 20 20 20 20 68 4d 61 70  ANSI).      hMap
1e580 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d   = osCreateFileM
1e590 61 70 70 69 6e 67 41 28 70 53 68 6d 4e 6f 64 65  appingA(pShmNode
1e5a0 2d 3e 68 46 69 6c 65 2e 68 2c 0a 20 20 20 20 20  ->hFile.h,.     
1e5b0 20 20 20 20 20 4e 55 4c 4c 2c 20 50 41 47 45 5f       NULL, PAGE_
1e5c0 52 45 41 44 57 52 49 54 45 2c 20 30 2c 20 6e 42  READWRITE, 0, nB
1e5d0 79 74 65 2c 20 4e 55 4c 4c 0a 20 20 20 20 20 20  yte, NULL.      
1e5e0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
1e5f0 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4d 41  OSTRACE(("SHM-MA
1e600 50 2d 43 52 45 41 54 45 20 70 69 64 3d 25 6c 75  P-CREATE pid=%lu
1e610 2c 20 72 65 67 69 6f 6e 3d 25 64 2c 20 73 69 7a  , region=%d, siz
1e620 65 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a  e=%d, rc=%s\n",.
1e630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
1e640 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
1e650 73 73 49 64 28 29 2c 20 70 53 68 6d 4e 6f 64 65  ssId(), pShmNode
1e660 2d 3e 6e 52 65 67 69 6f 6e 2c 20 6e 42 79 74 65  ->nRegion, nByte
1e670 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1e680 20 68 4d 61 70 20 3f 20 22 6f 6b 22 20 3a 20 22   hMap ? "ok" : "
1e690 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20 20 20  failed"));.     
1e6a0 20 69 66 28 20 68 4d 61 70 20 29 7b 0a 20 20 20   if( hMap ){.   
1e6b0 20 20 20 20 20 69 6e 74 20 69 4f 66 66 73 65 74       int iOffset
1e6c0 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65   = pShmNode->nRe
1e6d0 67 69 6f 6e 2a 73 7a 52 65 67 69 6f 6e 3b 0a 20  gion*szRegion;. 
1e6e0 20 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66 73         int iOffs
1e6f0 65 74 53 68 69 66 74 20 3d 20 69 4f 66 66 73 65  etShift = iOffse
1e700 74 20 25 20 77 69 6e 53 79 73 49 6e 66 6f 2e 64  t % winSysInfo.d
1e710 77 41 6c 6c 6f 63 61 74 69 6f 6e 47 72 61 6e 75  wAllocationGranu
1e720 6c 61 72 69 74 79 3b 0a 23 69 66 20 53 51 4c 49  larity;.#if SQLI
1e730 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20  TE_OS_WINRT.    
1e740 20 20 20 20 70 4d 61 70 20 3d 20 6f 73 4d 61 70      pMap = osMap
1e750 56 69 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70  ViewOfFileFromAp
1e760 70 28 68 4d 61 70 2c 20 46 49 4c 45 5f 4d 41 50  p(hMap, FILE_MAP
1e770 5f 57 52 49 54 45 20 7c 20 46 49 4c 45 5f 4d 41  _WRITE | FILE_MA
1e780 50 5f 52 45 41 44 2c 0a 20 20 20 20 20 20 20 20  P_READ,.        
1e790 20 20 20 20 69 4f 66 66 73 65 74 20 2d 20 69 4f      iOffset - iO
1e7a0 66 66 73 65 74 53 68 69 66 74 2c 20 73 7a 52 65  ffsetShift, szRe
1e7b0 67 69 6f 6e 20 2b 20 69 4f 66 66 73 65 74 53 68  gion + iOffsetSh
1e7c0 69 66 74 0a 20 20 20 20 20 20 20 20 29 3b 0a 23  ift.        );.#
1e7d0 65 6c 73 65 0a 20 20 20 20 20 20 20 20 70 4d 61  else.        pMa
1e7e0 70 20 3d 20 6f 73 4d 61 70 56 69 65 77 4f 66 46  p = osMapViewOfF
1e7f0 69 6c 65 28 68 4d 61 70 2c 20 46 49 4c 45 5f 4d  ile(hMap, FILE_M
1e800 41 50 5f 57 52 49 54 45 20 7c 20 46 49 4c 45 5f  AP_WRITE | FILE_
1e810 4d 41 50 5f 52 45 41 44 2c 0a 20 20 20 20 20 20  MAP_READ,.      
1e820 20 20 20 20 20 20 30 2c 20 69 4f 66 66 73 65 74        0, iOffset
1e830 20 2d 20 69 4f 66 66 73 65 74 53 68 69 66 74 2c   - iOffsetShift,
1e840 20 73 7a 52 65 67 69 6f 6e 20 2b 20 69 4f 66 66   szRegion + iOff
1e850 73 65 74 53 68 69 66 74 0a 20 20 20 20 20 20 20  setShift.       
1e860 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20   );.#endif.     
1e870 20 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d     OSTRACE(("SHM
1e880 2d 4d 41 50 2d 4d 41 50 20 70 69 64 3d 25 6c 75  -MAP-MAP pid=%lu
1e890 2c 20 72 65 67 69 6f 6e 3d 25 64 2c 20 6f 66 66  , region=%d, off
1e8a0 73 65 74 3d 25 64 2c 20 73 69 7a 65 3d 25 64 2c  set=%d, size=%d,
1e8b0 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20   rc=%s\n",.     
1e8c0 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65              osGe
1e8d0 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
1e8e0 64 28 29 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  d(), pShmNode->n
1e8f0 52 65 67 69 6f 6e 2c 20 69 4f 66 66 73 65 74 2c  Region, iOffset,
1e900 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1e910 20 20 73 7a 52 65 67 69 6f 6e 2c 20 70 4d 61 70    szRegion, pMap
1e920 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65   ? "ok" : "faile
1e930 64 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  d"));.      }.  
1e940 20 20 20 20 69 66 28 20 21 70 4d 61 70 20 29 7b      if( !pMap ){
1e950 0a 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64  .        pShmNod
1e960 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f  e->lastErrno = o
1e970 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b  sGetLastError();
1e980 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 69  .        rc = wi
1e990 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
1e9a0 5f 49 4f 45 52 52 5f 53 48 4d 4d 41 50 2c 20 70  _IOERR_SHMMAP, p
1e9b0 53 68 6d 4e 6f 64 65 2d 3e 6c 61 73 74 45 72 72  ShmNode->lastErr
1e9c0 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
1e9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
1e9e0 6e 53 68 6d 4d 61 70 33 22 2c 20 70 44 62 46 64  nShmMap3", pDbFd
1e9f0 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20  ->zPath);.      
1ea00 20 20 69 66 28 20 68 4d 61 70 20 29 20 6f 73 43    if( hMap ) osC
1ea10 6c 6f 73 65 48 61 6e 64 6c 65 28 68 4d 61 70 29  loseHandle(hMap)
1ea20 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73  ;.        goto s
1ea30 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  hmpage_out;.    
1ea40 20 20 7d 0a 0a 20 20 20 20 20 20 70 53 68 6d 4e    }..      pShmN
1ea50 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 5b 70 53 68  ode->aRegion[pSh
1ea60 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 5d 2e  mNode->nRegion].
1ea70 70 4d 61 70 20 3d 20 70 4d 61 70 3b 0a 20 20 20  pMap = pMap;.   
1ea80 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65     pShmNode->aRe
1ea90 67 69 6f 6e 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e  gion[pShmNode->n
1eaa0 52 65 67 69 6f 6e 5d 2e 68 4d 61 70 20 3d 20 68  Region].hMap = h
1eab0 4d 61 70 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e  Map;.      pShmN
1eac0 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2b 2b 3b 0a  ode->nRegion++;.
1ead0 20 20 20 20 7d 0a 20 20 7d 0a 0a 73 68 6d 70 61      }.  }..shmpa
1eae0 67 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20 70 53  ge_out:.  if( pS
1eaf0 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3e  hmNode->nRegion>
1eb00 69 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 69  iRegion ){.    i
1eb10 6e 74 20 69 4f 66 66 73 65 74 20 3d 20 69 52 65  nt iOffset = iRe
1eb20 67 69 6f 6e 2a 73 7a 52 65 67 69 6f 6e 3b 0a 20  gion*szRegion;. 
1eb30 20 20 20 69 6e 74 20 69 4f 66 66 73 65 74 53 68     int iOffsetSh
1eb40 69 66 74 20 3d 20 69 4f 66 66 73 65 74 20 25 20  ift = iOffset % 
1eb50 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77 41 6c 6c  winSysInfo.dwAll
1eb60 6f 63 61 74 69 6f 6e 47 72 61 6e 75 6c 61 72 69  ocationGranulari
1eb70 74 79 3b 0a 20 20 20 20 63 68 61 72 20 2a 70 20  ty;.    char *p 
1eb80 3d 20 28 63 68 61 72 20 2a 29 70 53 68 6d 4e 6f  = (char *)pShmNo
1eb90 64 65 2d 3e 61 52 65 67 69 6f 6e 5b 69 52 65 67  de->aRegion[iReg
1eba0 69 6f 6e 5d 2e 70 4d 61 70 3b 0a 20 20 20 20 2a  ion].pMap;.    *
1ebb0 70 70 20 3d 20 28 76 6f 69 64 20 2a 29 26 70 5b  pp = (void *)&p[
1ebc0 69 4f 66 66 73 65 74 53 68 69 66 74 5d 3b 0a 20  iOffsetShift];. 
1ebd0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 20   }else{.    *pp 
1ebe0 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  = 0;.  }.  sqlit
1ebf0 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70  e3_mutex_leave(p
1ec00 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b  ShmNode->mutex);
1ec10 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1ec20 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
1ec30 77 69 6e 53 68 6d 4d 61 70 20 20 20 20 20 30 0a  winShmMap     0.
1ec40 23 20 64 65 66 69 6e 65 20 77 69 6e 53 68 6d 4c  # define winShmL
1ec50 6f 63 6b 20 20 20 20 30 0a 23 20 64 65 66 69 6e  ock    0.# defin
1ec60 65 20 77 69 6e 53 68 6d 42 61 72 72 69 65 72 20  e winShmBarrier 
1ec70 30 0a 23 20 64 65 66 69 6e 65 20 77 69 6e 53 68  0.# define winSh
1ec80 6d 55 6e 6d 61 70 20 20 20 30 0a 23 65 6e 64 69  mUnmap   0.#endi
1ec90 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c  f /* #ifndef SQL
1eca0 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a  ITE_OMIT_WAL */.
1ecb0 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 73 20 75 70  ./*.** Cleans up
1ecc0 20 74 68 65 20 6d 61 70 70 65 64 20 72 65 67 69   the mapped regi
1ecd0 6f 6e 20 6f 66 20 74 68 65 20 73 70 65 63 69 66  on of the specif
1ece0 69 65 64 20 66 69 6c 65 2c 20 69 66 20 61 6e 79  ied file, if any
1ecf0 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  ..*/.#if SQLITE_
1ed00 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
1ed10 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 55 6e  static int winUn
1ed20 6d 61 70 66 69 6c 65 28 77 69 6e 46 69 6c 65 20  mapfile(winFile 
1ed30 2a 70 46 69 6c 65 29 7b 0a 20 20 61 73 73 65 72  *pFile){.  asser
1ed40 74 28 20 70 46 69 6c 65 21 3d 30 20 29 3b 0a 20  t( pFile!=0 );. 
1ed50 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4d 41 50   OSTRACE(("UNMAP
1ed60 2d 46 49 4c 45 20 70 69 64 3d 25 6c 75 2c 20 70  -FILE pid=%lu, p
1ed70 46 69 6c 65 3d 25 70 2c 20 68 4d 61 70 3d 25 70  File=%p, hMap=%p
1ed80 2c 20 70 4d 61 70 52 65 67 69 6f 6e 3d 25 70 2c  , pMapRegion=%p,
1ed90 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 22 6d   ".           "m
1eda0 6d 61 70 53 69 7a 65 3d 25 6c 6c 64 2c 20 6d 6d  mapSize=%lld, mm
1edb0 61 70 53 69 7a 65 41 63 74 75 61 6c 3d 25 6c 6c  apSizeActual=%ll
1edc0 64 2c 20 6d 6d 61 70 53 69 7a 65 4d 61 78 3d 25  d, mmapSizeMax=%
1edd0 6c 6c 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  lld\n",.        
1ede0 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50     osGetCurrentP
1edf0 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c  rocessId(), pFil
1ee00 65 2c 20 70 46 69 6c 65 2d 3e 68 4d 61 70 2c 20  e, pFile->hMap, 
1ee10 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f  pFile->pMapRegio
1ee20 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46  n,.           pF
1ee30 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 2c 20 70  ile->mmapSize, p
1ee40 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 41 63  File->mmapSizeAc
1ee50 74 75 61 6c 2c 20 70 46 69 6c 65 2d 3e 6d 6d 61  tual, pFile->mma
1ee60 70 53 69 7a 65 4d 61 78 29 29 3b 0a 20 20 69 66  pSizeMax));.  if
1ee70 28 20 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67  ( pFile->pMapReg
1ee80 69 6f 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 21  ion ){.    if( !
1ee90 6f 73 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c  osUnmapViewOfFil
1eea0 65 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67  e(pFile->pMapReg
1eeb0 69 6f 6e 29 20 29 7b 0a 20 20 20 20 20 20 70 46  ion) ){.      pF
1eec0 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
1eed0 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
1eee0 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  );.      OSTRACE
1eef0 28 28 22 55 4e 4d 41 50 2d 46 49 4c 45 20 70 69  (("UNMAP-FILE pi
1ef00 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c  d=%lu, pFile=%p,
1ef10 20 70 4d 61 70 52 65 67 69 6f 6e 3d 25 70 2c 20   pMapRegion=%p, 
1ef20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
1ef30 20 22 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52   "rc=SQLITE_IOER
1ef40 52 5f 4d 4d 41 50 5c 6e 22 2c 20 6f 73 47 65 74  R_MMAP\n", osGet
1ef50 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
1ef60 28 29 2c 20 70 46 69 6c 65 2c 0a 20 20 20 20 20  (), pFile,.     
1ef70 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
1ef80 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29 3b 0a 20  >pMapRegion));. 
1ef90 20 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c       return winL
1efa0 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
1efb0 4f 45 52 52 5f 4d 4d 41 50 2c 20 70 46 69 6c 65  OERR_MMAP, pFile
1efc0 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20  ->lastErrno,.   
1efd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1efe0 20 20 20 20 20 20 22 77 69 6e 55 6e 6d 61 70 66        "winUnmapf
1eff0 69 6c 65 31 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  ile1", pFile->zP
1f000 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ath);.    }.    
1f010 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f  pFile->pMapRegio
1f020 6e 20 3d 20 30 3b 0a 20 20 20 20 70 46 69 6c 65  n = 0;.    pFile
1f030 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d 20 30 3b 0a  ->mmapSize = 0;.
1f040 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53      pFile->mmapS
1f050 69 7a 65 41 63 74 75 61 6c 20 3d 20 30 3b 0a 20  izeActual = 0;. 
1f060 20 7d 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e   }.  if( pFile->
1f070 68 4d 61 70 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20  hMap!=NULL ){.  
1f080 20 20 69 66 28 20 21 6f 73 43 6c 6f 73 65 48 61    if( !osCloseHa
1f090 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 4d 61 70  ndle(pFile->hMap
1f0a0 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  ) ){.      pFile
1f0b0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73  ->lastErrno = os
1f0c0 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
1f0d0 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
1f0e0 55 4e 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d 25  UNMAP-FILE pid=%
1f0f0 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 68 4d  lu, pFile=%p, hM
1f100 61 70 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  ap=%p, rc=SQLITE
1f110 5f 49 4f 45 52 52 5f 4d 4d 41 50 5c 6e 22 2c 0a  _IOERR_MMAP\n",.
1f120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
1f130 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
1f140 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 20 70  ssId(), pFile, p
1f150 46 69 6c 65 2d 3e 68 4d 61 70 29 29 3b 0a 20 20  File->hMap));.  
1f160 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f      return winLo
1f170 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
1f180 45 52 52 5f 4d 4d 41 50 2c 20 70 46 69 6c 65 2d  ERR_MMAP, pFile-
1f190 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20  >lastErrno,.    
1f1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f1b0 20 20 20 20 20 22 77 69 6e 55 6e 6d 61 70 66 69       "winUnmapfi
1f1c0 6c 65 32 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61  le2", pFile->zPa
1f1d0 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  th);.    }.    p
1f1e0 46 69 6c 65 2d 3e 68 4d 61 70 20 3d 20 4e 55 4c  File->hMap = NUL
1f1f0 4c 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45  L;.  }.  OSTRACE
1f200 28 28 22 55 4e 4d 41 50 2d 46 49 4c 45 20 70 69  (("UNMAP-FILE pi
1f210 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c  d=%lu, pFile=%p,
1f220 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22   rc=SQLITE_OK\n"
1f230 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 47  ,.           osG
1f240 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
1f250 49 64 28 29 2c 20 70 46 69 6c 65 29 29 3b 0a 20  Id(), pFile));. 
1f260 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1f270 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 6d 6f  K;.}../*.** Memo
1f280 72 79 20 6d 61 70 20 6f 72 20 72 65 6d 61 70 20  ry map or remap 
1f290 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 20  the file opened 
1f2a0 62 79 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74  by file-descript
1f2b0 6f 72 20 70 46 64 20 28 69 66 20 74 68 65 20 66  or pFd (if the f
1f2c0 69 6c 65 0a 2a 2a 20 69 73 20 61 6c 72 65 61 64  ile.** is alread
1f2d0 79 20 6d 61 70 70 65 64 2c 20 74 68 65 20 65 78  y mapped, the ex
1f2e0 69 73 74 69 6e 67 20 6d 61 70 70 69 6e 67 20 69  isting mapping i
1f2f0 73 20 72 65 70 6c 61 63 65 64 20 62 79 20 74 68  s replaced by th
1f300 65 20 6e 65 77 29 2e 20 4f 72 2c 20 69 66 0a 2a  e new). Or, if.*
1f310 2a 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 20  * there already 
1f320 65 78 69 73 74 73 20 61 20 6d 61 70 70 69 6e 67  exists a mapping
1f330 20 66 6f 72 20 74 68 69 73 20 66 69 6c 65 2c 20   for this file, 
1f340 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 73 74  and there are st
1f350 69 6c 6c 0a 2a 2a 20 6f 75 74 73 74 61 6e 64 69  ill.** outstandi
1f360 6e 67 20 78 46 65 74 63 68 28 29 20 72 65 66 65  ng xFetch() refe
1f370 72 65 6e 63 65 73 20 74 6f 20 69 74 2c 20 74 68  rences to it, th
1f380 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
1f390 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66   no-op..**.** If
1f3a0 20 70 61 72 61 6d 65 74 65 72 20 6e 42 79 74 65   parameter nByte
1f3b0 20 69 73 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65   is non-negative
1f3c0 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74 68 65  , then it is the
1f3d0 20 72 65 71 75 65 73 74 65 64 20 73 69 7a 65 20   requested size 
1f3e0 6f 66 0a 2a 2a 20 74 68 65 20 6d 61 70 70 69 6e  of.** the mappin
1f3f0 67 20 74 6f 20 63 72 65 61 74 65 2e 20 4f 74 68  g to create. Oth
1f400 65 72 77 69 73 65 2c 20 69 66 20 6e 42 79 74 65  erwise, if nByte
1f410 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65   is less than ze
1f420 72 6f 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20  ro, then the.** 
1f430 72 65 71 75 65 73 74 65 64 20 73 69 7a 65 20 69  requested size i
1f440 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  s the size of th
1f450 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20  e file on disk. 
1f460 54 68 65 20 61 63 74 75 61 6c 20 73 69 7a 65 20  The actual size 
1f470 6f 66 20 74 68 65 0a 2a 2a 20 63 72 65 61 74 65  of the.** create
1f480 64 20 6d 61 70 70 69 6e 67 20 69 73 20 65 69 74  d mapping is eit
1f490 68 65 72 20 74 68 65 20 72 65 71 75 65 73 74 65  her the requeste
1f4a0 64 20 73 69 7a 65 20 6f 72 20 74 68 65 20 76 61  d size or the va
1f4b0 6c 75 65 20 63 6f 6e 66 69 67 75 72 65 64 0a 2a  lue configured.*
1f4c0 2a 20 75 73 69 6e 67 20 53 51 4c 49 54 45 5f 46  * using SQLITE_F
1f4d0 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 2c 20  CNTL_MMAP_SIZE, 
1f4e0 77 68 69 63 68 65 76 65 72 20 69 73 20 73 6d 61  whichever is sma
1f4f0 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49  ller..**.** SQLI
1f500 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
1f510 64 20 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63  d if no error oc
1f520 63 75 72 73 20 28 65 76 65 6e 20 69 66 20 74 68  curs (even if th
1f530 65 20 6d 61 70 70 69 6e 67 20 69 73 20 6e 6f 74  e mapping is not
1f540 0a 2a 2a 20 72 65 63 72 65 61 74 65 64 20 61 73  .** recreated as
1f550 20 61 20 72 65 73 75 6c 74 20 6f 66 20 6f 75 74   a result of out
1f560 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e  standing referen
1f570 63 65 73 29 20 6f 72 20 61 6e 20 53 51 4c 69 74  ces) or an SQLit
1f580 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20  e error.** code 
1f590 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74  otherwise..*/.st
1f5a0 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 61 70 66  atic int winMapf
1f5b0 69 6c 65 28 77 69 6e 46 69 6c 65 20 2a 70 46 64  ile(winFile *pFd
1f5c0 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  , sqlite3_int64 
1f5d0 6e 42 79 74 65 29 7b 0a 20 20 73 71 6c 69 74 65  nByte){.  sqlite
1f5e0 33 5f 69 6e 74 36 34 20 6e 4d 61 70 20 3d 20 6e  3_int64 nMap = n
1f5f0 42 79 74 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  Byte;.  int rc;.
1f600 0a 20 20 61 73 73 65 72 74 28 20 6e 4d 61 70 3e  .  assert( nMap>
1f610 3d 30 20 7c 7c 20 70 46 64 2d 3e 6e 46 65 74 63  =0 || pFd->nFetc
1f620 68 4f 75 74 3d 3d 30 20 29 3b 0a 20 20 4f 53 54  hOut==0 );.  OST
1f630 52 41 43 45 28 28 22 4d 41 50 2d 46 49 4c 45 20  RACE(("MAP-FILE 
1f640 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25  pid=%lu, pFile=%
1f650 70 2c 20 73 69 7a 65 3d 25 6c 6c 64 5c 6e 22 2c  p, size=%lld\n",
1f660 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65  .           osGe
1f670 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
1f680 64 28 29 2c 20 70 46 64 2c 20 6e 42 79 74 65 29  d(), pFd, nByte)
1f690 29 3b 0a 0a 20 20 69 66 28 20 70 46 64 2d 3e 6e  );..  if( pFd->n
1f6a0 46 65 74 63 68 4f 75 74 3e 30 20 29 20 72 65 74  FetchOut>0 ) ret
1f6b0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  urn SQLITE_OK;..
1f6c0 20 20 69 66 28 20 6e 4d 61 70 3c 30 20 29 7b 0a    if( nMap<0 ){.
1f6d0 20 20 20 20 72 63 20 3d 20 77 69 6e 46 69 6c 65      rc = winFile
1f6e0 53 69 7a 65 28 28 73 71 6c 69 74 65 33 5f 66 69  Size((sqlite3_fi
1f6f0 6c 65 2a 29 70 46 64 2c 20 26 6e 4d 61 70 29 3b  le*)pFd, &nMap);
1f700 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
1f710 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4d       OSTRACE(("M
1f720 41 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c 75 2c  AP-FILE pid=%lu,
1f730 20 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51   pFile=%p, rc=SQ
1f740 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54  LITE_IOERR_FSTAT
1f750 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
1f760 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74      osGetCurrent
1f770 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 64  ProcessId(), pFd
1f780 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
1f790 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53   SQLITE_IOERR_FS
1f7a0 54 41 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  TAT;.    }.  }. 
1f7b0 20 69 66 28 20 6e 4d 61 70 3e 70 46 64 2d 3e 6d   if( nMap>pFd->m
1f7c0 6d 61 70 53 69 7a 65 4d 61 78 20 29 7b 0a 20 20  mapSizeMax ){.  
1f7d0 20 20 6e 4d 61 70 20 3d 20 70 46 64 2d 3e 6d 6d    nMap = pFd->mm
1f7e0 61 70 53 69 7a 65 4d 61 78 3b 0a 20 20 7d 0a 20  apSizeMax;.  }. 
1f7f0 20 6e 4d 61 70 20 26 3d 20 7e 28 73 71 6c 69 74   nMap &= ~(sqlit
1f800 65 33 5f 69 6e 74 36 34 29 28 77 69 6e 53 79 73  e3_int64)(winSys
1f810 49 6e 66 6f 2e 64 77 50 61 67 65 53 69 7a 65 20  Info.dwPageSize 
1f820 2d 20 31 29 3b 0a 0a 20 20 69 66 28 20 6e 4d 61  - 1);..  if( nMa
1f830 70 3d 3d 30 20 26 26 20 70 46 64 2d 3e 6d 6d 61  p==0 && pFd->mma
1f840 70 53 69 7a 65 3e 30 20 29 7b 0a 20 20 20 20 77  pSize>0 ){.    w
1f850 69 6e 55 6e 6d 61 70 66 69 6c 65 28 70 46 64 29  inUnmapfile(pFd)
1f860 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4d 61 70  ;.  }.  if( nMap
1f870 21 3d 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20  !=pFd->mmapSize 
1f880 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4e 65  ){.    void *pNe
1f890 77 20 3d 20 30 3b 0a 20 20 20 20 44 57 4f 52 44  w = 0;.    DWORD
1f8a0 20 70 72 6f 74 65 63 74 20 3d 20 50 41 47 45 5f   protect = PAGE_
1f8b0 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 44 57  READONLY;.    DW
1f8c0 4f 52 44 20 66 6c 61 67 73 20 3d 20 46 49 4c 45  ORD flags = FILE
1f8d0 5f 4d 41 50 5f 52 45 41 44 3b 0a 0a 20 20 20 20  _MAP_READ;..    
1f8e0 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28 70 46 64  winUnmapfile(pFd
1f8f0 29 3b 0a 20 20 20 20 69 66 28 20 28 70 46 64 2d  );.    if( (pFd-
1f900 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 57 49 4e  >ctrlFlags & WIN
1f910 46 49 4c 45 5f 52 44 4f 4e 4c 59 29 3d 3d 30 20  FILE_RDONLY)==0 
1f920 29 7b 0a 20 20 20 20 20 20 70 72 6f 74 65 63 74  ){.      protect
1f930 20 3d 20 50 41 47 45 5f 52 45 41 44 57 52 49 54   = PAGE_READWRIT
1f940 45 3b 0a 20 20 20 20 20 20 66 6c 61 67 73 20 7c  E;.      flags |
1f950 3d 20 46 49 4c 45 5f 4d 41 50 5f 57 52 49 54 45  = FILE_MAP_WRITE
1f960 3b 0a 20 20 20 20 7d 0a 23 69 66 20 53 51 4c 49  ;.    }.#if SQLI
1f970 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20  TE_OS_WINRT.    
1f980 70 46 64 2d 3e 68 4d 61 70 20 3d 20 6f 73 43 72  pFd->hMap = osCr
1f990 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 46  eateFileMappingF
1f9a0 72 6f 6d 41 70 70 28 70 46 64 2d 3e 68 2c 20 4e  romApp(pFd->h, N
1f9b0 55 4c 4c 2c 20 70 72 6f 74 65 63 74 2c 20 6e 4d  ULL, protect, nM
1f9c0 61 70 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6c 69 66  ap, NULL);.#elif
1f9d0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1f9e0 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a  WIN32_HAS_WIDE).
1f9f0 20 20 20 20 70 46 64 2d 3e 68 4d 61 70 20 3d 20      pFd->hMap = 
1fa00 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70  osCreateFileMapp
1fa10 69 6e 67 57 28 70 46 64 2d 3e 68 2c 20 4e 55 4c  ingW(pFd->h, NUL
1fa20 4c 2c 20 70 72 6f 74 65 63 74 2c 0a 20 20 20 20  L, protect,.    
1fa30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa40 20 20 20 20 20 20 20 20 20 20 20 20 28 44 57 4f              (DWO
1fa50 52 44 29 28 28 6e 4d 61 70 3e 3e 33 32 29 20 26  RD)((nMap>>32) &
1fa60 20 30 78 66 66 66 66 66 66 66 66 29 2c 0a 20 20   0xffffffff),.  
1fa70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 44                (D
1fa90 57 4f 52 44 29 28 6e 4d 61 70 20 26 20 30 78 66  WORD)(nMap & 0xf
1faa0 66 66 66 66 66 66 66 29 2c 20 4e 55 4c 4c 29 3b  fffffff), NULL);
1fab0 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 53  .#elif defined(S
1fac0 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
1fad0 41 4e 53 49 29 0a 20 20 20 20 70 46 64 2d 3e 68  ANSI).    pFd->h
1fae0 4d 61 70 20 3d 20 6f 73 43 72 65 61 74 65 46 69  Map = osCreateFi
1faf0 6c 65 4d 61 70 70 69 6e 67 41 28 70 46 64 2d 3e  leMappingA(pFd->
1fb00 68 2c 20 4e 55 4c 4c 2c 20 70 72 6f 74 65 63 74  h, NULL, protect
1fb10 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1fb20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb30 20 20 28 44 57 4f 52 44 29 28 28 6e 4d 61 70 3e    (DWORD)((nMap>
1fb40 3e 33 32 29 20 26 20 30 78 66 66 66 66 66 66 66  >32) & 0xfffffff
1fb50 66 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  f),.            
1fb60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb70 20 20 20 20 28 44 57 4f 52 44 29 28 6e 4d 61 70      (DWORD)(nMap
1fb80 20 26 20 30 78 66 66 66 66 66 66 66 66 29 2c 20   & 0xffffffff), 
1fb90 4e 55 4c 4c 29 3b 0a 23 65 6e 64 69 66 0a 20 20  NULL);.#endif.  
1fba0 20 20 69 66 28 20 70 46 64 2d 3e 68 4d 61 70 3d    if( pFd->hMap=
1fbb0 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 70  =NULL ){.      p
1fbc0 46 64 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  Fd->lastErrno = 
1fbd0 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
1fbe0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e  ;.      rc = win
1fbf0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
1fc00 49 4f 45 52 52 5f 4d 4d 41 50 2c 20 70 46 64 2d  IOERR_MMAP, pFd-
1fc10 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20  >lastErrno,.    
1fc20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fc30 20 20 20 22 77 69 6e 4d 61 70 66 69 6c 65 31 22     "winMapfile1"
1fc40 2c 20 70 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20  , pFd->zPath);. 
1fc50 20 20 20 20 20 2f 2a 20 4c 6f 67 20 74 68 65 20       /* Log the 
1fc60 65 72 72 6f 72 2c 20 62 75 74 20 63 6f 6e 74 69  error, but conti
1fc70 6e 75 65 20 6e 6f 72 6d 61 6c 20 6f 70 65 72 61  nue normal opera
1fc80 74 69 6f 6e 20 75 73 69 6e 67 20 78 52 65 61 64  tion using xRead
1fc90 2f 78 57 72 69 74 65 20 2a 2f 0a 20 20 20 20 20  /xWrite */.     
1fca0 20 4f 53 54 52 41 43 45 28 28 22 4d 41 50 2d 46   OSTRACE(("MAP-F
1fcb0 49 4c 45 2d 43 52 45 41 54 45 20 70 69 64 3d 25  ILE-CREATE pid=%
1fcc0 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72 63  lu, pFile=%p, rc
1fcd0 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%s\n",.        
1fce0 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72         osGetCurr
1fcf0 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
1fd00 70 46 64 2c 20 73 71 6c 69 74 65 33 45 72 72 4e  pFd, sqlite3ErrN
1fd10 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 20 20 20  ame(rc)));.     
1fd20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1fd30 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  K;.    }.    ass
1fd40 65 72 74 28 20 28 6e 4d 61 70 20 25 20 77 69 6e  ert( (nMap % win
1fd50 53 79 73 49 6e 66 6f 2e 64 77 50 61 67 65 53 69  SysInfo.dwPageSi
1fd60 7a 65 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  ze)==0 );.    as
1fd70 73 65 72 74 28 20 73 69 7a 65 6f 66 28 53 49 5a  sert( sizeof(SIZ
1fd80 45 5f 54 29 3d 3d 73 69 7a 65 6f 66 28 73 71 6c  E_T)==sizeof(sql
1fd90 69 74 65 33 5f 69 6e 74 36 34 29 20 7c 7c 20 6e  ite3_int64) || n
1fda0 4d 61 70 3c 3d 30 78 66 66 66 66 66 66 66 66 20  Map<=0xffffffff 
1fdb0 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  );.#if SQLITE_OS
1fdc0 5f 57 49 4e 52 54 0a 20 20 20 20 70 4e 65 77 20  _WINRT.    pNew 
1fdd0 3d 20 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 6c  = osMapViewOfFil
1fde0 65 46 72 6f 6d 41 70 70 28 70 46 64 2d 3e 68 4d  eFromApp(pFd->hM
1fdf0 61 70 2c 20 66 6c 61 67 73 2c 20 30 2c 20 28 53  ap, flags, 0, (S
1fe00 49 5a 45 5f 54 29 6e 4d 61 70 29 3b 0a 23 65 6c  IZE_T)nMap);.#el
1fe10 73 65 0a 20 20 20 20 70 4e 65 77 20 3d 20 6f 73  se.    pNew = os
1fe20 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 28 70 46  MapViewOfFile(pF
1fe30 64 2d 3e 68 4d 61 70 2c 20 66 6c 61 67 73 2c 20  d->hMap, flags, 
1fe40 30 2c 20 30 2c 20 28 53 49 5a 45 5f 54 29 6e 4d  0, 0, (SIZE_T)nM
1fe50 61 70 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  ap);.#endif.    
1fe60 69 66 28 20 70 4e 65 77 3d 3d 4e 55 4c 4c 20 29  if( pNew==NULL )
1fe70 7b 0a 20 20 20 20 20 20 6f 73 43 6c 6f 73 65 48  {.      osCloseH
1fe80 61 6e 64 6c 65 28 70 46 64 2d 3e 68 4d 61 70 29  andle(pFd->hMap)
1fe90 3b 0a 20 20 20 20 20 20 70 46 64 2d 3e 68 4d 61  ;.      pFd->hMa
1fea0 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 20 20  p = NULL;.      
1feb0 70 46 64 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  pFd->lastErrno =
1fec0 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
1fed0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69  );.      rc = wi
1fee0 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
1fef0 5f 49 4f 45 52 52 5f 4d 4d 41 50 2c 20 70 46 64  _IOERR_MMAP, pFd
1ff00 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20  ->lastErrno,.   
1ff10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff20 20 20 20 20 22 77 69 6e 4d 61 70 66 69 6c 65 32      "winMapfile2
1ff30 22 2c 20 70 46 64 2d 3e 7a 50 61 74 68 29 3b 0a  ", pFd->zPath);.
1ff40 20 20 20 20 20 20 2f 2a 20 4c 6f 67 20 74 68 65        /* Log the
1ff50 20 65 72 72 6f 72 2c 20 62 75 74 20 63 6f 6e 74   error, but cont
1ff60 69 6e 75 65 20 6e 6f 72 6d 61 6c 20 6f 70 65 72  inue normal oper
1ff70 61 74 69 6f 6e 20 75 73 69 6e 67 20 78 52 65 61  ation using xRea
1ff80 64 2f 78 57 72 69 74 65 20 2a 2f 0a 20 20 20 20  d/xWrite */.    
1ff90 20 20 4f 53 54 52 41 43 45 28 28 22 4d 41 50 2d    OSTRACE(("MAP-
1ffa0 46 49 4c 45 2d 4d 41 50 20 70 69 64 3d 25 6c 75  FILE-MAP pid=%lu
1ffb0 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d 25  , pFile=%p, rc=%
1ffc0 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
1ffd0 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e       osGetCurren
1ffe0 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46  tProcessId(), pF
1fff0 64 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d  d, sqlite3ErrNam
20000 65 28 72 63 29 29 29 3b 0a 20 20 20 20 20 20 72  e(rc)));.      r
20010 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
20020 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 64 2d 3e  .    }.    pFd->
20030 70 4d 61 70 52 65 67 69 6f 6e 20 3d 20 70 4e 65  pMapRegion = pNe
20040 77 3b 0a 20 20 20 20 70 46 64 2d 3e 6d 6d 61 70  w;.    pFd->mmap
20050 53 69 7a 65 20 3d 20 6e 4d 61 70 3b 0a 20 20 20  Size = nMap;.   
20060 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63   pFd->mmapSizeAc
20070 74 75 61 6c 20 3d 20 6e 4d 61 70 3b 0a 20 20 7d  tual = nMap;.  }
20080 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4d 41  ..  OSTRACE(("MA
20090 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c 75 2c 20  P-FILE pid=%lu, 
200a0 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c  pFile=%p, rc=SQL
200b0 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20  ITE_OK\n",.     
200c0 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65        osGetCurre
200d0 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70  ntProcessId(), p
200e0 46 64 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  Fd));.  return S
200f0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
20100 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58  if /* SQLITE_MAX
20110 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a  _MMAP_SIZE>0 */.
20120 0a 2f 2a 0a 2a 2a 20 49 66 20 70 6f 73 73 69 62  ./*.** If possib
20130 6c 65 2c 20 72 65 74 75 72 6e 20 61 20 70 6f 69  le, return a poi
20140 6e 74 65 72 20 74 6f 20 61 20 6d 61 70 70 69 6e  nter to a mappin
20150 67 20 6f 66 20 66 69 6c 65 20 66 64 20 73 74 61  g of file fd sta
20160 72 74 69 6e 67 20 61 74 20 6f 66 66 73 65 74 0a  rting at offset.
20170 2a 2a 20 69 4f 66 66 2e 20 54 68 65 20 6d 61 70  ** iOff. The map
20180 70 69 6e 67 20 6d 75 73 74 20 62 65 20 76 61 6c  ping must be val
20190 69 64 20 66 6f 72 20 61 74 20 6c 65 61 73 74 20  id for at least 
201a0 6e 41 6d 74 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a  nAmt bytes..**.*
201b0 2a 20 49 66 20 73 75 63 68 20 61 20 70 6f 69 6e  * If such a poin
201c0 74 65 72 20 63 61 6e 20 62 65 20 6f 62 74 61 69  ter can be obtai
201d0 6e 65 64 2c 20 73 74 6f 72 65 20 69 74 20 69 6e  ned, store it in
201e0 20 2a 70 70 20 61 6e 64 20 72 65 74 75 72 6e 20   *pp and return 
201f0 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 4f 72  SQLITE_OK..** Or
20200 2c 20 69 66 20 6f 6e 65 20 63 61 6e 6e 6f 74 20  , if one cannot 
20210 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63  but no error occ
20220 75 72 73 2c 20 73 65 74 20 2a 70 70 20 74 6f 20  urs, set *pp to 
20230 30 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  0 and return SQL
20240 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 46 69 6e 61 6c  ITE_OK..** Final
20250 6c 79 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20  ly, if an error 
20260 64 6f 65 73 20 6f 63 63 75 72 2c 20 72 65 74 75  does occur, retu
20270 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  rn an SQLite err
20280 6f 72 20 63 6f 64 65 2e 20 54 68 65 20 66 69 6e  or code. The fin
20290 61 6c 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 2a  al.** value of *
202a0 70 70 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20  pp is undefined 
202b0 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a  in this case..**
202c0 0a 2a 2a 20 49 66 20 74 68 69 73 20 66 75 6e 63  .** If this func
202d0 74 69 6f 6e 20 64 6f 65 73 20 72 65 74 75 72 6e  tion does return
202e0 20 61 20 70 6f 69 6e 74 65 72 2c 20 74 68 65 20   a pointer, the 
202f0 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 76 65 6e  caller must even
20300 74 75 61 6c 6c 79 0a 2a 2a 20 72 65 6c 65 61 73  tually.** releas
20310 65 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  e the reference 
20320 62 79 20 63 61 6c 6c 69 6e 67 20 77 69 6e 55 6e  by calling winUn
20330 66 65 74 63 68 28 29 2e 0a 2a 2f 0a 73 74 61 74  fetch()..*/.stat
20340 69 63 20 69 6e 74 20 77 69 6e 46 65 74 63 68 28  ic int winFetch(
20350 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
20360 2c 20 69 36 34 20 69 4f 66 66 2c 20 69 6e 74 20  , i64 iOff, int 
20370 6e 41 6d 74 2c 20 76 6f 69 64 20 2a 2a 70 70 29  nAmt, void **pp)
20380 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  {.#if SQLITE_MAX
20390 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 77  _MMAP_SIZE>0.  w
203a0 69 6e 46 69 6c 65 20 2a 70 46 64 20 3d 20 28 77  inFile *pFd = (w
203b0 69 6e 46 69 6c 65 2a 29 66 64 3b 20 20 20 2f 2a  inFile*)fd;   /*
203c0 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   The underlying 
203d0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
203e0 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70 20 3d 20  .#endif.  *pp = 
203f0 30 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22  0;..  OSTRACE(("
20400 46 45 54 43 48 20 70 69 64 3d 25 6c 75 2c 20 70  FETCH pid=%lu, p
20410 46 69 6c 65 3d 25 70 2c 20 6f 66 66 73 65 74 3d  File=%p, offset=
20420 25 6c 6c 64 2c 20 61 6d 6f 75 6e 74 3d 25 64 2c  %lld, amount=%d,
20430 20 70 70 3d 25 70 5c 6e 22 2c 0a 20 20 20 20 20   pp=%p\n",.     
20440 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65        osGetCurre
20450 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 66  ntProcessId(), f
20460 64 2c 20 69 4f 66 66 2c 20 6e 41 6d 74 2c 20 70  d, iOff, nAmt, p
20470 70 29 29 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45  p));..#if SQLITE
20480 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
20490 0a 20 20 69 66 28 20 70 46 64 2d 3e 6d 6d 61 70  .  if( pFd->mmap
204a0 53 69 7a 65 4d 61 78 3e 30 20 29 7b 0a 20 20 20  SizeMax>0 ){.   
204b0 20 69 66 28 20 70 46 64 2d 3e 70 4d 61 70 52 65   if( pFd->pMapRe
204c0 67 69 6f 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  gion==0 ){.     
204d0 20 69 6e 74 20 72 63 20 3d 20 77 69 6e 4d 61 70   int rc = winMap
204e0 66 69 6c 65 28 70 46 64 2c 20 2d 31 29 3b 0a 20  file(pFd, -1);. 
204f0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
20500 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
20510 20 20 4f 53 54 52 41 43 45 28 28 22 46 45 54 43    OSTRACE(("FETC
20520 48 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65  H pid=%lu, pFile
20530 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20  =%p, rc=%s\n",. 
20540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20550 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
20560 65 73 73 49 64 28 29 2c 20 70 46 64 2c 20 73 71  essId(), pFd, sq
20570 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29  lite3ErrName(rc)
20580 29 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ));.        retu
20590 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
205a0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46 64     }.    if( pFd
205b0 2d 3e 6d 6d 61 70 53 69 7a 65 20 3e 3d 20 69 4f  ->mmapSize >= iO
205c0 66 66 2b 6e 41 6d 74 20 29 7b 0a 20 20 20 20 20  ff+nAmt ){.     
205d0 20 2a 70 70 20 3d 20 26 28 28 75 38 20 2a 29 70   *pp = &((u8 *)p
205e0 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 5b  Fd->pMapRegion)[
205f0 69 4f 66 66 5d 3b 0a 20 20 20 20 20 20 70 46 64  iOff];.      pFd
20600 2d 3e 6e 46 65 74 63 68 4f 75 74 2b 2b 3b 0a 20  ->nFetchOut++;. 
20610 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
20620 0a 20 20 4f 53 54 52 41 43 45 28 28 22 46 45 54  .  OSTRACE(("FET
20630 43 48 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c  CH pid=%lu, pFil
20640 65 3d 25 70 2c 20 70 70 3d 25 70 2c 20 2a 70 70  e=%p, pp=%p, *pp
20650 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f  =%p, rc=SQLITE_O
20660 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  K\n",.          
20670 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
20680 63 65 73 73 49 64 28 29 2c 20 66 64 2c 20 70 70  cessId(), fd, pp
20690 2c 20 2a 70 70 29 29 3b 0a 20 20 72 65 74 75 72  , *pp));.  retur
206a0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
206b0 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 74 68 69  /*.** If the thi
206c0 72 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e  rd argument is n
206d0 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68  on-NULL, then th
206e0 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 6c 65  is function rele
206f0 61 73 65 73 20 61 0a 2a 2a 20 72 65 66 65 72 65  ases a.** refere
20700 6e 63 65 20 6f 62 74 61 69 6e 65 64 20 62 79 20  nce obtained by 
20710 61 6e 20 65 61 72 6c 69 65 72 20 63 61 6c 6c 20  an earlier call 
20720 74 6f 20 77 69 6e 46 65 74 63 68 28 29 2e 20 54  to winFetch(). T
20730 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 61 72 67  he second.** arg
20740 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20  ument passed to 
20750 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 75  this function mu
20760 73 74 20 62 65 20 74 68 65 20 73 61 6d 65 20 61  st be the same a
20770 73 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  s the correspond
20780 69 6e 67 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20  ing.** argument 
20790 74 68 61 74 20 77 61 73 20 70 61 73 73 65 64 20  that was passed 
207a0 74 6f 20 74 68 65 20 77 69 6e 46 65 74 63 68 28  to the winFetch(
207b0 29 20 69 6e 76 6f 63 61 74 69 6f 6e 2e 0a 2a 2a  ) invocation..**
207c0 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65 20 74  .** Or, if the t
207d0 68 69 72 64 20 61 72 67 75 6d 65 6e 74 20 69 73  hird argument is
207e0 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73   NULL, then this
207f0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 62 65 69   function is bei
20800 6e 67 20 63 61 6c 6c 65 64 0a 2a 2a 20 74 6f 20  ng called.** to 
20810 69 6e 66 6f 72 6d 20 74 68 65 20 56 46 53 20 6c  inform the VFS l
20820 61 79 65 72 20 74 68 61 74 2c 20 61 63 63 6f 72  ayer that, accor
20830 64 69 6e 67 20 74 6f 20 50 4f 53 49 58 2c 20 61  ding to POSIX, a
20840 6e 79 20 65 78 69 73 74 69 6e 67 20 6d 61 70 70  ny existing mapp
20850 69 6e 67 0a 2a 2a 20 6d 61 79 20 6e 6f 77 20 62  ing.** may now b
20860 65 20 69 6e 76 61 6c 69 64 20 61 6e 64 20 73 68  e invalid and sh
20870 6f 75 6c 64 20 62 65 20 75 6e 6d 61 70 70 65 64  ould be unmapped
20880 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
20890 77 69 6e 55 6e 66 65 74 63 68 28 73 71 6c 69 74  winUnfetch(sqlit
208a0 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34  e3_file *fd, i64
208b0 20 69 4f 66 66 2c 20 76 6f 69 64 20 2a 70 29 7b   iOff, void *p){
208c0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
208d0 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 77 69  MMAP_SIZE>0.  wi
208e0 6e 46 69 6c 65 20 2a 70 46 64 20 3d 20 28 77 69  nFile *pFd = (wi
208f0 6e 46 69 6c 65 2a 29 66 64 3b 20 20 20 2f 2a 20  nFile*)fd;   /* 
20900 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64  The underlying d
20910 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
20920 0a 20 20 2f 2a 20 49 66 20 70 3d 3d 30 20 28 75  .  /* If p==0 (u
20930 6e 6d 61 70 20 74 68 65 20 65 6e 74 69 72 65 20  nmap the entire 
20940 66 69 6c 65 29 20 74 68 65 6e 20 74 68 65 72 65  file) then there
20950 20 6d 75 73 74 20 62 65 20 6e 6f 20 6f 75 74 73   must be no outs
20960 74 61 6e 64 69 6e 67 0a 20 20 2a 2a 20 78 46 65  tanding.  ** xFe
20970 74 63 68 20 72 65 66 65 72 65 6e 63 65 73 2e 20  tch references. 
20980 4f 72 2c 20 69 66 20 70 21 3d 30 20 28 6d 65 61  Or, if p!=0 (mea
20990 6e 69 6e 67 20 69 74 20 69 73 20 61 6e 20 78 46  ning it is an xF
209a0 65 74 63 68 20 72 65 66 65 72 65 6e 63 65 29 2c  etch reference),
209b0 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65  .  ** then there
209c0 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73   must be at leas
209d0 74 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e  t one outstandin
209e0 67 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  g.  */.  assert(
209f0 20 28 70 3d 3d 30 29 3d 3d 28 70 46 64 2d 3e 6e   (p==0)==(pFd->n
20a00 46 65 74 63 68 4f 75 74 3d 3d 30 29 20 29 3b 0a  FetchOut==0) );.
20a10 0a 20 20 2f 2a 20 49 66 20 70 21 3d 30 2c 20 69  .  /* If p!=0, i
20a20 74 20 6d 75 73 74 20 6d 61 74 63 68 20 74 68 65  t must match the
20a30 20 69 4f 66 66 20 76 61 6c 75 65 2e 20 2a 2f 0a   iOff value. */.
20a40 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20 7c    assert( p==0 |
20a50 7c 20 70 3d 3d 26 28 28 75 38 20 2a 29 70 46 64  | p==&((u8 *)pFd
20a60 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 5b 69 4f  ->pMapRegion)[iO
20a70 66 66 5d 20 29 3b 0a 0a 20 20 4f 53 54 52 41 43  ff] );..  OSTRAC
20a80 45 28 28 22 55 4e 46 45 54 43 48 20 70 69 64 3d  E(("UNFETCH pid=
20a90 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 6f  %lu, pFile=%p, o
20aa0 66 66 73 65 74 3d 25 6c 6c 64 2c 20 70 3d 25 70  ffset=%lld, p=%p
20ab0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
20ac0 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
20ad0 65 73 73 49 64 28 29 2c 20 70 46 64 2c 20 69 4f  essId(), pFd, iO
20ae0 66 66 2c 20 70 29 29 3b 0a 0a 20 20 69 66 28 20  ff, p));..  if( 
20af0 70 20 29 7b 0a 20 20 20 20 70 46 64 2d 3e 6e 46  p ){.    pFd->nF
20b00 65 74 63 68 4f 75 74 2d 2d 3b 0a 20 20 7d 65 6c  etchOut--;.  }el
20b10 73 65 7b 0a 20 20 20 20 2f 2a 20 46 49 58 4d 45  se{.    /* FIXME
20b20 3a 20 20 49 66 20 57 69 6e 64 6f 77 73 20 74 72  :  If Windows tr
20b30 75 6c 79 20 61 6c 77 61 79 73 20 70 72 65 76 65  uly always preve
20b40 6e 74 73 20 74 72 75 6e 63 61 74 69 6e 67 20 6f  nts truncating o
20b50 72 20 64 65 6c 65 74 69 6e 67 20 61 0a 20 20 20  r deleting a.   
20b60 20 2a 2a 20 66 69 6c 65 20 77 68 69 6c 65 20 61   ** file while a
20b70 20 6d 61 70 70 69 6e 67 20 69 73 20 68 65 6c 64   mapping is held
20b80 2c 20 74 68 65 6e 20 74 68 65 20 66 6f 6c 6c 6f  , then the follo
20b90 77 69 6e 67 20 77 69 6e 55 6e 6d 61 70 66 69 6c  wing winUnmapfil
20ba0 65 28 29 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20  e() call.    ** 
20bb0 69 73 20 75 6e 6e 65 63 65 73 73 61 72 79 20 63  is unnecessary c
20bc0 61 6e 20 62 65 20 6f 6d 69 74 74 65 64 20 2d 20  an be omitted - 
20bd0 70 6f 74 65 6e 74 69 61 6c 6c 79 20 69 6d 70 72  potentially impr
20be0 6f 76 69 6e 67 0a 20 20 20 20 2a 2a 20 70 65 72  oving.    ** per
20bf0 66 6f 72 6d 61 6e 63 65 2e 20 20 2a 2f 0a 20 20  formance.  */.  
20c00 20 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28 70    winUnmapfile(p
20c10 46 64 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  Fd);.  }..  asse
20c20 72 74 28 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f  rt( pFd->nFetchO
20c30 75 74 3e 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a  ut>=0 );.#endif.
20c40 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 46  .  OSTRACE(("UNF
20c50 45 54 43 48 20 70 69 64 3d 25 6c 75 2c 20 70 46  ETCH pid=%lu, pF
20c60 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  ile=%p, rc=SQLIT
20c70 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20  E_OK\n",.       
20c80 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74      osGetCurrent
20c90 50 72 6f 63 65 73 73 49 64 28 29 2c 20 66 64 29  ProcessId(), fd)
20ca0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
20cb0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
20cc0 48 65 72 65 20 65 6e 64 73 20 74 68 65 20 69 6d  Here ends the im
20cd0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
20ce0 61 6c 6c 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  all sqlite3_file
20cf0 20 6d 65 74 68 6f 64 73 2e 0a 2a 2a 0a 2a 2a 2a   methods..**.***
20d00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20d10 2a 2a 2a 20 45 6e 64 20 73 71 6c 69 74 65 33 5f  *** End sqlite3_
20d20 66 69 6c 65 20 4d 65 74 68 6f 64 73 20 2a 2a 2a  file Methods ***
20d30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20d40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
20d50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20d60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20d70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20d80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20d90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
20da0 0a 2a 2a 20 54 68 69 73 20 76 65 63 74 6f 72 20  .** This vector 
20db0 64 65 66 69 6e 65 73 20 61 6c 6c 20 74 68 65 20  defines all the 
20dc0 6d 65 74 68 6f 64 73 20 74 68 61 74 20 63 61 6e  methods that can
20dd0 20 6f 70 65 72 61 74 65 20 6f 6e 20 61 6e 0a 2a   operate on an.*
20de0 2a 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 66  * sqlite3_file f
20df0 6f 72 20 77 69 6e 33 32 2e 0a 2a 2f 0a 73 74 61  or win32..*/.sta
20e00 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
20e10 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 77 69 6e  3_io_methods win
20e20 49 6f 4d 65 74 68 6f 64 20 3d 20 7b 0a 20 20 33  IoMethod = {.  3
20e30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
20e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20e50 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20  * iVersion */.  
20e60 77 69 6e 43 6c 6f 73 65 2c 20 20 20 20 20 20 20  winClose,       
20e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20e80 2f 2a 20 78 43 6c 6f 73 65 20 2a 2f 0a 20 20 77  /* xClose */.  w
20e90 69 6e 52 65 61 64 2c 20 20 20 20 20 20 20 20 20  inRead,         
20ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20eb0 2a 20 78 52 65 61 64 20 2a 2f 0a 20 20 77 69 6e  * xRead */.  win
20ec0 57 72 69 74 65 2c 20 20 20 20 20 20 20 20 20 20  Write,          
20ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20ee0 78 57 72 69 74 65 20 2a 2f 0a 20 20 77 69 6e 54  xWrite */.  winT
20ef0 72 75 6e 63 61 74 65 2c 20 20 20 20 20 20 20 20  runcate,        
20f00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
20f10 54 72 75 6e 63 61 74 65 20 2a 2f 0a 20 20 77 69  Truncate */.  wi
20f20 6e 53 79 6e 63 2c 20 20 20 20 20 20 20 20 20 20  nSync,          
20f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20f40 20 78 53 79 6e 63 20 2a 2f 0a 20 20 77 69 6e 46   xSync */.  winF
20f50 69 6c 65 53 69 7a 65 2c 20 20 20 20 20 20 20 20  ileSize,        
20f60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
20f70 46 69 6c 65 53 69 7a 65 20 2a 2f 0a 20 20 77 69  FileSize */.  wi
20f80 6e 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  nLock,          
20f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20fa0 20 78 4c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e 55   xLock */.  winU
20fb0 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  nlock,          
20fc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
20fd0 55 6e 6c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e 43  Unlock */.  winC
20fe0 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
20ff0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78  ,           /* x
21000 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
21010 6b 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 43 6f  k */.  winFileCo
21020 6e 74 72 6f 6c 2c 20 20 20 20 20 20 20 20 20 20  ntrol,          
21030 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 43         /* xFileC
21040 6f 6e 74 72 6f 6c 20 2a 2f 0a 20 20 77 69 6e 53  ontrol */.  winS
21050 65 63 74 6f 72 53 69 7a 65 2c 20 20 20 20 20 20  ectorSize,      
21060 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
21070 53 65 63 74 6f 72 53 69 7a 65 20 2a 2f 0a 20 20  SectorSize */.  
21080 77 69 6e 44 65 76 69 63 65 43 68 61 72 61 63 74  winDeviceCharact
21090 65 72 69 73 74 69 63 73 2c 20 20 20 20 20 20 20  eristics,       
210a0 2f 2a 20 78 44 65 76 69 63 65 43 68 61 72 61 63  /* xDeviceCharac
210b0 74 65 72 69 73 74 69 63 73 20 2a 2f 0a 20 20 77  teristics */.  w
210c0 69 6e 53 68 6d 4d 61 70 2c 20 20 20 20 20 20 20  inShmMap,       
210d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
210e0 2a 20 78 53 68 6d 4d 61 70 20 2a 2f 0a 20 20 77  * xShmMap */.  w
210f0 69 6e 53 68 6d 4c 6f 63 6b 2c 20 20 20 20 20 20  inShmLock,      
21100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21110 2a 20 78 53 68 6d 4c 6f 63 6b 20 2a 2f 0a 20 20  * xShmLock */.  
21120 77 69 6e 53 68 6d 42 61 72 72 69 65 72 2c 20 20  winShmBarrier,  
21130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21140 2f 2a 20 78 53 68 6d 42 61 72 72 69 65 72 20 2a  /* xShmBarrier *
21150 2f 0a 20 20 77 69 6e 53 68 6d 55 6e 6d 61 70 2c  /.  winShmUnmap,
21160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21170 20 20 20 20 2f 2a 20 78 53 68 6d 55 6e 6d 61 70      /* xShmUnmap
21180 20 2a 2f 0a 20 20 77 69 6e 46 65 74 63 68 2c 20   */.  winFetch, 
21190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
211a0 20 20 20 20 20 20 2f 2a 20 78 46 65 74 63 68 20        /* xFetch 
211b0 2a 2f 0a 20 20 77 69 6e 55 6e 66 65 74 63 68 20  */.  winUnfetch 
211c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
211d0 20 20 20 20 20 2f 2a 20 78 55 6e 66 65 74 63 68       /* xUnfetch
211e0 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a   */.};../*******
211f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21200 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21210 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21220 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21230 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
21240 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21250 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d  ** sqlite3_vfs m
21260 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ethods *********
21270 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21280 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 64  ***.**.** This d
21290 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73  ivision contains
212a0 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   the implementat
212b0 69 6f 6e 20 6f 66 20 6d 65 74 68 6f 64 73 20 6f  ion of methods o
212c0 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33  n the.** sqlite3
212d0 5f 76 66 73 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a  _vfs object..*/.
212e0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 43  .#if defined(__C
212f0 59 47 57 49 4e 5f 5f 29 0a 2f 2a 0a 2a 2a 20 43  YGWIN__)./*.** C
21300 6f 6e 76 65 72 74 20 61 20 66 69 6c 65 6e 61 6d  onvert a filenam
21310 65 20 66 72 6f 6d 20 77 68 61 74 65 76 65 72 20  e from whatever 
21320 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6f  the underlying o
21330 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 0a  perating system.
21340 2a 2a 20 73 75 70 70 6f 72 74 73 20 66 6f 72 20  ** supports for 
21350 66 69 6c 65 6e 61 6d 65 73 20 69 6e 74 6f 20 55  filenames into U
21360 54 46 2d 38 2e 20 20 53 70 61 63 65 20 74 6f 20  TF-8.  Space to 
21370 68 6f 6c 64 20 74 68 65 20 72 65 73 75 6c 74 20  hold the result 
21380 69 73 0a 2a 2a 20 6f 62 74 61 69 6e 65 64 20 66  is.** obtained f
21390 72 6f 6d 20 6d 61 6c 6c 6f 63 20 61 6e 64 20 6d  rom malloc and m
213a0 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20  ust be freed by 
213b0 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  the calling func
213c0 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
213d0 63 68 61 72 20 2a 77 69 6e 43 6f 6e 76 65 72 74  char *winConvert
213e0 54 6f 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 63  ToUtf8Filename(c
213f0 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 46 69 6c 65  onst void *zFile
21400 6e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a  name){.  char *z
21410 43 6f 6e 76 65 72 74 65 64 20 3d 20 30 3b 0a 20  Converted = 0;. 
21420 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b   if( osIsNT() ){
21430 0a 20 20 20 20 7a 43 6f 6e 76 65 72 74 65 64 20  .    zConverted 
21440 3d 20 77 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74  = winUnicodeToUt
21450 66 38 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  f8(zFilename);. 
21460 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
21470 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a  _WIN32_HAS_ANSI.
21480 20 20 65 6c 73 65 7b 0a 20 20 20 20 7a 43 6f 6e    else{.    zCon
21490 76 65 72 74 65 64 20 3d 20 73 71 6c 69 74 65 33  verted = sqlite3
214a0 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75  _win32_mbcs_to_u
214b0 74 66 38 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  tf8(zFilename);.
214c0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20    }.#endif.  /* 
214d0 63 61 6c 6c 65 72 20 77 69 6c 6c 20 68 61 6e 64  caller will hand
214e0 6c 65 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  le out of memory
214f0 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 7a 43 6f   */.  return zCo
21500 6e 76 65 72 74 65 64 3b 0a 7d 0a 23 65 6e 64 69  nverted;.}.#endi
21510 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  f../*.** Convert
21520 20 61 20 55 54 46 2d 38 20 66 69 6c 65 6e 61 6d   a UTF-8 filenam
21530 65 20 69 6e 74 6f 20 77 68 61 74 65 76 65 72 20  e into whatever 
21540 66 6f 72 6d 20 74 68 65 20 75 6e 64 65 72 6c 79  form the underly
21550 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6e 67  ing.** operating
21560 20 73 79 73 74 65 6d 20 77 61 6e 74 73 20 66 69   system wants fi
21570 6c 65 6e 61 6d 65 73 20 69 6e 2e 20 20 53 70 61  lenames in.  Spa
21580 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72  ce to hold the r
21590 65 73 75 6c 74 0a 2a 2a 20 69 73 20 6f 62 74 61  esult.** is obta
215a0 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63  ined from malloc
215b0 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65   and must be fre
215c0 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e  ed by the callin
215d0 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  g.** function..*
215e0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 77  /.static void *w
215f0 69 6e 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66  inConvertFromUtf
21600 38 46 69 6c 65 6e 61 6d 65 28 63 6f 6e 73 74 20  8Filename(const 
21610 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29  char *zFilename)
21620 7b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65  {.  void *zConve
21630 72 74 65 64 20 3d 20 30 3b 0a 20 20 69 66 28 20  rted = 0;.  if( 
21640 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 20 20 20  osIsNT() ){.    
21650 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77 69 6e  zConverted = win
21660 55 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a 46  Utf8ToUnicode(zF
21670 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 23 69  ilename);.  }.#i
21680 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  fdef SQLITE_WIN3
21690 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73  2_HAS_ANSI.  els
216a0 65 7b 0a 20 20 20 20 7a 43 6f 6e 76 65 72 74 65  e{.    zConverte
216b0 64 20 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e 33  d = sqlite3_win3
216c0 32 5f 75 74 66 38 5f 74 6f 5f 6d 62 63 73 28 7a  2_utf8_to_mbcs(z
216d0 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 23  Filename);.  }.#
216e0 65 6e 64 69 66 0a 20 20 2f 2a 20 63 61 6c 6c 65  endif.  /* calle
216f0 72 20 77 69 6c 6c 20 68 61 6e 64 6c 65 20 6f 75  r will handle ou
21700 74 20 6f 66 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20  t of memory */. 
21710 20 72 65 74 75 72 6e 20 7a 43 6f 6e 76 65 72 74   return zConvert
21720 65 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ed;.}../*.** Thi
21730 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
21740 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74  ns non-zero if t
21750 68 65 20 73 70 65 63 69 66 69 65 64 20 55 54 46  he specified UTF
21760 2d 38 20 73 74 72 69 6e 67 20 62 75 66 66 65 72  -8 string buffer
21770 0a 2a 2a 20 65 6e 64 73 20 77 69 74 68 20 61 20  .** ends with a 
21780 64 69 72 65 63 74 6f 72 79 20 73 65 70 61 72 61  directory separa
21790 74 6f 72 20 63 68 61 72 61 63 74 65 72 20 6f 72  tor character or
217a0 20 6f 6e 65 20 77 61 73 20 73 75 63 63 65 73 73   one was success
217b0 66 75 6c 6c 79 0a 2a 2a 20 61 64 64 65 64 20 74  fully.** added t
217c0 6f 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o it..*/.static 
217d0 69 6e 74 20 77 69 6e 4d 61 6b 65 45 6e 64 49 6e  int winMakeEndIn
217e0 44 69 72 53 65 70 28 69 6e 74 20 6e 42 75 66 2c  DirSep(int nBuf,
217f0 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20   char *zBuf){.  
21800 69 66 28 20 7a 42 75 66 20 29 7b 0a 20 20 20 20  if( zBuf ){.    
21810 69 6e 74 20 6e 4c 65 6e 20 3d 20 73 71 6c 69 74  int nLen = sqlit
21820 65 33 53 74 72 6c 65 6e 33 30 28 7a 42 75 66 29  e3Strlen30(zBuf)
21830 3b 0a 20 20 20 20 69 66 28 20 6e 4c 65 6e 3e 30  ;.    if( nLen>0
21840 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 77 69   ){.      if( wi
21850 6e 49 73 44 69 72 53 65 70 28 7a 42 75 66 5b 6e  nIsDirSep(zBuf[n
21860 4c 65 6e 2d 31 5d 29 20 29 7b 0a 20 20 20 20 20  Len-1]) ){.     
21870 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
21880 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 4c 65     }else if( nLe
21890 6e 2b 31 3c 6e 42 75 66 20 29 7b 0a 20 20 20 20  n+1<nBuf ){.    
218a0 20 20 20 20 7a 42 75 66 5b 6e 4c 65 6e 5d 20 3d      zBuf[nLen] =
218b0 20 77 69 6e 47 65 74 44 69 72 53 65 70 28 29 3b   winGetDirSep();
218c0 0a 20 20 20 20 20 20 20 20 7a 42 75 66 5b 6e 4c  .        zBuf[nL
218d0 65 6e 2b 31 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  en+1] = '\0';.  
218e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
218f0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
21900 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
21910 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
21920 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6e  temporary file n
21930 61 6d 65 20 61 6e 64 20 73 74 6f 72 65 20 74 68  ame and store th
21940 65 20 72 65 73 75 6c 74 69 6e 67 20 70 6f 69 6e  e resulting poin
21950 74 65 72 20 69 6e 74 6f 20 70 7a 42 75 66 2e 0a  ter into pzBuf..
21960 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72  ** The pointer r
21970 65 74 75 72 6e 65 64 20 69 6e 20 70 7a 42 75 66  eturned in pzBuf
21980 20 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 76   must be freed v
21990 69 61 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  ia sqlite3_free(
219a0 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
219b0 20 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65 28   winGetTempname(
219c0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
219d0 73 2c 20 63 68 61 72 20 2a 2a 70 7a 42 75 66 29  s, char **pzBuf)
219e0 7b 0a 20 20 73 74 61 74 69 63 20 63 68 61 72 20  {.  static char 
219f0 7a 43 68 61 72 73 5b 5d 20 3d 0a 20 20 20 20 22  zChars[] =.    "
21a00 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70  abcdefghijklmnop
21a10 71 72 73 74 75 76 77 78 79 7a 22 0a 20 20 20 20  qrstuvwxyz".    
21a20 22 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f  "ABCDEFGHIJKLMNO
21a30 50 51 52 53 54 55 56 57 58 59 5a 22 0a 20 20 20  PQRSTUVWXYZ".   
21a40 20 22 30 31 32 33 34 35 36 37 38 39 22 3b 0a 20   "0123456789";. 
21a50 20 73 69 7a 65 5f 74 20 69 2c 20 6a 3b 0a 20 20   size_t i, j;.  
21a60 69 6e 74 20 6e 50 72 65 20 3d 20 73 71 6c 69 74  int nPre = sqlit
21a70 65 33 53 74 72 6c 65 6e 33 30 28 53 51 4c 49 54  e3Strlen30(SQLIT
21a80 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46  E_TEMP_FILE_PREF
21a90 49 58 29 3b 0a 20 20 69 6e 74 20 6e 4d 61 78 2c  IX);.  int nMax,
21aa0 20 6e 42 75 66 2c 20 6e 44 69 72 2c 20 6e 4c 65   nBuf, nDir, nLe
21ab0 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 42 75 66 3b  n;.  char *zBuf;
21ac0 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64 64 20  ..  /* It's odd 
21ad0 74 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e 20 69  to simulate an i
21ae0 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c 20 62 75  o-error here, bu
21af0 74 20 72 65 61 6c 6c 79 20 74 68 69 73 20 69 73  t really this is
21b00 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67   just.  ** using
21b10 20 74 68 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e   the io-error in
21b20 66 72 61 73 74 72 75 63 74 75 72 65 20 74 6f 20  frastructure to 
21b30 74 65 73 74 20 74 68 61 74 20 53 51 4c 69 74 65  test that SQLite
21b40 20 68 61 6e 64 6c 65 73 20 74 68 69 73 0a 20 20   handles this.  
21b50 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c  ** function fail
21b60 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75  ing..  */.  Simu
21b70 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
21b80 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
21b90 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61   );..  /* Alloca
21ba0 74 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 62  te a temporary b
21bb0 75 66 66 65 72 20 74 6f 20 73 74 6f 72 65 20 74  uffer to store t
21bc0 68 65 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69  he fully qualifi
21bd0 65 64 20 66 69 6c 65 0a 20 20 2a 2a 20 6e 61 6d  ed file.  ** nam
21be0 65 20 66 6f 72 20 74 68 65 20 74 65 6d 70 6f 72  e for the tempor
21bf0 61 72 79 20 66 69 6c 65 2e 20 20 49 66 20 74 68  ary file.  If th
21c00 69 73 20 66 61 69 6c 73 2c 20 77 65 20 63 61 6e  is fails, we can
21c10 6e 6f 74 20 63 6f 6e 74 69 6e 75 65 2e 0a 20 20  not continue..  
21c20 2a 2f 0a 20 20 6e 4d 61 78 20 3d 20 70 56 66 73  */.  nMax = pVfs
21c30 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 3b 20 6e 42  ->mxPathname; nB
21c40 75 66 20 3d 20 6e 4d 61 78 20 2b 20 32 3b 0a 20  uf = nMax + 2;. 
21c50 20 7a 42 75 66 20 3d 20 73 71 6c 69 74 65 33 4d   zBuf = sqlite3M
21c60 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42 75 66 20  allocZero( nBuf 
21c70 29 3b 0a 20 20 69 66 28 20 21 7a 42 75 66 20 29  );.  if( !zBuf )
21c80 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  {.    OSTRACE(("
21c90 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63  TEMP-FILENAME rc
21ca0 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f  =SQLITE_IOERR_NO
21cb0 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 72 65  MEM\n"));.    re
21cc0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
21cd0 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20  R_NOMEM;.  }..  
21ce0 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 74 68  /* Figure out th
21cf0 65 20 65 66 66 65 63 74 69 76 65 20 74 65 6d 70  e effective temp
21d00 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72 79 2e  orary directory.
21d10 20 20 46 69 72 73 74 2c 20 63 68 65 63 6b 20 69    First, check i
21d20 66 20 6f 6e 65 0a 20 20 2a 2a 20 68 61 73 20 62  f one.  ** has b
21d30 65 65 6e 20 65 78 70 6c 69 63 69 74 6c 79 20 73  een explicitly s
21d40 65 74 20 62 79 20 74 68 65 20 61 70 70 6c 69 63  et by the applic
21d50 61 74 69 6f 6e 3b 20 6f 74 68 65 72 77 69 73 65  ation; otherwise
21d60 2c 20 75 73 65 20 74 68 65 20 6f 6e 65 0a 20 20  , use the one.  
21d70 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64 20 62 79  ** configured by
21d80 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73   the operating s
21d90 79 73 74 65 6d 2e 0a 20 20 2a 2f 0a 20 20 6e 44  ystem..  */.  nD
21da0 69 72 20 3d 20 6e 4d 61 78 20 2d 20 28 6e 50 72  ir = nMax - (nPr
21db0 65 20 2b 20 31 35 29 3b 0a 20 20 61 73 73 65 72  e + 15);.  asser
21dc0 74 28 20 6e 44 69 72 3e 30 20 29 3b 0a 20 20 69  t( nDir>0 );.  i
21dd0 66 28 20 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f  f( sqlite3_temp_
21de0 64 69 72 65 63 74 6f 72 79 20 29 7b 0a 20 20 20  directory ){.   
21df0 20 69 6e 74 20 6e 44 69 72 4c 65 6e 20 3d 20 73   int nDirLen = s
21e00 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 73  qlite3Strlen30(s
21e10 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65  qlite3_temp_dire
21e20 63 74 6f 72 79 29 3b 0a 20 20 20 20 69 66 28 20  ctory);.    if( 
21e30 6e 44 69 72 4c 65 6e 3e 30 20 29 7b 0a 20 20 20  nDirLen>0 ){.   
21e40 20 20 20 69 66 28 20 21 77 69 6e 49 73 44 69 72     if( !winIsDir
21e50 53 65 70 28 73 71 6c 69 74 65 33 5f 74 65 6d 70  Sep(sqlite3_temp
21e60 5f 64 69 72 65 63 74 6f 72 79 5b 6e 44 69 72 4c  _directory[nDirL
21e70 65 6e 2d 31 5d 29 20 29 7b 0a 20 20 20 20 20 20  en-1]) ){.      
21e80 20 20 6e 44 69 72 4c 65 6e 2b 2b 3b 0a 20 20 20    nDirLen++;.   
21e90 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e     }.      if( n
21ea0 44 69 72 4c 65 6e 3e 6e 44 69 72 20 29 7b 0a 20  DirLen>nDir ){. 
21eb0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
21ec0 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20  ree(zBuf);.     
21ed0 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d     OSTRACE(("TEM
21ee0 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51  P-FILENAME rc=SQ
21ef0 4c 49 54 45 5f 45 52 52 4f 52 5c 6e 22 29 29 3b  LITE_ERROR\n"));
21f00 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
21f10 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
21f20 54 45 5f 45 52 52 4f 52 2c 20 30 2c 20 22 77 69  TE_ERROR, 0, "wi
21f30 6e 47 65 74 54 65 6d 70 6e 61 6d 65 31 22 2c 20  nGetTempname1", 
21f40 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
21f50 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
21f60 74 66 28 6e 4d 61 78 2c 20 7a 42 75 66 2c 20 22  tf(nMax, zBuf, "
21f70 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 74 65 6d  %s", sqlite3_tem
21f80 70 5f 64 69 72 65 63 74 6f 72 79 29 3b 0a 20 20  p_directory);.  
21f90 20 20 7d 0a 20 20 7d 0a 23 69 66 20 64 65 66 69    }.  }.#if defi
21fa0 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a  ned(__CYGWIN__).
21fb0 20 20 65 6c 73 65 7b 0a 20 20 20 20 73 74 61 74    else{.    stat
21fc0 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61  ic const char *a
21fd0 7a 44 69 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20  zDirs[] = {.    
21fe0 20 20 20 30 2c 20 2f 2a 20 67 65 74 65 6e 76 28     0, /* getenv(
21ff0 22 53 51 4c 49 54 45 5f 54 4d 50 44 49 52 22 29  "SQLITE_TMPDIR")
22000 20 2a 2f 0a 20 20 20 20 20 20 20 30 2c 20 2f 2a   */.       0, /*
22010 20 67 65 74 65 6e 76 28 22 54 4d 50 44 49 52 22   getenv("TMPDIR"
22020 29 20 2a 2f 0a 20 20 20 20 20 20 20 30 2c 20 2f  ) */.       0, /
22030 2a 20 67 65 74 65 6e 76 28 22 54 4d 50 22 29 20  * getenv("TMP") 
22040 2a 2f 0a 20 20 20 20 20 20 20 30 2c 20 2f 2a 20  */.       0, /* 
22050 67 65 74 65 6e 76 28 22 54 45 4d 50 22 29 20 2a  getenv("TEMP") *
22060 2f 0a 20 20 20 20 20 20 20 30 2c 20 2f 2a 20 67  /.       0, /* g
22070 65 74 65 6e 76 28 22 55 53 45 52 50 52 4f 46 49  etenv("USERPROFI
22080 4c 45 22 29 20 2a 2f 0a 20 20 20 20 20 20 20 22  LE") */.       "
22090 2f 76 61 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20  /var/tmp",.     
220a0 20 20 22 2f 75 73 72 2f 74 6d 70 22 2c 0a 20 20    "/usr/tmp",.  
220b0 20 20 20 20 20 22 2f 74 6d 70 22 2c 0a 20 20 20       "/tmp",.   
220c0 20 20 20 20 22 2e 22 2c 0a 20 20 20 20 20 20 20      ".",.       
220d0 30 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  0        /* List
220e0 20 74 65 72 6d 69 6e 61 74 6f 72 20 2a 2f 0a 20   terminator */. 
220f0 20 20 20 7d 3b 0a 20 20 20 20 75 6e 73 69 67 6e     };.    unsign
22100 65 64 20 69 6e 74 20 69 3b 0a 20 20 20 20 63 6f  ed int i;.    co
22110 6e 73 74 20 63 68 61 72 20 2a 7a 44 69 72 20 3d  nst char *zDir =
22120 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 21 61 7a   0;..    if( !az
22130 44 69 72 73 5b 30 5d 20 29 20 61 7a 44 69 72 73  Dirs[0] ) azDirs
22140 5b 30 5d 20 3d 20 67 65 74 65 6e 76 28 22 53 51  [0] = getenv("SQ
22150 4c 49 54 45 5f 54 4d 50 44 49 52 22 29 3b 0a 20  LITE_TMPDIR");. 
22160 20 20 20 69 66 28 20 21 61 7a 44 69 72 73 5b 31     if( !azDirs[1
22170 5d 20 29 20 61 7a 44 69 72 73 5b 31 5d 20 3d 20  ] ) azDirs[1] = 
22180 67 65 74 65 6e 76 28 22 54 4d 50 44 49 52 22 29  getenv("TMPDIR")
22190 3b 0a 20 20 20 20 69 66 28 20 21 61 7a 44 69 72  ;.    if( !azDir
221a0 73 5b 32 5d 20 29 20 61 7a 44 69 72 73 5b 32 5d  s[2] ) azDirs[2]
221b0 20 3d 20 67 65 74 65 6e 76 28 22 54 4d 50 22 29   = getenv("TMP")
221c0 3b 0a 20 20 20 20 69 66 28 20 21 61 7a 44 69 72  ;.    if( !azDir
221d0 73 5b 33 5d 20 29 20 61 7a 44 69 72 73 5b 33 5d  s[3] ) azDirs[3]
221e0 20 3d 20 67 65 74 65 6e 76 28 22 54 45 4d 50 22   = getenv("TEMP"
221f0 29 3b 0a 20 20 20 20 69 66 28 20 21 61 7a 44 69  );.    if( !azDi
22200 72 73 5b 34 5d 20 29 20 61 7a 44 69 72 73 5b 34  rs[4] ) azDirs[4
22210 5d 20 3d 20 67 65 74 65 6e 76 28 22 55 53 45 52  ] = getenv("USER
22220 50 52 4f 46 49 4c 45 22 29 3b 0a 20 20 20 20 66  PROFILE");.    f
22230 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66  or(i=0; i<sizeof
22240 28 61 7a 44 69 72 73 29 2f 73 69 7a 65 6f 66 28  (azDirs)/sizeof(
22250 61 7a 44 69 72 73 5b 30 5d 29 3b 20 7a 44 69 72  azDirs[0]); zDir
22260 3d 61 7a 44 69 72 73 5b 69 2b 2b 5d 29 7b 0a 20  =azDirs[i++]){. 
22270 20 20 20 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76       void *zConv
22280 65 72 74 65 64 3b 0a 20 20 20 20 20 20 69 66 28  erted;.      if(
22290 20 7a 44 69 72 3d 3d 30 20 29 20 63 6f 6e 74 69   zDir==0 ) conti
222a0 6e 75 65 3b 0a 20 20 20 20 20 20 2f 2a 20 49 66  nue;.      /* If
222b0 20 74 68 65 20 70 61 74 68 20 73 74 61 72 74 73   the path starts
222c0 20 77 69 74 68 20 61 20 64 72 69 76 65 20 6c 65   with a drive le
222d0 74 74 65 72 20 66 6f 6c 6c 6f 77 65 64 20 62 79  tter followed by
222e0 20 74 68 65 20 63 6f 6c 6f 6e 0a 20 20 20 20 20   the colon.     
222f0 20 2a 2a 20 63 68 61 72 61 63 74 65 72 2c 20 61   ** character, a
22300 73 73 75 6d 65 20 69 74 20 69 73 20 61 6c 72 65  ssume it is alre
22310 61 64 79 20 61 20 6e 61 74 69 76 65 20 57 69 6e  ady a native Win
22320 33 32 20 70 61 74 68 3b 20 6f 74 68 65 72 77 69  32 path; otherwi
22330 73 65 2c 0a 20 20 20 20 20 20 2a 2a 20 69 74 20  se,.      ** it 
22340 6d 75 73 74 20 62 65 20 63 6f 6e 76 65 72 74 65  must be converte
22350 64 20 74 6f 20 61 20 6e 61 74 69 76 65 20 57 69  d to a native Wi
22360 6e 33 32 20 70 61 74 68 20 76 69 61 20 74 68 65  n32 path via the
22370 20 43 79 67 77 69 6e 20 41 50 49 0a 20 20 20 20   Cygwin API.    
22380 20 20 2a 2a 20 70 72 69 6f 72 20 74 6f 20 75 73    ** prior to us
22390 69 6e 67 20 69 74 2e 0a 20 20 20 20 20 20 2a 2f  ing it..      */
223a0 0a 20 20 20 20 20 20 69 66 28 20 77 69 6e 49 73  .      if( winIs
223b0 44 72 69 76 65 4c 65 74 74 65 72 41 6e 64 43 6f  DriveLetterAndCo
223c0 6c 6f 6e 28 7a 44 69 72 29 20 29 7b 0a 20 20 20  lon(zDir) ){.   
223d0 20 20 20 20 20 7a 43 6f 6e 76 65 72 74 65 64 20       zConverted 
223e0 3d 20 77 69 6e 43 6f 6e 76 65 72 74 46 72 6f 6d  = winConvertFrom
223f0 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 44 69  Utf8Filename(zDi
22400 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  r);.        if( 
22410 21 7a 43 6f 6e 76 65 72 74 65 64 20 29 7b 0a 20  !zConverted ){. 
22420 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
22430 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20  _free(zBuf);.   
22440 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28         OSTRACE((
22450 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72  "TEMP-FILENAME r
22460 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  c=SQLITE_IOERR_N
22470 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 20  OMEM\n"));.     
22480 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
22490 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a  TE_IOERR_NOMEM;.
224a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
224b0 20 20 69 66 28 20 77 69 6e 49 73 44 69 72 28 7a    if( winIsDir(z
224c0 43 6f 6e 76 65 72 74 65 64 29 20 29 7b 0a 20 20  Converted) ){.  
224d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
224e0 73 6e 70 72 69 6e 74 66 28 6e 4d 61 78 2c 20 7a  snprintf(nMax, z
224f0 42 75 66 2c 20 22 25 73 22 2c 20 7a 44 69 72 29  Buf, "%s", zDir)
22500 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
22510 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
22520 74 65 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ted);.          
22530 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
22540 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
22550 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
22560 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
22570 20 20 20 20 20 20 20 20 7a 43 6f 6e 76 65 72 74          zConvert
22580 65 64 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  ed = sqlite3Mall
22590 6f 63 5a 65 72 6f 28 20 6e 4d 61 78 2b 31 20 29  ocZero( nMax+1 )
225a0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 7a  ;.        if( !z
225b0 43 6f 6e 76 65 72 74 65 64 20 29 7b 0a 20 20 20  Converted ){.   
225c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
225d0 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20  ree(zBuf);.     
225e0 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54       OSTRACE(("T
225f0 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d  EMP-FILENAME rc=
22600 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
22610 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 20  EM\n"));.       
22620 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
22630 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20  _IOERR_NOMEM;.  
22640 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
22650 69 66 28 20 63 79 67 77 69 6e 5f 63 6f 6e 76 5f  if( cygwin_conv_
22660 70 61 74 68 28 0a 20 20 20 20 20 20 20 20 20 20  path(.          
22670 20 20 20 20 20 20 6f 73 49 73 4e 54 28 29 20 3f        osIsNT() ?
22680 20 43 43 50 5f 50 4f 53 49 58 5f 54 4f 5f 57 49   CCP_POSIX_TO_WI
22690 4e 5f 57 20 3a 20 43 43 50 5f 50 4f 53 49 58 5f  N_W : CCP_POSIX_
226a0 54 4f 5f 57 49 4e 5f 41 2c 20 7a 44 69 72 2c 0a  TO_WIN_A, zDir,.
226b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
226c0 7a 43 6f 6e 76 65 72 74 65 64 2c 20 6e 4d 61 78  zConverted, nMax
226d0 2b 31 29 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  +1)<0 ){.       
226e0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
226f0 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20  zConverted);.   
22700 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
22710 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20  ree(zBuf);.     
22720 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54       OSTRACE(("T
22730 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d  EMP-FILENAME rc=
22740 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4f 4e  SQLITE_IOERR_CON
22750 56 50 41 54 48 5c 6e 22 29 29 3b 0a 20 20 20 20  VPATH\n"));.    
22760 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e        return win
22770 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
22780 49 4f 45 52 52 5f 43 4f 4e 56 50 41 54 48 2c 20  IOERR_CONVPATH, 
22790 28 44 57 4f 52 44 29 65 72 72 6e 6f 2c 0a 20 20  (DWORD)errno,.  
227a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
227b0 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 47             "winG
227c0 65 74 54 65 6d 70 6e 61 6d 65 32 22 2c 20 7a 44  etTempname2", zD
227d0 69 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ir);.        }. 
227e0 20 20 20 20 20 20 20 69 66 28 20 77 69 6e 49 73         if( winIs
227f0 44 69 72 28 7a 43 6f 6e 76 65 72 74 65 64 29 20  Dir(zConverted) 
22800 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
22810 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 77  At this point, w
22820 65 20 6b 6e 6f 77 20 74 68 65 20 63 61 6e 64 69  e know the candi
22830 64 61 74 65 20 64 69 72 65 63 74 6f 72 79 20 65  date directory e
22840 78 69 73 74 73 20 61 6e 64 20 73 68 6f 75 6c 64  xists and should
22850 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65  .          ** be
22860 20 75 73 65 64 2e 20 20 48 6f 77 65 76 65 72 2c   used.  However,
22870 20 77 65 20 6d 61 79 20 6e 65 65 64 20 74 6f 20   we may need to 
22880 63 6f 6e 76 65 72 74 20 74 68 65 20 73 74 72 69  convert the stri
22890 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 20 20  ng containing.  
228a0 20 20 20 20 20 20 20 20 2a 2a 20 69 74 73 20 6e          ** its n
228b0 61 6d 65 20 69 6e 74 6f 20 55 54 46 2d 38 20 28  ame into UTF-8 (
228c0 69 2e 65 2e 20 69 66 20 69 74 20 69 73 20 55 54  i.e. if it is UT
228d0 46 2d 31 36 20 72 69 67 68 74 20 6e 6f 77 29 2e  F-16 right now).
228e0 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
228f0 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 55          char *zU
22900 74 66 38 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74  tf8 = winConvert
22910 54 6f 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a  ToUtf8Filename(z
22920 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
22930 20 20 20 20 20 20 69 66 28 20 21 7a 55 74 66 38        if( !zUtf8
22940 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
22950 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
22960 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20  nverted);.      
22970 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
22980 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20  ee(zBuf);.      
22990 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
229a0 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63  TEMP-FILENAME rc
229b0 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f  =SQLITE_IOERR_NO
229c0 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20  MEM\n"));.      
229d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
229e0 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b  ITE_IOERR_NOMEM;
229f0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
22a00 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
22a10 6e 70 72 69 6e 74 66 28 6e 4d 61 78 2c 20 7a 42  nprintf(nMax, zB
22a20 75 66 2c 20 22 25 73 22 2c 20 7a 55 74 66 38 29  uf, "%s", zUtf8)
22a30 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
22a40 74 65 33 5f 66 72 65 65 28 7a 55 74 66 38 29 3b  te3_free(zUtf8);
22a50 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
22a60 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74  e3_free(zConvert
22a70 65 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  ed);.          b
22a80 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
22a90 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
22aa0 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
22ab0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
22ac0 20 20 7d 0a 23 65 6c 69 66 20 21 53 51 4c 49 54    }.#elif !SQLIT
22ad0 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 21 64  E_OS_WINRT && !d
22ae0 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f  efined(__CYGWIN_
22af0 5f 29 0a 20 20 65 6c 73 65 20 69 66 28 20 6f 73  _).  else if( os
22b00 49 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 63 68  IsNT() ){.    ch
22b10 61 72 20 2a 7a 4d 75 6c 74 69 3b 0a 20 20 20 20  ar *zMulti;.    
22b20 4c 50 57 53 54 52 20 7a 57 69 64 65 50 61 74 68  LPWSTR zWidePath
22b30 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
22b40 5a 65 72 6f 28 20 6e 4d 61 78 2a 73 69 7a 65 6f  Zero( nMax*sizeo
22b50 66 28 57 43 48 41 52 29 20 29 3b 0a 20 20 20 20  f(WCHAR) );.    
22b60 69 66 28 20 21 7a 57 69 64 65 50 61 74 68 20 29  if( !zWidePath )
22b70 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
22b80 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20  free(zBuf);.    
22b90 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50    OSTRACE(("TEMP
22ba0 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c  -FILENAME rc=SQL
22bb0 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c  ITE_IOERR_NOMEM\
22bc0 6e 22 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75  n"));.      retu
22bd0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
22be0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20  NOMEM;.    }.   
22bf0 20 69 66 28 20 6f 73 47 65 74 54 65 6d 70 50 61   if( osGetTempPa
22c00 74 68 57 28 6e 4d 61 78 2c 20 7a 57 69 64 65 50  thW(nMax, zWideP
22c10 61 74 68 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ath)==0 ){.     
22c20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 57   sqlite3_free(zW
22c30 69 64 65 50 61 74 68 29 3b 0a 20 20 20 20 20 20  idePath);.      
22c40 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75  sqlite3_free(zBu
22c50 66 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43  f);.      OSTRAC
22c60 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d  E(("TEMP-FILENAM
22c70 45 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52  E rc=SQLITE_IOER
22c80 52 5f 47 45 54 54 45 4d 50 50 41 54 48 5c 6e 22  R_GETTEMPPATH\n"
22c90 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
22ca0 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
22cb0 49 54 45 5f 49 4f 45 52 52 5f 47 45 54 54 45 4d  ITE_IOERR_GETTEM
22cc0 50 50 41 54 48 2c 20 6f 73 47 65 74 4c 61 73 74  PPATH, osGetLast
22cd0 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20  Error(),.       
22ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22cf0 20 20 22 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d    "winGetTempnam
22d00 65 32 22 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  e2", 0);.    }. 
22d10 20 20 20 7a 4d 75 6c 74 69 20 3d 20 77 69 6e 55     zMulti = winU
22d20 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 57 69  nicodeToUtf8(zWi
22d30 64 65 50 61 74 68 29 3b 0a 20 20 20 20 69 66 28  dePath);.    if(
22d40 20 7a 4d 75 6c 74 69 20 29 7b 0a 20 20 20 20 20   zMulti ){.     
22d50 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
22d60 66 28 6e 4d 61 78 2c 20 7a 42 75 66 2c 20 22 25  f(nMax, zBuf, "%
22d70 73 22 2c 20 7a 4d 75 6c 74 69 29 3b 0a 20 20 20  s", zMulti);.   
22d80 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
22d90 7a 4d 75 6c 74 69 29 3b 0a 20 20 20 20 20 20 73  zMulti);.      s
22da0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 57 69 64  qlite3_free(zWid
22db0 65 50 61 74 68 29 3b 0a 20 20 20 20 7d 65 6c 73  ePath);.    }els
22dc0 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
22dd0 5f 66 72 65 65 28 7a 57 69 64 65 50 61 74 68 29  _free(zWidePath)
22de0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
22df0 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20  free(zBuf);.    
22e00 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50    OSTRACE(("TEMP
22e10 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c  -FILENAME rc=SQL
22e20 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c  ITE_IOERR_NOMEM\
22e30 6e 22 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75  n"));.      retu
22e40 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
22e50 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d  NOMEM;.    }.  }
22e60 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57  .#ifdef SQLITE_W
22e70 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20  IN32_HAS_ANSI.  
22e80 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a  else{.    char *
22e90 7a 55 74 66 38 3b 0a 20 20 20 20 63 68 61 72 20  zUtf8;.    char 
22ea0 2a 7a 4d 62 63 73 50 61 74 68 20 3d 20 73 71 6c  *zMbcsPath = sql
22eb0 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20  ite3MallocZero( 
22ec0 6e 4d 61 78 20 29 3b 0a 20 20 20 20 69 66 28 20  nMax );.    if( 
22ed0 21 7a 4d 62 63 73 50 61 74 68 20 29 7b 0a 20 20  !zMbcsPath ){.  
22ee0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
22ef0 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 4f 53  (zBuf);.      OS
22f00 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c  TRACE(("TEMP-FIL
22f10 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f  ENAME rc=SQLITE_
22f20 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29  IOERR_NOMEM\n"))
22f30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
22f40 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
22f50 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  M;.    }.    if(
22f60 20 6f 73 47 65 74 54 65 6d 70 50 61 74 68 41 28   osGetTempPathA(
22f70 6e 4d 61 78 2c 20 7a 4d 62 63 73 50 61 74 68 29  nMax, zMbcsPath)
22f80 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
22f90 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b  ite3_free(zBuf);
22fa0 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
22fb0 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72  "TEMP-FILENAME r
22fc0 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 47  c=SQLITE_IOERR_G
22fd0 45 54 54 45 4d 50 50 41 54 48 5c 6e 22 29 29 3b  ETTEMPPATH\n"));
22fe0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69  .      return wi
22ff0 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
23000 5f 49 4f 45 52 52 5f 47 45 54 54 45 4d 50 50 41  _IOERR_GETTEMPPA
23010 54 48 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72  TH, osGetLastErr
23020 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20  or(),.          
23030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
23040 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65 33 22  winGetTempname3"
23050 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
23060 7a 55 74 66 38 20 3d 20 73 71 6c 69 74 65 33 5f  zUtf8 = sqlite3_
23070 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74  win32_mbcs_to_ut
23080 66 38 28 7a 4d 62 63 73 50 61 74 68 29 3b 0a 20  f8(zMbcsPath);. 
23090 20 20 20 69 66 28 20 7a 55 74 66 38 20 29 7b 0a     if( zUtf8 ){.
230a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
230b0 70 72 69 6e 74 66 28 6e 4d 61 78 2c 20 7a 42 75  printf(nMax, zBu
230c0 66 2c 20 22 25 73 22 2c 20 7a 55 74 66 38 29 3b  f, "%s", zUtf8);
230d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
230e0 72 65 65 28 7a 55 74 66 38 29 3b 0a 20 20 20 20  ree(zUtf8);.    
230f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
23100 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b  ite3_free(zBuf);
23110 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
23120 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72  "TEMP-FILENAME r
23130 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  c=SQLITE_IOERR_N
23140 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 20  OMEM\n"));.     
23150 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
23160 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  OERR_NOMEM;.    
23170 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  }.  }.#endif /* 
23180 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
23190 5f 41 4e 53 49 20 2a 2f 0a 23 65 6e 64 69 66 20  _ANSI */.#endif 
231a0 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  /* !SQLITE_OS_WI
231b0 4e 52 54 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a  NRT */..  /*.  *
231c0 2a 20 43 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20  * Check to make 
231d0 73 75 72 65 20 74 68 65 20 74 65 6d 70 6f 72 61  sure the tempora
231e0 72 79 20 64 69 72 65 63 74 6f 72 79 20 65 6e 64  ry directory end
231f0 73 20 77 69 74 68 20 61 6e 20 61 70 70 72 6f 70  s with an approp
23200 72 69 61 74 65 0a 20 20 2a 2a 20 73 65 70 61 72  riate.  ** separ
23210 61 74 6f 72 2e 20 20 49 66 20 69 74 20 64 6f 65  ator.  If it doe
23220 73 20 6e 6f 74 20 61 6e 64 20 74 68 65 72 65 20  s not and there 
23230 69 73 20 6e 6f 74 20 65 6e 6f 75 67 68 20 73 70  is not enough sp
23240 61 63 65 20 6c 65 66 74 20 74 6f 20 61 64 64 0a  ace left to add.
23250 20 20 2a 2a 20 6f 6e 65 2c 20 66 61 69 6c 2e 0a    ** one, fail..
23260 20 20 2a 2f 0a 20 20 69 66 28 20 21 77 69 6e 4d    */.  if( !winM
23270 61 6b 65 45 6e 64 49 6e 44 69 72 53 65 70 28 6e  akeEndInDirSep(n
23280 44 69 72 2b 31 2c 20 7a 42 75 66 29 20 29 7b 0a  Dir+1, zBuf) ){.
23290 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
232a0 28 7a 42 75 66 29 3b 0a 20 20 20 20 4f 53 54 52  (zBuf);.    OSTR
232b0 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e  ACE(("TEMP-FILEN
232c0 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 45 52  AME rc=SQLITE_ER
232d0 52 4f 52 5c 6e 22 29 29 3b 0a 20 20 20 20 72 65  ROR\n"));.    re
232e0 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72  turn winLogError
232f0 28 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 30  (SQLITE_ERROR, 0
23300 2c 20 22 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d  , "winGetTempnam
23310 65 34 22 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20  e4", 0);.  }..  
23320 2f 2a 0a 20 20 2a 2a 20 43 68 65 63 6b 20 74 68  /*.  ** Check th
23330 61 74 20 74 68 65 20 6f 75 74 70 75 74 20 62 75  at the output bu
23340 66 66 65 72 20 69 73 20 6c 61 72 67 65 20 65 6e  ffer is large en
23350 6f 75 67 68 20 66 6f 72 20 74 68 65 20 74 65 6d  ough for the tem
23360 70 6f 72 61 72 79 20 66 69 6c 65 0a 20 20 2a 2a  porary file.  **
23370 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 66 6f 6c   name in the fol
23380 6c 6f 77 69 6e 67 20 66 6f 72 6d 61 74 3a 0a 20  lowing format:. 
23390 20 2a 2a 0a 20 20 2a 2a 20 20 20 22 3c 74 65 6d   **.  **   "<tem
233a0 70 6f 72 61 72 79 5f 64 69 72 65 63 74 6f 72 79  porary_directory
233b0 3e 2f 65 74 69 6c 71 73 5f 58 58 58 58 58 58 58  >/etilqs_XXXXXXX
233c0 58 58 58 58 58 58 58 58 5c 30 5c 30 22 0a 20 20  XXXXXXXX\0\0".  
233d0 2a 2a 0a 20 20 2a 2a 20 49 66 20 6e 6f 74 2c 20  **.  ** If not, 
233e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
233f0 52 4f 52 2e 20 20 54 68 65 20 6e 75 6d 62 65 72  ROR.  The number
23400 20 31 37 20 69 73 20 75 73 65 64 20 68 65 72 65   17 is used here
23410 20 69 6e 20 6f 72 64 65 72 20 74 6f 0a 20 20 2a   in order to.  *
23420 2a 20 61 63 63 6f 75 6e 74 20 66 6f 72 20 74 68  * account for th
23430 65 20 73 70 61 63 65 20 75 73 65 64 20 62 79 20  e space used by 
23440 74 68 65 20 31 35 20 63 68 61 72 61 63 74 65 72  the 15 character
23450 20 72 61 6e 64 6f 6d 20 73 75 66 66 69 78 20 61   random suffix a
23460 6e 64 20 74 68 65 0a 20 20 2a 2a 20 74 77 6f 20  nd the.  ** two 
23470 74 72 61 69 6c 69 6e 67 20 4e 55 4c 20 63 68 61  trailing NUL cha
23480 72 61 63 74 65 72 73 2e 20 20 54 68 65 20 66 69  racters.  The fi
23490 6e 61 6c 20 64 69 72 65 63 74 6f 72 79 20 73 65  nal directory se
234a0 70 61 72 61 74 6f 72 20 63 68 61 72 61 63 74 65  parator characte
234b0 72 0a 20 20 2a 2a 20 68 61 73 20 61 6c 72 65 61  r.  ** has alrea
234c0 64 79 20 61 64 64 65 64 20 69 66 20 69 74 20 77  dy added if it w
234d0 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 70  as not already p
234e0 72 65 73 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 6e  resent..  */.  n
234f0 4c 65 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72  Len = sqlite3Str
23500 6c 65 6e 33 30 28 7a 42 75 66 29 3b 0a 20 20 69  len30(zBuf);.  i
23510 66 28 20 28 6e 4c 65 6e 20 2b 20 6e 50 72 65 20  f( (nLen + nPre 
23520 2b 20 31 37 29 20 3e 20 6e 42 75 66 20 29 7b 0a  + 17) > nBuf ){.
23530 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
23540 28 7a 42 75 66 29 3b 0a 20 20 20 20 4f 53 54 52  (zBuf);.    OSTR
23550 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e  ACE(("TEMP-FILEN
23560 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 45 52  AME rc=SQLITE_ER
23570 52 4f 52 5c 6e 22 29 29 3b 0a 20 20 20 20 72 65  ROR\n"));.    re
23580 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72  turn winLogError
23590 28 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 30  (SQLITE_ERROR, 0
235a0 2c 20 22 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d  , "winGetTempnam
235b0 65 35 22 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20  e5", 0);.  }..  
235c0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
235d0 28 6e 42 75 66 2d 31 36 2d 6e 4c 65 6e 2c 20 7a  (nBuf-16-nLen, z
235e0 42 75 66 2b 6e 4c 65 6e 2c 20 53 51 4c 49 54 45  Buf+nLen, SQLITE
235f0 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49  _TEMP_FILE_PREFI
23600 58 29 3b 0a 0a 20 20 6a 20 3d 20 73 71 6c 69 74  X);..  j = sqlit
23610 65 33 53 74 72 6c 65 6e 33 30 28 7a 42 75 66 29  e3Strlen30(zBuf)
23620 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64  ;.  sqlite3_rand
23630 6f 6d 6e 65 73 73 28 31 35 2c 20 26 7a 42 75 66  omness(15, &zBuf
23640 5b 6a 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  [j]);.  for(i=0;
23650 20 69 3c 31 35 3b 20 69 2b 2b 2c 20 6a 2b 2b 29   i<15; i++, j++)
23660 7b 0a 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20  {.    zBuf[j] = 
23670 28 63 68 61 72 29 7a 43 68 61 72 73 5b 20 28 28  (char)zChars[ ((
23680 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 7a 42  unsigned char)zB
23690 75 66 5b 6a 5d 29 25 28 73 69 7a 65 6f 66 28 7a  uf[j])%(sizeof(z
236a0 43 68 61 72 73 29 2d 31 29 20 5d 3b 0a 20 20 7d  Chars)-1) ];.  }
236b0 0a 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 30 3b 0a  .  zBuf[j] = 0;.
236c0 20 20 7a 42 75 66 5b 6a 2b 31 5d 20 3d 20 30 3b    zBuf[j+1] = 0;
236d0 0a 20 20 2a 70 7a 42 75 66 20 3d 20 7a 42 75 66  .  *pzBuf = zBuf
236e0 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54  ;..  OSTRACE(("T
236f0 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 6e 61 6d  EMP-FILENAME nam
23700 65 3d 25 73 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%s, rc=SQLITE_
23710 4f 4b 5c 6e 22 2c 20 7a 42 75 66 29 29 3b 0a 20  OK\n", zBuf));. 
23720 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
23730 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  K;.}../*.** Retu
23740 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 6e  rn TRUE if the n
23750 61 6d 65 64 20 66 69 6c 65 20 69 73 20 72 65 61  amed file is rea
23760 6c 6c 79 20 61 20 64 69 72 65 63 74 6f 72 79 2e  lly a directory.
23770 20 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20 69    Return false i
23780 66 0a 2a 2a 20 69 74 20 69 73 20 73 6f 6d 65 74  f.** it is somet
23790 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20  hing other than 
237a0 61 20 64 69 72 65 63 74 6f 72 79 2c 20 6f 72 20  a directory, or 
237b0 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 79 20  if there is any 
237c0 6b 69 6e 64 20 6f 66 20 6d 65 6d 6f 72 79 0a 2a  kind of memory.*
237d0 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69  * allocation fai
237e0 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lure..*/.static 
237f0 69 6e 74 20 77 69 6e 49 73 44 69 72 28 63 6f 6e  int winIsDir(con
23800 73 74 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72  st void *zConver
23810 74 65 64 29 7b 0a 20 20 44 57 4f 52 44 20 61 74  ted){.  DWORD at
23820 74 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30  tr;.  int rc = 0
23830 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72  ;.  DWORD lastEr
23840 72 6e 6f 3b 0a 0a 20 20 69 66 28 20 6f 73 49 73  rno;..  if( osIs
23850 4e 54 28 29 20 29 7b 0a 20 20 20 20 69 6e 74 20  NT() ){.    int 
23860 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 57 49 4e  cnt = 0;.    WIN
23870 33 32 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54  32_FILE_ATTRIBUT
23880 45 5f 44 41 54 41 20 73 41 74 74 72 44 61 74 61  E_DATA sAttrData
23890 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 41  ;.    memset(&sA
238a0 74 74 72 44 61 74 61 2c 20 30 2c 20 73 69 7a 65  ttrData, 0, size
238b0 6f 66 28 73 41 74 74 72 44 61 74 61 29 29 3b 0a  of(sAttrData));.
238c0 20 20 20 20 77 68 69 6c 65 28 20 21 28 72 63 20      while( !(rc 
238d0 3d 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69  = osGetFileAttri
238e0 62 75 74 65 73 45 78 57 28 28 4c 50 43 57 53 54  butesExW((LPCWST
238f0 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20  R)zConverted,.  
23900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23910 20 20 20 20 20 20 20 20 20 20 20 47 65 74 46 69             GetFi
23920 6c 65 45 78 49 6e 66 6f 53 74 61 6e 64 61 72 64  leExInfoStandard
23930 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
23940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
23950 73 41 74 74 72 44 61 74 61 29 29 20 26 26 20 77  sAttrData)) && w
23960 69 6e 52 65 74 72 79 49 6f 65 72 72 28 26 63 6e  inRetryIoerr(&cn
23970 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29  t, &lastErrno) )
23980 7b 7d 0a 20 20 20 20 69 66 28 20 21 72 63 20 29  {}.    if( !rc )
23990 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  {.      return 0
239a0 3b 20 2f 2a 20 49 6e 76 61 6c 69 64 20 6e 61 6d  ; /* Invalid nam
239b0 65 3f 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20  e? */.    }.    
239c0 61 74 74 72 20 3d 20 73 41 74 74 72 44 61 74 61  attr = sAttrData
239d0 2e 64 77 46 69 6c 65 41 74 74 72 69 62 75 74 65  .dwFileAttribute
239e0 73 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  s;.#if SQLITE_OS
239f0 5f 57 49 4e 43 45 3d 3d 30 0a 20 20 7d 65 6c 73  _WINCE==0.  }els
23a00 65 7b 0a 20 20 20 20 61 74 74 72 20 3d 20 6f 73  e{.    attr = os
23a10 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
23a20 73 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65  sA((char*)zConve
23a30 72 74 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20  rted);.#endif.  
23a40 7d 0a 20 20 72 65 74 75 72 6e 20 28 61 74 74 72  }.  return (attr
23a50 21 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41  !=INVALID_FILE_A
23a60 54 54 52 49 42 55 54 45 53 29 20 26 26 20 28 61  TTRIBUTES) && (a
23a70 74 74 72 26 46 49 4c 45 5f 41 54 54 52 49 42 55  ttr&FILE_ATTRIBU
23a80 54 45 5f 44 49 52 45 43 54 4f 52 59 29 3b 0a 7d  TE_DIRECTORY);.}
23a90 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 66  ../*.** Open a f
23aa0 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
23ab0 6e 74 20 77 69 6e 4f 70 65 6e 28 0a 20 20 73 71  nt winOpen(.  sq
23ac0 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
23ad0 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
23ae0 74 6f 20 67 65 74 20 6d 61 78 69 6d 75 6d 20 70  to get maximum p
23af0 61 74 68 20 6e 61 6d 65 20 6c 65 6e 67 74 68 20  ath name length 
23b00 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
23b10 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 2f  *zName,        /
23b20 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  * Name of the fi
23b30 6c 65 20 28 55 54 46 2d 38 29 20 2a 2f 0a 20 20  le (UTF-8) */.  
23b40 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
23b50 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69  ,         /* Wri
23b60 74 65 20 74 68 65 20 53 51 4c 69 74 65 20 66 69  te the SQLite fi
23b70 6c 65 20 68 61 6e 64 6c 65 20 68 65 72 65 20 2a  le handle here *
23b80 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  /.  int flags,  
23b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23ba0 20 4f 70 65 6e 20 6d 6f 64 65 20 66 6c 61 67 73   Open mode flags
23bb0 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4f 75 74 46   */.  int *pOutF
23bc0 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20  lags            
23bd0 2f 2a 20 53 74 61 74 75 73 20 72 65 74 75 72 6e  /* Status return
23be0 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 48   flags */.){.  H
23bf0 41 4e 44 4c 45 20 68 3b 0a 20 20 44 57 4f 52 44  ANDLE h;.  DWORD
23c00 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 0a   lastErrno = 0;.
23c10 20 20 44 57 4f 52 44 20 64 77 44 65 73 69 72 65    DWORD dwDesire
23c20 64 41 63 63 65 73 73 3b 0a 20 20 44 57 4f 52 44  dAccess;.  DWORD
23c30 20 64 77 53 68 61 72 65 4d 6f 64 65 3b 0a 20 20   dwShareMode;.  
23c40 44 57 4f 52 44 20 64 77 43 72 65 61 74 69 6f 6e  DWORD dwCreation
23c50 44 69 73 70 6f 73 69 74 69 6f 6e 3b 0a 20 20 44  Disposition;.  D
23c60 57 4f 52 44 20 64 77 46 6c 61 67 73 41 6e 64 41  WORD dwFlagsAndA
23c70 74 74 72 69 62 75 74 65 73 20 3d 20 30 3b 0a 23  ttributes = 0;.#
23c80 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
23c90 43 45 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 20  CE.  int isTemp 
23ca0 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 77 69  = 0;.#endif.  wi
23cb0 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  nFile *pFile = (
23cc0 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 76  winFile*)id;.  v
23cd0 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b  oid *zConverted;
23ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23cf0 20 46 69 6c 65 6e 61 6d 65 20 69 6e 20 4f 53 20   Filename in OS 
23d00 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 63 6f  encoding */.  co
23d10 6e 73 74 20 63 68 61 72 20 2a 7a 55 74 66 38 4e  nst char *zUtf8N
23d20 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 20 2f 2a 20  ame = zName; /* 
23d30 46 69 6c 65 6e 61 6d 65 20 69 6e 20 55 54 46 2d  Filename in UTF-
23d40 38 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20 20  8 encoding */.  
23d50 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 0a 20 20  int cnt = 0;..  
23d60 2f 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 7a  /* If argument z
23d70 50 61 74 68 20 69 73 20 61 20 4e 55 4c 4c 20 70  Path is a NULL p
23d80 6f 69 6e 74 65 72 2c 20 74 68 69 73 20 66 75 6e  ointer, this fun
23d90 63 74 69 6f 6e 20 69 73 20 72 65 71 75 69 72 65  ction is require
23da0 64 20 74 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20 61  d to open.  ** a
23db0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e   temporary file.
23dc0 20 55 73 65 20 74 68 69 73 20 62 75 66 66 65 72   Use this buffer
23dd0 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 66 69   to store the fi
23de0 6c 65 20 6e 61 6d 65 20 69 6e 2e 0a 20 20 2a 2f  le name in..  */
23df0 0a 20 20 63 68 61 72 20 2a 7a 54 6d 70 6e 61 6d  .  char *zTmpnam
23e00 65 20 3d 20 30 3b 20 2f 2a 20 46 6f 72 20 74 65  e = 0; /* For te
23e10 6d 70 6f 72 61 72 79 20 66 69 6c 65 6e 61 6d 65  mporary filename
23e20 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 20  , if necessary. 
23e30 2a 2f 0a 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  */..  int rc = S
23e40 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
23e50 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e       /* Function
23e60 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a   Return Code */.
23e70 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45  #if !defined(NDE
23e80 42 55 47 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4f  BUG) || SQLITE_O
23e90 53 5f 57 49 4e 43 45 0a 20 20 69 6e 74 20 65 54  S_WINCE.  int eT
23ea0 79 70 65 20 3d 20 66 6c 61 67 73 26 30 78 46 46  ype = flags&0xFF
23eb0 46 46 46 46 30 30 3b 20 20 2f 2a 20 54 79 70 65  FFFF00;  /* Type
23ec0 20 6f 66 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e   of file to open
23ed0 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 69 6e   */.#endif..  in
23ee0 74 20 69 73 45 78 63 6c 75 73 69 76 65 20 20 3d  t isExclusive  =
23ef0 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
23f00 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 29  _OPEN_EXCLUSIVE)
23f10 3b 0a 20 20 69 6e 74 20 69 73 44 65 6c 65 74 65  ;.  int isDelete
23f20 20 20 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20       = (flags & 
23f30 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
23f40 54 45 4f 4e 43 4c 4f 53 45 29 3b 0a 20 20 69 6e  TEONCLOSE);.  in
23f50 74 20 69 73 43 72 65 61 74 65 20 20 20 20 20 3d  t isCreate     =
23f60 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
23f70 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a 20  _OPEN_CREATE);. 
23f80 20 69 6e 74 20 69 73 52 65 61 64 6f 6e 6c 79 20   int isReadonly 
23f90 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c    = (flags & SQL
23fa0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
23fb0 59 29 3b 0a 20 20 69 6e 74 20 69 73 52 65 61 64  Y);.  int isRead
23fc0 57 72 69 74 65 20 20 3d 20 28 66 6c 61 67 73 20  Write  = (flags 
23fd0 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  & SQLITE_OPEN_RE
23fe0 41 44 57 52 49 54 45 29 3b 0a 0a 23 69 66 6e 64  ADWRITE);..#ifnd
23ff0 65 66 20 4e 44 45 42 55 47 0a 20 20 69 6e 74 20  ef NDEBUG.  int 
24000 69 73 4f 70 65 6e 4a 6f 75 72 6e 61 6c 20 3d 20  isOpenJournal = 
24010 28 69 73 43 72 65 61 74 65 20 26 26 20 28 0a 20  (isCreate && (. 
24020 20 20 20 20 20 20 20 65 54 79 70 65 3d 3d 53 51         eType==SQ
24030 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52  LITE_OPEN_MASTER
24040 5f 4a 4f 55 52 4e 41 4c 0a 20 20 20 20 20 7c 7c  _JOURNAL.     ||
24050 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
24060 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
24070 0a 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d  .     || eType==
24080 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a  SQLITE_OPEN_WAL.
24090 20 20 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20    ));.#endif..  
240a0 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 20 6e  OSTRACE(("OPEN n
240b0 61 6d 65 3d 25 73 2c 20 70 46 69 6c 65 3d 25 70  ame=%s, pFile=%p
240c0 2c 20 66 6c 61 67 73 3d 25 78 2c 20 70 4f 75 74  , flags=%x, pOut
240d0 46 6c 61 67 73 3d 25 70 5c 6e 22 2c 0a 20 20 20  Flags=%p\n",.   
240e0 20 20 20 20 20 20 20 20 7a 55 74 66 38 4e 61 6d          zUtf8Nam
240f0 65 2c 20 69 64 2c 20 66 6c 61 67 73 2c 20 70 4f  e, id, flags, pO
24100 75 74 46 6c 61 67 73 29 29 3b 0a 0a 20 20 2f 2a  utFlags));..  /*
24110 20 43 68 65 63 6b 20 74 68 65 20 66 6f 6c 6c 6f   Check the follo
24120 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73 20  wing statements 
24130 61 72 65 20 74 72 75 65 3a 0a 20 20 2a 2a 0a 20  are true:.  **. 
24140 20 2a 2a 20 20 20 28 61 29 20 45 78 61 63 74 6c   **   (a) Exactl
24150 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 52 45 41  y one of the REA
24160 44 57 52 49 54 45 20 61 6e 64 20 52 45 41 44 4f  DWRITE and READO
24170 4e 4c 59 20 66 6c 61 67 73 20 6d 75 73 74 20 62  NLY flags must b
24180 65 20 73 65 74 2c 20 61 6e 64 0a 20 20 2a 2a 20  e set, and.  ** 
24190 20 20 28 62 29 20 69 66 20 43 52 45 41 54 45 20    (b) if CREATE 
241a0 69 73 20 73 65 74 2c 20 74 68 65 6e 20 52 45 41  is set, then REA
241b0 44 57 52 49 54 45 20 6d 75 73 74 20 61 6c 73 6f  DWRITE must also
241c0 20 62 65 20 73 65 74 2c 20 61 6e 64 0a 20 20 2a   be set, and.  *
241d0 2a 20 20 20 28 63 29 20 69 66 20 45 58 43 4c 55  *   (c) if EXCLU
241e0 53 49 56 45 20 69 73 20 73 65 74 2c 20 74 68 65  SIVE is set, the
241f0 6e 20 43 52 45 41 54 45 20 6d 75 73 74 20 61 6c  n CREATE must al
24200 73 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a 2a 20  so be set..  ** 
24210 20 20 28 64 29 20 69 66 20 44 45 4c 45 54 45 4f    (d) if DELETEO
24220 4e 43 4c 4f 53 45 20 69 73 20 73 65 74 2c 20 74  NCLOSE is set, t
24230 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74 20  hen CREATE must 
24240 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a  also be set..  *
24250 2f 0a 20 20 61 73 73 65 72 74 28 28 69 73 52 65  /.  assert((isRe
24260 61 64 6f 6e 6c 79 3d 3d 30 20 7c 7c 20 69 73 52  adonly==0 || isR
24270 65 61 64 57 72 69 74 65 3d 3d 30 29 20 26 26 20  eadWrite==0) && 
24280 28 69 73 52 65 61 64 57 72 69 74 65 20 7c 7c 20  (isReadWrite || 
24290 69 73 52 65 61 64 6f 6e 6c 79 29 29 3b 0a 20 20  isReadonly));.  
242a0 61 73 73 65 72 74 28 69 73 43 72 65 61 74 65 3d  assert(isCreate=
242b0 3d 30 20 7c 7c 20 69 73 52 65 61 64 57 72 69 74  =0 || isReadWrit
242c0 65 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73 45  e);.  assert(isE
242d0 78 63 6c 75 73 69 76 65 3d 3d 30 20 7c 7c 20 69  xclusive==0 || i
242e0 73 43 72 65 61 74 65 29 3b 0a 20 20 61 73 73 65  sCreate);.  asse
242f0 72 74 28 69 73 44 65 6c 65 74 65 3d 3d 30 20 7c  rt(isDelete==0 |
24300 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 0a 20 20  | isCreate);..  
24310 2f 2a 20 54 68 65 20 6d 61 69 6e 20 44 42 2c 20  /* The main DB, 
24320 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 57 41  main journal, WA
24330 4c 20 66 69 6c 65 20 61 6e 64 20 6d 61 73 74 65  L file and maste
24340 72 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20 6e 65  r journal are ne
24350 76 65 72 0a 20 20 2a 2a 20 61 75 74 6f 6d 61 74  ver.  ** automat
24360 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 2e 20  ically deleted. 
24370 4e 6f 72 20 61 72 65 20 74 68 65 79 20 65 76 65  Nor are they eve
24380 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  r temporary file
24390 73 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  s.  */.  assert(
243a0 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a   (!isDelete && z
243b0 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d  Name) || eType!=
243c0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
243d0 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _DB );.  assert(
243e0 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a   (!isDelete && z
243f0 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d  Name) || eType!=
24400 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
24410 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 61 73  _JOURNAL );.  as
24420 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65  sert( (!isDelete
24430 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54   && zName) || eT
24440 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype!=SQLITE_OPEN
24450 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20  _MASTER_JOURNAL 
24460 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21 69  );.  assert( (!i
24470 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65  sDelete && zName
24480 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49  ) || eType!=SQLI
24490 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 29 3b 0a 0a  TE_OPEN_WAL );..
244a0 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74    /* Assert that
244b0 20 74 68 65 20 75 70 70 65 72 20 6c 61 79 65 72   the upper layer
244c0 20 68 61 73 20 73 65 74 20 6f 6e 65 20 6f 66 20   has set one of 
244d0 74 68 65 20 22 66 69 6c 65 2d 74 79 70 65 22 20  the "file-type" 
244e0 66 6c 61 67 73 2e 20 2a 2f 0a 20 20 61 73 73 65  flags. */.  asse
244f0 72 74 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54  rt( eType==SQLIT
24500 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 20  E_OPEN_MAIN_DB  
24510 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51      || eType==SQ
24520 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44  LITE_OPEN_TEMP_D
24530 42 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70  B.       || eTyp
24540 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e==SQLITE_OPEN_M
24550 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20 65  AIN_JOURNAL || e
24560 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
24570 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 0a 20  N_TEMP_JOURNAL. 
24580 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d        || eType==
24590 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a  SQLITE_OPEN_SUBJ
245a0 4f 55 52 4e 41 4c 20 20 20 7c 7c 20 65 54 79 70  OURNAL   || eTyp
245b0 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e==SQLITE_OPEN_M
245c0 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 0a 20 20  ASTER_JOURNAL.  
245d0 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53       || eType==S
245e0 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53  QLITE_OPEN_TRANS
245f0 49 45 4e 54 5f 44 42 20 7c 7c 20 65 54 79 70 65  IENT_DB || eType
24600 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41  ==SQLITE_OPEN_WA
24610 4c 0a 20 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  L.  );..  assert
24620 28 20 70 46 69 6c 65 21 3d 30 20 29 3b 0a 20 20  ( pFile!=0 );.  
24630 6d 65 6d 73 65 74 28 70 46 69 6c 65 2c 20 30 2c  memset(pFile, 0,
24640 20 73 69 7a 65 6f 66 28 77 69 6e 46 69 6c 65 29   sizeof(winFile)
24650 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20  );.  pFile->h = 
24660 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56  INVALID_HANDLE_V
24670 41 4c 55 45 3b 0a 0a 23 69 66 20 53 51 4c 49 54  ALUE;..#if SQLIT
24680 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 69 66 28  E_OS_WINRT.  if(
24690 20 21 7a 55 74 66 38 4e 61 6d 65 20 26 26 20 21   !zUtf8Name && !
246a0 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72  sqlite3_temp_dir
246b0 65 63 74 6f 72 79 20 29 7b 0a 20 20 20 20 73 71  ectory ){.    sq
246c0 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
246d0 5f 45 52 52 4f 52 2c 0a 20 20 20 20 20 20 20 20  _ERROR,.        
246e0 22 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69  "sqlite3_temp_di
246f0 72 65 63 74 6f 72 79 20 76 61 72 69 61 62 6c 65  rectory variable
24700 20 73 68 6f 75 6c 64 20 62 65 20 73 65 74 20 66   should be set f
24710 6f 72 20 57 69 6e 52 54 22 29 3b 0a 20 20 7d 0a  or WinRT");.  }.
24720 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20  #endif..  /* If 
24730 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
24740 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
24750 74 69 6f 6e 20 69 73 20 4e 55 4c 4c 2c 20 67 65  tion is NULL, ge
24760 6e 65 72 61 74 65 20 61 0a 20 20 2a 2a 20 74 65  nerate a.  ** te
24770 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6e 61 6d  mporary file nam
24780 65 20 74 6f 20 75 73 65 0a 20 20 2a 2f 0a 20 20  e to use.  */.  
24790 69 66 28 20 21 7a 55 74 66 38 4e 61 6d 65 20 29  if( !zUtf8Name )
247a0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73  {.    assert( is
247b0 44 65 6c 65 74 65 20 26 26 20 21 69 73 4f 70 65  Delete && !isOpe
247c0 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20  nJournal );.    
247d0 72 63 20 3d 20 77 69 6e 47 65 74 54 65 6d 70 6e  rc = winGetTempn
247e0 61 6d 65 28 70 56 66 73 2c 20 26 7a 54 6d 70 6e  ame(pVfs, &zTmpn
247f0 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ame);.    if( rc
24800 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
24810 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4f       OSTRACE(("O
24820 50 45 4e 20 6e 61 6d 65 3d 25 73 2c 20 72 63 3d  PEN name=%s, rc=
24830 25 73 22 2c 20 7a 55 74 66 38 4e 61 6d 65 2c 20  %s", zUtf8Name, 
24840 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72  sqlite3ErrName(r
24850 63 29 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75  c)));.      retu
24860 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
24870 20 7a 55 74 66 38 4e 61 6d 65 20 3d 20 7a 54 6d   zUtf8Name = zTm
24880 70 6e 61 6d 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  pname;.  }..  /*
24890 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61   Database filena
248a0 6d 65 73 20 61 72 65 20 64 6f 75 62 6c 65 2d 7a  mes are double-z
248b0 65 72 6f 20 74 65 72 6d 69 6e 61 74 65 64 20 69  ero terminated i
248c0 66 20 74 68 65 79 20 61 72 65 20 6e 6f 74 0a 20  f they are not. 
248d0 20 2a 2a 20 55 52 49 73 20 77 69 74 68 20 70 61   ** URIs with pa
248e0 72 61 6d 65 74 65 72 73 2e 20 20 48 65 6e 63 65  rameters.  Hence
248f0 2c 20 74 68 65 79 20 63 61 6e 20 61 6c 77 61 79  , they can alway
24900 73 20 62 65 20 70 61 73 73 65 64 20 69 6e 74 6f  s be passed into
24910 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 75 72  .  ** sqlite3_ur
24920 69 5f 70 61 72 61 6d 65 74 65 72 28 29 2e 0a 20  i_parameter().. 
24930 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 65   */.  assert( (e
24940 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45  Type!=SQLITE_OPE
24950 4e 5f 4d 41 49 4e 5f 44 42 29 20 7c 7c 20 28 66  N_MAIN_DB) || (f
24960 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
24970 45 4e 5f 55 52 49 29 20 7c 7c 0a 20 20 20 20 20  EN_URI) ||.     
24980 20 20 7a 55 74 66 38 4e 61 6d 65 5b 73 71 6c 69    zUtf8Name[sqli
24990 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 55 74 66  te3Strlen30(zUtf
249a0 38 4e 61 6d 65 29 2b 31 5d 3d 3d 30 20 29 3b 0a  8Name)+1]==0 );.
249b0 0a 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68  .  /* Convert th
249c0 65 20 66 69 6c 65 6e 61 6d 65 20 74 6f 20 74 68  e filename to th
249d0 65 20 73 79 73 74 65 6d 20 65 6e 63 6f 64 69 6e  e system encodin
249e0 67 2e 20 2a 2f 0a 20 20 7a 43 6f 6e 76 65 72 74  g. */.  zConvert
249f0 65 64 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74 46  ed = winConvertF
24a00 72 6f 6d 55 74 66 38 46 69 6c 65 6e 61 6d 65 28  romUtf8Filename(
24a10 7a 55 74 66 38 4e 61 6d 65 29 3b 0a 20 20 69 66  zUtf8Name);.  if
24a20 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20  ( zConverted==0 
24a30 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
24a40 72 65 65 28 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20  ree(zTmpname);. 
24a50 20 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45     OSTRACE(("OPE
24a60 4e 20 6e 61 6d 65 3d 25 73 2c 20 72 63 3d 53 51  N name=%s, rc=SQ
24a70 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
24a80 22 2c 20 7a 55 74 66 38 4e 61 6d 65 29 29 3b 0a  ", zUtf8Name));.
24a90 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
24aa0 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20  E_IOERR_NOMEM;. 
24ab0 20 7d 0a 0a 20 20 69 66 28 20 77 69 6e 49 73 44   }..  if( winIsD
24ac0 69 72 28 7a 43 6f 6e 76 65 72 74 65 64 29 20 29  ir(zConverted) )
24ad0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
24ae0 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
24af0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
24b00 28 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20  (zTmpname);.    
24b10 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 20 6e  OSTRACE(("OPEN n
24b20 61 6d 65 3d 25 73 2c 20 72 63 3d 53 51 4c 49 54  ame=%s, rc=SQLIT
24b30 45 5f 43 41 4e 54 4f 50 45 4e 5f 49 53 44 49 52  E_CANTOPEN_ISDIR
24b40 22 2c 20 7a 55 74 66 38 4e 61 6d 65 29 29 3b 0a  ", zUtf8Name));.
24b50 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
24b60 45 5f 43 41 4e 54 4f 50 45 4e 5f 49 53 44 49 52  E_CANTOPEN_ISDIR
24b70 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69 73 52  ;.  }..  if( isR
24b80 65 61 64 57 72 69 74 65 20 29 7b 0a 20 20 20 20  eadWrite ){.    
24b90 64 77 44 65 73 69 72 65 64 41 63 63 65 73 73 20  dwDesiredAccess 
24ba0 3d 20 47 45 4e 45 52 49 43 5f 52 45 41 44 20 7c  = GENERIC_READ |
24bb0 20 47 45 4e 45 52 49 43 5f 57 52 49 54 45 3b 0a   GENERIC_WRITE;.
24bc0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 77 44    }else{.    dwD
24bd0 65 73 69 72 65 64 41 63 63 65 73 73 20 3d 20 47  esiredAccess = G
24be0 45 4e 45 52 49 43 5f 52 45 41 44 3b 0a 20 20 7d  ENERIC_READ;.  }
24bf0 0a 0a 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 50  ..  /* SQLITE_OP
24c00 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 69 73 20  EN_EXCLUSIVE is 
24c10 75 73 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72  used to make sur
24c20 65 20 74 68 61 74 20 61 20 6e 65 77 20 66 69 6c  e that a new fil
24c30 65 20 69 73 0a 20 20 2a 2a 20 63 72 65 61 74 65  e is.  ** create
24c40 64 2e 20 53 51 4c 69 74 65 20 64 6f 65 73 6e 27  d. SQLite doesn'
24c50 74 20 75 73 65 20 69 74 20 74 6f 20 69 6e 64 69  t use it to indi
24c60 63 61 74 65 20 22 65 78 63 6c 75 73 69 76 65 20  cate "exclusive 
24c70 61 63 63 65 73 73 22 0a 20 20 2a 2a 20 61 73 20  access".  ** as 
24c80 69 74 20 69 73 20 75 73 75 61 6c 6c 79 20 75 6e  it is usually un
24c90 64 65 72 73 74 6f 6f 64 2e 0a 20 20 2a 2f 0a 20  derstood..  */. 
24ca0 20 69 66 28 20 69 73 45 78 63 6c 75 73 69 76 65   if( isExclusive
24cb0 20 29 7b 0a 20 20 20 20 2f 2a 20 43 72 65 61 74   ){.    /* Creat
24cc0 65 73 20 61 20 6e 65 77 20 66 69 6c 65 2c 20 6f  es a new file, o
24cd0 6e 6c 79 20 69 66 20 69 74 20 64 6f 65 73 20 6e  nly if it does n
24ce0 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  ot already exist
24cf0 2e 20 2a 2f 0a 20 20 20 20 2f 2a 20 49 66 20 74  . */.    /* If t
24d00 68 65 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20  he file exists, 
24d10 69 74 20 66 61 69 6c 73 2e 20 2a 2f 0a 20 20 20  it fails. */.   
24d20 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f   dwCreationDispo
24d30 73 69 74 69 6f 6e 20 3d 20 43 52 45 41 54 45 5f  sition = CREATE_
24d40 4e 45 57 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  NEW;.  }else if(
24d50 20 69 73 43 72 65 61 74 65 20 29 7b 0a 20 20 20   isCreate ){.   
24d60 20 2f 2a 20 4f 70 65 6e 20 65 78 69 73 74 69 6e   /* Open existin
24d70 67 20 66 69 6c 65 2c 20 6f 72 20 63 72 65 61 74  g file, or creat
24d80 65 20 69 66 20 69 74 20 64 6f 65 73 6e 27 74 20  e if it doesn't 
24d90 65 78 69 73 74 20 2a 2f 0a 20 20 20 20 64 77 43  exist */.    dwC
24da0 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69  reationDispositi
24db0 6f 6e 20 3d 20 4f 50 45 4e 5f 41 4c 57 41 59 53  on = OPEN_ALWAYS
24dc0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
24dd0 2a 20 4f 70 65 6e 73 20 61 20 66 69 6c 65 2c 20  * Opens a file, 
24de0 6f 6e 6c 79 20 69 66 20 69 74 20 65 78 69 73 74  only if it exist
24df0 73 2e 20 2a 2f 0a 20 20 20 20 64 77 43 72 65 61  s. */.    dwCrea
24e00 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 20  tionDisposition 
24e10 3d 20 4f 50 45 4e 5f 45 58 49 53 54 49 4e 47 3b  = OPEN_EXISTING;
24e20 0a 20 20 7d 0a 0a 20 20 64 77 53 68 61 72 65 4d  .  }..  dwShareM
24e30 6f 64 65 20 3d 20 46 49 4c 45 5f 53 48 41 52 45  ode = FILE_SHARE
24e40 5f 52 45 41 44 20 7c 20 46 49 4c 45 5f 53 48 41  _READ | FILE_SHA
24e50 52 45 5f 57 52 49 54 45 3b 0a 0a 20 20 69 66 28  RE_WRITE;..  if(
24e60 20 69 73 44 65 6c 65 74 65 20 29 7b 0a 23 69 66   isDelete ){.#if
24e70 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
24e80 0a 20 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41  .    dwFlagsAndA
24e90 74 74 72 69 62 75 74 65 73 20 3d 20 46 49 4c 45  ttributes = FILE
24ea0 5f 41 54 54 52 49 42 55 54 45 5f 48 49 44 44 45  _ATTRIBUTE_HIDDE
24eb0 4e 3b 0a 20 20 20 20 69 73 54 65 6d 70 20 3d 20  N;.    isTemp = 
24ec0 31 3b 0a 23 65 6c 73 65 0a 20 20 20 20 64 77 46  1;.#else.    dwF
24ed0 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65  lagsAndAttribute
24ee0 73 20 3d 20 46 49 4c 45 5f 41 54 54 52 49 42 55  s = FILE_ATTRIBU
24ef0 54 45 5f 54 45 4d 50 4f 52 41 52 59 0a 20 20 20  TE_TEMPORARY.   
24f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24f10 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 46 49              | FI
24f20 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 48 49 44  LE_ATTRIBUTE_HID
24f30 44 45 4e 0a 20 20 20 20 20 20 20 20 20 20 20 20  DEN.            
24f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24f50 20 20 20 7c 20 46 49 4c 45 5f 46 4c 41 47 5f 44     | FILE_FLAG_D
24f60 45 4c 45 54 45 5f 4f 4e 5f 43 4c 4f 53 45 3b 0a  ELETE_ON_CLOSE;.
24f70 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a  #endif.  }else{.
24f80 20 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74      dwFlagsAndAt
24f90 74 72 69 62 75 74 65 73 20 3d 20 46 49 4c 45 5f  tributes = FILE_
24fa0 41 54 54 52 49 42 55 54 45 5f 4e 4f 52 4d 41 4c  ATTRIBUTE_NORMAL
24fb0 3b 0a 20 20 7d 0a 20 20 2f 2a 20 52 65 70 6f 72  ;.  }.  /* Repor
24fc0 74 73 20 66 72 6f 6d 20 74 68 65 20 69 6e 74 65  ts from the inte
24fd0 72 6e 65 74 20 61 72 65 20 74 68 61 74 20 70 65  rnet are that pe
24fe0 72 66 6f 72 6d 61 6e 63 65 20 69 73 20 61 6c 77  rformance is alw
24ff0 61 79 73 0a 20 20 2a 2a 20 62 65 74 74 65 72 20  ays.  ** better 
25000 69 66 20 46 49 4c 45 5f 46 4c 41 47 5f 52 41 4e  if FILE_FLAG_RAN
25010 44 4f 4d 5f 41 43 43 45 53 53 20 69 73 20 75 73  DOM_ACCESS is us
25020 65 64 2e 20 20 54 69 63 6b 65 74 20 23 32 36 39  ed.  Ticket #269
25030 39 2e 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  9. */.#if SQLITE
25040 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 64 77 46 6c  _OS_WINCE.  dwFl
25050 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73  agsAndAttributes
25060 20 7c 3d 20 46 49 4c 45 5f 46 4c 41 47 5f 52 41   |= FILE_FLAG_RA
25070 4e 44 4f 4d 5f 41 43 43 45 53 53 3b 0a 23 65 6e  NDOM_ACCESS;.#en
25080 64 69 66 0a 0a 20 20 69 66 28 20 6f 73 49 73 4e  dif..  if( osIsN
25090 54 28 29 20 29 7b 0a 23 69 66 20 53 51 4c 49 54  T() ){.#if SQLIT
250a0 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 43  E_OS_WINRT.    C
250b0 52 45 41 54 45 46 49 4c 45 32 5f 45 58 54 45 4e  REATEFILE2_EXTEN
250c0 44 45 44 5f 50 41 52 41 4d 45 54 45 52 53 20 65  DED_PARAMETERS e
250d0 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72  xtendedParameter
250e0 73 3b 0a 20 20 20 20 65 78 74 65 6e 64 65 64 50  s;.    extendedP
250f0 61 72 61 6d 65 74 65 72 73 2e 64 77 53 69 7a 65  arameters.dwSize
25100 20 3d 20 73 69 7a 65 6f 66 28 43 52 45 41 54 45   = sizeof(CREATE
25110 46 49 4c 45 32 5f 45 58 54 45 4e 44 45 44 5f 50  FILE2_EXTENDED_P
25120 41 52 41 4d 45 54 45 52 53 29 3b 0a 20 20 20 20  ARAMETERS);.    
25130 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74 65  extendedParamete
25140 72 73 2e 64 77 46 69 6c 65 41 74 74 72 69 62 75  rs.dwFileAttribu
25150 74 65 73 20 3d 0a 20 20 20 20 20 20 20 20 20 20  tes =.          
25160 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72    dwFlagsAndAttr
25170 69 62 75 74 65 73 20 26 20 46 49 4c 45 5f 41 54  ibutes & FILE_AT
25180 54 52 49 42 55 54 45 5f 4d 41 53 4b 3b 0a 20 20  TRIBUTE_MASK;.  
25190 20 20 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65    extendedParame
251a0 74 65 72 73 2e 64 77 46 69 6c 65 46 6c 61 67 73  ters.dwFileFlags
251b0 20 3d 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74   = dwFlagsAndAtt
251c0 72 69 62 75 74 65 73 20 26 20 46 49 4c 45 5f 46  ributes & FILE_F
251d0 4c 41 47 5f 4d 41 53 4b 3b 0a 20 20 20 20 65 78  LAG_MASK;.    ex
251e0 74 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73  tendedParameters
251f0 2e 64 77 53 65 63 75 72 69 74 79 51 6f 73 46 6c  .dwSecurityQosFl
25200 61 67 73 20 3d 20 53 45 43 55 52 49 54 59 5f 41  ags = SECURITY_A
25210 4e 4f 4e 59 4d 4f 55 53 3b 0a 20 20 20 20 65 78  NONYMOUS;.    ex
25220 74 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73  tendedParameters
25230 2e 6c 70 53 65 63 75 72 69 74 79 41 74 74 72 69  .lpSecurityAttri
25240 62 75 74 65 73 20 3d 20 4e 55 4c 4c 3b 0a 20 20  butes = NULL;.  
25250 20 20 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65    extendedParame
25260 74 65 72 73 2e 68 54 65 6d 70 6c 61 74 65 46 69  ters.hTemplateFi
25270 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 77  le = NULL;.    w
25280 68 69 6c 65 28 20 28 68 20 3d 20 6f 73 43 72 65  hile( (h = osCre
25290 61 74 65 46 69 6c 65 32 28 28 4c 50 43 57 53 54  ateFile2((LPCWST
252a0 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20  R)zConverted,.  
252b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
252c0 20 20 20 20 20 20 20 20 20 20 20 20 64 77 44 65              dwDe
252d0 73 69 72 65 64 41 63 63 65 73 73 2c 0a 20 20 20  siredAccess,.   
252e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
252f0 20 20 20 20 20 20 20 20 20 20 20 64 77 53 68 61             dwSha
25300 72 65 4d 6f 64 65 2c 0a 20 20 20 20 20 20 20 20  reMode,.        
25310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25320 20 20 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e        dwCreation
25330 44 69 73 70 6f 73 69 74 69 6f 6e 2c 0a 20 20 20  Disposition,.   
25340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25350 20 20 20 20 20 20 20 20 20 20 20 26 65 78 74 65             &exte
25360 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73 29 29  ndedParameters))
25370 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  ==INVALID_HANDLE
25380 5f 56 41 4c 55 45 20 26 26 0a 20 20 20 20 20 20  _VALUE &&.      
25390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
253a0 20 20 20 20 20 20 20 20 77 69 6e 52 65 74 72 79          winRetry
253b0 49 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c 61 73  Ioerr(&cnt, &las
253c0 74 45 72 72 6e 6f 29 20 29 7b 0a 20 20 20 20 20  tErrno) ){.     
253d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 6f            /* Noo
253e0 70 20 2a 2f 0a 20 20 20 20 7d 0a 23 65 6c 73 65  p */.    }.#else
253f0 0a 20 20 20 20 77 68 69 6c 65 28 20 28 68 20 3d  .    while( (h =
25400 20 6f 73 43 72 65 61 74 65 46 69 6c 65 57 28 28   osCreateFileW((
25410 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74  LPCWSTR)zConvert
25420 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ed,.            
25430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25440 20 20 64 77 44 65 73 69 72 65 64 41 63 63 65 73    dwDesiredAcces
25450 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s,.             
25460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25470 20 64 77 53 68 61 72 65 4d 6f 64 65 2c 20 4e 55   dwShareMode, NU
25480 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  LL,.            
25490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
254a0 20 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70    dwCreationDisp
254b0 6f 73 69 74 69 6f 6e 2c 0a 20 20 20 20 20 20 20  osition,.       
254c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
254d0 20 20 20 20 20 20 20 64 77 46 6c 61 67 73 41 6e         dwFlagsAn
254e0 64 41 74 74 72 69 62 75 74 65 73 2c 0a 20 20 20  dAttributes,.   
254f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25500 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 29             NULL)
25510 29 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c  )==INVALID_HANDL
25520 45 5f 56 41 4c 55 45 20 26 26 0a 20 20 20 20 20  E_VALUE &&.     
25530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25540 20 20 20 20 20 20 20 20 20 77 69 6e 52 65 74 72           winRetr
25550 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c 61  yIoerr(&cnt, &la
25560 73 74 45 72 72 6e 6f 29 20 29 7b 0a 20 20 20 20  stErrno) ){.    
25570 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f             /* No
25580 6f 70 20 2a 2f 0a 20 20 20 20 7d 0a 23 65 6e 64  op */.    }.#end
25590 69 66 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51  if.  }.#ifdef SQ
255a0 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
255b0 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20  NSI.  else{.    
255c0 77 68 69 6c 65 28 20 28 68 20 3d 20 6f 73 43 72  while( (h = osCr
255d0 65 61 74 65 46 69 6c 65 41 28 28 4c 50 43 53 54  eateFileA((LPCST
255e0 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20  R)zConverted,.  
255f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25600 20 20 20 20 20 20 20 20 20 20 20 20 64 77 44 65              dwDe
25610 73 69 72 65 64 41 63 63 65 73 73 2c 0a 20 20 20  siredAccess,.   
25620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25630 20 20 20 20 20 20 20 20 20 20 20 64 77 53 68 61             dwSha
25640 72 65 4d 6f 64 65 2c 20 4e 55 4c 4c 2c 0a 20 20  reMode, NULL,.  
25650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25660 20 20 20 20 20 20 20 20 20 20 20 20 64 77 43 72              dwCr
25670 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f  eationDispositio
25680 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n,.             
25690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
256a0 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69   dwFlagsAndAttri
256b0 62 75 74 65 73 2c 0a 20 20 20 20 20 20 20 20 20  butes,.         
256c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
256d0 20 20 20 20 20 4e 55 4c 4c 29 29 3d 3d 49 4e 56       NULL))==INV
256e0 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
256f0 45 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20  E &&.           
25700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25710 20 20 20 77 69 6e 52 65 74 72 79 49 6f 65 72 72     winRetryIoerr
25720 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e  (&cnt, &lastErrn
25730 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  o) ){.          
25740 20 20 20 20 20 2f 2a 20 4e 6f 6f 70 20 2a 2f 0a       /* Noop */.
25750 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
25760 0a 20 20 77 69 6e 4c 6f 67 49 6f 65 72 72 28 63  .  winLogIoerr(c
25770 6e 74 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28  nt);..  OSTRACE(
25780 28 22 4f 50 45 4e 20 66 69 6c 65 3d 25 70 2c 20  ("OPEN file=%p, 
25790 6e 61 6d 65 3d 25 73 2c 20 61 63 63 65 73 73 3d  name=%s, access=
257a0 25 6c 78 2c 20 72 63 3d 25 73 5c 6e 22 2c 20 68  %lx, rc=%s\n", h
257b0 2c 20 7a 55 74 66 38 4e 61 6d 65 2c 0a 20 20 20  , zUtf8Name,.   
257c0 20 20 20 20 20 20 20 20 64 77 44 65 73 69 72 65          dwDesire
257d0 64 41 63 63 65 73 73 2c 20 28 68 3d 3d 49 4e 56  dAccess, (h==INV
257e0 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
257f0 45 29 20 3f 20 22 66 61 69 6c 65 64 22 20 3a 20  E) ? "failed" : 
25800 22 6f 6b 22 29 29 3b 0a 0a 20 20 69 66 28 20 68  "ok"));..  if( h
25810 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  ==INVALID_HANDLE
25820 5f 56 41 4c 55 45 20 29 7b 0a 20 20 20 20 70 46  _VALUE ){.    pF
25830 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
25840 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20   lastErrno;.    
25850 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
25860 54 45 5f 43 41 4e 54 4f 50 45 4e 2c 20 70 46 69  TE_CANTOPEN, pFi
25870 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 20 22  le->lastErrno, "
25880 77 69 6e 4f 70 65 6e 22 2c 20 7a 55 74 66 38 4e  winOpen", zUtf8N
25890 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ame);.    sqlite
258a0 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
258b0 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  d);.    sqlite3_
258c0 66 72 65 65 28 7a 54 6d 70 6e 61 6d 65 29 3b 0a  free(zTmpname);.
258d0 20 20 20 20 69 66 28 20 69 73 52 65 61 64 57 72      if( isReadWr
258e0 69 74 65 20 26 26 20 21 69 73 45 78 63 6c 75 73  ite && !isExclus
258f0 69 76 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ive ){.      ret
25900 75 72 6e 20 77 69 6e 4f 70 65 6e 28 70 56 66 73  urn winOpen(pVfs
25910 2c 20 7a 4e 61 6d 65 2c 20 69 64 2c 0a 20 20 20  , zName, id,.   
25920 20 20 20 20 20 20 28 28 66 6c 61 67 73 7c 53 51        ((flags|SQ
25930 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
25940 4c 59 29 20 26 0a 20 20 20 20 20 20 20 20 20 20  LY) &.          
25950 20 20 20 20 20 20 20 20 20 20 20 7e 28 53 51 4c             ~(SQL
25960 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c  ITE_OPEN_CREATE|
25970 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
25980 57 52 49 54 45 29 29 2c 0a 20 20 20 20 20 20 20  WRITE)),.       
25990 20 20 70 4f 75 74 46 6c 61 67 73 29 3b 0a 20 20    pOutFlags);.  
259a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
259b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e  eturn SQLITE_CAN
259c0 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20  TOPEN_BKPT;.    
259d0 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4f 75  }.  }..  if( pOu
259e0 74 46 6c 61 67 73 20 29 7b 0a 20 20 20 20 69 66  tFlags ){.    if
259f0 28 20 69 73 52 65 61 64 57 72 69 74 65 20 29 7b  ( isReadWrite ){
25a00 0a 20 20 20 20 20 20 2a 70 4f 75 74 46 6c 61 67  .      *pOutFlag
25a10 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s = SQLITE_OPEN_
25a20 52 45 41 44 57 52 49 54 45 3b 0a 20 20 20 20 7d  READWRITE;.    }
25a30 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 4f 75  else{.      *pOu
25a40 74 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f  tFlags = SQLITE_
25a50 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  OPEN_READONLY;. 
25a60 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 4f 53 54 52     }.  }..  OSTR
25a70 41 43 45 28 28 22 4f 50 45 4e 20 66 69 6c 65 3d  ACE(("OPEN file=
25a80 25 70 2c 20 6e 61 6d 65 3d 25 73 2c 20 61 63 63  %p, name=%s, acc
25a90 65 73 73 3d 25 6c 78 2c 20 70 4f 75 74 46 6c 61  ess=%lx, pOutFla
25aa0 67 73 3d 25 70 2c 20 2a 70 4f 75 74 46 6c 61 67  gs=%p, *pOutFlag
25ab0 73 3d 25 64 2c 20 22 0a 20 20 20 20 20 20 20 20  s=%d, ".        
25ac0 20 20 20 22 72 63 3d 25 73 5c 6e 22 2c 20 68 2c     "rc=%s\n", h,
25ad0 20 7a 55 74 66 38 4e 61 6d 65 2c 20 64 77 44 65   zUtf8Name, dwDe
25ae0 73 69 72 65 64 41 63 63 65 73 73 2c 20 70 4f 75  siredAccess, pOu
25af0 74 46 6c 61 67 73 2c 20 70 4f 75 74 46 6c 61 67  tFlags, pOutFlag
25b00 73 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20 2a  s ?.           *
25b10 70 4f 75 74 46 6c 61 67 73 20 3a 20 30 2c 20 28  pOutFlags : 0, (
25b20 68 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c  h==INVALID_HANDL
25b30 45 5f 56 41 4c 55 45 29 20 3f 20 22 66 61 69 6c  E_VALUE) ? "fail
25b40 65 64 22 20 3a 20 22 6f 6b 22 29 29 3b 0a 0a 23  ed" : "ok"));..#
25b50 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
25b60 43 45 0a 20 20 69 66 28 20 69 73 52 65 61 64 57  CE.  if( isReadW
25b70 72 69 74 65 20 26 26 20 65 54 79 70 65 3d 3d 53  rite && eType==S
25b80 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
25b90 44 42 0a 20 20 20 20 20 20 20 26 26 20 28 72 63  DB.       && (rc
25ba0 20 3d 20 77 69 6e 63 65 43 72 65 61 74 65 4c 6f   = winceCreateLo
25bb0 63 6b 28 7a 4e 61 6d 65 2c 20 70 46 69 6c 65 29  ck(zName, pFile)
25bc0 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 29  )!=SQLITE_OK.  )
25bd0 7b 0a 20 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e  {.    osCloseHan
25be0 64 6c 65 28 68 29 3b 0a 20 20 20 20 73 71 6c 69  dle(h);.    sqli
25bf0 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
25c00 74 65 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ted);.    sqlite
25c10 33 5f 66 72 65 65 28 7a 54 6d 70 6e 61 6d 65 29  3_free(zTmpname)
25c20 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  ;.    OSTRACE(("
25c30 4f 50 45 4e 2d 43 45 2d 4c 4f 43 4b 20 6e 61 6d  OPEN-CE-LOCK nam
25c40 65 3d 25 73 2c 20 72 63 3d 25 73 5c 6e 22 2c 20  e=%s, rc=%s\n", 
25c50 7a 4e 61 6d 65 2c 20 73 71 6c 69 74 65 33 45 72  zName, sqlite3Er
25c60 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 20  rName(rc)));.   
25c70 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
25c80 20 20 69 66 28 20 69 73 54 65 6d 70 20 29 7b 0a    if( isTemp ){.
25c90 20 20 20 20 70 46 69 6c 65 2d 3e 7a 44 65 6c 65      pFile->zDele
25ca0 74 65 4f 6e 43 6c 6f 73 65 20 3d 20 7a 43 6f 6e  teOnClose = zCon
25cb0 76 65 72 74 65 64 3b 0a 20 20 7d 65 6c 73 65 0a  verted;.  }else.
25cc0 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20 73  #endif.  {.    s
25cd0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e  qlite3_free(zCon
25ce0 76 65 72 74 65 64 29 3b 0a 20 20 7d 0a 0a 20 20  verted);.  }..  
25cf0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 6d  sqlite3_free(zTm
25d00 70 6e 61 6d 65 29 3b 0a 20 20 70 46 69 6c 65 2d  pname);.  pFile-
25d10 3e 70 4d 65 74 68 6f 64 20 3d 20 26 77 69 6e 49  >pMethod = &winI
25d20 6f 4d 65 74 68 6f 64 3b 0a 20 20 70 46 69 6c 65  oMethod;.  pFile
25d30 2d 3e 70 56 66 73 20 3d 20 70 56 66 73 3b 0a 20  ->pVfs = pVfs;. 
25d40 20 70 46 69 6c 65 2d 3e 68 20 3d 20 68 3b 0a 20   pFile->h = h;. 
25d50 20 69 66 28 20 69 73 52 65 61 64 6f 6e 6c 79 20   if( isReadonly 
25d60 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74  ){.    pFile->ct
25d70 72 6c 46 6c 61 67 73 20 7c 3d 20 57 49 4e 46 49  rlFlags |= WINFI
25d80 4c 45 5f 52 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20  LE_RDONLY;.  }. 
25d90 20 69 66 28 20 73 71 6c 69 74 65 33 5f 75 72 69   if( sqlite3_uri
25da0 5f 62 6f 6f 6c 65 61 6e 28 7a 4e 61 6d 65 2c 20  _boolean(zName, 
25db0 22 70 73 6f 77 22 2c 20 53 51 4c 49 54 45 5f 50  "psow", SQLITE_P
25dc0 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49  OWERSAFE_OVERWRI
25dd0 54 45 29 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  TE) ){.    pFile
25de0 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 57  ->ctrlFlags |= W
25df0 49 4e 46 49 4c 45 5f 50 53 4f 57 3b 0a 20 20 7d  INFILE_PSOW;.  }
25e00 0a 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  .  pFile->lastEr
25e10 72 6e 6f 20 3d 20 4e 4f 5f 45 52 52 4f 52 3b 0a  rno = NO_ERROR;.
25e20 20 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 20 3d    pFile->zPath =
25e30 20 7a 4e 61 6d 65 3b 0a 23 69 66 20 53 51 4c 49   zName;.#if SQLI
25e40 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
25e50 3e 30 0a 20 20 70 46 69 6c 65 2d 3e 68 4d 61 70  >0.  pFile->hMap
25e60 20 3d 20 4e 55 4c 4c 3b 0a 20 20 70 46 69 6c 65   = NULL;.  pFile
25e70 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 3d 20 30  ->pMapRegion = 0
25e80 3b 0a 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53  ;.  pFile->mmapS
25e90 69 7a 65 20 3d 20 30 3b 0a 20 20 70 46 69 6c 65  ize = 0;.  pFile
25ea0 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c  ->mmapSizeActual
25eb0 20 3d 20 30 3b 0a 20 20 70 46 69 6c 65 2d 3e 6d   = 0;.  pFile->m
25ec0 6d 61 70 53 69 7a 65 4d 61 78 20 3d 20 73 71 6c  mapSizeMax = sql
25ed0 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
25ee0 2e 73 7a 4d 6d 61 70 3b 0a 23 65 6e 64 69 66 0a  .szMmap;.#endif.
25ef0 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2b  .  OpenCounter(+
25f00 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  1);.  return rc;
25f10 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
25f20 20 74 68 65 20 6e 61 6d 65 64 20 66 69 6c 65 2e   the named file.
25f30 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
25f40 20 57 69 6e 64 6f 77 73 20 64 6f 65 73 20 6e 6f   Windows does no
25f50 74 20 61 6c 6c 6f 77 20 61 20 66 69 6c 65 20 74  t allow a file t
25f60 6f 20 62 65 20 64 65 6c 65 74 65 64 20 69 66 20  o be deleted if 
25f70 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 70 72  some other.** pr
25f80 6f 63 65 73 73 20 68 61 73 20 69 74 20 6f 70 65  ocess has it ope
25f90 6e 2e 20 20 53 6f 6d 65 74 69 6d 65 73 20 61 20  n.  Sometimes a 
25fa0 76 69 72 75 73 20 73 63 61 6e 6e 65 72 20 6f 72  virus scanner or
25fb0 20 69 6e 64 65 78 69 6e 67 20 70 72 6f 67 72 61   indexing progra
25fc0 6d 0a 2a 2a 20 77 69 6c 6c 20 6f 70 65 6e 20 61  m.** will open a
25fd0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 68   journal file sh
25fe0 6f 72 74 6c 79 20 61 66 74 65 72 20 69 74 20 69  ortly after it i
25ff0 73 20 63 72 65 61 74 65 64 20 69 6e 20 6f 72 64  s created in ord
26000 65 72 20 74 6f 20 64 6f 0a 2a 2a 20 77 68 61 74  er to do.** what
26010 65 76 65 72 20 69 74 20 64 6f 65 73 2e 20 20 57  ever it does.  W
26020 68 69 6c 65 20 74 68 69 73 20 6f 74 68 65 72 20  hile this other 
26030 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69  process is holdi
26040 6e 67 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 6f  ng the.** file o
26050 70 65 6e 2c 20 77 65 20 77 69 6c 6c 20 62 65 20  pen, we will be 
26060 75 6e 61 62 6c 65 20 74 6f 20 64 65 6c 65 74 65  unable to delete
26070 20 69 74 2e 20 20 54 6f 20 77 6f 72 6b 20 61 72   it.  To work ar
26080 6f 75 6e 64 20 74 68 69 73 0a 2a 2a 20 70 72 6f  ound this.** pro
26090 62 6c 65 6d 2c 20 77 65 20 64 65 6c 61 79 20 31  blem, we delay 1
260a0 30 30 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20  00 milliseconds 
260b0 61 6e 64 20 74 72 79 20 74 6f 20 64 65 6c 65 74  and try to delet
260c0 65 20 61 67 61 69 6e 2e 20 20 55 70 0a 2a 2a 20  e again.  Up.** 
260d0 74 6f 20 4d 58 5f 44 45 4c 45 54 49 4f 4e 5f 41  to MX_DELETION_A
260e0 54 54 45 4d 50 54 73 20 64 65 6c 65 74 69 6f 6e  TTEMPTs deletion
260f0 20 61 74 74 65 6d 70 74 73 20 61 72 65 20 72 75   attempts are ru
26100 6e 20 62 65 66 6f 72 65 20 67 69 76 69 6e 67 0a  n before giving.
26110 2a 2a 20 75 70 20 61 6e 64 20 72 65 74 75 72 6e  ** up and return
26120 69 6e 67 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f  ing an error..*/
26130 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 44  .static int winD
26140 65 6c 65 74 65 28 0a 20 20 73 71 6c 69 74 65 33  elete(.  sqlite3
26150 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20  _vfs *pVfs,     
26160 20 20 20 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64       /* Not used
26170 20 6f 6e 20 77 69 6e 33 32 20 2a 2f 0a 20 20 63   on win32 */.  c
26180 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
26190 6e 61 6d 65 2c 20 20 20 20 20 20 2f 2a 20 4e 61  name,      /* Na
261a0 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 64 65  me of file to de
261b0 6c 65 74 65 20 2a 2f 0a 20 20 69 6e 74 20 73 79  lete */.  int sy
261c0 6e 63 44 69 72 20 20 20 20 20 20 20 20 20 20 20  ncDir           
261d0 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 75 73 65        /* Not use
261e0 64 20 6f 6e 20 77 69 6e 33 32 20 2a 2f 0a 29 7b  d on win32 */.){
261f0 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a  .  int cnt = 0;.
26200 20 20 69 6e 74 20 72 63 3b 0a 20 20 44 57 4f 52    int rc;.  DWOR
26210 44 20 61 74 74 72 3b 0a 20 20 44 57 4f 52 44 20  D attr;.  DWORD 
26220 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 20  lastErrno = 0;. 
26230 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65   void *zConverte
26240 64 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  d;.  UNUSED_PARA
26250 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 55  METER(pVfs);.  U
26260 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
26270 73 79 6e 63 44 69 72 29 3b 0a 0a 20 20 53 69 6d  syncDir);..  Sim
26280 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74  ulateIOError(ret
26290 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
262a0 5f 44 45 4c 45 54 45 29 3b 0a 20 20 4f 53 54 52  _DELETE);.  OSTR
262b0 41 43 45 28 28 22 44 45 4c 45 54 45 20 6e 61 6d  ACE(("DELETE nam
262c0 65 3d 25 73 2c 20 73 79 6e 63 44 69 72 3d 25 64  e=%s, syncDir=%d
262d0 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20  \n", zFilename, 
262e0 73 79 6e 63 44 69 72 29 29 3b 0a 0a 20 20 7a 43  syncDir));..  zC
262f0 6f 6e 76 65 72 74 65 64 20 3d 20 77 69 6e 43 6f  onverted = winCo
26300 6e 76 65 72 74 46 72 6f 6d 55 74 66 38 46 69 6c  nvertFromUtf8Fil
26310 65 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29  ename(zFilename)
26320 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74  ;.  if( zConvert
26330 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 4f 53 54  ed==0 ){.    OST
26340 52 41 43 45 28 28 22 44 45 4c 45 54 45 20 6e 61  RACE(("DELETE na
26350 6d 65 3d 25 73 2c 20 72 63 3d 53 51 4c 49 54 45  me=%s, rc=SQLITE
26360 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 2c  _IOERR_NOMEM\n",
26370 20 7a 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20   zFilename));.  
26380 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
26390 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  IOERR_NOMEM;.  }
263a0 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20  .  if( osIsNT() 
263b0 29 7b 0a 20 20 20 20 64 6f 20 7b 0a 23 69 66 20  ){.    do {.#if 
263c0 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
263d0 20 20 20 20 20 20 57 49 4e 33 32 5f 46 49 4c 45        WIN32_FILE
263e0 5f 41 54 54 52 49 42 55 54 45 5f 44 41 54 41 20  _ATTRIBUTE_DATA 
263f0 73 41 74 74 72 44 61 74 61 3b 0a 20 20 20 20 20  sAttrData;.     
26400 20 6d 65 6d 73 65 74 28 26 73 41 74 74 72 44 61   memset(&sAttrDa
26410 74 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 41  ta, 0, sizeof(sA
26420 74 74 72 44 61 74 61 29 29 3b 0a 20 20 20 20 20  ttrData));.     
26430 20 69 66 20 28 20 6f 73 47 65 74 46 69 6c 65 41   if ( osGetFileA
26440 74 74 72 69 62 75 74 65 73 45 78 57 28 7a 43 6f  ttributesExW(zCo
26450 6e 76 65 72 74 65 64 2c 20 47 65 74 46 69 6c 65  nverted, GetFile
26460 45 78 49 6e 66 6f 53 74 61 6e 64 61 72 64 2c 0a  ExInfoStandard,.
26470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26490 20 20 26 73 41 74 74 72 44 61 74 61 29 20 29 7b    &sAttrData) ){
264a0 0a 20 20 20 20 20 20 20 20 61 74 74 72 20 3d 20  .        attr = 
264b0 73 41 74 74 72 44 61 74 61 2e 64 77 46 69 6c 65  sAttrData.dwFile
264c0 41 74 74 72 69 62 75 74 65 73 3b 0a 20 20 20 20  Attributes;.    
264d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
264e0 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47   lastErrno = osG
264f0 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
26500 20 20 20 20 20 20 20 69 66 28 20 6c 61 73 74 45         if( lastE
26510 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 46 49 4c 45  rrno==ERROR_FILE
26520 5f 4e 4f 54 5f 46 4f 55 4e 44 0a 20 20 20 20 20  _NOT_FOUND.     
26530 20 20 20 20 7c 7c 20 6c 61 73 74 45 72 72 6e 6f      || lastErrno
26540 3d 3d 45 52 52 4f 52 5f 50 41 54 48 5f 4e 4f 54  ==ERROR_PATH_NOT
26550 5f 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20 20 20  _FOUND ){.      
26560 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
26570 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45  IOERR_DELETE_NOE
26580 4e 54 3b 20 2f 2a 20 41 6c 72 65 61 64 79 20 67  NT; /* Already g
26590 6f 6e 65 3f 20 2a 2f 0a 20 20 20 20 20 20 20 20  one? */.        
265a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
265b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
265c0 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  OR;.        }.  
265d0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
265e0 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 20     }.#else.     
265f0 20 61 74 74 72 20 3d 20 6f 73 47 65 74 46 69 6c   attr = osGetFil
26600 65 41 74 74 72 69 62 75 74 65 73 57 28 7a 43 6f  eAttributesW(zCo
26610 6e 76 65 72 74 65 64 29 3b 0a 23 65 6e 64 69 66  nverted);.#endif
26620 0a 20 20 20 20 20 20 69 66 20 28 20 61 74 74 72  .      if ( attr
26630 3d 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41  ==INVALID_FILE_A
26640 54 54 52 49 42 55 54 45 53 20 29 7b 0a 20 20 20  TTRIBUTES ){.   
26650 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d       lastErrno =
26660 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
26670 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c  );.        if( l
26680 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f  astErrno==ERROR_
26690 46 49 4c 45 5f 4e 4f 54 5f 46 4f 55 4e 44 0a 20  FILE_NOT_FOUND. 
266a0 20 20 20 20 20 20 20 20 7c 7c 20 6c 61 73 74 45          || lastE
266b0 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 50 41 54 48  rrno==ERROR_PATH
266c0 5f 4e 4f 54 5f 46 4f 55 4e 44 20 29 7b 0a 20 20  _NOT_FOUND ){.  
266d0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
266e0 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45  ITE_IOERR_DELETE
266f0 5f 4e 4f 45 4e 54 3b 20 2f 2a 20 41 6c 72 65 61  _NOENT; /* Alrea
26700 64 79 20 67 6f 6e 65 3f 20 2a 2f 0a 20 20 20 20  dy gone? */.    
26710 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
26720 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
26730 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
26740 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  }.        break;
26750 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
26760 66 20 28 20 61 74 74 72 26 46 49 4c 45 5f 41 54  f ( attr&FILE_AT
26770 54 52 49 42 55 54 45 5f 44 49 52 45 43 54 4f 52  TRIBUTE_DIRECTOR
26780 59 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  Y ){.        rc 
26790 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20  = SQLITE_ERROR; 
267a0 2f 2a 20 46 69 6c 65 73 20 6f 6e 6c 79 2e 20 2a  /* Files only. *
267b0 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  /.        break;
267c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
267d0 66 20 28 20 6f 73 44 65 6c 65 74 65 46 69 6c 65  f ( osDeleteFile
267e0 57 28 7a 43 6f 6e 76 65 72 74 65 64 29 20 29 7b  W(zConverted) ){
267f0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
26800 4c 49 54 45 5f 4f 4b 3b 20 2f 2a 20 44 65 6c 65  LITE_OK; /* Dele
26810 74 65 64 20 4f 4b 2e 20 2a 2f 0a 20 20 20 20 20  ted OK. */.     
26820 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
26830 7d 0a 20 20 20 20 20 20 69 66 20 28 20 21 77 69  }.      if ( !wi
26840 6e 52 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74  nRetryIoerr(&cnt
26850 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b  , &lastErrno) ){
26860 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
26870 4c 49 54 45 5f 45 52 52 4f 52 3b 20 2f 2a 20 4e  LITE_ERROR; /* N
26880 6f 20 6d 6f 72 65 20 72 65 74 72 69 65 73 2e 20  o more retries. 
26890 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  */.        break
268a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20  ;.      }.    } 
268b0 77 68 69 6c 65 28 31 29 3b 0a 20 20 7d 0a 23 69  while(1);.  }.#i
268c0 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  fdef SQLITE_WIN3
268d0 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73  2_HAS_ANSI.  els
268e0 65 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20  e{.    do {.    
268f0 20 20 61 74 74 72 20 3d 20 6f 73 47 65 74 46 69    attr = osGetFi
26900 6c 65 41 74 74 72 69 62 75 74 65 73 41 28 7a 43  leAttributesA(zC
26910 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20  onverted);.     
26920 20 69 66 20 28 20 61 74 74 72 3d 3d 49 4e 56 41   if ( attr==INVA
26930 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55  LID_FILE_ATTRIBU
26940 54 45 53 20 29 7b 0a 20 20 20 20 20 20 20 20 6c  TES ){.        l
26950 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
26960 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
26970 20 20 20 20 20 69 66 28 20 6c 61 73 74 45 72 72       if( lastErr
26980 6e 6f 3d 3d 45 52 52 4f 52 5f 46 49 4c 45 5f 4e  no==ERROR_FILE_N
26990 4f 54 5f 46 4f 55 4e 44 0a 20 20 20 20 20 20 20  OT_FOUND.       
269a0 20 20 7c 7c 20 6c 61 73 74 45 72 72 6e 6f 3d 3d    || lastErrno==
269b0 45 52 52 4f 52 5f 50 41 54 48 5f 4e 4f 54 5f 46  ERROR_PATH_NOT_F
269c0 4f 55 4e 44 20 29 7b 0a 20 20 20 20 20 20 20 20  OUND ){.        
269d0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
269e0 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54  ERR_DELETE_NOENT
269f0 3b 20 2f 2a 20 41 6c 72 65 61 64 79 20 67 6f 6e  ; /* Already gon
26a00 65 3f 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65  e? */.        }e
26a10 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72  lse{.          r
26a20 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
26a30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
26a40 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
26a50 20 7d 0a 20 20 20 20 20 20 69 66 20 28 20 61 74   }.      if ( at
26a60 74 72 26 46 49 4c 45 5f 41 54 54 52 49 42 55 54  tr&FILE_ATTRIBUT
26a70 45 5f 44 49 52 45 43 54 4f 52 59 20 29 7b 0a 20  E_DIRECTORY ){. 
26a80 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
26a90 54 45 5f 45 52 52 4f 52 3b 20 2f 2a 20 46 69 6c  TE_ERROR; /* Fil
26aa0 65 73 20 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20  es only. */.    
26ab0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
26ac0 20 7d 0a 20 20 20 20 20 20 69 66 20 28 20 6f 73   }.      if ( os
26ad0 44 65 6c 65 74 65 46 69 6c 65 41 28 7a 43 6f 6e  DeleteFileA(zCon
26ae0 76 65 72 74 65 64 29 20 29 7b 0a 20 20 20 20 20  verted) ){.     
26af0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
26b00 4b 3b 20 2f 2a 20 44 65 6c 65 74 65 64 20 4f 4b  K; /* Deleted OK
26b10 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65  . */.        bre
26b20 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
26b30 20 20 69 66 20 28 20 21 77 69 6e 52 65 74 72 79    if ( !winRetry
26b40 49 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c 61 73  Ioerr(&cnt, &las
26b50 74 45 72 72 6e 6f 29 20 29 7b 0a 20 20 20 20 20  tErrno) ){.     
26b60 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
26b70 52 52 4f 52 3b 20 2f 2a 20 4e 6f 20 6d 6f 72 65  RROR; /* No more
26b80 20 72 65 74 72 69 65 73 2e 20 2a 2f 0a 20 20 20   retries. */.   
26b90 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
26ba0 20 20 7d 0a 20 20 20 20 7d 20 77 68 69 6c 65 28    }.    } while(
26bb0 31 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  1);.  }.#endif. 
26bc0 20 69 66 28 20 72 63 20 26 26 20 72 63 21 3d 53   if( rc && rc!=S
26bd0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45  QLITE_IOERR_DELE
26be0 54 45 5f 4e 4f 45 4e 54 20 29 7b 0a 20 20 20 20  TE_NOENT ){.    
26bf0 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72  rc = winLogError
26c00 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45  (SQLITE_IOERR_DE
26c10 4c 45 54 45 2c 20 6c 61 73 74 45 72 72 6e 6f 2c  LETE, lastErrno,
26c20 20 22 77 69 6e 44 65 6c 65 74 65 22 2c 20 7a 46   "winDelete", zF
26c30 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73  ilename);.  }els
26c40 65 7b 0a 20 20 20 20 77 69 6e 4c 6f 67 49 6f 65  e{.    winLogIoe
26c50 72 72 28 63 6e 74 29 3b 0a 20 20 7d 0a 20 20 73  rr(cnt);.  }.  s
26c60 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e  qlite3_free(zCon
26c70 76 65 72 74 65 64 29 3b 0a 20 20 4f 53 54 52 41  verted);.  OSTRA
26c80 43 45 28 28 22 44 45 4c 45 54 45 20 6e 61 6d 65  CE(("DELETE name
26c90 3d 25 73 2c 20 72 63 3d 25 73 5c 6e 22 2c 20 7a  =%s, rc=%s\n", z
26ca0 46 69 6c 65 6e 61 6d 65 2c 20 73 71 6c 69 74 65  Filename, sqlite
26cb0 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a  3ErrName(rc)));.
26cc0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
26cd0 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68 65 20  /*.** Check the 
26ce0 65 78 69 73 74 65 6e 63 65 20 61 6e 64 20 73 74  existence and st
26cf0 61 74 75 73 20 6f 66 20 61 20 66 69 6c 65 2e 0a  atus of a file..
26d00 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
26d10 6e 41 63 63 65 73 73 28 0a 20 20 73 71 6c 69 74  nAccess(.  sqlit
26d20 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20  e3_vfs *pVfs,   
26d30 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 75 73 65        /* Not use
26d40 64 20 6f 6e 20 77 69 6e 33 32 20 2a 2f 0a 20 20  d on win32 */.  
26d50 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
26d60 65 6e 61 6d 65 2c 20 20 20 20 20 2f 2a 20 4e 61  ename,     /* Na
26d70 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 63 68  me of file to ch
26d80 65 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  eck */.  int fla
26d90 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gs,             
26da0 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 74      /* Type of t
26db0 65 73 74 20 74 6f 20 6d 61 6b 65 20 6f 6e 20 74  est to make on t
26dc0 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  his file */.  in
26dd0 74 20 2a 70 52 65 73 4f 75 74 20 20 20 20 20 20  t *pResOut      
26de0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
26df0 20 52 65 73 75 6c 74 20 2a 2f 0a 29 7b 0a 20 20   Result */.){.  
26e00 44 57 4f 52 44 20 61 74 74 72 3b 0a 20 20 69 6e  DWORD attr;.  in
26e10 74 20 72 63 20 3d 20 30 3b 0a 20 20 44 57 4f 52  t rc = 0;.  DWOR
26e20 44 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b  D lastErrno = 0;
26e30 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72  .  void *zConver
26e40 74 65 64 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  ted;.  UNUSED_PA
26e50 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 0a  RAMETER(pVfs);..
26e60 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
26e70 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
26e80 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 3b 20 29  _IOERR_ACCESS; )
26e90 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 41 43  ;.  OSTRACE(("AC
26ea0 43 45 53 53 20 6e 61 6d 65 3d 25 73 2c 20 66 6c  CESS name=%s, fl
26eb0 61 67 73 3d 25 78 2c 20 70 52 65 73 4f 75 74 3d  ags=%x, pResOut=
26ec0 25 70 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %p\n",.         
26ed0 20 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 66 6c 61    zFilename, fla
26ee0 67 73 2c 20 70 52 65 73 4f 75 74 29 29 3b 0a 0a  gs, pResOut));..
26ef0 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77    zConverted = w
26f00 69 6e 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66  inConvertFromUtf
26f10 38 46 69 6c 65 6e 61 6d 65 28 7a 46 69 6c 65 6e  8Filename(zFilen
26f20 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e  ame);.  if( zCon
26f30 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20  verted==0 ){.   
26f40 20 4f 53 54 52 41 43 45 28 28 22 41 43 43 45 53   OSTRACE(("ACCES
26f50 53 20 6e 61 6d 65 3d 25 73 2c 20 72 63 3d 53 51  S name=%s, rc=SQ
26f60 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
26f70 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 29  \n", zFilename))
26f80 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
26f90 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b  ITE_IOERR_NOMEM;
26fa0 0a 20 20 7d 0a 20 20 69 66 28 20 6f 73 49 73 4e  .  }.  if( osIsN
26fb0 54 28 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 63  T() ){.    int c
26fc0 6e 74 20 3d 20 30 3b 0a 20 20 20 20 57 49 4e 33  nt = 0;.    WIN3
26fd0 32 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  2_FILE_ATTRIBUTE
26fe0 5f 44 41 54 41 20 73 41 74 74 72 44 61 74 61 3b  _DATA sAttrData;
26ff0 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 41 74  .    memset(&sAt
27000 74 72 44 61 74 61 2c 20 30 2c 20 73 69 7a 65 6f  trData, 0, sizeo
27010 66 28 73 41 74 74 72 44 61 74 61 29 29 3b 0a 20  f(sAttrData));. 
27020 20 20 20 77 68 69 6c 65 28 20 21 28 72 63 20 3d     while( !(rc =
27030 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62   osGetFileAttrib
27040 75 74 65 73 45 78 57 28 28 4c 50 43 57 53 54 52  utesExW((LPCWSTR
27050 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20  )zConverted,.   
27060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27070 20 20 20 20 20 20 20 20 20 20 47 65 74 46 69 6c            GetFil
27080 65 45 78 49 6e 66 6f 53 74 61 6e 64 61 72 64 2c  eExInfoStandard,
27090 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
270a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 73                &s
270b0 41 74 74 72 44 61 74 61 29 29 20 26 26 20 77 69  AttrData)) && wi
270c0 6e 52 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74  nRetryIoerr(&cnt
270d0 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b  , &lastErrno) ){
270e0 7d 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  }.    if( rc ){.
270f0 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 61 6e 20        /* For an 
27100 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
27110 49 53 54 53 20 71 75 65 72 79 2c 20 74 72 65 61  ISTS query, trea
27120 74 20 61 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 20  t a zero-length 
27130 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 61 73  file.      ** as
27140 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20   if it does not 
27150 65 78 69 73 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  exist..      */.
27160 20 20 20 20 20 20 69 66 28 20 20 20 20 66 6c 61        if(    fla
27170 67 73 3d 3d 53 51 4c 49 54 45 5f 41 43 43 45 53  gs==SQLITE_ACCES
27180 53 5f 45 58 49 53 54 53 0a 20 20 20 20 20 20 20  S_EXISTS.       
27190 20 20 20 26 26 20 73 41 74 74 72 44 61 74 61 2e     && sAttrData.
271a0 6e 46 69 6c 65 53 69 7a 65 48 69 67 68 3d 3d 30  nFileSizeHigh==0
271b0 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 73 41  .          && sA
271c0 74 74 72 44 61 74 61 2e 6e 46 69 6c 65 53 69 7a  ttrData.nFileSiz
271d0 65 4c 6f 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20  eLow==0 ){.     
271e0 20 20 20 61 74 74 72 20 3d 20 49 4e 56 41 4c 49     attr = INVALI
271f0 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  D_FILE_ATTRIBUTE
27200 53 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  S;.      }else{.
27210 20 20 20 20 20 20 20 20 61 74 74 72 20 3d 20 73          attr = s
27220 41 74 74 72 44 61 74 61 2e 64 77 46 69 6c 65 41  AttrData.dwFileA
27230 74 74 72 69 62 75 74 65 73 3b 0a 20 20 20 20 20  ttributes;.     
27240 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
27250 20 20 20 20 77 69 6e 4c 6f 67 49 6f 65 72 72 28      winLogIoerr(
27260 63 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  cnt);.      if( 
27270 6c 61 73 74 45 72 72 6e 6f 21 3d 45 52 52 4f 52  lastErrno!=ERROR
27280 5f 46 49 4c 45 5f 4e 4f 54 5f 46 4f 55 4e 44 20  _FILE_NOT_FOUND 
27290 26 26 20 6c 61 73 74 45 72 72 6e 6f 21 3d 45 52  && lastErrno!=ER
272a0 52 4f 52 5f 50 41 54 48 5f 4e 4f 54 5f 46 4f 55  ROR_PATH_NOT_FOU
272b0 4e 44 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ND ){.        sq
272c0 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76  lite3_free(zConv
272d0 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 20 20  erted);.        
272e0 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72  return winLogErr
272f0 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
27300 41 43 43 45 53 53 2c 20 6c 61 73 74 45 72 72 6e  ACCESS, lastErrn
27310 6f 2c 20 22 77 69 6e 41 63 63 65 73 73 22 2c 0a  o, "winAccess",.
27320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27330 20 20 20 20 20 20 20 20 20 20 20 7a 46 69 6c 65             zFile
27340 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c  name);.      }el
27350 73 65 7b 0a 20 20 20 20 20 20 20 20 61 74 74 72  se{.        attr
27360 20 3d 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f   = INVALID_FILE_
27370 41 54 54 52 49 42 55 54 45 53 3b 0a 20 20 20 20  ATTRIBUTES;.    
27380 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69    }.    }.  }.#i
27390 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  fdef SQLITE_WIN3
273a0 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73  2_HAS_ANSI.  els
273b0 65 7b 0a 20 20 20 20 61 74 74 72 20 3d 20 6f 73  e{.    attr = os
273c0 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
273d0 73 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65  sA((char*)zConve
273e0 72 74 65 64 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  rted);.  }.#endi
273f0 66 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  f.  sqlite3_free
27400 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
27410 73 77 69 74 63 68 28 20 66 6c 61 67 73 20 29 7b  switch( flags ){
27420 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
27430 5f 41 43 43 45 53 53 5f 52 45 41 44 3a 0a 20 20  _ACCESS_READ:.  
27440 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43    case SQLITE_AC
27450 43 45 53 53 5f 45 58 49 53 54 53 3a 0a 20 20 20  CESS_EXISTS:.   
27460 20 20 20 72 63 20 3d 20 61 74 74 72 21 3d 49 4e     rc = attr!=IN
27470 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49  VALID_FILE_ATTRI
27480 42 55 54 45 53 3b 0a 20 20 20 20 20 20 62 72 65  BUTES;.      bre
27490 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
274a0 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 57  ITE_ACCESS_READW
274b0 52 49 54 45 3a 0a 20 20 20 20 20 20 72 63 20 3d  RITE:.      rc =
274c0 20 61 74 74 72 21 3d 49 4e 56 41 4c 49 44 5f 46   attr!=INVALID_F
274d0 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 20 26  ILE_ATTRIBUTES &
274e0 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 28  &.             (
274f0 61 74 74 72 20 26 20 46 49 4c 45 5f 41 54 54 52  attr & FILE_ATTR
27500 49 42 55 54 45 5f 52 45 41 44 4f 4e 4c 59 29 3d  IBUTE_READONLY)=
27510 3d 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  =0;.      break;
27520 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20  .    default:.  
27530 20 20 20 20 61 73 73 65 72 74 28 21 22 49 6e 76      assert(!"Inv
27540 61 6c 69 64 20 66 6c 61 67 73 20 61 72 67 75 6d  alid flags argum
27550 65 6e 74 22 29 3b 0a 20 20 7d 0a 20 20 2a 70 52  ent");.  }.  *pR
27560 65 73 4f 75 74 20 3d 20 72 63 3b 0a 20 20 4f 53  esOut = rc;.  OS
27570 54 52 41 43 45 28 28 22 41 43 43 45 53 53 20 6e  TRACE(("ACCESS n
27580 61 6d 65 3d 25 73 2c 20 70 52 65 73 4f 75 74 3d  ame=%s, pResOut=
27590 25 70 2c 20 2a 70 52 65 73 4f 75 74 3d 25 64 2c  %p, *pResOut=%d,
275a0 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22   rc=SQLITE_OK\n"
275b0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 7a 46 69  ,.           zFi
275c0 6c 65 6e 61 6d 65 2c 20 70 52 65 73 4f 75 74 2c  lename, pResOut,
275d0 20 2a 70 52 65 73 4f 75 74 29 29 3b 0a 20 20 72   *pResOut));.  r
275e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
275f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
27600 73 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68  s non-zero if th
27610 65 20 73 70 65 63 69 66 69 65 64 20 70 61 74 68  e specified path
27620 20 6e 61 6d 65 20 73 74 61 72 74 73 20 77 69 74   name starts wit
27630 68 20 61 20 64 72 69 76 65 20 6c 65 74 74 65 72  h a drive letter
27640 0a 2a 2a 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20  .** followed by 
27650 61 20 63 6f 6c 6f 6e 20 63 68 61 72 61 63 74 65  a colon characte
27660 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f  r..*/.static BOO
27670 4c 20 77 69 6e 49 73 44 72 69 76 65 4c 65 74 74  L winIsDriveLett
27680 65 72 41 6e 64 43 6f 6c 6f 6e 28 0a 20 20 63 6f  erAndColon(.  co
27690 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 6e  nst char *zPathn
276a0 61 6d 65 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20  ame.){.  return 
276b0 28 20 73 71 6c 69 74 65 33 49 73 61 6c 70 68 61  ( sqlite3Isalpha
276c0 28 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 29 20 26  (zPathname[0]) &
276d0 26 20 7a 50 61 74 68 6e 61 6d 65 5b 31 5d 3d 3d  & zPathname[1]==
276e0 27 3a 27 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ':' );.}../*.** 
276f0 52 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f  Returns non-zero
27700 20 69 66 20 74 68 65 20 73 70 65 63 69 66 69 65   if the specifie
27710 64 20 70 61 74 68 20 6e 61 6d 65 20 73 68 6f 75  d path name shou
27720 6c 64 20 62 65 20 75 73 65 64 20 76 65 72 62 61  ld be used verba
27730 74 69 6d 2e 20 20 49 66 0a 2a 2a 20 6e 6f 6e 2d  tim.  If.** non-
27740 7a 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64  zero is returned
27750 20 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74   from this funct
27760 69 6f 6e 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67  ion, the calling
27770 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 73   function must s
27780 69 6d 70 6c 79 0a 2a 2a 20 75 73 65 20 74 68 65  imply.** use the
27790 20 70 72 6f 76 69 64 65 64 20 70 61 74 68 20 6e   provided path n
277a0 61 6d 65 20 76 65 72 62 61 74 69 6d 20 2d 4f 52  ame verbatim -OR
277b0 2d 20 72 65 73 6f 6c 76 65 20 69 74 20 69 6e 74  - resolve it int
277c0 6f 20 61 20 66 75 6c 6c 20 70 61 74 68 20 6e 61  o a full path na
277d0 6d 65 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20  me.** using the 
277e0 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 20  GetFullPathName 
277f0 57 69 6e 33 32 20 41 50 49 20 66 75 6e 63 74 69  Win32 API functi
27800 6f 6e 20 28 69 66 20 61 76 61 69 6c 61 62 6c 65  on (if available
27810 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f  )..*/.static BOO
27820 4c 20 77 69 6e 49 73 56 65 72 62 61 74 69 6d 50  L winIsVerbatimP
27830 61 74 68 6e 61 6d 65 28 0a 20 20 63 6f 6e 73 74  athname(.  const
27840 20 63 68 61 72 20 2a 7a 50 61 74 68 6e 61 6d 65   char *zPathname
27850 0a 29 7b 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66  .){.  /*.  ** If
27860 20 74 68 65 20 70 61 74 68 20 6e 61 6d 65 20 73   the path name s
27870 74 61 72 74 73 20 77 69 74 68 20 61 20 66 6f 72  tarts with a for
27880 77 61 72 64 20 73 6c 61 73 68 20 6f 72 20 61 20  ward slash or a 
27890 62 61 63 6b 73 6c 61 73 68 2c 20 69 74 20 69 73  backslash, it is
278a0 20 65 69 74 68 65 72 0a 20 20 2a 2a 20 61 20 6c   either.  ** a l
278b0 65 67 61 6c 20 55 4e 43 20 6e 61 6d 65 2c 20 61  egal UNC name, a
278c0 20 76 6f 6c 75 6d 65 20 72 65 6c 61 74 69 76 65   volume relative
278d0 20 70 61 74 68 2c 20 6f 72 20 61 6e 20 61 62 73   path, or an abs
278e0 6f 6c 75 74 65 20 70 61 74 68 20 6e 61 6d 65 20  olute path name 
278f0 69 6e 20 74 68 65 0a 20 20 2a 2a 20 22 55 6e 69  in the.  ** "Uni
27900 78 22 20 66 6f 72 6d 61 74 20 6f 6e 20 57 69 6e  x" format on Win
27910 64 6f 77 73 2e 20 20 54 68 65 72 65 20 69 73 20  dows.  There is 
27920 6e 6f 20 65 61 73 79 20 77 61 79 20 74 6f 20 64  no easy way to d
27930 69 66 66 65 72 65 6e 74 69 61 74 65 20 62 65 74  ifferentiate bet
27940 77 65 65 6e 0a 20 20 2a 2a 20 74 68 65 20 66 69  ween.  ** the fi
27950 6e 61 6c 20 74 77 6f 20 63 61 73 65 73 3b 20 74  nal two cases; t
27960 68 65 72 65 66 6f 72 65 2c 20 77 65 20 72 65 74  herefore, we ret
27970 75 72 6e 20 74 68 65 20 73 61 66 65 72 20 72 65  urn the safer re
27980 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 54 52  turn value of TR
27990 55 45 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74 20  UE.  ** so that 
279a0 63 61 6c 6c 65 72 73 20 6f 66 20 74 68 69 73 20  callers of this 
279b0 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 73 69  function will si
279c0 6d 70 6c 79 20 75 73 65 20 69 74 20 76 65 72 62  mply use it verb
279d0 61 74 69 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66 20  atim..  */.  if 
279e0 28 20 77 69 6e 49 73 44 69 72 53 65 70 28 7a 50  ( winIsDirSep(zP
279f0 61 74 68 6e 61 6d 65 5b 30 5d 29 20 29 7b 0a 20  athname[0]) ){. 
27a00 20 20 20 72 65 74 75 72 6e 20 54 52 55 45 3b 0a     return TRUE;.
27a10 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49    }..  /*.  ** I
27a20 66 20 74 68 65 20 70 61 74 68 20 6e 61 6d 65 20  f the path name 
27a30 73 74 61 72 74 73 20 77 69 74 68 20 61 20 6c 65  starts with a le
27a40 74 74 65 72 20 61 6e 64 20 61 20 63 6f 6c 6f 6e  tter and a colon
27a50 20 69 74 20 69 73 20 65 69 74 68 65 72 20 61 20   it is either a 
27a60 76 6f 6c 75 6d 65 0a 20 20 2a 2a 20 72 65 6c 61  volume.  ** rela
27a70 74 69 76 65 20 70 61 74 68 20 6f 72 20 61 6e 20  tive path or an 
27a80 61 62 73 6f 6c 75 74 65 20 70 61 74 68 2e 20 20  absolute path.  
27a90 43 61 6c 6c 65 72 73 20 6f 66 20 74 68 69 73 20  Callers of this 
27aa0 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 6e 6f  function must no
27ab0 74 0a 20 20 2a 2a 20 61 74 74 65 6d 70 74 20 74  t.  ** attempt t
27ac0 6f 20 74 72 65 61 74 20 69 74 20 61 73 20 61 20  o treat it as a 
27ad0 72 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61  relative path na
27ae0 6d 65 20 28 69 2e 65 2e 20 74 68 65 79 20 73 68  me (i.e. they sh
27af0 6f 75 6c 64 20 73 69 6d 70 6c 79 20 75 73 65 0a  ould simply use.
27b00 20 20 2a 2a 20 69 74 20 76 65 72 62 61 74 69 6d    ** it verbatim
27b10 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 20 28 20 77  )..  */.  if ( w
27b20 69 6e 49 73 44 72 69 76 65 4c 65 74 74 65 72 41  inIsDriveLetterA
27b30 6e 64 43 6f 6c 6f 6e 28 7a 50 61 74 68 6e 61 6d  ndColon(zPathnam
27b40 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  e) ){.    return
27b50 20 54 52 55 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a   TRUE;.  }..  /*
27b60 0a 20 20 2a 2a 20 49 66 20 77 65 20 67 65 74 20  .  ** If we get 
27b70 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74  to this point, t
27b80 68 65 20 70 61 74 68 20 6e 61 6d 65 20 73 68 6f  he path name sho
27b90 75 6c 64 20 61 6c 6d 6f 73 74 20 63 65 72 74 61  uld almost certa
27ba0 69 6e 6c 79 20 62 65 20 61 20 70 75 72 65 6c 79  inly be a purely
27bb0 0a 20 20 2a 2a 20 72 65 6c 61 74 69 76 65 20 6f  .  ** relative o
27bc0 6e 65 20 28 69 2e 65 2e 20 6e 6f 74 20 61 20 55  ne (i.e. not a U
27bd0 4e 43 20 6e 61 6d 65 2c 20 6e 6f 74 20 61 62 73  NC name, not abs
27be0 6f 6c 75 74 65 2c 20 61 6e 64 20 6e 6f 74 20 76  olute, and not v
27bf0 6f 6c 75 6d 65 20 72 65 6c 61 74 69 76 65 29 2e  olume relative).
27c00 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 46  .  */.  return F
27c10 41 4c 53 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ALSE;.}../*.** T
27c20 75 72 6e 20 61 20 72 65 6c 61 74 69 76 65 20 70  urn a relative p
27c30 61 74 68 6e 61 6d 65 20 69 6e 74 6f 20 61 20 66  athname into a f
27c40 75 6c 6c 20 70 61 74 68 6e 61 6d 65 2e 20 20 57  ull pathname.  W
27c50 72 69 74 65 20 74 68 65 20 66 75 6c 6c 0a 2a 2a  rite the full.**
27c60 20 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f 20 7a   pathname into z
27c70 4f 75 74 5b 5d 2e 20 20 7a 4f 75 74 5b 5d 20 77  Out[].  zOut[] w
27c80 69 6c 6c 20 62 65 20 61 74 20 6c 65 61 73 74 20  ill be at least 
27c90 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
27ca0 0a 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a  .** bytes in siz
27cb0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
27cc0 20 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65   winFullPathname
27cd0 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
27ce0 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20 20 20  *pVfs,          
27cf0 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
27d00 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  vfs object */.  
27d10 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 65 6c  const char *zRel
27d20 61 74 69 76 65 2c 20 20 20 20 20 20 20 20 2f 2a  ative,        /*
27d30 20 50 6f 73 73 69 62 6c 79 20 72 65 6c 61 74 69   Possibly relati
27d40 76 65 20 69 6e 70 75 74 20 70 61 74 68 20 2a 2f  ve input path */
27d50 0a 20 20 69 6e 74 20 6e 46 75 6c 6c 2c 20 20 20  .  int nFull,   
27d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27d70 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6f 75 74 70   /* Size of outp
27d80 75 74 20 62 75 66 66 65 72 20 69 6e 20 62 79 74  ut buffer in byt
27d90 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46  es */.  char *zF
27da0 75 6c 6c 20 20 20 20 20 20 20 20 20 20 20 20 20  ull             
27db0 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20        /* Output 
27dc0 62 75 66 66 65 72 20 2a 2f 0a 29 7b 0a 0a 23 69  buffer */.){..#i
27dd0 66 20 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 57  f defined(__CYGW
27de0 49 4e 5f 5f 29 0a 20 20 53 69 6d 75 6c 61 74 65  IN__).  Simulate
27df0 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
27e00 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a  SQLITE_ERROR );.
27e10 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
27e20 45 52 28 6e 46 75 6c 6c 29 3b 0a 20 20 61 73 73  ER(nFull);.  ass
27e30 65 72 74 28 20 6e 46 75 6c 6c 3e 3d 70 56 66 73  ert( nFull>=pVfs
27e40 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 29 3b 0a  ->mxPathname );.
27e50 20 20 69 66 20 28 20 73 71 6c 69 74 65 33 5f 64    if ( sqlite3_d
27e60 61 74 61 5f 64 69 72 65 63 74 6f 72 79 20 26 26  ata_directory &&
27e70 20 21 77 69 6e 49 73 56 65 72 62 61 74 69 6d 50   !winIsVerbatimP
27e80 61 74 68 6e 61 6d 65 28 7a 52 65 6c 61 74 69 76  athname(zRelativ
27e90 65 29 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20  e) ){.    /*.   
27ea0 20 2a 2a 20 4e 4f 54 45 3a 20 57 65 20 61 72 65   ** NOTE: We are
27eb0 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20   dealing with a 
27ec0 72 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61  relative path na
27ed0 6d 65 20 61 6e 64 20 74 68 65 20 64 61 74 61 0a  me and the data.
27ee0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 64 69 72      **       dir
27ef0 65 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20  ectory has been 
27f00 73 65 74 2e 20 20 54 68 65 72 65 66 6f 72 65 2c  set.  Therefore,
27f10 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20 62   use it as the b
27f20 61 73 69 73 0a 20 20 20 20 2a 2a 20 20 20 20 20  asis.    **     
27f30 20 20 66 6f 72 20 63 6f 6e 76 65 72 74 69 6e 67    for converting
27f40 20 74 68 65 20 72 65 6c 61 74 69 76 65 20 70 61   the relative pa
27f50 74 68 20 6e 61 6d 65 20 74 6f 20 61 6e 20 61 62  th name to an ab
27f60 73 6f 6c 75 74 65 0a 20 20 20 20 2a 2a 20 20 20  solute.    **   
27f70 20 20 20 20 6f 6e 65 20 62 79 20 70 72 65 70 65      one by prepe
27f80 6e 64 69 6e 67 20 74 68 65 20 64 61 74 61 20 64  nding the data d
27f90 69 72 65 63 74 6f 72 79 20 61 6e 64 20 61 20 73  irectory and a s
27fa0 6c 61 73 68 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  lash..    */.   
27fb0 20 63 68 61 72 20 2a 7a 4f 75 74 20 3d 20 73 71   char *zOut = sq
27fc0 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
27fd0 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
27fe0 65 2b 31 20 29 3b 0a 20 20 20 20 69 66 28 20 21  e+1 );.    if( !
27ff0 7a 4f 75 74 20 29 7b 0a 20 20 20 20 20 20 72 65  zOut ){.      re
28000 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
28010 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  R_NOMEM;.    }. 
28020 20 20 20 69 66 28 20 63 79 67 77 69 6e 5f 63 6f     if( cygwin_co
28030 6e 76 5f 70 61 74 68 28 0a 20 20 20 20 20 20 20  nv_path(.       
28040 20 20 20 20 20 28 6f 73 49 73 4e 54 28 29 20 3f       (osIsNT() ?
28050 20 43 43 50 5f 50 4f 53 49 58 5f 54 4f 5f 57 49   CCP_POSIX_TO_WI
28060 4e 5f 57 20 3a 20 43 43 50 5f 50 4f 53 49 58 5f  N_W : CCP_POSIX_
28070 54 4f 5f 57 49 4e 5f 41 29 20 7c 0a 20 20 20 20  TO_WIN_A) |.    
28080 20 20 20 20 20 20 20 20 43 43 50 5f 52 45 4c 41          CCP_RELA
28090 54 49 56 45 2c 20 7a 52 65 6c 61 74 69 76 65 2c  TIVE, zRelative,
280a0 20 7a 4f 75 74 2c 20 70 56 66 73 2d 3e 6d 78 50   zOut, pVfs->mxP
280b0 61 74 68 6e 61 6d 65 2b 31 29 3c 30 20 29 7b 0a  athname+1)<0 ){.
280c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
280d0 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20 20 20  ee(zOut);.      
280e0 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72  return winLogErr
280f0 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  or(SQLITE_CANTOP
28100 45 4e 5f 43 4f 4e 56 50 41 54 48 2c 20 28 44 57  EN_CONVPATH, (DW
28110 4f 52 44 29 65 72 72 6e 6f 2c 0a 20 20 20 20 20  ORD)errno,.     
28120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28130 20 20 20 20 22 77 69 6e 46 75 6c 6c 50 61 74 68      "winFullPath
28140 6e 61 6d 65 31 22 2c 20 7a 52 65 6c 61 74 69 76  name1", zRelativ
28150 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  e);.    }else{. 
28160 20 20 20 20 20 63 68 61 72 20 2a 7a 55 74 66 38       char *zUtf8
28170 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74 54 6f 55   = winConvertToU
28180 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 4f 75 74  tf8Filename(zOut
28190 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a 55  );.      if( !zU
281a0 74 66 38 20 29 7b 0a 20 20 20 20 20 20 20 20 73  tf8 ){.        s
281b0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 75 74  qlite3_free(zOut
281c0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
281d0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  n SQLITE_IOERR_N
281e0 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OMEM;.      }.  
281f0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
28200 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20  intf(MIN(nFull, 
28210 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
28220 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 25 63 25  ), zFull, "%s%c%
28230 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  s",.            
28240 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
28250 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72  e3_data_director
28260 79 2c 20 77 69 6e 47 65 74 44 69 72 53 65 70 28  y, winGetDirSep(
28270 29 2c 20 7a 55 74 66 38 29 3b 0a 20 20 20 20 20  ), zUtf8);.     
28280 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 55   sqlite3_free(zU
28290 74 66 38 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  tf8);.      sqli
282a0 74 65 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a  te3_free(zOut);.
282b0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
282c0 20 20 20 63 68 61 72 20 2a 7a 4f 75 74 20 3d 20     char *zOut = 
282d0 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
282e0 6f 28 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  o( pVfs->mxPathn
282f0 61 6d 65 2b 31 20 29 3b 0a 20 20 20 20 69 66 28  ame+1 );.    if(
28300 20 21 7a 4f 75 74 20 29 7b 0a 20 20 20 20 20 20   !zOut ){.      
28310 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
28320 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ERR_NOMEM;.    }
28330 0a 20 20 20 20 69 66 28 20 63 79 67 77 69 6e 5f  .    if( cygwin_
28340 63 6f 6e 76 5f 70 61 74 68 28 0a 20 20 20 20 20  conv_path(.     
28350 20 20 20 20 20 20 20 28 6f 73 49 73 4e 54 28 29         (osIsNT()
28360 20 3f 20 43 43 50 5f 50 4f 53 49 58 5f 54 4f 5f   ? CCP_POSIX_TO_
28370 57 49 4e 5f 57 20 3a 20 43 43 50 5f 50 4f 53 49  WIN_W : CCP_POSI
28380 58 5f 54 4f 5f 57 49 4e 5f 41 29 2c 0a 20 20 20  X_TO_WIN_A),.   
28390 20 20 20 20 20 20 20 20 20 7a 52 65 6c 61 74 69           zRelati
283a0 76 65 2c 20 7a 4f 75 74 2c 20 70 56 66 73 2d 3e  ve, zOut, pVfs->
283b0 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3c 30 20  mxPathname+1)<0 
283c0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
283d0 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20  _free(zOut);.   
283e0 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67     return winLog
283f0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e  Error(SQLITE_CAN
28400 54 4f 50 45 4e 5f 43 4f 4e 56 50 41 54 48 2c 20  TOPEN_CONVPATH, 
28410 28 44 57 4f 52 44 29 65 72 72 6e 6f 2c 0a 20 20  (DWORD)errno,.  
28420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28430 20 20 20 20 20 20 20 22 77 69 6e 46 75 6c 6c 50         "winFullP
28440 61 74 68 6e 61 6d 65 32 22 2c 20 7a 52 65 6c 61  athname2", zRela
28450 74 69 76 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  tive);.    }else
28460 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 55  {.      char *zU
28470 74 66 38 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74  tf8 = winConvert
28480 54 6f 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a  ToUtf8Filename(z
28490 4f 75 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Out);.      if( 
284a0 21 7a 55 74 66 38 20 29 7b 0a 20 20 20 20 20 20  !zUtf8 ){.      
284b0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
284c0 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65  Out);.        re
284d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
284e0 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d  R_NOMEM;.      }
284f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
28500 6e 70 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c  nprintf(MIN(nFul
28510 6c 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  l, pVfs->mxPathn
28520 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73  ame), zFull, "%s
28530 22 2c 20 7a 55 74 66 38 29 3b 0a 20 20 20 20 20  ", zUtf8);.     
28540 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 55   sqlite3_free(zU
28550 74 66 38 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  tf8);.      sqli
28560 74 65 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a  te3_free(zOut);.
28570 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
28580 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65  rn SQLITE_OK;.#e
28590 6e 64 69 66 0a 0a 23 69 66 20 28 53 51 4c 49 54  ndif..#if (SQLIT
285a0 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 53 51  E_OS_WINCE || SQ
285b0 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 29 20 26  LITE_OS_WINRT) &
285c0 26 20 21 64 65 66 69 6e 65 64 28 5f 5f 43 59 47  & !defined(__CYG
285d0 57 49 4e 5f 5f 29 0a 20 20 53 69 6d 75 6c 61 74  WIN__).  Simulat
285e0 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
285f0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b   SQLITE_ERROR );
28600 0a 20 20 2f 2a 20 57 69 6e 43 45 20 68 61 73 20  .  /* WinCE has 
28610 6e 6f 20 63 6f 6e 63 65 70 74 20 6f 66 20 61 20  no concept of a 
28620 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d  relative pathnam
28630 65 2c 20 6f 72 20 73 6f 20 49 20 61 6d 20 74 6f  e, or so I am to
28640 6c 64 2e 20 2a 2f 0a 20 20 2f 2a 20 57 69 6e 52  ld. */.  /* WinR
28650 54 20 68 61 73 20 6e 6f 20 77 61 79 20 74 6f 20  T has no way to 
28660 63 6f 6e 76 65 72 74 20 61 20 72 65 6c 61 74 69  convert a relati
28670 76 65 20 70 61 74 68 20 74 6f 20 61 6e 20 61 62  ve path to an ab
28680 73 6f 6c 75 74 65 20 6f 6e 65 2e 20 2a 2f 0a 20  solute one. */. 
28690 20 69 66 20 28 20 73 71 6c 69 74 65 33 5f 64 61   if ( sqlite3_da
286a0 74 61 5f 64 69 72 65 63 74 6f 72 79 20 26 26 20  ta_directory && 
286b0 21 77 69 6e 49 73 56 65 72 62 61 74 69 6d 50 61  !winIsVerbatimPa
286c0 74 68 6e 61 6d 65 28 7a 52 65 6c 61 74 69 76 65  thname(zRelative
286d0 29 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20  ) ){.    /*.    
286e0 2a 2a 20 4e 4f 54 45 3a 20 57 65 20 61 72 65 20  ** NOTE: We are 
286f0 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20 72  dealing with a r
28700 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61 6d  elative path nam
28710 65 20 61 6e 64 20 74 68 65 20 64 61 74 61 0a 20  e and the data. 
28720 20 20 20 2a 2a 20 20 20 20 20 20 20 64 69 72 65     **       dire
28730 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 73  ctory has been s
28740 65 74 2e 20 20 54 68 65 72 65 66 6f 72 65 2c 20  et.  Therefore, 
28750 75 73 65 20 69 74 20 61 73 20 74 68 65 20 62 61  use it as the ba
28760 73 69 73 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  sis.    **      
28770 20 66 6f 72 20 63 6f 6e 76 65 72 74 69 6e 67 20   for converting 
28780 74 68 65 20 72 65 6c 61 74 69 76 65 20 70 61 74  the relative pat
28790 68 20 6e 61 6d 65 20 74 6f 20 61 6e 20 61 62 73  h name to an abs
287a0 6f 6c 75 74 65 0a 20 20 20 20 2a 2a 20 20 20 20  olute.    **    
287b0 20 20 20 6f 6e 65 20 62 79 20 70 72 65 70 65 6e     one by prepen
287c0 64 69 6e 67 20 74 68 65 20 64 61 74 61 20 64 69  ding the data di
287d0 72 65 63 74 6f 72 79 20 61 6e 64 20 61 20 62 61  rectory and a ba
287e0 63 6b 73 6c 61 73 68 2e 0a 20 20 20 20 2a 2f 0a  ckslash..    */.
287f0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
28800 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20  intf(MIN(nFull, 
28810 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
28820 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 25 63 25  ), zFull, "%s%c%
28830 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  s",.            
28840 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
28850 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79 2c  _data_directory,
28860 20 77 69 6e 47 65 74 44 69 72 53 65 70 28 29 2c   winGetDirSep(),
28870 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 7d   zRelative);.  }
28880 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
28890 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49 4e 28 6e  3_snprintf(MIN(n
288a0 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78 50 61  Full, pVfs->mxPa
288b0 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20  thname), zFull, 
288c0 22 25 73 22 2c 20 7a 52 65 6c 61 74 69 76 65 29  "%s", zRelative)
288d0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
288e0 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66  QLITE_OK;.#endif
288f0 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
28900 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54  _WINCE && !SQLIT
28910 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 21 64  E_OS_WINRT && !d
28920 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f  efined(__CYGWIN_
28930 5f 29 0a 20 20 44 57 4f 52 44 20 6e 42 79 74 65  _).  DWORD nByte
28940 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65  ;.  void *zConve
28950 72 74 65 64 3b 0a 20 20 63 68 61 72 20 2a 7a 4f  rted;.  char *zO
28960 75 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69  ut;..  /* If thi
28970 73 20 70 61 74 68 20 6e 61 6d 65 20 62 65 67 69  s path name begi
28980 6e 73 20 77 69 74 68 20 22 2f 58 3a 22 2c 20 77  ns with "/X:", w
28990 68 65 72 65 20 22 58 22 20 69 73 20 61 6e 79 20  here "X" is any 
289a0 61 6c 70 68 61 62 65 74 69 63 0a 20 20 2a 2a 20  alphabetic.  ** 
289b0 63 68 61 72 61 63 74 65 72 2c 20 64 69 73 63 61  character, disca
289c0 72 64 20 74 68 65 20 69 6e 69 74 69 61 6c 20 22  rd the initial "
289d0 2f 22 20 66 72 6f 6d 20 74 68 65 20 70 61 74 68  /" from the path
289e0 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  name..  */.  if(
289f0 20 7a 52 65 6c 61 74 69 76 65 5b 30 5d 3d 3d 27   zRelative[0]=='
28a00 2f 27 20 26 26 20 77 69 6e 49 73 44 72 69 76 65  /' && winIsDrive
28a10 4c 65 74 74 65 72 41 6e 64 43 6f 6c 6f 6e 28 7a  LetterAndColon(z
28a20 52 65 6c 61 74 69 76 65 2b 31 29 20 29 7b 0a 20  Relative+1) ){. 
28a30 20 20 20 7a 52 65 6c 61 74 69 76 65 2b 2b 3b 0a     zRelative++;.
28a40 20 20 7d 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f    }..  /* It's o
28a50 64 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61  dd to simulate a
28a60 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c  n io-error here,
28a70 20 62 75 74 20 72 65 61 6c 6c 79 20 74 68 69 73   but really this
28a80 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73   is just.  ** us
28a90 69 6e 67 20 74 68 65 20 69 6f 2d 65 72 72 6f 72  ing the io-error
28aa0 20 69 6e 66 72 61 73 74 72 75 63 74 75 72 65 20   infrastructure 
28ab0 74 6f 20 74 65 73 74 20 74 68 61 74 20 53 51 4c  to test that SQL
28ac0 69 74 65 20 68 61 6e 64 6c 65 73 20 74 68 69 73  ite handles this
28ad0 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66  .  ** function f
28ae0 61 69 6c 69 6e 67 2e 20 54 68 69 73 20 66 75 6e  ailing. This fun
28af0 63 74 69 6f 6e 20 63 6f 75 6c 64 20 66 61 69 6c  ction could fail
28b00 20 69 66 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65   if, for example
28b10 2c 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65  , the.  ** curre
28b20 6e 74 20 77 6f 72 6b 69 6e 67 20 64 69 72 65 63  nt working direc
28b30 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 75 6e  tory has been un
28b40 6c 69 6e 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20 53  linked..  */.  S
28b50 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
28b60 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
28b70 52 4f 52 20 29 3b 0a 20 20 69 66 20 28 20 73 71  ROR );.  if ( sq
28b80 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63  lite3_data_direc
28b90 74 6f 72 79 20 26 26 20 21 77 69 6e 49 73 56 65  tory && !winIsVe
28ba0 72 62 61 74 69 6d 50 61 74 68 6e 61 6d 65 28 7a  rbatimPathname(z
28bb0 52 65 6c 61 74 69 76 65 29 20 29 7b 0a 20 20 20  Relative) ){.   
28bc0 20 2f 2a 0a 20 20 20 20 2a 2a 20 4e 4f 54 45 3a   /*.    ** NOTE:
28bd0 20 57 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20   We are dealing 
28be0 77 69 74 68 20 61 20 72 65 6c 61 74 69 76 65 20  with a relative 
28bf0 70 61 74 68 20 6e 61 6d 65 20 61 6e 64 20 74 68  path name and th
28c00 65 20 64 61 74 61 0a 20 20 20 20 2a 2a 20 20 20  e data.    **   
28c10 20 20 20 20 64 69 72 65 63 74 6f 72 79 20 68 61      directory ha
28c20 73 20 62 65 65 6e 20 73 65 74 2e 20 20 54 68 65  s been set.  The
28c30 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74 20 61  refore, use it a
28c40 73 20 74 68 65 20 62 61 73 69 73 0a 20 20 20 20  s the basis.    
28c50 2a 2a 20 20 20 20 20 20 20 66 6f 72 20 63 6f 6e  **       for con
28c60 76 65 72 74 69 6e 67 20 74 68 65 20 72 65 6c 61  verting the rela
28c70 74 69 76 65 20 70 61 74 68 20 6e 61 6d 65 20 74  tive path name t
28c80 6f 20 61 6e 20 61 62 73 6f 6c 75 74 65 0a 20 20  o an absolute.  
28c90 20 20 2a 2a 20 20 20 20 20 20 20 6f 6e 65 20 62    **       one b
28ca0 79 20 70 72 65 70 65 6e 64 69 6e 67 20 74 68 65  y prepending the
28cb0 20 64 61 74 61 20 64 69 72 65 63 74 6f 72 79 20   data directory 
28cc0 61 6e 64 20 61 20 62 61 63 6b 73 6c 61 73 68 2e  and a backslash.
28cd0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
28ce0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49 4e  te3_snprintf(MIN
28cf0 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78  (nFull, pVfs->mx
28d00 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c  Pathname), zFull
28d10 2c 20 22 25 73 25 63 25 73 22 2c 0a 20 20 20 20  , "%s%c%s",.    
28d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28d30 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69   sqlite3_data_di
28d40 72 65 63 74 6f 72 79 2c 20 77 69 6e 47 65 74 44  rectory, winGetD
28d50 69 72 53 65 70 28 29 2c 20 7a 52 65 6c 61 74 69  irSep(), zRelati
28d60 76 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ve);.    return 
28d70 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
28d80 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77 69   zConverted = wi
28d90 6e 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66 38  nConvertFromUtf8
28da0 46 69 6c 65 6e 61 6d 65 28 7a 52 65 6c 61 74 69  Filename(zRelati
28db0 76 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76  ve);.  if( zConv
28dc0 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  erted==0 ){.    
28dd0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
28de0 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ERR_NOMEM;.  }. 
28df0 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b   if( osIsNT() ){
28e00 0a 20 20 20 20 4c 50 57 53 54 52 20 7a 54 65 6d  .    LPWSTR zTem
28e10 70 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 6f  p;.    nByte = o
28e20 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65  sGetFullPathName
28e30 57 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76  W((LPCWSTR)zConv
28e40 65 72 74 65 64 2c 20 30 2c 20 30 2c 20 30 29 3b  erted, 0, 0, 0);
28e50 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65 3d 3d  .    if( nByte==
28e60 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
28e70 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74  e3_free(zConvert
28e80 65 64 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ed);.      retur
28e90 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  n winLogError(SQ
28ea0 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55  LITE_CANTOPEN_FU
28eb0 4c 4c 50 41 54 48 2c 20 6f 73 47 65 74 4c 61 73  LLPATH, osGetLas
28ec0 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20  tError(),.      
28ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ee0 20 20 20 22 77 69 6e 46 75 6c 6c 50 61 74 68 6e     "winFullPathn
28ef0 61 6d 65 31 22 2c 20 7a 52 65 6c 61 74 69 76 65  ame1", zRelative
28f00 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 42 79  );.    }.    nBy
28f10 74 65 20 2b 3d 20 33 3b 0a 20 20 20 20 7a 54 65  te += 3;.    zTe
28f20 6d 70 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  mp = sqlite3Mall
28f30 6f 63 5a 65 72 6f 28 20 6e 42 79 74 65 2a 73 69  ocZero( nByte*si
28f40 7a 65 6f 66 28 7a 54 65 6d 70 5b 30 5d 29 20 29  zeof(zTemp[0]) )
28f50 3b 0a 20 20 20 20 69 66 28 20 7a 54 65 6d 70 3d  ;.    if( zTemp=
28f60 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
28f70 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
28f80 74 65 64 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ted);.      retu
28f90 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
28fa0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20  NOMEM;.    }.   
28fb0 20 6e 42 79 74 65 20 3d 20 6f 73 47 65 74 46 75   nByte = osGetFu
28fc0 6c 6c 50 61 74 68 4e 61 6d 65 57 28 28 4c 50 43  llPathNameW((LPC
28fd0 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c  WSTR)zConverted,
28fe0 20 6e 42 79 74 65 2c 20 7a 54 65 6d 70 2c 20 30   nByte, zTemp, 0
28ff0 29 3b 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65  );.    if( nByte
29000 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
29010 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65  ite3_free(zConve
29020 72 74 65 64 29 3b 0a 20 20 20 20 20 20 73 71 6c  rted);.      sql
29030 69 74 65 33 5f 66 72 65 65 28 7a 54 65 6d 70 29  ite3_free(zTemp)
29040 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 77  ;.      return w
29050 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
29060 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50  E_CANTOPEN_FULLP
29070 41 54 48 2c 20 6f 73 47 65 74 4c 61 73 74 45 72  ATH, osGetLastEr
29080 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20  ror(),.         
29090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
290a0 22 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65  "winFullPathname
290b0 32 22 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a  2", zRelative);.
290c0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
290d0 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
290e0 64 29 3b 0a 20 20 20 20 7a 4f 75 74 20 3d 20 77  d);.    zOut = w
290f0 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66 38 28  inUnicodeToUtf8(
29100 7a 54 65 6d 70 29 3b 0a 20 20 20 20 73 71 6c 69  zTemp);.    sqli
29110 74 65 33 5f 66 72 65 65 28 7a 54 65 6d 70 29 3b  te3_free(zTemp);
29120 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49  .  }.#ifdef SQLI
29130 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
29140 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 63 68  I.  else{.    ch
29150 61 72 20 2a 7a 54 65 6d 70 3b 0a 20 20 20 20 6e  ar *zTemp;.    n
29160 42 79 74 65 20 3d 20 6f 73 47 65 74 46 75 6c 6c  Byte = osGetFull
29170 50 61 74 68 4e 61 6d 65 41 28 28 63 68 61 72 2a  PathNameA((char*
29180 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 30 2c 20  )zConverted, 0, 
29190 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 6e  0, 0);.    if( n
291a0 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Byte==0 ){.     
291b0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
291c0 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20  onverted);.     
291d0 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72   return winLogEr
291e0 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f  ror(SQLITE_CANTO
291f0 50 45 4e 5f 46 55 4c 4c 50 41 54 48 2c 20 6f 73  PEN_FULLPATH, os
29200 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a  GetLastError(),.
29210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29220 20 20 20 20 20 20 20 20 20 22 77 69 6e 46 75 6c           "winFul
29230 6c 50 61 74 68 6e 61 6d 65 33 22 2c 20 7a 52 65  lPathname3", zRe
29240 6c 61 74 69 76 65 29 3b 0a 20 20 20 20 7d 0a 20  lative);.    }. 
29250 20 20 20 6e 42 79 74 65 20 2b 3d 20 33 3b 0a 20     nByte += 3;. 
29260 20 20 20 7a 54 65 6d 70 20 3d 20 73 71 6c 69 74     zTemp = sqlit
29270 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42  e3MallocZero( nB
29280 79 74 65 2a 73 69 7a 65 6f 66 28 7a 54 65 6d 70  yte*sizeof(zTemp
29290 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20  [0]) );.    if( 
292a0 7a 54 65 6d 70 3d 3d 30 20 29 7b 0a 20 20 20 20  zTemp==0 ){.    
292b0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
292c0 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
292d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
292e0 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  IOERR_NOMEM;.   
292f0 20 7d 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 6f   }.    nByte = o
29300 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65  sGetFullPathName
29310 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72  A((char*)zConver
29320 74 65 64 2c 20 6e 42 79 74 65 2c 20 7a 54 65 6d  ted, nByte, zTem
29330 70 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 6e  p, 0);.    if( n
29340 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Byte==0 ){.     
29350 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
29360 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20  onverted);.     
29370 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54   sqlite3_free(zT
29380 65 6d 70 29 3b 0a 20 20 20 20 20 20 72 65 74 75  emp);.      retu
29390 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53  rn winLogError(S
293a0 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46  QLITE_CANTOPEN_F
293b0 55 4c 4c 50 41 54 48 2c 20 6f 73 47 65 74 4c 61  ULLPATH, osGetLa
293c0 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20  stError(),.     
293d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
293e0 20 20 20 20 22 77 69 6e 46 75 6c 6c 50 61 74 68      "winFullPath
293f0 6e 61 6d 65 34 22 2c 20 7a 52 65 6c 61 74 69 76  name4", zRelativ
29400 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  e);.    }.    sq
29410 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76  lite3_free(zConv
29420 65 72 74 65 64 29 3b 0a 20 20 20 20 7a 4f 75 74  erted);.    zOut
29430 20 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32   = sqlite3_win32
29440 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28 7a 54  _mbcs_to_utf8(zT
29450 65 6d 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  emp);.    sqlite
29460 33 5f 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20  3_free(zTemp);. 
29470 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
29480 7a 4f 75 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  zOut ){.    sqli
29490 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49 4e  te3_snprintf(MIN
294a0 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78  (nFull, pVfs->mx
294b0 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c  Pathname), zFull
294c0 2c 20 22 25 73 22 2c 20 7a 4f 75 74 29 3b 0a 20  , "%s", zOut);. 
294d0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
294e0 7a 4f 75 74 29 3b 0a 20 20 20 20 72 65 74 75 72  zOut);.    retur
294f0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
29500 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
29510 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
29520 4d 45 4d 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  MEM;.  }.#endif.
29530 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
29540 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45  E_OMIT_LOAD_EXTE
29550 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74 65  NSION./*.** Inte
29560 72 66 61 63 65 73 20 66 6f 72 20 6f 70 65 6e 69  rfaces for openi
29570 6e 67 20 61 20 73 68 61 72 65 64 20 6c 69 62 72  ng a shared libr
29580 61 72 79 2c 20 66 69 6e 64 69 6e 67 20 65 6e 74  ary, finding ent
29590 72 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 77 69 74  ry points.** wit
295a0 68 69 6e 20 74 68 65 20 73 68 61 72 65 64 20 6c  hin the shared l
295b0 69 62 72 61 72 79 2c 20 61 6e 64 20 63 6c 6f 73  ibrary, and clos
295c0 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6c  ing the shared l
295d0 69 62 72 61 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  ibrary..*/.stati
295e0 63 20 76 6f 69 64 20 2a 77 69 6e 44 6c 4f 70 65  c void *winDlOpe
295f0 6e 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  n(sqlite3_vfs *p
29600 56 66 73 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  Vfs, const char 
29610 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 48  *zFilename){.  H
29620 41 4e 44 4c 45 20 68 3b 0a 23 69 66 20 64 65 66  ANDLE h;.#if def
29630 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29  ined(__CYGWIN__)
29640 0a 20 20 69 6e 74 20 6e 46 75 6c 6c 20 3d 20 70  .  int nFull = p
29650 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b  Vfs->mxPathname+
29660 31 3b 0a 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c  1;.  char *zFull
29670 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
29680 5a 65 72 6f 28 20 6e 46 75 6c 6c 20 29 3b 0a 20  Zero( nFull );. 
29690 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65   void *zConverte
296a0 64 20 3d 20 30 3b 0a 20 20 69 66 28 20 7a 46 75  d = 0;.  if( zFu
296b0 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 4f 53 54  ll==0 ){.    OST
296c0 52 41 43 45 28 28 22 44 4c 4f 50 45 4e 20 6e 61  RACE(("DLOPEN na
296d0 6d 65 3d 25 73 2c 20 68 61 6e 64 6c 65 3d 25 70  me=%s, handle=%p
296e0 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20  \n", zFilename, 
296f0 28 76 6f 69 64 2a 29 30 29 29 3b 0a 20 20 20 20  (void*)0));.    
29700 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
29710 69 66 28 20 77 69 6e 46 75 6c 6c 50 61 74 68 6e  if( winFullPathn
29720 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e  ame(pVfs, zFilen
29730 61 6d 65 2c 20 6e 46 75 6c 6c 2c 20 7a 46 75 6c  ame, nFull, zFul
29740 6c 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  l)!=SQLITE_OK ){
29750 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
29760 65 28 7a 46 75 6c 6c 29 3b 0a 20 20 20 20 4f 53  e(zFull);.    OS
29770 54 52 41 43 45 28 28 22 44 4c 4f 50 45 4e 20 6e  TRACE(("DLOPEN n
29780 61 6d 65 3d 25 73 2c 20 68 61 6e 64 6c 65 3d 25  ame=%s, handle=%
29790 70 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  p\n", zFilename,
297a0 20 28 76 6f 69 64 2a 29 30 29 29 3b 0a 20 20 20   (void*)0));.   
297b0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
297c0 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77 69   zConverted = wi
297d0 6e 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66 38  nConvertFromUtf8
297e0 46 69 6c 65 6e 61 6d 65 28 7a 46 75 6c 6c 29 3b  Filename(zFull);
297f0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
29800 7a 46 75 6c 6c 29 3b 0a 23 65 6c 73 65 0a 20 20  zFull);.#else.  
29810 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64  void *zConverted
29820 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74 46 72 6f   = winConvertFro
29830 6d 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 46  mUtf8Filename(zF
29840 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 55 4e 55 53  ilename);.  UNUS
29850 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66  ED_PARAMETER(pVf
29860 73 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28  s);.#endif.  if(
29870 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29   zConverted==0 )
29880 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  {.    OSTRACE(("
29890 44 4c 4f 50 45 4e 20 6e 61 6d 65 3d 25 73 2c 20  DLOPEN name=%s, 
298a0 68 61 6e 64 6c 65 3d 25 70 5c 6e 22 2c 20 7a 46  handle=%p\n", zF
298b0 69 6c 65 6e 61 6d 65 2c 20 28 76 6f 69 64 2a 29  ilename, (void*)
298c0 30 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  0));.    return 
298d0 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 73 49  0;.  }.  if( osI
298e0 73 4e 54 28 29 20 29 7b 0a 23 69 66 20 53 51 4c  sNT() ){.#if SQL
298f0 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20  ITE_OS_WINRT.   
29900 20 68 20 3d 20 6f 73 4c 6f 61 64 50 61 63 6b 61   h = osLoadPacka
29910 67 65 64 4c 69 62 72 61 72 79 28 28 4c 50 43 57  gedLibrary((LPCW
29920 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20  STR)zConverted, 
29930 30 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 68 20  0);.#else.    h 
29940 3d 20 6f 73 4c 6f 61 64 4c 69 62 72 61 72 79 57  = osLoadLibraryW
29950 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65  ((LPCWSTR)zConve
29960 72 74 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20  rted);.#endif.  
29970 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
29980 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20  WIN32_HAS_ANSI. 
29990 20 65 6c 73 65 7b 0a 20 20 20 20 68 20 3d 20 6f   else{.    h = o
299a0 73 4c 6f 61 64 4c 69 62 72 61 72 79 41 28 28 63  sLoadLibraryA((c
299b0 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 29  har*)zConverted)
299c0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 4f  ;.  }.#endif.  O
299d0 53 54 52 41 43 45 28 28 22 44 4c 4f 50 45 4e 20  STRACE(("DLOPEN 
299e0 6e 61 6d 65 3d 25 73 2c 20 68 61 6e 64 6c 65 3d  name=%s, handle=
299f0 25 70 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65  %p\n", zFilename
29a00 2c 20 28 76 6f 69 64 2a 29 68 29 29 3b 0a 20 20  , (void*)h));.  
29a10 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
29a20 6e 76 65 72 74 65 64 29 3b 0a 20 20 72 65 74 75  nverted);.  retu
29a30 72 6e 20 28 76 6f 69 64 2a 29 68 3b 0a 7d 0a 73  rn (void*)h;.}.s
29a40 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 44 6c  tatic void winDl
29a50 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66  Error(sqlite3_vf
29a60 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 75  s *pVfs, int nBu
29a70 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 4f 75 74  f, char *zBufOut
29a80 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
29a90 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 77  METER(pVfs);.  w
29aa0 69 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 4d 73  inGetLastErrorMs
29ab0 67 28 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  g(osGetLastError
29ac0 28 29 2c 20 6e 42 75 66 2c 20 7a 42 75 66 4f 75  (), nBuf, zBufOu
29ad0 74 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  t);.}.static voi
29ae0 64 20 28 2a 77 69 6e 44 6c 53 79 6d 28 73 71 6c  d (*winDlSym(sql
29af0 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 76  ite3_vfs *pVfs,v
29b00 6f 69 64 20 2a 70 48 2c 63 6f 6e 73 74 20 63 68  oid *pH,const ch
29b10 61 72 20 2a 7a 53 79 6d 29 29 28 76 6f 69 64 29  ar *zSym))(void)
29b20 7b 0a 20 20 46 41 52 50 52 4f 43 20 70 72 6f 63  {.  FARPROC proc
29b30 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
29b40 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 70 72  ETER(pVfs);.  pr
29b50 6f 63 20 3d 20 6f 73 47 65 74 50 72 6f 63 41 64  oc = osGetProcAd
29b60 64 72 65 73 73 41 28 28 48 41 4e 44 4c 45 29 70  dressA((HANDLE)p
29b70 48 2c 20 7a 53 79 6d 29 3b 0a 20 20 4f 53 54 52  H, zSym);.  OSTR
29b80 41 43 45 28 28 22 44 4c 53 59 4d 20 68 61 6e 64  ACE(("DLSYM hand
29b90 6c 65 3d 25 70 2c 20 73 79 6d 62 6f 6c 3d 25 73  le=%p, symbol=%s
29ba0 2c 20 61 64 64 72 65 73 73 3d 25 70 5c 6e 22 2c  , address=%p\n",
29bb0 0a 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69  .           (voi
29bc0 64 2a 29 70 48 2c 20 7a 53 79 6d 2c 20 28 76 6f  d*)pH, zSym, (vo
29bd0 69 64 2a 29 70 72 6f 63 29 29 3b 0a 20 20 72 65  id*)proc));.  re
29be0 74 75 72 6e 20 28 76 6f 69 64 28 2a 29 28 76 6f  turn (void(*)(vo
29bf0 69 64 29 29 70 72 6f 63 3b 0a 7d 0a 73 74 61 74  id))proc;.}.stat
29c00 69 63 20 76 6f 69 64 20 77 69 6e 44 6c 43 6c 6f  ic void winDlClo
29c10 73 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  se(sqlite3_vfs *
29c20 70 56 66 73 2c 20 76 6f 69 64 20 2a 70 48 61 6e  pVfs, void *pHan
29c30 64 6c 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  dle){.  UNUSED_P
29c40 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a  ARAMETER(pVfs);.
29c50 20 20 6f 73 46 72 65 65 4c 69 62 72 61 72 79 28    osFreeLibrary(
29c60 28 48 41 4e 44 4c 45 29 70 48 61 6e 64 6c 65 29  (HANDLE)pHandle)
29c70 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 44 4c  ;.  OSTRACE(("DL
29c80 43 4c 4f 53 45 20 68 61 6e 64 6c 65 3d 25 70 5c  CLOSE handle=%p\
29c90 6e 22 2c 20 28 76 6f 69 64 2a 29 70 48 61 6e 64  n", (void*)pHand
29ca0 6c 65 29 29 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a  le));.}.#else /*
29cb0 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   if SQLITE_OMIT_
29cc0 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 20 69  LOAD_EXTENSION i
29cd0 73 20 64 65 66 69 6e 65 64 3a 20 2a 2f 0a 20 20  s defined: */.  
29ce0 23 64 65 66 69 6e 65 20 77 69 6e 44 6c 4f 70 65  #define winDlOpe
29cf0 6e 20 20 30 0a 20 20 23 64 65 66 69 6e 65 20 77  n  0.  #define w
29d00 69 6e 44 6c 45 72 72 6f 72 20 30 0a 20 20 23 64  inDlError 0.  #d
29d10 65 66 69 6e 65 20 77 69 6e 44 6c 53 79 6d 20 20  efine winDlSym  
29d20 20 30 0a 20 20 23 64 65 66 69 6e 65 20 77 69 6e   0.  #define win
29d30 44 6c 43 6c 6f 73 65 20 30 0a 23 65 6e 64 69 66  DlClose 0.#endif
29d40 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 75  .../*.** Write u
29d50 70 20 74 6f 20 6e 42 75 66 20 62 79 74 65 73 20  p to nBuf bytes 
29d60 6f 66 20 72 61 6e 64 6f 6d 6e 65 73 73 20 69 6e  of randomness in
29d70 74 6f 20 7a 42 75 66 2e 0a 2a 2f 0a 73 74 61 74  to zBuf..*/.stat
29d80 69 63 20 69 6e 74 20 77 69 6e 52 61 6e 64 6f 6d  ic int winRandom
29d90 6e 65 73 73 28 73 71 6c 69 74 65 33 5f 76 66 73  ness(sqlite3_vfs
29da0 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 75 66   *pVfs, int nBuf
29db0 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20  , char *zBuf){. 
29dc0 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 55 4e   int n = 0;.  UN
29dd0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
29de0 56 66 73 29 3b 0a 23 69 66 20 64 65 66 69 6e 65  Vfs);.#if define
29df0 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 20  d(SQLITE_TEST). 
29e00 20 6e 20 3d 20 6e 42 75 66 3b 0a 20 20 6d 65 6d   n = nBuf;.  mem
29e10 73 65 74 28 7a 42 75 66 2c 20 30 2c 20 6e 42 75  set(zBuf, 0, nBu
29e20 66 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28 20  f);.#else.  if( 
29e30 73 69 7a 65 6f 66 28 53 59 53 54 45 4d 54 49 4d  sizeof(SYSTEMTIM
29e40 45 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20 20  E)<=nBuf-n ){.  
29e50 20 20 53 59 53 54 45 4d 54 49 4d 45 20 78 3b 0a    SYSTEMTIME x;.
29e60 20 20 20 20 6f 73 47 65 74 53 79 73 74 65 6d 54      osGetSystemT
29e70 69 6d 65 28 26 78 29 3b 0a 20 20 20 20 6d 65 6d  ime(&x);.    mem
29e80 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 78  cpy(&zBuf[n], &x
29e90 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20  , sizeof(x));.  
29ea0 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 78 29    n += sizeof(x)
29eb0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 69 7a 65  ;.  }.  if( size
29ec0 6f 66 28 44 57 4f 52 44 29 3c 3d 6e 42 75 66 2d  of(DWORD)<=nBuf-
29ed0 6e 20 29 7b 0a 20 20 20 20 44 57 4f 52 44 20 70  n ){.    DWORD p
29ee0 69 64 20 3d 20 6f 73 47 65 74 43 75 72 72 65 6e  id = osGetCurren
29ef0 74 50 72 6f 63 65 73 73 49 64 28 29 3b 0a 20 20  tProcessId();.  
29f00 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e    memcpy(&zBuf[n
29f10 5d 2c 20 26 70 69 64 2c 20 73 69 7a 65 6f 66 28  ], &pid, sizeof(
29f20 70 69 64 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20  pid));.    n += 
29f30 73 69 7a 65 6f 66 28 70 69 64 29 3b 0a 20 20 7d  sizeof(pid);.  }
29f40 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
29f50 49 4e 52 54 0a 20 20 69 66 28 20 73 69 7a 65 6f  INRT.  if( sizeo
29f60 66 28 55 4c 4f 4e 47 4c 4f 4e 47 29 3c 3d 6e 42  f(ULONGLONG)<=nB
29f70 75 66 2d 6e 20 29 7b 0a 20 20 20 20 55 4c 4f 4e  uf-n ){.    ULON
29f80 47 4c 4f 4e 47 20 63 6e 74 20 3d 20 6f 73 47 65  GLONG cnt = osGe
29f90 74 54 69 63 6b 43 6f 75 6e 74 36 34 28 29 3b 0a  tTickCount64();.
29fa0 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66      memcpy(&zBuf
29fb0 5b 6e 5d 2c 20 26 63 6e 74 2c 20 73 69 7a 65 6f  [n], &cnt, sizeo
29fc0 66 28 63 6e 74 29 29 3b 0a 20 20 20 20 6e 20 2b  f(cnt));.    n +
29fd0 3d 20 73 69 7a 65 6f 66 28 63 6e 74 29 3b 0a 20  = sizeof(cnt);. 
29fe0 20 7d 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 73   }.#else.  if( s
29ff0 69 7a 65 6f 66 28 44 57 4f 52 44 29 3c 3d 6e 42  izeof(DWORD)<=nB
2a000 75 66 2d 6e 20 29 7b 0a 20 20 20 20 44 57 4f 52  uf-n ){.    DWOR
2a010 44 20 63 6e 74 20 3d 20 6f 73 47 65 74 54 69 63  D cnt = osGetTic
2a020 6b 43 6f 75 6e 74 28 29 3b 0a 20 20 20 20 6d 65  kCount();.    me
2a030 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26  mcpy(&zBuf[n], &
2a040 63 6e 74 2c 20 73 69 7a 65 6f 66 28 63 6e 74 29  cnt, sizeof(cnt)
2a050 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65  );.    n += size
2a060 6f 66 28 63 6e 74 29 3b 0a 20 20 7d 0a 23 65 6e  of(cnt);.  }.#en
2a070 64 69 66 0a 20 20 69 66 28 20 73 69 7a 65 6f 66  dif.  if( sizeof
2a080 28 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 29 3c  (LARGE_INTEGER)<
2a090 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20 20 4c  =nBuf-n ){.    L
2a0a0 41 52 47 45 5f 49 4e 54 45 47 45 52 20 69 3b 0a  ARGE_INTEGER i;.
2a0b0 20 20 20 20 6f 73 51 75 65 72 79 50 65 72 66 6f      osQueryPerfo
2a0c0 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72 28 26 69  rmanceCounter(&i
2a0d0 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a  );.    memcpy(&z
2a0e0 42 75 66 5b 6e 5d 2c 20 26 69 2c 20 73 69 7a 65  Buf[n], &i, size
2a0f0 6f 66 28 69 29 29 3b 0a 20 20 20 20 6e 20 2b 3d  of(i));.    n +=
2a100 20 73 69 7a 65 6f 66 28 69 29 3b 0a 20 20 7d 0a   sizeof(i);.  }.
2a110 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
2a120 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65  n;.}.../*.** Sle
2a130 65 70 20 66 6f 72 20 61 20 6c 69 74 74 6c 65 20  ep for a little 
2a140 77 68 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 74  while.  Return t
2a150 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d  he amount of tim
2a160 65 20 73 6c 65 70 74 2e 0a 2a 2f 0a 73 74 61 74  e slept..*/.stat
2a170 69 63 20 69 6e 74 20 77 69 6e 53 6c 65 65 70 28  ic int winSleep(
2a180 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
2a190 73 2c 20 69 6e 74 20 6d 69 63 72 6f 73 65 63 29  s, int microsec)
2a1a0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 77 69 6e 33  {.  sqlite3_win3
2a1b0 32 5f 73 6c 65 65 70 28 28 6d 69 63 72 6f 73 65  2_sleep((microse
2a1c0 63 2b 39 39 39 29 2f 31 30 30 30 29 3b 0a 20 20  c+999)/1000);.  
2a1d0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
2a1e0 28 70 56 66 73 29 3b 0a 20 20 72 65 74 75 72 6e  (pVfs);.  return
2a1f0 20 28 28 6d 69 63 72 6f 73 65 63 2b 39 39 39 29   ((microsec+999)
2a200 2f 31 30 30 30 29 2a 31 30 30 30 3b 0a 7d 0a 0a  /1000)*1000;.}..
2a210 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
2a220 69 6e 67 20 76 61 72 69 61 62 6c 65 2c 20 69 66  ing variable, if
2a230 20 73 65 74 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65   set to a non-ze
2a240 72 6f 20 76 61 6c 75 65 2c 20 69 73 20 69 6e 74  ro value, is int
2a250 65 72 70 72 65 74 65 64 20 61 73 0a 2a 2a 20 74  erpreted as.** t
2a260 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 63  he number of sec
2a270 6f 6e 64 73 20 73 69 6e 63 65 20 31 39 37 30 20  onds since 1970 
2a280 61 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20 73  and is used to s
2a290 65 74 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  et the result of
2a2a0 0a 2a 2a 20 73 71 6c 69 74 65 33 4f 73 43 75 72  .** sqlite3OsCur
2a2b0 72 65 6e 74 54 69 6d 65 28 29 20 64 75 72 69 6e  rentTime() durin
2a2c0 67 20 74 65 73 74 69 6e 67 2e 0a 2a 2f 0a 23 69  g testing..*/.#i
2a2d0 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
2a2e0 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 75 72  .int sqlite3_cur
2a2f0 72 65 6e 74 5f 74 69 6d 65 20 3d 20 30 3b 20 20  rent_time = 0;  
2a300 2f 2a 20 46 61 6b 65 20 73 79 73 74 65 6d 20 74  /* Fake system t
2a310 69 6d 65 20 69 6e 20 73 65 63 6f 6e 64 73 20 73  ime in seconds s
2a320 69 6e 63 65 20 31 39 37 30 2e 20 2a 2f 0a 23 65  ince 1970. */.#e
2a330 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64  ndif../*.** Find
2a340 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d   the current tim
2a350 65 20 28 69 6e 20 55 6e 69 76 65 72 73 61 6c 20  e (in Universal 
2a360 43 6f 6f 72 64 69 6e 61 74 65 64 20 54 69 6d 65  Coordinated Time
2a370 29 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a  ).  Write into *
2a380 70 69 4e 6f 77 0a 2a 2a 20 74 68 65 20 63 75 72  piNow.** the cur
2a390 72 65 6e 74 20 74 69 6d 65 20 61 6e 64 20 64 61  rent time and da
2a3a0 74 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44  te as a Julian D
2a3b0 61 79 20 6e 75 6d 62 65 72 20 74 69 6d 65 73 20  ay number times 
2a3c0 38 36 5f 34 30 30 5f 30 30 30 2e 20 20 49 6e 0a  86_400_000.  In.
2a3d0 2a 2a 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  ** other words, 
2a3e0 77 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f  write into *piNo
2a3f0 77 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  w the number of 
2a400 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 73 69 6e  milliseconds sin
2a410 63 65 20 74 68 65 20 4a 75 6c 69 61 6e 0a 2a 2a  ce the Julian.**
2a420 20 65 70 6f 63 68 20 6f 66 20 6e 6f 6f 6e 20 69   epoch of noon i
2a430 6e 20 47 72 65 65 6e 77 69 63 68 20 6f 6e 20 4e  n Greenwich on N
2a440 6f 76 65 6d 62 65 72 20 32 34 2c 20 34 37 31 34  ovember 24, 4714
2a450 20 42 2e 43 20 61 63 63 6f 72 64 69 6e 67 20 74   B.C according t
2a460 6f 20 74 68 65 0a 2a 2a 20 70 72 6f 6c 65 70 74  o the.** prolept
2a470 69 63 20 47 72 65 67 6f 72 69 61 6e 20 63 61 6c  ic Gregorian cal
2a480 65 6e 64 61 72 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20  endar..**.** On 
2a490 73 75 63 63 65 73 73 2c 20 72 65 74 75 72 6e 20  success, return 
2a4a0 53 51 4c 49 54 45 5f 4f 4b 2e 20 20 52 65 74 75  SQLITE_OK.  Retu
2a4b0 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20  rn SQLITE_ERROR 
2a4c0 69 66 20 74 68 65 20 74 69 6d 65 20 61 6e 64 20  if the time and 
2a4d0 64 61 74 65 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62  date.** cannot b
2a4e0 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74  e found..*/.stat
2a4f0 69 63 20 69 6e 74 20 77 69 6e 43 75 72 72 65 6e  ic int winCurren
2a500 74 54 69 6d 65 49 6e 74 36 34 28 73 71 6c 69 74  tTimeInt64(sqlit
2a510 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 73 71  e3_vfs *pVfs, sq
2a520 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 69 4e  lite3_int64 *piN
2a530 6f 77 29 7b 0a 20 20 2f 2a 20 46 49 4c 45 54 49  ow){.  /* FILETI
2a540 4d 45 20 73 74 72 75 63 74 75 72 65 20 69 73 20  ME structure is 
2a550 61 20 36 34 2d 62 69 74 20 76 61 6c 75 65 20 72  a 64-bit value r
2a560 65 70 72 65 73 65 6e 74 69 6e 67 20 74 68 65 20  epresenting the 
2a570 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 20 31  number of.     1
2a580 30 30 2d 6e 61 6e 6f 73 65 63 6f 6e 64 20 69 6e  00-nanosecond in
2a590 74 65 72 76 61 6c 73 20 73 69 6e 63 65 20 4a 61  tervals since Ja
2a5a0 6e 75 61 72 79 20 31 2c 20 31 36 30 31 20 28 3d  nuary 1, 1601 (=
2a5b0 20 4a 44 20 32 33 30 35 38 31 33 2e 35 29 2e 0a   JD 2305813.5)..
2a5c0 20 20 2a 2f 0a 20 20 46 49 4c 45 54 49 4d 45 20    */.  FILETIME 
2a5d0 66 74 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  ft;.  static con
2a5e0 73 74 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  st sqlite3_int64
2a5f0 20 77 69 6e 46 69 6c 65 74 69 6d 65 45 70 6f 63   winFiletimeEpoc
2a600 68 20 3d 20 32 33 30 35 38 31 33 35 2a 28 73 71  h = 23058135*(sq
2a610 6c 69 74 65 33 5f 69 6e 74 36 34 29 38 36 34 30  lite3_int64)8640
2a620 30 30 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  000;.#ifdef SQLI
2a630 54 45 5f 54 45 53 54 0a 20 20 73 74 61 74 69 63  TE_TEST.  static
2a640 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
2a650 6e 74 36 34 20 75 6e 69 78 45 70 6f 63 68 20 3d  nt64 unixEpoch =
2a660 20 32 34 34 30 35 38 37 35 2a 28 73 71 6c 69 74   24405875*(sqlit
2a670 65 33 5f 69 6e 74 36 34 29 38 36 34 30 30 30 30  e3_int64)8640000
2a680 3b 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20 32 5e  ;.#endif.  /* 2^
2a690 33 32 20 2d 20 74 6f 20 61 76 6f 69 64 20 75 73  32 - to avoid us
2a6a0 65 20 6f 66 20 4c 4c 20 61 6e 64 20 77 61 72 6e  e of LL and warn
2a6b0 69 6e 67 73 20 69 6e 20 67 63 63 20 2a 2f 0a 20  ings in gcc */. 
2a6c0 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71   static const sq
2a6d0 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 61 78 33  lite3_int64 max3
2a6e0 32 42 69 74 56 61 6c 75 65 20 3d 0a 20 20 20 20  2BitValue =.    
2a6f0 20 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34    (sqlite3_int64
2a700 29 32 30 30 30 30 30 30 30 30 30 20 2b 20 28 73  )2000000000 + (s
2a710 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 32 30 30  qlite3_int64)200
2a720 30 30 30 30 30 30 30 20 2b 0a 20 20 20 20 20 20  0000000 +.      
2a730 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 32  (sqlite3_int64)2
2a740 39 34 39 36 37 32 39 36 3b 0a 0a 23 69 66 20 53  94967296;..#if S
2a750 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20  QLITE_OS_WINCE. 
2a760 20 53 59 53 54 45 4d 54 49 4d 45 20 74 69 6d 65   SYSTEMTIME time
2a770 3b 0a 20 20 6f 73 47 65 74 53 79 73 74 65 6d 54  ;.  osGetSystemT
2a780 69 6d 65 28 26 74 69 6d 65 29 3b 0a 20 20 2f 2a  ime(&time);.  /*
2a790 20 69 66 20 53 79 73 74 65 6d 54 69 6d 65 54 6f   if SystemTimeTo
2a7a0 46 69 6c 65 54 69 6d 65 28 29 20 66 61 69 6c 73  FileTime() fails
2a7b0 2c 20 69 74 20 72 65 74 75 72 6e 73 20 7a 65 72  , it returns zer
2a7c0 6f 2e 20 2a 2f 0a 20 20 69 66 20 28 21 6f 73 53  o. */.  if (!osS
2a7d0 79 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54  ystemTimeToFileT
2a7e0 69 6d 65 28 26 74 69 6d 65 2c 26 66 74 29 29 7b  ime(&time,&ft)){
2a7f0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2a800 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 23 65  TE_ERROR;.  }.#e
2a810 6c 73 65 0a 20 20 6f 73 47 65 74 53 79 73 74 65  lse.  osGetSyste
2a820 6d 54 69 6d 65 41 73 46 69 6c 65 54 69 6d 65 28  mTimeAsFileTime(
2a830 20 26 66 74 20 29 3b 0a 23 65 6e 64 69 66 0a 0a   &ft );.#endif..
2a840 20 20 2a 70 69 4e 6f 77 20 3d 20 77 69 6e 46 69    *piNow = winFi
2a850 6c 65 74 69 6d 65 45 70 6f 63 68 20 2b 0a 20 20  letimeEpoch +.  
2a860 20 20 20 20 20 20 20 20 20 20 28 28 28 28 73 71            ((((sq
2a870 6c 69 74 65 33 5f 69 6e 74 36 34 29 66 74 2e 64  lite3_int64)ft.d
2a880 77 48 69 67 68 44 61 74 65 54 69 6d 65 29 2a 6d  wHighDateTime)*m
2a890 61 78 33 32 42 69 74 56 61 6c 75 65 29 20 2b 0a  ax32BitValue) +.
2a8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
2a8b0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 66 74  sqlite3_int64)ft
2a8c0 2e 64 77 4c 6f 77 44 61 74 65 54 69 6d 65 29 2f  .dwLowDateTime)/
2a8d0 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 31  (sqlite3_int64)1
2a8e0 30 30 30 30 3b 0a 0a 23 69 66 64 65 66 20 53 51  0000;..#ifdef SQ
2a8f0 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20  LITE_TEST.  if( 
2a900 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f  sqlite3_current_
2a910 74 69 6d 65 20 29 7b 0a 20 20 20 20 2a 70 69 4e  time ){.    *piN
2a920 6f 77 20 3d 20 31 30 30 30 2a 28 73 71 6c 69 74  ow = 1000*(sqlit
2a930 65 33 5f 69 6e 74 36 34 29 73 71 6c 69 74 65 33  e3_int64)sqlite3
2a940 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 2b 20  _current_time + 
2a950 75 6e 69 78 45 70 6f 63 68 3b 0a 20 20 7d 0a 23  unixEpoch;.  }.#
2a960 65 6e 64 69 66 0a 20 20 55 4e 55 53 45 44 5f 50  endif.  UNUSED_P
2a970 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a  ARAMETER(pVfs);.
2a980 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2a990 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e  OK;.}../*.** Fin
2a9a0 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 69  d the current ti
2a9b0 6d 65 20 28 69 6e 20 55 6e 69 76 65 72 73 61 6c  me (in Universal
2a9c0 20 43 6f 6f 72 64 69 6e 61 74 65 64 20 54 69 6d   Coordinated Tim
2a9d0 65 29 2e 20 20 57 72 69 74 65 20 74 68 65 0a 2a  e).  Write the.*
2a9e0 2a 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 61  * current time a
2a9f0 6e 64 20 64 61 74 65 20 61 73 20 61 20 4a 75 6c  nd date as a Jul
2aa00 69 61 6e 20 44 61 79 20 6e 75 6d 62 65 72 20 69  ian Day number i
2aa10 6e 74 6f 20 2a 70 72 4e 6f 77 20 61 6e 64 0a 2a  nto *prNow and.*
2aa20 2a 20 72 65 74 75 72 6e 20 30 2e 20 20 52 65 74  * return 0.  Ret
2aa30 75 72 6e 20 31 20 69 66 20 74 68 65 20 74 69 6d  urn 1 if the tim
2aa40 65 20 61 6e 64 20 64 61 74 65 20 63 61 6e 6e 6f  e and date canno
2aa50 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73  t be found..*/.s
2aa60 74 61 74 69 63 20 69 6e 74 20 77 69 6e 43 75 72  tatic int winCur
2aa70 72 65 6e 74 54 69 6d 65 28 73 71 6c 69 74 65 33  rentTime(sqlite3
2aa80 5f 76 66 73 20 2a 70 56 66 73 2c 20 64 6f 75 62  _vfs *pVfs, doub
2aa90 6c 65 20 2a 70 72 4e 6f 77 29 7b 0a 20 20 69 6e  le *prNow){.  in
2aaa0 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f  t rc;.  sqlite3_
2aab0 69 6e 74 36 34 20 69 3b 0a 20 20 72 63 20 3d 20  int64 i;.  rc = 
2aac0 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 49 6e  winCurrentTimeIn
2aad0 74 36 34 28 70 56 66 73 2c 20 26 69 29 3b 0a 20  t64(pVfs, &i);. 
2aae0 20 69 66 28 20 21 72 63 20 29 7b 0a 20 20 20 20   if( !rc ){.    
2aaf0 2a 70 72 4e 6f 77 20 3d 20 69 2f 38 36 34 30 30  *prNow = i/86400
2ab00 30 30 30 2e 30 3b 0a 20 20 7d 0a 20 20 72 65 74  000.0;.  }.  ret
2ab10 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2ab20 20 54 68 65 20 69 64 65 61 20 69 73 20 74 68 61   The idea is tha
2ab30 74 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  t this function 
2ab40 77 6f 72 6b 73 20 6c 69 6b 65 20 61 20 63 6f 6d  works like a com
2ab50 62 69 6e 61 74 69 6f 6e 20 6f 66 0a 2a 2a 20 47  bination of.** G
2ab60 65 74 4c 61 73 74 45 72 72 6f 72 28 29 20 61 6e  etLastError() an
2ab70 64 20 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 28  d FormatMessage(
2ab80 29 20 6f 6e 20 57 69 6e 64 6f 77 73 20 28 6f 72  ) on Windows (or
2ab90 20 65 72 72 6e 6f 20 61 6e 64 0a 2a 2a 20 73 74   errno and.** st
2aba0 72 65 72 72 6f 72 5f 72 28 29 20 6f 6e 20 55 6e  rerror_r() on Un
2abb0 69 78 29 2e 20 41 66 74 65 72 20 61 6e 20 65 72  ix). After an er
2abc0 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20  ror is returned 
2abd0 62 79 20 61 6e 20 4f 53 0a 2a 2a 20 66 75 6e 63  by an OS.** func
2abe0 74 69 6f 6e 2c 20 53 51 4c 69 74 65 20 63 61 6c  tion, SQLite cal
2abf0 6c 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ls this function
2ac00 20 77 69 74 68 20 7a 42 75 66 20 70 6f 69 6e 74   with zBuf point
2ac10 69 6e 67 20 74 6f 0a 2a 2a 20 61 20 62 75 66 66  ing to.** a buff
2ac20 65 72 20 6f 66 20 6e 42 75 66 20 62 79 74 65 73  er of nBuf bytes
2ac30 2e 20 54 68 65 20 4f 53 20 6c 61 79 65 72 20 73  . The OS layer s
2ac40 68 6f 75 6c 64 20 70 6f 70 75 6c 61 74 65 20 74  hould populate t
2ac50 68 65 0a 2a 2a 20 62 75 66 66 65 72 20 77 69 74  he.** buffer wit
2ac60 68 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74  h a nul-terminat
2ac70 65 64 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64  ed UTF-8 encoded
2ac80 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a   error message.*
2ac90 2a 20 64 65 73 63 72 69 62 69 6e 67 20 74 68 65  * describing the
2aca0 20 6c 61 73 74 20 49 4f 20 65 72 72 6f 72 20 74   last IO error t
2acb0 6f 20 68 61 76 65 20 6f 63 63 75 72 72 65 64 20  o have occurred 
2acc0 77 69 74 68 69 6e 20 74 68 65 20 63 61 6c 6c 69  within the calli
2acd0 6e 67 0a 2a 2a 20 74 68 72 65 61 64 2e 0a 2a 2a  ng.** thread..**
2ace0 0a 2a 2a 20 49 66 20 74 68 65 20 65 72 72 6f 72  .** If the error
2acf0 20 6d 65 73 73 61 67 65 20 69 73 20 74 6f 6f 20   message is too 
2ad00 6c 61 72 67 65 20 66 6f 72 20 74 68 65 20 73 75  large for the su
2ad10 70 70 6c 69 65 64 20 62 75 66 66 65 72 2c 0a 2a  pplied buffer,.*
2ad20 2a 20 69 74 20 73 68 6f 75 6c 64 20 62 65 20 74  * it should be t
2ad30 72 75 6e 63 61 74 65 64 2e 20 54 68 65 20 72 65  runcated. The re
2ad40 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 78 47  turn value of xG
2ad50 65 74 4c 61 73 74 45 72 72 6f 72 0a 2a 2a 20 69  etLastError.** i
2ad60 73 20 7a 65 72 6f 20 69 66 20 74 68 65 20 65 72  s zero if the er
2ad70 72 6f 72 20 6d 65 73 73 61 67 65 20 66 69 74 73  ror message fits
2ad80 20 69 6e 20 74 68 65 20 62 75 66 66 65 72 2c 20   in the buffer, 
2ad90 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20 6f  or non-zero.** o
2ada0 74 68 65 72 77 69 73 65 20 28 69 66 20 74 68 65  therwise (if the
2adb0 20 6d 65 73 73 61 67 65 20 77 61 73 20 74 72 75   message was tru
2adc0 6e 63 61 74 65 64 29 2e 20 49 66 20 6e 6f 6e 2d  ncated). If non-
2add0 7a 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64  zero is returned
2ade0 2c 0a 2a 2a 20 74 68 65 6e 20 69 74 20 69 73 20  ,.** then it is 
2adf0 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f  not necessary to
2ae00 20 69 6e 63 6c 75 64 65 20 74 68 65 20 6e 75 6c   include the nul
2ae10 2d 74 65 72 6d 69 6e 61 74 6f 72 20 63 68 61 72  -terminator char
2ae20 61 63 74 65 72 0a 2a 2a 20 69 6e 20 74 68 65 20  acter.** in the 
2ae30 6f 75 74 70 75 74 20 62 75 66 66 65 72 2e 0a 2a  output buffer..*
2ae40 2a 0a 2a 2a 20 4e 6f 74 20 73 75 70 70 6c 79 69  *.** Not supplyi
2ae50 6e 67 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ng an error mess
2ae60 61 67 65 20 77 69 6c 6c 20 68 61 76 65 20 6e 6f  age will have no
2ae70 20 61 64 76 65 72 73 65 20 65 66 66 65 63 74 0a   adverse effect.
2ae80 2a 2a 20 6f 6e 20 53 51 4c 69 74 65 2e 20 49 74  ** on SQLite. It
2ae90 20 69 73 20 66 69 6e 65 20 74 6f 20 68 61 76 65   is fine to have
2aea0 20 61 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69   an implementati
2aeb0 6f 6e 20 74 68 61 74 20 6e 65 76 65 72 0a 2a 2a  on that never.**
2aec0 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f   returns an erro
2aed0 72 20 6d 65 73 73 61 67 65 3a 0a 2a 2a 0a 2a 2a  r message:.**.**
2aee0 20 20 20 69 6e 74 20 78 47 65 74 4c 61 73 74 45     int xGetLastE
2aef0 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73  rror(sqlite3_vfs
2af00 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 75 66   *pVfs, int nBuf
2af10 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 2a  , char *zBuf){.*
2af20 2a 20 20 20 20 20 61 73 73 65 72 74 28 7a 42 75  *     assert(zBu
2af30 66 5b 30 5d 3d 3d 27 5c 30 27 29 3b 0a 2a 2a 20  f[0]=='\0');.** 
2af40 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 2a 2a      return 0;.**
2af50 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 48 6f 77 65 76     }.**.** Howev
2af60 65 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6d  er if an error m
2af70 65 73 73 61 67 65 20 69 73 20 73 75 70 70 6c 69  essage is suppli
2af80 65 64 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 69  ed, it will be i
2af90 6e 63 6f 72 70 6f 72 61 74 65 64 0a 2a 2a 20 62  ncorporated.** b
2afa0 79 20 73 71 6c 69 74 65 20 69 6e 74 6f 20 74 68  y sqlite into th
2afb0 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  e error message 
2afc0 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 74 68 65  available to the
2afd0 20 75 73 65 72 20 75 73 69 6e 67 0a 2a 2a 20 73   user using.** s
2afe0 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 29 2c  qlite3_errmsg(),
2aff0 20 70 6f 73 73 69 62 6c 79 20 6d 61 6b 69 6e 67   possibly making
2b000 20 49 4f 20 65 72 72 6f 72 73 20 65 61 73 69 65   IO errors easie
2b010 72 20 74 6f 20 64 65 62 75 67 2e 0a 2a 2f 0a 73  r to debug..*/.s
2b020 74 61 74 69 63 20 69 6e 74 20 77 69 6e 47 65 74  tatic int winGet
2b030 4c 61 73 74 45 72 72 6f 72 28 73 71 6c 69 74 65  LastError(sqlite
2b040 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74  3_vfs *pVfs, int
2b050 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75   nBuf, char *zBu
2b060 66 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  f){.  UNUSED_PAR
2b070 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20  AMETER(pVfs);.  
2b080 72 65 74 75 72 6e 20 77 69 6e 47 65 74 4c 61 73  return winGetLas
2b090 74 45 72 72 6f 72 4d 73 67 28 6f 73 47 65 74 4c  tErrorMsg(osGetL
2b0a0 61 73 74 45 72 72 6f 72 28 29 2c 20 6e 42 75 66  astError(), nBuf
2b0b0 2c 20 7a 42 75 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  , zBuf);.}../*.*
2b0c0 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e 64  * Initialize and
2b0d0 20 64 65 69 6e 69 74 69 61 6c 69 7a 65 20 74 68   deinitialize th
2b0e0 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  e operating syst
2b0f0 65 6d 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f  em interface..*/
2b100 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f  .int sqlite3_os_
2b110 69 6e 69 74 28 76 6f 69 64 29 7b 0a 20 20 73 74  init(void){.  st
2b120 61 74 69 63 20 73 71 6c 69 74 65 33 5f 76 66 73  atic sqlite3_vfs
2b130 20 77 69 6e 56 66 73 20 3d 20 7b 0a 20 20 20 20   winVfs = {.    
2b140 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  3,              
2b150 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e       /* iVersion
2b160 20 2a 2f 0a 20 20 20 20 73 69 7a 65 6f 66 28 77   */.    sizeof(w
2b170 69 6e 46 69 6c 65 29 2c 20 20 20 20 20 2f 2a 20  inFile),     /* 
2b180 73 7a 4f 73 46 69 6c 65 20 2a 2f 0a 20 20 20 20  szOsFile */.    
2b190 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 58  SQLITE_WIN32_MAX
2b1a0 5f 50 41 54 48 5f 42 59 54 45 53 2c 20 2f 2a 20  _PATH_BYTES, /* 
2b1b0 6d 78 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20  mxPathname */.  
2b1c0 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
2b1d0 20 20 20 20 20 20 20 2f 2a 20 70 4e 65 78 74 20         /* pNext 
2b1e0 2a 2f 0a 20 20 20 20 22 77 69 6e 33 32 22 2c 20  */.    "win32", 
2b1f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a              /* z
2b200 4e 61 6d 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20  Name */.    0,  
2b210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b220 20 2f 2a 20 70 41 70 70 44 61 74 61 20 2a 2f 0a   /* pAppData */.
2b230 20 20 20 20 77 69 6e 4f 70 65 6e 2c 20 20 20 20      winOpen,    
2b240 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4f 70 65           /* xOpe
2b250 6e 20 2a 2f 0a 20 20 20 20 77 69 6e 44 65 6c 65  n */.    winDele
2b260 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  te,           /*
2b270 20 78 44 65 6c 65 74 65 20 2a 2f 0a 20 20 20 20   xDelete */.    
2b280 77 69 6e 41 63 63 65 73 73 2c 20 20 20 20 20 20  winAccess,      
2b290 20 20 20 20 20 2f 2a 20 78 41 63 63 65 73 73 20       /* xAccess 
2b2a0 2a 2f 0a 20 20 20 20 77 69 6e 46 75 6c 6c 50 61  */.    winFullPa
2b2b0 74 68 6e 61 6d 65 2c 20 20 20 20 20 2f 2a 20 78  thname,     /* x
2b2c0 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 2a 2f 0a  FullPathname */.
2b2d0 20 20 20 20 77 69 6e 44 6c 4f 70 65 6e 2c 20 20      winDlOpen,  
2b2e0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 4f           /* xDlO
2b2f0 70 65 6e 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c  pen */.    winDl
2b300 45 72 72 6f 72 2c 20 20 20 20 20 20 20 20 20 20  Error,          
2b310 2f 2a 20 78 44 6c 45 72 72 6f 72 20 2a 2f 0a 20  /* xDlError */. 
2b320 20 20 20 77 69 6e 44 6c 53 79 6d 2c 20 20 20 20     winDlSym,    
2b330 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 53 79          /* xDlSy
2b340 6d 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 43 6c  m */.    winDlCl
2b350 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ose,          /*
2b360 20 78 44 6c 43 6c 6f 73 65 20 2a 2f 0a 20 20 20   xDlClose */.   
2b370 20 77 69 6e 52 61 6e 64 6f 6d 6e 65 73 73 2c 20   winRandomness, 
2b380 20 20 20 20 20 20 2f 2a 20 78 52 61 6e 64 6f 6d        /* xRandom
2b390 6e 65 73 73 20 2a 2f 0a 20 20 20 20 77 69 6e 53  ness */.    winS
2b3a0 6c 65 65 70 2c 20 20 20 20 20 20 20 20 20 20 20  leep,           
2b3b0 20 2f 2a 20 78 53 6c 65 65 70 20 2a 2f 0a 20 20   /* xSleep */.  
2b3c0 20 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65    winCurrentTime
2b3d0 2c 20 20 20 20 20 20 2f 2a 20 78 43 75 72 72 65  ,      /* xCurre
2b3e0 6e 74 54 69 6d 65 20 2a 2f 0a 20 20 20 20 77 69  ntTime */.    wi
2b3f0 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 2c 20 20  nGetLastError,  
2b400 20 20 20 2f 2a 20 78 47 65 74 4c 61 73 74 45 72     /* xGetLastEr
2b410 72 6f 72 20 2a 2f 0a 20 20 20 20 77 69 6e 43 75  ror */.    winCu
2b420 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 2c 20  rrentTimeInt64, 
2b430 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65 49  /* xCurrentTimeI
2b440 6e 74 36 34 20 2a 2f 0a 20 20 20 20 77 69 6e 53  nt64 */.    winS
2b450 65 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20  etSystemCall,   
2b460 20 2f 2a 20 78 53 65 74 53 79 73 74 65 6d 43 61   /* xSetSystemCa
2b470 6c 6c 20 2a 2f 0a 20 20 20 20 77 69 6e 47 65 74  ll */.    winGet
2b480 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20 20 2f  SystemCall,    /
2b490 2a 20 78 47 65 74 53 79 73 74 65 6d 43 61 6c 6c  * xGetSystemCall
2b4a0 20 2a 2f 0a 20 20 20 20 77 69 6e 4e 65 78 74 53   */.    winNextS
2b4b0 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20 2f 2a 20  ystemCall,   /* 
2b4c0 78 4e 65 78 74 53 79 73 74 65 6d 43 61 6c 6c 20  xNextSystemCall 
2b4d0 2a 2f 0a 20 20 7d 3b 0a 23 69 66 20 64 65 66 69  */.  };.#if defi
2b4e0 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
2b4f0 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 73 74 61  _HAS_WIDE).  sta
2b500 74 69 63 20 73 71 6c 69 74 65 33 5f 76 66 73 20  tic sqlite3_vfs 
2b510 77 69 6e 4c 6f 6e 67 50 61 74 68 56 66 73 20 3d  winLongPathVfs =
2b520 20 7b 0a 20 20 20 20 33 2c 20 20 20 20 20 20 20   {.    3,       
2b530 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69              /* i
2b540 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 73  Version */.    s
2b550 69 7a 65 6f 66 28 77 69 6e 46 69 6c 65 29 2c 20  izeof(winFile), 
2b560 20 20 20 20 2f 2a 20 73 7a 4f 73 46 69 6c 65 20      /* szOsFile 
2b570 2a 2f 0a 20 20 20 20 53 51 4c 49 54 45 5f 57 49  */.    SQLITE_WI
2b580 4e 4e 54 5f 4d 41 58 5f 50 41 54 48 5f 42 59 54  NNT_MAX_PATH_BYT
2b590 45 53 2c 20 2f 2a 20 6d 78 50 61 74 68 6e 61 6d  ES, /* mxPathnam
2b5a0 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20  e */.    0,     
2b5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b5c0 20 70 4e 65 78 74 20 2a 2f 0a 20 20 20 20 22 77   pNext */.    "w
2b5d0 69 6e 33 32 2d 6c 6f 6e 67 70 61 74 68 22 2c 20  in32-longpath", 
2b5e0 20 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a 20     /* zName */. 
2b5f0 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20     0,           
2b600 20 20 20 20 20 20 20 20 2f 2a 20 70 41 70 70 44          /* pAppD
2b610 61 74 61 20 2a 2f 0a 20 20 20 20 77 69 6e 4f 70  ata */.    winOp
2b620 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  en,             
2b630 2f 2a 20 78 4f 70 65 6e 20 2a 2f 0a 20 20 20 20  /* xOpen */.    
2b640 77 69 6e 44 65 6c 65 74 65 2c 20 20 20 20 20 20  winDelete,      
2b650 20 20 20 20 20 2f 2a 20 78 44 65 6c 65 74 65 20       /* xDelete 
2b660 2a 2f 0a 20 20 20 20 77 69 6e 41 63 63 65 73 73  */.    winAccess
2b670 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78  ,           /* x
2b680 41 63 63 65 73 73 20 2a 2f 0a 20 20 20 20 77 69  Access */.    wi
2b690 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 20  nFullPathname,  
2b6a0 20 20 20 2f 2a 20 78 46 75 6c 6c 50 61 74 68 6e     /* xFullPathn
2b6b0 61 6d 65 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c  ame */.    winDl
2b6c0 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20  Open,           
2b6d0 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a 2f 0a 20 20  /* xDlOpen */.  
2b6e0 20 20 77 69 6e 44 6c 45 72 72 6f 72 2c 20 20 20    winDlError,   
2b6f0 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 45 72 72         /* xDlErr
2b700 6f 72 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 53  or */.    winDlS
2b710 79 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ym,            /
2b720 2a 20 78 44 6c 53 79 6d 20 2a 2f 0a 20 20 20 20  * xDlSym */.    
2b730 77 69 6e 44 6c 43 6c 6f 73 65 2c 20 20 20 20 20  winDlClose,     
2b740 20 20 20 20 20 2f 2a 20 78 44 6c 43 6c 6f 73 65       /* xDlClose
2b750 20 2a 2f 0a 20 20 20 20 77 69 6e 52 61 6e 64 6f   */.    winRando
2b760 6d 6e 65 73 73 2c 20 20 20 20 20 20 20 2f 2a 20  mness,       /* 
2b770 78 52 61 6e 64 6f 6d 6e 65 73 73 20 2a 2f 0a 20  xRandomness */. 
2b780 20 20 20 77 69 6e 53 6c 65 65 70 2c 20 20 20 20     winSleep,    
2b790 20 20 20 20 20 20 20 20 2f 2a 20 78 53 6c 65 65          /* xSlee
2b7a0 70 20 2a 2f 0a 20 20 20 20 77 69 6e 43 75 72 72  p */.    winCurr
2b7b0 65 6e 74 54 69 6d 65 2c 20 20 20 20 20 20 2f 2a  entTime,      /*
2b7c0 20 78 43 75 72 72 65 6e 74 54 69 6d 65 20 2a 2f   xCurrentTime */
2b7d0 0a 20 20 20 20 77 69 6e 47 65 74 4c 61 73 74 45  .    winGetLastE
2b7e0 72 72 6f 72 2c 20 20 20 20 20 2f 2a 20 78 47 65  rror,     /* xGe
2b7f0 74 4c 61 73 74 45 72 72 6f 72 20 2a 2f 0a 20 20  tLastError */.  
2b800 20 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65    winCurrentTime
2b810 49 6e 74 36 34 2c 20 2f 2a 20 78 43 75 72 72 65  Int64, /* xCurre
2b820 6e 74 54 69 6d 65 49 6e 74 36 34 20 2a 2f 0a 20  ntTimeInt64 */. 
2b830 20 20 20 77 69 6e 53 65 74 53 79 73 74 65 6d 43     winSetSystemC
2b840 61 6c 6c 2c 20 20 20 20 2f 2a 20 78 53 65 74 53  all,    /* xSetS
2b850 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20  ystemCall */.   
2b860 20 77 69 6e 47 65 74 53 79 73 74 65 6d 43 61 6c   winGetSystemCal
2b870 6c 2c 20 20 20 20 2f 2a 20 78 47 65 74 53 79 73  l,    /* xGetSys
2b880 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20 20 77  temCall */.    w
2b890 69 6e 4e 65 78 74 53 79 73 74 65 6d 43 61 6c 6c  inNextSystemCall
2b8a0 2c 20 20 20 2f 2a 20 78 4e 65 78 74 53 79 73 74  ,   /* xNextSyst
2b8b0 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 7d 3b 0a 23  emCall */.  };.#
2b8c0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 6f 75 62  endif..  /* Doub
2b8d0 6c 65 2d 63 68 65 63 6b 20 74 68 61 74 20 74 68  le-check that th
2b8e0 65 20 61 53 79 73 63 61 6c 6c 5b 5d 20 61 72 72  e aSyscall[] arr
2b8f0 61 79 20 68 61 73 20 62 65 65 6e 20 63 6f 6e 73  ay has been cons
2b900 74 72 75 63 74 65 64 0a 20 20 2a 2a 20 63 6f 72  tructed.  ** cor
2b910 72 65 63 74 6c 79 2e 20 20 53 65 65 20 74 69 63  rectly.  See tic
2b920 6b 65 74 20 5b 62 62 33 61 38 36 65 38 39 30 63  ket [bb3a86e890c
2b930 38 65 39 36 61 62 5d 20 2a 2f 0a 20 20 61 73 73  8e96ab] */.  ass
2b940 65 72 74 28 20 41 72 72 61 79 53 69 7a 65 28 61  ert( ArraySize(a
2b950 53 79 73 63 61 6c 6c 29 3d 3d 37 37 20 29 3b 0a  Syscall)==77 );.
2b960 0a 20 20 2f 2a 20 67 65 74 20 6d 65 6d 6f 72 79  .  /* get memory
2b970 20 6d 61 70 20 61 6c 6c 6f 63 61 74 69 6f 6e 20   map allocation 
2b980 67 72 61 6e 75 6c 61 72 69 74 79 20 2a 2f 0a 20  granularity */. 
2b990 20 6d 65 6d 73 65 74 28 26 77 69 6e 53 79 73 49   memset(&winSysI
2b9a0 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 53  nfo, 0, sizeof(S
2b9b0 59 53 54 45 4d 5f 49 4e 46 4f 29 29 3b 0a 23 69  YSTEM_INFO));.#i
2b9c0 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
2b9d0 54 0a 20 20 6f 73 47 65 74 4e 61 74 69 76 65 53  T.  osGetNativeS
2b9e0 79 73 74 65 6d 49 6e 66 6f 28 26 77 69 6e 53 79  ystemInfo(&winSy
2b9f0 73 49 6e 66 6f 29 3b 0a 23 65 6c 73 65 0a 20 20  sInfo);.#else.  
2ba00 6f 73 47 65 74 53 79 73 74 65 6d 49 6e 66 6f 28  osGetSystemInfo(
2ba10 26 77 69 6e 53 79 73 49 6e 66 6f 29 3b 0a 23 65  &winSysInfo);.#e
2ba20 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 77  ndif.  assert( w
2ba30 69 6e 53 79 73 49 6e 66 6f 2e 64 77 41 6c 6c 6f  inSysInfo.dwAllo
2ba40 63 61 74 69 6f 6e 47 72 61 6e 75 6c 61 72 69 74  cationGranularit
2ba50 79 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  y>0 );.  assert(
2ba60 20 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77 50 61   winSysInfo.dwPa
2ba70 67 65 53 69 7a 65 3e 30 20 29 3b 0a 0a 20 20 73  geSize>0 );..  s
2ba80 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73  qlite3_vfs_regis
2ba90 74 65 72 28 26 77 69 6e 56 66 73 2c 20 31 29 3b  ter(&winVfs, 1);
2baa0 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
2bab0 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57  LITE_WIN32_HAS_W
2bac0 49 44 45 29 0a 20 20 73 71 6c 69 74 65 33 5f 76  IDE).  sqlite3_v
2bad0 66 73 5f 72 65 67 69 73 74 65 72 28 26 77 69 6e  fs_register(&win
2bae0 4c 6f 6e 67 50 61 74 68 56 66 73 2c 20 30 29 3b  LongPathVfs, 0);
2baf0 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72  .#endif..  retur
2bb00 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
2bb10 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f 65  int sqlite3_os_e
2bb20 6e 64 28 76 6f 69 64 29 7b 0a 23 69 66 20 53 51  nd(void){.#if SQ
2bb30 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
2bb40 69 66 28 20 73 6c 65 65 70 4f 62 6a 21 3d 4e 55  if( sleepObj!=NU
2bb50 4c 4c 20 29 7b 0a 20 20 20 20 6f 73 43 6c 6f 73  LL ){.    osClos
2bb60 65 48 61 6e 64 6c 65 28 73 6c 65 65 70 4f 62 6a  eHandle(sleepObj
2bb70 29 3b 0a 20 20 20 20 73 6c 65 65 70 4f 62 6a 20  );.    sleepObj 
2bb80 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 23 65 6e 64  = NULL;.  }.#end
2bb90 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  if.  return SQLI
2bba0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66  TE_OK;.}..#endif
2bbb0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49   /* SQLITE_OS_WI
2bbc0 4e 20 2a 2f 0a                                   N */.