/ Hex Artifact Content
Login

Artifact 90d3fb97df7f5d5f52fae323337f7a3f1bee6c06:


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 76 6f 6c 61 74 69 6c 65 20 73 71 6c 69 74  G volatile sqlit
3280: 65 33 5f 6f 73 5f 74 79 70 65 20 3d 20 30 3b 0a  e3_os_type = 0;.
3290: 23 65 6c 73 65 0a 73 74 61 74 69 63 20 4c 4f 4e  #else.static LON
32a0: 47 20 76 6f 6c 61 74 69 6c 65 20 73 71 6c 69 74  G volatile sqlit
32b0: 65 33 5f 6f 73 5f 74 79 70 65 20 3d 20 30 3b 0a  e3_os_type = 0;.
32c0: 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
32d0: 53 59 53 43 41 4c 4c 0a 23 20 20 64 65 66 69 6e  SYSCALL.#  defin
32e0: 65 20 53 59 53 43 41 4c 4c 20 73 71 6c 69 74 65  e SYSCALL sqlite
32f0: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 0a 23 65  3_syscall_ptr.#e
3300: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
3310: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 74   function is not
3320: 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 57 69   available on Wi
3330: 6e 64 6f 77 73 20 43 45 20 6f 72 20 57 69 6e 52  ndows CE or WinR
3340: 54 2e 0a 20 2a 2f 0a 0a 23 69 66 20 53 51 4c 49  T.. */..#if SQLI
3350: 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 53  TE_OS_WINCE || S
3360: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 23  QLITE_OS_WINRT.#
3370: 20 20 64 65 66 69 6e 65 20 6f 73 41 72 65 46 69    define osAreFi
3380: 6c 65 41 70 69 73 41 4e 53 49 28 29 20 20 20 20  leApisANSI()    
3390: 20 20 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a     1.#endif../*.
33a0: 2a 2a 20 4d 61 6e 79 20 73 79 73 74 65 6d 20 63  ** Many system c
33b0: 61 6c 6c 73 20 61 72 65 20 61 63 63 65 73 73 65  alls are accesse
33c0: 64 20 74 68 72 6f 75 67 68 20 70 6f 69 6e 74 65  d through pointe
33d0: 72 2d 74 6f 2d 66 75 6e 63 74 69 6f 6e 73 20 73  r-to-functions s
33e0: 6f 20 74 68 61 74 0a 2a 2a 20 74 68 65 79 20 6d  o that.** they m
33f0: 61 79 20 62 65 20 6f 76 65 72 72 69 64 64 65 6e  ay be overridden
3400: 20 61 74 20 72 75 6e 74 69 6d 65 20 74 6f 20 66   at runtime to f
3410: 61 63 69 6c 69 74 61 74 65 20 66 61 75 6c 74 20  acilitate fault 
3420: 69 6e 6a 65 63 74 69 6f 6e 20 64 75 72 69 6e 67  injection during
3430: 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20  .** testing and 
3440: 73 61 6e 64 62 6f 78 69 6e 67 2e 20 20 54 68 65  sandboxing.  The
3450: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 72 61 79   following array
3460: 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 73   holds the names
3470: 20 61 6e 64 20 70 6f 69 6e 74 65 72 73 0a 2a 2a   and pointers.**
3480: 20 74 6f 20 61 6c 6c 20 6f 76 65 72 72 69 64 65   to all override
3490: 61 62 6c 65 20 73 79 73 74 65 6d 20 63 61 6c 6c  able system call
34a0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72  s..*/.static str
34b0: 75 63 74 20 77 69 6e 5f 73 79 73 63 61 6c 6c 20  uct win_syscall 
34c0: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
34d0: 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  zName;          
34e0: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
34f0: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a   system call */.
3500: 20 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c    sqlite3_syscal
3510: 6c 5f 70 74 72 20 70 43 75 72 72 65 6e 74 3b 20  l_ptr pCurrent; 
3520: 2f 2a 20 43 75 72 72 65 6e 74 20 76 61 6c 75 65  /* Current value
3530: 20 6f 66 20 74 68 65 20 73 79 73 74 65 6d 20 63   of the system c
3540: 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  all */.  sqlite3
3550: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 70 44 65  _syscall_ptr pDe
3560: 66 61 75 6c 74 3b 20 2f 2a 20 44 65 66 61 75 6c  fault; /* Defaul
3570: 74 20 76 61 6c 75 65 20 2a 2f 0a 7d 20 61 53 79  t value */.} aSy
3580: 73 63 61 6c 6c 5b 5d 20 3d 20 7b 0a 23 69 66 20  scall[] = {.#if 
3590: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45  !SQLITE_OS_WINCE
35a0: 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57   && !SQLITE_OS_W
35b0: 49 4e 52 54 0a 20 20 7b 20 22 41 72 65 46 69 6c  INRT.  { "AreFil
35c0: 65 41 70 69 73 41 4e 53 49 22 2c 20 20 20 20 20  eApisANSI",     
35d0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 41 72 65      (SYSCALL)Are
35e0: 46 69 6c 65 41 70 69 73 41 4e 53 49 2c 20 20 20  FileApisANSI,   
35f0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
3600: 0a 20 20 7b 20 22 41 72 65 46 69 6c 65 41 70 69  .  { "AreFileApi
3610: 73 41 4e 53 49 22 2c 20 20 20 20 20 20 20 20 20  sANSI",         
3620: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
3630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3640: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
3650: 69 66 6e 64 65 66 20 6f 73 41 72 65 46 69 6c 65  ifndef osAreFile
3660: 41 70 69 73 41 4e 53 49 0a 23 64 65 66 69 6e 65  ApisANSI.#define
3670: 20 6f 73 41 72 65 46 69 6c 65 41 70 69 73 41 4e   osAreFileApisAN
3680: 53 49 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  SI ((BOOL(WINAPI
3690: 2a 29 28 56 4f 49 44 29 29 61 53 79 73 63 61 6c  *)(VOID))aSyscal
36a0: 6c 5b 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 23  l[0].pCurrent).#
36b0: 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54  endif..#if SQLIT
36c0: 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 64 65  E_OS_WINCE && de
36d0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
36e0: 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b  32_HAS_WIDE).  {
36f0: 20 22 43 68 61 72 4c 6f 77 65 72 57 22 2c 20 20   "CharLowerW",  
3700: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
3710: 43 41 4c 4c 29 43 68 61 72 4c 6f 77 65 72 57 2c  CALL)CharLowerW,
3720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
3730: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 68  },.#else.  { "Ch
3740: 61 72 4c 6f 77 65 72 57 22 2c 20 20 20 20 20 20  arLowerW",      
3750: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
3760: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
3770: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
3780: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
3790: 73 43 68 61 72 4c 6f 77 65 72 57 20 28 28 4c 50  sCharLowerW ((LP
37a0: 57 53 54 52 28 57 49 4e 41 50 49 2a 29 28 4c 50  WSTR(WINAPI*)(LP
37b0: 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 31  WSTR))aSyscall[1
37c0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
37d0: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
37e0: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
37f0: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
3800: 45 29 0a 20 20 7b 20 22 43 68 61 72 55 70 70 65  E).  { "CharUppe
3810: 72 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  rW",            
3820: 20 20 28 53 59 53 43 41 4c 4c 29 43 68 61 72 55    (SYSCALL)CharU
3830: 70 70 65 72 57 2c 20 20 20 20 20 20 20 20 20 20  pperW,          
3840: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
3850: 20 7b 20 22 43 68 61 72 55 70 70 65 72 57 22 2c   { "CharUpperW",
3860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
3870: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
3880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3890: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
38a0: 66 69 6e 65 20 6f 73 43 68 61 72 55 70 70 65 72  fine osCharUpper
38b0: 57 20 28 28 4c 50 57 53 54 52 28 57 49 4e 41 50  W ((LPWSTR(WINAP
38c0: 49 2a 29 28 4c 50 57 53 54 52 29 29 61 53 79 73  I*)(LPWSTR))aSys
38d0: 63 61 6c 6c 5b 32 5d 2e 70 43 75 72 72 65 6e 74  call[2].pCurrent
38e0: 29 0a 0a 20 20 7b 20 22 43 6c 6f 73 65 48 61 6e  )..  { "CloseHan
38f0: 64 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  dle",           
3900: 20 20 28 53 59 53 43 41 4c 4c 29 43 6c 6f 73 65    (SYSCALL)Close
3910: 48 61 6e 64 6c 65 2c 20 20 20 20 20 20 20 20 20  Handle,         
3920: 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e      0 },..#defin
3930: 65 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 20  e osCloseHandle 
3940: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
3950: 48 41 4e 44 4c 45 29 29 61 53 79 73 63 61 6c 6c  HANDLE))aSyscall
3960: 5b 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  [3].pCurrent)..#
3970: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
3980: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
3990: 29 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c  ).  { "CreateFil
39a0: 65 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  eA",            
39b0: 20 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65   (SYSCALL)Create
39c0: 46 69 6c 65 41 2c 20 20 20 20 20 20 20 20 20 20  FileA,          
39d0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
39e0: 7b 20 22 43 72 65 61 74 65 46 69 6c 65 41 22 2c  { "CreateFileA",
39f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
3a00: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
3a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
3a20: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
3a30: 69 6e 65 20 6f 73 43 72 65 61 74 65 46 69 6c 65  ine osCreateFile
3a40: 41 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50  A ((HANDLE(WINAP
3a50: 49 2a 29 28 4c 50 43 53 54 52 2c 44 57 4f 52 44  I*)(LPCSTR,DWORD
3a60: 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20  ,DWORD, \.      
3a70: 20 20 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54    LPSECURITY_ATT
3a80: 52 49 42 55 54 45 53 2c 44 57 4f 52 44 2c 44 57  RIBUTES,DWORD,DW
3a90: 4f 52 44 2c 48 41 4e 44 4c 45 29 29 61 53 79 73  ORD,HANDLE))aSys
3aa0: 63 61 6c 6c 5b 34 5d 2e 70 43 75 72 72 65 6e 74  call[4].pCurrent
3ab0: 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  )..#if !SQLITE_O
3ac0: 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e  S_WINRT && defin
3ad0: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
3ae0: 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 43  HAS_WIDE).  { "C
3af0: 72 65 61 74 65 46 69 6c 65 57 22 2c 20 20 20 20  reateFileW",    
3b00: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
3b10: 4c 29 43 72 65 61 74 65 46 69 6c 65 57 2c 20 20  L)CreateFileW,  
3b20: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
3b30: 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65 61 74  #else.  { "Creat
3b40: 65 46 69 6c 65 57 22 2c 20 20 20 20 20 20 20 20  eFileW",        
3b50: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
3b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b70: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
3b80: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72  if..#define osCr
3b90: 65 61 74 65 46 69 6c 65 57 20 28 28 48 41 4e 44  eateFileW ((HAND
3ba0: 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57  LE(WINAPI*)(LPCW
3bb0: 53 54 52 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c  STR,DWORD,DWORD,
3bc0: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 53 45 43   \.        LPSEC
3bd0: 55 52 49 54 59 5f 41 54 54 52 49 42 55 54 45 53  URITY_ATTRIBUTES
3be0: 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 48 41 4e  ,DWORD,DWORD,HAN
3bf0: 44 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 35 5d  DLE))aSyscall[5]
3c00: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
3c10: 28 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  (!SQLITE_OS_WINR
3c20: 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  T && defined(SQL
3c30: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
3c40: 53 49 29 20 26 26 20 5c 0a 20 20 20 20 20 20 20  SI) && \.       
3c50: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
3c60: 5f 4f 4d 49 54 5f 57 41 4c 29 29 0a 20 20 7b 20  _OMIT_WAL)).  { 
3c70: 22 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69  "CreateFileMappi
3c80: 6e 67 41 22 2c 20 20 20 20 20 20 28 53 59 53 43  ngA",      (SYSC
3c90: 41 4c 4c 29 43 72 65 61 74 65 46 69 6c 65 4d 61  ALL)CreateFileMa
3ca0: 70 70 69 6e 67 41 2c 20 20 20 20 20 20 30 20 7d  ppingA,      0 }
3cb0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65  ,.#else.  { "Cre
3cc0: 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 41 22  ateFileMappingA"
3cd0: 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29  ,      (SYSCALL)
3ce0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
3cf0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
3d00: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
3d10: 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e  CreateFileMappin
3d20: 67 41 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41  gA ((HANDLE(WINA
3d30: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 50 53 45  PI*)(HANDLE,LPSE
3d40: 43 55 52 49 54 59 5f 41 54 54 52 49 42 55 54 45  CURITY_ATTRIBUTE
3d50: 53 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f  S, \.        DWO
3d60: 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 4c  RD,DWORD,DWORD,L
3d70: 50 43 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b  PCSTR))aSyscall[
3d80: 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  6].pCurrent)..#i
3d90: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
3da0: 45 20 7c 7c 20 28 21 53 51 4c 49 54 45 5f 4f 53  E || (!SQLITE_OS
3db0: 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65  _WINRT && define
3dc0: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
3dd0: 41 53 5f 57 49 44 45 29 20 26 26 20 5c 0a 20 20  AS_WIDE) && \.  
3de0: 20 20 20 20 20 20 21 64 65 66 69 6e 65 64 28 53        !defined(S
3df0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 29  QLITE_OMIT_WAL))
3e00: 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65  .  { "CreateFile
3e10: 4d 61 70 70 69 6e 67 57 22 2c 20 20 20 20 20 20  MappingW",      
3e20: 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65 46  (SYSCALL)CreateF
3e30: 69 6c 65 4d 61 70 70 69 6e 67 57 2c 20 20 20 20  ileMappingW,    
3e40: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
3e50: 20 22 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70   "CreateFileMapp
3e60: 69 6e 67 57 22 2c 20 20 20 20 20 20 28 53 59 53  ingW",      (SYS
3e70: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
3e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
3e90: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
3ea0: 6e 65 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d  ne osCreateFileM
3eb0: 61 70 70 69 6e 67 57 20 28 28 48 41 4e 44 4c 45  appingW ((HANDLE
3ec0: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
3ed0: 2c 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54 52  ,LPSECURITY_ATTR
3ee0: 49 42 55 54 45 53 2c 20 5c 0a 20 20 20 20 20 20  IBUTES, \.      
3ef0: 20 20 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57    DWORD,DWORD,DW
3f00: 4f 52 44 2c 4c 50 43 57 53 54 52 29 29 61 53 79  ORD,LPCWSTR))aSy
3f10: 73 63 61 6c 6c 5b 37 5d 2e 70 43 75 72 72 65 6e  scall[7].pCurren
3f20: 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  t)..#if !SQLITE_
3f30: 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69  OS_WINRT && defi
3f40: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
3f50: 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22  _HAS_WIDE).  { "
3f60: 43 72 65 61 74 65 4d 75 74 65 78 57 22 2c 20 20  CreateMutexW",  
3f70: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
3f80: 4c 4c 29 43 72 65 61 74 65 4d 75 74 65 78 57 2c  LL)CreateMutexW,
3f90: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
3fa0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65 61  .#else.  { "Crea
3fb0: 74 65 4d 75 74 65 78 57 22 2c 20 20 20 20 20 20  teMutexW",      
3fc0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
3fd0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3fe0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
3ff0: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43  dif..#define osC
4000: 72 65 61 74 65 4d 75 74 65 78 57 20 28 28 48 41  reateMutexW ((HA
4010: 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50  NDLE(WINAPI*)(LP
4020: 53 45 43 55 52 49 54 59 5f 41 54 54 52 49 42 55  SECURITY_ATTRIBU
4030: 54 45 53 2c 42 4f 4f 4c 2c 20 5c 0a 20 20 20 20  TES,BOOL, \.    
4040: 20 20 20 20 4c 50 43 57 53 54 52 29 29 61 53 79      LPCWSTR))aSy
4050: 73 63 61 6c 6c 5b 38 5d 2e 70 43 75 72 72 65 6e  scall[8].pCurren
4060: 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  t)..#if defined(
4070: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
4080: 5f 41 4e 53 49 29 0a 20 20 7b 20 22 44 65 6c 65  _ANSI).  { "Dele
4090: 74 65 46 69 6c 65 41 22 2c 20 20 20 20 20 20 20  teFileA",       
40a0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 44        (SYSCALL)D
40b0: 65 6c 65 74 65 46 69 6c 65 41 2c 20 20 20 20 20  eleteFileA,     
40c0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
40d0: 73 65 0a 20 20 7b 20 22 44 65 6c 65 74 65 46 69  se.  { "DeleteFi
40e0: 6c 65 41 22 2c 20 20 20 20 20 20 20 20 20 20 20  leA",           
40f0: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
4100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4110: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
4120: 0a 23 64 65 66 69 6e 65 20 6f 73 44 65 6c 65 74  .#define osDelet
4130: 65 46 69 6c 65 41 20 28 28 42 4f 4f 4c 28 57 49  eFileA ((BOOL(WI
4140: 4e 41 50 49 2a 29 28 4c 50 43 53 54 52 29 29 61  NAPI*)(LPCSTR))a
4150: 53 79 73 63 61 6c 6c 5b 39 5d 2e 70 43 75 72 72  Syscall[9].pCurr
4160: 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65  ent)..#if define
4170: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
4180: 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 44 65  AS_WIDE).  { "De
4190: 6c 65 74 65 46 69 6c 65 57 22 2c 20 20 20 20 20  leteFileW",     
41a0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
41b0: 29 44 65 6c 65 74 65 46 69 6c 65 57 2c 20 20 20  )DeleteFileW,   
41c0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
41d0: 65 6c 73 65 0a 20 20 7b 20 22 44 65 6c 65 74 65  else.  { "Delete
41e0: 46 69 6c 65 57 22 2c 20 20 20 20 20 20 20 20 20  FileW",         
41f0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
4200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4210: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
4220: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 44 65 6c  f..#define osDel
4230: 65 74 65 46 69 6c 65 57 20 28 28 42 4f 4f 4c 28  eteFileW ((BOOL(
4240: 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52  WINAPI*)(LPCWSTR
4250: 29 29 61 53 79 73 63 61 6c 6c 5b 31 30 5d 2e 70  ))aSyscall[10].p
4260: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51  Current)..#if SQ
4270: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
4280: 7b 20 22 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63  { "FileTimeToLoc
4290: 61 6c 46 69 6c 65 54 69 6d 65 22 2c 20 28 53 59  alFileTime", (SY
42a0: 53 43 41 4c 4c 29 46 69 6c 65 54 69 6d 65 54 6f  SCALL)FileTimeTo
42b0: 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65 2c 20 30  LocalFileTime, 0
42c0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 46   },.#else.  { "F
42d0: 69 6c 65 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69  ileTimeToLocalFi
42e0: 6c 65 54 69 6d 65 22 2c 20 28 53 59 53 43 41 4c  leTime", (SYSCAL
42f0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
4300: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
4310: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
4320: 6f 73 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63 61  osFileTimeToLoca
4330: 6c 46 69 6c 65 54 69 6d 65 20 28 28 42 4f 4f 4c  lFileTime ((BOOL
4340: 28 57 49 4e 41 50 49 2a 29 28 43 4f 4e 53 54 20  (WINAPI*)(CONST 
4350: 46 49 4c 45 54 49 4d 45 2a 2c 20 5c 0a 20 20 20  FILETIME*, \.   
4360: 20 20 20 20 20 4c 50 46 49 4c 45 54 49 4d 45 29       LPFILETIME)
4370: 29 61 53 79 73 63 61 6c 6c 5b 31 31 5d 2e 70 43  )aSyscall[11].pC
4380: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c  urrent)..#if SQL
4390: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 7b  ITE_OS_WINCE.  {
43a0: 20 22 46 69 6c 65 54 69 6d 65 54 6f 53 79 73 74   "FileTimeToSyst
43b0: 65 6d 54 69 6d 65 22 2c 20 20 20 20 28 53 59 53  emTime",    (SYS
43c0: 43 41 4c 4c 29 46 69 6c 65 54 69 6d 65 54 6f 53  CALL)FileTimeToS
43d0: 79 73 74 65 6d 54 69 6d 65 2c 20 20 20 20 30 20  ystemTime,    0 
43e0: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 46 69  },.#else.  { "Fi
43f0: 6c 65 54 69 6d 65 54 6f 53 79 73 74 65 6d 54 69  leTimeToSystemTi
4400: 6d 65 22 2c 20 20 20 20 28 53 59 53 43 41 4c 4c  me",    (SYSCALL
4410: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
4420: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
4430: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
4440: 73 46 69 6c 65 54 69 6d 65 54 6f 53 79 73 74 65  sFileTimeToSyste
4450: 6d 54 69 6d 65 20 28 28 42 4f 4f 4c 28 57 49 4e  mTime ((BOOL(WIN
4460: 41 50 49 2a 29 28 43 4f 4e 53 54 20 46 49 4c 45  API*)(CONST FILE
4470: 54 49 4d 45 2a 2c 20 5c 0a 20 20 20 20 20 20 20  TIME*, \.       
4480: 20 4c 50 53 59 53 54 45 4d 54 49 4d 45 29 29 61   LPSYSTEMTIME))a
4490: 53 79 73 63 61 6c 6c 5b 31 32 5d 2e 70 43 75 72  Syscall[12].pCur
44a0: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 46 6c 75 73  rent)..  { "Flus
44b0: 68 46 69 6c 65 42 75 66 66 65 72 73 22 2c 20 20  hFileBuffers",  
44c0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 46        (SYSCALL)F
44d0: 6c 75 73 68 46 69 6c 65 42 75 66 66 65 72 73 2c  lushFileBuffers,
44e0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64          0 },..#d
44f0: 65 66 69 6e 65 20 6f 73 46 6c 75 73 68 46 69 6c  efine osFlushFil
4500: 65 42 75 66 66 65 72 73 20 28 28 42 4f 4f 4c 28  eBuffers ((BOOL(
4510: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 29  WINAPI*)(HANDLE)
4520: 29 61 53 79 73 63 61 6c 6c 5b 31 33 5d 2e 70 43  )aSyscall[13].pC
4530: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66  urrent)..#if def
4540: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
4550: 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20  2_HAS_ANSI).  { 
4560: 22 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 41 22  "FormatMessageA"
4570: 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43  ,          (SYSC
4580: 41 4c 4c 29 46 6f 72 6d 61 74 4d 65 73 73 61 67  ALL)FormatMessag
4590: 65 41 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d  eA,          0 }
45a0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 46 6f 72  ,.#else.  { "For
45b0: 6d 61 74 4d 65 73 73 61 67 65 41 22 2c 20 20 20  matMessageA",   
45c0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
45d0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
45e0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
45f0: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
4600: 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 41 20 28  FormatMessageA (
4610: 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28  (DWORD(WINAPI*)(
4620: 44 57 4f 52 44 2c 4c 50 43 56 4f 49 44 2c 44 57  DWORD,LPCVOID,DW
4630: 4f 52 44 2c 44 57 4f 52 44 2c 4c 50 53 54 52 2c  ORD,DWORD,LPSTR,
4640: 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44   \.        DWORD
4650: 2c 76 61 5f 6c 69 73 74 2a 29 29 61 53 79 73 63  ,va_list*))aSysc
4660: 61 6c 6c 5b 31 34 5d 2e 70 43 75 72 72 65 6e 74  all[14].pCurrent
4670: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  )..#if defined(S
4680: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
4690: 57 49 44 45 29 0a 20 20 7b 20 22 46 6f 72 6d 61  WIDE).  { "Forma
46a0: 74 4d 65 73 73 61 67 65 57 22 2c 20 20 20 20 20  tMessageW",     
46b0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 46 6f       (SYSCALL)Fo
46c0: 72 6d 61 74 4d 65 73 73 61 67 65 57 2c 20 20 20  rmatMessageW,   
46d0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
46e0: 65 0a 20 20 7b 20 22 46 6f 72 6d 61 74 4d 65 73  e.  { "FormatMes
46f0: 73 61 67 65 57 22 2c 20 20 20 20 20 20 20 20 20  sageW",         
4700: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
4710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4720: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
4730: 23 64 65 66 69 6e 65 20 6f 73 46 6f 72 6d 61 74  #define osFormat
4740: 4d 65 73 73 61 67 65 57 20 28 28 44 57 4f 52 44  MessageW ((DWORD
4750: 28 57 49 4e 41 50 49 2a 29 28 44 57 4f 52 44 2c  (WINAPI*)(DWORD,
4760: 4c 50 43 56 4f 49 44 2c 44 57 4f 52 44 2c 44 57  LPCVOID,DWORD,DW
4770: 4f 52 44 2c 4c 50 57 53 54 52 2c 20 5c 0a 20 20  ORD,LPWSTR, \.  
4780: 20 20 20 20 20 20 44 57 4f 52 44 2c 76 61 5f 6c        DWORD,va_l
4790: 69 73 74 2a 29 29 61 53 79 73 63 61 6c 6c 5b 31  ist*))aSyscall[1
47a0: 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  5].pCurrent)..#i
47b0: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
47c0: 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45  E_OMIT_LOAD_EXTE
47d0: 4e 53 49 4f 4e 29 0a 20 20 7b 20 22 46 72 65 65  NSION).  { "Free
47e0: 4c 69 62 72 61 72 79 22 2c 20 20 20 20 20 20 20  Library",       
47f0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 46        (SYSCALL)F
4800: 72 65 65 4c 69 62 72 61 72 79 2c 20 20 20 20 20  reeLibrary,     
4810: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
4820: 73 65 0a 20 20 7b 20 22 46 72 65 65 4c 69 62 72  se.  { "FreeLibr
4830: 61 72 79 22 2c 20 20 20 20 20 20 20 20 20 20 20  ary",           
4840: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
4850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4860: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
4870: 0a 23 64 65 66 69 6e 65 20 6f 73 46 72 65 65 4c  .#define osFreeL
4880: 69 62 72 61 72 79 20 28 28 42 4f 4f 4c 28 57 49  ibrary ((BOOL(WI
4890: 4e 41 50 49 2a 29 28 48 4d 4f 44 55 4c 45 29 29  NAPI*)(HMODULE))
48a0: 61 53 79 73 63 61 6c 6c 5b 31 36 5d 2e 70 43 75  aSyscall[16].pCu
48b0: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 47 65 74  rrent)..  { "Get
48c0: 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
48d0: 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29  ",     (SYSCALL)
48e0: 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
48f0: 73 49 64 2c 20 20 20 20 20 30 20 7d 2c 0a 0a 23  sId,     0 },..#
4900: 64 65 66 69 6e 65 20 6f 73 47 65 74 43 75 72 72  define osGetCurr
4910: 65 6e 74 50 72 6f 63 65 73 73 49 64 20 28 28 44  entProcessId ((D
4920: 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 56 4f  WORD(WINAPI*)(VO
4930: 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 31 37 5d  ID))aSyscall[17]
4940: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
4950: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45  !SQLITE_OS_WINCE
4960: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
4970: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
4980: 49 29 0a 20 20 7b 20 22 47 65 74 44 69 73 6b 46  I).  { "GetDiskF
4990: 72 65 65 53 70 61 63 65 41 22 2c 20 20 20 20 20  reeSpaceA",     
49a0: 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 44 69    (SYSCALL)GetDi
49b0: 73 6b 46 72 65 65 53 70 61 63 65 41 2c 20 20 20  skFreeSpaceA,   
49c0: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
49d0: 20 7b 20 22 47 65 74 44 69 73 6b 46 72 65 65 53   { "GetDiskFreeS
49e0: 70 61 63 65 41 22 2c 20 20 20 20 20 20 20 28 53  paceA",       (S
49f0: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
4a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a10: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
4a20: 66 69 6e 65 20 6f 73 47 65 74 44 69 73 6b 46 72  fine osGetDiskFr
4a30: 65 65 53 70 61 63 65 41 20 28 28 42 4f 4f 4c 28  eeSpaceA ((BOOL(
4a40: 57 49 4e 41 50 49 2a 29 28 4c 50 43 53 54 52 2c  WINAPI*)(LPCSTR,
4a50: 4c 50 44 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c  LPDWORD,LPDWORD,
4a60: 4c 50 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20  LPDWORD, \.     
4a70: 20 20 20 4c 50 44 57 4f 52 44 29 29 61 53 79 73     LPDWORD))aSys
4a80: 63 61 6c 6c 5b 31 38 5d 2e 70 43 75 72 72 65 6e  call[18].pCurren
4a90: 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  t)..#if !SQLITE_
4aa0: 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c  OS_WINCE && !SQL
4ab0: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20  ITE_OS_WINRT && 
4ac0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
4ad0: 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20  IN32_HAS_WIDE). 
4ae0: 20 7b 20 22 47 65 74 44 69 73 6b 46 72 65 65 53   { "GetDiskFreeS
4af0: 70 61 63 65 57 22 2c 20 20 20 20 20 20 20 28 53  paceW",       (S
4b00: 59 53 43 41 4c 4c 29 47 65 74 44 69 73 6b 46 72  YSCALL)GetDiskFr
4b10: 65 65 53 70 61 63 65 57 2c 20 20 20 20 20 20 20  eeSpaceW,       
4b20: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
4b30: 47 65 74 44 69 73 6b 46 72 65 65 53 70 61 63 65  GetDiskFreeSpace
4b40: 57 22 2c 20 20 20 20 20 20 20 28 53 59 53 43 41  W",       (SYSCA
4b50: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
4b60: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
4b70: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
4b80: 20 6f 73 47 65 74 44 69 73 6b 46 72 65 65 53 70   osGetDiskFreeSp
4b90: 61 63 65 57 20 28 28 42 4f 4f 4c 28 57 49 4e 41  aceW ((BOOL(WINA
4ba0: 50 49 2a 29 28 4c 50 43 57 53 54 52 2c 4c 50 44  PI*)(LPCWSTR,LPD
4bb0: 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 4c 50 44  WORD,LPDWORD,LPD
4bc0: 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20  WORD, \.        
4bd0: 4c 50 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c  LPDWORD))aSyscal
4be0: 6c 5b 31 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[19].pCurrent).
4bf0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
4c00: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
4c10: 53 49 29 0a 20 20 7b 20 22 47 65 74 46 69 6c 65  SI).  { "GetFile
4c20: 41 74 74 72 69 62 75 74 65 73 41 22 2c 20 20 20  AttributesA",   
4c30: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 46     (SYSCALL)GetF
4c40: 69 6c 65 41 74 74 72 69 62 75 74 65 73 41 2c 20  ileAttributesA, 
4c50: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
4c60: 20 20 7b 20 22 47 65 74 46 69 6c 65 41 74 74 72    { "GetFileAttr
4c70: 69 62 75 74 65 73 41 22 2c 20 20 20 20 20 20 28  ibutesA",      (
4c80: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
4c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ca0: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
4cb0: 65 66 69 6e 65 20 6f 73 47 65 74 46 69 6c 65 41  efine osGetFileA
4cc0: 74 74 72 69 62 75 74 65 73 41 20 28 28 44 57 4f  ttributesA ((DWO
4cd0: 52 44 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 53  RD(WINAPI*)(LPCS
4ce0: 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 32 30 5d  TR))aSyscall[20]
4cf0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
4d00: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
4d10: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
4d20: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
4d30: 45 29 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 41  E).  { "GetFileA
4d40: 74 74 72 69 62 75 74 65 73 57 22 2c 20 20 20 20  ttributesW",    
4d50: 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 46 69    (SYSCALL)GetFi
4d60: 6c 65 41 74 74 72 69 62 75 74 65 73 57 2c 20 20  leAttributesW,  
4d70: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
4d80: 20 7b 20 22 47 65 74 46 69 6c 65 41 74 74 72 69   { "GetFileAttri
4d90: 62 75 74 65 73 57 22 2c 20 20 20 20 20 20 28 53  butesW",      (S
4da0: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
4db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4dc0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
4dd0: 66 69 6e 65 20 6f 73 47 65 74 46 69 6c 65 41 74  fine osGetFileAt
4de0: 74 72 69 62 75 74 65 73 57 20 28 28 44 57 4f 52  tributesW ((DWOR
4df0: 44 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53  D(WINAPI*)(LPCWS
4e00: 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 32 31 5d  TR))aSyscall[21]
4e10: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
4e20: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
4e30: 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20  IN32_HAS_WIDE). 
4e40: 20 7b 20 22 47 65 74 46 69 6c 65 41 74 74 72 69   { "GetFileAttri
4e50: 62 75 74 65 73 45 78 57 22 2c 20 20 20 20 28 53  butesExW",    (S
4e60: 59 53 43 41 4c 4c 29 47 65 74 46 69 6c 65 41 74  YSCALL)GetFileAt
4e70: 74 72 69 62 75 74 65 73 45 78 57 2c 20 20 20 20  tributesExW,    
4e80: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
4e90: 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
4ea0: 73 45 78 57 22 2c 20 20 20 20 28 53 59 53 43 41  sExW",    (SYSCA
4eb0: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
4ec0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
4ed0: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
4ee0: 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62   osGetFileAttrib
4ef0: 75 74 65 73 45 78 57 20 28 28 42 4f 4f 4c 28 57  utesExW ((BOOL(W
4f00: 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52 2c  INAPI*)(LPCWSTR,
4f10: 47 45 54 5f 46 49 4c 45 45 58 5f 49 4e 46 4f 5f  GET_FILEEX_INFO_
4f20: 4c 45 56 45 4c 53 2c 20 5c 0a 20 20 20 20 20 20  LEVELS, \.      
4f30: 20 20 4c 50 56 4f 49 44 29 29 61 53 79 73 63 61    LPVOID))aSysca
4f40: 6c 6c 5b 32 32 5d 2e 70 43 75 72 72 65 6e 74 29  ll[22].pCurrent)
4f50: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
4f60: 5f 57 49 4e 52 54 0a 20 20 7b 20 22 47 65 74 46  _WINRT.  { "GetF
4f70: 69 6c 65 53 69 7a 65 22 2c 20 20 20 20 20 20 20  ileSize",       
4f80: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47        (SYSCALL)G
4f90: 65 74 46 69 6c 65 53 69 7a 65 2c 20 20 20 20 20  etFileSize,     
4fa0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
4fb0: 73 65 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 53  se.  { "GetFileS
4fc0: 69 7a 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ize",           
4fd0: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
4fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ff0: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
5000: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 46 69  .#define osGetFi
5010: 6c 65 53 69 7a 65 20 28 28 44 57 4f 52 44 28 57  leSize ((DWORD(W
5020: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c  INAPI*)(HANDLE,L
5030: 50 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c  PDWORD))aSyscall
5040: 5b 32 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [23].pCurrent)..
5050: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
5060: 49 4e 43 45 20 26 26 20 64 65 66 69 6e 65 64 28  INCE && defined(
5070: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
5080: 5f 41 4e 53 49 29 0a 20 20 7b 20 22 47 65 74 46  _ANSI).  { "GetF
5090: 75 6c 6c 50 61 74 68 4e 61 6d 65 41 22 2c 20 20  ullPathNameA",  
50a0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47        (SYSCALL)G
50b0: 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41 2c  etFullPathNameA,
50c0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
50d0: 73 65 0a 20 20 7b 20 22 47 65 74 46 75 6c 6c 50  se.  { "GetFullP
50e0: 61 74 68 4e 61 6d 65 41 22 2c 20 20 20 20 20 20  athNameA",      
50f0: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
5100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5110: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
5120: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 46 75  .#define osGetFu
5130: 6c 6c 50 61 74 68 4e 61 6d 65 41 20 28 28 44 57  llPathNameA ((DW
5140: 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 4c 50 43  ORD(WINAPI*)(LPC
5150: 53 54 52 2c 44 57 4f 52 44 2c 4c 50 53 54 52 2c  STR,DWORD,LPSTR,
5160: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 53 54 52   \.        LPSTR
5170: 2a 29 29 61 53 79 73 63 61 6c 6c 5b 32 34 5d 2e  *))aSyscall[24].
5180: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
5190: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
51a0: 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  && !SQLITE_OS_WI
51b0: 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53  NRT && defined(S
51c0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
51d0: 57 49 44 45 29 0a 20 20 7b 20 22 47 65 74 46 75  WIDE).  { "GetFu
51e0: 6c 6c 50 61 74 68 4e 61 6d 65 57 22 2c 20 20 20  llPathNameW",   
51f0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65       (SYSCALL)Ge
5200: 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57 2c 20  tFullPathNameW, 
5210: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
5220: 65 0a 20 20 7b 20 22 47 65 74 46 75 6c 6c 50 61  e.  { "GetFullPa
5230: 74 68 4e 61 6d 65 57 22 2c 20 20 20 20 20 20 20  thNameW",       
5240: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
5250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5260: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
5270: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 46 75 6c  #define osGetFul
5280: 6c 50 61 74 68 4e 61 6d 65 57 20 28 28 44 57 4f  lPathNameW ((DWO
5290: 52 44 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57  RD(WINAPI*)(LPCW
52a0: 53 54 52 2c 44 57 4f 52 44 2c 4c 50 57 53 54 52  STR,DWORD,LPWSTR
52b0: 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 57 53  , \.        LPWS
52c0: 54 52 2a 29 29 61 53 79 73 63 61 6c 6c 5b 32 35  TR*))aSyscall[25
52d0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
52e0: 20 22 47 65 74 4c 61 73 74 45 72 72 6f 72 22 2c   "GetLastError",
52f0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
5300: 43 41 4c 4c 29 47 65 74 4c 61 73 74 45 72 72 6f  CALL)GetLastErro
5310: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 30 20  r,            0 
5320: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65  },..#define osGe
5330: 74 4c 61 73 74 45 72 72 6f 72 20 28 28 44 57 4f  tLastError ((DWO
5340: 52 44 28 57 49 4e 41 50 49 2a 29 28 56 4f 49 44  RD(WINAPI*)(VOID
5350: 29 29 61 53 79 73 63 61 6c 6c 5b 32 36 5d 2e 70  ))aSyscall[26].p
5360: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 64  Current)..#if !d
5370: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
5380: 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f  IT_LOAD_EXTENSIO
5390: 4e 29 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  N).#if SQLITE_OS
53a0: 5f 57 49 4e 43 45 0a 20 20 2f 2a 20 54 68 65 20  _WINCE.  /* The 
53b0: 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 41 28  GetProcAddressA(
53c0: 29 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c  ) routine is onl
53d0: 79 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 57  y available on W
53e0: 69 6e 64 6f 77 73 20 43 45 2e 20 2a 2f 0a 20 20  indows CE. */.  
53f0: 7b 20 22 47 65 74 50 72 6f 63 41 64 64 72 65 73  { "GetProcAddres
5400: 73 41 22 2c 20 20 20 20 20 20 20 20 20 28 53 59  sA",         (SY
5410: 53 43 41 4c 4c 29 47 65 74 50 72 6f 63 41 64 64  SCALL)GetProcAdd
5420: 72 65 73 73 41 2c 20 20 20 20 20 20 20 20 20 30  ressA,         0
5430: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 41   },.#else.  /* A
5440: 6c 6c 20 6f 74 68 65 72 20 57 69 6e 64 6f 77 73  ll other Windows
5450: 20 70 6c 61 74 66 6f 72 6d 73 20 65 78 70 65 63   platforms expec
5460: 74 20 47 65 74 50 72 6f 63 41 64 64 72 65 73 73  t GetProcAddress
5470: 28 29 20 74 6f 20 74 61 6b 65 0a 20 20 2a 2a 20  () to take.  ** 
5480: 61 6e 20 41 4e 53 49 20 73 74 72 69 6e 67 20 72  an ANSI string r
5490: 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65  egardless of the
54a0: 20 5f 55 4e 49 43 4f 44 45 20 73 65 74 74 69 6e   _UNICODE settin
54b0: 67 20 2a 2f 0a 20 20 7b 20 22 47 65 74 50 72 6f  g */.  { "GetPro
54c0: 63 41 64 64 72 65 73 73 41 22 2c 20 20 20 20 20  cAddressA",     
54d0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74      (SYSCALL)Get
54e0: 50 72 6f 63 41 64 64 72 65 73 73 2c 20 20 20 20  ProcAddress,    
54f0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
5500: 66 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74  f.#else.  { "Get
5510: 50 72 6f 63 41 64 64 72 65 73 73 41 22 2c 20 20  ProcAddressA",  
5520: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
5530: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
5540: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
5550: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
5560: 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 41 20  GetProcAddressA 
5570: 28 28 46 41 52 50 52 4f 43 28 57 49 4e 41 50 49  ((FARPROC(WINAPI
5580: 2a 29 28 48 4d 4f 44 55 4c 45 2c 20 5c 0a 20 20  *)(HMODULE, \.  
5590: 20 20 20 20 20 20 4c 50 43 53 54 52 29 29 61 53        LPCSTR))aS
55a0: 79 73 63 61 6c 6c 5b 32 37 5d 2e 70 43 75 72 72  yscall[27].pCurr
55b0: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
55c0: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22  E_OS_WINRT.  { "
55d0: 47 65 74 53 79 73 74 65 6d 49 6e 66 6f 22 2c 20  GetSystemInfo", 
55e0: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
55f0: 4c 4c 29 47 65 74 53 79 73 74 65 6d 49 6e 66 6f  LL)GetSystemInfo
5600: 2c 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c  ,           0 },
5610: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 53  .#else.  { "GetS
5620: 79 73 74 65 6d 49 6e 66 6f 22 2c 20 20 20 20 20  ystemInfo",     
5630: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
5640: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
5650: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
5660: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47  dif..#define osG
5670: 65 74 53 79 73 74 65 6d 49 6e 66 6f 20 28 28 56  etSystemInfo ((V
5680: 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 4c 50 53  OID(WINAPI*)(LPS
5690: 59 53 54 45 4d 5f 49 4e 46 4f 29 29 61 53 79 73  YSTEM_INFO))aSys
56a0: 63 61 6c 6c 5b 32 38 5d 2e 70 43 75 72 72 65 6e  call[28].pCurren
56b0: 74 29 0a 0a 20 20 7b 20 22 47 65 74 53 79 73 74  t)..  { "GetSyst
56c0: 65 6d 54 69 6d 65 22 2c 20 20 20 20 20 20 20 20  emTime",        
56d0: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 53     (SYSCALL)GetS
56e0: 79 73 74 65 6d 54 69 6d 65 2c 20 20 20 20 20 20  ystemTime,      
56f0: 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69       0 },..#defi
5700: 6e 65 20 6f 73 47 65 74 53 79 73 74 65 6d 54 69  ne osGetSystemTi
5710: 6d 65 20 28 28 56 4f 49 44 28 57 49 4e 41 50 49  me ((VOID(WINAPI
5720: 2a 29 28 4c 50 53 59 53 54 45 4d 54 49 4d 45 29  *)(LPSYSTEMTIME)
5730: 29 61 53 79 73 63 61 6c 6c 5b 32 39 5d 2e 70 43  )aSyscall[29].pC
5740: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
5750: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
5760: 7b 20 22 47 65 74 53 79 73 74 65 6d 54 69 6d 65  { "GetSystemTime
5770: 41 73 46 69 6c 65 54 69 6d 65 22 2c 20 28 53 59  AsFileTime", (SY
5780: 53 43 41 4c 4c 29 47 65 74 53 79 73 74 65 6d 54  SCALL)GetSystemT
5790: 69 6d 65 41 73 46 69 6c 65 54 69 6d 65 2c 20 30  imeAsFileTime, 0
57a0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47   },.#else.  { "G
57b0: 65 74 53 79 73 74 65 6d 54 69 6d 65 41 73 46 69  etSystemTimeAsFi
57c0: 6c 65 54 69 6d 65 22 2c 20 28 53 59 53 43 41 4c  leTime", (SYSCAL
57d0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
57e0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
57f0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
5800: 6f 73 47 65 74 53 79 73 74 65 6d 54 69 6d 65 41  osGetSystemTimeA
5810: 73 46 69 6c 65 54 69 6d 65 20 28 28 56 4f 49 44  sFileTime ((VOID
5820: 28 57 49 4e 41 50 49 2a 29 28 20 5c 0a 20 20 20  (WINAPI*)( \.   
5830: 20 20 20 20 20 4c 50 46 49 4c 45 54 49 4d 45 29       LPFILETIME)
5840: 29 61 53 79 73 63 61 6c 6c 5b 33 30 5d 2e 70 43  )aSyscall[30].pC
5850: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66  urrent)..#if def
5860: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
5870: 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20  2_HAS_ANSI).  { 
5880: 22 47 65 74 54 65 6d 70 50 61 74 68 41 22 2c 20  "GetTempPathA", 
5890: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
58a0: 41 4c 4c 29 47 65 74 54 65 6d 70 50 61 74 68 41  ALL)GetTempPathA
58b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d  ,            0 }
58c0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74  ,.#else.  { "Get
58d0: 54 65 6d 70 50 61 74 68 41 22 2c 20 20 20 20 20  TempPathA",     
58e0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
58f0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
5900: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
5910: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
5920: 47 65 74 54 65 6d 70 50 61 74 68 41 20 28 28 44  GetTempPathA ((D
5930: 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 44 57  WORD(WINAPI*)(DW
5940: 4f 52 44 2c 4c 50 53 54 52 29 29 61 53 79 73 63  ORD,LPSTR))aSysc
5950: 61 6c 6c 5b 33 31 5d 2e 70 43 75 72 72 65 6e 74  all[31].pCurrent
5960: 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  )..#if !SQLITE_O
5970: 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e  S_WINRT && defin
5980: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
5990: 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 47  HAS_WIDE).  { "G
59a0: 65 74 54 65 6d 70 50 61 74 68 57 22 2c 20 20 20  etTempPathW",   
59b0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
59c0: 4c 29 47 65 74 54 65 6d 70 50 61 74 68 57 2c 20  L)GetTempPathW, 
59d0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
59e0: 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 54 65  #else.  { "GetTe
59f0: 6d 70 50 61 74 68 57 22 2c 20 20 20 20 20 20 20  mpPathW",       
5a00: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
5a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a20: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
5a30: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65  if..#define osGe
5a40: 74 54 65 6d 70 50 61 74 68 57 20 28 28 44 57 4f  tTempPathW ((DWO
5a50: 52 44 28 57 49 4e 41 50 49 2a 29 28 44 57 4f 52  RD(WINAPI*)(DWOR
5a60: 44 2c 4c 50 57 53 54 52 29 29 61 53 79 73 63 61  D,LPWSTR))aSysca
5a70: 6c 6c 5b 33 32 5d 2e 70 43 75 72 72 65 6e 74 29  ll[32].pCurrent)
5a80: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
5a90: 5f 57 49 4e 52 54 0a 20 20 7b 20 22 47 65 74 54  _WINRT.  { "GetT
5aa0: 69 63 6b 43 6f 75 6e 74 22 2c 20 20 20 20 20 20  ickCount",      
5ab0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47        (SYSCALL)G
5ac0: 65 74 54 69 63 6b 43 6f 75 6e 74 2c 20 20 20 20  etTickCount,    
5ad0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
5ae0: 73 65 0a 20 20 7b 20 22 47 65 74 54 69 63 6b 43  se.  { "GetTickC
5af0: 6f 75 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20  ount",          
5b00: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
5b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b20: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
5b30: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 54 69  .#define osGetTi
5b40: 63 6b 43 6f 75 6e 74 20 28 28 44 57 4f 52 44 28  ckCount ((DWORD(
5b50: 57 49 4e 41 50 49 2a 29 28 56 4f 49 44 29 29 61  WINAPI*)(VOID))a
5b60: 53 79 73 63 61 6c 6c 5b 33 33 5d 2e 70 43 75 72  Syscall[33].pCur
5b70: 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e  rent)..#if defin
5b80: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
5b90: 48 41 53 5f 41 4e 53 49 29 20 26 26 20 64 65 66  HAS_ANSI) && def
5ba0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
5bb0: 32 5f 47 45 54 56 45 52 53 49 4f 4e 45 58 29 20  2_GETVERSIONEX) 
5bc0: 26 26 20 5c 0a 20 20 20 20 20 20 20 20 53 51 4c  && \.        SQL
5bd0: 49 54 45 5f 57 49 4e 33 32 5f 47 45 54 56 45 52  ITE_WIN32_GETVER
5be0: 53 49 4f 4e 45 58 0a 20 20 7b 20 22 47 65 74 56  SIONEX.  { "GetV
5bf0: 65 72 73 69 6f 6e 45 78 41 22 2c 20 20 20 20 20  ersionExA",     
5c00: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47        (SYSCALL)G
5c10: 65 74 56 65 72 73 69 6f 6e 45 78 41 2c 20 20 20  etVersionExA,   
5c20: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
5c30: 73 65 0a 20 20 7b 20 22 47 65 74 56 65 72 73 69  se.  { "GetVersi
5c40: 6f 6e 45 78 41 22 2c 20 20 20 20 20 20 20 20 20  onExA",         
5c50: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
5c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c70: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
5c80: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 56 65  .#define osGetVe
5c90: 72 73 69 6f 6e 45 78 41 20 28 28 42 4f 4f 4c 28  rsionExA ((BOOL(
5ca0: 57 49 4e 41 50 49 2a 29 28 20 5c 0a 20 20 20 20  WINAPI*)( \.    
5cb0: 20 20 20 20 4c 50 4f 53 56 45 52 53 49 4f 4e 49      LPOSVERSIONI
5cc0: 4e 46 4f 41 29 29 61 53 79 73 63 61 6c 6c 5b 33  NFOA))aSyscall[3
5cd0: 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  4].pCurrent)..#i
5ce0: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
5cf0: 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  RT && defined(SQ
5d00: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57  LITE_WIN32_HAS_W
5d10: 49 44 45 29 20 26 26 20 5c 0a 20 20 20 20 20 20  IDE) && \.      
5d20: 20 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45    defined(SQLITE
5d30: 5f 57 49 4e 33 32 5f 47 45 54 56 45 52 53 49 4f  _WIN32_GETVERSIO
5d40: 4e 45 58 29 20 26 26 20 53 51 4c 49 54 45 5f 57  NEX) && SQLITE_W
5d50: 49 4e 33 32 5f 47 45 54 56 45 52 53 49 4f 4e 45  IN32_GETVERSIONE
5d60: 58 0a 20 20 7b 20 22 47 65 74 56 65 72 73 69 6f  X.  { "GetVersio
5d70: 6e 45 78 57 22 2c 20 20 20 20 20 20 20 20 20 20  nExW",          
5d80: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 56 65 72   (SYSCALL)GetVer
5d90: 73 69 6f 6e 45 78 57 2c 20 20 20 20 20 20 20 20  sionExW,        
5da0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
5db0: 7b 20 22 47 65 74 56 65 72 73 69 6f 6e 45 78 57  { "GetVersionExW
5dc0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ",           (SY
5dd0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
5de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
5df0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
5e00: 69 6e 65 20 6f 73 47 65 74 56 65 72 73 69 6f 6e  ine osGetVersion
5e10: 45 78 57 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  ExW ((BOOL(WINAP
5e20: 49 2a 29 28 20 5c 0a 20 20 20 20 20 20 20 20 4c  I*)( \.        L
5e30: 50 4f 53 56 45 52 53 49 4f 4e 49 4e 46 4f 57 29  POSVERSIONINFOW)
5e40: 29 61 53 79 73 63 61 6c 6c 5b 33 35 5d 2e 70 43  )aSyscall[35].pC
5e50: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 48 65  urrent)..  { "He
5e60: 61 70 41 6c 6c 6f 63 22 2c 20 20 20 20 20 20 20  apAlloc",       
5e70: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
5e80: 29 48 65 61 70 41 6c 6c 6f 63 2c 20 20 20 20 20  )HeapAlloc,     
5e90: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a            0 },..
5ea0: 23 64 65 66 69 6e 65 20 6f 73 48 65 61 70 41 6c  #define osHeapAl
5eb0: 6c 6f 63 20 28 28 4c 50 56 4f 49 44 28 57 49 4e  loc ((LPVOID(WIN
5ec0: 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f  API*)(HANDLE,DWO
5ed0: 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 53 49  RD, \.        SI
5ee0: 5a 45 5f 54 29 29 61 53 79 73 63 61 6c 6c 5b 33  ZE_T))aSyscall[3
5ef0: 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  6].pCurrent)..#i
5f00: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
5f10: 52 54 0a 20 20 7b 20 22 48 65 61 70 43 72 65 61  RT.  { "HeapCrea
5f20: 74 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  te",            
5f30: 20 20 28 53 59 53 43 41 4c 4c 29 48 65 61 70 43    (SYSCALL)HeapC
5f40: 72 65 61 74 65 2c 20 20 20 20 20 20 20 20 20 20  reate,          
5f50: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
5f60: 20 7b 20 22 48 65 61 70 43 72 65 61 74 65 22 2c   { "HeapCreate",
5f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
5f80: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
5f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5fa0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
5fb0: 66 69 6e 65 20 6f 73 48 65 61 70 43 72 65 61 74  fine osHeapCreat
5fc0: 65 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50  e ((HANDLE(WINAP
5fd0: 49 2a 29 28 44 57 4f 52 44 2c 53 49 5a 45 5f 54  I*)(DWORD,SIZE_T
5fe0: 2c 20 5c 0a 20 20 20 20 20 20 20 20 53 49 5a 45  , \.        SIZE
5ff0: 5f 54 29 29 61 53 79 73 63 61 6c 6c 5b 33 37 5d  _T))aSyscall[37]
6000: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
6010: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
6020: 0a 20 20 7b 20 22 48 65 61 70 44 65 73 74 72 6f  .  { "HeapDestro
6030: 79 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  y",             
6040: 28 53 59 53 43 41 4c 4c 29 48 65 61 70 44 65 73  (SYSCALL)HeapDes
6050: 74 72 6f 79 2c 20 20 20 20 20 20 20 20 20 20 20  troy,           
6060: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
6070: 20 22 48 65 61 70 44 65 73 74 72 6f 79 22 2c 20   "HeapDestroy", 
6080: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
6090: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
60a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
60b0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
60c0: 6e 65 20 6f 73 48 65 61 70 44 65 73 74 72 6f 79  ne osHeapDestroy
60d0: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
60e0: 28 48 41 4e 44 4c 45 29 29 61 53 79 73 63 61 6c  (HANDLE))aSyscal
60f0: 6c 5b 33 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[38].pCurrent).
6100: 0a 20 20 7b 20 22 48 65 61 70 46 72 65 65 22 2c  .  { "HeapFree",
6110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6120: 28 53 59 53 43 41 4c 4c 29 48 65 61 70 46 72 65  (SYSCALL)HeapFre
6130: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
6140: 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20    0 },..#define 
6150: 6f 73 48 65 61 70 46 72 65 65 20 28 28 42 4f 4f  osHeapFree ((BOO
6160: 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  L(WINAPI*)(HANDL
6170: 45 2c 44 57 4f 52 44 2c 4c 50 56 4f 49 44 29 29  E,DWORD,LPVOID))
6180: 61 53 79 73 63 61 6c 6c 5b 33 39 5d 2e 70 43 75  aSyscall[39].pCu
6190: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 48 65 61  rrent)..  { "Hea
61a0: 70 52 65 41 6c 6c 6f 63 22 2c 20 20 20 20 20 20  pReAlloc",      
61b0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
61c0: 48 65 61 70 52 65 41 6c 6c 6f 63 2c 20 20 20 20  HeapReAlloc,    
61d0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23           0 },..#
61e0: 64 65 66 69 6e 65 20 6f 73 48 65 61 70 52 65 41  define osHeapReA
61f0: 6c 6c 6f 63 20 28 28 4c 50 56 4f 49 44 28 57 49  lloc ((LPVOID(WI
6200: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57  NAPI*)(HANDLE,DW
6210: 4f 52 44 2c 4c 50 56 4f 49 44 2c 20 5c 0a 20 20  ORD,LPVOID, \.  
6220: 20 20 20 20 20 20 53 49 5a 45 5f 54 29 29 61 53        SIZE_T))aS
6230: 79 73 63 61 6c 6c 5b 34 30 5d 2e 70 43 75 72 72  yscall[40].pCurr
6240: 65 6e 74 29 0a 0a 20 20 7b 20 22 48 65 61 70 53  ent)..  { "HeapS
6250: 69 7a 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ize",           
6260: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65       (SYSCALL)He
6270: 61 70 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20  apSize,         
6280: 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65         0 },..#de
6290: 66 69 6e 65 20 6f 73 48 65 61 70 53 69 7a 65 20  fine osHeapSize 
62a0: 28 28 53 49 5a 45 5f 54 28 57 49 4e 41 50 49 2a  ((SIZE_T(WINAPI*
62b0: 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 20  )(HANDLE,DWORD, 
62c0: 5c 0a 20 20 20 20 20 20 20 20 4c 50 43 56 4f 49  \.        LPCVOI
62d0: 44 29 29 61 53 79 73 63 61 6c 6c 5b 34 31 5d 2e  D))aSyscall[41].
62e0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
62f0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
6300: 20 20 7b 20 22 48 65 61 70 56 61 6c 69 64 61 74    { "HeapValidat
6310: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28  e",            (
6320: 53 59 53 43 41 4c 4c 29 48 65 61 70 56 61 6c 69  SYSCALL)HeapVali
6330: 64 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  date,           
6340: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
6350: 22 48 65 61 70 56 61 6c 69 64 61 74 65 22 2c 20  "HeapValidate", 
6360: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
6370: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
6380: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
6390: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
63a0: 65 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74 65  e osHeapValidate
63b0: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
63c0: 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 20 5c  (HANDLE,DWORD, \
63d0: 0a 20 20 20 20 20 20 20 20 4c 50 43 56 4f 49 44  .        LPCVOID
63e0: 29 29 61 53 79 73 63 61 6c 6c 5b 34 32 5d 2e 70  ))aSyscall[42].p
63f0: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53  Current)..#if !S
6400: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26  QLITE_OS_WINCE &
6410: 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  & !SQLITE_OS_WIN
6420: 52 54 0a 20 20 7b 20 22 48 65 61 70 43 6f 6d 70  RT.  { "HeapComp
6430: 61 63 74 22 2c 20 20 20 20 20 20 20 20 20 20 20  act",           
6440: 20 20 28 53 59 53 43 41 4c 4c 29 48 65 61 70 43    (SYSCALL)HeapC
6450: 6f 6d 70 61 63 74 2c 20 20 20 20 20 20 20 20 20  ompact,         
6460: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
6470: 20 7b 20 22 48 65 61 70 43 6f 6d 70 61 63 74 22   { "HeapCompact"
6480: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ,             (S
6490: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
64a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
64b0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
64c0: 66 69 6e 65 20 6f 73 48 65 61 70 43 6f 6d 70 61  fine osHeapCompa
64d0: 63 74 20 28 28 55 49 4e 54 28 57 49 4e 41 50 49  ct ((UINT(WINAPI
64e0: 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 29  *)(HANDLE,DWORD)
64f0: 29 61 53 79 73 63 61 6c 6c 5b 34 33 5d 2e 70 43  )aSyscall[43].pC
6500: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66  urrent)..#if def
6510: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
6520: 32 5f 48 41 53 5f 41 4e 53 49 29 20 26 26 20 21  2_HAS_ANSI) && !
6530: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
6540: 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49  MIT_LOAD_EXTENSI
6550: 4f 4e 29 0a 20 20 7b 20 22 4c 6f 61 64 4c 69 62  ON).  { "LoadLib
6560: 72 61 72 79 41 22 2c 20 20 20 20 20 20 20 20 20  raryA",         
6570: 20 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f 61 64     (SYSCALL)Load
6580: 4c 69 62 72 61 72 79 41 2c 20 20 20 20 20 20 20  LibraryA,       
6590: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
65a0: 20 20 7b 20 22 4c 6f 61 64 4c 69 62 72 61 72 79    { "LoadLibrary
65b0: 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28  A",            (
65c0: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
65d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
65e0: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
65f0: 65 66 69 6e 65 20 6f 73 4c 6f 61 64 4c 69 62 72  efine osLoadLibr
6600: 61 72 79 41 20 28 28 48 4d 4f 44 55 4c 45 28 57  aryA ((HMODULE(W
6610: 49 4e 41 50 49 2a 29 28 4c 50 43 53 54 52 29 29  INAPI*)(LPCSTR))
6620: 61 53 79 73 63 61 6c 6c 5b 34 34 5d 2e 70 43 75  aSyscall[44].pCu
6630: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c  rrent)..#if !SQL
6640: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20  ITE_OS_WINRT && 
6650: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
6660: 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 20 26  IN32_HAS_WIDE) &
6670: 26 20 5c 0a 20 20 20 20 20 20 20 20 21 64 65 66  & \.        !def
6680: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
6690: 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 29  _LOAD_EXTENSION)
66a0: 0a 20 20 7b 20 22 4c 6f 61 64 4c 69 62 72 61 72  .  { "LoadLibrar
66b0: 79 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  yW",            
66c0: 28 53 59 53 43 41 4c 4c 29 4c 6f 61 64 4c 69 62  (SYSCALL)LoadLib
66d0: 72 61 72 79 57 2c 20 20 20 20 20 20 20 20 20 20  raryW,          
66e0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
66f0: 20 22 4c 6f 61 64 4c 69 62 72 61 72 79 57 22 2c   "LoadLibraryW",
6700: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
6710: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
6720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
6730: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
6740: 6e 65 20 6f 73 4c 6f 61 64 4c 69 62 72 61 72 79  ne osLoadLibrary
6750: 57 20 28 28 48 4d 4f 44 55 4c 45 28 57 49 4e 41  W ((HMODULE(WINA
6760: 50 49 2a 29 28 4c 50 43 57 53 54 52 29 29 61 53  PI*)(LPCWSTR))aS
6770: 79 73 63 61 6c 6c 5b 34 35 5d 2e 70 43 75 72 72  yscall[45].pCurr
6780: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
6790: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22  E_OS_WINRT.  { "
67a0: 4c 6f 63 61 6c 46 72 65 65 22 2c 20 20 20 20 20  LocalFree",     
67b0: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
67c0: 4c 4c 29 4c 6f 63 61 6c 46 72 65 65 2c 20 20 20  LL)LocalFree,   
67d0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
67e0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 63 61  .#else.  { "Loca
67f0: 6c 46 72 65 65 22 2c 20 20 20 20 20 20 20 20 20  lFree",         
6800: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
6810: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
6820: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
6830: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4c  dif..#define osL
6840: 6f 63 61 6c 46 72 65 65 20 28 28 48 4c 4f 43 41  ocalFree ((HLOCA
6850: 4c 28 57 49 4e 41 50 49 2a 29 28 48 4c 4f 43 41  L(WINAPI*)(HLOCA
6860: 4c 29 29 61 53 79 73 63 61 6c 6c 5b 34 36 5d 2e  L))aSyscall[46].
6870: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
6880: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
6890: 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  && !SQLITE_OS_WI
68a0: 4e 52 54 0a 20 20 7b 20 22 4c 6f 63 6b 46 69 6c  NRT.  { "LockFil
68b0: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
68c0: 20 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f 63 6b     (SYSCALL)Lock
68d0: 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  File,           
68e0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
68f0: 20 20 7b 20 22 4c 6f 63 6b 46 69 6c 65 22 2c 20    { "LockFile", 
6900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
6910: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
6920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6930: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 69   0 },.#endif..#i
6940: 66 6e 64 65 66 20 6f 73 4c 6f 63 6b 46 69 6c 65  fndef osLockFile
6950: 0a 23 64 65 66 69 6e 65 20 6f 73 4c 6f 63 6b 46  .#define osLockF
6960: 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  ile ((BOOL(WINAP
6970: 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44  I*)(HANDLE,DWORD
6980: 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a  ,DWORD,DWORD, \.
6990: 20 20 20 20 20 20 20 20 44 57 4f 52 44 29 29 61          DWORD))a
69a0: 53 79 73 63 61 6c 6c 5b 34 37 5d 2e 70 43 75 72  Syscall[47].pCur
69b0: 72 65 6e 74 29 0a 23 65 6e 64 69 66 0a 0a 23 69  rent).#endif..#i
69c0: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
69d0: 43 45 0a 20 20 7b 20 22 4c 6f 63 6b 46 69 6c 65  CE.  { "LockFile
69e0: 45 78 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  Ex",            
69f0: 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f 63 6b 46    (SYSCALL)LockF
6a00: 69 6c 65 45 78 2c 20 20 20 20 20 20 20 20 20 20  ileEx,          
6a10: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
6a20: 20 7b 20 22 4c 6f 63 6b 46 69 6c 65 45 78 22 2c   { "LockFileEx",
6a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
6a40: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
6a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a60: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 69 66  0 },.#endif..#if
6a70: 6e 64 65 66 20 6f 73 4c 6f 63 6b 46 69 6c 65 45  ndef osLockFileE
6a80: 78 0a 23 64 65 66 69 6e 65 20 6f 73 4c 6f 63 6b  x.#define osLock
6a90: 46 69 6c 65 45 78 20 28 28 42 4f 4f 4c 28 57 49  FileEx ((BOOL(WI
6aa0: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57  NAPI*)(HANDLE,DW
6ab0: 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c  ORD,DWORD,DWORD,
6ac0: 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20  DWORD, \.       
6ad0: 20 4c 50 4f 56 45 52 4c 41 50 50 45 44 29 29 61   LPOVERLAPPED))a
6ae0: 53 79 73 63 61 6c 6c 5b 34 38 5d 2e 70 43 75 72  Syscall[48].pCur
6af0: 72 65 6e 74 29 0a 23 65 6e 64 69 66 0a 0a 23 69  rent).#endif..#i
6b00: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
6b10: 45 20 7c 7c 20 28 21 53 51 4c 49 54 45 5f 4f 53  E || (!SQLITE_OS
6b20: 5f 57 49 4e 52 54 20 26 26 20 21 64 65 66 69 6e  _WINRT && !defin
6b30: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ed(SQLITE_OMIT_W
6b40: 41 4c 29 29 0a 20 20 7b 20 22 4d 61 70 56 69 65  AL)).  { "MapVie
6b50: 77 4f 66 46 69 6c 65 22 2c 20 20 20 20 20 20 20  wOfFile",       
6b60: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4d 61 70      (SYSCALL)Map
6b70: 56 69 65 77 4f 66 46 69 6c 65 2c 20 20 20 20 20  ViewOfFile,     
6b80: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
6b90: 0a 20 20 7b 20 22 4d 61 70 56 69 65 77 4f 66 46  .  { "MapViewOfF
6ba0: 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ile",           
6bb0: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
6bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6bd0: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
6be0: 64 65 66 69 6e 65 20 6f 73 4d 61 70 56 69 65 77  define osMapView
6bf0: 4f 66 46 69 6c 65 20 28 28 4c 50 56 4f 49 44 28  OfFile ((LPVOID(
6c00: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c  WINAPI*)(HANDLE,
6c10: 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52  DWORD,DWORD,DWOR
6c20: 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 53 49 5a  D, \.        SIZ
6c30: 45 5f 54 29 29 61 53 79 73 63 61 6c 6c 5b 34 39  E_T))aSyscall[49
6c40: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
6c50: 20 22 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64   "MultiByteToWid
6c60: 65 43 68 61 72 22 2c 20 20 20 20 20 28 53 59 53  eChar",     (SYS
6c70: 43 41 4c 4c 29 4d 75 6c 74 69 42 79 74 65 54 6f  CALL)MultiByteTo
6c80: 57 69 64 65 43 68 61 72 2c 20 20 20 20 20 30 20  WideChar,     0 
6c90: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4d 75  },..#define osMu
6ca0: 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43 68 61  ltiByteToWideCha
6cb0: 72 20 28 28 69 6e 74 28 57 49 4e 41 50 49 2a 29  r ((int(WINAPI*)
6cc0: 28 55 49 4e 54 2c 44 57 4f 52 44 2c 4c 50 43 53  (UINT,DWORD,LPCS
6cd0: 54 52 2c 69 6e 74 2c 4c 50 57 53 54 52 2c 20 5c  TR,int,LPWSTR, \
6ce0: 0a 20 20 20 20 20 20 20 20 69 6e 74 29 29 61 53  .        int))aS
6cf0: 79 73 63 61 6c 6c 5b 35 30 5d 2e 70 43 75 72 72  yscall[50].pCurr
6d00: 65 6e 74 29 0a 0a 20 20 7b 20 22 51 75 65 72 79  ent)..  { "Query
6d10: 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f 75 6e 74  PerformanceCount
6d20: 65 72 22 2c 20 28 53 59 53 43 41 4c 4c 29 51 75  er", (SYSCALL)Qu
6d30: 65 72 79 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f  eryPerformanceCo
6d40: 75 6e 74 65 72 2c 20 30 20 7d 2c 0a 0a 23 64 65  unter, 0 },..#de
6d50: 66 69 6e 65 20 6f 73 51 75 65 72 79 50 65 72 66  fine osQueryPerf
6d60: 6f 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72 20 28  ormanceCounter (
6d70: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 20  (BOOL(WINAPI*)( 
6d80: 5c 0a 20 20 20 20 20 20 20 20 4c 41 52 47 45 5f  \.        LARGE_
6d90: 49 4e 54 45 47 45 52 2a 29 29 61 53 79 73 63 61  INTEGER*))aSysca
6da0: 6c 6c 5b 35 31 5d 2e 70 43 75 72 72 65 6e 74 29  ll[51].pCurrent)
6db0: 0a 0a 20 20 7b 20 22 52 65 61 64 46 69 6c 65 22  ..  { "ReadFile"
6dc0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
6dd0: 20 28 53 59 53 43 41 4c 4c 29 52 65 61 64 46 69   (SYSCALL)ReadFi
6de0: 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
6df0: 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65     0 },..#define
6e00: 20 6f 73 52 65 61 64 46 69 6c 65 20 28 28 42 4f   osReadFile ((BO
6e10: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44  OL(WINAPI*)(HAND
6e20: 4c 45 2c 4c 50 56 4f 49 44 2c 44 57 4f 52 44 2c  LE,LPVOID,DWORD,
6e30: 4c 50 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20  LPDWORD, \.     
6e40: 20 20 20 4c 50 4f 56 45 52 4c 41 50 50 45 44 29     LPOVERLAPPED)
6e50: 29 61 53 79 73 63 61 6c 6c 5b 35 32 5d 2e 70 43  )aSyscall[52].pC
6e60: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 53 65  urrent)..  { "Se
6e70: 74 45 6e 64 4f 66 46 69 6c 65 22 2c 20 20 20 20  tEndOfFile",    
6e80: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
6e90: 29 53 65 74 45 6e 64 4f 66 46 69 6c 65 2c 20 20  )SetEndOfFile,  
6ea0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a            0 },..
6eb0: 23 64 65 66 69 6e 65 20 6f 73 53 65 74 45 6e 64  #define osSetEnd
6ec0: 4f 66 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49  OfFile ((BOOL(WI
6ed0: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 29 29 61  NAPI*)(HANDLE))a
6ee0: 53 79 73 63 61 6c 6c 5b 35 33 5d 2e 70 43 75 72  Syscall[53].pCur
6ef0: 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49  rent)..#if !SQLI
6f00: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20  TE_OS_WINRT.  { 
6f10: 22 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 22  "SetFilePointer"
6f20: 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43  ,          (SYSC
6f30: 41 4c 4c 29 53 65 74 46 69 6c 65 50 6f 69 6e 74  ALL)SetFilePoint
6f40: 65 72 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d  er,          0 }
6f50: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 53 65 74  ,.#else.  { "Set
6f60: 46 69 6c 65 50 6f 69 6e 74 65 72 22 2c 20 20 20  FilePointer",   
6f70: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
6f80: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
6f90: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
6fa0: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
6fb0: 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 20 28  SetFilePointer (
6fc0: 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28  (DWORD(WINAPI*)(
6fd0: 48 41 4e 44 4c 45 2c 4c 4f 4e 47 2c 50 4c 4f 4e  HANDLE,LONG,PLON
6fe0: 47 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f  G, \.        DWO
6ff0: 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 35 34 5d  RD))aSyscall[54]
7000: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
7010: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
7020: 0a 20 20 7b 20 22 53 6c 65 65 70 22 2c 20 20 20  .  { "Sleep",   
7030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7040: 28 53 59 53 43 41 4c 4c 29 53 6c 65 65 70 2c 20  (SYSCALL)Sleep, 
7050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7060: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
7070: 20 22 53 6c 65 65 70 22 2c 20 20 20 20 20 20 20   "Sleep",       
7080: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
7090: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
70a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
70b0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
70c0: 6e 65 20 6f 73 53 6c 65 65 70 20 28 28 56 4f 49  ne osSleep ((VOI
70d0: 44 28 57 49 4e 41 50 49 2a 29 28 44 57 4f 52 44  D(WINAPI*)(DWORD
70e0: 29 29 61 53 79 73 63 61 6c 6c 5b 35 35 5d 2e 70  ))aSyscall[55].p
70f0: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 53  Current)..  { "S
7100: 79 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54  ystemTimeToFileT
7110: 69 6d 65 22 2c 20 20 20 20 28 53 59 53 43 41 4c  ime",    (SYSCAL
7120: 4c 29 53 79 73 74 65 6d 54 69 6d 65 54 6f 46 69  L)SystemTimeToFi
7130: 6c 65 54 69 6d 65 2c 20 20 20 20 30 20 7d 2c 0a  leTime,    0 },.
7140: 0a 23 64 65 66 69 6e 65 20 6f 73 53 79 73 74 65  .#define osSyste
7150: 6d 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65 20  mTimeToFileTime 
7160: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
7170: 43 4f 4e 53 54 20 53 59 53 54 45 4d 54 49 4d 45  CONST SYSTEMTIME
7180: 2a 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 46  *, \.        LPF
7190: 49 4c 45 54 49 4d 45 29 29 61 53 79 73 63 61 6c  ILETIME))aSyscal
71a0: 6c 5b 35 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[56].pCurrent).
71b0: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
71c0: 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45  WINCE && !SQLITE
71d0: 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 55  _OS_WINRT.  { "U
71e0: 6e 6c 6f 63 6b 46 69 6c 65 22 2c 20 20 20 20 20  nlockFile",     
71f0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
7200: 4c 29 55 6e 6c 6f 63 6b 46 69 6c 65 2c 20 20 20  L)UnlockFile,   
7210: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
7220: 23 65 6c 73 65 0a 20 20 7b 20 22 55 6e 6c 6f 63  #else.  { "Unloc
7230: 6b 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20  kFile",         
7240: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
7250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7260: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
7270: 69 66 0a 0a 23 69 66 6e 64 65 66 20 6f 73 55 6e  if..#ifndef osUn
7280: 6c 6f 63 6b 46 69 6c 65 0a 23 64 65 66 69 6e 65  lockFile.#define
7290: 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 20 28 28   osUnlockFile ((
72a0: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41  BOOL(WINAPI*)(HA
72b0: 4e 44 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44  NDLE,DWORD,DWORD
72c0: 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20  ,DWORD, \.      
72d0: 20 20 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c    DWORD))aSyscal
72e0: 6c 5b 35 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[57].pCurrent).
72f0: 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 53 51 4c  #endif..#if !SQL
7300: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 7b  ITE_OS_WINCE.  {
7310: 20 22 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 22 2c   "UnlockFileEx",
7320: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
7330: 43 41 4c 4c 29 55 6e 6c 6f 63 6b 46 69 6c 65 45  CALL)UnlockFileE
7340: 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 30 20  x,            0 
7350: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 55 6e  },.#else.  { "Un
7360: 6c 6f 63 6b 46 69 6c 65 45 78 22 2c 20 20 20 20  lockFileEx",    
7370: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
7380: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
7390: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
73a0: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
73b0: 73 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 20 28 28  sUnlockFileEx ((
73c0: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41  BOOL(WINAPI*)(HA
73d0: 4e 44 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44  NDLE,DWORD,DWORD
73e0: 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20  ,DWORD, \.      
73f0: 20 20 4c 50 4f 56 45 52 4c 41 50 50 45 44 29 29    LPOVERLAPPED))
7400: 61 53 79 73 63 61 6c 6c 5b 35 38 5d 2e 70 43 75  aSyscall[58].pCu
7410: 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49  rrent)..#if SQLI
7420: 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 21  TE_OS_WINCE || !
7430: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
7440: 4d 49 54 5f 57 41 4c 29 0a 20 20 7b 20 22 55 6e  MIT_WAL).  { "Un
7450: 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 22 2c 20  mapViewOfFile", 
7460: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
7470: 29 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65  )UnmapViewOfFile
7480: 2c 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23  ,         0 },.#
7490: 65 6c 73 65 0a 20 20 7b 20 22 55 6e 6d 61 70 56  else.  { "UnmapV
74a0: 69 65 77 4f 66 46 69 6c 65 22 2c 20 20 20 20 20  iewOfFile",     
74b0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
74c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
74d0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
74e0: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 55 6e 6d  f..#define osUnm
74f0: 61 70 56 69 65 77 4f 66 46 69 6c 65 20 28 28 42  apViewOfFile ((B
7500: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43  OOL(WINAPI*)(LPC
7510: 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 35  VOID))aSyscall[5
7520: 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  9].pCurrent)..  
7530: 7b 20 22 57 69 64 65 43 68 61 72 54 6f 4d 75 6c  { "WideCharToMul
7540: 74 69 42 79 74 65 22 2c 20 20 20 20 20 28 53 59  tiByte",     (SY
7550: 53 43 41 4c 4c 29 57 69 64 65 43 68 61 72 54 6f  SCALL)WideCharTo
7560: 4d 75 6c 74 69 42 79 74 65 2c 20 20 20 20 20 30  MultiByte,     0
7570: 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 57   },..#define osW
7580: 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79  ideCharToMultiBy
7590: 74 65 20 28 28 69 6e 74 28 57 49 4e 41 50 49 2a  te ((int(WINAPI*
75a0: 29 28 55 49 4e 54 2c 44 57 4f 52 44 2c 4c 50 43  )(UINT,DWORD,LPC
75b0: 57 53 54 52 2c 69 6e 74 2c 4c 50 53 54 52 2c 69  WSTR,int,LPSTR,i
75c0: 6e 74 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  nt, \.        LP
75d0: 43 53 54 52 2c 4c 50 42 4f 4f 4c 29 29 61 53 79  CSTR,LPBOOL))aSy
75e0: 73 63 61 6c 6c 5b 36 30 5d 2e 70 43 75 72 72 65  scall[60].pCurre
75f0: 6e 74 29 0a 0a 20 20 7b 20 22 57 72 69 74 65 46  nt)..  { "WriteF
7600: 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ile",           
7610: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 57 72 69      (SYSCALL)Wri
7620: 74 65 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20  teFile,         
7630: 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66        0 },..#def
7640: 69 6e 65 20 6f 73 57 72 69 74 65 46 69 6c 65 20  ine osWriteFile 
7650: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
7660: 48 41 4e 44 4c 45 2c 4c 50 43 56 4f 49 44 2c 44  HANDLE,LPCVOID,D
7670: 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 20 5c 0a  WORD,LPDWORD, \.
7680: 20 20 20 20 20 20 20 20 4c 50 4f 56 45 52 4c 41          LPOVERLA
7690: 50 50 45 44 29 29 61 53 79 73 63 61 6c 6c 5b 36  PPED))aSyscall[6
76a0: 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  1].pCurrent)..#i
76b0: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
76c0: 54 0a 20 20 7b 20 22 43 72 65 61 74 65 45 76 65  T.  { "CreateEve
76d0: 6e 74 45 78 57 22 2c 20 20 20 20 20 20 20 20 20  ntExW",         
76e0: 20 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65   (SYSCALL)Create
76f0: 45 76 65 6e 74 45 78 57 2c 20 20 20 20 20 20 20  EventExW,       
7700: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
7710: 7b 20 22 43 72 65 61 74 65 45 76 65 6e 74 45 78  { "CreateEventEx
7720: 57 22 2c 20 20 20 20 20 20 20 20 20 20 28 53 59  W",          (SY
7730: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
7740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
7750: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
7760: 69 6e 65 20 6f 73 43 72 65 61 74 65 45 76 65 6e  ine osCreateEven
7770: 74 45 78 57 20 28 28 48 41 4e 44 4c 45 28 57 49  tExW ((HANDLE(WI
7780: 4e 41 50 49 2a 29 28 4c 50 53 45 43 55 52 49 54  NAPI*)(LPSECURIT
7790: 59 5f 41 54 54 52 49 42 55 54 45 53 2c 4c 50 43  Y_ATTRIBUTES,LPC
77a0: 57 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20  WSTR, \.        
77b0: 44 57 4f 52 44 2c 44 57 4f 52 44 29 29 61 53 79  DWORD,DWORD))aSy
77c0: 73 63 61 6c 6c 5b 36 32 5d 2e 70 43 75 72 72 65  scall[62].pCurre
77d0: 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  nt)..#if !SQLITE
77e0: 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 57  _OS_WINRT.  { "W
77f0: 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65  aitForSingleObje
7800: 63 74 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c  ct",     (SYSCAL
7810: 4c 29 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f  L)WaitForSingleO
7820: 62 6a 65 63 74 2c 20 20 20 20 20 30 20 7d 2c 0a  bject,     0 },.
7830: 23 65 6c 73 65 0a 20 20 7b 20 22 57 61 69 74 46  #else.  { "WaitF
7840: 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 22 2c  orSingleObject",
7850: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
7860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7870: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
7880: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 57 61  if..#define osWa
7890: 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63  itForSingleObjec
78a0: 74 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49  t ((DWORD(WINAPI
78b0: 2a 29 28 48 41 4e 44 4c 45 2c 20 5c 0a 20 20 20  *)(HANDLE, \.   
78c0: 20 20 20 20 20 44 57 4f 52 44 29 29 61 53 79 73       DWORD))aSys
78d0: 63 61 6c 6c 5b 36 33 5d 2e 70 43 75 72 72 65 6e  call[63].pCurren
78e0: 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  t)..#if SQLITE_O
78f0: 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 57 61 69  S_WINRT.  { "Wai
7900: 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74  tForSingleObject
7910: 45 78 22 2c 20 20 20 28 53 59 53 43 41 4c 4c 29  Ex",   (SYSCALL)
7920: 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a  WaitForSingleObj
7930: 65 63 74 45 78 2c 20 20 20 30 20 7d 2c 0a 23 65  ectEx,   0 },.#e
7940: 6c 73 65 0a 20 20 7b 20 22 57 61 69 74 46 6f 72  lse.  { "WaitFor
7950: 53 69 6e 67 6c 65 4f 62 6a 65 63 74 45 78 22 2c  SingleObjectEx",
7960: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
7970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7980: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
7990: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 57 61 69 74  ..#define osWait
79a0: 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 45  ForSingleObjectE
79b0: 78 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49  x ((DWORD(WINAPI
79c0: 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c  *)(HANDLE,DWORD,
79d0: 20 5c 0a 20 20 20 20 20 20 20 20 42 4f 4f 4c 29   \.        BOOL)
79e0: 29 61 53 79 73 63 61 6c 6c 5b 36 34 5d 2e 70 43  )aSyscall[64].pC
79f0: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c  urrent)..#if SQL
7a00: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b  ITE_OS_WINRT.  {
7a10: 20 22 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72   "SetFilePointer
7a20: 45 78 22 2c 20 20 20 20 20 20 20 20 28 53 59 53  Ex",        (SYS
7a30: 43 41 4c 4c 29 53 65 74 46 69 6c 65 50 6f 69 6e  CALL)SetFilePoin
7a40: 74 65 72 45 78 2c 20 20 20 20 20 20 20 20 30 20  terEx,        0 
7a50: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 53 65  },.#else.  { "Se
7a60: 74 46 69 6c 65 50 6f 69 6e 74 65 72 45 78 22 2c  tFilePointerEx",
7a70: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
7a80: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
7a90: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
7aa0: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
7ab0: 73 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 45  sSetFilePointerE
7ac0: 78 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  x ((BOOL(WINAPI*
7ad0: 29 28 48 41 4e 44 4c 45 2c 4c 41 52 47 45 5f 49  )(HANDLE,LARGE_I
7ae0: 4e 54 45 47 45 52 2c 20 5c 0a 20 20 20 20 20 20  NTEGER, \.      
7af0: 20 20 50 4c 41 52 47 45 5f 49 4e 54 45 47 45 52    PLARGE_INTEGER
7b00: 2c 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c  ,DWORD))aSyscall
7b10: 5b 36 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [65].pCurrent)..
7b20: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
7b30: 4e 52 54 0a 20 20 7b 20 22 47 65 74 46 69 6c 65  NRT.  { "GetFile
7b40: 49 6e 66 6f 72 6d 61 74 69 6f 6e 42 79 48 61 6e  InformationByHan
7b50: 64 6c 65 45 78 22 2c 20 28 53 59 53 43 41 4c 4c  dleEx", (SYSCALL
7b60: 29 47 65 74 46 69 6c 65 49 6e 66 6f 72 6d 61 74  )GetFileInformat
7b70: 69 6f 6e 42 79 48 61 6e 64 6c 65 45 78 2c 20 30  ionByHandleEx, 0
7b80: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47   },.#else.  { "G
7b90: 65 74 46 69 6c 65 49 6e 66 6f 72 6d 61 74 69 6f  etFileInformatio
7ba0: 6e 42 79 48 61 6e 64 6c 65 45 78 22 2c 20 28 53  nByHandleEx", (S
7bb0: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
7bc0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
7bd0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
7be0: 6f 73 47 65 74 46 69 6c 65 49 6e 66 6f 72 6d 61  osGetFileInforma
7bf0: 74 69 6f 6e 42 79 48 61 6e 64 6c 65 45 78 20 28  tionByHandleEx (
7c00: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48  (BOOL(WINAPI*)(H
7c10: 41 4e 44 4c 45 2c 20 5c 0a 20 20 20 20 20 20 20  ANDLE, \.       
7c20: 20 46 49 4c 45 5f 49 4e 46 4f 5f 42 59 5f 48 41   FILE_INFO_BY_HA
7c30: 4e 44 4c 45 5f 43 4c 41 53 53 2c 4c 50 56 4f 49  NDLE_CLASS,LPVOI
7c40: 44 2c 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c  D,DWORD))aSyscal
7c50: 6c 5b 36 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[66].pCurrent).
7c60: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
7c70: 49 4e 52 54 20 26 26 20 21 64 65 66 69 6e 65 64  INRT && !defined
7c80: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c  (SQLITE_OMIT_WAL
7c90: 29 0a 20 20 7b 20 22 4d 61 70 56 69 65 77 4f 66  ).  { "MapViewOf
7ca0: 46 69 6c 65 46 72 6f 6d 41 70 70 22 2c 20 20 20  FileFromApp",   
7cb0: 20 28 53 59 53 43 41 4c 4c 29 4d 61 70 56 69 65   (SYSCALL)MapVie
7cc0: 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 2c 20  wOfFileFromApp, 
7cd0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
7ce0: 7b 20 22 4d 61 70 56 69 65 77 4f 66 46 69 6c 65  { "MapViewOfFile
7cf0: 46 72 6f 6d 41 70 70 22 2c 20 20 20 20 28 53 59  FromApp",    (SY
7d00: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
7d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
7d20: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
7d30: 69 6e 65 20 6f 73 4d 61 70 56 69 65 77 4f 66 46  ine osMapViewOfF
7d40: 69 6c 65 46 72 6f 6d 41 70 70 20 28 28 4c 50 56  ileFromApp ((LPV
7d50: 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  OID(WINAPI*)(HAN
7d60: 44 4c 45 2c 55 4c 4f 4e 47 2c 55 4c 4f 4e 47 36  DLE,ULONG,ULONG6
7d70: 34 2c 20 5c 0a 20 20 20 20 20 20 20 20 53 49 5a  4, \.        SIZ
7d80: 45 5f 54 29 29 61 53 79 73 63 61 6c 6c 5b 36 37  E_T))aSyscall[67
7d90: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
7da0: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
7db0: 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65  .  { "CreateFile
7dc0: 32 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  2",             
7dd0: 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65 46  (SYSCALL)CreateF
7de0: 69 6c 65 32 2c 20 20 20 20 20 20 20 20 20 20 20  ile2,           
7df0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
7e00: 20 22 43 72 65 61 74 65 46 69 6c 65 32 22 2c 20   "CreateFile2", 
7e10: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
7e20: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
7e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
7e40: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
7e50: 6e 65 20 6f 73 43 72 65 61 74 65 46 69 6c 65 32  ne osCreateFile2
7e60: 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49   ((HANDLE(WINAPI
7e70: 2a 29 28 4c 50 43 57 53 54 52 2c 44 57 4f 52 44  *)(LPCWSTR,DWORD
7e80: 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a  ,DWORD,DWORD, \.
7e90: 20 20 20 20 20 20 20 20 4c 50 43 52 45 41 54 45          LPCREATE
7ea0: 46 49 4c 45 32 5f 45 58 54 45 4e 44 45 44 5f 50  FILE2_EXTENDED_P
7eb0: 41 52 41 4d 45 54 45 52 53 29 29 61 53 79 73 63  ARAMETERS))aSysc
7ec0: 61 6c 6c 5b 36 38 5d 2e 70 43 75 72 72 65 6e 74  all[68].pCurrent
7ed0: 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  )..#if SQLITE_OS
7ee0: 5f 57 49 4e 52 54 20 26 26 20 21 64 65 66 69 6e  _WINRT && !defin
7ef0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c  ed(SQLITE_OMIT_L
7f00: 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 29 0a 20  OAD_EXTENSION). 
7f10: 20 7b 20 22 4c 6f 61 64 50 61 63 6b 61 67 65 64   { "LoadPackaged
7f20: 4c 69 62 72 61 72 79 22 2c 20 20 20 20 20 28 53  Library",     (S
7f30: 59 53 43 41 4c 4c 29 4c 6f 61 64 50 61 63 6b 61  YSCALL)LoadPacka
7f40: 67 65 64 4c 69 62 72 61 72 79 2c 20 20 20 20 20  gedLibrary,     
7f50: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
7f60: 4c 6f 61 64 50 61 63 6b 61 67 65 64 4c 69 62 72  LoadPackagedLibr
7f70: 61 72 79 22 2c 20 20 20 20 20 28 53 59 53 43 41  ary",     (SYSCA
7f80: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
7f90: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
7fa0: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
7fb0: 20 6f 73 4c 6f 61 64 50 61 63 6b 61 67 65 64 4c   osLoadPackagedL
7fc0: 69 62 72 61 72 79 20 28 28 48 4d 4f 44 55 4c 45  ibrary ((HMODULE
7fd0: 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54  (WINAPI*)(LPCWST
7fe0: 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f  R, \.        DWO
7ff0: 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 36 39 5d  RD))aSyscall[69]
8000: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
8010: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
8020: 20 20 7b 20 22 47 65 74 54 69 63 6b 43 6f 75 6e    { "GetTickCoun
8030: 74 36 34 22 2c 20 20 20 20 20 20 20 20 20 20 28  t64",          (
8040: 53 59 53 43 41 4c 4c 29 47 65 74 54 69 63 6b 43  SYSCALL)GetTickC
8050: 6f 75 6e 74 36 34 2c 20 20 20 20 20 20 20 20 20  ount64,         
8060: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
8070: 22 47 65 74 54 69 63 6b 43 6f 75 6e 74 36 34 22  "GetTickCount64"
8080: 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43  ,          (SYSC
8090: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
80a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
80b0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
80c0: 65 20 6f 73 47 65 74 54 69 63 6b 43 6f 75 6e 74  e osGetTickCount
80d0: 36 34 20 28 28 55 4c 4f 4e 47 4c 4f 4e 47 28 57  64 ((ULONGLONG(W
80e0: 49 4e 41 50 49 2a 29 28 56 4f 49 44 29 29 61 53  INAPI*)(VOID))aS
80f0: 79 73 63 61 6c 6c 5b 37 30 5d 2e 70 43 75 72 72  yscall[70].pCurr
8100: 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45  ent)..#if SQLITE
8110: 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 47  _OS_WINRT.  { "G
8120: 65 74 4e 61 74 69 76 65 53 79 73 74 65 6d 49 6e  etNativeSystemIn
8130: 66 6f 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c  fo",     (SYSCAL
8140: 4c 29 47 65 74 4e 61 74 69 76 65 53 79 73 74 65  L)GetNativeSyste
8150: 6d 49 6e 66 6f 2c 20 20 20 20 20 30 20 7d 2c 0a  mInfo,     0 },.
8160: 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 4e 61  #else.  { "GetNa
8170: 74 69 76 65 53 79 73 74 65 6d 49 6e 66 6f 22 2c  tiveSystemInfo",
8180: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
8190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
81a0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
81b0: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65  if..#define osGe
81c0: 74 4e 61 74 69 76 65 53 79 73 74 65 6d 49 6e 66  tNativeSystemInf
81d0: 6f 20 28 28 56 4f 49 44 28 57 49 4e 41 50 49 2a  o ((VOID(WINAPI*
81e0: 29 28 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 53  )( \.        LPS
81f0: 59 53 54 45 4d 5f 49 4e 46 4f 29 29 61 53 79 73  YSTEM_INFO))aSys
8200: 63 61 6c 6c 5b 37 31 5d 2e 70 43 75 72 72 65 6e  call[71].pCurren
8210: 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  t)..#if defined(
8220: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
8230: 5f 41 4e 53 49 29 0a 20 20 7b 20 22 4f 75 74 70  _ANSI).  { "Outp
8240: 75 74 44 65 62 75 67 53 74 72 69 6e 67 41 22 2c  utDebugStringA",
8250: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4f        (SYSCALL)O
8260: 75 74 70 75 74 44 65 62 75 67 53 74 72 69 6e 67  utputDebugString
8270: 41 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c  A,      0 },.#el
8280: 73 65 0a 20 20 7b 20 22 4f 75 74 70 75 74 44 65  se.  { "OutputDe
8290: 62 75 67 53 74 72 69 6e 67 41 22 2c 20 20 20 20  bugStringA",    
82a0: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
82b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
82c0: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
82d0: 0a 23 64 65 66 69 6e 65 20 6f 73 4f 75 74 70 75  .#define osOutpu
82e0: 74 44 65 62 75 67 53 74 72 69 6e 67 41 20 28 28  tDebugStringA ((
82f0: 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 4c 50  VOID(WINAPI*)(LP
8300: 43 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 37  CSTR))aSyscall[7
8310: 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  2].pCurrent)..#i
8320: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
8330: 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29  _WIN32_HAS_WIDE)
8340: 0a 20 20 7b 20 22 4f 75 74 70 75 74 44 65 62 75  .  { "OutputDebu
8350: 67 53 74 72 69 6e 67 57 22 2c 20 20 20 20 20 20  gStringW",      
8360: 28 53 59 53 43 41 4c 4c 29 4f 75 74 70 75 74 44  (SYSCALL)OutputD
8370: 65 62 75 67 53 74 72 69 6e 67 57 2c 20 20 20 20  ebugStringW,    
8380: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
8390: 20 22 4f 75 74 70 75 74 44 65 62 75 67 53 74 72   "OutputDebugStr
83a0: 69 6e 67 57 22 2c 20 20 20 20 20 20 28 53 59 53  ingW",      (SYS
83b0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
83c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
83d0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
83e0: 6e 65 20 6f 73 4f 75 74 70 75 74 44 65 62 75 67  ne osOutputDebug
83f0: 53 74 72 69 6e 67 57 20 28 28 56 4f 49 44 28 57  StringW ((VOID(W
8400: 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52 29  INAPI*)(LPCWSTR)
8410: 29 61 53 79 73 63 61 6c 6c 5b 37 33 5d 2e 70 43  )aSyscall[73].pC
8420: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 47 65  urrent)..  { "Ge
8430: 74 50 72 6f 63 65 73 73 48 65 61 70 22 2c 20 20  tProcessHeap",  
8440: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
8450: 29 47 65 74 50 72 6f 63 65 73 73 48 65 61 70 2c  )GetProcessHeap,
8460: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a            0 },..
8470: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 50 72 6f  #define osGetPro
8480: 63 65 73 73 48 65 61 70 20 28 28 48 41 4e 44 4c  cessHeap ((HANDL
8490: 45 28 57 49 4e 41 50 49 2a 29 28 56 4f 49 44 29  E(WINAPI*)(VOID)
84a0: 29 61 53 79 73 63 61 6c 6c 5b 37 34 5d 2e 70 43  )aSyscall[74].pC
84b0: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c  urrent)..#if SQL
84c0: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20  ITE_OS_WINRT && 
84d0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
84e0: 4f 4d 49 54 5f 57 41 4c 29 0a 20 20 7b 20 22 43  OMIT_WAL).  { "C
84f0: 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67  reateFileMapping
8500: 46 72 6f 6d 41 70 70 22 2c 20 28 53 59 53 43 41  FromApp", (SYSCA
8510: 4c 4c 29 43 72 65 61 74 65 46 69 6c 65 4d 61 70  LL)CreateFileMap
8520: 70 69 6e 67 46 72 6f 6d 41 70 70 2c 20 30 20 7d  pingFromApp, 0 }
8530: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65  ,.#else.  { "Cre
8540: 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 46 72  ateFileMappingFr
8550: 6f 6d 41 70 70 22 2c 20 28 53 59 53 43 41 4c 4c  omApp", (SYSCALL
8560: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
8570: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
8580: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
8590: 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e  CreateFileMappin
85a0: 67 46 72 6f 6d 41 70 70 20 28 28 48 41 4e 44 4c  gFromApp ((HANDL
85b0: 45 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  E(WINAPI*)(HANDL
85c0: 45 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 53  E, \.        LPS
85d0: 45 43 55 52 49 54 59 5f 41 54 54 52 49 42 55 54  ECURITY_ATTRIBUT
85e0: 45 53 2c 55 4c 4f 4e 47 2c 55 4c 4f 4e 47 36 34  ES,ULONG,ULONG64
85f0: 2c 4c 50 43 57 53 54 52 29 29 61 53 79 73 63 61  ,LPCWSTR))aSysca
8600: 6c 6c 5b 37 35 5d 2e 70 43 75 72 72 65 6e 74 29  ll[75].pCurrent)
8610: 0a 0a 2f 2a 0a 2a 2a 20 4e 4f 54 45 3a 20 4f 6e  ../*.** NOTE: On
8620: 20 73 6f 6d 65 20 73 75 62 2d 70 6c 61 74 66 6f   some sub-platfo
8630: 72 6d 73 2c 20 74 68 65 20 49 6e 74 65 72 6c 6f  rms, the Interlo
8640: 63 6b 65 64 43 6f 6d 70 61 72 65 45 78 63 68 61  ckedCompareExcha
8650: 6e 67 65 20 22 66 75 6e 63 74 69 6f 6e 22 0a 2a  nge "function".*
8660: 2a 20 20 20 20 20 20 20 69 73 20 72 65 61 6c 6c  *       is reall
8670: 79 20 6a 75 73 74 20 61 20 6d 61 63 72 6f 20 74  y just a macro t
8680: 68 61 74 20 75 73 65 73 20 61 20 63 6f 6d 70 69  hat uses a compi
8690: 6c 65 72 20 69 6e 74 72 69 6e 73 69 63 20 28 65  ler intrinsic (e
86a0: 2e 67 2e 20 78 36 34 29 2e 0a 2a 2a 20 20 20 20  .g. x64)..**    
86b0: 20 20 20 53 6f 20 64 6f 20 6e 6f 74 20 74 72 79     So do not try
86c0: 20 74 6f 20 6d 61 6b 65 20 74 68 69 73 20 69 73   to make this is
86d0: 20 69 6e 74 6f 20 61 20 72 65 64 65 66 69 6e 61   into a redefina
86e0: 62 6c 65 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a  ble interface..*
86f0: 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 49 6e  /.#if defined(In
8700: 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72 65  terlockedCompare
8710: 45 78 63 68 61 6e 67 65 29 0a 20 20 7b 20 22 49  Exchange).  { "I
8720: 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72  nterlockedCompar
8730: 65 45 78 63 68 61 6e 67 65 22 2c 20 28 53 59 53  eExchange", (SYS
8740: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
8750: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
8760: 0a 23 64 65 66 69 6e 65 20 6f 73 49 6e 74 65 72  .#define osInter
8770: 6c 6f 63 6b 65 64 43 6f 6d 70 61 72 65 45 78 63  lockedCompareExc
8780: 68 61 6e 67 65 20 49 6e 74 65 72 6c 6f 63 6b 65  hange Interlocke
8790: 64 43 6f 6d 70 61 72 65 45 78 63 68 61 6e 67 65  dCompareExchange
87a0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 49 6e 74 65  .#else.  { "Inte
87b0: 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72 65 45 78  rlockedCompareEx
87c0: 63 68 61 6e 67 65 22 2c 20 28 53 59 53 43 41 4c  change", (SYSCAL
87d0: 4c 29 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d  L)InterlockedCom
87e0: 70 61 72 65 45 78 63 68 61 6e 67 65 2c 20 30 20  pareExchange, 0 
87f0: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 49 6e  },..#define osIn
8800: 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72 65  terlockedCompare
8810: 45 78 63 68 61 6e 67 65 20 28 28 4c 4f 4e 47 28  Exchange ((LONG(
8820: 57 49 4e 41 50 49 2a 29 28 4c 4f 4e 47 20 76 6f  WINAPI*)(LONG vo
8830: 6c 61 74 69 6c 65 2a 2c 20 5c 0a 20 20 20 20 20  latile*, \.     
8840: 20 20 20 4c 4f 4e 47 2c 4c 4f 4e 47 29 29 61 53     LONG,LONG))aS
8850: 79 73 63 61 6c 6c 5b 37 36 5d 2e 70 43 75 72 72  yscall[76].pCurr
8860: 65 6e 74 29 0a 23 65 6e 64 69 66 20 2f 2a 20 64  ent).#endif /* d
8870: 65 66 69 6e 65 64 28 49 6e 74 65 72 6c 6f 63 6b  efined(Interlock
8880: 65 64 43 6f 6d 70 61 72 65 45 78 63 68 61 6e 67  edCompareExchang
8890: 65 29 20 2a 2f 0a 0a 7d 3b 20 2f 2a 20 45 6e 64  e) */..}; /* End
88a0: 20 6f 66 20 74 68 65 20 6f 76 65 72 72 69 64 65   of the override
88b0: 61 62 6c 65 20 73 79 73 74 65 6d 20 63 61 6c 6c  able system call
88c0: 73 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  s */../*.** This
88d0: 20 69 73 20 74 68 65 20 78 53 65 74 53 79 73 74   is the xSetSyst
88e0: 65 6d 43 61 6c 6c 28 29 20 6d 65 74 68 6f 64 20  emCall() method 
88f0: 6f 66 20 73 71 6c 69 74 65 33 5f 76 66 73 20 66  of sqlite3_vfs f
8900: 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65 0a 2a 2a  or all of the.**
8910: 20 22 77 69 6e 33 32 22 20 56 46 53 65 73 2e 20   "win32" VFSes. 
8920: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
8930: 4b 20 6f 70 6f 6e 20 73 75 63 63 65 73 73 66 75  K opon successfu
8940: 6c 6c 79 20 75 70 64 61 74 69 6e 67 20 74 68 65  lly updating the
8950: 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  .** system call 
8960: 70 6f 69 6e 74 65 72 2c 20 6f 72 20 53 51 4c 49  pointer, or SQLI
8970: 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 69 66 20 74  TE_NOTFOUND if t
8980: 68 65 72 65 20 69 73 20 6e 6f 20 63 6f 6e 66 69  here is no confi
8990: 67 75 72 61 62 6c 65 0a 2a 2a 20 73 79 73 74 65  gurable.** syste
89a0: 6d 20 63 61 6c 6c 20 6e 61 6d 65 64 20 7a 4e 61  m call named zNa
89b0: 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  me..*/.static in
89c0: 74 20 77 69 6e 53 65 74 53 79 73 74 65 6d 43 61  t winSetSystemCa
89d0: 6c 6c 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  ll(.  sqlite3_vf
89e0: 73 20 2a 70 4e 6f 74 55 73 65 64 2c 20 20 20 20  s *pNotUsed,    
89f0: 20 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20 70      /* The VFS p
8a00: 6f 69 6e 74 65 72 2e 20 20 4e 6f 74 20 75 73 65  ointer.  Not use
8a10: 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  d */.  const cha
8a20: 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20  r *zName,       
8a30: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
8a40: 73 79 73 74 65 6d 20 63 61 6c 6c 20 74 6f 20 6f  system call to o
8a50: 76 65 72 72 69 64 65 20 2a 2f 0a 20 20 73 71 6c  verride */.  sql
8a60: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
8a70: 20 70 4e 65 77 46 75 6e 63 20 20 2f 2a 20 50 6f   pNewFunc  /* Po
8a80: 69 6e 74 65 72 20 74 6f 20 6e 65 77 20 73 79 73  inter to new sys
8a90: 74 65 6d 20 63 61 6c 6c 20 76 61 6c 75 65 20 2a  tem call value *
8aa0: 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  /.){.  unsigned 
8ab0: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 20  int i;.  int rc 
8ac0: 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  = SQLITE_NOTFOUN
8ad0: 44 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  D;..  UNUSED_PAR
8ae0: 41 4d 45 54 45 52 28 70 4e 6f 74 55 73 65 64 29  AMETER(pNotUsed)
8af0: 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30  ;.  if( zName==0
8b00: 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f   ){.    /* If no
8b10: 20 7a 4e 61 6d 65 20 69 73 20 67 69 76 65 6e 2c   zName is given,
8b20: 20 72 65 73 74 6f 72 65 20 61 6c 6c 20 73 79 73   restore all sys
8b30: 74 65 6d 20 63 61 6c 6c 73 20 74 6f 20 74 68 65  tem calls to the
8b40: 69 72 20 64 65 66 61 75 6c 74 0a 20 20 20 20 2a  ir default.    *
8b50: 2a 20 73 65 74 74 69 6e 67 73 20 61 6e 64 20 72  * settings and r
8b60: 65 74 75 72 6e 20 4e 55 4c 4c 0a 20 20 20 20 2a  eturn NULL.    *
8b70: 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  /.    rc = SQLIT
8b80: 45 5f 4f 4b 3b 0a 20 20 20 20 66 6f 72 28 69 3d  E_OK;.    for(i=
8b90: 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 79 73  0; i<sizeof(aSys
8ba0: 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53 79  call)/sizeof(aSy
8bb0: 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b  scall[0]); i++){
8bc0: 0a 20 20 20 20 20 20 69 66 28 20 61 53 79 73 63  .      if( aSysc
8bd0: 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 20  all[i].pDefault 
8be0: 29 7b 0a 20 20 20 20 20 20 20 20 61 53 79 73 63  ){.        aSysc
8bf0: 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 20  all[i].pCurrent 
8c00: 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44  = aSyscall[i].pD
8c10: 65 66 61 75 6c 74 3b 0a 20 20 20 20 20 20 7d 0a  efault;.      }.
8c20: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
8c30: 20 20 20 2f 2a 20 49 66 20 7a 4e 61 6d 65 20 69     /* If zName i
8c40: 73 20 73 70 65 63 69 66 69 65 64 2c 20 6f 70 65  s specified, ope
8c50: 72 61 74 65 20 6f 6e 20 6f 6e 6c 79 20 74 68 65  rate on only the
8c60: 20 6f 6e 65 20 73 79 73 74 65 6d 20 63 61 6c 6c   one system call
8c70: 0a 20 20 20 20 2a 2a 20 73 70 65 63 69 66 69 65  .    ** specifie
8c80: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  d..    */.    fo
8c90: 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28  r(i=0; i<sizeof(
8ca0: 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66  aSyscall)/sizeof
8cb0: 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69  (aSyscall[0]); i
8cc0: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  ++){.      if( s
8cd0: 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79  trcmp(zName, aSy
8ce0: 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d  scall[i].zName)=
8cf0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  =0 ){.        if
8d00: 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44  ( aSyscall[i].pD
8d10: 65 66 61 75 6c 74 3d 3d 30 20 29 7b 0a 20 20 20  efault==0 ){.   
8d20: 20 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b         aSyscall[
8d30: 69 5d 2e 70 44 65 66 61 75 6c 74 20 3d 20 61 53  i].pDefault = aS
8d40: 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65  yscall[i].pCurre
8d50: 6e 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  nt;.        }.  
8d60: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
8d70: 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 69 66  E_OK;.        if
8d80: 28 20 70 4e 65 77 46 75 6e 63 3d 3d 30 20 29 20  ( pNewFunc==0 ) 
8d90: 70 4e 65 77 46 75 6e 63 20 3d 20 61 53 79 73 63  pNewFunc = aSysc
8da0: 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3b  all[i].pDefault;
8db0: 0a 20 20 20 20 20 20 20 20 61 53 79 73 63 61 6c  .        aSyscal
8dc0: 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 20 3d 20  l[i].pCurrent = 
8dd0: 70 4e 65 77 46 75 6e 63 3b 0a 20 20 20 20 20 20  pNewFunc;.      
8de0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
8df0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
8e00: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
8e10: 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75   Return the valu
8e20: 65 20 6f 66 20 61 20 73 79 73 74 65 6d 20 63 61  e of a system ca
8e30: 6c 6c 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c  ll.  Return NULL
8e40: 20 69 66 20 7a 4e 61 6d 65 20 69 73 20 6e 6f 74   if zName is not
8e50: 20 61 0a 2a 2a 20 72 65 63 6f 67 6e 69 7a 65 64   a.** recognized
8e60: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6e 61 6d   system call nam
8e70: 65 2e 20 20 4e 55 4c 4c 20 69 73 20 61 6c 73 6f  e.  NULL is also
8e80: 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65   returned if the
8e90: 20 73 79 73 74 65 6d 20 63 61 6c 6c 0a 2a 2a 20   system call.** 
8ea0: 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  is currently und
8eb0: 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  efined..*/.stati
8ec0: 63 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c  c sqlite3_syscal
8ed0: 6c 5f 70 74 72 20 77 69 6e 47 65 74 53 79 73 74  l_ptr winGetSyst
8ee0: 65 6d 43 61 6c 6c 28 0a 20 20 73 71 6c 69 74 65  emCall(.  sqlite
8ef0: 33 5f 76 66 73 20 2a 70 4e 6f 74 55 73 65 64 2c  3_vfs *pNotUsed,
8f00: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
8f10: 4e 61 6d 65 0a 29 7b 0a 20 20 75 6e 73 69 67 6e  Name.){.  unsign
8f20: 65 64 20 69 6e 74 20 69 3b 0a 0a 20 20 55 4e 55  ed int i;..  UNU
8f30: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 4e  SED_PARAMETER(pN
8f40: 6f 74 55 73 65 64 29 3b 0a 20 20 66 6f 72 28 69  otUsed);.  for(i
8f50: 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 79  =0; i<sizeof(aSy
8f60: 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53  scall)/sizeof(aS
8f70: 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29  yscall[0]); i++)
8f80: 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  {.    if( strcmp
8f90: 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c  (zName, aSyscall
8fa0: 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20  [i].zName)==0 ) 
8fb0: 72 65 74 75 72 6e 20 61 53 79 73 63 61 6c 6c 5b  return aSyscall[
8fc0: 69 5d 2e 70 43 75 72 72 65 6e 74 3b 0a 20 20 7d  i].pCurrent;.  }
8fd0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
8fe0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
8ff0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 72   name of the fir
9000: 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 61  st system call a
9010: 66 74 65 72 20 7a 4e 61 6d 65 2e 20 20 49 66 20  fter zName.  If 
9020: 7a 4e 61 6d 65 3d 3d 4e 55 4c 4c 0a 2a 2a 20 74  zName==NULL.** t
9030: 68 65 6e 20 72 65 74 75 72 6e 20 74 68 65 20 6e  hen return the n
9040: 61 6d 65 20 6f 66 20 74 68 65 20 66 69 72 73 74  ame of the first
9050: 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 52   system call.  R
9060: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e  eturn NULL if zN
9070: 61 6d 65 0a 2a 2a 20 69 73 20 74 68 65 20 6c 61  ame.** is the la
9080: 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6f  st system call o
9090: 72 20 69 66 20 7a 4e 61 6d 65 20 69 73 20 6e 6f  r if zName is no
90a0: 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  t the name of a 
90b0: 76 61 6c 69 64 0a 2a 2a 20 73 79 73 74 65 6d 20  valid.** system 
90c0: 63 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  call..*/.static 
90d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 77 69 6e 4e  const char *winN
90e0: 65 78 74 53 79 73 74 65 6d 43 61 6c 6c 28 73 71  extSystemCall(sq
90f0: 6c 69 74 65 33 5f 76 66 73 20 2a 70 2c 20 63 6f  lite3_vfs *p, co
9100: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29  nst char *zName)
9110: 7b 0a 20 20 69 6e 74 20 69 20 3d 20 2d 31 3b 0a  {.  int i = -1;.
9120: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
9130: 54 45 52 28 70 29 3b 0a 20 20 69 66 28 20 7a 4e  TER(p);.  if( zN
9140: 61 6d 65 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  ame ){.    for(i
9150: 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28  =0; i<ArraySize(
9160: 61 53 79 73 63 61 6c 6c 29 2d 31 3b 20 69 2b 2b  aSyscall)-1; i++
9170: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72  ){.      if( str
9180: 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63  cmp(zName, aSysc
9190: 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  all[i].zName)==0
91a0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
91b0: 20 20 7d 0a 20 20 66 6f 72 28 69 2b 2b 3b 20 69    }.  for(i++; i
91c0: 3c 41 72 72 61 79 53 69 7a 65 28 61 53 79 73 63  <ArraySize(aSysc
91d0: 61 6c 6c 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  all); i++){.    
91e0: 69 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e  if( aSyscall[i].
91f0: 70 43 75 72 72 65 6e 74 21 3d 30 20 29 20 72 65  pCurrent!=0 ) re
9200: 74 75 72 6e 20 61 53 79 73 63 61 6c 6c 5b 69 5d  turn aSyscall[i]
9210: 2e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 72 65  .zName;.  }.  re
9220: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66 64 65  turn 0;.}..#ifde
9230: 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d  f SQLITE_WIN32_M
9240: 41 4c 4c 4f 43 0a 2f 2a 0a 2a 2a 20 49 66 20 61  ALLOC./*.** If a
9250: 20 57 69 6e 33 32 20 6e 61 74 69 76 65 20 68 65   Win32 native he
9260: 61 70 20 68 61 73 20 62 65 65 6e 20 63 6f 6e 66  ap has been conf
9270: 69 67 75 72 65 64 2c 20 74 68 69 73 20 66 75 6e  igured, this fun
9280: 63 74 69 6f 6e 20 77 69 6c 6c 20 61 74 74 65 6d  ction will attem
9290: 70 74 20 74 6f 0a 2a 2a 20 63 6f 6d 70 61 63 74  pt to.** compact
92a0: 20 69 74 2e 20 20 55 70 6f 6e 20 73 75 63 63 65   it.  Upon succe
92b0: 73 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 77 69  ss, SQLITE_OK wi
92c0: 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20  ll be returned. 
92d0: 20 55 70 6f 6e 20 66 61 69 6c 75 72 65 2c 20 6f   Upon failure, o
92e0: 6e 65 0a 2a 2a 20 6f 66 20 53 51 4c 49 54 45 5f  ne.** of SQLITE_
92f0: 4e 4f 4d 45 4d 2c 20 53 51 4c 49 54 45 5f 45 52  NOMEM, SQLITE_ER
9300: 52 4f 52 2c 20 6f 72 20 53 51 4c 49 54 45 5f 4e  ROR, or SQLITE_N
9310: 4f 54 46 4f 55 4e 44 20 77 69 6c 6c 20 62 65 20  OTFOUND will be 
9320: 72 65 74 75 72 6e 65 64 2e 20 20 54 68 65 0a 2a  returned.  The.*
9330: 2a 20 22 70 6e 4c 61 72 67 65 73 74 22 20 61 72  * "pnLargest" ar
9340: 67 75 6d 65 6e 74 2c 20 69 66 20 6e 6f 6e 2d 7a  gument, if non-z
9350: 65 72 6f 2c 20 77 69 6c 6c 20 62 65 20 75 73 65  ero, will be use
9360: 64 20 74 6f 20 72 65 74 75 72 6e 20 74 68 65 20  d to return the 
9370: 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 6c  size of the.** l
9380: 61 72 67 65 73 74 20 63 6f 6d 6d 69 74 74 65 64  argest committed
9390: 20 66 72 65 65 20 62 6c 6f 63 6b 20 69 6e 20 74   free block in t
93a0: 68 65 20 68 65 61 70 2c 20 69 6e 20 62 79 74 65  he heap, in byte
93b0: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
93c0: 33 5f 77 69 6e 33 32 5f 63 6f 6d 70 61 63 74 5f  3_win32_compact_
93d0: 68 65 61 70 28 4c 50 55 49 4e 54 20 70 6e 4c 61  heap(LPUINT pnLa
93e0: 72 67 65 73 74 29 7b 0a 20 20 69 6e 74 20 72 63  rgest){.  int rc
93f0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
9400: 55 49 4e 54 20 6e 4c 61 72 67 65 73 74 20 3d 20  UINT nLargest = 
9410: 30 3b 0a 20 20 48 41 4e 44 4c 45 20 68 48 65 61  0;.  HANDLE hHea
9420: 70 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65  p;..  winMemAsse
9430: 72 74 4d 61 67 69 63 28 29 3b 0a 20 20 68 48 65  rtMagic();.  hHe
9440: 61 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74 48 65  ap = winMemGetHe
9450: 61 70 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ap();.  assert( 
9460: 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61 73  hHeap!=0 );.  as
9470: 73 65 72 74 28 20 68 48 65 61 70 21 3d 49 4e 56  sert( hHeap!=INV
9480: 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
9490: 45 20 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45  E );.#if !SQLITE
94a0: 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66  _OS_WINRT && def
94b0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
94c0: 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54  2_MALLOC_VALIDAT
94d0: 45 29 0a 20 20 61 73 73 65 72 74 28 20 6f 73 48  E).  assert( osH
94e0: 65 61 70 56 61 6c 69 64 61 74 65 28 68 48 65 61  eapValidate(hHea
94f0: 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  p, SQLITE_WIN32_
9500: 48 45 41 50 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c  HEAP_FLAGS, NULL
9510: 29 20 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  ) );.#endif.#if 
9520: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45  !SQLITE_OS_WINCE
9530: 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57   && !SQLITE_OS_W
9540: 49 4e 52 54 0a 20 20 69 66 28 20 28 6e 4c 61 72  INRT.  if( (nLar
9550: 67 65 73 74 3d 6f 73 48 65 61 70 43 6f 6d 70 61  gest=osHeapCompa
9560: 63 74 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45  ct(hHeap, SQLITE
9570: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47  _WIN32_HEAP_FLAG
9580: 53 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 44 57  S))==0 ){.    DW
9590: 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20  ORD lastErrno = 
95a0: 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
95b0: 3b 0a 20 20 20 20 69 66 28 20 6c 61 73 74 45 72  ;.    if( lastEr
95c0: 72 6e 6f 3d 3d 4e 4f 5f 45 52 52 4f 52 20 29 7b  rno==NO_ERROR ){
95d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c  .      sqlite3_l
95e0: 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c  og(SQLITE_NOMEM,
95f0: 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65 61 70   "failed to Heap
9600: 43 6f 6d 70 61 63 74 20 28 6e 6f 20 73 70 61 63  Compact (no spac
9610: 65 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20  e), heap=%p",.  
9620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9630: 28 76 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a 20  (void*)hHeap);. 
9640: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
9650: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73  _NOMEM;.    }els
9660: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
9670: 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 45 52 52 4f  _log(SQLITE_ERRO
9680: 52 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65  R, "failed to He
9690: 61 70 43 6f 6d 70 61 63 74 20 28 25 6c 75 29 2c  apCompact (%lu),
96a0: 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20 20   heap=%p",.     
96b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47               osG
96c0: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 28  etLastError(), (
96d0: 76 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a 20 20  void*)hHeap);.  
96e0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
96f0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d  ERROR;.    }.  }
9700: 0a 23 65 6c 73 65 0a 20 20 73 71 6c 69 74 65 33  .#else.  sqlite3
9710: 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 54 46  _log(SQLITE_NOTF
9720: 4f 55 4e 44 2c 20 22 66 61 69 6c 65 64 20 74 6f  OUND, "failed to
9730: 20 48 65 61 70 43 6f 6d 70 61 63 74 2c 20 68 65   HeapCompact, he
9740: 61 70 3d 25 70 22 2c 0a 20 20 20 20 20 20 20 20  ap=%p",.        
9750: 20 20 20 20 20 20 28 76 6f 69 64 2a 29 68 48 65        (void*)hHe
9760: 61 70 29 3b 0a 20 20 72 63 20 3d 20 53 51 4c 49  ap);.  rc = SQLI
9770: 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 23 65 6e  TE_NOTFOUND;.#en
9780: 64 69 66 0a 20 20 69 66 28 20 70 6e 4c 61 72 67  dif.  if( pnLarg
9790: 65 73 74 20 29 20 2a 70 6e 4c 61 72 67 65 73 74  est ) *pnLargest
97a0: 20 3d 20 6e 4c 61 72 67 65 73 74 3b 0a 20 20 72   = nLargest;.  r
97b0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
97c0: 2a 2a 20 49 66 20 61 20 57 69 6e 33 32 20 6e 61  ** If a Win32 na
97d0: 74 69 76 65 20 68 65 61 70 20 68 61 73 20 62 65  tive heap has be
97e0: 65 6e 20 63 6f 6e 66 69 67 75 72 65 64 2c 20 74  en configured, t
97f0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c  his function wil
9800: 6c 20 61 74 74 65 6d 70 74 20 74 6f 0a 2a 2a 20  l attempt to.** 
9810: 64 65 73 74 72 6f 79 20 61 6e 64 20 72 65 63 72  destroy and recr
9820: 65 61 74 65 20 69 74 2e 20 20 49 66 20 74 68 65  eate it.  If the
9830: 20 57 69 6e 33 32 20 6e 61 74 69 76 65 20 68 65   Win32 native he
9840: 61 70 20 69 73 20 6e 6f 74 20 69 73 6f 6c 61 74  ap is not isolat
9850: 65 64 20 61 6e 64 2f 6f 72 0a 2a 2a 20 74 68 65  ed and/or.** the
9860: 20 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f   sqlite3_memory_
9870: 75 73 65 64 28 29 20 66 75 6e 63 74 69 6f 6e 20  used() function 
9880: 64 6f 65 73 20 6e 6f 74 20 72 65 74 75 72 6e 20  does not return 
9890: 7a 65 72 6f 2c 20 53 51 4c 49 54 45 5f 42 55 53  zero, SQLITE_BUS
98a0: 59 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 72 65 74  Y will.** be ret
98b0: 75 72 6e 65 64 20 61 6e 64 20 6e 6f 20 63 68 61  urned and no cha
98c0: 6e 67 65 73 20 77 69 6c 6c 20 62 65 20 6d 61 64  nges will be mad
98d0: 65 20 74 6f 20 74 68 65 20 57 69 6e 33 32 20 6e  e to the Win32 n
98e0: 61 74 69 76 65 20 68 65 61 70 2e 0a 2a 2f 0a 69  ative heap..*/.i
98f0: 6e 74 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32  nt sqlite3_win32
9900: 5f 72 65 73 65 74 5f 68 65 61 70 28 29 7b 0a 20  _reset_heap(){. 
9910: 20 69 6e 74 20 72 63 3b 0a 20 20 4d 55 54 45 58   int rc;.  MUTEX
9920: 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f  _LOGIC( sqlite3_
9930: 6d 75 74 65 78 20 2a 70 4d 61 73 74 65 72 3b 20  mutex *pMaster; 
9940: 29 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 73 74  ) /* The main st
9950: 61 74 69 63 20 6d 75 74 65 78 20 2a 2f 0a 20 20  atic mutex */.  
9960: 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c  MUTEX_LOGIC( sql
9970: 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 4d 65 6d  ite3_mutex *pMem
9980: 3b 20 29 20 20 20 20 2f 2a 20 54 68 65 20 6d 65  ; )    /* The me
9990: 6d 73 79 73 20 73 74 61 74 69 63 20 6d 75 74 65  msys static mute
99a0: 78 20 2a 2f 0a 20 20 4d 55 54 45 58 5f 4c 4f 47  x */.  MUTEX_LOG
99b0: 49 43 28 20 70 4d 61 73 74 65 72 20 3d 20 73 71  IC( pMaster = sq
99c0: 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
99d0: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
99e0: 54 49 43 5f 4d 41 53 54 45 52 29 3b 20 29 0a 20  TIC_MASTER); ). 
99f0: 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 70 4d   MUTEX_LOGIC( pM
9a00: 65 6d 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65  em = sqlite3Mute
9a10: 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
9a20: 54 45 58 5f 53 54 41 54 49 43 5f 4d 45 4d 29 3b  TEX_STATIC_MEM);
9a30: 20 29 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   ).  sqlite3_mut
9a40: 65 78 5f 65 6e 74 65 72 28 70 4d 61 73 74 65 72  ex_enter(pMaster
9a50: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  );.  sqlite3_mut
9a60: 65 78 5f 65 6e 74 65 72 28 70 4d 65 6d 29 3b 0a  ex_enter(pMem);.
9a70: 20 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61    winMemAssertMa
9a80: 67 69 63 28 29 3b 0a 20 20 69 66 28 20 77 69 6e  gic();.  if( win
9a90: 4d 65 6d 47 65 74 48 65 61 70 28 29 21 3d 4e 55  MemGetHeap()!=NU
9aa0: 4c 4c 20 26 26 20 77 69 6e 4d 65 6d 47 65 74 4f  LL && winMemGetO
9ab0: 77 6e 65 64 28 29 20 26 26 20 73 71 6c 69 74 65  wned() && sqlite
9ac0: 33 5f 6d 65 6d 6f 72 79 5f 75 73 65 64 28 29 3d  3_memory_used()=
9ad0: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20  =0 ){.    /*.   
9ae0: 20 2a 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   ** At this poin
9af0: 74 2c 20 74 68 65 72 65 20 73 68 6f 75 6c 64 20  t, there should 
9b00: 62 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e  be no outstandin
9b10: 67 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  g memory allocat
9b20: 69 6f 6e 73 20 6f 6e 0a 20 20 20 20 2a 2a 20 74  ions on.    ** t
9b30: 68 65 20 68 65 61 70 2e 20 20 41 6c 73 6f 2c 20  he heap.  Also, 
9b40: 73 69 6e 63 65 20 62 6f 74 68 20 74 68 65 20 6d  since both the m
9b50: 61 73 74 65 72 20 61 6e 64 20 6d 65 6d 73 79 73  aster and memsys
9b60: 20 6c 6f 63 6b 73 20 61 72 65 20 63 75 72 72 65   locks are curre
9b70: 6e 74 6c 79 0a 20 20 20 20 2a 2a 20 62 65 69 6e  ntly.    ** bein
9b80: 67 20 68 65 6c 64 20 62 79 20 75 73 2c 20 6e 6f  g held by us, no
9b90: 20 6f 74 68 65 72 20 66 75 6e 63 74 69 6f 6e 20   other function 
9ba0: 28 69 2e 65 2e 20 66 72 6f 6d 20 61 6e 6f 74 68  (i.e. from anoth
9bb0: 65 72 20 74 68 72 65 61 64 29 20 73 68 6f 75 6c  er thread) shoul
9bc0: 64 0a 20 20 20 20 2a 2a 20 62 65 20 61 62 6c 65  d.    ** be able
9bd0: 20 74 6f 20 65 76 65 6e 20 61 63 63 65 73 73 20   to even access 
9be0: 74 68 65 20 68 65 61 70 2e 20 20 41 74 74 65 6d  the heap.  Attem
9bf0: 70 74 20 74 6f 20 64 65 73 74 72 6f 79 20 61 6e  pt to destroy an
9c00: 64 20 72 65 63 72 65 61 74 65 20 6f 75 72 0a 20  d recreate our. 
9c10: 20 20 20 2a 2a 20 69 73 6f 6c 61 74 65 64 20 57     ** isolated W
9c20: 69 6e 33 32 20 6e 61 74 69 76 65 20 68 65 61 70  in32 native heap
9c30: 20 6e 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   now..    */.   
9c40: 20 61 73 73 65 72 74 28 20 77 69 6e 4d 65 6d 47   assert( winMemG
9c50: 65 74 48 65 61 70 28 29 21 3d 4e 55 4c 4c 20 29  etHeap()!=NULL )
9c60: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 77 69  ;.    assert( wi
9c70: 6e 4d 65 6d 47 65 74 4f 77 6e 65 64 28 29 20 29  nMemGetOwned() )
9c80: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ;.    assert( sq
9c90: 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 75 73 65  lite3_memory_use
9ca0: 64 28 29 3d 3d 30 20 29 3b 0a 20 20 20 20 77 69  d()==0 );.    wi
9cb0: 6e 4d 65 6d 53 68 75 74 64 6f 77 6e 28 77 69 6e  nMemShutdown(win
9cc0: 4d 65 6d 47 65 74 44 61 74 61 50 74 72 28 29 29  MemGetDataPtr())
9cd0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 77 69  ;.    assert( wi
9ce0: 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 3d 3d 4e  nMemGetHeap()==N
9cf0: 55 4c 4c 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ULL );.    asser
9d00: 74 28 20 21 77 69 6e 4d 65 6d 47 65 74 4f 77 6e  t( !winMemGetOwn
9d10: 65 64 28 29 20 29 3b 0a 20 20 20 20 61 73 73 65  ed() );.    asse
9d20: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 65 6d 6f  rt( sqlite3_memo
9d30: 72 79 5f 75 73 65 64 28 29 3d 3d 30 20 29 3b 0a  ry_used()==0 );.
9d40: 20 20 20 20 72 63 20 3d 20 77 69 6e 4d 65 6d 49      rc = winMemI
9d50: 6e 69 74 28 77 69 6e 4d 65 6d 47 65 74 44 61 74  nit(winMemGetDat
9d60: 61 50 74 72 28 29 29 3b 0a 20 20 20 20 61 73 73  aPtr());.    ass
9d70: 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
9d80: 4f 4b 20 7c 7c 20 77 69 6e 4d 65 6d 47 65 74 48  OK || winMemGetH
9d90: 65 61 70 28 29 21 3d 4e 55 4c 4c 20 29 3b 0a 20  eap()!=NULL );. 
9da0: 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
9db0: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 77 69 6e 4d  QLITE_OK || winM
9dc0: 65 6d 47 65 74 4f 77 6e 65 64 28 29 20 29 3b 0a  emGetOwned() );.
9dd0: 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
9de0: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c  SQLITE_OK || sql
9df0: 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 75 73 65 64  ite3_memory_used
9e00: 28 29 3d 3d 30 20 29 3b 0a 20 20 7d 65 6c 73 65  ()==0 );.  }else
9e10: 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  {.    /*.    ** 
9e20: 54 68 65 20 57 69 6e 33 32 20 6e 61 74 69 76 65  The Win32 native
9e30: 20 68 65 61 70 20 63 61 6e 6e 6f 74 20 62 65 20   heap cannot be 
9e40: 6d 6f 64 69 66 69 65 64 20 62 65 63 61 75 73 65  modified because
9e50: 20 69 74 20 6d 61 79 20 62 65 20 69 6e 20 75 73   it may be in us
9e60: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  e..    */.    rc
9e70: 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
9e80: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
9e90: 74 65 78 5f 6c 65 61 76 65 28 70 4d 65 6d 29 3b  tex_leave(pMem);
9ea0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
9eb0: 5f 6c 65 61 76 65 28 70 4d 61 73 74 65 72 29 3b  _leave(pMaster);
9ec0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
9ed0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
9ee0: 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 20 2a 2f  _WIN32_MALLOC */
9ef0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
9f00: 63 74 69 6f 6e 20 6f 75 74 70 75 74 73 20 74 68  ction outputs th
9f10: 65 20 73 70 65 63 69 66 69 65 64 20 28 41 4e 53  e specified (ANS
9f20: 49 29 20 73 74 72 69 6e 67 20 74 6f 20 74 68 65  I) string to the
9f30: 20 57 69 6e 33 32 20 64 65 62 75 67 67 65 72 0a   Win32 debugger.
9f40: 2a 2a 20 28 69 66 20 61 76 61 69 6c 61 62 6c 65  ** (if available
9f50: 29 2e 0a 2a 2f 0a 0a 76 6f 69 64 20 73 71 6c 69  )..*/..void sqli
9f60: 74 65 33 5f 77 69 6e 33 32 5f 77 72 69 74 65 5f  te3_win32_write_
9f70: 64 65 62 75 67 28 63 6f 6e 73 74 20 63 68 61 72  debug(const char
9f80: 20 2a 7a 42 75 66 2c 20 69 6e 74 20 6e 42 75 66   *zBuf, int nBuf
9f90: 29 7b 0a 20 20 63 68 61 72 20 7a 44 62 67 42 75  ){.  char zDbgBu
9fa0: 66 5b 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44  f[SQLITE_WIN32_D
9fb0: 42 47 5f 42 55 46 5f 53 49 5a 45 5d 3b 0a 20 20  BG_BUF_SIZE];.  
9fc0: 69 6e 74 20 6e 4d 69 6e 20 3d 20 4d 49 4e 28 6e  int nMin = MIN(n
9fd0: 42 75 66 2c 20 28 53 51 4c 49 54 45 5f 57 49 4e  Buf, (SQLITE_WIN
9fe0: 33 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 20  32_DBG_BUF_SIZE 
9ff0: 2d 20 31 29 29 3b 20 2f 2a 20 6d 61 79 20 62 65  - 1)); /* may be
a000: 20 6e 65 67 61 74 69 76 65 2e 20 2a 2f 0a 20 20   negative. */.  
a010: 69 66 28 20 6e 4d 69 6e 3c 2d 31 20 29 20 6e 4d  if( nMin<-1 ) nM
a020: 69 6e 20 3d 20 2d 31 3b 20 2f 2a 20 61 6c 6c 20  in = -1; /* all 
a030: 6e 65 67 61 74 69 76 65 20 76 61 6c 75 65 73 20  negative values 
a040: 62 65 63 6f 6d 65 20 2d 31 2e 20 2a 2f 0a 20 20  become -1. */.  
a050: 61 73 73 65 72 74 28 20 6e 4d 69 6e 3d 3d 2d 31  assert( nMin==-1
a060: 20 7c 7c 20 6e 4d 69 6e 3d 3d 30 20 7c 7c 20 6e   || nMin==0 || n
a070: 4d 69 6e 3c 53 51 4c 49 54 45 5f 57 49 4e 33 32  Min<SQLITE_WIN32
a080: 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 20 29 3b  _DBG_BUF_SIZE );
a090: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
a0a0: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
a0b0: 53 49 29 0a 20 20 69 66 28 20 6e 4d 69 6e 3e 30  SI).  if( nMin>0
a0c0: 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 7a   ){.    memset(z
a0d0: 44 62 67 42 75 66 2c 20 30 2c 20 53 51 4c 49 54  DbgBuf, 0, SQLIT
a0e0: 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f  E_WIN32_DBG_BUF_
a0f0: 53 49 5a 45 29 3b 0a 20 20 20 20 6d 65 6d 63 70  SIZE);.    memcp
a100: 79 28 7a 44 62 67 42 75 66 2c 20 7a 42 75 66 2c  y(zDbgBuf, zBuf,
a110: 20 6e 4d 69 6e 29 3b 0a 20 20 20 20 6f 73 4f 75   nMin);.    osOu
a120: 74 70 75 74 44 65 62 75 67 53 74 72 69 6e 67 41  tputDebugStringA
a130: 28 7a 44 62 67 42 75 66 29 3b 0a 20 20 7d 65 6c  (zDbgBuf);.  }el
a140: 73 65 7b 0a 20 20 20 20 6f 73 4f 75 74 70 75 74  se{.    osOutput
a150: 44 65 62 75 67 53 74 72 69 6e 67 41 28 7a 42 75  DebugStringA(zBu
a160: 66 29 3b 0a 20 20 7d 0a 23 65 6c 69 66 20 64 65  f);.  }.#elif de
a170: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
a180: 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 6d  32_HAS_WIDE).  m
a190: 65 6d 73 65 74 28 7a 44 62 67 42 75 66 2c 20 30  emset(zDbgBuf, 0
a1a0: 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44  , SQLITE_WIN32_D
a1b0: 42 47 5f 42 55 46 5f 53 49 5a 45 29 3b 0a 20 20  BG_BUF_SIZE);.  
a1c0: 69 66 20 28 20 6f 73 4d 75 6c 74 69 42 79 74 65  if ( osMultiByte
a1d0: 54 6f 57 69 64 65 43 68 61 72 28 0a 20 20 20 20  ToWideChar(.    
a1e0: 20 20 20 20 20 20 6f 73 41 72 65 46 69 6c 65 41        osAreFileA
a1f0: 70 69 73 41 4e 53 49 28 29 20 3f 20 43 50 5f 41  pisANSI() ? CP_A
a200: 43 50 20 3a 20 43 50 5f 4f 45 4d 43 50 2c 20 30  CP : CP_OEMCP, 0
a210: 2c 20 7a 42 75 66 2c 0a 20 20 20 20 20 20 20 20  , zBuf,.        
a220: 20 20 6e 4d 69 6e 2c 20 28 4c 50 57 53 54 52 29    nMin, (LPWSTR)
a230: 7a 44 62 67 42 75 66 2c 20 53 51 4c 49 54 45 5f  zDbgBuf, SQLITE_
a240: 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49  WIN32_DBG_BUF_SI
a250: 5a 45 2f 73 69 7a 65 6f 66 28 57 43 48 41 52 29  ZE/sizeof(WCHAR)
a260: 29 3c 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  )<=0 ){.    retu
a270: 72 6e 3b 0a 20 20 7d 0a 20 20 6f 73 4f 75 74 70  rn;.  }.  osOutp
a280: 75 74 44 65 62 75 67 53 74 72 69 6e 67 57 28 28  utDebugStringW((
a290: 4c 50 43 57 53 54 52 29 7a 44 62 67 42 75 66 29  LPCWSTR)zDbgBuf)
a2a0: 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 6e 4d  ;.#else.  if( nM
a2b0: 69 6e 3e 30 20 29 7b 0a 20 20 20 20 6d 65 6d 73  in>0 ){.    mems
a2c0: 65 74 28 7a 44 62 67 42 75 66 2c 20 30 2c 20 53  et(zDbgBuf, 0, S
a2d0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f  QLITE_WIN32_DBG_
a2e0: 42 55 46 5f 53 49 5a 45 29 3b 0a 20 20 20 20 6d  BUF_SIZE);.    m
a2f0: 65 6d 63 70 79 28 7a 44 62 67 42 75 66 2c 20 7a  emcpy(zDbgBuf, z
a300: 42 75 66 2c 20 6e 4d 69 6e 29 3b 0a 20 20 20 20  Buf, nMin);.    
a310: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
a320: 22 25 73 22 2c 20 7a 44 62 67 42 75 66 29 3b 0a  "%s", zDbgBuf);.
a330: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 70 72    }else{.    fpr
a340: 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25 73  intf(stderr, "%s
a350: 22 2c 20 7a 42 75 66 29 3b 0a 20 20 7d 0a 23 65  ", zBuf);.  }.#e
a360: 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ndif.}../*.** Th
a370: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74  e following rout
a380: 69 6e 65 20 73 75 73 70 65 6e 64 73 20 74 68 65  ine suspends the
a390: 20 63 75 72 72 65 6e 74 20 74 68 72 65 61 64 20   current thread 
a3a0: 66 6f 72 20 61 74 20 6c 65 61 73 74 20 6d 73 0a  for at least ms.
a3b0: 2a 2a 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 2e  ** milliseconds.
a3c0: 20 20 54 68 69 73 20 69 73 20 65 71 75 69 76 61    This is equiva
a3d0: 6c 65 6e 74 20 74 6f 20 74 68 65 20 57 69 6e 33  lent to the Win3
a3e0: 32 20 53 6c 65 65 70 28 29 20 69 6e 74 65 72 66  2 Sleep() interf
a3f0: 61 63 65 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49  ace..*/.#if SQLI
a400: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 73 74 61 74  TE_OS_WINRT.stat
a410: 69 63 20 48 41 4e 44 4c 45 20 73 6c 65 65 70 4f  ic HANDLE sleepO
a420: 62 6a 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69  bj = NULL;.#endi
a430: 66 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f  f..void sqlite3_
a440: 77 69 6e 33 32 5f 73 6c 65 65 70 28 44 57 4f 52  win32_sleep(DWOR
a450: 44 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 29 7b  D milliseconds){
a460: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
a470: 49 4e 52 54 0a 20 20 69 66 20 28 20 73 6c 65 65  INRT.  if ( slee
a480: 70 4f 62 6a 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20  pObj==NULL ){.  
a490: 20 20 73 6c 65 65 70 4f 62 6a 20 3d 20 6f 73 43    sleepObj = osC
a4a0: 72 65 61 74 65 45 76 65 6e 74 45 78 57 28 4e 55  reateEventExW(NU
a4b0: 4c 4c 2c 20 4e 55 4c 4c 2c 20 43 52 45 41 54 45  LL, NULL, CREATE
a4c0: 5f 45 56 45 4e 54 5f 4d 41 4e 55 41 4c 5f 52 45  _EVENT_MANUAL_RE
a4d0: 53 45 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20  SET,.           
a4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a4f0: 20 20 20 20 20 53 59 4e 43 48 52 4f 4e 49 5a 45       SYNCHRONIZE
a500: 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
a510: 20 73 6c 65 65 70 4f 62 6a 21 3d 4e 55 4c 4c 20   sleepObj!=NULL 
a520: 29 3b 0a 20 20 6f 73 57 61 69 74 46 6f 72 53 69  );.  osWaitForSi
a530: 6e 67 6c 65 4f 62 6a 65 63 74 45 78 28 73 6c 65  ngleObjectEx(sle
a540: 65 70 4f 62 6a 2c 20 6d 69 6c 6c 69 73 65 63 6f  epObj, milliseco
a550: 6e 64 73 2c 20 46 41 4c 53 45 29 3b 0a 23 65 6c  nds, FALSE);.#el
a560: 73 65 0a 20 20 6f 73 53 6c 65 65 70 28 6d 69 6c  se.  osSleep(mil
a570: 6c 69 73 65 63 6f 6e 64 73 29 3b 0a 23 65 6e 64  liseconds);.#end
a580: 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  if.}../*.** Retu
a590: 72 6e 20 74 72 75 65 20 28 6e 6f 6e 2d 7a 65 72  rn true (non-zer
a5a0: 6f 29 20 69 66 20 77 65 20 61 72 65 20 72 75 6e  o) if we are run
a5b0: 6e 69 6e 67 20 75 6e 64 65 72 20 57 69 6e 4e 54  ning under WinNT
a5c0: 2c 20 57 69 6e 32 4b 2c 20 57 69 6e 58 50 2c 0a  , Win2K, WinXP,.
a5d0: 2a 2a 20 6f 72 20 57 69 6e 43 45 2e 20 20 52 65  ** or WinCE.  Re
a5e0: 74 75 72 6e 20 66 61 6c 73 65 20 28 7a 65 72 6f  turn false (zero
a5f0: 29 20 66 6f 72 20 57 69 6e 39 35 2c 20 57 69 6e  ) for Win95, Win
a600: 39 38 2c 20 6f 72 20 57 69 6e 4d 45 2e 0a 2a 2a  98, or WinME..**
a610: 0a 2a 2a 20 48 65 72 65 20 69 73 20 61 6e 20 69  .** Here is an i
a620: 6e 74 65 72 65 73 74 69 6e 67 20 6f 62 73 65 72  nteresting obser
a630: 76 61 74 69 6f 6e 3a 20 20 57 69 6e 39 35 2c 20  vation:  Win95, 
a640: 57 69 6e 39 38 2c 20 61 6e 64 20 57 69 6e 4d 45  Win98, and WinME
a650: 20 6c 61 63 6b 0a 2a 2a 20 74 68 65 20 4c 6f 63   lack.** the Loc
a660: 6b 46 69 6c 65 45 78 28 29 20 41 50 49 2e 20 20  kFileEx() API.  
a670: 42 75 74 20 77 65 20 63 61 6e 20 73 74 69 6c 6c  But we can still
a680: 20 73 74 61 74 69 63 61 6c 6c 79 20 6c 69 6e 6b   statically link
a690: 20 61 67 61 69 6e 73 74 20 74 68 61 74 0a 2a 2a   against that.**
a6a0: 20 41 50 49 20 61 73 20 6c 6f 6e 67 20 61 73 20   API as long as 
a6b0: 77 65 20 64 6f 6e 27 74 20 63 61 6c 6c 20 69 74  we don't call it
a6c0: 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67 20 57 69   when running Wi
a6d0: 6e 39 35 2f 39 38 2f 4d 45 2e 20 20 41 20 63 61  n95/98/ME.  A ca
a6e0: 6c 6c 20 74 6f 0a 2a 2a 20 74 68 69 73 20 72 6f  ll to.** this ro
a6f0: 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f  utine is used to
a700: 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68   determine if th
a710: 65 20 68 6f 73 74 20 69 73 20 57 69 6e 39 35 2f  e host is Win95/
a720: 39 38 2f 4d 45 20 6f 72 0a 2a 2a 20 57 69 6e 4e  98/ME or.** WinN
a730: 54 2f 32 4b 2f 58 50 20 73 6f 20 74 68 61 74 20  T/2K/XP so that 
a740: 77 65 20 77 69 6c 6c 20 6b 6e 6f 77 20 77 68 65  we will know whe
a750: 74 68 65 72 20 6f 72 20 6e 6f 74 20 77 65 20 63  ther or not we c
a760: 61 6e 20 73 61 66 65 6c 79 20 63 61 6c 6c 0a 2a  an safely call.*
a770: 2a 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 45 78  * the LockFileEx
a780: 28 29 20 41 50 49 2e 0a 2a 2f 0a 0a 23 69 66 20  () API..*/..#if 
a790: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
a7a0: 57 49 4e 33 32 5f 47 45 54 56 45 52 53 49 4f 4e  WIN32_GETVERSION
a7b0: 45 58 29 20 7c 7c 20 21 53 51 4c 49 54 45 5f 57  EX) || !SQLITE_W
a7c0: 49 4e 33 32 5f 47 45 54 56 45 52 53 49 4f 4e 45  IN32_GETVERSIONE
a7d0: 58 0a 23 20 64 65 66 69 6e 65 20 6f 73 49 73 4e  X.# define osIsN
a7e0: 54 28 29 20 20 28 31 29 0a 23 65 6c 69 66 20 53  T()  (1).#elif S
a7f0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c  QLITE_OS_WINCE |
a800: 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  | SQLITE_OS_WINR
a810: 54 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  T || !defined(SQ
a820: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
a830: 4e 53 49 29 0a 23 20 64 65 66 69 6e 65 20 6f 73  NSI).# define os
a840: 49 73 4e 54 28 29 20 20 28 31 29 0a 23 65 6c 69  IsNT()  (1).#eli
a850: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
a860: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45  E_WIN32_HAS_WIDE
a870: 29 0a 23 20 64 65 66 69 6e 65 20 6f 73 49 73 4e  ).# define osIsN
a880: 54 28 29 20 20 28 30 29 0a 23 65 6c 73 65 0a 23  T()  (0).#else.#
a890: 20 64 65 66 69 6e 65 20 6f 73 49 73 4e 54 28 29   define osIsNT()
a8a0: 20 20 28 28 73 71 6c 69 74 65 33 5f 6f 73 5f 74    ((sqlite3_os_t
a8b0: 79 70 65 3d 3d 32 29 20 7c 7c 20 73 71 6c 69 74  ype==2) || sqlit
a8c0: 65 33 5f 77 69 6e 33 32 5f 69 73 5f 6e 74 28 29  e3_win32_is_nt()
a8d0: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
a8e0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65  This function de
a8f0: 74 65 72 6d 69 6e 65 73 20 69 66 20 74 68 65 20  termines if the 
a900: 6d 61 63 68 69 6e 65 20 69 73 20 72 75 6e 6e 69  machine is runni
a910: 6e 67 20 61 20 76 65 72 73 69 6f 6e 20 6f 66 20  ng a version of 
a920: 57 69 6e 64 6f 77 73 0a 2a 2a 20 62 61 73 65 64  Windows.** based
a930: 20 6f 6e 20 74 68 65 20 4e 54 20 6b 65 72 6e 65   on the NT kerne
a940: 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  l..*/.int sqlite
a950: 33 5f 77 69 6e 33 32 5f 69 73 5f 6e 74 28 76 6f  3_win32_is_nt(vo
a960: 69 64 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64  id){.#if defined
a970: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 47 45  (SQLITE_WIN32_GE
a980: 54 56 45 52 53 49 4f 4e 45 58 29 20 26 26 20 53  TVERSIONEX) && S
a990: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 47 45 54 56  QLITE_WIN32_GETV
a9a0: 45 52 53 49 4f 4e 45 58 0a 20 20 69 66 28 20 6f  ERSIONEX.  if( o
a9b0: 73 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70  sInterlockedComp
a9c0: 61 72 65 45 78 63 68 61 6e 67 65 28 26 73 71 6c  areExchange(&sql
a9d0: 69 74 65 33 5f 6f 73 5f 74 79 70 65 2c 20 30 2c  ite3_os_type, 0,
a9e0: 20 30 29 3d 3d 30 20 29 7b 0a 23 69 66 20 21 53   0)==0 ){.#if !S
a9f0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26  QLITE_OS_WINRT &
aa00: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
aa10: 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29  _WIN32_HAS_WIDE)
aa20: 20 26 26 20 5c 0a 20 20 20 20 20 20 20 20 64 65   && \.        de
aa30: 66 69 6e 65 64 28 4e 54 44 44 49 5f 56 45 52 53  fined(NTDDI_VERS
aa40: 49 4f 4e 29 20 26 26 20 4e 54 44 44 49 5f 56 45  ION) && NTDDI_VE
aa50: 52 53 49 4f 4e 20 3e 3d 20 4e 54 44 44 49 5f 57  RSION >= NTDDI_W
aa60: 49 4e 38 0a 20 20 20 20 4f 53 56 45 52 53 49 4f  IN8.    OSVERSIO
aa70: 4e 49 4e 46 4f 57 20 73 49 6e 66 6f 3b 0a 20 20  NINFOW sInfo;.  
aa80: 20 20 73 49 6e 66 6f 2e 64 77 4f 53 56 65 72 73    sInfo.dwOSVers
aa90: 69 6f 6e 49 6e 66 6f 53 69 7a 65 20 3d 20 73 69  ionInfoSize = si
aaa0: 7a 65 6f 66 28 73 49 6e 66 6f 29 3b 0a 20 20 20  zeof(sInfo);.   
aab0: 20 6f 73 47 65 74 56 65 72 73 69 6f 6e 45 78 57   osGetVersionExW
aac0: 28 26 73 49 6e 66 6f 29 3b 0a 20 20 20 20 6f 73  (&sInfo);.    os
aad0: 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61  InterlockedCompa
aae0: 72 65 45 78 63 68 61 6e 67 65 28 26 73 71 6c 69  reExchange(&sqli
aaf0: 74 65 33 5f 6f 73 5f 74 79 70 65 2c 0a 20 20 20  te3_os_type,.   
ab00: 20 20 20 20 20 28 73 49 6e 66 6f 2e 64 77 50 6c       (sInfo.dwPl
ab10: 61 74 66 6f 72 6d 49 64 20 3d 3d 20 56 45 52 5f  atformId == VER_
ab20: 50 4c 41 54 46 4f 52 4d 5f 57 49 4e 33 32 5f 4e  PLATFORM_WIN32_N
ab30: 54 29 20 3f 20 32 20 3a 20 31 2c 20 30 29 3b 0a  T) ? 2 : 1, 0);.
ab40: 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 53 51  #elif defined(SQ
ab50: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
ab60: 4e 53 49 29 0a 20 20 20 20 4f 53 56 45 52 53 49  NSI).    OSVERSI
ab70: 4f 4e 49 4e 46 4f 41 20 73 49 6e 66 6f 3b 0a 20  ONINFOA sInfo;. 
ab80: 20 20 20 73 49 6e 66 6f 2e 64 77 4f 53 56 65 72     sInfo.dwOSVer
ab90: 73 69 6f 6e 49 6e 66 6f 53 69 7a 65 20 3d 20 73  sionInfoSize = s
aba0: 69 7a 65 6f 66 28 73 49 6e 66 6f 29 3b 0a 20 20  izeof(sInfo);.  
abb0: 20 20 6f 73 47 65 74 56 65 72 73 69 6f 6e 45 78    osGetVersionEx
abc0: 41 28 26 73 49 6e 66 6f 29 3b 0a 20 20 20 20 6f  A(&sInfo);.    o
abd0: 73 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70  sInterlockedComp
abe0: 61 72 65 45 78 63 68 61 6e 67 65 28 26 73 71 6c  areExchange(&sql
abf0: 69 74 65 33 5f 6f 73 5f 74 79 70 65 2c 0a 20 20  ite3_os_type,.  
ac00: 20 20 20 20 20 20 28 73 49 6e 66 6f 2e 64 77 50        (sInfo.dwP
ac10: 6c 61 74 66 6f 72 6d 49 64 20 3d 3d 20 56 45 52  latformId == VER
ac20: 5f 50 4c 41 54 46 4f 52 4d 5f 57 49 4e 33 32 5f  _PLATFORM_WIN32_
ac30: 4e 54 29 20 3f 20 32 20 3a 20 31 2c 20 30 29 3b  NT) ? 2 : 1, 0);
ac40: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 72 65  .#endif.  }.  re
ac50: 74 75 72 6e 20 6f 73 49 6e 74 65 72 6c 6f 63 6b  turn osInterlock
ac60: 65 64 43 6f 6d 70 61 72 65 45 78 63 68 61 6e 67  edCompareExchang
ac70: 65 28 26 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79  e(&sqlite3_os_ty
ac80: 70 65 2c 20 32 2c 20 32 29 3d 3d 32 3b 0a 23 65  pe, 2, 2)==2;.#e
ac90: 6c 69 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  lif SQLITE_TEST.
aca0: 20 20 72 65 74 75 72 6e 20 6f 73 49 6e 74 65 72    return osInter
acb0: 6c 6f 63 6b 65 64 43 6f 6d 70 61 72 65 45 78 63  lockedCompareExc
acc0: 68 61 6e 67 65 28 26 73 71 6c 69 74 65 33 5f 6f  hange(&sqlite3_o
acd0: 73 5f 74 79 70 65 2c 20 32 2c 20 32 29 3d 3d 32  s_type, 2, 2)==2
ace0: 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72 6e  ;.#else.  return
acf0: 20 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 69   1;.#endif.}..#i
ad00: 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  fdef SQLITE_WIN3
ad10: 32 5f 4d 41 4c 4c 4f 43 0a 2f 2a 0a 2a 2a 20 41  2_MALLOC./*.** A
ad20: 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65 73 20 6f  llocate nBytes o
ad30: 66 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61  f memory..*/.sta
ad40: 74 69 63 20 76 6f 69 64 20 2a 77 69 6e 4d 65 6d  tic void *winMem
ad50: 4d 61 6c 6c 6f 63 28 69 6e 74 20 6e 42 79 74 65  Malloc(int nByte
ad60: 73 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 48 65  s){.  HANDLE hHe
ad70: 61 70 3b 0a 20 20 76 6f 69 64 20 2a 70 3b 0a 0a  ap;.  void *p;..
ad80: 20 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61    winMemAssertMa
ad90: 67 69 63 28 29 3b 0a 20 20 68 48 65 61 70 20 3d  gic();.  hHeap =
ada0: 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29   winMemGetHeap()
adb0: 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48 65 61  ;.  assert( hHea
adc0: 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  p!=0 );.  assert
add0: 28 20 68 48 65 61 70 21 3d 49 4e 56 41 4c 49 44  ( hHeap!=INVALID
ade0: 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b  _HANDLE_VALUE );
adf0: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
ae00: 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64  WINRT && defined
ae10: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41  (SQLITE_WIN32_MA
ae20: 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a 20  LLOC_VALIDATE). 
ae30: 20 61 73 73 65 72 74 28 20 6f 73 48 65 61 70 56   assert( osHeapV
ae40: 61 6c 69 64 61 74 65 28 68 48 65 61 70 2c 20 53  alidate(hHeap, S
ae50: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
ae60: 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c 29 20 29 3b  _FLAGS, NULL) );
ae70: 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74  .#endif.  assert
ae80: 28 20 6e 42 79 74 65 73 3e 3d 30 20 29 3b 0a 20  ( nBytes>=0 );. 
ae90: 20 70 20 3d 20 6f 73 48 65 61 70 41 6c 6c 6f 63   p = osHeapAlloc
aea0: 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57  (hHeap, SQLITE_W
aeb0: 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c  IN32_HEAP_FLAGS,
aec0: 20 28 53 49 5a 45 5f 54 29 6e 42 79 74 65 73 29   (SIZE_T)nBytes)
aed0: 3b 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20  ;.  if( !p ){.  
aee0: 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51    sqlite3_log(SQ
aef0: 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69  LITE_NOMEM, "fai
af00: 6c 65 64 20 74 6f 20 48 65 61 70 41 6c 6c 6f 63  led to HeapAlloc
af10: 20 25 75 20 62 79 74 65 73 20 28 25 6c 75 29 2c   %u bytes (%lu),
af20: 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20 20   heap=%p",.     
af30: 20 20 20 20 20 20 20 20 20 20 20 6e 42 79 74 65             nByte
af40: 73 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f  s, osGetLastErro
af50: 72 28 29 2c 20 28 76 6f 69 64 2a 29 68 48 65 61  r(), (void*)hHea
af60: 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  p);.  }.  return
af70: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65   p;.}../*.** Fre
af80: 65 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61  e memory..*/.sta
af90: 74 69 63 20 76 6f 69 64 20 77 69 6e 4d 65 6d 46  tic void winMemF
afa0: 72 65 65 28 76 6f 69 64 20 2a 70 50 72 69 6f 72  ree(void *pPrior
afb0: 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 48 65 61  ){.  HANDLE hHea
afc0: 70 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65  p;..  winMemAsse
afd0: 72 74 4d 61 67 69 63 28 29 3b 0a 20 20 68 48 65  rtMagic();.  hHe
afe0: 61 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74 48 65  ap = winMemGetHe
aff0: 61 70 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ap();.  assert( 
b000: 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61 73  hHeap!=0 );.  as
b010: 73 65 72 74 28 20 68 48 65 61 70 21 3d 49 4e 56  sert( hHeap!=INV
b020: 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
b030: 45 20 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45  E );.#if !SQLITE
b040: 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66  _OS_WINRT && def
b050: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
b060: 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54  2_MALLOC_VALIDAT
b070: 45 29 0a 20 20 61 73 73 65 72 74 28 20 6f 73 48  E).  assert( osH
b080: 65 61 70 56 61 6c 69 64 61 74 65 28 68 48 65 61  eapValidate(hHea
b090: 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  p, SQLITE_WIN32_
b0a0: 48 45 41 50 5f 46 4c 41 47 53 2c 20 70 50 72 69  HEAP_FLAGS, pPri
b0b0: 6f 72 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  or) );.#endif.  
b0c0: 69 66 28 20 21 70 50 72 69 6f 72 20 29 20 72 65  if( !pPrior ) re
b0d0: 74 75 72 6e 3b 20 2f 2a 20 50 61 73 73 69 6e 67  turn; /* Passing
b0e0: 20 4e 55 4c 4c 20 74 6f 20 48 65 61 70 46 72 65   NULL to HeapFre
b0f0: 65 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 20  e is undefined. 
b100: 2a 2f 0a 20 20 69 66 28 20 21 6f 73 48 65 61 70  */.  if( !osHeap
b110: 46 72 65 65 28 68 48 65 61 70 2c 20 53 51 4c 49  Free(hHeap, SQLI
b120: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c  TE_WIN32_HEAP_FL
b130: 41 47 53 2c 20 70 50 72 69 6f 72 29 20 29 7b 0a  AGS, pPrior) ){.
b140: 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
b150: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66  SQLITE_NOMEM, "f
b160: 61 69 6c 65 64 20 74 6f 20 48 65 61 70 46 72 65  ailed to HeapFre
b170: 65 20 62 6c 6f 63 6b 20 25 70 20 28 25 6c 75 29  e block %p (%lu)
b180: 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20  , heap=%p",.    
b190: 20 20 20 20 20 20 20 20 20 20 20 20 70 50 72 69              pPri
b1a0: 6f 72 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72  or, osGetLastErr
b1b0: 6f 72 28 29 2c 20 28 76 6f 69 64 2a 29 68 48 65  or(), (void*)hHe
b1c0: 61 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ap);.  }.}../*.*
b1d0: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 73 69 7a  * Change the siz
b1e0: 65 20 6f 66 20 61 6e 20 65 78 69 73 74 69 6e 67  e of an existing
b1f0: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
b200: 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  on.*/.static voi
b210: 64 20 2a 77 69 6e 4d 65 6d 52 65 61 6c 6c 6f 63  d *winMemRealloc
b220: 28 76 6f 69 64 20 2a 70 50 72 69 6f 72 2c 20 69  (void *pPrior, i
b230: 6e 74 20 6e 42 79 74 65 73 29 7b 0a 20 20 48 41  nt nBytes){.  HA
b240: 4e 44 4c 45 20 68 48 65 61 70 3b 0a 20 20 76 6f  NDLE hHeap;.  vo
b250: 69 64 20 2a 70 3b 0a 0a 20 20 77 69 6e 4d 65 6d  id *p;..  winMem
b260: 41 73 73 65 72 74 4d 61 67 69 63 28 29 3b 0a 20  AssertMagic();. 
b270: 20 68 48 65 61 70 20 3d 20 77 69 6e 4d 65 6d 47   hHeap = winMemG
b280: 65 74 48 65 61 70 28 29 3b 0a 20 20 61 73 73 65  etHeap();.  asse
b290: 72 74 28 20 68 48 65 61 70 21 3d 30 20 29 3b 0a  rt( hHeap!=0 );.
b2a0: 20 20 61 73 73 65 72 74 28 20 68 48 65 61 70 21    assert( hHeap!
b2b0: 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f  =INVALID_HANDLE_
b2c0: 56 41 4c 55 45 20 29 3b 0a 23 69 66 20 21 53 51  VALUE );.#if !SQ
b2d0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
b2e0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
b2f0: 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c  WIN32_MALLOC_VAL
b300: 49 44 41 54 45 29 0a 20 20 61 73 73 65 72 74 28  IDATE).  assert(
b310: 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74 65 28   osHeapValidate(
b320: 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49  hHeap, SQLITE_WI
b330: 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20  N32_HEAP_FLAGS, 
b340: 70 50 72 69 6f 72 29 20 29 3b 0a 23 65 6e 64 69  pPrior) );.#endi
b350: 66 0a 20 20 61 73 73 65 72 74 28 20 6e 42 79 74  f.  assert( nByt
b360: 65 73 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 21  es>=0 );.  if( !
b370: 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 70 20  pPrior ){.    p 
b380: 3d 20 6f 73 48 65 61 70 41 6c 6c 6f 63 28 68 48  = osHeapAlloc(hH
b390: 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33  eap, SQLITE_WIN3
b3a0: 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 28 53  2_HEAP_FLAGS, (S
b3b0: 49 5a 45 5f 54 29 6e 42 79 74 65 73 29 3b 0a 20  IZE_T)nBytes);. 
b3c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20   }else{.    p = 
b3d0: 6f 73 48 65 61 70 52 65 41 6c 6c 6f 63 28 68 48  osHeapReAlloc(hH
b3e0: 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33  eap, SQLITE_WIN3
b3f0: 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 70 50  2_HEAP_FLAGS, pP
b400: 72 69 6f 72 2c 20 28 53 49 5a 45 5f 54 29 6e 42  rior, (SIZE_T)nB
b410: 79 74 65 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ytes);.  }.  if(
b420: 20 21 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74   !p ){.    sqlit
b430: 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f  e3_log(SQLITE_NO
b440: 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f 20  MEM, "failed to 
b450: 25 73 20 25 75 20 62 79 74 65 73 20 28 25 6c 75  %s %u bytes (%lu
b460: 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20  ), heap=%p",.   
b470: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 72               pPr
b480: 69 6f 72 20 3f 20 22 48 65 61 70 52 65 41 6c 6c  ior ? "HeapReAll
b490: 6f 63 22 20 3a 20 22 48 65 61 70 41 6c 6c 6f 63  oc" : "HeapAlloc
b4a0: 22 2c 20 6e 42 79 74 65 73 2c 20 6f 73 47 65 74  ", nBytes, osGet
b4b0: 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20  LastError(),.   
b4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f               (vo
b4d0: 69 64 2a 29 68 48 65 61 70 29 3b 0a 20 20 7d 0a  id*)hHeap);.  }.
b4e0: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
b4f0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
b500: 73 69 7a 65 20 6f 66 20 61 6e 20 6f 75 74 73 74  size of an outst
b510: 61 6e 64 69 6e 67 20 61 6c 6c 6f 63 61 74 69 6f  anding allocatio
b520: 6e 2c 20 69 6e 20 62 79 74 65 73 2e 0a 2a 2f 0a  n, in bytes..*/.
b530: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 65  static int winMe
b540: 6d 53 69 7a 65 28 76 6f 69 64 20 2a 70 29 7b 0a  mSize(void *p){.
b550: 20 20 48 41 4e 44 4c 45 20 68 48 65 61 70 3b 0a    HANDLE hHeap;.
b560: 20 20 53 49 5a 45 5f 54 20 6e 3b 0a 0a 20 20 77    SIZE_T n;..  w
b570: 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63  inMemAssertMagic
b580: 28 29 3b 0a 20 20 68 48 65 61 70 20 3d 20 77 69  ();.  hHeap = wi
b590: 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 3b 0a 20  nMemGetHeap();. 
b5a0: 20 61 73 73 65 72 74 28 20 68 48 65 61 70 21 3d   assert( hHeap!=
b5b0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68  0 );.  assert( h
b5c0: 48 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41  Heap!=INVALID_HA
b5d0: 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69  NDLE_VALUE );.#i
b5e0: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
b5f0: 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  RT && defined(SQ
b600: 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f  LITE_WIN32_MALLO
b610: 43 5f 56 41 4c 49 44 41 54 45 29 0a 20 20 61 73  C_VALIDATE).  as
b620: 73 65 72 74 28 20 6f 73 48 65 61 70 56 61 6c 69  sert( osHeapVali
b630: 64 61 74 65 28 68 48 65 61 70 2c 20 53 51 4c 49  date(hHeap, SQLI
b640: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c  TE_WIN32_HEAP_FL
b650: 41 47 53 2c 20 70 29 20 29 3b 0a 23 65 6e 64 69  AGS, p) );.#endi
b660: 66 0a 20 20 69 66 28 20 21 70 20 29 20 72 65 74  f.  if( !p ) ret
b670: 75 72 6e 20 30 3b 0a 20 20 6e 20 3d 20 6f 73 48  urn 0;.  n = osH
b680: 65 61 70 53 69 7a 65 28 68 48 65 61 70 2c 20 53  eapSize(hHeap, S
b690: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
b6a0: 5f 46 4c 41 47 53 2c 20 70 29 3b 0a 20 20 69 66  _FLAGS, p);.  if
b6b0: 28 20 6e 3d 3d 28 53 49 5a 45 5f 54 29 2d 31 20  ( n==(SIZE_T)-1 
b6c0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c  ){.    sqlite3_l
b6d0: 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c  og(SQLITE_NOMEM,
b6e0: 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65 61 70   "failed to Heap
b6f0: 53 69 7a 65 20 62 6c 6f 63 6b 20 25 70 20 28 25  Size block %p (%
b700: 6c 75 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20  lu), heap=%p",. 
b710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
b720: 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  , osGetLastError
b730: 28 29 2c 20 28 76 6f 69 64 2a 29 68 48 65 61 70  (), (void*)hHeap
b740: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
b750: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 69  .  }.  return (i
b760: 6e 74 29 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  nt)n;.}../*.** R
b770: 6f 75 6e 64 20 75 70 20 61 20 72 65 71 75 65 73  ound up a reques
b780: 74 20 73 69 7a 65 20 74 6f 20 74 68 65 20 6e 65  t size to the ne
b790: 78 74 20 76 61 6c 69 64 20 61 6c 6c 6f 63 61 74  xt valid allocat
b7a0: 69 6f 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61  ion size..*/.sta
b7b0: 74 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d 52 6f  tic int winMemRo
b7c0: 75 6e 64 75 70 28 69 6e 74 20 6e 29 7b 0a 20 20  undup(int n){.  
b7d0: 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a  return n;.}../*.
b7e0: 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  ** Initialize th
b7f0: 69 73 20 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a 73 74  is module..*/.st
b800: 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d 49  atic int winMemI
b810: 6e 69 74 28 76 6f 69 64 20 2a 70 41 70 70 44 61  nit(void *pAppDa
b820: 74 61 29 7b 0a 20 20 77 69 6e 4d 65 6d 44 61 74  ta){.  winMemDat
b830: 61 20 2a 70 57 69 6e 4d 65 6d 44 61 74 61 20 3d  a *pWinMemData =
b840: 20 28 77 69 6e 4d 65 6d 44 61 74 61 20 2a 29 70   (winMemData *)p
b850: 41 70 70 44 61 74 61 3b 0a 0a 20 20 69 66 28 20  AppData;..  if( 
b860: 21 70 57 69 6e 4d 65 6d 44 61 74 61 20 29 20 72  !pWinMemData ) r
b870: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
b880: 4f 52 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57  OR;.  assert( pW
b890: 69 6e 4d 65 6d 44 61 74 61 2d 3e 6d 61 67 69 63  inMemData->magic
b8a0: 31 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 31  1==WINMEM_MAGIC1
b8b0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57   );.  assert( pW
b8c0: 69 6e 4d 65 6d 44 61 74 61 2d 3e 6d 61 67 69 63  inMemData->magic
b8d0: 32 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 32  2==WINMEM_MAGIC2
b8e0: 20 29 3b 0a 0a 23 69 66 20 21 53 51 4c 49 54 45   );..#if !SQLITE
b8f0: 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 53 51 4c  _OS_WINRT && SQL
b900: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 43  ITE_WIN32_HEAP_C
b910: 52 45 41 54 45 0a 20 20 69 66 28 20 21 70 57 69  REATE.  if( !pWi
b920: 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20  nMemData->hHeap 
b930: 29 7b 0a 20 20 20 20 44 57 4f 52 44 20 64 77 49  ){.    DWORD dwI
b940: 6e 69 74 69 61 6c 53 69 7a 65 20 3d 20 53 51 4c  nitialSize = SQL
b950: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 49  ITE_WIN32_HEAP_I
b960: 4e 49 54 5f 53 49 5a 45 3b 0a 20 20 20 20 44 57  NIT_SIZE;.    DW
b970: 4f 52 44 20 64 77 4d 61 78 69 6d 75 6d 53 69 7a  ORD dwMaximumSiz
b980: 65 20 3d 20 28 44 57 4f 52 44 29 73 71 6c 69 74  e = (DWORD)sqlit
b990: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e  e3GlobalConfig.n
b9a0: 48 65 61 70 3b 0a 20 20 20 20 69 66 28 20 64 77  Heap;.    if( dw
b9b0: 4d 61 78 69 6d 75 6d 53 69 7a 65 3d 3d 30 20 29  MaximumSize==0 )
b9c0: 7b 0a 20 20 20 20 20 20 64 77 4d 61 78 69 6d 75  {.      dwMaximu
b9d0: 6d 53 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f 57  mSize = SQLITE_W
b9e0: 49 4e 33 32 5f 48 45 41 50 5f 4d 41 58 5f 53 49  IN32_HEAP_MAX_SI
b9f0: 5a 45 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ZE;.    }else if
ba00: 28 20 64 77 49 6e 69 74 69 61 6c 53 69 7a 65 3e  ( dwInitialSize>
ba10: 64 77 4d 61 78 69 6d 75 6d 53 69 7a 65 20 29 7b  dwMaximumSize ){
ba20: 0a 20 20 20 20 20 20 64 77 49 6e 69 74 69 61 6c  .      dwInitial
ba30: 53 69 7a 65 20 3d 20 64 77 4d 61 78 69 6d 75 6d  Size = dwMaximum
ba40: 53 69 7a 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Size;.    }.    
ba50: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65  pWinMemData->hHe
ba60: 61 70 20 3d 20 6f 73 48 65 61 70 43 72 65 61 74  ap = osHeapCreat
ba70: 65 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  e(SQLITE_WIN32_H
ba80: 45 41 50 5f 46 4c 41 47 53 2c 0a 20 20 20 20 20  EAP_FLAGS,.     
ba90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
baa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bab0: 20 64 77 49 6e 69 74 69 61 6c 53 69 7a 65 2c 20   dwInitialSize, 
bac0: 64 77 4d 61 78 69 6d 75 6d 53 69 7a 65 29 3b 0a  dwMaximumSize);.
bad0: 20 20 20 20 69 66 28 20 21 70 57 69 6e 4d 65 6d      if( !pWinMem
bae0: 44 61 74 61 2d 3e 68 48 65 61 70 20 29 7b 0a 20  Data->hHeap ){. 
baf0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67       sqlite3_log
bb00: 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 0a 20  (SQLITE_NOMEM,. 
bb10: 20 20 20 20 20 20 20 20 20 22 66 61 69 6c 65 64           "failed
bb20: 20 74 6f 20 48 65 61 70 43 72 65 61 74 65 20 28   to HeapCreate (
bb30: 25 6c 75 29 2c 20 66 6c 61 67 73 3d 25 75 2c 20  %lu), flags=%u, 
bb40: 69 6e 69 74 53 69 7a 65 3d 25 6c 75 2c 20 6d 61  initSize=%lu, ma
bb50: 78 53 69 7a 65 3d 25 6c 75 22 2c 0a 20 20 20 20  xSize=%lu",.    
bb60: 20 20 20 20 20 20 6f 73 47 65 74 4c 61 73 74 45        osGetLastE
bb70: 72 72 6f 72 28 29 2c 20 53 51 4c 49 54 45 5f 57  rror(), SQLITE_W
bb80: 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c  IN32_HEAP_FLAGS,
bb90: 20 64 77 49 6e 69 74 69 61 6c 53 69 7a 65 2c 0a   dwInitialSize,.
bba0: 20 20 20 20 20 20 20 20 20 20 64 77 4d 61 78 69            dwMaxi
bbb0: 6d 75 6d 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  mumSize);.      
bbc0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
bbd0: 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  MEM;.    }.    p
bbe0: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e  WinMemData->bOwn
bbf0: 65 64 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 61  ed = TRUE;.    a
bc00: 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61  ssert( pWinMemDa
bc10: 74 61 2d 3e 62 4f 77 6e 65 64 20 29 3b 0a 20 20  ta->bOwned );.  
bc20: 7d 0a 23 65 6c 73 65 0a 20 20 70 57 69 6e 4d 65  }.#else.  pWinMe
bc30: 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 3d 20 6f  mData->hHeap = o
bc40: 73 47 65 74 50 72 6f 63 65 73 73 48 65 61 70 28  sGetProcessHeap(
bc50: 29 3b 0a 20 20 69 66 28 20 21 70 57 69 6e 4d 65  );.  if( !pWinMe
bc60: 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 29 7b 0a  mData->hHeap ){.
bc70: 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
bc80: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 0a 20 20  SQLITE_NOMEM,.  
bc90: 20 20 20 20 20 20 22 66 61 69 6c 65 64 20 74 6f        "failed to
bca0: 20 47 65 74 50 72 6f 63 65 73 73 48 65 61 70 20   GetProcessHeap 
bcb0: 28 25 6c 75 29 22 2c 20 6f 73 47 65 74 4c 61 73  (%lu)", osGetLas
bcc0: 74 45 72 72 6f 72 28 29 29 3b 0a 20 20 20 20 72  tError());.    r
bcd0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
bce0: 45 4d 3b 0a 20 20 7d 0a 20 20 70 57 69 6e 4d 65  EM;.  }.  pWinMe
bcf0: 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20 3d 20  mData->bOwned = 
bd00: 46 41 4c 53 45 3b 0a 20 20 61 73 73 65 72 74 28  FALSE;.  assert(
bd10: 20 21 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62   !pWinMemData->b
bd20: 4f 77 6e 65 64 20 29 3b 0a 23 65 6e 64 69 66 0a  Owned );.#endif.
bd30: 20 20 61 73 73 65 72 74 28 20 70 57 69 6e 4d 65    assert( pWinMe
bd40: 6d 44 61 74 61 2d 3e 68 48 65 61 70 21 3d 30 20  mData->hHeap!=0 
bd50: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57 69  );.  assert( pWi
bd60: 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 21  nMemData->hHeap!
bd70: 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f  =INVALID_HANDLE_
bd80: 56 41 4c 55 45 20 29 3b 0a 23 69 66 20 21 53 51  VALUE );.#if !SQ
bd90: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
bda0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
bdb0: 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c  WIN32_MALLOC_VAL
bdc0: 49 44 41 54 45 29 0a 20 20 61 73 73 65 72 74 28  IDATE).  assert(
bdd0: 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74 65 28   osHeapValidate(
bde0: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65  pWinMemData->hHe
bdf0: 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ap, SQLITE_WIN32
be00: 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 4e 55 4c  _HEAP_FLAGS, NUL
be10: 4c 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72  L) );.#endif.  r
be20: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
be30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 69 6e 69 74  .}../*.** Deinit
be40: 69 61 6c 69 7a 65 20 74 68 69 73 20 6d 6f 64 75  ialize this modu
be50: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  le..*/.static vo
be60: 69 64 20 77 69 6e 4d 65 6d 53 68 75 74 64 6f 77  id winMemShutdow
be70: 6e 28 76 6f 69 64 20 2a 70 41 70 70 44 61 74 61  n(void *pAppData
be80: 29 7b 0a 20 20 77 69 6e 4d 65 6d 44 61 74 61 20  ){.  winMemData 
be90: 2a 70 57 69 6e 4d 65 6d 44 61 74 61 20 3d 20 28  *pWinMemData = (
bea0: 77 69 6e 4d 65 6d 44 61 74 61 20 2a 29 70 41 70  winMemData *)pAp
beb0: 70 44 61 74 61 3b 0a 0a 20 20 69 66 28 20 21 70  pData;..  if( !p
bec0: 57 69 6e 4d 65 6d 44 61 74 61 20 29 20 72 65 74  WinMemData ) ret
bed0: 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70  urn;.  assert( p
bee0: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 6d 61 67 69  WinMemData->magi
bef0: 63 31 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49 43  c1==WINMEM_MAGIC
bf00: 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  1 );.  assert( p
bf10: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 6d 61 67 69  WinMemData->magi
bf20: 63 32 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49 43  c2==WINMEM_MAGIC
bf30: 32 20 29 3b 0a 0a 20 20 69 66 28 20 70 57 69 6e  2 );..  if( pWin
bf40: 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 29  MemData->hHeap )
bf50: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 57  {.    assert( pW
bf60: 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70  inMemData->hHeap
bf70: 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  !=INVALID_HANDLE
bf80: 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66 20 21 53  _VALUE );.#if !S
bf90: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26  QLITE_OS_WINRT &
bfa0: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
bfb0: 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41  _WIN32_MALLOC_VA
bfc0: 4c 49 44 41 54 45 29 0a 20 20 20 20 61 73 73 65  LIDATE).    asse
bfd0: 72 74 28 20 6f 73 48 65 61 70 56 61 6c 69 64 61  rt( osHeapValida
bfe0: 74 65 28 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e  te(pWinMemData->
bff0: 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49  hHeap, SQLITE_WI
c000: 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20  N32_HEAP_FLAGS, 
c010: 4e 55 4c 4c 29 20 29 3b 0a 23 65 6e 64 69 66 0a  NULL) );.#endif.
c020: 20 20 20 20 69 66 28 20 70 57 69 6e 4d 65 6d 44      if( pWinMemD
c030: 61 74 61 2d 3e 62 4f 77 6e 65 64 20 29 7b 0a 20  ata->bOwned ){. 
c040: 20 20 20 20 20 69 66 28 20 21 6f 73 48 65 61 70       if( !osHeap
c050: 44 65 73 74 72 6f 79 28 70 57 69 6e 4d 65 6d 44  Destroy(pWinMemD
c060: 61 74 61 2d 3e 68 48 65 61 70 29 20 29 7b 0a 20  ata->hHeap) ){. 
c070: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c         sqlite3_l
c080: 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c  og(SQLITE_NOMEM,
c090: 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65 61 70   "failed to Heap
c0a0: 44 65 73 74 72 6f 79 20 28 25 6c 75 29 2c 20 68  Destroy (%lu), h
c0b0: 65 61 70 3d 25 70 22 2c 0a 20 20 20 20 20 20 20  eap=%p",.       
c0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47               osG
c0d0: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 28  etLastError(), (
c0e0: 76 6f 69 64 2a 29 70 57 69 6e 4d 65 6d 44 61 74  void*)pWinMemDat
c0f0: 61 2d 3e 68 48 65 61 70 29 3b 0a 20 20 20 20 20  a->hHeap);.     
c100: 20 7d 0a 20 20 20 20 20 20 70 57 69 6e 4d 65 6d   }.      pWinMem
c110: 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20 3d 20 46  Data->bOwned = F
c120: 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ALSE;.    }.    
c130: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65  pWinMemData->hHe
c140: 61 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 7d  ap = NULL;.  }.}
c150: 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70 75 6c 61 74 65  ../*.** Populate
c160: 20 74 68 65 20 6c 6f 77 2d 6c 65 76 65 6c 20 6d   the low-level m
c170: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
c180: 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65   function pointe
c190: 72 73 20 69 6e 0a 2a 2a 20 73 71 6c 69 74 65 33  rs in.** sqlite3
c1a0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 20 77  GlobalConfig.m w
c1b0: 69 74 68 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  ith pointers to 
c1c0: 74 68 65 20 72 6f 75 74 69 6e 65 73 20 69 6e 20  the routines in 
c1d0: 74 68 69 73 20 66 69 6c 65 2e 20 54 68 65 0a 2a  this file. The.*
c1e0: 2a 20 61 72 67 75 6d 65 6e 74 73 20 73 70 65 63  * arguments spec
c1f0: 69 66 79 20 74 68 65 20 62 6c 6f 63 6b 20 6f 66  ify the block of
c200: 20 6d 65 6d 6f 72 79 20 74 6f 20 6d 61 6e 61 67   memory to manag
c210: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
c220: 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61  utine is only ca
c230: 6c 6c 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f  lled by sqlite3_
c240: 63 6f 6e 66 69 67 28 29 2c 20 61 6e 64 20 74 68  config(), and th
c250: 65 72 65 66 6f 72 65 0a 2a 2a 20 69 73 20 6e 6f  erefore.** is no
c260: 74 20 72 65 71 75 69 72 65 64 20 74 6f 20 62 65  t required to be
c270: 20 74 68 72 65 61 64 73 61 66 65 20 28 69 74 20   threadsafe (it 
c280: 69 73 20 6e 6f 74 29 2e 0a 2a 2f 0a 63 6f 6e 73  is not)..*/.cons
c290: 74 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65  t sqlite3_mem_me
c2a0: 74 68 6f 64 73 20 2a 73 71 6c 69 74 65 33 4d 65  thods *sqlite3Me
c2b0: 6d 47 65 74 57 69 6e 33 32 28 76 6f 69 64 29 7b  mGetWin32(void){
c2c0: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
c2d0: 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68  sqlite3_mem_meth
c2e0: 6f 64 73 20 77 69 6e 4d 65 6d 4d 65 74 68 6f 64  ods winMemMethod
c2f0: 73 20 3d 20 7b 0a 20 20 20 20 77 69 6e 4d 65 6d  s = {.    winMem
c300: 4d 61 6c 6c 6f 63 2c 0a 20 20 20 20 77 69 6e 4d  Malloc,.    winM
c310: 65 6d 46 72 65 65 2c 0a 20 20 20 20 77 69 6e 4d  emFree,.    winM
c320: 65 6d 52 65 61 6c 6c 6f 63 2c 0a 20 20 20 20 77  emRealloc,.    w
c330: 69 6e 4d 65 6d 53 69 7a 65 2c 0a 20 20 20 20 77  inMemSize,.    w
c340: 69 6e 4d 65 6d 52 6f 75 6e 64 75 70 2c 0a 20 20  inMemRoundup,.  
c350: 20 20 77 69 6e 4d 65 6d 49 6e 69 74 2c 0a 20 20    winMemInit,.  
c360: 20 20 77 69 6e 4d 65 6d 53 68 75 74 64 6f 77 6e    winMemShutdown
c370: 2c 0a 20 20 20 20 26 77 69 6e 5f 6d 65 6d 5f 64  ,.    &win_mem_d
c380: 61 74 61 0a 20 20 7d 3b 0a 20 20 72 65 74 75 72  ata.  };.  retur
c390: 6e 20 26 77 69 6e 4d 65 6d 4d 65 74 68 6f 64 73  n &winMemMethods
c3a0: 3b 0a 7d 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65  ;.}..void sqlite
c3b0: 33 4d 65 6d 53 65 74 44 65 66 61 75 6c 74 28 76  3MemSetDefault(v
c3c0: 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  oid){.  sqlite3_
c3d0: 63 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f 43 4f  config(SQLITE_CO
c3e0: 4e 46 49 47 5f 4d 41 4c 4c 4f 43 2c 20 73 71 6c  NFIG_MALLOC, sql
c3f0: 69 74 65 33 4d 65 6d 47 65 74 57 69 6e 33 32 28  ite3MemGetWin32(
c400: 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ));.}.#endif /* 
c410: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c  SQLITE_WIN32_MAL
c420: 4c 4f 43 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f  LOC */../*.** Co
c430: 6e 76 65 72 74 20 61 20 55 54 46 2d 38 20 73 74  nvert a UTF-8 st
c440: 72 69 6e 67 20 74 6f 20 4d 69 63 72 6f 73 6f 66  ring to Microsof
c450: 74 20 55 6e 69 63 6f 64 65 20 28 55 54 46 2d 31  t Unicode (UTF-1
c460: 36 3f 29 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65  6?)..**.** Space
c470: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74   to hold the ret
c480: 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73 20  urned string is 
c490: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61  obtained from ma
c4a0: 6c 6c 6f 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lloc..*/.static 
c4b0: 4c 50 57 53 54 52 20 77 69 6e 55 74 66 38 54 6f  LPWSTR winUtf8To
c4c0: 55 6e 69 63 6f 64 65 28 63 6f 6e 73 74 20 63 68  Unicode(const ch
c4d0: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a  ar *zFilename){.
c4e0: 20 20 69 6e 74 20 6e 43 68 61 72 3b 0a 20 20 4c    int nChar;.  L
c4f0: 50 57 53 54 52 20 7a 57 69 64 65 46 69 6c 65 6e  PWSTR zWideFilen
c500: 61 6d 65 3b 0a 0a 20 20 6e 43 68 61 72 20 3d 20  ame;..  nChar = 
c510: 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64  osMultiByteToWid
c520: 65 43 68 61 72 28 43 50 5f 55 54 46 38 2c 20 30  eChar(CP_UTF8, 0
c530: 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c  , zFilename, -1,
c540: 20 4e 55 4c 4c 2c 20 30 29 3b 0a 20 20 69 66 28   NULL, 0);.  if(
c550: 20 6e 43 68 61 72 3d 3d 30 20 29 7b 0a 20 20 20   nChar==0 ){.   
c560: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
c570: 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 20 3d   zWideFilename =
c580: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
c590: 72 6f 28 20 6e 43 68 61 72 2a 73 69 7a 65 6f 66  ro( nChar*sizeof
c5a0: 28 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 5b 30  (zWideFilename[0
c5b0: 5d 29 20 29 3b 0a 20 20 69 66 28 20 7a 57 69 64  ]) );.  if( zWid
c5c0: 65 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a  eFilename==0 ){.
c5d0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
c5e0: 7d 0a 20 20 6e 43 68 61 72 20 3d 20 6f 73 4d 75  }.  nChar = osMu
c5f0: 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43 68 61  ltiByteToWideCha
c600: 72 28 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a 46  r(CP_UTF8, 0, zF
c610: 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a 57 69  ilename, -1, zWi
c620: 64 65 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20  deFilename,.    
c630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c640: 20 20 20 20 20 20 20 20 20 20 20 20 6e 43 68 61              nCha
c650: 72 29 3b 0a 20 20 69 66 28 20 6e 43 68 61 72 3d  r);.  if( nChar=
c660: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
c670: 33 5f 66 72 65 65 28 7a 57 69 64 65 46 69 6c 65  3_free(zWideFile
c680: 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 57 69 64 65  name);.    zWide
c690: 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20  Filename = 0;.  
c6a0: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 57 69 64 65  }.  return zWide
c6b0: 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a  Filename;.}../*.
c6c0: 2a 2a 20 43 6f 6e 76 65 72 74 20 4d 69 63 72 6f  ** Convert Micro
c6d0: 73 6f 66 74 20 55 6e 69 63 6f 64 65 20 74 6f 20  soft Unicode to 
c6e0: 55 54 46 2d 38 2e 20 20 53 70 61 63 65 20 74 6f  UTF-8.  Space to
c6f0: 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e   hold the return
c700: 65 64 20 73 74 72 69 6e 67 20 69 73 0a 2a 2a 20  ed string is.** 
c710: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
c720: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a  lite3_malloc()..
c730: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
c740: 77 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66 38  winUnicodeToUtf8
c750: 28 4c 50 43 57 53 54 52 20 7a 57 69 64 65 46 69  (LPCWSTR zWideFi
c760: 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 6e  lename){.  int n
c770: 42 79 74 65 3b 0a 20 20 63 68 61 72 20 2a 7a 46  Byte;.  char *zF
c780: 69 6c 65 6e 61 6d 65 3b 0a 0a 20 20 6e 42 79 74  ilename;..  nByt
c790: 65 20 3d 20 6f 73 57 69 64 65 43 68 61 72 54 6f  e = osWideCharTo
c7a0: 4d 75 6c 74 69 42 79 74 65 28 43 50 5f 55 54 46  MultiByte(CP_UTF
c7b0: 38 2c 20 30 2c 20 7a 57 69 64 65 46 69 6c 65 6e  8, 0, zWideFilen
c7c0: 61 6d 65 2c 20 2d 31 2c 20 30 2c 20 30 2c 20 30  ame, -1, 0, 0, 0
c7d0: 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e 42 79 74  , 0);.  if( nByt
c7e0: 65 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20 72 65  e == 0 ){.    re
c7f0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 46  turn 0;.  }.  zF
c800: 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ilename = sqlite
c810: 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42 79  3MallocZero( nBy
c820: 74 65 20 29 3b 0a 20 20 69 66 28 20 7a 46 69 6c  te );.  if( zFil
c830: 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  ename==0 ){.    
c840: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
c850: 6e 42 79 74 65 20 3d 20 6f 73 57 69 64 65 43 68  nByte = osWideCh
c860: 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 28 43 50  arToMultiByte(CP
c870: 5f 55 54 46 38 2c 20 30 2c 20 7a 57 69 64 65 46  _UTF8, 0, zWideF
c880: 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a 46 69  ilename, -1, zFi
c890: 6c 65 6e 61 6d 65 2c 20 6e 42 79 74 65 2c 0a 20  lename, nByte,. 
c8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
c8c0: 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e 42 79 74  , 0);.  if( nByt
c8d0: 65 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20 73 71  e == 0 ){.    sq
c8e0: 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 69 6c 65  lite3_free(zFile
c8f0: 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 46 69 6c 65  name);.    zFile
c900: 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  name = 0;.  }.  
c910: 72 65 74 75 72 6e 20 7a 46 69 6c 65 6e 61 6d 65  return zFilename
c920: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  ;.}../*.** Conve
c930: 72 74 20 61 6e 20 41 4e 53 49 20 73 74 72 69 6e  rt an ANSI strin
c940: 67 20 74 6f 20 4d 69 63 72 6f 73 6f 66 74 20 55  g to Microsoft U
c950: 6e 69 63 6f 64 65 2c 20 62 61 73 65 64 20 6f 6e  nicode, based on
c960: 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20   the.** current 
c970: 63 6f 64 65 70 61 67 65 20 73 65 74 74 69 6e 67  codepage setting
c980: 73 20 66 6f 72 20 66 69 6c 65 20 61 70 69 73 2e  s for file apis.
c990: 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20  .**.** Space to 
c9a0: 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65  hold the returne
c9b0: 64 20 73 74 72 69 6e 67 20 69 73 20 6f 62 74 61  d string is obta
c9c0: 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20 73 71 6c  ined.** from sql
c9d0: 69 74 65 33 5f 6d 61 6c 6c 6f 63 2e 0a 2a 2f 0a  ite3_malloc..*/.
c9e0: 73 74 61 74 69 63 20 4c 50 57 53 54 52 20 77 69  static LPWSTR wi
c9f0: 6e 4d 62 63 73 54 6f 55 6e 69 63 6f 64 65 28 63  nMbcsToUnicode(c
ca00: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
ca10: 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 6e 42 79  name){.  int nBy
ca20: 74 65 3b 0a 20 20 4c 50 57 53 54 52 20 7a 4d 62  te;.  LPWSTR zMb
ca30: 63 73 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 69 6e  csFilename;.  in
ca40: 74 20 63 6f 64 65 70 61 67 65 20 3d 20 6f 73 41  t codepage = osA
ca50: 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49 28 29  reFileApisANSI()
ca60: 20 3f 20 43 50 5f 41 43 50 20 3a 20 43 50 5f 4f   ? CP_ACP : CP_O
ca70: 45 4d 43 50 3b 0a 0a 20 20 6e 42 79 74 65 20 3d  EMCP;..  nByte =
ca80: 20 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f 57 69   osMultiByteToWi
ca90: 64 65 43 68 61 72 28 63 6f 64 65 70 61 67 65 2c  deChar(codepage,
caa0: 20 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d   0, zFilename, -
cab0: 31 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20  1, NULL,.       
cac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cad0: 20 20 20 20 20 20 20 20 20 30 29 2a 73 69 7a 65           0)*size
cae0: 6f 66 28 57 43 48 41 52 29 3b 0a 20 20 69 66 28  of(WCHAR);.  if(
caf0: 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20   nByte==0 ){.   
cb00: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
cb10: 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 20 3d   zMbcsFilename =
cb20: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
cb30: 72 6f 28 20 6e 42 79 74 65 2a 73 69 7a 65 6f 66  ro( nByte*sizeof
cb40: 28 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 5b 30  (zMbcsFilename[0
cb50: 5d 29 20 29 3b 0a 20 20 69 66 28 20 7a 4d 62 63  ]) );.  if( zMbc
cb60: 73 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a  sFilename==0 ){.
cb70: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
cb80: 7d 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73 4d 75  }.  nByte = osMu
cb90: 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43 68 61  ltiByteToWideCha
cba0: 72 28 63 6f 64 65 70 61 67 65 2c 20 30 2c 20 7a  r(codepage, 0, z
cbb0: 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a 4d  Filename, -1, zM
cbc0: 62 63 73 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20  bcsFilename,.   
cbd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cbe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 42 79               nBy
cbf0: 74 65 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65  te);.  if( nByte
cc00: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
cc10: 65 33 5f 66 72 65 65 28 7a 4d 62 63 73 46 69 6c  e3_free(zMbcsFil
cc20: 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 4d 62 63  ename);.    zMbc
cc30: 73 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20  sFilename = 0;. 
cc40: 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4d 62 63   }.  return zMbc
cc50: 73 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a  sFilename;.}../*
cc60: 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 4d 69 63 72  .** Convert Micr
cc70: 6f 73 6f 66 74 20 55 6e 69 63 6f 64 65 20 74 6f  osoft Unicode to
cc80: 20 6d 75 6c 74 69 2d 62 79 74 65 20 63 68 61 72   multi-byte char
cc90: 61 63 74 65 72 20 73 74 72 69 6e 67 2c 20 62 61  acter string, ba
cca0: 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 75 73  sed on the.** us
ccb0: 65 72 27 73 20 41 4e 53 49 20 63 6f 64 65 70 61  er's ANSI codepa
ccc0: 67 65 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20  ge..**.** Space 
ccd0: 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75  to hold the retu
cce0: 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73 20 6f  rned string is o
ccf0: 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20  btained from.** 
cd00: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29  sqlite3_malloc()
cd10: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
cd20: 20 2a 77 69 6e 55 6e 69 63 6f 64 65 54 6f 4d 62   *winUnicodeToMb
cd30: 63 73 28 4c 50 43 57 53 54 52 20 7a 57 69 64 65  cs(LPCWSTR zWide
cd40: 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74  Filename){.  int
cd50: 20 6e 42 79 74 65 3b 0a 20 20 63 68 61 72 20 2a   nByte;.  char *
cd60: 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 69 6e 74  zFilename;.  int
cd70: 20 63 6f 64 65 70 61 67 65 20 3d 20 6f 73 41 72   codepage = osAr
cd80: 65 46 69 6c 65 41 70 69 73 41 4e 53 49 28 29 20  eFileApisANSI() 
cd90: 3f 20 43 50 5f 41 43 50 20 3a 20 43 50 5f 4f 45  ? CP_ACP : CP_OE
cda0: 4d 43 50 3b 0a 0a 20 20 6e 42 79 74 65 20 3d 20  MCP;..  nByte = 
cdb0: 6f 73 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74  osWideCharToMult
cdc0: 69 42 79 74 65 28 63 6f 64 65 70 61 67 65 2c 20  iByte(codepage, 
cdd0: 30 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65  0, zWideFilename
cde0: 2c 20 2d 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30  , -1, 0, 0, 0, 0
cdf0: 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 20 3d  );.  if( nByte =
ce00: 3d 20 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  = 0 ){.    retur
ce10: 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c 65  n 0;.  }.  zFile
ce20: 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 61  name = sqlite3Ma
ce30: 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42 79 74 65 20  llocZero( nByte 
ce40: 29 3b 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61  );.  if( zFilena
ce50: 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  me==0 ){.    ret
ce60: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 42 79  urn 0;.  }.  nBy
ce70: 74 65 20 3d 20 6f 73 57 69 64 65 43 68 61 72 54  te = osWideCharT
ce80: 6f 4d 75 6c 74 69 42 79 74 65 28 63 6f 64 65 70  oMultiByte(codep
ce90: 61 67 65 2c 20 30 2c 20 7a 57 69 64 65 46 69 6c  age, 0, zWideFil
cea0: 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a 46 69 6c 65  ename, -1, zFile
ceb0: 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20  name,.          
cec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ced0: 20 20 20 20 20 20 6e 42 79 74 65 2c 20 30 2c 20        nByte, 0, 
cee0: 30 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 20  0);.  if( nByte 
cef0: 3d 3d 20 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  == 0 ){.    sqli
cf00: 74 65 33 5f 66 72 65 65 28 7a 46 69 6c 65 6e 61  te3_free(zFilena
cf10: 6d 65 29 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61  me);.    zFilena
cf20: 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  me = 0;.  }.  re
cf30: 74 75 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a  turn zFilename;.
cf40: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  }../*.** Convert
cf50: 20 6d 75 6c 74 69 62 79 74 65 20 63 68 61 72 61   multibyte chara
cf60: 63 74 65 72 20 73 74 72 69 6e 67 20 74 6f 20 55  cter string to U
cf70: 54 46 2d 38 2e 20 20 53 70 61 63 65 20 74 6f 20  TF-8.  Space to 
cf80: 68 6f 6c 64 20 74 68 65 0a 2a 2a 20 72 65 74 75  hold the.** retu
cf90: 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73 20 6f  rned string is o
cfa0: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
cfb0: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a  ite3_malloc()..*
cfc0: 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f  /.char *sqlite3_
cfd0: 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74  win32_mbcs_to_ut
cfe0: 66 38 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  f8(const char *z
cff0: 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 63 68 61  Filename){.  cha
d000: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 55 74 66 38  r *zFilenameUtf8
d010: 3b 0a 20 20 4c 50 57 53 54 52 20 7a 54 6d 70 57  ;.  LPWSTR zTmpW
d020: 69 64 65 3b 0a 0a 20 20 7a 54 6d 70 57 69 64 65  ide;..  zTmpWide
d030: 20 3d 20 77 69 6e 4d 62 63 73 54 6f 55 6e 69 63   = winMbcsToUnic
d040: 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  ode(zFilename);.
d050: 20 20 69 66 28 20 7a 54 6d 70 57 69 64 65 3d 3d    if( zTmpWide==
d060: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
d070: 30 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c 65 6e 61  0;.  }.  zFilena
d080: 6d 65 55 74 66 38 20 3d 20 77 69 6e 55 6e 69 63  meUtf8 = winUnic
d090: 6f 64 65 54 6f 55 74 66 38 28 7a 54 6d 70 57 69  odeToUtf8(zTmpWi
d0a0: 64 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  de);.  sqlite3_f
d0b0: 72 65 65 28 7a 54 6d 70 57 69 64 65 29 3b 0a 20  ree(zTmpWide);. 
d0c0: 20 72 65 74 75 72 6e 20 7a 46 69 6c 65 6e 61 6d   return zFilenam
d0d0: 65 55 74 66 38 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eUtf8;.}../*.** 
d0e0: 43 6f 6e 76 65 72 74 20 55 54 46 2d 38 20 74 6f  Convert UTF-8 to
d0f0: 20 6d 75 6c 74 69 62 79 74 65 20 63 68 61 72 61   multibyte chara
d100: 63 74 65 72 20 73 74 72 69 6e 67 2e 20 20 53 70  cter string.  Sp
d110: 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a  ace to hold the.
d120: 2a 2a 20 72 65 74 75 72 6e 65 64 20 73 74 72 69  ** returned stri
d130: 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66  ng is obtained f
d140: 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  rom sqlite3_mall
d150: 6f 63 28 29 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73  oc()..*/.char *s
d160: 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75 74 66  qlite3_win32_utf
d170: 38 5f 74 6f 5f 6d 62 63 73 28 63 6f 6e 73 74 20  8_to_mbcs(const 
d180: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29  char *zFilename)
d190: 7b 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  {.  char *zFilen
d1a0: 61 6d 65 4d 62 63 73 3b 0a 20 20 4c 50 57 53 54  ameMbcs;.  LPWST
d1b0: 52 20 7a 54 6d 70 57 69 64 65 3b 0a 0a 20 20 7a  R zTmpWide;..  z
d1c0: 54 6d 70 57 69 64 65 20 3d 20 77 69 6e 55 74 66  TmpWide = winUtf
d1d0: 38 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65  8ToUnicode(zFile
d1e0: 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 54 6d  name);.  if( zTm
d1f0: 70 57 69 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20  pWide==0 ){.    
d200: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
d210: 7a 46 69 6c 65 6e 61 6d 65 4d 62 63 73 20 3d 20  zFilenameMbcs = 
d220: 77 69 6e 55 6e 69 63 6f 64 65 54 6f 4d 62 63 73  winUnicodeToMbcs
d230: 28 7a 54 6d 70 57 69 64 65 29 3b 0a 20 20 73 71  (zTmpWide);.  sq
d240: 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 6d 70 57  lite3_free(zTmpW
d250: 69 64 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a  ide);.  return z
d260: 46 69 6c 65 6e 61 6d 65 4d 62 63 73 3b 0a 7d 0a  FilenameMbcs;.}.
d270: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
d280: 74 69 6f 6e 20 73 65 74 73 20 74 68 65 20 64 61  tion sets the da
d290: 74 61 20 64 69 72 65 63 74 6f 72 79 20 6f 72 20  ta directory or 
d2a0: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 64 69  the temporary di
d2b0: 72 65 63 74 6f 72 79 20 62 61 73 65 64 20 6f 6e  rectory based on
d2c0: 0a 2a 2a 20 74 68 65 20 70 72 6f 76 69 64 65 64  .** the provided
d2d0: 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 54 68 65   arguments.  The
d2e0: 20 74 79 70 65 20 61 72 67 75 6d 65 6e 74 20 6d   type argument m
d2f0: 75 73 74 20 62 65 20 31 20 69 6e 20 6f 72 64 65  ust be 1 in orde
d300: 72 20 74 6f 20 73 65 74 20 74 68 65 0a 2a 2a 20  r to set the.** 
d310: 64 61 74 61 20 64 69 72 65 63 74 6f 72 79 20 6f  data directory o
d320: 72 20 32 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  r 2 in order to 
d330: 73 65 74 20 74 68 65 20 74 65 6d 70 6f 72 61 72  set the temporar
d340: 79 20 64 69 72 65 63 74 6f 72 79 2e 20 20 54 68  y directory.  Th
d350: 65 20 7a 56 61 6c 75 65 0a 2a 2a 20 61 72 67 75  e zValue.** argu
d360: 6d 65 6e 74 20 69 73 20 74 68 65 20 6e 61 6d 65  ment is the name
d370: 20 6f 66 20 74 68 65 20 64 69 72 65 63 74 6f 72   of the director
d380: 79 20 74 6f 20 75 73 65 2e 20 20 54 68 65 20 72  y to use.  The r
d390: 65 74 75 72 6e 20 76 61 6c 75 65 20 77 69 6c 6c  eturn value will
d3a0: 20 62 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b   be.** SQLITE_OK
d3b0: 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2e 0a   if successful..
d3c0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 77  */.int sqlite3_w
d3d0: 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f  in32_set_directo
d3e0: 72 79 28 44 57 4f 52 44 20 74 79 70 65 2c 20 4c  ry(DWORD type, L
d3f0: 50 43 57 53 54 52 20 7a 56 61 6c 75 65 29 7b 0a  PCWSTR zValue){.
d400: 20 20 63 68 61 72 20 2a 2a 70 70 44 69 72 65 63    char **ppDirec
d410: 74 6f 72 79 20 3d 20 30 3b 0a 23 69 66 6e 64 65  tory = 0;.#ifnde
d420: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
d430: 54 4f 49 4e 49 54 0a 20 20 69 6e 74 20 72 63 20  TOINIT.  int rc 
d440: 3d 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61  = sqlite3_initia
d450: 6c 69 7a 65 28 29 3b 0a 20 20 69 66 28 20 72 63  lize();.  if( rc
d460: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65   ) return rc;.#e
d470: 6e 64 69 66 0a 20 20 69 66 28 20 74 79 70 65 3d  ndif.  if( type=
d480: 3d 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 41  =SQLITE_WIN32_DA
d490: 54 41 5f 44 49 52 45 43 54 4f 52 59 5f 54 59 50  TA_DIRECTORY_TYP
d4a0: 45 20 29 7b 0a 20 20 20 20 70 70 44 69 72 65 63  E ){.    ppDirec
d4b0: 74 6f 72 79 20 3d 20 26 73 71 6c 69 74 65 33 5f  tory = &sqlite3_
d4c0: 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79 3b 0a  data_directory;.
d4d0: 20 20 7d 65 6c 73 65 20 69 66 28 20 74 79 70 65    }else if( type
d4e0: 3d 3d 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 54  ==SQLITE_WIN32_T
d4f0: 45 4d 50 5f 44 49 52 45 43 54 4f 52 59 5f 54 59  EMP_DIRECTORY_TY
d500: 50 45 20 29 7b 0a 20 20 20 20 70 70 44 69 72 65  PE ){.    ppDire
d510: 63 74 6f 72 79 20 3d 20 26 73 71 6c 69 74 65 33  ctory = &sqlite3
d520: 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 3b  _temp_directory;
d530: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21  .  }.  assert( !
d540: 70 70 44 69 72 65 63 74 6f 72 79 20 7c 7c 20 74  ppDirectory || t
d550: 79 70 65 3d 3d 53 51 4c 49 54 45 5f 57 49 4e 33  ype==SQLITE_WIN3
d560: 32 5f 44 41 54 41 5f 44 49 52 45 43 54 4f 52 59  2_DATA_DIRECTORY
d570: 5f 54 59 50 45 0a 20 20 20 20 20 20 20 20 20 20  _TYPE.          
d580: 7c 7c 20 74 79 70 65 3d 3d 53 51 4c 49 54 45 5f  || type==SQLITE_
d590: 57 49 4e 33 32 5f 54 45 4d 50 5f 44 49 52 45 43  WIN32_TEMP_DIREC
d5a0: 54 4f 52 59 5f 54 59 50 45 0a 20 20 29 3b 0a 20  TORY_TYPE.  );. 
d5b0: 20 61 73 73 65 72 74 28 20 21 70 70 44 69 72 65   assert( !ppDire
d5c0: 63 74 6f 72 79 20 7c 7c 20 73 71 6c 69 74 65 33  ctory || sqlite3
d5d0: 4d 65 6d 64 65 62 75 67 48 61 73 54 79 70 65 28  MemdebugHasType(
d5e0: 2a 70 70 44 69 72 65 63 74 6f 72 79 2c 20 4d 45  *ppDirectory, ME
d5f0: 4d 54 59 50 45 5f 48 45 41 50 29 20 29 3b 0a 20  MTYPE_HEAP) );. 
d600: 20 69 66 28 20 70 70 44 69 72 65 63 74 6f 72 79   if( ppDirectory
d610: 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 56   ){.    char *zV
d620: 61 6c 75 65 55 74 66 38 20 3d 20 30 3b 0a 20 20  alueUtf8 = 0;.  
d630: 20 20 69 66 28 20 7a 56 61 6c 75 65 20 26 26 20    if( zValue && 
d640: 7a 56 61 6c 75 65 5b 30 5d 20 29 7b 0a 20 20 20  zValue[0] ){.   
d650: 20 20 20 7a 56 61 6c 75 65 55 74 66 38 20 3d 20     zValueUtf8 = 
d660: 77 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66 38  winUnicodeToUtf8
d670: 28 7a 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20  (zValue);.      
d680: 69 66 20 28 20 7a 56 61 6c 75 65 55 74 66 38 3d  if ( zValueUtf8=
d690: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  =0 ){.        re
d6a0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
d6b0: 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  M;.      }.    }
d6c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
d6d0: 65 28 2a 70 70 44 69 72 65 63 74 6f 72 79 29 3b  e(*ppDirectory);
d6e0: 0a 20 20 20 20 2a 70 70 44 69 72 65 63 74 6f 72  .    *ppDirector
d6f0: 79 20 3d 20 7a 56 61 6c 75 65 55 74 66 38 3b 0a  y = zValueUtf8;.
d700: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
d710: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  E_OK;.  }.  retu
d720: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
d730: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 72 65  .}../*.** The re
d740: 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 77 69  turn value of wi
d750: 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67  nGetLastErrorMsg
d760: 0a 2a 2a 20 69 73 20 7a 65 72 6f 20 69 66 20 74  .** is zero if t
d770: 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  he error message
d780: 20 66 69 74 73 20 69 6e 20 74 68 65 20 62 75 66   fits in the buf
d790: 66 65 72 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f  fer, or non-zero
d7a0: 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65 20 28 69  .** otherwise (i
d7b0: 66 20 74 68 65 20 6d 65 73 73 61 67 65 20 77 61  f the message wa
d7c0: 73 20 74 72 75 6e 63 61 74 65 64 29 2e 0a 2a 2f  s truncated)..*/
d7d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 47  .static int winG
d7e0: 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67 28 44  etLastErrorMsg(D
d7f0: 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 2c 20  WORD lastErrno, 
d800: 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a  int nBuf, char *
d810: 7a 42 75 66 29 7b 0a 20 20 2f 2a 20 46 6f 72 6d  zBuf){.  /* Form
d820: 61 74 4d 65 73 73 61 67 65 20 72 65 74 75 72 6e  atMessage return
d830: 73 20 30 20 6f 6e 20 66 61 69 6c 75 72 65 2e 20  s 0 on failure. 
d840: 20 4f 74 68 65 72 77 69 73 65 20 69 74 0a 20 20   Otherwise it.  
d850: 2a 2a 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e  ** returns the n
d860: 75 6d 62 65 72 20 6f 66 20 54 43 48 41 52 73 20  umber of TCHARs 
d870: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6f  written to the o
d880: 75 74 70 75 74 0a 20 20 2a 2a 20 62 75 66 66 65  utput.  ** buffe
d890: 72 2c 20 65 78 63 6c 75 64 69 6e 67 20 74 68 65  r, excluding the
d8a0: 20 74 65 72 6d 69 6e 61 74 69 6e 67 20 6e 75 6c   terminating nul
d8b0: 6c 20 63 68 61 72 2e 0a 20 20 2a 2f 0a 20 20 44  l char..  */.  D
d8c0: 57 4f 52 44 20 64 77 4c 65 6e 20 3d 20 30 3b 0a  WORD dwLen = 0;.
d8d0: 20 20 63 68 61 72 20 2a 7a 4f 75 74 20 3d 20 30    char *zOut = 0
d8e0: 3b 0a 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28  ;..  if( osIsNT(
d8f0: 29 20 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f  ) ){.#if SQLITE_
d900: 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 57 43 48  OS_WINRT.    WCH
d910: 41 52 20 7a 54 65 6d 70 57 69 64 65 5b 53 51 4c  AR zTempWide[SQL
d920: 49 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 45 52  ITE_WIN32_MAX_ER
d930: 52 4d 53 47 5f 43 48 41 52 53 2b 31 5d 3b 0a 20  RMSG_CHARS+1];. 
d940: 20 20 20 64 77 4c 65 6e 20 3d 20 6f 73 46 6f 72     dwLen = osFor
d950: 6d 61 74 4d 65 73 73 61 67 65 57 28 46 4f 52 4d  matMessageW(FORM
d960: 41 54 5f 4d 45 53 53 41 47 45 5f 46 52 4f 4d 5f  AT_MESSAGE_FROM_
d970: 53 59 53 54 45 4d 20 7c 0a 20 20 20 20 20 20 20  SYSTEM |.       
d980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d990: 20 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d 45 53        FORMAT_MES
d9a0: 53 41 47 45 5f 49 47 4e 4f 52 45 5f 49 4e 53 45  SAGE_IGNORE_INSE
d9b0: 52 54 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20  RTS,.           
d9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d9d0: 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20    NULL,.        
d9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d9f0: 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 2c 0a       lastErrno,.
da00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da10: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 0a               0,.
da20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da30: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 65               zTe
da40: 6d 70 57 69 64 65 2c 0a 20 20 20 20 20 20 20 20  mpWide,.        
da50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da60: 20 20 20 20 20 53 51 4c 49 54 45 5f 57 49 4e 33       SQLITE_WIN3
da70: 32 5f 4d 41 58 5f 45 52 52 4d 53 47 5f 43 48 41  2_MAX_ERRMSG_CHA
da80: 52 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  RS,.            
da90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
daa0: 20 30 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 4c   0);.#else.    L
dab0: 50 57 53 54 52 20 7a 54 65 6d 70 57 69 64 65 20  PWSTR zTempWide 
dac0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 64 77 4c 65  = NULL;.    dwLe
dad0: 6e 20 3d 20 6f 73 46 6f 72 6d 61 74 4d 65 73 73  n = osFormatMess
dae0: 61 67 65 57 28 46 4f 52 4d 41 54 5f 4d 45 53 53  ageW(FORMAT_MESS
daf0: 41 47 45 5f 41 4c 4c 4f 43 41 54 45 5f 42 55 46  AGE_ALLOCATE_BUF
db00: 46 45 52 20 7c 0a 20 20 20 20 20 20 20 20 20 20  FER |.          
db10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db20: 20 20 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47     FORMAT_MESSAG
db30: 45 5f 46 52 4f 4d 5f 53 59 53 54 45 4d 20 7c 0a  E_FROM_SYSTEM |.
db40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db50: 20 20 20 20 20 20 20 20 20 20 20 20 20 46 4f 52               FOR
db60: 4d 41 54 5f 4d 45 53 53 41 47 45 5f 49 47 4e 4f  MAT_MESSAGE_IGNO
db70: 52 45 5f 49 4e 53 45 52 54 53 2c 0a 20 20 20 20  RE_INSERTS,.    
db80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db90: 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 0a 20           NULL,. 
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 20 6c 61 73 74              last
dbc0: 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  Errno,.         
dbd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dbe0: 20 20 20 20 30 2c 0a 20 20 20 20 20 20 20 20 20      0,.         
dbf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc00: 20 20 20 20 28 4c 50 57 53 54 52 29 20 26 7a 54      (LPWSTR) &zT
dc10: 65 6d 70 57 69 64 65 2c 0a 20 20 20 20 20 20 20  empWide,.       
dc20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc30: 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20 20        0,.       
dc40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc50: 20 20 20 20 20 20 30 29 3b 0a 23 65 6e 64 69 66        0);.#endif
dc60: 0a 20 20 20 20 69 66 28 20 64 77 4c 65 6e 20 3e  .    if( dwLen >
dc70: 20 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 61   0 ){.      /* a
dc80: 6c 6c 6f 63 61 74 65 20 61 20 62 75 66 66 65 72  llocate a buffer
dc90: 20 61 6e 64 20 63 6f 6e 76 65 72 74 20 74 6f 20   and convert to 
dca0: 55 54 46 38 20 2a 2f 0a 20 20 20 20 20 20 73 71  UTF8 */.      sq
dcb0: 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
dcc0: 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20  Malloc();.      
dcd0: 7a 4f 75 74 20 3d 20 77 69 6e 55 6e 69 63 6f 64  zOut = winUnicod
dce0: 65 54 6f 55 74 66 38 28 7a 54 65 6d 70 57 69 64  eToUtf8(zTempWid
dcf0: 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
dd00: 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
dd10: 28 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  ();.#if !SQLITE_
dd20: 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 20 20 2f  OS_WINRT.      /
dd30: 2a 20 66 72 65 65 20 74 68 65 20 73 79 73 74 65  * free the syste
dd40: 6d 20 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74  m buffer allocat
dd50: 65 64 20 62 79 20 46 6f 72 6d 61 74 4d 65 73 73  ed by FormatMess
dd60: 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 6f 73 4c  age */.      osL
dd70: 6f 63 61 6c 46 72 65 65 28 7a 54 65 6d 70 57 69  ocalFree(zTempWi
dd80: 64 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  de);.#endif.    
dd90: 7d 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c  }.  }.#ifdef SQL
dda0: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
ddb0: 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 63  SI.  else{.    c
ddc0: 68 61 72 20 2a 7a 54 65 6d 70 20 3d 20 4e 55 4c  har *zTemp = NUL
ddd0: 4c 3b 0a 20 20 20 20 64 77 4c 65 6e 20 3d 20 6f  L;.    dwLen = o
dde0: 73 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 41 28  sFormatMessageA(
ddf0: 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 41  FORMAT_MESSAGE_A
de00: 4c 4c 4f 43 41 54 45 5f 42 55 46 46 45 52 20 7c  LLOCATE_BUFFER |
de10: 0a 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 20 20 20 20 20 46 4f                FO
de30: 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 46 52 4f  RMAT_MESSAGE_FRO
de40: 4d 5f 53 59 53 54 45 4d 20 7c 0a 20 20 20 20 20  M_SYSTEM |.     
de50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de60: 20 20 20 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d          FORMAT_M
de70: 45 53 53 41 47 45 5f 49 47 4e 4f 52 45 5f 49 4e  ESSAGE_IGNORE_IN
de80: 53 45 52 54 53 2c 0a 20 20 20 20 20 20 20 20 20  SERTS,.         
de90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dea0: 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20      NULL,.      
deb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dec0: 20 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f         lastErrno
ded0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
dee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
def0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
df00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
df10: 4c 50 53 54 52 29 20 26 7a 54 65 6d 70 2c 0a 20  LPSTR) &zTemp,. 
df20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df30: 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 0a 20              0,. 
df40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df50: 20 20 20 20 20 20 20 20 20 20 20 20 30 29 3b 0a              0);.
df60: 20 20 20 20 69 66 28 20 64 77 4c 65 6e 20 3e 20      if( dwLen > 
df70: 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 61 6c  0 ){.      /* al
df80: 6c 6f 63 61 74 65 20 61 20 62 75 66 66 65 72 20  locate a buffer 
df90: 61 6e 64 20 63 6f 6e 76 65 72 74 20 74 6f 20 55  and convert to U
dfa0: 54 46 38 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  TF8 */.      sql
dfb0: 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d  ite3BeginBenignM
dfc0: 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 7a  alloc();.      z
dfd0: 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 5f 77 69  Out = sqlite3_wi
dfe0: 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38  n32_mbcs_to_utf8
dff0: 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 73  (zTemp);.      s
e000: 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
e010: 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 2f  alloc();.      /
e020: 2a 20 66 72 65 65 20 74 68 65 20 73 79 73 74 65  * free the syste
e030: 6d 20 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74  m buffer allocat
e040: 65 64 20 62 79 20 46 6f 72 6d 61 74 4d 65 73 73  ed by FormatMess
e050: 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 6f 73 4c  age */.      osL
e060: 6f 63 61 6c 46 72 65 65 28 7a 54 65 6d 70 29 3b  ocalFree(zTemp);
e070: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
e080: 66 0a 20 20 69 66 28 20 30 20 3d 3d 20 64 77 4c  f.  if( 0 == dwL
e090: 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  en ){.    sqlite
e0a0: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2c  3_snprintf(nBuf,
e0b0: 20 7a 42 75 66 2c 20 22 4f 73 45 72 72 6f 72 20   zBuf, "OsError 
e0c0: 30 78 25 6c 78 20 28 25 6c 75 29 22 2c 20 6c 61  0x%lx (%lu)", la
e0d0: 73 74 45 72 72 6e 6f 2c 20 6c 61 73 74 45 72 72  stErrno, lastErr
e0e0: 6e 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  no);.  }else{.  
e0f0: 20 20 2f 2a 20 63 6f 70 79 20 61 20 6d 61 78 69    /* copy a maxi
e100: 6d 75 6d 20 6f 66 20 6e 42 75 66 20 63 68 61 72  mum of nBuf char
e110: 73 20 74 6f 20 6f 75 74 70 75 74 20 62 75 66 66  s to output buff
e120: 65 72 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  er */.    sqlite
e130: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2c  3_snprintf(nBuf,
e140: 20 7a 42 75 66 2c 20 22 25 73 22 2c 20 7a 4f 75   zBuf, "%s", zOu
e150: 74 29 3b 0a 20 20 20 20 2f 2a 20 66 72 65 65 20  t);.    /* free 
e160: 74 68 65 20 55 54 46 38 20 62 75 66 66 65 72 20  the UTF8 buffer 
e170: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  */.    sqlite3_f
e180: 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 7d 0a 20  ree(zOut);.  }. 
e190: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
e1a0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
e1b0: 74 69 6f 6e 20 2d 20 77 69 6e 4c 6f 67 45 72 72  tion - winLogErr
e1c0: 6f 72 41 74 4c 69 6e 65 28 29 20 2d 20 69 73 20  orAtLine() - is 
e1d0: 6f 6e 6c 79 20 65 76 65 72 20 63 61 6c 6c 65 64  only ever called
e1e0: 20 76 69 61 20 74 68 65 20 6d 61 63 72 6f 0a 2a   via the macro.*
e1f0: 2a 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 29 2e  * winLogError().
e200: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
e210: 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 61  ine is invoked a
e220: 66 74 65 72 20 61 6e 20 65 72 72 6f 72 20 6f 63  fter an error oc
e230: 63 75 72 73 20 69 6e 20 61 6e 20 4f 53 20 66 75  curs in an OS fu
e240: 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20 6c 6f  nction..** It lo
e250: 67 73 20 61 20 6d 65 73 73 61 67 65 20 75 73 69  gs a message usi
e260: 6e 67 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29  ng sqlite3_log()
e270: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
e280: 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66  current value of
e290: 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 61  .** error code a
e2a0: 6e 64 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 2c  nd, if possible,
e2b0: 20 74 68 65 20 68 75 6d 61 6e 2d 72 65 61 64 61   the human-reada
e2c0: 62 6c 65 20 65 71 75 69 76 61 6c 65 6e 74 20 66  ble equivalent f
e2d0: 72 6f 6d 0a 2a 2a 20 46 6f 72 6d 61 74 4d 65 73  rom.** FormatMes
e2e0: 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  sage..**.** The 
e2f0: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 70  first argument p
e300: 61 73 73 65 64 20 74 6f 20 74 68 65 20 6d 61 63  assed to the mac
e310: 72 6f 20 73 68 6f 75 6c 64 20 62 65 20 74 68 65  ro should be the
e320: 20 65 72 72 6f 72 20 63 6f 64 65 20 74 68 61 74   error code that
e330: 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 74 75  .** will be retu
e340: 72 6e 65 64 20 74 6f 20 53 51 4c 69 74 65 20 28  rned to SQLite (
e350: 65 2e 67 2e 20 53 51 4c 49 54 45 5f 49 4f 45 52  e.g. SQLITE_IOER
e360: 52 5f 44 45 4c 45 54 45 2c 20 53 51 4c 49 54 45  R_DELETE, SQLITE
e370: 5f 43 41 4e 54 4f 50 45 4e 29 2e 0a 2a 2a 20 54  _CANTOPEN)..** T
e380: 68 65 20 74 77 6f 20 73 75 62 73 65 71 75 65 6e  he two subsequen
e390: 74 20 61 72 67 75 6d 65 6e 74 73 20 73 68 6f 75  t arguments shou
e3a0: 6c 64 20 62 65 20 74 68 65 20 6e 61 6d 65 20 6f  ld be the name o
e3b0: 66 20 74 68 65 20 4f 53 20 66 75 6e 63 74 69 6f  f the OS functio
e3c0: 6e 20 74 68 61 74 0a 2a 2a 20 66 61 69 6c 65 64  n that.** failed
e3d0: 20 61 6e 64 20 74 68 65 20 61 73 73 6f 63 69 61   and the associa
e3e0: 74 65 64 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  ted file-system 
e3f0: 70 61 74 68 2c 20 69 66 20 61 6e 79 2e 0a 2a 2f  path, if any..*/
e400: 0a 23 64 65 66 69 6e 65 20 77 69 6e 4c 6f 67 45  .#define winLogE
e410: 72 72 6f 72 28 61 2c 62 2c 63 2c 64 29 20 20 20  rror(a,b,c,d)   
e420: 77 69 6e 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e  winLogErrorAtLin
e430: 65 28 61 2c 62 2c 63 2c 64 2c 5f 5f 4c 49 4e 45  e(a,b,c,d,__LINE
e440: 5f 5f 29 0a 73 74 61 74 69 63 20 69 6e 74 20 77  __).static int w
e450: 69 6e 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65  inLogErrorAtLine
e460: 28 0a 20 20 69 6e 74 20 65 72 72 63 6f 64 65 2c  (.  int errcode,
e470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e480: 20 20 20 20 2f 2a 20 53 51 4c 69 74 65 20 65 72      /* SQLite er
e490: 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 44 57  ror code */.  DW
e4a0: 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 2c 20 20  ORD lastErrno,  
e4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e4c0: 20 57 69 6e 33 32 20 6c 61 73 74 20 65 72 72 6f   Win32 last erro
e4d0: 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  r */.  const cha
e4e0: 72 20 2a 7a 46 75 6e 63 2c 20 20 20 20 20 20 20  r *zFunc,       
e4f0: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
e500: 66 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20 74 68  f OS function th
e510: 61 74 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 63  at failed */.  c
e520: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
e530: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
e540: 2a 20 46 69 6c 65 20 70 61 74 68 20 61 73 73 6f  * File path asso
e550: 63 69 61 74 65 64 20 77 69 74 68 20 65 72 72 6f  ciated with erro
e560: 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 69 6e 65  r */.  int iLine
e570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e580: 20 20 20 20 20 20 20 2f 2a 20 53 6f 75 72 63 65         /* Source
e590: 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 77 68 65   line number whe
e5a0: 72 65 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65  re error occurre
e5b0: 64 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 7a  d */.){.  char z
e5c0: 4d 73 67 5b 35 30 30 5d 3b 20 20 20 20 20 20 20  Msg[500];       
e5d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 75 6d            /* Hum
e5e0: 61 6e 20 72 65 61 64 61 62 6c 65 20 65 72 72 6f  an readable erro
e5f0: 72 20 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20  r text */.  int 
e600: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
e610: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
e620: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a  oop counter */..
e630: 20 20 7a 4d 73 67 5b 30 5d 20 3d 20 30 3b 0a 20    zMsg[0] = 0;. 
e640: 20 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f 72   winGetLastError
e650: 4d 73 67 28 6c 61 73 74 45 72 72 6e 6f 2c 20 73  Msg(lastErrno, s
e660: 69 7a 65 6f 66 28 7a 4d 73 67 29 2c 20 7a 4d 73  izeof(zMsg), zMs
e670: 67 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 72  g);.  assert( er
e680: 72 63 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b  rcode!=SQLITE_OK
e690: 20 29 3b 0a 20 20 69 66 28 20 7a 50 61 74 68 3d   );.  if( zPath=
e6a0: 3d 30 20 29 20 7a 50 61 74 68 20 3d 20 22 22 3b  =0 ) zPath = "";
e6b0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a 4d 73 67  .  for(i=0; zMsg
e6c0: 5b 69 5d 20 26 26 20 7a 4d 73 67 5b 69 5d 21 3d  [i] && zMsg[i]!=
e6d0: 27 5c 72 27 20 26 26 20 7a 4d 73 67 5b 69 5d 21  '\r' && zMsg[i]!
e6e0: 3d 27 5c 6e 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20  ='\n'; i++){}.  
e6f0: 7a 4d 73 67 5b 69 5d 20 3d 20 30 3b 0a 20 20 73  zMsg[i] = 0;.  s
e700: 71 6c 69 74 65 33 5f 6c 6f 67 28 65 72 72 63 6f  qlite3_log(errco
e710: 64 65 2c 0a 20 20 20 20 20 20 22 6f 73 5f 77 69  de,.      "os_wi
e720: 6e 2e 63 3a 25 64 3a 20 28 25 6c 75 29 20 25 73  n.c:%d: (%lu) %s
e730: 28 25 73 29 20 2d 20 25 73 22 2c 0a 20 20 20 20  (%s) - %s",.    
e740: 20 20 69 4c 69 6e 65 2c 20 6c 61 73 74 45 72 72    iLine, lastErr
e750: 6e 6f 2c 20 7a 46 75 6e 63 2c 20 7a 50 61 74 68  no, zFunc, zPath
e760: 2c 20 7a 4d 73 67 0a 20 20 29 3b 0a 0a 20 20 72  , zMsg.  );..  r
e770: 65 74 75 72 6e 20 65 72 72 63 6f 64 65 3b 0a 7d  eturn errcode;.}
e780: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62  ../*.** The numb
e790: 65 72 20 6f 66 20 74 69 6d 65 73 20 74 68 61 74  er of times that
e7a0: 20 61 20 52 65 61 64 46 69 6c 65 28 29 2c 20 57   a ReadFile(), W
e7b0: 72 69 74 65 46 69 6c 65 28 29 2c 20 61 6e 64 20  riteFile(), and 
e7c0: 44 65 6c 65 74 65 46 69 6c 65 28 29 0a 2a 2a 20  DeleteFile().** 
e7d0: 77 69 6c 6c 20 62 65 20 72 65 74 72 69 65 64 20  will be retried 
e7e0: 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 6c 6f 63 6b  following a lock
e7f0: 69 6e 67 20 65 72 72 6f 72 20 2d 20 70 72 6f 62  ing error - prob
e800: 61 62 6c 79 20 63 61 75 73 65 64 20 62 79 0a 2a  ably caused by.*
e810: 2a 20 61 6e 74 69 76 69 72 75 73 20 73 6f 66 74  * antivirus soft
e820: 77 61 72 65 2e 20 20 41 6c 73 6f 20 74 68 65 20  ware.  Also the 
e830: 69 6e 69 74 69 61 6c 20 64 65 6c 61 79 20 62 65  initial delay be
e840: 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 72  fore the first r
e850: 65 74 72 79 2e 0a 2a 2a 20 54 68 65 20 64 65 6c  etry..** The del
e860: 61 79 20 69 6e 63 72 65 61 73 65 73 20 6c 69 6e  ay increases lin
e870: 65 61 72 6c 79 20 77 69 74 68 20 65 61 63 68 20  early with each 
e880: 72 65 74 72 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65  retry..*/.#ifnde
e890: 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49  f SQLITE_WIN32_I
e8a0: 4f 45 52 52 5f 52 45 54 52 59 0a 23 20 64 65 66  OERR_RETRY.# def
e8b0: 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ine SQLITE_WIN32
e8c0: 5f 49 4f 45 52 52 5f 52 45 54 52 59 20 31 30 0a  _IOERR_RETRY 10.
e8d0: 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53  #endif.#ifndef S
e8e0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52  QLITE_WIN32_IOER
e8f0: 52 5f 52 45 54 52 59 5f 44 45 4c 41 59 0a 23 20  R_RETRY_DELAY.# 
e900: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49  define SQLITE_WI
e910: 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 5f  N32_IOERR_RETRY_
e920: 44 45 4c 41 59 20 32 35 0a 23 65 6e 64 69 66 0a  DELAY 25.#endif.
e930: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 49 6f  static int winIo
e940: 65 72 72 52 65 74 72 79 20 3d 20 53 51 4c 49 54  errRetry = SQLIT
e950: 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45  E_WIN32_IOERR_RE
e960: 54 52 59 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  TRY;.static int 
e970: 77 69 6e 49 6f 65 72 72 52 65 74 72 79 44 65 6c  winIoerrRetryDel
e980: 61 79 20 3d 20 53 51 4c 49 54 45 5f 57 49 4e 33  ay = SQLITE_WIN3
e990: 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 5f 44 45  2_IOERR_RETRY_DE
e9a0: 4c 41 59 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  LAY;../*.** The 
e9b0: 22 77 69 6e 49 6f 65 72 72 43 61 6e 52 65 74 72  "winIoerrCanRetr
e9c0: 79 31 22 20 6d 61 63 72 6f 20 69 73 20 75 73 65  y1" macro is use
e9d0: 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69  d to determine i
e9e0: 66 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 49  f a particular I
e9f0: 2f 4f 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65  /O.** error code
ea00: 20 6f 62 74 61 69 6e 65 64 20 76 69 61 20 47 65   obtained via Ge
ea10: 74 4c 61 73 74 45 72 72 6f 72 28 29 20 69 73 20  tLastError() is 
ea20: 65 6c 69 67 69 62 6c 65 20 74 6f 20 62 65 20 72  eligible to be r
ea30: 65 74 72 69 65 64 2e 20 20 49 74 0a 2a 2a 20 6d  etried.  It.** m
ea40: 75 73 74 20 61 63 63 65 70 74 20 74 68 65 20 65  ust accept the e
ea50: 72 72 6f 72 20 63 6f 64 65 20 44 57 4f 52 44 20  rror code DWORD 
ea60: 61 73 20 69 74 73 20 6f 6e 6c 79 20 61 72 67 75  as its only argu
ea70: 6d 65 6e 74 20 61 6e 64 20 73 68 6f 75 6c 64 20  ment and should 
ea80: 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65  return.** non-ze
ea90: 72 6f 20 69 66 20 74 68 65 20 65 72 72 6f 72 20  ro if the error 
eaa0: 63 6f 64 65 20 69 73 20 74 72 61 6e 73 69 65 6e  code is transien
eab0: 74 20 69 6e 20 6e 61 74 75 72 65 20 61 6e 64 20  t in nature and 
eac0: 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 0a 2a 2a  the operation.**
ead0: 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
eae0: 20 67 65 6e 65 72 61 74 69 6e 67 20 74 68 65 20   generating the 
eaf0: 6f 72 69 67 69 6e 61 6c 20 65 72 72 6f 72 20 6d  original error m
eb00: 69 67 68 74 20 73 75 63 63 65 65 64 20 75 70 6f  ight succeed upo
eb10: 6e 20 62 65 69 6e 67 0a 2a 2a 20 72 65 74 72 69  n being.** retri
eb20: 65 64 2e 20 20 54 68 65 20 61 72 67 75 6d 65 6e  ed.  The argumen
eb30: 74 20 74 6f 20 74 68 69 73 20 6d 61 63 72 6f 20  t to this macro 
eb40: 73 68 6f 75 6c 64 20 62 65 20 61 20 76 61 72 69  should be a vari
eb50: 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 64 64 69  able..**.** Addi
eb60: 74 69 6f 6e 61 6c 6c 79 2c 20 61 20 6d 61 63 72  tionally, a macr
eb70: 6f 20 6e 61 6d 65 64 20 22 77 69 6e 49 6f 65 72  o named "winIoer
eb80: 72 43 61 6e 52 65 74 72 79 32 22 20 6d 61 79 20  rCanRetry2" may 
eb90: 62 65 20 64 65 66 69 6e 65 64 2e 20 20 49 66 20  be defined.  If 
eba0: 69 74 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65 64  it.** is defined
ebb0: 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 63 6f 6e  , it will be con
ebc0: 73 75 6c 74 65 64 20 6f 6e 6c 79 20 77 68 65 6e  sulted only when
ebd0: 20 74 68 65 20 6d 61 63 72 6f 20 22 77 69 6e 49   the macro "winI
ebe0: 6f 65 72 72 43 61 6e 52 65 74 72 79 31 22 0a 2a  oerrCanRetry1".*
ebf0: 2a 20 72 65 74 75 72 6e 73 20 7a 65 72 6f 2e 20  * returns zero. 
ec00: 20 54 68 65 20 22 77 69 6e 49 6f 65 72 72 43 61   The "winIoerrCa
ec10: 6e 52 65 74 72 79 32 22 20 6d 61 63 72 6f 20 69  nRetry2" macro i
ec20: 73 20 63 6f 6d 70 6c 65 74 65 6c 79 20 6f 70 74  s completely opt
ec30: 69 6f 6e 61 6c 20 61 6e 64 0a 2a 2a 20 6d 61 79  ional and.** may
ec40: 20 62 65 20 75 73 65 64 20 74 6f 20 69 6e 63 6c   be used to incl
ec50: 75 64 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 65  ude additional e
ec60: 72 72 6f 72 20 63 6f 64 65 73 20 69 6e 20 74 68  rror codes in th
ec70: 65 20 73 65 74 20 74 68 61 74 20 73 68 6f 75 6c  e set that shoul
ec80: 64 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20 74  d.** result in t
ec90: 68 65 20 66 61 69 6c 69 6e 67 20 49 2f 4f 20 6f  he failing I/O o
eca0: 70 65 72 61 74 69 6f 6e 20 62 65 69 6e 67 20 72  peration being r
ecb0: 65 74 72 69 65 64 20 62 79 20 74 68 65 20 63 61  etried by the ca
ecc0: 6c 6c 65 72 2e 20 20 49 66 0a 2a 2a 20 64 65 66  ller.  If.** def
ecd0: 69 6e 65 64 2c 20 74 68 65 20 22 77 69 6e 49 6f  ined, the "winIo
ece0: 65 72 72 43 61 6e 52 65 74 72 79 32 22 20 6d 61  errCanRetry2" ma
ecf0: 63 72 6f 20 6d 75 73 74 20 65 78 68 69 62 69 74  cro must exhibit
ed00: 20 65 78 74 65 72 6e 61 6c 20 73 65 6d 61 6e 74   external semant
ed10: 69 63 73 0a 2a 2a 20 69 64 65 6e 74 69 63 61 6c  ics.** identical
ed20: 20 74 6f 20 74 68 6f 73 65 20 6f 66 20 74 68 65   to those of the
ed30: 20 22 77 69 6e 49 6f 65 72 72 43 61 6e 52 65 74   "winIoerrCanRet
ed40: 72 79 31 22 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23  ry1" macro..*/.#
ed50: 69 66 20 21 64 65 66 69 6e 65 64 28 77 69 6e 49  if !defined(winI
ed60: 6f 65 72 72 43 61 6e 52 65 74 72 79 31 29 0a 23  oerrCanRetry1).#
ed70: 64 65 66 69 6e 65 20 77 69 6e 49 6f 65 72 72 43  define winIoerrC
ed80: 61 6e 52 65 74 72 79 31 28 61 29 20 28 28 28 61  anRetry1(a) (((a
ed90: 29 3d 3d 45 52 52 4f 52 5f 41 43 43 45 53 53 5f  )==ERROR_ACCESS_
eda0: 44 45 4e 49 45 44 29 20 20 20 20 20 20 20 20 7c  DENIED)        |
edb0: 7c 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20  | \.            
edc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
edd0: 20 20 28 28 61 29 3d 3d 45 52 52 4f 52 5f 53 48    ((a)==ERROR_SH
ede0: 41 52 49 4e 47 5f 56 49 4f 4c 41 54 49 4f 4e 29  ARING_VIOLATION)
edf0: 20 20 20 20 7c 7c 20 5c 0a 20 20 20 20 20 20 20      || \.       
ee00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee10: 20 20 20 20 20 20 20 28 28 61 29 3d 3d 45 52 52         ((a)==ERR
ee20: 4f 52 5f 4c 4f 43 4b 5f 56 49 4f 4c 41 54 49 4f  OR_LOCK_VIOLATIO
ee30: 4e 29 20 20 20 20 20 20 20 7c 7c 20 5c 0a 20 20  N)       || \.  
ee40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee50: 20 20 20 20 20 20 20 20 20 20 20 20 28 28 61 29              ((a)
ee60: 3d 3d 45 52 52 4f 52 5f 44 45 56 5f 4e 4f 54 5f  ==ERROR_DEV_NOT_
ee70: 45 58 49 53 54 29 20 20 20 20 20 20 20 20 7c 7c  EXIST)        ||
ee80: 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   \.             
ee90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eea0: 20 28 28 61 29 3d 3d 45 52 52 4f 52 5f 4e 45 54   ((a)==ERROR_NET
eeb0: 4e 41 4d 45 5f 44 45 4c 45 54 45 44 29 20 20 20  NAME_DELETED)   
eec0: 20 20 20 7c 7c 20 5c 0a 20 20 20 20 20 20 20 20     || \.        
eed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eee0: 20 20 20 20 20 20 28 28 61 29 3d 3d 45 52 52 4f        ((a)==ERRO
eef0: 52 5f 53 45 4d 5f 54 49 4d 45 4f 55 54 29 20 20  R_SEM_TIMEOUT)  
ef00: 20 20 20 20 20 20 20 20 7c 7c 20 5c 0a 20 20 20          || \.   
ef10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef20: 20 20 20 20 20 20 20 20 20 20 20 28 28 61 29 3d             ((a)=
ef30: 3d 45 52 52 4f 52 5f 4e 45 54 57 4f 52 4b 5f 55  =ERROR_NETWORK_U
ef40: 4e 52 45 41 43 48 41 42 4c 45 29 29 0a 23 65 6e  NREACHABLE)).#en
ef50: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 20  dif../*.** If a 
ef60: 52 65 61 64 46 69 6c 65 28 29 20 6f 72 20 57 72  ReadFile() or Wr
ef70: 69 74 65 46 69 6c 65 28 29 20 65 72 72 6f 72 20  iteFile() error 
ef80: 6f 63 63 75 72 73 2c 20 69 6e 76 6f 6b 65 20 74  occurs, invoke t
ef90: 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 74  his routine.** t
efa0: 6f 20 73 65 65 20 69 66 20 69 74 20 73 68 6f 75  o see if it shou
efb0: 6c 64 20 62 65 20 72 65 74 72 69 65 64 2e 20 20  ld be retried.  
efc0: 52 65 74 75 72 6e 20 54 52 55 45 20 74 6f 20 72  Return TRUE to r
efd0: 65 74 72 79 2e 20 20 52 65 74 75 72 6e 20 46 41  etry.  Return FA
efe0: 4c 53 45 0a 2a 2a 20 74 6f 20 67 69 76 65 20 75  LSE.** to give u
eff0: 70 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72 2e  p with an error.
f000: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
f010: 69 6e 52 65 74 72 79 49 6f 65 72 72 28 69 6e 74  inRetryIoerr(int
f020: 20 2a 70 6e 52 65 74 72 79 2c 20 44 57 4f 52 44   *pnRetry, DWORD
f030: 20 2a 70 45 72 72 6f 72 29 7b 0a 20 20 44 57 4f   *pError){.  DWO
f040: 52 44 20 65 20 3d 20 6f 73 47 65 74 4c 61 73 74  RD e = osGetLast
f050: 45 72 72 6f 72 28 29 3b 0a 20 20 69 66 28 20 2a  Error();.  if( *
f060: 70 6e 52 65 74 72 79 3e 3d 77 69 6e 49 6f 65 72  pnRetry>=winIoer
f070: 72 52 65 74 72 79 20 29 7b 0a 20 20 20 20 69 66  rRetry ){.    if
f080: 28 20 70 45 72 72 6f 72 20 29 7b 0a 20 20 20 20  ( pError ){.    
f090: 20 20 2a 70 45 72 72 6f 72 20 3d 20 65 3b 0a 20    *pError = e;. 
f0a0: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
f0b0: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 77 69 6e  0;.  }.  if( win
f0c0: 49 6f 65 72 72 43 61 6e 52 65 74 72 79 31 28 65  IoerrCanRetry1(e
f0d0: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
f0e0: 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28 77 69 6e  _win32_sleep(win
f0f0: 49 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79 2a  IoerrRetryDelay*
f100: 28 31 2b 2a 70 6e 52 65 74 72 79 29 29 3b 0a 20  (1+*pnRetry));. 
f110: 20 20 20 2b 2b 2a 70 6e 52 65 74 72 79 3b 0a 20     ++*pnRetry;. 
f120: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
f130: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 77 69 6e  .#if defined(win
f140: 49 6f 65 72 72 43 61 6e 52 65 74 72 79 32 29 0a  IoerrCanRetry2).
f150: 20 20 65 6c 73 65 20 69 66 28 20 77 69 6e 49 6f    else if( winIo
f160: 65 72 72 43 61 6e 52 65 74 72 79 32 28 65 29 20  errCanRetry2(e) 
f170: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 77  ){.    sqlite3_w
f180: 69 6e 33 32 5f 73 6c 65 65 70 28 77 69 6e 49 6f  in32_sleep(winIo
f190: 65 72 72 52 65 74 72 79 44 65 6c 61 79 2a 28 31  errRetryDelay*(1
f1a0: 2b 2a 70 6e 52 65 74 72 79 29 29 3b 0a 20 20 20  +*pnRetry));.   
f1b0: 20 2b 2b 2a 70 6e 52 65 74 72 79 3b 0a 20 20 20   ++*pnRetry;.   
f1c0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 23   return 1;.  }.#
f1d0: 65 6e 64 69 66 0a 20 20 69 66 28 20 70 45 72 72  endif.  if( pErr
f1e0: 6f 72 20 29 7b 0a 20 20 20 20 2a 70 45 72 72 6f  or ){.    *pErro
f1f0: 72 20 3d 20 65 3b 0a 20 20 7d 0a 20 20 72 65 74  r = e;.  }.  ret
f200: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
f210: 4c 6f 67 20 61 20 49 2f 4f 20 65 72 72 6f 72 20  Log a I/O error 
f220: 72 65 74 72 79 20 65 70 69 73 6f 64 65 2e 0a 2a  retry episode..*
f230: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69  /.static void wi
f240: 6e 4c 6f 67 49 6f 65 72 72 28 69 6e 74 20 6e 52  nLogIoerr(int nR
f250: 65 74 72 79 29 7b 0a 20 20 69 66 28 20 6e 52 65  etry){.  if( nRe
f260: 74 72 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  try ){.    sqlit
f270: 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 49 4f  e3_log(SQLITE_IO
f280: 45 52 52 2c 0a 20 20 20 20 20 20 22 64 65 6c 61  ERR,.      "dela
f290: 79 65 64 20 25 64 6d 73 20 66 6f 72 20 6c 6f 63  yed %dms for loc
f2a0: 6b 2f 73 68 61 72 69 6e 67 20 63 6f 6e 66 6c 69  k/sharing confli
f2b0: 63 74 22 2c 0a 20 20 20 20 20 20 77 69 6e 49 6f  ct",.      winIo
f2c0: 65 72 72 52 65 74 72 79 44 65 6c 61 79 2a 6e 52  errRetryDelay*nR
f2d0: 65 74 72 79 2a 28 6e 52 65 74 72 79 2b 31 29 2f  etry*(nRetry+1)/
f2e0: 32 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a 0a  2.    );.  }.}..
f2f0: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
f300: 4e 43 45 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  NCE./***********
f310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
f350: 2a 20 54 68 69 73 20 73 65 63 74 69 6f 6e 20 63  * This section c
f360: 6f 6e 74 61 69 6e 73 20 63 6f 64 65 20 66 6f 72  ontains code for
f370: 20 57 69 6e 43 45 20 6f 6e 6c 79 2e 0a 2a 2f 0a   WinCE only..*/.
f380: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
f390: 49 54 45 5f 4d 53 56 43 5f 4c 4f 43 41 4c 54 49  ITE_MSVC_LOCALTI
f3a0: 4d 45 5f 41 50 49 29 20 7c 7c 20 21 53 51 4c 49  ME_API) || !SQLI
f3b0: 54 45 5f 4d 53 56 43 5f 4c 4f 43 41 4c 54 49 4d  TE_MSVC_LOCALTIM
f3c0: 45 5f 41 50 49 0a 2f 2a 0a 2a 2a 20 54 68 65 20  E_API./*.** The 
f3d0: 4d 53 56 43 20 43 52 54 20 6f 6e 20 57 69 6e 64  MSVC CRT on Wind
f3e0: 6f 77 73 20 43 45 20 6d 61 79 20 6e 6f 74 20 68  ows CE may not h
f3f0: 61 76 65 20 61 20 6c 6f 63 61 6c 74 69 6d 65 28  ave a localtime(
f400: 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 53 6f 0a  ) function.  So.
f410: 2a 2a 20 63 72 65 61 74 65 20 61 20 73 75 62 73  ** create a subs
f420: 74 69 74 75 74 65 2e 0a 2a 2f 0a 23 69 6e 63 6c  titute..*/.#incl
f430: 75 64 65 20 3c 74 69 6d 65 2e 68 3e 0a 73 74 72  ude <time.h>.str
f440: 75 63 74 20 74 6d 20 2a 5f 5f 63 64 65 63 6c 20  uct tm *__cdecl 
f450: 6c 6f 63 61 6c 74 69 6d 65 28 63 6f 6e 73 74 20  localtime(const 
f460: 74 69 6d 65 5f 74 20 2a 74 29 0a 7b 0a 20 20 73  time_t *t).{.  s
f470: 74 61 74 69 63 20 73 74 72 75 63 74 20 74 6d 20  tatic struct tm 
f480: 79 3b 0a 20 20 46 49 4c 45 54 49 4d 45 20 75 54  y;.  FILETIME uT
f490: 6d 2c 20 6c 54 6d 3b 0a 20 20 53 59 53 54 45 4d  m, lTm;.  SYSTEM
f4a0: 54 49 4d 45 20 70 54 6d 3b 0a 20 20 73 71 6c 69  TIME pTm;.  sqli
f4b0: 74 65 33 5f 69 6e 74 36 34 20 74 36 34 3b 0a 20  te3_int64 t64;. 
f4c0: 20 74 36 34 20 3d 20 2a 74 3b 0a 20 20 74 36 34   t64 = *t;.  t64
f4d0: 20 3d 20 28 74 36 34 20 2b 20 31 31 36 34 34 34   = (t64 + 116444
f4e0: 37 33 36 30 30 29 2a 31 30 30 30 30 30 30 30 3b  73600)*10000000;
f4f0: 0a 20 20 75 54 6d 2e 64 77 4c 6f 77 44 61 74 65  .  uTm.dwLowDate
f500: 54 69 6d 65 20 3d 20 28 44 57 4f 52 44 29 28 74  Time = (DWORD)(t
f510: 36 34 20 26 20 30 78 46 46 46 46 46 46 46 46 29  64 & 0xFFFFFFFF)
f520: 3b 0a 20 20 75 54 6d 2e 64 77 48 69 67 68 44 61  ;.  uTm.dwHighDa
f530: 74 65 54 69 6d 65 3d 20 28 44 57 4f 52 44 29 28  teTime= (DWORD)(
f540: 74 36 34 20 3e 3e 20 33 32 29 3b 0a 20 20 6f 73  t64 >> 32);.  os
f550: 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63 61 6c 46  FileTimeToLocalF
f560: 69 6c 65 54 69 6d 65 28 26 75 54 6d 2c 26 6c 54  ileTime(&uTm,&lT
f570: 6d 29 3b 0a 20 20 6f 73 46 69 6c 65 54 69 6d 65  m);.  osFileTime
f580: 54 6f 53 79 73 74 65 6d 54 69 6d 65 28 26 6c 54  ToSystemTime(&lT
f590: 6d 2c 26 70 54 6d 29 3b 0a 20 20 79 2e 74 6d 5f  m,&pTm);.  y.tm_
f5a0: 79 65 61 72 20 3d 20 70 54 6d 2e 77 59 65 61 72  year = pTm.wYear
f5b0: 20 2d 20 31 39 30 30 3b 0a 20 20 79 2e 74 6d 5f   - 1900;.  y.tm_
f5c0: 6d 6f 6e 20 3d 20 70 54 6d 2e 77 4d 6f 6e 74 68  mon = pTm.wMonth
f5d0: 20 2d 20 31 3b 0a 20 20 79 2e 74 6d 5f 77 64 61   - 1;.  y.tm_wda
f5e0: 79 20 3d 20 70 54 6d 2e 77 44 61 79 4f 66 57 65  y = pTm.wDayOfWe
f5f0: 65 6b 3b 0a 20 20 79 2e 74 6d 5f 6d 64 61 79 20  ek;.  y.tm_mday 
f600: 3d 20 70 54 6d 2e 77 44 61 79 3b 0a 20 20 79 2e  = pTm.wDay;.  y.
f610: 74 6d 5f 68 6f 75 72 20 3d 20 70 54 6d 2e 77 48  tm_hour = pTm.wH
f620: 6f 75 72 3b 0a 20 20 79 2e 74 6d 5f 6d 69 6e 20  our;.  y.tm_min 
f630: 3d 20 70 54 6d 2e 77 4d 69 6e 75 74 65 3b 0a 20  = pTm.wMinute;. 
f640: 20 79 2e 74 6d 5f 73 65 63 20 3d 20 70 54 6d 2e   y.tm_sec = pTm.
f650: 77 53 65 63 6f 6e 64 3b 0a 20 20 72 65 74 75 72  wSecond;.  retur
f660: 6e 20 26 79 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  n &y;.}.#endif..
f670: 23 64 65 66 69 6e 65 20 48 41 4e 44 4c 45 5f 54  #define HANDLE_T
f680: 4f 5f 57 49 4e 46 49 4c 45 28 61 29 20 28 77 69  O_WINFILE(a) (wi
f690: 6e 46 69 6c 65 2a 29 26 28 28 63 68 61 72 2a 29  nFile*)&((char*)
f6a0: 61 29 5b 2d 28 69 6e 74 29 6f 66 66 73 65 74 6f  a)[-(int)offseto
f6b0: 66 28 77 69 6e 46 69 6c 65 2c 68 29 5d 0a 0a 2f  f(winFile,h)]../
f6c0: 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 6c  *.** Acquire a l
f6d0: 6f 63 6b 20 6f 6e 20 74 68 65 20 68 61 6e 64 6c  ock on the handl
f6e0: 65 20 68 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  e h.*/.static vo
f6f0: 69 64 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71  id winceMutexAcq
f700: 75 69 72 65 28 48 41 4e 44 4c 45 20 68 29 7b 0a  uire(HANDLE h){.
f710: 20 20 20 44 57 4f 52 44 20 64 77 45 72 72 3b 0a     DWORD dwErr;.
f720: 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 64 77 45     do {.     dwE
f730: 72 72 20 3d 20 6f 73 57 61 69 74 46 6f 72 53 69  rr = osWaitForSi
f740: 6e 67 6c 65 4f 62 6a 65 63 74 28 68 2c 20 49 4e  ngleObject(h, IN
f750: 46 49 4e 49 54 45 29 3b 0a 20 20 20 7d 20 77 68  FINITE);.   } wh
f760: 69 6c 65 20 28 64 77 45 72 72 20 21 3d 20 57 41  ile (dwErr != WA
f770: 49 54 5f 4f 42 4a 45 43 54 5f 30 20 26 26 20 64  IT_OBJECT_0 && d
f780: 77 45 72 72 20 21 3d 20 57 41 49 54 5f 41 42 41  wErr != WAIT_ABA
f790: 4e 44 4f 4e 45 44 29 3b 0a 7d 0a 2f 2a 0a 2a 2a  NDONED);.}./*.**
f7a0: 20 52 65 6c 65 61 73 65 20 61 20 6c 6f 63 6b 20   Release a lock 
f7b0: 61 63 71 75 69 72 65 64 20 62 79 20 77 69 6e 63  acquired by winc
f7c0: 65 4d 75 74 65 78 41 63 71 75 69 72 65 28 29 0a  eMutexAcquire().
f7d0: 2a 2f 0a 23 64 65 66 69 6e 65 20 77 69 6e 63 65  */.#define wince
f7e0: 4d 75 74 65 78 52 65 6c 65 61 73 65 28 68 29 20  MutexRelease(h) 
f7f0: 52 65 6c 65 61 73 65 4d 75 74 65 78 28 68 29 0a  ReleaseMutex(h).
f800: 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74 68  ./*.** Create th
f810: 65 20 6d 75 74 65 78 20 61 6e 64 20 73 68 61 72  e mutex and shar
f820: 65 64 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 66  ed memory used f
f830: 6f 72 20 6c 6f 63 6b 69 6e 67 20 69 6e 20 74 68  or locking in th
f840: 65 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69  e file.** descri
f850: 70 74 6f 72 20 70 46 69 6c 65 0a 2a 2f 0a 73 74  ptor pFile.*/.st
f860: 61 74 69 63 20 69 6e 74 20 77 69 6e 63 65 43 72  atic int winceCr
f870: 65 61 74 65 4c 6f 63 6b 28 63 6f 6e 73 74 20 63  eateLock(const c
f880: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
f890: 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b  winFile *pFile){
f8a0: 0a 20 20 4c 50 57 53 54 52 20 7a 54 6f 6b 3b 0a  .  LPWSTR zTok;.
f8b0: 20 20 4c 50 57 53 54 52 20 7a 4e 61 6d 65 3b 0a    LPWSTR zName;.
f8c0: 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e    DWORD lastErrn
f8d0: 6f 3b 0a 20 20 42 4f 4f 4c 20 62 4c 6f 67 67 65  o;.  BOOL bLogge
f8e0: 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20 42 4f 4f  d = FALSE;.  BOO
f8f0: 4c 20 62 49 6e 69 74 20 3d 20 54 52 55 45 3b 0a  L bInit = TRUE;.
f900: 0a 20 20 7a 4e 61 6d 65 20 3d 20 77 69 6e 55 74  .  zName = winUt
f910: 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c  f8ToUnicode(zFil
f920: 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e  ename);.  if( zN
f930: 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  ame==0 ){.    /*
f940: 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 20 2a   out of memory *
f950: 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  /.    return SQL
f960: 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b  ITE_IOERR_NOMEM;
f970: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69  .  }..  /* Initi
f980: 61 6c 69 7a 65 20 74 68 65 20 6c 6f 63 61 6c 20  alize the local 
f990: 6c 6f 63 6b 64 61 74 61 20 2a 2f 0a 20 20 6d 65  lockdata */.  me
f9a0: 6d 73 65 74 28 26 70 46 69 6c 65 2d 3e 6c 6f 63  mset(&pFile->loc
f9b0: 61 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 46  al, 0, sizeof(pF
f9c0: 69 6c 65 2d 3e 6c 6f 63 61 6c 29 29 3b 0a 0a 20  ile->local));.. 
f9d0: 20 2f 2a 20 52 65 70 6c 61 63 65 20 74 68 65 20   /* Replace the 
f9e0: 62 61 63 6b 73 6c 61 73 68 65 73 20 66 72 6f 6d  backslashes from
f9f0: 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 61 6e   the filename an
fa00: 64 20 6c 6f 77 65 72 63 61 73 65 20 69 74 0a 20  d lowercase it. 
fa10: 20 2a 2a 20 74 6f 20 64 65 72 69 76 65 20 61 20   ** to derive a 
fa20: 6d 75 74 65 78 20 6e 61 6d 65 2e 20 2a 2f 0a 20  mutex name. */. 
fa30: 20 7a 54 6f 6b 20 3d 20 6f 73 43 68 61 72 4c 6f   zTok = osCharLo
fa40: 77 65 72 57 28 7a 4e 61 6d 65 29 3b 0a 20 20 66  werW(zName);.  f
fa50: 6f 72 20 28 3b 2a 7a 54 6f 6b 3b 7a 54 6f 6b 2b  or (;*zTok;zTok+
fa60: 2b 29 7b 0a 20 20 20 20 69 66 20 28 2a 7a 54 6f  +){.    if (*zTo
fa70: 6b 20 3d 3d 20 27 5c 5c 27 29 20 2a 7a 54 6f 6b  k == '\\') *zTok
fa80: 20 3d 20 27 5f 27 3b 0a 20 20 7d 0a 0a 20 20 2f   = '_';.  }..  /
fa90: 2a 20 43 72 65 61 74 65 2f 6f 70 65 6e 20 74 68  * Create/open th
faa0: 65 20 6e 61 6d 65 64 20 6d 75 74 65 78 20 2a 2f  e named mutex */
fab0: 0a 20 20 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78  .  pFile->hMutex
fac0: 20 3d 20 6f 73 43 72 65 61 74 65 4d 75 74 65 78   = osCreateMutex
fad0: 57 28 4e 55 4c 4c 2c 20 46 41 4c 53 45 2c 20 7a  W(NULL, FALSE, z
fae0: 4e 61 6d 65 29 3b 0a 20 20 69 66 20 28 21 70 46  Name);.  if (!pF
faf0: 69 6c 65 2d 3e 68 4d 75 74 65 78 29 7b 0a 20 20  ile->hMutex){.  
fb00: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
fb10: 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
fb20: 72 6f 72 28 29 3b 0a 20 20 20 20 73 71 6c 69 74  ror();.    sqlit
fb30: 65 33 5f 66 72 65 65 28 7a 4e 61 6d 65 29 3b 0a  e3_free(zName);.
fb40: 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f      return winLo
fb50: 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
fb60: 45 52 52 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74  ERR, pFile->last
fb70: 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  Errno,.         
fb80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
fb90: 69 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b 31 22  inceCreateLock1"
fba0: 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  , zFilename);.  
fbb0: 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20  }..  /* Acquire 
fbc0: 74 68 65 20 6d 75 74 65 78 20 62 65 66 6f 72 65  the mutex before
fbd0: 20 63 6f 6e 74 69 6e 75 69 6e 67 20 2a 2f 0a 20   continuing */. 
fbe0: 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71 75 69   winceMutexAcqui
fbf0: 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78  re(pFile->hMutex
fc00: 29 3b 0a 0a 20 20 2f 2a 20 53 69 6e 63 65 20 74  );..  /* Since t
fc10: 68 65 20 6e 61 6d 65 73 20 6f 66 20 6e 61 6d 65  he names of name
fc20: 64 20 6d 75 74 65 78 65 73 2c 20 73 65 6d 61 70  d mutexes, semap
fc30: 68 6f 72 65 73 2c 20 66 69 6c 65 20 6d 61 70 70  hores, file mapp
fc40: 69 6e 67 73 20 65 74 63 20 61 72 65 0a 20 20 2a  ings etc are.  *
fc50: 2a 20 63 61 73 65 2d 73 65 6e 73 69 74 69 76 65  * case-sensitive
fc60: 2c 20 74 61 6b 65 20 61 64 76 61 6e 74 61 67 65  , take advantage
fc70: 20 6f 66 20 74 68 61 74 20 62 79 20 75 70 70 65   of that by uppe
fc80: 72 63 61 73 69 6e 67 20 74 68 65 20 6d 75 74 65  rcasing the mute
fc90: 78 20 6e 61 6d 65 0a 20 20 2a 2a 20 61 6e 64 20  x name.  ** and 
fca0: 75 73 69 6e 67 20 74 68 61 74 20 61 73 20 74 68  using that as th
fcb0: 65 20 73 68 61 72 65 64 20 66 69 6c 65 6d 61 70  e shared filemap
fcc0: 70 69 6e 67 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a  ping name..  */.
fcd0: 20 20 6f 73 43 68 61 72 55 70 70 65 72 57 28 7a    osCharUpperW(z
fce0: 4e 61 6d 65 29 3b 0a 20 20 70 46 69 6c 65 2d 3e  Name);.  pFile->
fcf0: 68 53 68 61 72 65 64 20 3d 20 6f 73 43 72 65 61  hShared = osCrea
fd00: 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 28 49  teFileMappingW(I
fd10: 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
fd20: 4c 55 45 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20  LUE, NULL,.     
fd30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fd40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fd50: 20 20 20 50 41 47 45 5f 52 45 41 44 57 52 49 54     PAGE_READWRIT
fd60: 45 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 69 6e  E, 0, sizeof(win
fd70: 63 65 4c 6f 63 6b 29 2c 0a 20 20 20 20 20 20 20  ceLock),.       
fd80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fd90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fda0: 20 7a 4e 61 6d 65 29 3b 0a 0a 20 20 2f 2a 20 53   zName);..  /* S
fdb0: 65 74 20 61 20 66 6c 61 67 20 74 68 61 74 20 69  et a flag that i
fdc0: 6e 64 69 63 61 74 65 73 20 77 65 27 72 65 20 74  ndicates we're t
fdd0: 68 65 20 66 69 72 73 74 20 74 6f 20 63 72 65 61  he first to crea
fde0: 74 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 73 6f  te the memory so
fdf0: 20 69 74 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65   it.  ** must be
fe00: 20 7a 65 72 6f 2d 69 6e 69 74 69 61 6c 69 7a 65   zero-initialize
fe10: 64 20 2a 2f 0a 20 20 6c 61 73 74 45 72 72 6e 6f  d */.  lastErrno
fe20: 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
fe30: 72 28 29 3b 0a 20 20 69 66 20 28 6c 61 73 74 45  r();.  if (lastE
fe40: 72 72 6e 6f 20 3d 3d 20 45 52 52 4f 52 5f 41 4c  rrno == ERROR_AL
fe50: 52 45 41 44 59 5f 45 58 49 53 54 53 29 7b 0a 20  READY_EXISTS){. 
fe60: 20 20 20 62 49 6e 69 74 20 3d 20 46 41 4c 53 45     bInit = FALSE
fe70: 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  ;.  }..  sqlite3
fe80: 5f 66 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 0a 20  _free(zName);.. 
fe90: 20 2f 2a 20 49 66 20 77 65 20 73 75 63 63 65 65   /* If we succee
fea0: 64 65 64 20 69 6e 20 6d 61 6b 69 6e 67 20 74 68  ded in making th
feb0: 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  e shared memory 
fec0: 68 61 6e 64 6c 65 2c 20 6d 61 70 20 69 74 2e 20  handle, map it. 
fed0: 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
fee0: 68 53 68 61 72 65 64 20 29 7b 0a 20 20 20 20 70  hShared ){.    p
fef0: 46 69 6c 65 2d 3e 73 68 61 72 65 64 20 3d 20 28  File->shared = (
ff00: 77 69 6e 63 65 4c 6f 63 6b 2a 29 6f 73 4d 61 70  winceLock*)osMap
ff10: 56 69 65 77 4f 66 46 69 6c 65 28 70 46 69 6c 65  ViewOfFile(pFile
ff20: 2d 3e 68 53 68 61 72 65 64 2c 0a 20 20 20 20 20  ->hShared,.     
ff30: 20 20 20 20 20 20 20 20 46 49 4c 45 5f 4d 41 50          FILE_MAP
ff40: 5f 52 45 41 44 7c 46 49 4c 45 5f 4d 41 50 5f 57  _READ|FILE_MAP_W
ff50: 52 49 54 45 2c 20 30 2c 20 30 2c 20 73 69 7a 65  RITE, 0, 0, size
ff60: 6f 66 28 77 69 6e 63 65 4c 6f 63 6b 29 29 3b 0a  of(winceLock));.
ff70: 20 20 20 20 2f 2a 20 49 66 20 6d 61 70 70 69 6e      /* If mappin
ff80: 67 20 66 61 69 6c 65 64 2c 20 63 6c 6f 73 65 20  g failed, close 
ff90: 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  the shared memor
ffa0: 79 20 68 61 6e 64 6c 65 20 61 6e 64 20 65 72 61  y handle and era
ffb0: 73 65 20 69 74 20 2a 2f 0a 20 20 20 20 69 66 28  se it */.    if(
ffc0: 20 21 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 20   !pFile->shared 
ffd0: 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
ffe0: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
fff0: 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
10000 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28      winLogError(
10010 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 70 46  SQLITE_IOERR, pF
10020 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a  ile->lastErrno,.
10030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10040 20 20 22 77 69 6e 63 65 43 72 65 61 74 65 4c 6f    "winceCreateLo
10050 63 6b 32 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29  ck2", zFilename)
10060 3b 0a 20 20 20 20 20 20 62 4c 6f 67 67 65 64 20  ;.      bLogged 
10070 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20 6f 73  = TRUE;.      os
10080 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c  CloseHandle(pFil
10090 65 2d 3e 68 53 68 61 72 65 64 29 3b 0a 20 20 20  e->hShared);.   
100a0 20 20 20 70 46 69 6c 65 2d 3e 68 53 68 61 72 65     pFile->hShare
100b0 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a  d = NULL;.    }.
100c0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 73 68 61    }..  /* If sha
100d0 72 65 64 20 6d 65 6d 6f 72 79 20 63 6f 75 6c 64  red memory could
100e0 20 6e 6f 74 20 62 65 20 63 72 65 61 74 65 64 2c   not be created,
100f0 20 74 68 65 6e 20 63 6c 6f 73 65 20 74 68 65 20   then close the 
10100 6d 75 74 65 78 20 61 6e 64 20 66 61 69 6c 20 2a  mutex and fail *
10110 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 68  /.  if( pFile->h
10120 53 68 61 72 65 64 3d 3d 4e 55 4c 4c 20 29 7b 0a  Shared==NULL ){.
10130 20 20 20 20 69 66 28 20 21 62 4c 6f 67 67 65 64      if( !bLogged
10140 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   ){.      pFile-
10150 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73  >lastErrno = las
10160 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 77 69  tErrno;.      wi
10170 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
10180 5f 49 4f 45 52 52 2c 20 70 46 69 6c 65 2d 3e 6c  _IOERR, pFile->l
10190 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
101a0 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
101b0 63 65 43 72 65 61 74 65 4c 6f 63 6b 33 22 2c 20  ceCreateLock3", 
101c0 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  zFilename);.    
101d0 20 20 62 4c 6f 67 67 65 64 20 3d 20 54 52 55 45    bLogged = TRUE
101e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 69 6e 63  ;.    }.    winc
101f0 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28 70 46  eMutexRelease(pF
10200 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20  ile->hMutex);.  
10210 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28    osCloseHandle(
10220 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a  pFile->hMutex);.
10230 20 20 20 20 70 46 69 6c 65 2d 3e 68 4d 75 74 65      pFile->hMute
10240 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 72 65  x = NULL;.    re
10250 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
10260 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69  R;.  }..  /* Ini
10270 74 69 61 6c 69 7a 65 20 74 68 65 20 73 68 61 72  tialize the shar
10280 65 64 20 6d 65 6d 6f 72 79 20 69 66 20 77 65 27  ed memory if we'
10290 72 65 20 73 75 70 70 6f 73 65 64 20 74 6f 20 2a  re supposed to *
102a0 2f 0a 20 20 69 66 28 20 62 49 6e 69 74 20 29 7b  /.  if( bInit ){
102b0 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 46 69 6c  .    memset(pFil
102c0 65 2d 3e 73 68 61 72 65 64 2c 20 30 2c 20 73 69  e->shared, 0, si
102d0 7a 65 6f 66 28 77 69 6e 63 65 4c 6f 63 6b 29 29  zeof(winceLock))
102e0 3b 0a 20 20 7d 0a 0a 20 20 77 69 6e 63 65 4d 75  ;.  }..  winceMu
102f0 74 65 78 52 65 6c 65 61 73 65 28 70 46 69 6c 65  texRelease(pFile
10300 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 72 65 74  ->hMutex);.  ret
10310 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
10320 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 74 72 6f 79 20  ../*.** Destroy 
10330 74 68 65 20 70 61 72 74 20 6f 66 20 77 69 6e 46  the part of winF
10340 69 6c 65 20 74 68 61 74 20 64 65 61 6c 73 20 77  ile that deals w
10350 69 74 68 20 77 69 6e 63 65 20 6c 6f 63 6b 73 0a  ith wince locks.
10360 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
10370 69 6e 63 65 44 65 73 74 72 6f 79 4c 6f 63 6b 28  inceDestroyLock(
10380 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b  winFile *pFile){
10390 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 68 4d  .  if (pFile->hM
103a0 75 74 65 78 29 7b 0a 20 20 20 20 2f 2a 20 41 63  utex){.    /* Ac
103b0 71 75 69 72 65 20 74 68 65 20 6d 75 74 65 78 20  quire the mutex 
103c0 2a 2f 0a 20 20 20 20 77 69 6e 63 65 4d 75 74 65  */.    winceMute
103d0 78 41 63 71 75 69 72 65 28 70 46 69 6c 65 2d 3e  xAcquire(pFile->
103e0 68 4d 75 74 65 78 29 3b 0a 0a 20 20 20 20 2f 2a  hMutex);..    /*
103f0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62   The following b
10400 6c 6f 63 6b 73 20 73 68 6f 75 6c 64 20 70 72 6f  locks should pro
10410 62 61 62 6c 79 20 61 73 73 65 72 74 20 69 6e 20  bably assert in 
10420 64 65 62 75 67 20 6d 6f 64 65 2c 20 62 75 74 20  debug mode, but 
10430 74 68 65 79 0a 20 20 20 20 20 20 20 61 72 65 20  they.       are 
10440 74 6f 20 63 6c 65 61 6e 75 70 20 69 6e 20 63 61  to cleanup in ca
10450 73 65 20 61 6e 79 20 6c 6f 63 6b 73 20 72 65 6d  se any locks rem
10460 61 69 6e 65 64 20 6f 70 65 6e 20 2a 2f 0a 20 20  ained open */.  
10470 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63    if (pFile->loc
10480 61 6c 2e 6e 52 65 61 64 65 72 73 29 7b 0a 20 20  al.nReaders){.  
10490 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65      pFile->share
104a0 64 2d 3e 6e 52 65 61 64 65 72 73 20 2d 2d 3b 0a  d->nReaders --;.
104b0 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 70 46      }.    if (pF
104c0 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65  ile->local.bRese
104d0 72 76 65 64 29 7b 0a 20 20 20 20 20 20 70 46 69  rved){.      pFi
104e0 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52 65 73  le->shared->bRes
104f0 65 72 76 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20  erved = FALSE;. 
10500 20 20 20 7d 0a 20 20 20 20 69 66 20 28 70 46 69     }.    if (pFi
10510 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69  le->local.bPendi
10520 6e 67 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  ng){.      pFile
10530 2d 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e 64 69  ->shared->bPendi
10540 6e 67 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20  ng = FALSE;.    
10550 7d 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d  }.    if (pFile-
10560 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69 76  >local.bExclusiv
10570 65 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  e){.      pFile-
10580 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75 73  >shared->bExclus
10590 69 76 65 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20  ive = FALSE;.   
105a0 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 2d 72 65   }..    /* De-re
105b0 66 65 72 65 6e 63 65 20 61 6e 64 20 63 6c 6f 73  ference and clos
105c0 65 20 6f 75 72 20 63 6f 70 79 20 6f 66 20 74 68  e our copy of th
105d0 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  e shared memory 
105e0 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 20 20 6f 73  handle */.    os
105f0 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 28  UnmapViewOfFile(
10600 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 29 3b 0a  pFile->shared);.
10610 20 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c      osCloseHandl
10620 65 28 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64  e(pFile->hShared
10630 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 6e 65 20  );..    /* Done 
10640 77 69 74 68 20 74 68 65 20 6d 75 74 65 78 20 2a  with the mutex *
10650 2f 0a 20 20 20 20 77 69 6e 63 65 4d 75 74 65 78  /.    winceMutex
10660 52 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68  Release(pFile->h
10670 4d 75 74 65 78 29 3b 0a 20 20 20 20 6f 73 43 6c  Mutex);.    osCl
10680 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d  oseHandle(pFile-
10690 3e 68 4d 75 74 65 78 29 3b 0a 20 20 20 20 70 46  >hMutex);.    pF
106a0 69 6c 65 2d 3e 68 4d 75 74 65 78 20 3d 20 4e 55  ile->hMutex = NU
106b0 4c 4c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  LL;.  }.}../*.**
106c0 20 41 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69   An implementati
106d0 6f 6e 20 6f 66 20 74 68 65 20 4c 6f 63 6b 46 69  on of the LockFi
106e0 6c 65 28 29 20 41 50 49 20 6f 66 20 57 69 6e 64  le() API of Wind
106f0 6f 77 73 20 66 6f 72 20 43 45 0a 2a 2f 0a 73 74  ows for CE.*/.st
10700 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 63 65 4c  atic BOOL winceL
10710 6f 63 6b 46 69 6c 65 28 0a 20 20 4c 50 48 41 4e  ockFile(.  LPHAN
10720 44 4c 45 20 70 68 46 69 6c 65 2c 0a 20 20 44 57  DLE phFile,.  DW
10730 4f 52 44 20 64 77 46 69 6c 65 4f 66 66 73 65 74  ORD dwFileOffset
10740 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 64 77 46  Low,.  DWORD dwF
10750 69 6c 65 4f 66 66 73 65 74 48 69 67 68 2c 0a 20  ileOffsetHigh,. 
10760 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66   DWORD nNumberOf
10770 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 2c 0a  BytesToLockLow,.
10780 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f    DWORD nNumberO
10790 66 42 79 74 65 73 54 6f 4c 6f 63 6b 48 69 67 68  fBytesToLockHigh
107a0 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70  .){.  winFile *p
107b0 46 69 6c 65 20 3d 20 48 41 4e 44 4c 45 5f 54 4f  File = HANDLE_TO
107c0 5f 57 49 4e 46 49 4c 45 28 70 68 46 69 6c 65 29  _WINFILE(phFile)
107d0 3b 0a 20 20 42 4f 4f 4c 20 62 52 65 74 75 72 6e  ;.  BOOL bReturn
107e0 20 3d 20 46 41 4c 53 45 3b 0a 0a 20 20 55 4e 55   = FALSE;..  UNU
107f0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 77  SED_PARAMETER(dw
10800 46 69 6c 65 4f 66 66 73 65 74 48 69 67 68 29 3b  FileOffsetHigh);
10810 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
10820 54 45 52 28 6e 4e 75 6d 62 65 72 4f 66 42 79 74  TER(nNumberOfByt
10830 65 73 54 6f 4c 6f 63 6b 48 69 67 68 29 3b 0a 0a  esToLockHigh);..
10840 20 20 69 66 20 28 21 70 46 69 6c 65 2d 3e 68 4d    if (!pFile->hM
10850 75 74 65 78 29 20 72 65 74 75 72 6e 20 54 52 55  utex) return TRU
10860 45 3b 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 41  E;.  winceMutexA
10870 63 71 75 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d  cquire(pFile->hM
10880 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 57 61 6e  utex);..  /* Wan
10890 74 69 6e 67 20 61 6e 20 65 78 63 6c 75 73 69 76  ting an exclusiv
108a0 65 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 69 66 20  e lock? */.  if 
108b0 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77  (dwFileOffsetLow
108c0 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45   == (DWORD)SHARE
108d0 44 5f 46 49 52 53 54 0a 20 20 20 20 20 20 20 26  D_FIRST.       &
108e0 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  & nNumberOfBytes
108f0 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 28 44 57  ToLockLow == (DW
10900 4f 52 44 29 53 48 41 52 45 44 5f 53 49 5a 45 29  ORD)SHARED_SIZE)
10910 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d  {.    if (pFile-
10920 3e 73 68 61 72 65 64 2d 3e 6e 52 65 61 64 65 72  >shared->nReader
10930 73 20 3d 3d 20 30 20 26 26 20 70 46 69 6c 65 2d  s == 0 && pFile-
10940 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75 73  >shared->bExclus
10950 69 76 65 20 3d 3d 20 30 29 7b 0a 20 20 20 20 20  ive == 0){.     
10960 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d    pFile->shared-
10970 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 20 54 52  >bExclusive = TR
10980 55 45 3b 0a 20 20 20 20 20 20 20 70 46 69 6c 65  UE;.       pFile
10990 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69  ->local.bExclusi
109a0 76 65 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20  ve = TRUE;.     
109b0 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45    bReturn = TRUE
109c0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
109d0 2a 20 57 61 6e 74 20 61 20 72 65 61 64 2d 6f 6e  * Want a read-on
109e0 6c 79 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 65 6c  ly lock? */.  el
109f0 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66  se if (dwFileOff
10a00 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44  setLow == (DWORD
10a10 29 53 48 41 52 45 44 5f 46 49 52 53 54 20 26 26  )SHARED_FIRST &&
10a20 0a 20 20 20 20 20 20 20 20 20 20 20 6e 4e 75 6d  .           nNum
10a30 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b  berOfBytesToLock
10a40 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20 69  Low == 1){.    i
10a50 66 20 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64  f (pFile->shared
10a60 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 3d 20  ->bExclusive == 
10a70 30 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  0){.      pFile-
10a80 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 20  >local.nReaders 
10a90 2b 2b 3b 0a 20 20 20 20 20 20 69 66 20 28 70 46  ++;.      if (pF
10aa0 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64  ile->local.nRead
10ab0 65 72 73 20 3d 3d 20 31 29 7b 0a 20 20 20 20 20  ers == 1){.     
10ac0 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64     pFile->shared
10ad0 2d 3e 6e 52 65 61 64 65 72 73 20 2b 2b 3b 0a 20  ->nReaders ++;. 
10ae0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 52 65       }.      bRe
10af0 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20  turn = TRUE;.   
10b00 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 61 6e   }.  }..  /* Wan
10b10 74 20 61 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b  t a pending lock
10b20 3f 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20 28  ? */.  else if (
10b30 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20  dwFileOffsetLow 
10b40 3d 3d 20 28 44 57 4f 52 44 29 50 45 4e 44 49 4e  == (DWORD)PENDIN
10b50 47 5f 42 59 54 45 0a 20 20 20 20 20 20 20 20 20  G_BYTE.         
10b60 20 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79    && nNumberOfBy
10b70 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20  tesToLockLow == 
10b80 31 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f  1){.    /* If no
10b90 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 20 68 61   pending lock ha
10ba0 73 20 62 65 65 6e 20 61 63 71 75 69 72 65 64 2c  s been acquired,
10bb0 20 74 68 65 6e 20 61 63 71 75 69 72 65 20 69 74   then acquire it
10bc0 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 46 69 6c   */.    if (pFil
10bd0 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e 64  e->shared->bPend
10be0 69 6e 67 20 3d 3d 20 30 29 20 7b 0a 20 20 20 20  ing == 0) {.    
10bf0 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d    pFile->shared-
10c00 3e 62 50 65 6e 64 69 6e 67 20 3d 20 54 52 55 45  >bPending = TRUE
10c10 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  ;.      pFile->l
10c20 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67 20 3d 20  ocal.bPending = 
10c30 54 52 55 45 3b 0a 20 20 20 20 20 20 62 52 65 74  TRUE;.      bRet
10c40 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20  urn = TRUE;.    
10c50 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 61 6e 74  }.  }..  /* Want
10c60 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b   a reserved lock
10c70 3f 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20 28  ? */.  else if (
10c80 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20  dwFileOffsetLow 
10c90 3d 3d 20 28 44 57 4f 52 44 29 52 45 53 45 52 56  == (DWORD)RESERV
10ca0 45 44 5f 42 59 54 45 0a 20 20 20 20 20 20 20 20  ED_BYTE.        
10cb0 20 20 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42     && nNumberOfB
10cc0 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d  ytesToLockLow ==
10cd0 20 31 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69   1){.    if (pFi
10ce0 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52 65 73  le->shared->bRes
10cf0 65 72 76 65 64 20 3d 3d 20 30 29 20 7b 0a 20 20  erved == 0) {.  
10d00 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65      pFile->share
10d10 64 2d 3e 62 52 65 73 65 72 76 65 64 20 3d 20 54  d->bReserved = T
10d20 52 55 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65  RUE;.      pFile
10d30 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76 65  ->local.bReserve
10d40 64 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20  d = TRUE;.      
10d50 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a  bReturn = TRUE;.
10d60 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 77 69 6e      }.  }..  win
10d70 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28 70  ceMutexRelease(p
10d80 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20  File->hMutex);. 
10d90 20 72 65 74 75 72 6e 20 62 52 65 74 75 72 6e 3b   return bReturn;
10da0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6d 70  .}../*.** An imp
10db0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
10dc0 68 65 20 55 6e 6c 6f 63 6b 46 69 6c 65 20 41 50  he UnlockFile AP
10dd0 49 20 6f 66 20 57 69 6e 64 6f 77 73 20 66 6f 72  I of Windows for
10de0 20 43 45 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f   CE.*/.static BO
10df0 4f 4c 20 77 69 6e 63 65 55 6e 6c 6f 63 6b 46 69  OL winceUnlockFi
10e00 6c 65 28 0a 20 20 4c 50 48 41 4e 44 4c 45 20 70  le(.  LPHANDLE p
10e10 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20 64  hFile,.  DWORD d
10e20 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 2c 0a  wFileOffsetLow,.
10e30 20 20 44 57 4f 52 44 20 64 77 46 69 6c 65 4f 66    DWORD dwFileOf
10e40 66 73 65 74 48 69 67 68 2c 0a 20 20 44 57 4f 52  fsetHigh,.  DWOR
10e50 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  D nNumberOfBytes
10e60 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 2c 0a 20 20 44  ToUnlockLow,.  D
10e70 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79  WORD nNumberOfBy
10e80 74 65 73 54 6f 55 6e 6c 6f 63 6b 48 69 67 68 0a  tesToUnlockHigh.
10e90 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46  ){.  winFile *pF
10ea0 69 6c 65 20 3d 20 48 41 4e 44 4c 45 5f 54 4f 5f  ile = HANDLE_TO_
10eb0 57 49 4e 46 49 4c 45 28 70 68 46 69 6c 65 29 3b  WINFILE(phFile);
10ec0 0a 20 20 42 4f 4f 4c 20 62 52 65 74 75 72 6e 20  .  BOOL bReturn 
10ed0 3d 20 46 41 4c 53 45 3b 0a 0a 20 20 55 4e 55 53  = FALSE;..  UNUS
10ee0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 77 46  ED_PARAMETER(dwF
10ef0 69 6c 65 4f 66 66 73 65 74 48 69 67 68 29 3b 0a  ileOffsetHigh);.
10f00 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
10f10 45 52 28 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65  ER(nNumberOfByte
10f20 73 54 6f 55 6e 6c 6f 63 6b 48 69 67 68 29 3b 0a  sToUnlockHigh);.
10f30 0a 20 20 69 66 20 28 21 70 46 69 6c 65 2d 3e 68  .  if (!pFile->h
10f40 4d 75 74 65 78 29 20 72 65 74 75 72 6e 20 54 52  Mutex) return TR
10f50 55 45 3b 0a 20 20 77 69 6e 63 65 4d 75 74 65 78  UE;.  winceMutex
10f60 41 63 71 75 69 72 65 28 70 46 69 6c 65 2d 3e 68  Acquire(pFile->h
10f70 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 52 65  Mutex);..  /* Re
10f80 6c 65 61 73 69 6e 67 20 61 20 72 65 61 64 65 72  leasing a reader
10f90 20 6c 6f 63 6b 20 6f 72 20 61 6e 20 65 78 63 6c   lock or an excl
10fa0 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20  usive lock */.  
10fb0 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74  if (dwFileOffset
10fc0 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48  Low == (DWORD)SH
10fd0 41 52 45 44 5f 46 49 52 53 54 29 7b 0a 20 20 20  ARED_FIRST){.   
10fe0 20 2f 2a 20 44 69 64 20 77 65 20 68 61 76 65 20   /* Did we have 
10ff0 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
11000 6b 3f 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 46  k? */.    if (pF
11010 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c  ile->local.bExcl
11020 75 73 69 76 65 29 7b 0a 20 20 20 20 20 20 61 73  usive){.      as
11030 73 65 72 74 28 6e 4e 75 6d 62 65 72 4f 66 42 79  sert(nNumberOfBy
11040 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d  tesToUnlockLow =
11050 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f  = (DWORD)SHARED_
11060 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 70 46 69  SIZE);.      pFi
11070 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75  le->local.bExclu
11080 73 69 76 65 20 3d 20 46 41 4c 53 45 3b 0a 20 20  sive = FALSE;.  
11090 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65      pFile->share
110a0 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 20  d->bExclusive = 
110b0 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 62 52 65  FALSE;.      bRe
110c0 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20  turn = TRUE;.   
110d0 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 69 64 20 77   }..    /* Did w
110e0 65 20 6a 75 73 74 20 68 61 76 65 20 61 20 72 65  e just have a re
110f0 61 64 65 72 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20  ader lock? */.  
11100 20 20 65 6c 73 65 20 69 66 20 28 70 46 69 6c 65    else if (pFile
11110 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73  ->local.nReaders
11120 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
11130 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f  nNumberOfBytesTo
11140 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 28 44 57  UnlockLow == (DW
11150 4f 52 44 29 53 48 41 52 45 44 5f 53 49 5a 45 0a  ORD)SHARED_SIZE.
11160 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
11170 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f  nNumberOfBytesTo
11180 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 3b  UnlockLow == 1);
11190 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f  .      pFile->lo
111a0 63 61 6c 2e 6e 52 65 61 64 65 72 73 20 2d 2d 3b  cal.nReaders --;
111b0 0a 20 20 20 20 20 20 69 66 20 28 70 46 69 6c 65  .      if (pFile
111c0 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73  ->local.nReaders
111d0 20 3d 3d 20 30 29 0a 20 20 20 20 20 20 7b 0a 20   == 0).      {. 
111e0 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68         pFile->sh
111f0 61 72 65 64 2d 3e 6e 52 65 61 64 65 72 73 20 2d  ared->nReaders -
11200 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  -;.      }.     
11210 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b   bReturn = TRUE;
11220 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
11230 20 52 65 6c 65 61 73 69 6e 67 20 61 20 70 65 6e   Releasing a pen
11240 64 69 6e 67 20 6c 6f 63 6b 20 2a 2f 0a 20 20 65  ding lock */.  e
11250 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66  lse if (dwFileOf
11260 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52  fsetLow == (DWOR
11270 44 29 50 45 4e 44 49 4e 47 5f 42 59 54 45 0a 20  D)PENDING_BYTE. 
11280 20 20 20 20 20 20 20 20 20 20 26 26 20 6e 4e 75            && nNu
11290 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c  mberOfBytesToUnl
112a0 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20  ockLow == 1){.  
112b0 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63    if (pFile->loc
112c0 61 6c 2e 62 50 65 6e 64 69 6e 67 29 7b 0a 20 20  al.bPending){.  
112d0 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c      pFile->local
112e0 2e 62 50 65 6e 64 69 6e 67 20 3d 20 46 41 4c 53  .bPending = FALS
112f0 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  E;.      pFile->
11300 73 68 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e 67  shared->bPending
11310 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20   = FALSE;.      
11320 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a  bReturn = TRUE;.
11330 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 52      }.  }.  /* R
11340 65 6c 65 61 73 69 6e 67 20 61 20 72 65 73 65 72  eleasing a reser
11350 76 65 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 65 6c  ved lock */.  el
11360 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66  se if (dwFileOff
11370 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44  setLow == (DWORD
11380 29 52 45 53 45 52 56 45 44 5f 42 59 54 45 0a 20  )RESERVED_BYTE. 
11390 20 20 20 20 20 20 20 20 20 20 26 26 20 6e 4e 75            && nNu
113a0 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c  mberOfBytesToUnl
113b0 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20  ockLow == 1){.  
113c0 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63    if (pFile->loc
113d0 61 6c 2e 62 52 65 73 65 72 76 65 64 29 20 7b 0a  al.bReserved) {.
113e0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63        pFile->loc
113f0 61 6c 2e 62 52 65 73 65 72 76 65 64 20 3d 20 46  al.bReserved = F
11400 41 4c 53 45 3b 0a 20 20 20 20 20 20 70 46 69 6c  ALSE;.      pFil
11410 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52 65 73 65  e->shared->bRese
11420 72 76 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20  rved = FALSE;.  
11430 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52      bReturn = TR
11440 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  UE;.    }.  }.. 
11450 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c 65 61   winceMutexRelea
11460 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78  se(pFile->hMutex
11470 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 52 65 74  );.  return bRet
11480 75 72 6e 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 45 6e 64  urn;.}./*.** End
11490 20 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c 20   of the special 
114a0 63 6f 64 65 20 66 6f 72 20 77 69 6e 63 65 0a 2a  code for wince.*
114b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
114c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
114d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
114e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
114f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 65  ************/.#e
11500 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
11510 53 5f 57 49 4e 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a  S_WINCE */../*.*
11520 2a 20 4c 6f 63 6b 20 61 20 66 69 6c 65 20 72 65  * Lock a file re
11530 67 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  gion..*/.static 
11540 42 4f 4f 4c 20 77 69 6e 4c 6f 63 6b 46 69 6c 65  BOOL winLockFile
11550 28 0a 20 20 4c 50 48 41 4e 44 4c 45 20 70 68 46  (.  LPHANDLE phF
11560 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20 66 6c 61  ile,.  DWORD fla
11570 67 73 2c 0a 20 20 44 57 4f 52 44 20 6f 66 66 73  gs,.  DWORD offs
11580 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6f  etLow,.  DWORD o
11590 66 66 73 65 74 48 69 67 68 2c 0a 20 20 44 57 4f  ffsetHigh,.  DWO
115a0 52 44 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 0a  RD numBytesLow,.
115b0 20 20 44 57 4f 52 44 20 6e 75 6d 42 79 74 65 73    DWORD numBytes
115c0 48 69 67 68 0a 29 7b 0a 23 69 66 20 53 51 4c 49  High.){.#if SQLI
115d0 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 2f 2a  TE_OS_WINCE.  /*
115e0 0a 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 69 6e 64  .  ** NOTE: Wind
115f0 6f 77 73 20 43 45 20 69 73 20 68 61 6e 64 6c 65  ows CE is handle
11600 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20 68 65  d differently he
11610 72 65 20 64 75 65 20 69 74 73 20 6c 61 63 6b 20  re due its lack 
11620 6f 66 20 74 68 65 20 57 69 6e 33 32 0a 20 20 2a  of the Win32.  *
11630 2a 20 20 20 20 20 20 20 41 50 49 20 4c 6f 63 6b  *       API Lock
11640 46 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74  File..  */.  ret
11650 75 72 6e 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c  urn winceLockFil
11660 65 28 70 68 46 69 6c 65 2c 20 6f 66 66 73 65 74  e(phFile, offset
11670 4c 6f 77 2c 20 6f 66 66 73 65 74 48 69 67 68 2c  Low, offsetHigh,
11680 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11690 20 20 20 20 20 20 20 20 6e 75 6d 42 79 74 65 73          numBytes
116a0 4c 6f 77 2c 20 6e 75 6d 42 79 74 65 73 48 69 67  Low, numBytesHig
116b0 68 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28 20  h);.#else.  if( 
116c0 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 20 20 20  osIsNT() ){.    
116d0 4f 56 45 52 4c 41 50 50 45 44 20 6f 76 6c 70 3b  OVERLAPPED ovlp;
116e0 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 6f 76 6c  .    memset(&ovl
116f0 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4f 56 45  p, 0, sizeof(OVE
11700 52 4c 41 50 50 45 44 29 29 3b 0a 20 20 20 20 6f  RLAPPED));.    o
11710 76 6c 70 2e 4f 66 66 73 65 74 20 3d 20 6f 66 66  vlp.Offset = off
11720 73 65 74 4c 6f 77 3b 0a 20 20 20 20 6f 76 6c 70  setLow;.    ovlp
11730 2e 4f 66 66 73 65 74 48 69 67 68 20 3d 20 6f 66  .OffsetHigh = of
11740 66 73 65 74 48 69 67 68 3b 0a 20 20 20 20 72 65  fsetHigh;.    re
11750 74 75 72 6e 20 6f 73 4c 6f 63 6b 46 69 6c 65 45  turn osLockFileE
11760 78 28 2a 70 68 46 69 6c 65 2c 20 66 6c 61 67 73  x(*phFile, flags
11770 2c 20 30 2c 20 6e 75 6d 42 79 74 65 73 4c 6f 77  , 0, numBytesLow
11780 2c 20 6e 75 6d 42 79 74 65 73 48 69 67 68 2c 20  , numBytesHigh, 
11790 26 6f 76 6c 70 29 3b 0a 20 20 7d 65 6c 73 65 7b  &ovlp);.  }else{
117a0 0a 20 20 20 20 72 65 74 75 72 6e 20 6f 73 4c 6f  .    return osLo
117b0 63 6b 46 69 6c 65 28 2a 70 68 46 69 6c 65 2c 20  ckFile(*phFile, 
117c0 6f 66 66 73 65 74 4c 6f 77 2c 20 6f 66 66 73 65  offsetLow, offse
117d0 74 48 69 67 68 2c 20 6e 75 6d 42 79 74 65 73 4c  tHigh, numBytesL
117e0 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ow,.            
117f0 20 20 20 20 20 20 20 20 20 20 6e 75 6d 42 79 74            numByt
11800 65 73 48 69 67 68 29 3b 0a 20 20 7d 0a 23 65 6e  esHigh);.  }.#en
11810 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c  dif.}../*.** Unl
11820 6f 63 6b 20 61 20 66 69 6c 65 20 72 65 67 69 6f  ock a file regio
11830 6e 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 42 4f  n.. */.static BO
11840 4f 4c 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65  OL winUnlockFile
11850 28 0a 20 20 4c 50 48 41 4e 44 4c 45 20 70 68 46  (.  LPHANDLE phF
11860 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20 6f 66 66  ile,.  DWORD off
11870 73 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20  setLow,.  DWORD 
11880 6f 66 66 73 65 74 48 69 67 68 2c 0a 20 20 44 57  offsetHigh,.  DW
11890 4f 52 44 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c  ORD numBytesLow,
118a0 0a 20 20 44 57 4f 52 44 20 6e 75 6d 42 79 74 65  .  DWORD numByte
118b0 73 48 69 67 68 0a 29 7b 0a 23 69 66 20 53 51 4c  sHigh.){.#if SQL
118c0 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 2f  ITE_OS_WINCE.  /
118d0 2a 0a 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 69 6e  *.  ** NOTE: Win
118e0 64 6f 77 73 20 43 45 20 69 73 20 68 61 6e 64 6c  dows CE is handl
118f0 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20 68  ed differently h
11900 65 72 65 20 64 75 65 20 69 74 73 20 6c 61 63 6b  ere due its lack
11910 20 6f 66 20 74 68 65 20 57 69 6e 33 32 0a 20 20   of the Win32.  
11920 2a 2a 20 20 20 20 20 20 20 41 50 49 20 55 6e 6c  **       API Unl
11930 6f 63 6b 46 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  ockFile..  */.  
11940 72 65 74 75 72 6e 20 77 69 6e 63 65 55 6e 6c 6f  return winceUnlo
11950 63 6b 46 69 6c 65 28 70 68 46 69 6c 65 2c 20 6f  ckFile(phFile, o
11960 66 66 73 65 74 4c 6f 77 2c 20 6f 66 66 73 65 74  ffsetLow, offset
11970 48 69 67 68 2c 0a 20 20 20 20 20 20 20 20 20 20  High,.          
11980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
11990 75 6d 42 79 74 65 73 4c 6f 77 2c 20 6e 75 6d 42  umBytesLow, numB
119a0 79 74 65 73 48 69 67 68 29 3b 0a 23 65 6c 73 65  ytesHigh);.#else
119b0 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20  .  if( osIsNT() 
119c0 29 7b 0a 20 20 20 20 4f 56 45 52 4c 41 50 50 45  ){.    OVERLAPPE
119d0 44 20 6f 76 6c 70 3b 0a 20 20 20 20 6d 65 6d 73  D ovlp;.    mems
119e0 65 74 28 26 6f 76 6c 70 2c 20 30 2c 20 73 69 7a  et(&ovlp, 0, siz
119f0 65 6f 66 28 4f 56 45 52 4c 41 50 50 45 44 29 29  eof(OVERLAPPED))
11a00 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66 66 73 65  ;.    ovlp.Offse
11a10 74 20 3d 20 6f 66 66 73 65 74 4c 6f 77 3b 0a 20  t = offsetLow;. 
11a20 20 20 20 6f 76 6c 70 2e 4f 66 66 73 65 74 48 69     ovlp.OffsetHi
11a30 67 68 20 3d 20 6f 66 66 73 65 74 48 69 67 68 3b  gh = offsetHigh;
11a40 0a 20 20 20 20 72 65 74 75 72 6e 20 6f 73 55 6e  .    return osUn
11a50 6c 6f 63 6b 46 69 6c 65 45 78 28 2a 70 68 46 69  lockFileEx(*phFi
11a60 6c 65 2c 20 30 2c 20 6e 75 6d 42 79 74 65 73 4c  le, 0, numBytesL
11a70 6f 77 2c 20 6e 75 6d 42 79 74 65 73 48 69 67 68  ow, numBytesHigh
11a80 2c 20 26 6f 76 6c 70 29 3b 0a 20 20 7d 65 6c 73  , &ovlp);.  }els
11a90 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6f 73  e{.    return os
11aa0 55 6e 6c 6f 63 6b 46 69 6c 65 28 2a 70 68 46 69  UnlockFile(*phFi
11ab0 6c 65 2c 20 6f 66 66 73 65 74 4c 6f 77 2c 20 6f  le, offsetLow, o
11ac0 66 66 73 65 74 48 69 67 68 2c 20 6e 75 6d 42 79  ffsetHigh, numBy
11ad0 74 65 73 4c 6f 77 2c 0a 20 20 20 20 20 20 20 20  tesLow,.        
11ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11af0 6e 75 6d 42 79 74 65 73 48 69 67 68 29 3b 0a 20  numBytesHigh);. 
11b00 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 2a   }.#endif.}../**
11b10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11b20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11b30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11b40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11b50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54  ***********.** T
11b60 68 65 20 6e 65 78 74 20 67 72 6f 75 70 20 6f 66  he next group of
11b70 20 72 6f 75 74 69 6e 65 73 20 69 6d 70 6c 65 6d   routines implem
11b80 65 6e 74 20 74 68 65 20 49 2f 4f 20 6d 65 74 68  ent the I/O meth
11b90 6f 64 73 20 73 70 65 63 69 66 69 65 64 0a 2a 2a  ods specified.**
11ba0 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 33 5f   by the sqlite3_
11bb0 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
11bc0 74 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  t..*************
11bd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11be0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11bf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11c00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11c10 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 20 4d  */../*.** Some M
11c20 69 63 72 6f 73 6f 66 74 20 63 6f 6d 70 69 6c 65  icrosoft compile
11c30 72 73 20 6c 61 63 6b 20 74 68 69 73 20 64 65 66  rs lack this def
11c40 69 6e 69 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e  inition..*/.#ifn
11c50 64 65 66 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f  def INVALID_SET_
11c60 46 49 4c 45 5f 50 4f 49 4e 54 45 52 0a 23 20 64  FILE_POINTER.# d
11c70 65 66 69 6e 65 20 49 4e 56 41 4c 49 44 5f 53 45  efine INVALID_SE
11c80 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 20 28  T_FILE_POINTER (
11c90 28 44 57 4f 52 44 29 2d 31 29 0a 23 65 6e 64 69  (DWORD)-1).#endi
11ca0 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  f../*.** Move th
11cb0 65 20 63 75 72 72 65 6e 74 20 70 6f 73 69 74 69  e current positi
11cc0 6f 6e 20 6f 66 20 74 68 65 20 66 69 6c 65 20 68  on of the file h
11cd0 61 6e 64 6c 65 20 70 61 73 73 65 64 20 61 73 20  andle passed as 
11ce0 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 61 72 67  the first.** arg
11cf0 75 6d 65 6e 74 20 74 6f 20 6f 66 66 73 65 74 20  ument to offset 
11d00 69 4f 66 66 73 65 74 20 77 69 74 68 69 6e 20 74  iOffset within t
11d10 68 65 20 66 69 6c 65 2e 20 49 66 20 73 75 63 63  he file. If succ
11d20 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e 20 30  essful, return 0
11d30 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
11d40 73 65 74 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  set pFile->lastE
11d50 72 72 6e 6f 20 61 6e 64 20 72 65 74 75 72 6e 20  rrno and return 
11d60 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61  non-zero..*/.sta
11d70 74 69 63 20 69 6e 74 20 77 69 6e 53 65 65 6b 46  tic int winSeekF
11d80 69 6c 65 28 77 69 6e 46 69 6c 65 20 2a 70 46 69  ile(winFile *pFi
11d90 6c 65 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  le, sqlite3_int6
11da0 34 20 69 4f 66 66 73 65 74 29 7b 0a 23 69 66 20  4 iOffset){.#if 
11db0 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
11dc0 0a 20 20 4c 4f 4e 47 20 75 70 70 65 72 42 69 74  .  LONG upperBit
11dd0 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
11de0 20 20 20 2f 2a 20 4d 6f 73 74 20 73 69 67 2e 20     /* Most sig. 
11df0 33 32 20 62 69 74 73 20 6f 66 20 6e 65 77 20 6f  32 bits of new o
11e00 66 66 73 65 74 20 2a 2f 0a 20 20 4c 4f 4e 47 20  ffset */.  LONG 
11e10 6c 6f 77 65 72 42 69 74 73 3b 20 20 20 20 20 20  lowerBits;      
11e20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
11e30 61 73 74 20 73 69 67 2e 20 33 32 20 62 69 74 73  ast sig. 32 bits
11e40 20 6f 66 20 6e 65 77 20 6f 66 66 73 65 74 20 2a   of new offset *
11e50 2f 0a 20 20 44 57 4f 52 44 20 64 77 52 65 74 3b  /.  DWORD dwRet;
11e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e70 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74      /* Value ret
11e80 75 72 6e 65 64 20 62 79 20 53 65 74 46 69 6c 65  urned by SetFile
11e90 50 6f 69 6e 74 65 72 28 29 20 2a 2f 0a 20 20 44  Pointer() */.  D
11ea0 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 20  WORD lastErrno; 
11eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11ec0 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64  * Value returned
11ed0 20 62 79 20 47 65 74 4c 61 73 74 45 72 72 6f 72   by GetLastError
11ee0 28 29 20 2a 2f 0a 0a 20 20 4f 53 54 52 41 43 45  () */..  OSTRACE
11ef0 28 28 22 53 45 45 4b 20 66 69 6c 65 3d 25 70 2c  (("SEEK file=%p,
11f00 20 6f 66 66 73 65 74 3d 25 6c 6c 64 5c 6e 22 2c   offset=%lld\n",
11f10 20 70 46 69 6c 65 2d 3e 68 2c 20 69 4f 66 66 73   pFile->h, iOffs
11f20 65 74 29 29 3b 0a 0a 20 20 75 70 70 65 72 42 69  et));..  upperBi
11f30 74 73 20 3d 20 28 4c 4f 4e 47 29 28 28 69 4f 66  ts = (LONG)((iOf
11f40 66 73 65 74 3e 3e 33 32 29 20 26 20 30 78 37 66  fset>>32) & 0x7f
11f50 66 66 66 66 66 66 29 3b 0a 20 20 6c 6f 77 65 72  ffffff);.  lower
11f60 42 69 74 73 20 3d 20 28 4c 4f 4e 47 29 28 69 4f  Bits = (LONG)(iO
11f70 66 66 73 65 74 20 26 20 30 78 66 66 66 66 66 66  ffset & 0xffffff
11f80 66 66 29 3b 0a 0a 20 20 2f 2a 20 41 50 49 20 6f  ff);..  /* API o
11f90 64 64 69 74 79 3a 20 49 66 20 73 75 63 63 65 73  ddity: If succes
11fa0 73 66 75 6c 2c 20 53 65 74 46 69 6c 65 50 6f 69  sful, SetFilePoi
11fb0 6e 74 65 72 28 29 20 72 65 74 75 72 6e 73 20 61  nter() returns a
11fc0 20 64 77 6f 72 64 0a 20 20 2a 2a 20 63 6f 6e 74   dword.  ** cont
11fd0 61 69 6e 69 6e 67 20 74 68 65 20 6c 6f 77 65 72  aining the lower
11fe0 20 33 32 2d 62 69 74 73 20 6f 66 20 74 68 65 20   32-bits of the 
11ff0 6e 65 77 20 66 69 6c 65 2d 6f 66 66 73 65 74 2e  new file-offset.
12000 20 4f 72 2c 20 69 66 20 69 74 20 66 61 69 6c 73   Or, if it fails
12010 2c 0a 20 20 2a 2a 20 69 74 20 72 65 74 75 72 6e  ,.  ** it return
12020 73 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49  s INVALID_SET_FI
12030 4c 45 5f 50 4f 49 4e 54 45 52 2e 20 48 6f 77 65  LE_POINTER. Howe
12040 76 65 72 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  ver according to
12050 20 4d 53 44 4e 2c 0a 20 20 2a 2a 20 49 4e 56 41   MSDN,.  ** INVA
12060 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49  LID_SET_FILE_POI
12070 4e 54 45 52 20 6d 61 79 20 61 6c 73 6f 20 62 65  NTER may also be
12080 20 61 20 76 61 6c 69 64 20 6e 65 77 20 6f 66 66   a valid new off
12090 73 65 74 2e 20 53 6f 20 74 6f 20 64 65 74 65 72  set. So to deter
120a0 6d 69 6e 65 0a 20 20 2a 2a 20 77 68 65 74 68 65  mine.  ** whethe
120b0 72 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 61  r an error has a
120c0 63 74 75 61 6c 6c 79 20 6f 63 63 75 72 72 65 64  ctually occurred
120d0 2c 20 69 74 20 69 73 20 61 6c 73 6f 20 6e 65 63  , it is also nec
120e0 65 73 73 61 72 79 20 74 6f 20 63 61 6c 6c 0a 20  essary to call. 
120f0 20 2a 2a 20 47 65 74 4c 61 73 74 45 72 72 6f 72   ** GetLastError
12100 28 29 2e 0a 20 20 2a 2f 0a 20 20 64 77 52 65 74  ()..  */.  dwRet
12110 20 3d 20 6f 73 53 65 74 46 69 6c 65 50 6f 69 6e   = osSetFilePoin
12120 74 65 72 28 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f  ter(pFile->h, lo
12130 77 65 72 42 69 74 73 2c 20 26 75 70 70 65 72 42  werBits, &upperB
12140 69 74 73 2c 20 46 49 4c 45 5f 42 45 47 49 4e 29  its, FILE_BEGIN)
12150 3b 0a 0a 20 20 69 66 28 20 28 64 77 52 65 74 3d  ;..  if( (dwRet=
12160 3d 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c  =INVALID_SET_FIL
12170 45 5f 50 4f 49 4e 54 45 52 0a 20 20 20 20 20 20  E_POINTER.      
12180 26 26 20 28 28 6c 61 73 74 45 72 72 6e 6f 20 3d  && ((lastErrno =
12190 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
121a0 29 29 21 3d 4e 4f 5f 45 52 52 4f 52 29 29 20 29  ))!=NO_ERROR)) )
121b0 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73  {.    pFile->las
121c0 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72  tErrno = lastErr
121d0 6e 6f 3b 0a 20 20 20 20 77 69 6e 4c 6f 67 45 72  no;.    winLogEr
121e0 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
121f0 5f 53 45 45 4b 2c 20 70 46 69 6c 65 2d 3e 6c 61  _SEEK, pFile->la
12200 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
12210 20 20 20 20 20 20 20 20 20 22 77 69 6e 53 65 65           "winSee
12220 6b 46 69 6c 65 22 2c 20 70 46 69 6c 65 2d 3e 7a  kFile", pFile->z
12230 50 61 74 68 29 3b 0a 20 20 20 20 4f 53 54 52 41  Path);.    OSTRA
12240 43 45 28 28 22 53 45 45 4b 20 66 69 6c 65 3d 25  CE(("SEEK file=%
12250 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45  p, rc=SQLITE_IOE
12260 52 52 5f 53 45 45 4b 5c 6e 22 2c 20 70 46 69 6c  RR_SEEK\n", pFil
12270 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75  e->h));.    retu
12280 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54  rn 1;.  }..  OST
12290 52 41 43 45 28 28 22 53 45 45 4b 20 66 69 6c 65  RACE(("SEEK file
122a0 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f  =%p, rc=SQLITE_O
122b0 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29  K\n", pFile->h))
122c0 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 23 65  ;.  return 0;.#e
122d0 6c 73 65 0a 20 20 2f 2a 0a 20 20 2a 2a 20 53 61  lse.  /*.  ** Sa
122e0 6d 65 20 61 73 20 61 62 6f 76 65 2c 20 65 78 63  me as above, exc
122f0 65 70 74 20 74 68 61 74 20 74 68 69 73 20 69 6d  ept that this im
12300 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 77 6f 72  plementation wor
12310 6b 73 20 66 6f 72 20 57 69 6e 52 54 2e 0a 20 20  ks for WinRT..  
12320 2a 2f 0a 0a 20 20 4c 41 52 47 45 5f 49 4e 54 45  */..  LARGE_INTE
12330 47 45 52 20 78 3b 20 20 20 20 20 20 20 20 20 20  GER x;          
12340 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77        /* The new
12350 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 42 4f 4f   offset */.  BOO
12360 4c 20 62 52 65 74 3b 20 20 20 20 20 20 20 20 20  L bRet;         
12370 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12380 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  Value returned b
12390 79 20 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72  y SetFilePointer
123a0 45 78 28 29 20 2a 2f 0a 0a 20 20 78 2e 51 75 61  Ex() */..  x.Qua
123b0 64 50 61 72 74 20 3d 20 69 4f 66 66 73 65 74 3b  dPart = iOffset;
123c0 0a 20 20 62 52 65 74 20 3d 20 6f 73 53 65 74 46  .  bRet = osSetF
123d0 69 6c 65 50 6f 69 6e 74 65 72 45 78 28 70 46 69  ilePointerEx(pFi
123e0 6c 65 2d 3e 68 2c 20 78 2c 20 30 2c 20 46 49 4c  le->h, x, 0, FIL
123f0 45 5f 42 45 47 49 4e 29 3b 0a 0a 20 20 69 66 28  E_BEGIN);..  if(
12400 21 62 52 65 74 29 7b 0a 20 20 20 20 70 46 69 6c  !bRet){.    pFil
12410 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f  e->lastErrno = o
12420 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b  sGetLastError();
12430 0a 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72  .    winLogError
12440 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 45  (SQLITE_IOERR_SE
12450 45 4b 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  EK, pFile->lastE
12460 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
12470 20 20 20 20 20 20 22 77 69 6e 53 65 65 6b 46 69        "winSeekFi
12480 6c 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  le", pFile->zPat
12490 68 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28  h);.    OSTRACE(
124a0 28 22 53 45 45 4b 20 66 69 6c 65 3d 25 70 2c 20  ("SEEK file=%p, 
124b0 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rc=SQLITE_IOERR_
124c0 53 45 45 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  SEEK\n", pFile->
124d0 68 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  h));.    return 
124e0 31 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43  1;.  }..  OSTRAC
124f0 45 28 28 22 53 45 45 4b 20 66 69 6c 65 3d 25 70  E(("SEEK file=%p
12500 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e  , rc=SQLITE_OK\n
12510 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20  ", pFile->h));. 
12520 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69   return 0;.#endi
12530 66 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  f.}..#if SQLITE_
12540 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
12550 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
12560 65 6e 63 65 73 20 74 6f 20 56 46 53 20 68 65 6c  ences to VFS hel
12570 70 65 72 20 6d 65 74 68 6f 64 73 20 75 73 65 64  per methods used
12580 20 66 6f 72 20 6d 65 6d 6f 72 79 20 6d 61 70 70   for memory mapp
12590 65 64 20 66 69 6c 65 73 20 2a 2f 0a 73 74 61 74  ed files */.stat
125a0 69 63 20 69 6e 74 20 77 69 6e 4d 61 70 66 69 6c  ic int winMapfil
125b0 65 28 77 69 6e 46 69 6c 65 2a 2c 20 73 71 6c 69  e(winFile*, sqli
125c0 74 65 33 5f 69 6e 74 36 34 29 3b 0a 73 74 61 74  te3_int64);.stat
125d0 69 63 20 69 6e 74 20 77 69 6e 55 6e 6d 61 70 66  ic int winUnmapf
125e0 69 6c 65 28 77 69 6e 46 69 6c 65 2a 29 3b 0a 23  ile(winFile*);.#
125f0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  endif../*.** Clo
12600 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  se a file..**.**
12610 20 49 74 20 69 73 20 72 65 70 6f 72 74 65 64 20   It is reported 
12620 74 68 61 74 20 61 6e 20 61 74 74 65 6d 70 74 20  that an attempt 
12630 74 6f 20 63 6c 6f 73 65 20 61 20 68 61 6e 64 6c  to close a handl
12640 65 20 6d 69 67 68 74 20 73 6f 6d 65 74 69 6d 65  e might sometime
12650 73 0a 2a 2a 20 66 61 69 6c 2e 20 20 54 68 69 73  s.** fail.  This
12660 20 69 73 20 61 20 76 65 72 79 20 75 6e 72 65 61   is a very unrea
12670 73 6f 6e 61 62 6c 65 20 72 65 73 75 6c 74 2c 20  sonable result, 
12680 62 75 74 20 57 69 6e 64 6f 77 73 20 69 73 20 6e  but Windows is n
12690 6f 74 6f 72 69 6f 75 73 0a 2a 2a 20 66 6f 72 20  otorious.** for 
126a0 62 65 69 6e 67 20 75 6e 72 65 61 73 6f 6e 61 62  being unreasonab
126b0 6c 65 20 73 6f 20 49 20 64 6f 20 6e 6f 74 20 64  le so I do not d
126c0 6f 75 62 74 20 74 68 61 74 20 69 74 20 6d 69 67  oubt that it mig
126d0 68 74 20 68 61 70 70 65 6e 2e 20 20 49 66 0a 2a  ht happen.  If.*
126e0 2a 20 74 68 65 20 63 6c 6f 73 65 20 66 61 69 6c  * the close fail
126f0 73 2c 20 77 65 20 70 61 75 73 65 20 66 6f 72 20  s, we pause for 
12700 31 30 30 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73  100 milliseconds
12710 20 61 6e 64 20 74 72 79 20 61 67 61 69 6e 2e 20   and try again. 
12720 20 41 73 0a 2a 2a 20 6d 61 6e 79 20 61 73 20 4d   As.** many as M
12730 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d 50 54 20  X_CLOSE_ATTEMPT 
12740 61 74 74 65 6d 70 74 73 20 74 6f 20 63 6c 6f 73  attempts to clos
12750 65 20 74 68 65 20 68 61 6e 64 6c 65 20 61 72 65  e the handle are
12760 20 6d 61 64 65 20 62 65 66 6f 72 65 0a 2a 2a 20   made before.** 
12770 67 69 76 69 6e 67 20 75 70 20 61 6e 64 20 72 65  giving up and re
12780 74 75 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72  turning an error
12790 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 58 5f  ..*/.#define MX_
127a0 43 4c 4f 53 45 5f 41 54 54 45 4d 50 54 20 33 0a  CLOSE_ATTEMPT 3.
127b0 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 43 6c  static int winCl
127c0 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ose(sqlite3_file
127d0 20 2a 69 64 29 7b 0a 20 20 69 6e 74 20 72 63 2c   *id){.  int rc,
127e0 20 63 6e 74 20 3d 20 30 3b 0a 20 20 77 69 6e 46   cnt = 0;.  winF
127f0 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69  ile *pFile = (wi
12800 6e 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 61 73  nFile*)id;..  as
12810 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 23  sert( id!=0 );.#
12820 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
12830 49 54 5f 57 41 4c 0a 20 20 61 73 73 65 72 74 28  IT_WAL.  assert(
12840 20 70 46 69 6c 65 2d 3e 70 53 68 6d 3d 3d 30 20   pFile->pShm==0 
12850 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65  );.#endif.  asse
12860 72 74 28 20 70 46 69 6c 65 2d 3e 68 21 3d 4e 55  rt( pFile->h!=NU
12870 4c 4c 20 26 26 20 70 46 69 6c 65 2d 3e 68 21 3d  LL && pFile->h!=
12880 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56  INVALID_HANDLE_V
12890 41 4c 55 45 20 29 3b 0a 20 20 4f 53 54 52 41 43  ALUE );.  OSTRAC
128a0 45 28 28 22 43 4c 4f 53 45 20 66 69 6c 65 3d 25  E(("CLOSE file=%
128b0 70 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29  p\n", pFile->h))
128c0 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  ;..#if SQLITE_MA
128d0 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
128e0 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28 70 46 69  winUnmapfile(pFi
128f0 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 64  le);.#endif..  d
12900 6f 7b 0a 20 20 20 20 72 63 20 3d 20 6f 73 43 6c  o{.    rc = osCl
12910 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d  oseHandle(pFile-
12920 3e 68 29 3b 0a 20 20 20 20 2f 2a 20 53 69 6d 75  >h);.    /* Simu
12930 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d  lateIOError( rc=
12940 30 3b 20 63 6e 74 3d 4d 58 5f 43 4c 4f 53 45 5f  0; cnt=MX_CLOSE_
12950 41 54 54 45 4d 50 54 3b 20 29 3b 20 2a 2f 0a 20  ATTEMPT; ); */. 
12960 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 30 20 26   }while( rc==0 &
12970 26 20 2b 2b 63 6e 74 20 3c 20 4d 58 5f 43 4c 4f  & ++cnt < MX_CLO
12980 53 45 5f 41 54 54 45 4d 50 54 20 26 26 20 28 73  SE_ATTEMPT && (s
12990 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65  qlite3_win32_sle
129a0 65 70 28 31 30 30 29 2c 20 31 29 20 29 3b 0a 23  ep(100), 1) );.#
129b0 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
129c0 43 45 0a 23 64 65 66 69 6e 65 20 57 49 4e 43 45  CE.#define WINCE
129d0 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d 50  _DELETION_ATTEMP
129e0 54 53 20 33 0a 20 20 77 69 6e 63 65 44 65 73 74  TS 3.  winceDest
129f0 72 6f 79 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a  royLock(pFile);.
12a00 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 7a 44 65    if( pFile->zDe
12a10 6c 65 74 65 4f 6e 43 6c 6f 73 65 20 29 7b 0a 20  leteOnClose ){. 
12a20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a     int cnt = 0;.
12a30 20 20 20 20 77 68 69 6c 65 28 0a 20 20 20 20 20      while(.     
12a40 20 20 20 20 20 20 6f 73 44 65 6c 65 74 65 46 69        osDeleteFi
12a50 6c 65 57 28 70 46 69 6c 65 2d 3e 7a 44 65 6c 65  leW(pFile->zDele
12a60 74 65 4f 6e 43 6c 6f 73 65 29 3d 3d 30 0a 20 20  teOnClose)==0.  
12a70 20 20 20 20 20 20 26 26 20 6f 73 47 65 74 46 69        && osGetFi
12a80 6c 65 41 74 74 72 69 62 75 74 65 73 57 28 70 46  leAttributesW(pF
12a90 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c  ile->zDeleteOnCl
12aa0 6f 73 65 29 21 3d 30 78 66 66 66 66 66 66 66 66  ose)!=0xffffffff
12ab0 0a 20 20 20 20 20 20 20 20 26 26 20 63 6e 74 2b  .        && cnt+
12ac0 2b 20 3c 20 57 49 4e 43 45 5f 44 45 4c 45 54 49  + < WINCE_DELETI
12ad0 4f 4e 5f 41 54 54 45 4d 50 54 53 0a 20 20 20 20  ON_ATTEMPTS.    
12ae0 29 7b 0a 20 20 20 20 20 20 20 73 71 6c 69 74 65  ){.       sqlite
12af0 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28 31 30  3_win32_sleep(10
12b00 30 29 3b 20 20 2f 2a 20 57 61 69 74 20 61 20 6c  0);  /* Wait a l
12b10 69 74 74 6c 65 20 62 65 66 6f 72 65 20 74 72 79  ittle before try
12b20 69 6e 67 20 61 67 61 69 6e 20 2a 2f 0a 20 20 20  ing again */.   
12b30 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
12b40 72 65 65 28 70 46 69 6c 65 2d 3e 7a 44 65 6c 65  ree(pFile->zDele
12b50 74 65 4f 6e 43 6c 6f 73 65 29 3b 0a 20 20 7d 0a  teOnClose);.  }.
12b60 23 65 6e 64 69 66 0a 20 20 69 66 28 20 72 63 20  #endif.  if( rc 
12b70 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68 20  ){.    pFile->h 
12b80 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 20 20 4f 70  = NULL;.  }.  Op
12b90 65 6e 43 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20  enCounter(-1);. 
12ba0 20 4f 53 54 52 41 43 45 28 28 22 43 4c 4f 53 45   OSTRACE(("CLOSE
12bb0 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c   file=%p, rc=%s\
12bc0 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63  n", pFile->h, rc
12bd0 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65   ? "ok" : "faile
12be0 64 22 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  d"));.  return r
12bf0 63 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20  c ? SQLITE_OK.  
12c00 20 20 20 20 20 20 20 20 20 20 3a 20 77 69 6e 4c            : winL
12c10 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
12c20 4f 45 52 52 5f 43 4c 4f 53 45 2c 20 6f 73 47 65  OERR_CLOSE, osGe
12c30 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20  tLastError(),.  
12c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c50 20 20 20 20 20 20 20 20 22 77 69 6e 43 6c 6f 73          "winClos
12c60 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  e", pFile->zPath
12c70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  );.}../*.** Read
12c80 20 64 61 74 61 20 66 72 6f 6d 20 61 20 66 69 6c   data from a fil
12c90 65 20 69 6e 74 6f 20 61 20 62 75 66 66 65 72 2e  e into a buffer.
12ca0 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
12cb0 4f 4b 20 69 66 20 61 6c 6c 0a 2a 2a 20 62 79 74  OK if all.** byt
12cc0 65 73 20 77 65 72 65 20 72 65 61 64 20 73 75 63  es were read suc
12cd0 63 65 73 73 66 75 6c 6c 79 20 61 6e 64 20 53 51  cessfully and SQ
12ce0 4c 49 54 45 5f 49 4f 45 52 52 20 69 66 20 61 6e  LITE_IOERR if an
12cf0 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77  ything goes.** w
12d00 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rong..*/.static 
12d10 69 6e 74 20 77 69 6e 52 65 61 64 28 0a 20 20 73  int winRead(.  s
12d20 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
12d30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
12d40 65 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a  e to read from *
12d50 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20  /.  void *pBuf, 
12d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12d70 2a 20 57 72 69 74 65 20 63 6f 6e 74 65 6e 74 20  * Write content 
12d80 69 6e 74 6f 20 74 68 69 73 20 62 75 66 66 65 72  into this buffer
12d90 20 2a 2f 0a 20 20 69 6e 74 20 61 6d 74 2c 20 20   */.  int amt,  
12da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12db0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
12dc0 74 65 73 20 74 6f 20 72 65 61 64 20 2a 2f 0a 20  tes to read */. 
12dd0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f   sqlite3_int64 o
12de0 66 66 73 65 74 20 20 20 20 20 20 20 2f 2a 20 42  ffset       /* B
12df0 65 67 69 6e 20 72 65 61 64 69 6e 67 20 61 74 20  egin reading at 
12e00 74 68 69 73 20 6f 66 66 73 65 74 20 2a 2f 0a 29  this offset */.)
12e10 7b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  {.#if !SQLITE_OS
12e20 5f 57 49 4e 43 45 0a 20 20 4f 56 45 52 4c 41 50  _WINCE.  OVERLAP
12e30 50 45 44 20 6f 76 65 72 6c 61 70 70 65 64 3b 20  PED overlapped; 
12e40 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
12e50 6f 66 66 73 65 74 20 66 6f 72 20 52 65 61 64 46  offset for ReadF
12e60 69 6c 65 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  ile. */.#endif. 
12e70 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20   winFile *pFile 
12e80 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 20  = (winFile*)id; 
12e90 20 2f 2a 20 66 69 6c 65 20 68 61 6e 64 6c 65 20   /* file handle 
12ea0 2a 2f 0a 20 20 44 57 4f 52 44 20 6e 52 65 61 64  */.  DWORD nRead
12eb0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
12ec0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
12ed0 66 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79  f bytes actually
12ee0 20 72 65 61 64 20 66 72 6f 6d 20 66 69 6c 65 20   read from file 
12ef0 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 74 72 79 20  */.  int nRetry 
12f00 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
12f10 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
12f20 66 20 72 65 74 72 79 73 20 2a 2f 0a 0a 20 20 61  f retrys */..  a
12f30 73 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a  ssert( id!=0 );.
12f40 20 20 61 73 73 65 72 74 28 20 61 6d 74 3e 30 20    assert( amt>0 
12f50 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66  );.  assert( off
12f60 73 65 74 3e 3d 30 20 29 3b 0a 20 20 53 69 6d 75  set>=0 );.  Simu
12f70 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75  lateIOError(retu
12f80 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
12f90 52 45 41 44 29 3b 0a 20 20 4f 53 54 52 41 43 45  READ);.  OSTRACE
12fa0 28 28 22 52 45 41 44 20 66 69 6c 65 3d 25 70 2c  (("READ file=%p,
12fb0 20 62 75 66 66 65 72 3d 25 70 2c 20 61 6d 6f 75   buffer=%p, amou
12fc0 6e 74 3d 25 64 2c 20 6f 66 66 73 65 74 3d 25 6c  nt=%d, offset=%l
12fd0 6c 64 2c 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 0a  ld, lock=%d\n",.
12fe0 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
12ff0 2d 3e 68 2c 20 70 42 75 66 2c 20 61 6d 74 2c 20  ->h, pBuf, amt, 
13000 6f 66 66 73 65 74 2c 20 70 46 69 6c 65 2d 3e 6c  offset, pFile->l
13010 6f 63 6b 74 79 70 65 29 29 3b 0a 0a 23 69 66 20  ocktype));..#if 
13020 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
13030 53 49 5a 45 3e 30 0a 20 20 2f 2a 20 44 65 61 6c  SIZE>0.  /* Deal
13040 20 77 69 74 68 20 61 73 20 6d 75 63 68 20 6f 66   with as much of
13050 20 74 68 69 73 20 72 65 61 64 20 72 65 71 75 65   this read reque
13060 73 74 20 61 73 20 70 6f 73 73 69 62 6c 65 20 62  st as possible b
13070 79 20 74 72 61 6e 73 66 65 72 69 6e 67 0a 20 20  y transfering.  
13080 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65  ** data from the
13090 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20   memory mapping 
130a0 75 73 69 6e 67 20 6d 65 6d 63 70 79 28 29 2e 20  using memcpy(). 
130b0 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73 65 74   */.  if( offset
130c0 3c 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65  <pFile->mmapSize
130d0 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 66 66 73   ){.    if( offs
130e0 65 74 2b 61 6d 74 20 3c 3d 20 70 46 69 6c 65 2d  et+amt <= pFile-
130f0 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20  >mmapSize ){.   
13100 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20     memcpy(pBuf, 
13110 26 28 28 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e  &((u8 *)(pFile->
13120 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66  pMapRegion))[off
13130 73 65 74 5d 2c 20 61 6d 74 29 3b 0a 20 20 20 20  set], amt);.    
13140 20 20 4f 53 54 52 41 43 45 28 28 22 52 45 41 44    OSTRACE(("READ
13150 2d 4d 4d 41 50 20 66 69 6c 65 3d 25 70 2c 20 72  -MMAP file=%p, r
13160 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20  c=SQLITE_OK\n", 
13170 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20  pFile->h));.    
13180 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
13190 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  OK;.    }else{. 
131a0 20 20 20 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d       int nCopy =
131b0 20 28 69 6e 74 29 28 70 46 69 6c 65 2d 3e 6d 6d   (int)(pFile->mm
131c0 61 70 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 29  apSize - offset)
131d0 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70  ;.      memcpy(p
131e0 42 75 66 2c 20 26 28 28 75 38 20 2a 29 28 70 46  Buf, &((u8 *)(pF
131f0 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29  ile->pMapRegion)
13200 29 5b 6f 66 66 73 65 74 5d 2c 20 6e 43 6f 70 79  )[offset], nCopy
13210 29 3b 0a 20 20 20 20 20 20 70 42 75 66 20 3d 20  );.      pBuf = 
13220 26 28 28 75 38 20 2a 29 70 42 75 66 29 5b 6e 43  &((u8 *)pBuf)[nC
13230 6f 70 79 5d 3b 0a 20 20 20 20 20 20 61 6d 74 20  opy];.      amt 
13240 2d 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 20 20  -= nCopy;.      
13250 6f 66 66 73 65 74 20 2b 3d 20 6e 43 6f 70 79 3b  offset += nCopy;
13260 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
13270 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  f..#if SQLITE_OS
13280 5f 57 49 4e 43 45 0a 20 20 69 66 28 20 77 69 6e  _WINCE.  if( win
13290 53 65 65 6b 46 69 6c 65 28 70 46 69 6c 65 2c 20  SeekFile(pFile, 
132a0 6f 66 66 73 65 74 29 20 29 7b 0a 20 20 20 20 4f  offset) ){.    O
132b0 53 54 52 41 43 45 28 28 22 52 45 41 44 20 66 69  STRACE(("READ fi
132c0 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
132d0 5f 46 55 4c 4c 5c 6e 22 2c 20 70 46 69 6c 65 2d  _FULL\n", pFile-
132e0 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  >h));.    return
132f0 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20   SQLITE_FULL;.  
13300 7d 0a 20 20 77 68 69 6c 65 28 20 21 6f 73 52 65  }.  while( !osRe
13310 61 64 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c  adFile(pFile->h,
13320 20 70 42 75 66 2c 20 61 6d 74 2c 20 26 6e 52 65   pBuf, amt, &nRe
13330 61 64 2c 20 30 29 20 29 7b 0a 23 65 6c 73 65 0a  ad, 0) ){.#else.
13340 20 20 6d 65 6d 73 65 74 28 26 6f 76 65 72 6c 61    memset(&overla
13350 70 70 65 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28  pped, 0, sizeof(
13360 4f 56 45 52 4c 41 50 50 45 44 29 29 3b 0a 20 20  OVERLAPPED));.  
13370 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66 66 73 65  overlapped.Offse
13380 74 20 3d 20 28 4c 4f 4e 47 29 28 6f 66 66 73 65  t = (LONG)(offse
13390 74 20 26 20 30 78 66 66 66 66 66 66 66 66 29 3b  t & 0xffffffff);
133a0 0a 20 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66  .  overlapped.Of
133b0 66 73 65 74 48 69 67 68 20 3d 20 28 4c 4f 4e 47  fsetHigh = (LONG
133c0 29 28 28 6f 66 66 73 65 74 3e 3e 33 32 29 20 26  )((offset>>32) &
133d0 20 30 78 37 66 66 66 66 66 66 66 29 3b 0a 20 20   0x7fffffff);.  
133e0 77 68 69 6c 65 28 20 21 6f 73 52 65 61 64 46 69  while( !osReadFi
133f0 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 70 42 75  le(pFile->h, pBu
13400 66 2c 20 61 6d 74 2c 20 26 6e 52 65 61 64 2c 20  f, amt, &nRead, 
13410 26 6f 76 65 72 6c 61 70 70 65 64 29 20 26 26 0a  &overlapped) &&.
13420 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 4c 61           osGetLa
13430 73 74 45 72 72 6f 72 28 29 21 3d 45 52 52 4f 52  stError()!=ERROR
13440 5f 48 41 4e 44 4c 45 5f 45 4f 46 20 29 7b 0a 23  _HANDLE_EOF ){.#
13450 65 6e 64 69 66 0a 20 20 20 20 44 57 4f 52 44 20  endif.    DWORD 
13460 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 69  lastErrno;.    i
13470 66 28 20 77 69 6e 52 65 74 72 79 49 6f 65 72 72  f( winRetryIoerr
13480 28 26 6e 52 65 74 72 79 2c 20 26 6c 61 73 74 45  (&nRetry, &lastE
13490 72 72 6e 6f 29 20 29 20 63 6f 6e 74 69 6e 75 65  rrno) ) continue
134a0 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73  ;.    pFile->las
134b0 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72  tErrno = lastErr
134c0 6e 6f 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28  no;.    OSTRACE(
134d0 28 22 52 45 41 44 20 66 69 6c 65 3d 25 70 2c 20  ("READ file=%p, 
134e0 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rc=SQLITE_IOERR_
134f0 52 45 41 44 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  READ\n", pFile->
13500 68 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  h));.    return 
13510 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
13520 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 2c 20 70  TE_IOERR_READ, p
13530 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c  File->lastErrno,
13540 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13550 20 20 20 20 20 20 20 20 22 77 69 6e 52 65 61 64          "winRead
13560 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
13570 3b 0a 20 20 7d 0a 20 20 77 69 6e 4c 6f 67 49 6f  ;.  }.  winLogIo
13580 65 72 72 28 6e 52 65 74 72 79 29 3b 0a 20 20 69  err(nRetry);.  i
13590 66 28 20 6e 52 65 61 64 3c 28 44 57 4f 52 44 29  f( nRead<(DWORD)
135a0 61 6d 74 20 29 7b 0a 20 20 20 20 2f 2a 20 55 6e  amt ){.    /* Un
135b0 72 65 61 64 20 70 61 72 74 73 20 6f 66 20 74 68  read parts of th
135c0 65 20 62 75 66 66 65 72 20 6d 75 73 74 20 62 65  e buffer must be
135d0 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 2a 2f 0a   zero-filled */.
135e0 20 20 20 20 6d 65 6d 73 65 74 28 26 28 28 63 68      memset(&((ch
135f0 61 72 2a 29 70 42 75 66 29 5b 6e 52 65 61 64 5d  ar*)pBuf)[nRead]
13600 2c 20 30 2c 20 61 6d 74 2d 6e 52 65 61 64 29 3b  , 0, amt-nRead);
13610 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 52  .    OSTRACE(("R
13620 45 41 44 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  EAD file=%p, rc=
13630 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
13640 52 54 5f 52 45 41 44 5c 6e 22 2c 20 70 46 69 6c  RT_READ\n", pFil
13650 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75  e->h));.    retu
13660 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
13670 53 48 4f 52 54 5f 52 45 41 44 3b 0a 20 20 7d 0a  SHORT_READ;.  }.
13680 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52 45 41  .  OSTRACE(("REA
13690 44 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51  D file=%p, rc=SQ
136a0 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c  LITE_OK\n", pFil
136b0 65 2d 3e 68 29 29 3b 0a 20 20 72 65 74 75 72 6e  e->h));.  return
136c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
136d0 2a 0a 2a 2a 20 57 72 69 74 65 20 64 61 74 61 20  *.** Write data 
136e0 66 72 6f 6d 20 61 20 62 75 66 66 65 72 20 69 6e  from a buffer in
136f0 74 6f 20 61 20 66 69 6c 65 2e 20 20 52 65 74 75  to a file.  Retu
13700 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
13710 73 75 63 63 65 73 73 0a 2a 2a 20 6f 72 20 73 6f  success.** or so
13720 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63  me other error c
13730 6f 64 65 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a  ode on failure..
13740 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
13750 6e 57 72 69 74 65 28 0a 20 20 73 71 6c 69 74 65  nWrite(.  sqlite
13760 33 5f 66 69 6c 65 20 2a 69 64 2c 20 20 20 20 20  3_file *id,     
13770 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
13780 65 20 74 6f 20 77 72 69 74 65 20 69 6e 74 6f 20  e to write into 
13790 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  */.  const void 
137a0 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 20  *pBuf,          
137b0 20 20 20 20 20 2f 2a 20 54 68 65 20 62 79 74 65       /* The byte
137c0 73 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  s to be written 
137d0 2a 2f 0a 20 20 69 6e 74 20 61 6d 74 2c 20 20 20  */.  int amt,   
137e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
137f0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
13800 66 20 62 79 74 65 73 20 74 6f 20 77 72 69 74 65  f bytes to write
13810 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
13820 74 36 34 20 6f 66 66 73 65 74 20 20 20 20 20 20  t64 offset      
13830 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
13840 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 20 74 6f  into the file to
13850 20 62 65 67 69 6e 20 77 72 69 74 69 6e 67 20 61   begin writing a
13860 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  t */.){.  int rc
13870 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
13880 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
13890 65 20 69 66 20 65 72 72 6f 72 20 68 61 73 20 6f  e if error has o
138a0 63 63 75 72 72 65 64 2c 20 65 6c 73 65 20 66 61  ccurred, else fa
138b0 6c 73 65 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65  lse */.  winFile
138c0 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69   *pFile = (winFi
138d0 6c 65 2a 29 69 64 3b 20 20 2f 2a 20 46 69 6c 65  le*)id;  /* File
138e0 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74   handle */.  int
138f0 20 6e 52 65 74 72 79 20 3d 20 30 3b 20 20 20 20   nRetry = 0;    
13900 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13910 4e 75 6d 62 65 72 20 6f 66 20 72 65 74 72 69 65  Number of retrie
13920 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  s */..  assert( 
13930 61 6d 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  amt>0 );.  asser
13940 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 53 69  t( pFile );.  Si
13950 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65  mulateIOError(re
13960 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
13970 52 5f 57 52 49 54 45 29 3b 0a 20 20 53 69 6d 75  R_WRITE);.  Simu
13980 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f  lateDiskfullErro
13990 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  r(return SQLITE_
139a0 46 55 4c 4c 29 3b 0a 0a 20 20 4f 53 54 52 41 43  FULL);..  OSTRAC
139b0 45 28 28 22 57 52 49 54 45 20 66 69 6c 65 3d 25  E(("WRITE file=%
139c0 70 2c 20 62 75 66 66 65 72 3d 25 70 2c 20 61 6d  p, buffer=%p, am
139d0 6f 75 6e 74 3d 25 64 2c 20 6f 66 66 73 65 74 3d  ount=%d, offset=
139e0 25 6c 6c 64 2c 20 6c 6f 63 6b 3d 25 64 5c 6e 22  %lld, lock=%d\n"
139f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69  ,.           pFi
13a00 6c 65 2d 3e 68 2c 20 70 42 75 66 2c 20 61 6d 74  le->h, pBuf, amt
13a10 2c 20 6f 66 66 73 65 74 2c 20 70 46 69 6c 65 2d  , offset, pFile-
13a20 3e 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 0a 23 69  >locktype));..#i
13a30 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
13a40 50 5f 53 49 5a 45 3e 30 0a 20 20 2f 2a 20 44 65  P_SIZE>0.  /* De
13a50 61 6c 20 77 69 74 68 20 61 73 20 6d 75 63 68 20  al with as much 
13a60 6f 66 20 74 68 69 73 20 77 72 69 74 65 20 72 65  of this write re
13a70 71 75 65 73 74 20 61 73 20 70 6f 73 73 69 62 6c  quest as possibl
13a80 65 20 62 79 20 74 72 61 6e 73 66 65 72 69 6e 67  e by transfering
13a90 0a 20 20 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20  .  ** data from 
13aa0 74 68 65 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69  the memory mappi
13ab0 6e 67 20 75 73 69 6e 67 20 6d 65 6d 63 70 79 28  ng using memcpy(
13ac0 29 2e 20 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66  ).  */.  if( off
13ad0 73 65 74 3c 70 46 69 6c 65 2d 3e 6d 6d 61 70 53  set<pFile->mmapS
13ae0 69 7a 65 20 29 7b 0a 20 20 20 20 69 66 28 20 6f  ize ){.    if( o
13af0 66 66 73 65 74 2b 61 6d 74 20 3c 3d 20 70 46 69  ffset+amt <= pFi
13b00 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a  le->mmapSize ){.
13b10 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 28 28        memcpy(&((
13b20 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61  u8 *)(pFile->pMa
13b30 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74  pRegion))[offset
13b40 5d 2c 20 70 42 75 66 2c 20 61 6d 74 29 3b 0a 20  ], pBuf, amt);. 
13b50 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 57       OSTRACE(("W
13b60 52 49 54 45 2d 4d 4d 41 50 20 66 69 6c 65 3d 25  RITE-MMAP file=%
13b70 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c  p, rc=SQLITE_OK\
13b80 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  n", pFile->h));.
13b90 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
13ba0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73  ITE_OK;.    }els
13bb0 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6f  e{.      int nCo
13bc0 70 79 20 3d 20 28 69 6e 74 29 28 70 46 69 6c 65  py = (int)(pFile
13bd0 2d 3e 6d 6d 61 70 53 69 7a 65 20 2d 20 6f 66 66  ->mmapSize - off
13be0 73 65 74 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  set);.      memc
13bf0 70 79 28 26 28 28 75 38 20 2a 29 28 70 46 69 6c  py(&((u8 *)(pFil
13c00 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b  e->pMapRegion))[
13c10 6f 66 66 73 65 74 5d 2c 20 70 42 75 66 2c 20 6e  offset], pBuf, n
13c20 43 6f 70 79 29 3b 0a 20 20 20 20 20 20 70 42 75  Copy);.      pBu
13c30 66 20 3d 20 26 28 28 75 38 20 2a 29 70 42 75 66  f = &((u8 *)pBuf
13c40 29 5b 6e 43 6f 70 79 5d 3b 0a 20 20 20 20 20 20  )[nCopy];.      
13c50 61 6d 74 20 2d 3d 20 6e 43 6f 70 79 3b 0a 20 20  amt -= nCopy;.  
13c60 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 6e 43      offset += nC
13c70 6f 70 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  opy;.    }.  }.#
13c80 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54  endif..#if SQLIT
13c90 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 72 63 20  E_OS_WINCE.  rc 
13ca0 3d 20 77 69 6e 53 65 65 6b 46 69 6c 65 28 70 46  = winSeekFile(pF
13cb0 69 6c 65 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20  ile, offset);.  
13cc0 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 23 65 6c  if( rc==0 ){.#el
13cd0 73 65 0a 20 20 7b 0a 23 65 6e 64 69 66 0a 23 69  se.  {.#endif.#i
13ce0 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
13cf0 43 45 0a 20 20 20 20 4f 56 45 52 4c 41 50 50 45  CE.    OVERLAPPE
13d00 44 20 6f 76 65 72 6c 61 70 70 65 64 3b 20 20 20  D overlapped;   
13d10 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 66 66 73       /* The offs
13d20 65 74 20 66 6f 72 20 57 72 69 74 65 46 69 6c 65  et for WriteFile
13d30 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 20 20  . */.#endif.    
13d40 75 38 20 2a 61 52 65 6d 20 3d 20 28 75 38 20 2a  u8 *aRem = (u8 *
13d50 29 70 42 75 66 3b 20 20 20 20 20 20 20 20 2f 2a  )pBuf;        /*
13d60 20 44 61 74 61 20 79 65 74 20 74 6f 20 62 65 20   Data yet to be 
13d70 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 20 20 69  written */.    i
13d80 6e 74 20 6e 52 65 6d 20 3d 20 61 6d 74 3b 20 20  nt nRem = amt;  
13d90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13da0 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
13db0 79 65 74 20 74 6f 20 62 65 20 77 72 69 74 74 65  yet to be writte
13dc0 6e 20 2a 2f 0a 20 20 20 20 44 57 4f 52 44 20 6e  n */.    DWORD n
13dd0 57 72 69 74 65 3b 20 20 20 20 20 20 20 20 20 20  Write;          
13de0 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
13df0 77 72 69 74 74 65 6e 20 62 79 20 65 61 63 68 20  written by each 
13e00 57 72 69 74 65 46 69 6c 65 28 29 20 63 61 6c 6c  WriteFile() call
13e10 20 2a 2f 0a 20 20 20 20 44 57 4f 52 44 20 6c 61   */.    DWORD la
13e20 73 74 45 72 72 6e 6f 20 3d 20 4e 4f 5f 45 52 52  stErrno = NO_ERR
13e30 4f 52 3b 20 20 20 2f 2a 20 56 61 6c 75 65 20 72  OR;   /* Value r
13e40 65 74 75 72 6e 65 64 20 62 79 20 47 65 74 4c 61  eturned by GetLa
13e50 73 74 45 72 72 6f 72 28 29 20 2a 2f 0a 0a 23 69  stError() */..#i
13e60 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
13e70 43 45 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 6f  CE.    memset(&o
13e80 76 65 72 6c 61 70 70 65 64 2c 20 30 2c 20 73 69  verlapped, 0, si
13e90 7a 65 6f 66 28 4f 56 45 52 4c 41 50 50 45 44 29  zeof(OVERLAPPED)
13ea0 29 3b 0a 20 20 20 20 6f 76 65 72 6c 61 70 70 65  );.    overlappe
13eb0 64 2e 4f 66 66 73 65 74 20 3d 20 28 4c 4f 4e 47  d.Offset = (LONG
13ec0 29 28 6f 66 66 73 65 74 20 26 20 30 78 66 66 66  )(offset & 0xfff
13ed0 66 66 66 66 66 29 3b 0a 20 20 20 20 6f 76 65 72  fffff);.    over
13ee0 6c 61 70 70 65 64 2e 4f 66 66 73 65 74 48 69 67  lapped.OffsetHig
13ef0 68 20 3d 20 28 4c 4f 4e 47 29 28 28 6f 66 66 73  h = (LONG)((offs
13f00 65 74 3e 3e 33 32 29 20 26 20 30 78 37 66 66 66  et>>32) & 0x7fff
13f10 66 66 66 66 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  ffff);.#endif.. 
13f20 20 20 20 77 68 69 6c 65 28 20 6e 52 65 6d 3e 30     while( nRem>0
13f30 20 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f   ){.#if SQLITE_O
13f40 53 5f 57 49 4e 43 45 0a 20 20 20 20 20 20 69 66  S_WINCE.      if
13f50 28 20 21 6f 73 57 72 69 74 65 46 69 6c 65 28 70  ( !osWriteFile(p
13f60 46 69 6c 65 2d 3e 68 2c 20 61 52 65 6d 2c 20 6e  File->h, aRem, n
13f70 52 65 6d 2c 20 26 6e 57 72 69 74 65 2c 20 30 29  Rem, &nWrite, 0)
13f80 20 29 7b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20   ){.#else.      
13f90 69 66 28 20 21 6f 73 57 72 69 74 65 46 69 6c 65  if( !osWriteFile
13fa0 28 70 46 69 6c 65 2d 3e 68 2c 20 61 52 65 6d 2c  (pFile->h, aRem,
13fb0 20 6e 52 65 6d 2c 20 26 6e 57 72 69 74 65 2c 20   nRem, &nWrite, 
13fc0 26 6f 76 65 72 6c 61 70 70 65 64 29 20 29 7b 0a  &overlapped) ){.
13fd0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 69  #endif.        i
13fe0 66 28 20 77 69 6e 52 65 74 72 79 49 6f 65 72 72  f( winRetryIoerr
13ff0 28 26 6e 52 65 74 72 79 2c 20 26 6c 61 73 74 45  (&nRetry, &lastE
14000 72 72 6e 6f 29 20 29 20 63 6f 6e 74 69 6e 75 65  rrno) ) continue
14010 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
14020 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
14030 73 73 65 72 74 28 20 6e 57 72 69 74 65 3d 3d 30  ssert( nWrite==0
14040 20 7c 7c 20 6e 57 72 69 74 65 3c 3d 28 44 57 4f   || nWrite<=(DWO
14050 52 44 29 6e 52 65 6d 20 29 3b 0a 20 20 20 20 20  RD)nRem );.     
14060 20 69 66 28 20 6e 57 72 69 74 65 3d 3d 30 20 7c   if( nWrite==0 |
14070 7c 20 6e 57 72 69 74 65 3e 28 44 57 4f 52 44 29  | nWrite>(DWORD)
14080 6e 52 65 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  nRem ){.        
14090 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
140a0 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
140b0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
140c0 20 20 20 7d 0a 23 69 66 20 21 53 51 4c 49 54 45     }.#if !SQLITE
140d0 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20 20 20  _OS_WINCE.      
140e0 6f 66 66 73 65 74 20 2b 3d 20 6e 57 72 69 74 65  offset += nWrite
140f0 3b 0a 20 20 20 20 20 20 6f 76 65 72 6c 61 70 70  ;.      overlapp
14100 65 64 2e 4f 66 66 73 65 74 20 3d 20 28 4c 4f 4e  ed.Offset = (LON
14110 47 29 28 6f 66 66 73 65 74 20 26 20 30 78 66 66  G)(offset & 0xff
14120 66 66 66 66 66 66 29 3b 0a 20 20 20 20 20 20 6f  ffffff);.      o
14130 76 65 72 6c 61 70 70 65 64 2e 4f 66 66 73 65 74  verlapped.Offset
14140 48 69 67 68 20 3d 20 28 4c 4f 4e 47 29 28 28 6f  High = (LONG)((o
14150 66 66 73 65 74 3e 3e 33 32 29 20 26 20 30 78 37  ffset>>32) & 0x7
14160 66 66 66 66 66 66 66 29 3b 0a 23 65 6e 64 69 66  fffffff);.#endif
14170 0a 20 20 20 20 20 20 61 52 65 6d 20 2b 3d 20 6e  .      aRem += n
14180 57 72 69 74 65 3b 0a 20 20 20 20 20 20 6e 52 65  Write;.      nRe
14190 6d 20 2d 3d 20 6e 57 72 69 74 65 3b 0a 20 20 20  m -= nWrite;.   
141a0 20 7d 0a 20 20 20 20 69 66 28 20 6e 52 65 6d 3e   }.    if( nRem>
141b0 30 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  0 ){.      pFile
141c0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61  ->lastErrno = la
141d0 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72  stErrno;.      r
141e0 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  c = 1;.    }.  }
141f0 0a 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ..  if( rc ){.  
14200 20 20 69 66 28 20 20 20 28 20 70 46 69 6c 65 2d    if(   ( pFile-
14210 3e 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f  >lastErrno==ERRO
14220 52 5f 48 41 4e 44 4c 45 5f 44 49 53 4b 5f 46 55  R_HANDLE_DISK_FU
14230 4c 4c 20 29 0a 20 20 20 20 20 20 20 7c 7c 20 28  LL ).       || (
14240 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
14250 6f 3d 3d 45 52 52 4f 52 5f 44 49 53 4b 5f 46 55  o==ERROR_DISK_FU
14260 4c 4c 20 29 29 7b 0a 20 20 20 20 20 20 4f 53 54  LL )){.      OST
14270 52 41 43 45 28 28 22 57 52 49 54 45 20 66 69 6c  RACE(("WRITE fil
14280 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%p, rc=SQLITE_
14290 46 55 4c 4c 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  FULL\n", pFile->
142a0 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  h));.      retur
142b0 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  n winLogError(SQ
142c0 4c 49 54 45 5f 46 55 4c 4c 2c 20 70 46 69 6c 65  LITE_FULL, pFile
142d0 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20  ->lastErrno,.   
142e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
142f0 20 20 20 20 20 20 22 77 69 6e 57 72 69 74 65 31        "winWrite1
14300 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
14310 3b 0a 20 20 20 20 7d 0a 20 20 20 20 4f 53 54 52  ;.    }.    OSTR
14320 41 43 45 28 28 22 57 52 49 54 45 20 66 69 6c 65  ACE(("WRITE file
14330 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49  =%p, rc=SQLITE_I
14340 4f 45 52 52 5f 57 52 49 54 45 5c 6e 22 2c 20 70  OERR_WRITE\n", p
14350 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72  File->h));.    r
14360 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f  eturn winLogErro
14370 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57  r(SQLITE_IOERR_W
14380 52 49 54 45 2c 20 70 46 69 6c 65 2d 3e 6c 61 73  RITE, pFile->las
14390 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
143a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
143b0 77 69 6e 57 72 69 74 65 32 22 2c 20 70 46 69 6c  winWrite2", pFil
143c0 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 65 6c  e->zPath);.  }el
143d0 73 65 7b 0a 20 20 20 20 77 69 6e 4c 6f 67 49 6f  se{.    winLogIo
143e0 65 72 72 28 6e 52 65 74 72 79 29 3b 0a 20 20 7d  err(nRetry);.  }
143f0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 57 52 49  .  OSTRACE(("WRI
14400 54 45 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53  TE file=%p, rc=S
14410 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69  QLITE_OK\n", pFi
14420 6c 65 2d 3e 68 29 29 3b 0a 20 20 72 65 74 75 72  le->h));.  retur
14430 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
14440 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 61  /*.** Truncate a
14450 6e 20 6f 70 65 6e 20 66 69 6c 65 20 74 6f 20 61  n open file to a
14460 20 73 70 65 63 69 66 69 65 64 20 73 69 7a 65 0a   specified size.
14470 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
14480 6e 54 72 75 6e 63 61 74 65 28 73 71 6c 69 74 65  nTruncate(sqlite
14490 33 5f 66 69 6c 65 20 2a 69 64 2c 20 73 71 6c 69  3_file *id, sqli
144a0 74 65 33 5f 69 6e 74 36 34 20 6e 42 79 74 65 29  te3_int64 nByte)
144b0 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69  {.  winFile *pFi
144c0 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69  le = (winFile*)i
144d0 64 3b 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64  d;  /* File hand
144e0 6c 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  le object */.  i
144f0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
14500 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  K;             /
14510 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66 6f  * Return code fo
14520 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  r this function 
14530 2a 2f 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45  */.  DWORD lastE
14540 72 72 6e 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28  rrno;..  assert(
14550 20 70 46 69 6c 65 20 29 3b 0a 20 20 53 69 6d 75   pFile );.  Simu
14560 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75  lateIOError(retu
14570 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
14580 54 52 55 4e 43 41 54 45 29 3b 0a 20 20 4f 53 54  TRUNCATE);.  OST
14590 52 41 43 45 28 28 22 54 52 55 4e 43 41 54 45 20  RACE(("TRUNCATE 
145a0 66 69 6c 65 3d 25 70 2c 20 73 69 7a 65 3d 25 6c  file=%p, size=%l
145b0 6c 64 2c 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 0a  ld, lock=%d\n",.
145c0 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
145d0 2d 3e 68 2c 20 6e 42 79 74 65 2c 20 70 46 69 6c  ->h, nByte, pFil
145e0 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 0a  e->locktype));..
145f0 20 20 2f 2a 20 49 66 20 74 68 65 20 75 73 65 72    /* If the user
14600 20 68 61 73 20 63 6f 6e 66 69 67 75 72 65 64 20   has configured 
14610 61 20 63 68 75 6e 6b 2d 73 69 7a 65 20 66 6f 72  a chunk-size for
14620 20 74 68 69 73 20 66 69 6c 65 2c 20 74 72 75 6e   this file, trun
14630 63 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 66 69  cate the.  ** fi
14640 6c 65 20 73 6f 20 74 68 61 74 20 69 74 20 63 6f  le so that it co
14650 6e 73 69 73 74 73 20 6f 66 20 61 6e 20 69 6e 74  nsists of an int
14660 65 67 65 72 20 6e 75 6d 62 65 72 20 6f 66 20 63  eger number of c
14670 68 75 6e 6b 73 20 28 69 2e 65 2e 20 74 68 65 0a  hunks (i.e. the.
14680 20 20 2a 2a 20 61 63 74 75 61 6c 20 66 69 6c 65    ** actual file
14690 20 73 69 7a 65 20 61 66 74 65 72 20 74 68 65 20   size after the 
146a0 6f 70 65 72 61 74 69 6f 6e 20 6d 61 79 20 62 65  operation may be
146b0 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
146c0 20 72 65 71 75 65 73 74 65 64 0a 20 20 2a 2a 20   requested.  ** 
146d0 73 69 7a 65 29 2e 0a 20 20 2a 2f 0a 20 20 69 66  size)..  */.  if
146e0 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b  ( pFile->szChunk
146f0 3e 30 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20  >0 ){.    nByte 
14700 3d 20 28 28 6e 42 79 74 65 20 2b 20 70 46 69 6c  = ((nByte + pFil
14710 65 2d 3e 73 7a 43 68 75 6e 6b 20 2d 20 31 29 2f  e->szChunk - 1)/
14720 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 29 20  pFile->szChunk) 
14730 2a 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b  * pFile->szChunk
14740 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 45  ;.  }..  /* SetE
14750 6e 64 4f 66 46 69 6c 65 28 29 20 72 65 74 75 72  ndOfFile() retur
14760 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20 77 68 65 6e  ns non-zero when
14770 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20   successful, or 
14780 7a 65 72 6f 20 77 68 65 6e 20 69 74 20 66 61 69  zero when it fai
14790 6c 73 2e 20 2a 2f 0a 20 20 69 66 28 20 77 69 6e  ls. */.  if( win
147a0 53 65 65 6b 46 69 6c 65 28 70 46 69 6c 65 2c 20  SeekFile(pFile, 
147b0 6e 42 79 74 65 29 20 29 7b 0a 20 20 20 20 72 63  nByte) ){.    rc
147c0 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53   = winLogError(S
147d0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e  QLITE_IOERR_TRUN
147e0 43 41 54 45 2c 20 70 46 69 6c 65 2d 3e 6c 61 73  CATE, pFile->las
147f0 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
14800 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
14810 6e 54 72 75 6e 63 61 74 65 31 22 2c 20 70 46 69  nTruncate1", pFi
14820 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 65  le->zPath);.  }e
14830 6c 73 65 20 69 66 28 20 30 3d 3d 6f 73 53 65 74  lse if( 0==osSet
14840 45 6e 64 4f 66 46 69 6c 65 28 70 46 69 6c 65 2d  EndOfFile(pFile-
14850 3e 68 29 20 26 26 0a 20 20 20 20 20 20 20 20 20  >h) &&.         
14860 20 20 20 28 28 6c 61 73 74 45 72 72 6e 6f 20 3d     ((lastErrno =
14870 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
14880 29 29 21 3d 45 52 52 4f 52 5f 55 53 45 52 5f 4d  ))!=ERROR_USER_M
14890 41 50 50 45 44 5f 46 49 4c 45 29 20 29 7b 0a 20  APPED_FILE) ){. 
148a0 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
148b0 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b  rno = lastErrno;
148c0 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67  .    rc = winLog
148d0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
148e0 52 52 5f 54 52 55 4e 43 41 54 45 2c 20 70 46 69  RR_TRUNCATE, pFi
148f0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20  le->lastErrno,. 
14900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14910 20 20 20 20 22 77 69 6e 54 72 75 6e 63 61 74 65      "winTruncate
14920 32 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  2", pFile->zPath
14930 29 3b 0a 20 20 7d 0a 0a 23 69 66 20 53 51 4c 49  );.  }..#if SQLI
14940 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
14950 3e 30 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 66  >0.  /* If the f
14960 69 6c 65 20 77 61 73 20 74 72 75 6e 63 61 74 65  ile was truncate
14970 64 20 74 6f 20 61 20 73 69 7a 65 20 73 6d 61 6c  d to a size smal
14980 6c 65 72 20 74 68 61 6e 20 74 68 65 20 63 75 72  ler than the cur
14990 72 65 6e 74 6c 79 0a 20 20 2a 2a 20 6d 61 70 70  rently.  ** mapp
149a0 65 64 20 72 65 67 69 6f 6e 2c 20 72 65 64 75 63  ed region, reduc
149b0 65 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20  e the effective 
149c0 6d 61 70 70 69 6e 67 20 73 69 7a 65 20 61 73 20  mapping size as 
149d0 77 65 6c 6c 2e 20 53 51 4c 69 74 65 20 77 69 6c  well. SQLite wil
149e0 6c 0a 20 20 2a 2a 20 75 73 65 20 72 65 61 64 28  l.  ** use read(
149f0 29 20 61 6e 64 20 77 72 69 74 65 28 29 20 74 6f  ) and write() to
14a00 20 61 63 63 65 73 73 20 64 61 74 61 20 62 65 79   access data bey
14a10 6f 6e 64 20 74 68 69 73 20 70 6f 69 6e 74 20 66  ond this point f
14a20 72 6f 6d 20 6e 6f 77 20 6f 6e 2e 0a 20 20 2a 2f  rom now on..  */
14a30 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 4d  .  if( pFile->pM
14a40 61 70 52 65 67 69 6f 6e 20 26 26 20 6e 42 79 74  apRegion && nByt
14a50 65 3c 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a  e<pFile->mmapSiz
14a60 65 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  e ){.    pFile->
14a70 6d 6d 61 70 53 69 7a 65 20 3d 20 6e 42 79 74 65  mmapSize = nByte
14a80 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
14a90 4f 53 54 52 41 43 45 28 28 22 54 52 55 4e 43 41  OSTRACE(("TRUNCA
14aa0 54 45 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 25  TE file=%p, rc=%
14ab0 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  s\n", pFile->h, 
14ac0 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72  sqlite3ErrName(r
14ad0 63 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  c)));.  return r
14ae0 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  c;.}..#ifdef SQL
14af0 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 43  ITE_TEST./*.** C
14b00 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20  ount the number 
14b10 6f 66 20 66 75 6c 6c 73 79 6e 63 73 20 61 6e 64  of fullsyncs and
14b20 20 6e 6f 72 6d 61 6c 20 73 79 6e 63 73 2e 20 20   normal syncs.  
14b30 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20  This is used to 
14b40 74 65 73 74 0a 2a 2a 20 74 68 61 74 20 73 79 6e  test.** that syn
14b50 63 73 20 61 6e 64 20 66 75 6c 6c 73 79 6e 63 73  cs and fullsyncs
14b60 20 61 72 65 20 6f 63 63 75 72 69 6e 67 20 61 74   are occuring at
14b70 20 74 68 65 20 72 69 67 68 74 20 74 69 6d 65 73   the right times
14b80 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
14b90 5f 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b  _sync_count = 0;
14ba0 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 66 75 6c  .int sqlite3_ful
14bb0 6c 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b  lsync_count = 0;
14bc0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d  .#endif../*.** M
14bd0 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 77 72 69  ake sure all wri
14be0 74 65 73 20 74 6f 20 61 20 70 61 72 74 69 63 75  tes to a particu
14bf0 6c 61 72 20 66 69 6c 65 20 61 72 65 20 63 6f 6d  lar file are com
14c00 6d 69 74 74 65 64 20 74 6f 20 64 69 73 6b 2e 0a  mitted to disk..
14c10 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
14c20 6e 53 79 6e 63 28 73 71 6c 69 74 65 33 5f 66 69  nSync(sqlite3_fi
14c30 6c 65 20 2a 69 64 2c 20 69 6e 74 20 66 6c 61 67  le *id, int flag
14c40 73 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  s){.#ifndef SQLI
14c50 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 2f 2a 0a  TE_NO_SYNC.  /*.
14c60 20 20 2a 2a 20 55 73 65 64 20 6f 6e 6c 79 20 77    ** Used only w
14c70 68 65 6e 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  hen SQLITE_NO_SY
14c80 4e 43 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65  NC is not define
14c90 64 2e 0a 20 20 20 2a 2f 0a 20 20 42 4f 4f 4c 20  d..   */.  BOOL 
14ca0 72 63 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21  rc;.#endif.#if !
14cb0 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20  defined(NDEBUG) 
14cc0 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
14cd0 54 45 5f 4e 4f 5f 53 59 4e 43 29 20 7c 7c 20 5c  TE_NO_SYNC) || \
14ce0 0a 20 20 20 20 28 64 65 66 69 6e 65 64 28 53 51  .    (defined(SQ
14cf0 4c 49 54 45 5f 54 45 53 54 29 20 26 26 20 64 65  LITE_TEST) && de
14d00 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
14d10 55 47 29 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 55  UG)).  /*.  ** U
14d20 73 65 64 20 77 68 65 6e 20 53 51 4c 49 54 45 5f  sed when SQLITE_
14d30 4e 4f 5f 53 59 4e 43 20 69 73 20 6e 6f 74 20 64  NO_SYNC is not d
14d40 65 66 69 6e 65 64 20 61 6e 64 20 62 79 20 74 68  efined and by th
14d50 65 20 61 73 73 65 72 74 28 29 20 61 6e 64 2f 6f  e assert() and/o
14d60 72 0a 20 20 2a 2a 20 4f 53 54 52 41 43 45 28 29  r.  ** OSTRACE()
14d70 20 6d 61 63 72 6f 73 2e 0a 20 20 20 2a 2f 0a 20   macros..   */. 
14d80 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20   winFile *pFile 
14d90 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a  = (winFile*)id;.
14da0 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50  #else.  UNUSED_P
14db0 41 52 41 4d 45 54 45 52 28 69 64 29 3b 0a 23 65  ARAMETER(id);.#e
14dc0 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
14dd0 70 46 69 6c 65 20 29 3b 0a 20 20 2f 2a 20 43 68  pFile );.  /* Ch
14de0 65 63 6b 20 74 68 61 74 20 6f 6e 65 20 6f 66 20  eck that one of 
14df0 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
14e00 41 4c 20 6f 72 20 46 55 4c 4c 20 77 61 73 20 70  AL or FULL was p
14e10 61 73 73 65 64 20 2a 2f 0a 20 20 61 73 73 65 72  assed */.  asser
14e20 74 28 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d  t((flags&0x0F)==
14e30 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
14e40 41 4c 0a 20 20 20 20 20 20 7c 7c 20 28 66 6c 61  AL.      || (fla
14e50 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45  gs&0x0F)==SQLITE
14e60 5f 53 59 4e 43 5f 46 55 4c 4c 0a 20 20 29 3b 0a  _SYNC_FULL.  );.
14e70 0a 20 20 2f 2a 20 55 6e 69 78 20 63 61 6e 6e 6f  .  /* Unix canno
14e80 74 2c 20 62 75 74 20 73 6f 6d 65 20 73 79 73 74  t, but some syst
14e90 65 6d 73 20 6d 61 79 20 72 65 74 75 72 6e 20 53  ems may return S
14ea0 51 4c 49 54 45 5f 46 55 4c 4c 20 66 72 6f 6d 20  QLITE_FULL from 
14eb0 68 65 72 65 2e 20 54 68 69 73 0a 20 20 2a 2a 20  here. This.  ** 
14ec0 6c 69 6e 65 20 69 73 20 74 6f 20 74 65 73 74 20  line is to test 
14ed0 74 68 61 74 20 64 6f 69 6e 67 20 73 6f 20 64 6f  that doing so do
14ee0 65 73 20 6e 6f 74 20 63 61 75 73 65 20 61 6e 79  es not cause any
14ef0 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 2a 2f 0a   problems..  */.
14f00 20 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75    SimulateDiskfu
14f10 6c 6c 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  llError( return 
14f20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 3b 0a 0a  SQLITE_FULL );..
14f30 20 20 4f 53 54 52 41 43 45 28 28 22 53 59 4e 43    OSTRACE(("SYNC
14f40 20 66 69 6c 65 3d 25 70 2c 20 66 6c 61 67 73 3d   file=%p, flags=
14f50 25 78 2c 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 0a  %x, lock=%d\n",.
14f60 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
14f70 2d 3e 68 2c 20 66 6c 61 67 73 2c 20 70 46 69 6c  ->h, flags, pFil
14f80 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 0a  e->locktype));..
14f90 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 54  #ifndef SQLITE_T
14fa0 45 53 54 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  EST.  UNUSED_PAR
14fb0 41 4d 45 54 45 52 28 66 6c 61 67 73 29 3b 0a 23  AMETER(flags);.#
14fc0 65 6c 73 65 0a 20 20 69 66 28 20 28 66 6c 61 67  else.  if( (flag
14fd0 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f  s&0x0F)==SQLITE_
14fe0 53 59 4e 43 5f 46 55 4c 4c 20 29 7b 0a 20 20 20  SYNC_FULL ){.   
14ff0 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e   sqlite3_fullsyn
15000 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 20 20 7d 0a 20  c_count++;.  }. 
15010 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f   sqlite3_sync_co
15020 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20  unt++;.#endif.. 
15030 20 2f 2a 20 49 66 20 77 65 20 63 6f 6d 70 69 6c   /* If we compil
15040 65 64 20 77 69 74 68 20 74 68 65 20 53 51 4c 49  ed with the SQLI
15050 54 45 5f 4e 4f 5f 53 59 4e 43 20 66 6c 61 67 2c  TE_NO_SYNC flag,
15060 20 74 68 65 6e 20 73 79 6e 63 69 6e 67 20 69 73   then syncing is
15070 20 61 0a 20 20 2a 2a 20 6e 6f 2d 6f 70 0a 20 20   a.  ** no-op.  
15080 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
15090 5f 4e 4f 5f 53 59 4e 43 0a 20 20 4f 53 54 52 41  _NO_SYNC.  OSTRA
150a0 43 45 28 28 22 53 59 4e 43 2d 4e 4f 50 20 66 69  CE(("SYNC-NOP fi
150b0 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
150c0 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  _OK\n", pFile->h
150d0 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ));.  return SQL
150e0 49 54 45 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 20 20  ITE_OK;.#else.  
150f0 72 63 20 3d 20 6f 73 46 6c 75 73 68 46 69 6c 65  rc = osFlushFile
15100 42 75 66 66 65 72 73 28 70 46 69 6c 65 2d 3e 68  Buffers(pFile->h
15110 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  );.  SimulateIOE
15120 72 72 6f 72 28 20 72 63 3d 46 41 4c 53 45 20 29  rror( rc=FALSE )
15130 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
15140 20 20 4f 53 54 52 41 43 45 28 28 22 53 59 4e 43    OSTRACE(("SYNC
15150 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c   file=%p, rc=SQL
15160 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65  ITE_OK\n", pFile
15170 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75 72  ->h));.    retur
15180 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
15190 65 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d  else{.    pFile-
151a0 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47  >lastErrno = osG
151b0 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
151c0 20 20 20 4f 53 54 52 41 43 45 28 28 22 53 59 4e     OSTRACE(("SYN
151d0 43 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51  C file=%p, rc=SQ
151e0 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43  LITE_IOERR_FSYNC
151f0 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  \n", pFile->h));
15200 0a 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c  .    return winL
15210 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
15220 4f 45 52 52 5f 46 53 59 4e 43 2c 20 70 46 69 6c  OERR_FSYNC, pFil
15230 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20  e->lastErrno,.  
15240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15250 20 20 20 20 20 22 77 69 6e 53 79 6e 63 22 2c 20       "winSync", 
15260 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
15270 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a   }.#endif.}../*.
15280 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65  ** Determine the
15290 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66   current size of
152a0 20 61 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73   a file in bytes
152b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
152c0 69 6e 46 69 6c 65 53 69 7a 65 28 73 71 6c 69 74  inFileSize(sqlit
152d0 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 73 71 6c  e3_file *id, sql
152e0 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 53 69 7a  ite3_int64 *pSiz
152f0 65 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70  e){.  winFile *p
15300 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a  File = (winFile*
15310 29 69 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  )id;.  int rc = 
15320 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73  SQLITE_OK;..  as
15330 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20  sert( id!=0 );. 
15340 20 61 73 73 65 72 74 28 20 70 53 69 7a 65 21 3d   assert( pSize!=
15350 30 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49  0 );.  SimulateI
15360 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51  OError(return SQ
15370 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54  LITE_IOERR_FSTAT
15380 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53  );.  OSTRACE(("S
15390 49 5a 45 20 66 69 6c 65 3d 25 70 2c 20 70 53 69  IZE file=%p, pSi
153a0 7a 65 3d 25 70 5c 6e 22 2c 20 70 46 69 6c 65 2d  ze=%p\n", pFile-
153b0 3e 68 2c 20 70 53 69 7a 65 29 29 3b 0a 0a 23 69  >h, pSize));..#i
153c0 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
153d0 54 0a 20 20 7b 0a 20 20 20 20 46 49 4c 45 5f 53  T.  {.    FILE_S
153e0 54 41 4e 44 41 52 44 5f 49 4e 46 4f 20 69 6e 66  TANDARD_INFO inf
153f0 6f 3b 0a 20 20 20 20 69 66 28 20 6f 73 47 65 74  o;.    if( osGet
15400 46 69 6c 65 49 6e 66 6f 72 6d 61 74 69 6f 6e 42  FileInformationB
15410 79 48 61 6e 64 6c 65 45 78 28 70 46 69 6c 65 2d  yHandleEx(pFile-
15420 3e 68 2c 20 46 69 6c 65 53 74 61 6e 64 61 72 64  >h, FileStandard
15430 49 6e 66 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  Info,.          
15440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15450 20 20 20 20 20 20 20 20 20 20 20 26 69 6e 66 6f             &info
15460 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 20  , sizeof(info)) 
15470 29 7b 0a 20 20 20 20 20 20 2a 70 53 69 7a 65 20  ){.      *pSize 
15480 3d 20 69 6e 66 6f 2e 45 6e 64 4f 66 46 69 6c 65  = info.EndOfFile
15490 2e 51 75 61 64 50 61 72 74 3b 0a 20 20 20 20 7d  .QuadPart;.    }
154a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 46 69 6c  else{.      pFil
154b0 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f  e->lastErrno = o
154c0 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b  sGetLastError();
154d0 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c  .      rc = winL
154e0 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
154f0 4f 45 52 52 5f 46 53 54 41 54 2c 20 70 46 69 6c  OERR_FSTAT, pFil
15500 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20  e->lastErrno,.  
15510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15520 20 20 20 20 20 22 77 69 6e 46 69 6c 65 53 69 7a       "winFileSiz
15530 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  e", pFile->zPath
15540 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c  );.    }.  }.#el
15550 73 65 0a 20 20 7b 0a 20 20 20 20 44 57 4f 52 44  se.  {.    DWORD
15560 20 75 70 70 65 72 42 69 74 73 3b 0a 20 20 20 20   upperBits;.    
15570 44 57 4f 52 44 20 6c 6f 77 65 72 42 69 74 73 3b  DWORD lowerBits;
15580 0a 20 20 20 20 44 57 4f 52 44 20 6c 61 73 74 45  .    DWORD lastE
15590 72 72 6e 6f 3b 0a 0a 20 20 20 20 6c 6f 77 65 72  rrno;..    lower
155a0 42 69 74 73 20 3d 20 6f 73 47 65 74 46 69 6c 65  Bits = osGetFile
155b0 53 69 7a 65 28 70 46 69 6c 65 2d 3e 68 2c 20 26  Size(pFile->h, &
155c0 75 70 70 65 72 42 69 74 73 29 3b 0a 20 20 20 20  upperBits);.    
155d0 2a 70 53 69 7a 65 20 3d 20 28 28 28 73 71 6c 69  *pSize = (((sqli
155e0 74 65 33 5f 69 6e 74 36 34 29 75 70 70 65 72 42  te3_int64)upperB
155f0 69 74 73 29 3c 3c 33 32 29 20 2b 20 6c 6f 77 65  its)<<32) + lowe
15600 72 42 69 74 73 3b 0a 20 20 20 20 69 66 28 20 20  rBits;.    if(  
15610 20 28 6c 6f 77 65 72 42 69 74 73 20 3d 3d 20 49   (lowerBits == I
15620 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 53 49 5a 45  NVALID_FILE_SIZE
15630 29 0a 20 20 20 20 20 20 20 26 26 20 28 28 6c 61  ).       && ((la
15640 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
15650 61 73 74 45 72 72 6f 72 28 29 29 21 3d 4e 4f 5f  astError())!=NO_
15660 45 52 52 4f 52 29 20 29 7b 0a 20 20 20 20 20 20  ERROR) ){.      
15670 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
15680 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20   = lastErrno;.  
15690 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45      rc = winLogE
156a0 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
156b0 52 5f 46 53 54 41 54 2c 20 70 46 69 6c 65 2d 3e  R_FSTAT, pFile->
156c0 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  lastErrno,.     
156d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
156e0 20 20 22 77 69 6e 46 69 6c 65 53 69 7a 65 22 2c    "winFileSize",
156f0 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
15700 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
15710 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 49 5a  .  OSTRACE(("SIZ
15720 45 20 66 69 6c 65 3d 25 70 2c 20 70 53 69 7a 65  E file=%p, pSize
15730 3d 25 70 2c 20 2a 70 53 69 7a 65 3d 25 6c 6c 64  =%p, *pSize=%lld
15740 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20  , rc=%s\n",.    
15750 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c         pFile->h,
15760 20 70 53 69 7a 65 2c 20 2a 70 53 69 7a 65 2c 20   pSize, *pSize, 
15770 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72  sqlite3ErrName(r
15780 63 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  c)));.  return r
15790 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 4f 43 4b  c;.}../*.** LOCK
157a0 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49  FILE_FAIL_IMMEDI
157b0 41 54 45 4c 59 20 69 73 20 75 6e 64 65 66 69 6e  ATELY is undefin
157c0 65 64 20 6f 6e 20 73 6f 6d 65 20 57 69 6e 64 6f  ed on some Windo
157d0 77 73 20 73 79 73 74 65 6d 73 2e 0a 2a 2f 0a 23  ws systems..*/.#
157e0 69 66 6e 64 65 66 20 4c 4f 43 4b 46 49 4c 45 5f  ifndef LOCKFILE_
157f0 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59  FAIL_IMMEDIATELY
15800 0a 23 20 64 65 66 69 6e 65 20 4c 4f 43 4b 46 49  .# define LOCKFI
15810 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54  LE_FAIL_IMMEDIAT
15820 45 4c 59 20 31 0a 23 65 6e 64 69 66 0a 0a 23 69  ELY 1.#endif..#i
15830 66 6e 64 65 66 20 4c 4f 43 4b 46 49 4c 45 5f 45  fndef LOCKFILE_E
15840 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 23 20  XCLUSIVE_LOCK.# 
15850 64 65 66 69 6e 65 20 4c 4f 43 4b 46 49 4c 45 5f  define LOCKFILE_
15860 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 32  EXCLUSIVE_LOCK 2
15870 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 48  .#endif../*.** H
15880 69 73 74 6f 72 69 63 61 6c 6c 79 2c 20 53 51 4c  istorically, SQL
15890 69 74 65 20 68 61 73 20 75 73 65 64 20 62 6f 74  ite has used bot
158a0 68 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 20 61  h the LockFile a
158b0 6e 64 20 4c 6f 63 6b 46 69 6c 65 45 78 20 66 75  nd LockFileEx fu
158c0 6e 63 74 69 6f 6e 73 2e 0a 2a 2a 20 57 68 65 6e  nctions..** When
158d0 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 20 66 75   the LockFile fu
158e0 6e 63 74 69 6f 6e 20 77 61 73 20 75 73 65 64 2c  nction was used,
158f0 20 69 74 20 77 61 73 20 61 6c 77 61 79 73 20 65   it was always e
15900 78 70 65 63 74 65 64 20 74 6f 20 66 61 69 6c 0a  xpected to fail.
15910 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 69  ** immediately i
15920 66 20 74 68 65 20 6c 6f 63 6b 20 63 6f 75 6c 64  f the lock could
15930 20 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64   not be obtained
15940 2e 20 20 41 6c 73 6f 2c 20 69 74 20 61 6c 77 61  .  Also, it alwa
15950 79 73 20 65 78 70 65 63 74 65 64 20 74 6f 0a 2a  ys expected to.*
15960 2a 20 6f 62 74 61 69 6e 20 61 6e 20 65 78 63 6c  * obtain an excl
15970 75 73 69 76 65 20 6c 6f 63 6b 2e 20 20 54 68 65  usive lock.  The
15980 73 65 20 66 6c 61 67 73 20 61 72 65 20 75 73 65  se flags are use
15990 64 20 77 69 74 68 20 74 68 65 20 4c 6f 63 6b 46  d with the LockF
159a0 69 6c 65 45 78 20 66 75 6e 63 74 69 6f 6e 0a 2a  ileEx function.*
159b0 2a 20 61 6e 64 20 72 65 66 6c 65 63 74 20 74 68  * and reflect th
159c0 6f 73 65 20 65 78 70 65 63 74 61 74 69 6f 6e 73  ose expectations
159d0 3b 20 74 68 65 72 65 66 6f 72 65 2c 20 74 68 65  ; therefore, the
159e0 79 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20  y should not be 
159f0 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 23 69 66 6e  changed..*/.#ifn
15a00 64 65 66 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46  def SQLITE_LOCKF
15a10 49 4c 45 5f 46 4c 41 47 53 0a 23 20 64 65 66 69  ILE_FLAGS.# defi
15a20 6e 65 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49  ne SQLITE_LOCKFI
15a30 4c 45 5f 46 4c 41 47 53 20 20 20 28 4c 4f 43 4b  LE_FLAGS   (LOCK
15a40 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49  FILE_FAIL_IMMEDI
15a50 41 54 45 4c 59 20 7c 20 5c 0a 20 20 20 20 20 20  ATELY | \.      
15a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15a70 20 20 20 20 20 20 20 20 20 20 20 20 4c 4f 43 4b              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 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  OCK).#endif../*.
15aa0 2a 2a 20 43 75 72 72 65 6e 74 6c 79 2c 20 53 51  ** Currently, SQ
15ab0 4c 69 74 65 20 6e 65 76 65 72 20 63 61 6c 6c 73  Lite never calls
15ac0 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 45 78 20   the LockFileEx 
15ad0 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 6f 75 74  function without
15ae0 20 77 61 6e 74 69 6e 67 20 74 68 65 0a 2a 2a 20   wanting the.** 
15af0 63 61 6c 6c 20 74 6f 20 66 61 69 6c 20 69 6d 6d  call to fail imm
15b00 65 64 69 61 74 65 6c 79 20 69 66 20 74 68 65 20  ediately if the 
15b10 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20 62 65 20 6f  lock cannot be o
15b20 62 74 61 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66 6e  btained..*/.#ifn
15b30 64 65 66 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46  def SQLITE_LOCKF
15b40 49 4c 45 45 58 5f 46 4c 41 47 53 0a 23 20 64 65  ILEEX_FLAGS.# de
15b50 66 69 6e 65 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  fine SQLITE_LOCK
15b60 46 49 4c 45 45 58 5f 46 4c 41 47 53 20 28 4c 4f  FILEEX_FLAGS (LO
15b70 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45  CKFILE_FAIL_IMME
15b80 44 49 41 54 45 4c 59 29 0a 23 65 6e 64 69 66 0a  DIATELY).#endif.
15b90 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61  ./*.** Acquire a
15ba0 20 72 65 61 64 65 72 20 6c 6f 63 6b 2e 0a 2a 2a   reader lock..**
15bb0 20 44 69 66 66 65 72 65 6e 74 20 41 50 49 20 72   Different API r
15bc0 6f 75 74 69 6e 65 73 20 61 72 65 20 63 61 6c 6c  outines are call
15bd0 65 64 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20  ed depending on 
15be0 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
15bf0 68 69 73 0a 2a 2a 20 69 73 20 57 69 6e 39 78 20  his.** is Win9x 
15c00 6f 72 20 57 69 6e 4e 54 2e 0a 2a 2f 0a 73 74 61  or WinNT..*/.sta
15c10 74 69 63 20 69 6e 74 20 77 69 6e 47 65 74 52 65  tic int winGetRe
15c20 61 64 4c 6f 63 6b 28 77 69 6e 46 69 6c 65 20 2a  adLock(winFile *
15c30 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20 72 65  pFile){.  int re
15c40 73 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52  s;.  OSTRACE(("R
15c50 45 41 44 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70  EAD-LOCK file=%p
15c60 2c 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20 70 46  , lock=%d\n", pF
15c70 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c  ile->h, pFile->l
15c80 6f 63 6b 74 79 70 65 29 29 3b 0a 20 20 69 66 28  ocktype));.  if(
15c90 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 23 69 66   osIsNT() ){.#if
15ca0 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
15cb0 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 4e  .    /*.    ** N
15cc0 4f 54 45 3a 20 57 69 6e 64 6f 77 73 20 43 45 20  OTE: Windows CE 
15cd0 69 73 20 68 61 6e 64 6c 65 64 20 64 69 66 66 65  is handled diffe
15ce0 72 65 6e 74 6c 79 20 68 65 72 65 20 64 75 65 20  rently here due 
15cf0 69 74 73 20 6c 61 63 6b 20 6f 66 20 74 68 65 20  its lack of the 
15d00 57 69 6e 33 32 0a 20 20 20 20 2a 2a 20 20 20 20  Win32.    **    
15d10 20 20 20 41 50 49 20 4c 6f 63 6b 46 69 6c 65 45     API LockFileE
15d20 78 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65  x..    */.    re
15d30 73 20 3d 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c  s = winceLockFil
15d40 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41  e(&pFile->h, SHA
15d50 52 45 44 5f 46 49 52 53 54 2c 20 30 2c 20 31 2c  RED_FIRST, 0, 1,
15d60 20 30 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 72   0);.#else.    r
15d70 65 73 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65  es = winLockFile
15d80 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49  (&pFile->h, SQLI
15d90 54 45 5f 4c 4f 43 4b 46 49 4c 45 45 58 5f 46 4c  TE_LOCKFILEEX_FL
15da0 41 47 53 2c 20 53 48 41 52 45 44 5f 46 49 52 53  AGS, SHARED_FIRS
15db0 54 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  T, 0,.          
15dc0 20 20 20 20 20 20 20 20 20 20 20 20 53 48 41 52              SHAR
15dd0 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 23 65 6e  ED_SIZE, 0);.#en
15de0 64 69 66 0a 20 20 7d 0a 23 69 66 64 65 66 20 53  dif.  }.#ifdef S
15df0 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
15e00 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20  ANSI.  else{.   
15e10 20 69 6e 74 20 6c 6b 3b 0a 20 20 20 20 73 71 6c   int lk;.    sql
15e20 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28  ite3_randomness(
15e30 73 69 7a 65 6f 66 28 6c 6b 29 2c 20 26 6c 6b 29  sizeof(lk), &lk)
15e40 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61  ;.    pFile->sha
15e50 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20 28 73  redLockByte = (s
15e60 68 6f 72 74 29 28 28 6c 6b 20 26 20 30 78 37 66  hort)((lk & 0x7f
15e70 66 66 66 66 66 66 29 25 28 53 48 41 52 45 44 5f  ffffff)%(SHARED_
15e80 53 49 5a 45 20 2d 20 31 29 29 3b 0a 20 20 20 20  SIZE - 1));.    
15e90 72 65 73 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c  res = winLockFil
15ea0 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c  e(&pFile->h, SQL
15eb0 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41  ITE_LOCKFILE_FLA
15ec0 47 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  GS,.            
15ed0 20 20 20 20 20 20 20 20 20 20 53 48 41 52 45 44            SHARED
15ee0 5f 46 49 52 53 54 2b 70 46 69 6c 65 2d 3e 73 68  _FIRST+pFile->sh
15ef0 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 30 2c  aredLockByte, 0,
15f00 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64   1, 0);.  }.#end
15f10 69 66 0a 20 20 69 66 28 20 72 65 73 20 3d 3d 20  if.  if( res == 
15f20 30 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  0 ){.    pFile->
15f30 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
15f40 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
15f50 20 20 2f 2a 20 4e 6f 20 6e 65 65 64 20 74 6f 20    /* No need to 
15f60 6c 6f 67 20 61 20 66 61 69 6c 75 72 65 20 74 6f  log a failure to
15f70 20 6c 6f 63 6b 20 2a 2f 0a 20 20 7d 0a 20 20 4f   lock */.  }.  O
15f80 53 54 52 41 43 45 28 28 22 52 45 41 44 2d 4c 4f  STRACE(("READ-LO
15f90 43 4b 20 66 69 6c 65 3d 25 70 2c 20 72 65 73 75  CK file=%p, resu
15fa0 6c 74 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d  lt=%d\n", pFile-
15fb0 3e 68 2c 20 72 65 73 29 29 3b 0a 20 20 72 65 74  >h, res));.  ret
15fc0 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn res;.}../*.*
15fd0 2a 20 55 6e 64 6f 20 61 20 72 65 61 64 6c 6f 63  * Undo a readloc
15fe0 6b 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  k.*/.static int 
15ff0 77 69 6e 55 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63  winUnlockReadLoc
16000 6b 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65  k(winFile *pFile
16010 29 7b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20  ){.  int res;.  
16020 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b  DWORD lastErrno;
16030 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52 45 41  .  OSTRACE(("REA
16040 44 2d 55 4e 4c 4f 43 4b 20 66 69 6c 65 3d 25 70  D-UNLOCK file=%p
16050 2c 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20 70 46  , lock=%d\n", pF
16060 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c  ile->h, pFile->l
16070 6f 63 6b 74 79 70 65 29 29 3b 0a 20 20 69 66 28  ocktype));.  if(
16080 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 20 20   osIsNT() ){.   
16090 20 72 65 73 20 3d 20 77 69 6e 55 6e 6c 6f 63 6b   res = winUnlock
160a0 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20  File(&pFile->h, 
160b0 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c  SHARED_FIRST, 0,
160c0 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29   SHARED_SIZE, 0)
160d0 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c  ;.  }.#ifdef SQL
160e0 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
160f0 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 72  SI.  else{.    r
16100 65 73 20 3d 20 77 69 6e 55 6e 6c 6f 63 6b 46 69  es = winUnlockFi
16110 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 48  le(&pFile->h, SH
16120 41 52 45 44 5f 46 49 52 53 54 2b 70 46 69 6c 65  ARED_FIRST+pFile
16130 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65  ->sharedLockByte
16140 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a  , 0, 1, 0);.  }.
16150 23 65 6e 64 69 66 0a 20 20 69 66 28 20 72 65 73  #endif.  if( res
16160 3d 3d 30 20 26 26 20 28 28 6c 61 73 74 45 72 72  ==0 && ((lastErr
16170 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
16180 72 6f 72 28 29 29 21 3d 45 52 52 4f 52 5f 4e 4f  ror())!=ERROR_NO
16190 54 5f 4c 4f 43 4b 45 44 29 20 29 7b 0a 20 20 20  T_LOCKED) ){.   
161a0 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
161b0 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20  o = lastErrno;. 
161c0 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53     winLogError(S
161d0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
161e0 43 4b 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  CK, pFile->lastE
161f0 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
16200 20 20 20 20 20 20 22 77 69 6e 55 6e 6c 6f 63 6b        "winUnlock
16210 52 65 61 64 4c 6f 63 6b 22 2c 20 70 46 69 6c 65  ReadLock", pFile
16220 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 20 20  ->zPath);.  }.  
16230 4f 53 54 52 41 43 45 28 28 22 52 45 41 44 2d 55  OSTRACE(("READ-U
16240 4e 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 72  NLOCK file=%p, r
16250 65 73 75 6c 74 3d 25 64 5c 6e 22 2c 20 70 46 69  esult=%d\n", pFi
16260 6c 65 2d 3e 68 2c 20 72 65 73 29 29 3b 0a 20 20  le->h, res));.  
16270 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f  return res;.}../
16280 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69  *.** Lock the fi
16290 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b  le with the lock
162a0 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61   specified by pa
162b0 72 61 6d 65 74 65 72 20 6c 6f 63 6b 74 79 70 65  rameter locktype
162c0 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65   - one.** of the
162d0 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
162e0 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44  *     (1) SHARED
162f0 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29  _LOCK.**     (2)
16300 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a   RESERVED_LOCK.*
16310 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e  *     (3) PENDIN
16320 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34  G_LOCK.**     (4
16330 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ) EXCLUSIVE_LOCK
16340 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73  .**.** Sometimes
16350 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67   when requesting
16360 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c   one lock state,
16370 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b   additional lock
16380 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69   states.** are i
16390 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65  nserted in betwe
163a0 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67  en.  The locking
163b0 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f   might fail on o
163c0 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a  ne of the later.
163d0 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c  ** transitions l
163e0 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20  eaving the lock 
163f0 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20  state different 
16400 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61  from what it sta
16410 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c  rted but.** stil
16420 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67  l short of its g
16430 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  oal.  The follow
16440 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20  ing chart shows 
16450 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74  the allowed.** t
16460 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74  ransitions and t
16470 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65  he inserted inte
16480 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a  rmediate states:
16490 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b  .**.**    UNLOCK
164a0 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20  ED -> SHARED.** 
164b0 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53     SHARED -> RES
164c0 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  ERVED.**    SHAR
164d0 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
164e0 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
164f0 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28     RESERVED -> (
16500 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
16510 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44  USIVE.**    PEND
16520 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  ING -> EXCLUSIVE
16530 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
16540 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e  ine will only in
16550 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20  crease a lock.  
16560 54 68 65 20 77 69 6e 55 6e 6c 6f 63 6b 28 29 20  The winUnlock() 
16570 72 6f 75 74 69 6e 65 0a 2a 2a 20 65 72 61 73 65  routine.** erase
16580 73 20 61 6c 6c 20 6c 6f 63 6b 73 20 61 74 20 6f  s all locks at o
16590 6e 63 65 20 61 6e 64 20 72 65 74 75 72 6e 73 20  nce and returns 
165a0 75 73 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74  us immediately t
165b0 6f 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  o locking level 
165c0 30 2e 0a 2a 2a 20 49 74 20 69 73 20 6e 6f 74 20  0..** It is not 
165d0 70 6f 73 73 69 62 6c 65 20 74 6f 20 6c 6f 77 65  possible to lowe
165e0 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  r the locking le
165f0 76 65 6c 20 6f 6e 65 20 73 74 65 70 20 61 74 20  vel one step at 
16600 61 20 74 69 6d 65 2e 20 20 59 6f 75 0a 2a 2a 20  a time.  You.** 
16610 6d 75 73 74 20 67 6f 20 73 74 72 61 69 67 68 74  must go straight
16620 20 74 6f 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65   to locking leve
16630 6c 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  l 0..*/.static i
16640 6e 74 20 77 69 6e 4c 6f 63 6b 28 73 71 6c 69 74  nt winLock(sqlit
16650 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
16660 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e   locktype){.  in
16670 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
16680 3b 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63  ;    /* Return c
16690 6f 64 65 20 66 72 6f 6d 20 73 75 62 72 6f 75 74  ode from subrout
166a0 69 6e 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ines */.  int re
166b0 73 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20  s = 1;          
166c0 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20 61 20   /* Result of a 
166d0 57 69 6e 64 6f 77 73 20 6c 6f 63 6b 20 63 61 6c  Windows lock cal
166e0 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 65 77 4c 6f  l */.  int newLo
166f0 63 6b 74 79 70 65 3b 20 20 20 20 20 20 20 2f 2a  cktype;       /*
16700 20 53 65 74 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b   Set pFile->lock
16710 74 79 70 65 20 74 6f 20 74 68 69 73 20 76 61 6c  type to this val
16720 75 65 20 62 65 66 6f 72 65 20 65 78 69 74 69 6e  ue before exitin
16730 67 20 2a 2f 0a 20 20 69 6e 74 20 67 6f 74 50 65  g */.  int gotPe
16740 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20 30 3b 2f 2a  ndingLock = 0;/*
16750 20 54 72 75 65 20 69 66 20 77 65 20 61 63 71 75   True if we acqu
16760 69 72 65 64 20 61 20 50 45 4e 44 49 4e 47 20 6c  ired a PENDING l
16770 6f 63 6b 20 74 68 69 73 20 74 69 6d 65 20 2a 2f  ock this time */
16780 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  .  winFile *pFil
16790 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64  e = (winFile*)id
167a0 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72  ;.  DWORD lastEr
167b0 72 6e 6f 20 3d 20 4e 4f 5f 45 52 52 4f 52 3b 0a  rno = NO_ERROR;.
167c0 0a 20 20 61 73 73 65 72 74 28 20 69 64 21 3d 30  .  assert( id!=0
167d0 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22   );.  OSTRACE(("
167e0 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6f 6c  LOCK file=%p, ol
167f0 64 4c 6f 63 6b 3d 25 64 28 25 64 29 2c 20 6e 65  dLock=%d(%d), ne
16800 77 4c 6f 63 6b 3d 25 64 5c 6e 22 2c 0a 20 20 20  wLock=%d\n",.   
16810 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68          pFile->h
16820 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  , pFile->locktyp
16830 65 2c 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64  e, pFile->shared
16840 4c 6f 63 6b 42 79 74 65 2c 20 6c 6f 63 6b 74 79  LockByte, lockty
16850 70 65 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  pe));..  /* If t
16860 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20  here is already 
16870 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20 74  a lock of this t
16880 79 70 65 20 6f 72 20 6d 6f 72 65 20 72 65 73 74  ype or more rest
16890 72 69 63 74 69 76 65 20 6f 6e 20 74 68 65 0a 20  rictive on the. 
168a0 20 2a 2a 20 4f 73 46 69 6c 65 2c 20 64 6f 20 6e   ** OsFile, do n
168b0 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75 73  othing. Don't us
168c0 65 20 74 68 65 20 65 6e 64 5f 6c 6f 63 6b 3a 20  e the end_lock: 
168d0 65 78 69 74 20 70 61 74 68 2c 20 61 73 0a 20 20  exit path, as.  
168e0 2a 2a 20 73 71 6c 69 74 65 33 4f 73 45 6e 74 65  ** sqlite3OsEnte
168f0 72 4d 75 74 65 78 28 29 20 68 61 73 6e 27 74 20  rMutex() hasn't 
16900 62 65 65 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e  been called yet.
16910 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  .  */.  if( pFil
16920 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 6c 6f 63  e->locktype>=loc
16930 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 4f 53 54  ktype ){.    OST
16940 52 41 43 45 28 28 22 4c 4f 43 4b 2d 48 45 4c 44  RACE(("LOCK-HELD
16950 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c   file=%p, rc=SQL
16960 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65  ITE_OK\n", pFile
16970 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75 72  ->h));.    retur
16980 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
16990 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
169a0 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71   the locking seq
169b0 75 65 6e 63 65 20 69 73 20 63 6f 72 72 65 63 74  uence is correct
169c0 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
169d0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 21  pFile->locktype!
169e0 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 6c 6f 63 6b  =NO_LOCK || lock
169f0 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
16a00 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c  K );.  assert( l
16a10 6f 63 6b 74 79 70 65 21 3d 50 45 4e 44 49 4e 47  ocktype!=PENDING
16a20 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
16a30 74 28 20 6c 6f 63 6b 74 79 70 65 21 3d 52 45 53  t( locktype!=RES
16a40 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46  ERVED_LOCK || pF
16a50 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53  ile->locktype==S
16a60 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20  HARED_LOCK );.. 
16a70 20 2f 2a 20 4c 6f 63 6b 20 74 68 65 20 50 45 4e   /* Lock the PEN
16a80 44 49 4e 47 5f 4c 4f 43 4b 20 62 79 74 65 20 69  DING_LOCK byte i
16a90 66 20 77 65 20 6e 65 65 64 20 74 6f 20 61 63 71  f we need to acq
16aa0 75 69 72 65 20 61 20 50 45 4e 44 49 4e 47 20 6c  uire a PENDING l
16ab0 6f 63 6b 20 6f 72 0a 20 20 2a 2a 20 61 20 53 48  ock or.  ** a SH
16ac0 41 52 45 44 20 6c 6f 63 6b 2e 20 20 49 66 20 77  ARED lock.  If w
16ad0 65 20 61 72 65 20 61 63 71 75 69 72 69 6e 67 20  e are acquiring 
16ae0 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74  a SHARED lock, t
16af0 68 65 20 61 63 71 75 69 73 69 74 69 6f 6e 20 6f  he acquisition o
16b00 66 0a 20 20 2a 2a 20 74 68 65 20 50 45 4e 44 49  f.  ** the PENDI
16b10 4e 47 5f 4c 4f 43 4b 20 62 79 74 65 20 69 73 20  NG_LOCK byte is 
16b20 74 65 6d 70 6f 72 61 72 79 2e 0a 20 20 2a 2f 0a  temporary..  */.
16b30 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20    newLocktype = 
16b40 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3b  pFile->locktype;
16b50 0a 20 20 69 66 28 20 20 20 28 70 46 69 6c 65 2d  .  if(   (pFile-
16b60 3e 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f  >locktype==NO_LO
16b70 43 4b 29 0a 20 20 20 20 20 7c 7c 20 28 20 20 20  CK).     || (   
16b80 28 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55  (locktype==EXCLU
16b90 53 49 56 45 5f 4c 4f 43 4b 29 0a 20 20 20 20 20  SIVE_LOCK).     
16ba0 20 20 20 20 26 26 20 28 70 46 69 6c 65 2d 3e 6c      && (pFile->l
16bb0 6f 63 6b 74 79 70 65 3d 3d 52 45 53 45 52 56 45  ocktype==RESERVE
16bc0 44 5f 4c 4f 43 4b 29 29 0a 20 20 29 7b 0a 20 20  D_LOCK)).  ){.  
16bd0 20 20 69 6e 74 20 63 6e 74 20 3d 20 33 3b 0a 20    int cnt = 3;. 
16be0 20 20 20 77 68 69 6c 65 28 20 63 6e 74 2d 2d 3e     while( cnt-->
16bf0 30 20 26 26 20 28 72 65 73 20 3d 20 77 69 6e 4c  0 && (res = winL
16c00 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e  ockFile(&pFile->
16c10 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49  h, SQLITE_LOCKFI
16c20 4c 45 5f 46 4c 41 47 53 2c 0a 20 20 20 20 20 20  LE_FLAGS,.      
16c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c50 20 20 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c     PENDING_BYTE,
16c60 20 30 2c 20 31 2c 20 30 29 29 3d 3d 30 20 29 7b   0, 1, 0))==0 ){
16c70 0a 20 20 20 20 20 20 2f 2a 20 54 72 79 20 33 20  .      /* Try 3 
16c80 74 69 6d 65 73 20 74 6f 20 67 65 74 20 74 68 65  times to get the
16c90 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 2e 20 20   pending lock.  
16ca0 54 68 69 73 20 69 73 20 6e 65 65 64 65 64 20 74  This is needed t
16cb0 6f 20 77 6f 72 6b 0a 20 20 20 20 20 20 2a 2a 20  o work.      ** 
16cc0 61 72 6f 75 6e 64 20 70 72 6f 62 6c 65 6d 73 20  around problems 
16cd0 63 61 75 73 65 64 20 62 79 20 69 6e 64 65 78 69  caused by indexi
16ce0 6e 67 20 61 6e 64 2f 6f 72 20 61 6e 74 69 2d 76  ng and/or anti-v
16cf0 69 72 75 73 20 73 6f 66 74 77 61 72 65 20 6f 6e  irus software on
16d00 0a 20 20 20 20 20 20 2a 2a 20 57 69 6e 64 6f 77  .      ** Window
16d10 73 20 73 79 73 74 65 6d 73 2e 0a 20 20 20 20 20  s systems..     
16d20 20 2a 2a 20 49 66 20 79 6f 75 20 61 72 65 20 75   ** If you are u
16d30 73 69 6e 67 20 74 68 69 73 20 63 6f 64 65 20 61  sing this code a
16d40 73 20 61 20 6d 6f 64 65 6c 20 66 6f 72 20 61 6c  s a model for al
16d50 74 65 72 6e 61 74 69 76 65 20 56 46 53 65 73 2c  ternative VFSes,
16d60 20 64 6f 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a   do not.      **
16d70 20 63 6f 70 79 20 74 68 69 73 20 72 65 74 72 79   copy this retry
16d80 20 6c 6f 67 69 63 2e 20 20 49 74 20 69 73 20 61   logic.  It is a
16d90 20 68 61 63 6b 20 69 6e 74 65 6e 64 65 64 20 66   hack intended f
16da0 6f 72 20 57 69 6e 64 6f 77 73 20 6f 6e 6c 79 2e  or Windows only.
16db0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
16dc0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
16dd0 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
16de0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f      OSTRACE(("LO
16df0 43 4b 2d 50 45 4e 44 49 4e 47 2d 46 41 49 4c 20  CK-PENDING-FAIL 
16e00 66 69 6c 65 3d 25 70 2c 20 63 6f 75 6e 74 3d 25  file=%p, count=%
16e10 64 2c 20 72 65 73 75 6c 74 3d 25 64 5c 6e 22 2c  d, result=%d\n",
16e20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16e30 70 46 69 6c 65 2d 3e 68 2c 20 63 6e 74 2c 20 72  pFile->h, cnt, r
16e40 65 73 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  es));.      if( 
16e50 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52  lastErrno==ERROR
16e60 5f 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 20  _INVALID_HANDLE 
16e70 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65  ){.        pFile
16e80 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61  ->lastErrno = la
16e90 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20  stErrno;.       
16ea0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
16eb0 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20  RR_LOCK;.       
16ec0 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 2d   OSTRACE(("LOCK-
16ed0 46 41 49 4c 20 66 69 6c 65 3d 25 70 2c 20 63 6f  FAIL file=%p, co
16ee0 75 6e 74 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22  unt=%d, rc=%s\n"
16ef0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
16f00 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 63 6e 74     pFile->h, cnt
16f10 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65  , sqlite3ErrName
16f20 28 72 63 29 29 29 3b 0a 20 20 20 20 20 20 20 20  (rc)));.        
16f30 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
16f40 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 6e 74   }.      if( cnt
16f50 20 29 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32   ) sqlite3_win32
16f60 5f 73 6c 65 65 70 28 31 29 3b 0a 20 20 20 20 7d  _sleep(1);.    }
16f70 0a 20 20 20 20 67 6f 74 50 65 6e 64 69 6e 67 4c  .    gotPendingL
16f80 6f 63 6b 20 3d 20 72 65 73 3b 0a 20 20 20 20 69  ock = res;.    i
16f90 66 28 20 21 72 65 73 20 29 7b 0a 20 20 20 20 20  f( !res ){.     
16fa0 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47   lastErrno = osG
16fb0 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
16fc0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41     }.  }..  /* A
16fd0 63 71 75 69 72 65 20 61 20 73 68 61 72 65 64 20  cquire a shared 
16fe0 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20  lock.  */.  if( 
16ff0 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44  locktype==SHARED
17000 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20 29 7b 0a  _LOCK && res ){.
17010 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c      assert( pFil
17020 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f  e->locktype==NO_
17030 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 65 73 20  LOCK );.    res 
17040 3d 20 77 69 6e 47 65 74 52 65 61 64 4c 6f 63 6b  = winGetReadLock
17050 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 69 66 28  (pFile);.    if(
17060 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20 6e 65   res ){.      ne
17070 77 4c 6f 63 6b 74 79 70 65 20 3d 20 53 48 41 52  wLocktype = SHAR
17080 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c  ED_LOCK;.    }el
17090 73 65 7b 0a 20 20 20 20 20 20 6c 61 73 74 45 72  se{.      lastEr
170a0 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
170b0 72 72 6f 72 28 29 3b 0a 20 20 20 20 7d 0a 20 20  rror();.    }.  
170c0 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20  }..  /* Acquire 
170d0 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 0a  a RESERVED lock.
170e0 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74    */.  if( lockt
170f0 79 70 65 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ype==RESERVED_LO
17100 43 4b 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20  CK && res ){.   
17110 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
17120 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44  locktype==SHARED
17130 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 65 73  _LOCK );.    res
17140 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26   = winLockFile(&
17150 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45  pFile->h, SQLITE
17160 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53 2c  _LOCKFILE_FLAGS,
17170 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20   RESERVED_BYTE, 
17180 30 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 69 66  0, 1, 0);.    if
17190 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20 6e  ( res ){.      n
171a0 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 52 45 53  ewLocktype = RES
171b0 45 52 56 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20  ERVED_LOCK;.    
171c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c 61 73  }else{.      las
171d0 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
171e0 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 7d  stError();.    }
171f0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69  .  }..  /* Acqui
17200 72 65 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63  re a PENDING loc
17210 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63  k.  */.  if( loc
17220 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45  ktype==EXCLUSIVE
17230 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20 29 7b 0a  _LOCK && res ){.
17240 20 20 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20      newLocktype 
17250 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a  = PENDING_LOCK;.
17260 20 20 20 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f      gotPendingLo
17270 63 6b 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  ck = 0;.  }..  /
17280 2a 20 41 63 71 75 69 72 65 20 61 6e 20 45 58 43  * Acquire an EXC
17290 4c 55 53 49 56 45 20 6c 6f 63 6b 0a 20 20 2a 2f  LUSIVE lock.  */
172a0 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d  .  if( locktype=
172b0 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
172c0 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20 61 73  && res ){.    as
172d0 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63  sert( pFile->loc
172e0 6b 74 79 70 65 3e 3d 53 48 41 52 45 44 5f 4c 4f  ktype>=SHARED_LO
172f0 43 4b 20 29 3b 0a 20 20 20 20 72 65 73 20 3d 20  CK );.    res = 
17300 77 69 6e 55 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63  winUnlockReadLoc
17310 6b 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 72 65  k(pFile);.    re
17320 73 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28  s = winLockFile(
17330 26 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54  &pFile->h, SQLIT
17340 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53  E_LOCKFILE_FLAGS
17350 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20  , SHARED_FIRST, 
17360 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
17370 20 20 20 20 20 20 20 20 20 53 48 41 52 45 44 5f           SHARED_
17380 53 49 5a 45 2c 20 30 29 3b 0a 20 20 20 20 69 66  SIZE, 0);.    if
17390 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20 6e  ( res ){.      n
173a0 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 45 58 43  ewLocktype = EXC
173b0 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b 0a 20 20 20  LUSIVE_LOCK;.   
173c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c 61   }else{.      la
173d0 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
173e0 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
173f0 20 20 77 69 6e 47 65 74 52 65 61 64 4c 6f 63 6b    winGetReadLock
17400 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20  (pFile);.    }. 
17410 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 61   }..  /* If we a
17420 72 65 20 68 6f 6c 64 69 6e 67 20 61 20 50 45 4e  re holding a PEN
17430 44 49 4e 47 20 6c 6f 63 6b 20 74 68 61 74 20 6f  DING lock that o
17440 75 67 68 74 20 74 6f 20 62 65 20 72 65 6c 65 61  ught to be relea
17450 73 65 64 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 72  sed, then.  ** r
17460 65 6c 65 61 73 65 20 69 74 20 6e 6f 77 2e 0a 20  elease it now.. 
17470 20 2a 2f 0a 20 20 69 66 28 20 67 6f 74 50 65 6e   */.  if( gotPen
17480 64 69 6e 67 4c 6f 63 6b 20 26 26 20 6c 6f 63 6b  dingLock && lock
17490 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
174a0 4b 20 29 7b 0a 20 20 20 20 77 69 6e 55 6e 6c 6f  K ){.    winUnlo
174b0 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68  ckFile(&pFile->h
174c0 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20  , PENDING_BYTE, 
174d0 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20  0, 1, 0);.  }.. 
174e0 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 73   /* Update the s
174f0 74 61 74 65 20 6f 66 20 74 68 65 20 6c 6f 63 6b  tate of the lock
17500 20 68 61 73 20 68 65 6c 64 20 69 6e 20 74 68 65   has held in the
17510 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
17520 20 74 68 65 6e 0a 20 20 2a 2a 20 72 65 74 75 72   then.  ** retur
17530 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  n the appropriat
17540 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 0a 20  e result code.. 
17550 20 2a 2f 0a 20 20 69 66 28 20 72 65 73 20 29 7b   */.  if( res ){
17560 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
17570 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _OK;.  }else{.  
17580 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
17590 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a  no = lastErrno;.
175a0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
175b0 42 55 53 59 3b 0a 20 20 20 20 4f 53 54 52 41 43  BUSY;.    OSTRAC
175c0 45 28 28 22 4c 4f 43 4b 2d 46 41 49 4c 20 66 69  E(("LOCK-FAIL fi
175d0 6c 65 3d 25 70 2c 20 77 61 6e 74 65 64 3d 25 64  le=%p, wanted=%d
175e0 2c 20 67 6f 74 3d 25 64 5c 6e 22 2c 0a 20 20 20  , got=%d\n",.   
175f0 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
17600 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 2c 20 6e 65  >h, locktype, ne
17610 77 4c 6f 63 6b 74 79 70 65 29 29 3b 0a 20 20 7d  wLocktype));.  }
17620 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  .  pFile->lockty
17630 70 65 20 3d 20 28 75 38 29 6e 65 77 4c 6f 63 6b  pe = (u8)newLock
17640 74 79 70 65 3b 0a 20 20 4f 53 54 52 41 43 45 28  type;.  OSTRACE(
17650 28 22 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20  ("LOCK file=%p, 
17660 6c 6f 63 6b 3d 25 64 2c 20 72 63 3d 25 73 5c 6e  lock=%d, rc=%s\n
17670 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46  ",.           pF
17680 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c  ile->h, pFile->l
17690 6f 63 6b 74 79 70 65 2c 20 73 71 6c 69 74 65 33  ocktype, sqlite3
176a0 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20  ErrName(rc)));. 
176b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
176c0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
176d0 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72  e checks if ther
176e0 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20  e is a RESERVED 
176f0 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65  lock held on the
17700 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69   specified.** fi
17710 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e  le by this or an
17720 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e  y other process.
17730 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20   If such a lock 
17740 69 73 20 68 65 6c 64 2c 20 72 65 74 75 72 6e 0a  is held, return.
17750 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 6f 74 68  ** non-zero, oth
17760 65 72 77 69 73 65 20 7a 65 72 6f 2e 0a 2a 2f 0a  erwise zero..*/.
17770 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 43 68  static int winCh
17780 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
17790 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
177a0 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b  , int *pResOut){
177b0 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 77 69  .  int res;.  wi
177c0 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  nFile *pFile = (
177d0 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20  winFile*)id;..  
177e0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
177f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
17800 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56  OERR_CHECKRESERV
17810 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 4f 53 54  EDLOCK; );.  OST
17820 52 41 43 45 28 28 22 54 45 53 54 2d 57 52 2d 4c  RACE(("TEST-WR-L
17830 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 70 52 65  OCK file=%p, pRe
17840 73 4f 75 74 3d 25 70 5c 6e 22 2c 20 70 46 69 6c  sOut=%p\n", pFil
17850 65 2d 3e 68 2c 20 70 52 65 73 4f 75 74 29 29 3b  e->h, pResOut));
17860 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 21 3d  ..  assert( id!=
17870 30 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65  0 );.  if( pFile
17880 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 52 45 53 45  ->locktype>=RESE
17890 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  RVED_LOCK ){.   
178a0 20 72 65 73 20 3d 20 31 3b 0a 20 20 20 20 4f 53   res = 1;.    OS
178b0 54 52 41 43 45 28 28 22 54 45 53 54 2d 57 52 2d  TRACE(("TEST-WR-
178c0 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 72 65  LOCK file=%p, re
178d0 73 75 6c 74 3d 25 64 20 28 6c 6f 63 61 6c 29 5c  sult=%d (local)\
178e0 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 65  n", pFile->h, re
178f0 73 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  s));.  }else{.  
17900 20 20 72 65 73 20 3d 20 77 69 6e 4c 6f 63 6b 46    res = winLockF
17910 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53  ile(&pFile->h, S
17920 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 45 58  QLITE_LOCKFILEEX
17930 5f 46 4c 41 47 53 2c 52 45 53 45 52 56 45 44 5f  _FLAGS,RESERVED_
17940 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a  BYTE, 0, 1, 0);.
17950 20 20 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20      if( res ){. 
17960 20 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 46 69       winUnlockFi
17970 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 52 45  le(&pFile->h, RE
17980 53 45 52 56 45 44 5f 42 59 54 45 2c 20 30 2c 20  SERVED_BYTE, 0, 
17990 31 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  1, 0);.    }.   
179a0 20 72 65 73 20 3d 20 21 72 65 73 3b 0a 20 20 20   res = !res;.   
179b0 20 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 2d   OSTRACE(("TEST-
179c0 57 52 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c  WR-LOCK file=%p,
179d0 20 72 65 73 75 6c 74 3d 25 64 20 28 72 65 6d 6f   result=%d (remo
179e0 74 65 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  te)\n", pFile->h
179f0 2c 20 72 65 73 29 29 3b 0a 20 20 7d 0a 20 20 2a  , res));.  }.  *
17a00 70 52 65 73 4f 75 74 20 3d 20 72 65 73 3b 0a 20  pResOut = res;. 
17a10 20 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 2d   OSTRACE(("TEST-
17a20 57 52 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c  WR-LOCK file=%p,
17a30 20 70 52 65 73 4f 75 74 3d 25 70 2c 20 2a 70 52   pResOut=%p, *pR
17a40 65 73 4f 75 74 3d 25 64 2c 20 72 63 3d 53 51 4c  esOut=%d, rc=SQL
17a50 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20  ITE_OK\n",.     
17a60 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20        pFile->h, 
17a70 70 52 65 73 4f 75 74 2c 20 2a 70 52 65 73 4f 75  pResOut, *pResOu
17a80 74 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  t));.  return SQ
17a90 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
17aa0 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b  * Lower the lock
17ab0 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c  ing level on fil
17ac0 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 64 20  e descriptor id 
17ad0 74 6f 20 6c 6f 63 6b 74 79 70 65 2e 20 20 6c 6f  to locktype.  lo
17ae0 63 6b 74 79 70 65 0a 2a 2a 20 6d 75 73 74 20 62  cktype.** must b
17af0 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b  e either NO_LOCK
17b00 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e   or SHARED_LOCK.
17b10 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f  .**.** If the lo
17b20 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74  cking level of t
17b30 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
17b40 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74  or is already at
17b50 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65   or below.** the
17b60 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69   requested locki
17b70 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72  ng level, this r
17b80 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
17b90 70 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 6e  p..**.** It is n
17ba0 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20  ot possible for 
17bb0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 20  this routine to 
17bc0 66 61 69 6c 20 69 66 20 74 68 65 20 73 65 63 6f  fail if the seco
17bd0 6e 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69  nd argument.** i
17be0 73 20 4e 4f 5f 4c 4f 43 4b 2e 20 20 49 66 20 74  s NO_LOCK.  If t
17bf0 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
17c00 6e 74 20 69 73 20 53 48 41 52 45 44 5f 4c 4f 43  nt is SHARED_LOC
17c10 4b 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  K then this rout
17c20 69 6e 65 0a 2a 2a 20 6d 69 67 68 74 20 72 65 74  ine.** might ret
17c30 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
17c40 3b 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.*/.static int 
17c50 77 69 6e 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65  winUnlock(sqlite
17c60 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
17c70 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74  locktype){.  int
17c80 20 74 79 70 65 3b 0a 20 20 77 69 6e 46 69 6c 65   type;.  winFile
17c90 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69   *pFile = (winFi
17ca0 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72 63  le*)id;.  int rc
17cb0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
17cc0 61 73 73 65 72 74 28 20 70 46 69 6c 65 21 3d 30  assert( pFile!=0
17cd0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f   );.  assert( lo
17ce0 63 6b 74 79 70 65 3c 3d 53 48 41 52 45 44 5f 4c  cktype<=SHARED_L
17cf0 4f 43 4b 20 29 3b 0a 20 20 4f 53 54 52 41 43 45  OCK );.  OSTRACE
17d00 28 28 22 55 4e 4c 4f 43 4b 20 66 69 6c 65 3d 25  (("UNLOCK file=%
17d10 70 2c 20 6f 6c 64 4c 6f 63 6b 3d 25 64 28 25 64  p, oldLock=%d(%d
17d20 29 2c 20 6e 65 77 4c 6f 63 6b 3d 25 64 5c 6e 22  ), newLock=%d\n"
17d30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69  ,.           pFi
17d40 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f  le->h, pFile->lo
17d50 63 6b 74 79 70 65 2c 20 70 46 69 6c 65 2d 3e 73  cktype, pFile->s
17d60 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 6c  haredLockByte, l
17d70 6f 63 6b 74 79 70 65 29 29 3b 0a 20 20 74 79 70  ocktype));.  typ
17d80 65 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  e = pFile->lockt
17d90 79 70 65 3b 0a 20 20 69 66 28 20 74 79 70 65 3e  ype;.  if( type>
17da0 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
17db0 29 7b 0a 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b  ){.    winUnlock
17dc0 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20  File(&pFile->h, 
17dd0 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c  SHARED_FIRST, 0,
17de0 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29   SHARED_SIZE, 0)
17df0 3b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 74 79  ;.    if( lockty
17e00 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe==SHARED_LOCK 
17e10 26 26 20 21 77 69 6e 47 65 74 52 65 61 64 4c 6f  && !winGetReadLo
17e20 63 6b 28 70 46 69 6c 65 29 20 29 7b 0a 20 20 20  ck(pFile) ){.   
17e30 20 20 20 2f 2a 20 54 68 69 73 20 73 68 6f 75 6c     /* This shoul
17e40 64 20 6e 65 76 65 72 20 68 61 70 70 65 6e 2e 20  d never happen. 
17e50 20 57 65 20 73 68 6f 75 6c 64 20 61 6c 77 61 79   We should alway
17e60 73 20 62 65 20 61 62 6c 65 20 74 6f 0a 20 20 20  s be able to.   
17e70 20 20 20 2a 2a 20 72 65 61 63 71 75 69 72 65 20     ** reacquire 
17e80 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f  the read lock */
17e90 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c  .      rc = winL
17ea0 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
17eb0 4f 45 52 52 5f 55 4e 4c 4f 43 4b 2c 20 6f 73 47  OERR_UNLOCK, osG
17ec0 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20  etLastError(),. 
17ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ee0 20 20 20 20 20 20 22 77 69 6e 55 6e 6c 6f 63 6b        "winUnlock
17ef0 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
17f00 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
17f10 28 20 74 79 70 65 3e 3d 52 45 53 45 52 56 45 44  ( type>=RESERVED
17f20 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 77 69 6e  _LOCK ){.    win
17f30 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c  UnlockFile(&pFil
17f40 65 2d 3e 68 2c 20 52 45 53 45 52 56 45 44 5f 42  e->h, RESERVED_B
17f50 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20  YTE, 0, 1, 0);. 
17f60 20 7d 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70   }.  if( locktyp
17f70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 26 26 20 74 79  e==NO_LOCK && ty
17f80 70 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe>=SHARED_LOCK 
17f90 29 7b 0a 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b  ){.    winUnlock
17fa0 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b  ReadLock(pFile);
17fb0 0a 20 20 7d 0a 20 20 69 66 28 20 74 79 70 65 3e  .  }.  if( type>
17fc0 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 7b  =PENDING_LOCK ){
17fd0 0a 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 46 69  .    winUnlockFi
17fe0 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 50 45  le(&pFile->h, PE
17ff0 4e 44 49 4e 47 5f 42 59 54 45 2c 20 30 2c 20 31  NDING_BYTE, 0, 1
18000 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 70 46 69 6c  , 0);.  }.  pFil
18010 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 28 75  e->locktype = (u
18020 38 29 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 4f 53  8)locktype;.  OS
18030 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 66  TRACE(("UNLOCK f
18040 69 6c 65 3d 25 70 2c 20 6c 6f 63 6b 3d 25 64 2c  ile=%p, lock=%d,
18050 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20   rc=%s\n",.     
18060 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20        pFile->h, 
18070 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c  pFile->locktype,
18080 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28   sqlite3ErrName(
18090 72 63 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  rc)));.  return 
180a0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  rc;.}../*.** If 
180b0 2a 70 41 72 67 20 69 73 20 69 6e 69 74 69 74 69  *pArg is inititi
180c0 61 6c 6c 79 20 6e 65 67 61 74 69 76 65 20 74 68  ally negative th
180d0 65 6e 20 74 68 69 73 20 69 73 20 61 20 71 75 65  en this is a que
180e0 72 79 2e 20 20 53 65 74 20 2a 70 41 72 67 20 74  ry.  Set *pArg t
180f0 6f 0a 2a 2a 20 31 20 6f 72 20 30 20 64 65 70 65  o.** 1 or 0 depe
18100 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72  nding on whether
18110 20 6f 72 20 6e 6f 74 20 62 69 74 20 6d 61 73 6b   or not bit mask
18120 20 6f 66 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46   of pFile->ctrlF
18130 6c 61 67 73 20 69 73 20 73 65 74 2e 0a 2a 2a 0a  lags is set..**.
18140 2a 2a 20 49 66 20 2a 70 41 72 67 20 69 73 20 30  ** If *pArg is 0
18150 20 6f 72 20 31 2c 20 74 68 65 6e 20 63 6c 65 61   or 1, then clea
18160 72 20 6f 72 20 73 65 74 20 74 68 65 20 6d 61 73  r or set the mas
18170 6b 20 62 69 74 20 6f 66 20 70 46 69 6c 65 2d 3e  k bit of pFile->
18180 63 74 72 6c 46 6c 61 67 73 2e 0a 2a 2f 0a 73 74  ctrlFlags..*/.st
18190 61 74 69 63 20 76 6f 69 64 20 77 69 6e 4d 6f 64  atic void winMod
181a0 65 42 69 74 28 77 69 6e 46 69 6c 65 20 2a 70 46  eBit(winFile *pF
181b0 69 6c 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  ile, unsigned ch
181c0 61 72 20 6d 61 73 6b 2c 20 69 6e 74 20 2a 70 41  ar mask, int *pA
181d0 72 67 29 7b 0a 20 20 69 66 28 20 2a 70 41 72 67  rg){.  if( *pArg
181e0 3c 30 20 29 7b 0a 20 20 20 20 2a 70 41 72 67 20  <0 ){.    *pArg 
181f0 3d 20 28 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c  = (pFile->ctrlFl
18200 61 67 73 20 26 20 6d 61 73 6b 29 21 3d 30 3b 0a  ags & mask)!=0;.
18210 20 20 7d 65 6c 73 65 20 69 66 28 20 28 2a 70 41    }else if( (*pA
18220 72 67 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 46  rg)==0 ){.    pF
18230 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26  ile->ctrlFlags &
18240 3d 20 7e 6d 61 73 6b 3b 0a 20 20 7d 65 6c 73 65  = ~mask;.  }else
18250 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72  {.    pFile->ctr
18260 6c 46 6c 61 67 73 20 7c 3d 20 6d 61 73 6b 3b 0a  lFlags |= mask;.
18270 20 20 7d 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72    }.}../* Forwar
18280 64 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  d references to 
18290 56 46 53 20 68 65 6c 70 65 72 20 6d 65 74 68 6f  VFS helper metho
182a0 64 73 20 75 73 65 64 20 66 6f 72 20 74 65 6d 70  ds used for temp
182b0 6f 72 61 72 79 20 66 69 6c 65 73 20 2a 2f 0a 73  orary files */.s
182c0 74 61 74 69 63 20 69 6e 74 20 77 69 6e 47 65 74  tatic int winGet
182d0 54 65 6d 70 6e 61 6d 65 28 73 71 6c 69 74 65 33  Tempname(sqlite3
182e0 5f 76 66 73 20 2a 2c 20 63 68 61 72 20 2a 2a 29  _vfs *, char **)
182f0 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  ;.static int win
18300 49 73 44 69 72 28 63 6f 6e 73 74 20 76 6f 69 64  IsDir(const void
18310 20 2a 29 3b 0a 73 74 61 74 69 63 20 42 4f 4f 4c   *);.static BOOL
18320 20 77 69 6e 49 73 44 72 69 76 65 4c 65 74 74 65   winIsDriveLette
18330 72 41 6e 64 43 6f 6c 6f 6e 28 63 6f 6e 73 74 20  rAndColon(const 
18340 63 68 61 72 20 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20  char *);../*.** 
18350 43 6f 6e 74 72 6f 6c 20 61 6e 64 20 71 75 65 72  Control and quer
18360 79 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 66 69  y of the open fi
18370 6c 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74  le handle..*/.st
18380 61 74 69 63 20 69 6e 74 20 77 69 6e 46 69 6c 65  atic int winFile
18390 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f  Control(sqlite3_
183a0 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6f 70  file *id, int op
183b0 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20  , void *pArg){. 
183c0 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20   winFile *pFile 
183d0 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a  = (winFile*)id;.
183e0 20 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54    OSTRACE(("FCNT
183f0 4c 20 66 69 6c 65 3d 25 70 2c 20 6f 70 3d 25 64  L file=%p, op=%d
18400 2c 20 70 41 72 67 3d 25 70 5c 6e 22 2c 20 70 46  , pArg=%p\n", pF
18410 69 6c 65 2d 3e 68 2c 20 6f 70 2c 20 70 41 72 67  ile->h, op, pArg
18420 29 29 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70  ));.  switch( op
18430 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c   ){.    case SQL
18440 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54  ITE_FCNTL_LOCKST
18450 41 54 45 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69  ATE: {.      *(i
18460 6e 74 2a 29 70 41 72 67 20 3d 20 70 46 69 6c 65  nt*)pArg = pFile
18470 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20  ->locktype;.    
18480 20 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54    OSTRACE(("FCNT
18490 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51  L file=%p, rc=SQ
184a0 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c  LITE_OK\n", pFil
184b0 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65  e->h));.      re
184c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
184d0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
184e0 51 4c 49 54 45 5f 4c 41 53 54 5f 45 52 52 4e 4f  QLITE_LAST_ERRNO
184f0 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a  : {.      *(int*
18500 29 70 41 72 67 20 3d 20 28 69 6e 74 29 70 46 69  )pArg = (int)pFi
18510 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20  le->lastErrno;. 
18520 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46       OSTRACE(("F
18530 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63  CNTL file=%p, rc
18540 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70  =SQLITE_OK\n", p
18550 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20  File->h));.     
18560 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
18570 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
18580 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 43  e SQLITE_FCNTL_C
18590 48 55 4e 4b 5f 53 49 5a 45 3a 20 7b 0a 20 20 20  HUNK_SIZE: {.   
185a0 20 20 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e     pFile->szChun
185b0 6b 20 3d 20 2a 28 69 6e 74 20 2a 29 70 41 72 67  k = *(int *)pArg
185c0 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  ;.      OSTRACE(
185d0 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c  ("FCNTL file=%p,
185e0 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22   rc=SQLITE_OK\n"
185f0 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
18600 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
18610 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
18620 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
18630 4c 5f 53 49 5a 45 5f 48 49 4e 54 3a 20 7b 0a 20  L_SIZE_HINT: {. 
18640 20 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e       if( pFile->
18650 73 7a 43 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20  szChunk>0 ){.   
18660 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74       sqlite3_int
18670 36 34 20 6f 6c 64 53 7a 3b 0a 20 20 20 20 20 20  64 oldSz;.      
18680 20 20 69 6e 74 20 72 63 20 3d 20 77 69 6e 46 69    int rc = winFi
18690 6c 65 53 69 7a 65 28 69 64 2c 20 26 6f 6c 64 53  leSize(id, &oldS
186a0 7a 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  z);.        if( 
186b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
186c0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
186d0 65 33 5f 69 6e 74 36 34 20 6e 65 77 53 7a 20 3d  e3_int64 newSz =
186e0 20 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34   *(sqlite3_int64
186f0 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20 20 20  *)pArg;.        
18700 20 20 69 66 28 20 6e 65 77 53 7a 3e 6f 6c 64 53    if( newSz>oldS
18710 7a 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  z ){.           
18720 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
18730 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20  Benign(1);.     
18740 20 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 54         rc = winT
18750 72 75 6e 63 61 74 65 28 69 64 2c 20 6e 65 77 53  runcate(id, newS
18760 7a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  z);.            
18770 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
18780 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20  enign(0);.      
18790 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
187a0 20 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28          OSTRACE(
187b0 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c  ("FCNTL file=%p,
187c0 20 72 63 3d 25 73 5c 6e 22 2c 20 70 46 69 6c 65   rc=%s\n", pFile
187d0 2d 3e 68 2c 20 73 71 6c 69 74 65 33 45 72 72 4e  ->h, sqlite3ErrN
187e0 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 20 20 20  ame(rc)));.     
187f0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
18800 20 20 20 20 7d 0a 20 20 20 20 20 20 4f 53 54 52      }.      OSTR
18810 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65  ACE(("FCNTL file
18820 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f  =%p, rc=SQLITE_O
18830 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29  K\n", pFile->h))
18840 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
18850 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
18860 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
18870 46 43 4e 54 4c 5f 50 45 52 53 49 53 54 5f 57 41  FCNTL_PERSIST_WA
18880 4c 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 62  L: {.      int b
18890 50 65 72 73 69 73 74 20 3d 20 2a 28 69 6e 74 2a  Persist = *(int*
188a0 29 70 41 72 67 3b 0a 20 20 20 20 20 20 69 66 28  )pArg;.      if(
188b0 20 62 50 65 72 73 69 73 74 3c 30 20 29 7b 0a 20   bPersist<0 ){. 
188c0 20 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41         *(int*)pA
188d0 72 67 20 3d 20 70 46 69 6c 65 2d 3e 62 50 65 72  rg = pFile->bPer
188e0 73 69 73 74 57 61 6c 3b 0a 20 20 20 20 20 20 7d  sistWal;.      }
188f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 46  else{.        pF
18900 69 6c 65 2d 3e 62 50 65 72 73 69 73 74 57 61 6c  ile->bPersistWal
18910 20 3d 20 62 50 65 72 73 69 73 74 21 3d 30 3b 0a   = bPersist!=0;.
18920 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
18930 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
18940 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
18950 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 45 52 53  QLITE_FCNTL_PERS
18960 49 53 54 5f 57 41 4c 3a 20 7b 0a 20 20 20 20 20  IST_WAL: {.     
18970 20 77 69 6e 4d 6f 64 65 42 69 74 28 70 46 69 6c   winModeBit(pFil
18980 65 2c 20 57 49 4e 46 49 4c 45 5f 50 45 52 53 49  e, WINFILE_PERSI
18990 53 54 5f 57 41 4c 2c 20 28 69 6e 74 2a 29 70 41  ST_WAL, (int*)pA
189a0 72 67 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41  rg);.      OSTRA
189b0 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d  CE(("FCNTL file=
189c0 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b  %p, rc=SQLITE_OK
189d0 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  \n", pFile->h));
189e0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
189f0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
18a00 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
18a10 43 4e 54 4c 5f 50 4f 57 45 52 53 41 46 45 5f 4f  CNTL_POWERSAFE_O
18a20 56 45 52 57 52 49 54 45 3a 20 7b 0a 20 20 20 20  VERWRITE: {.    
18a30 20 20 77 69 6e 4d 6f 64 65 42 69 74 28 70 46 69    winModeBit(pFi
18a40 6c 65 2c 20 57 49 4e 46 49 4c 45 5f 50 53 4f 57  le, WINFILE_PSOW
18a50 2c 20 28 69 6e 74 2a 29 70 41 72 67 29 3b 0a 20  , (int*)pArg);. 
18a60 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46       OSTRACE(("F
18a70 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63  CNTL file=%p, rc
18a80 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70  =SQLITE_OK\n", p
18a90 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20  File->h));.     
18aa0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
18ab0 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
18ac0 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 56  e SQLITE_FCNTL_V
18ad0 46 53 4e 41 4d 45 3a 20 7b 0a 20 20 20 20 20 20  FSNAME: {.      
18ae0 2a 28 63 68 61 72 2a 2a 29 70 41 72 67 20 3d 20  *(char**)pArg = 
18af0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
18b00 22 25 73 22 2c 20 70 46 69 6c 65 2d 3e 70 56 66  "%s", pFile->pVf
18b10 73 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  s->zName);.     
18b20 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c   OSTRACE(("FCNTL
18b30 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c   file=%p, rc=SQL
18b40 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65  ITE_OK\n", pFile
18b50 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74  ->h));.      ret
18b60 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
18b70 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
18b80 4c 49 54 45 5f 46 43 4e 54 4c 5f 57 49 4e 33 32  LITE_FCNTL_WIN32
18b90 5f 41 56 5f 52 45 54 52 59 3a 20 7b 0a 20 20 20  _AV_RETRY: {.   
18ba0 20 20 20 69 6e 74 20 2a 61 20 3d 20 28 69 6e 74     int *a = (int
18bb0 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20 69 66  *)pArg;.      if
18bc0 28 20 61 5b 30 5d 3e 30 20 29 7b 0a 20 20 20 20  ( a[0]>0 ){.    
18bd0 20 20 20 20 77 69 6e 49 6f 65 72 72 52 65 74 72      winIoerrRetr
18be0 79 20 3d 20 61 5b 30 5d 3b 0a 20 20 20 20 20 20  y = a[0];.      
18bf0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
18c00 5b 30 5d 20 3d 20 77 69 6e 49 6f 65 72 72 52 65  [0] = winIoerrRe
18c10 74 72 79 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  try;.      }.   
18c20 20 20 20 69 66 28 20 61 5b 31 5d 3e 30 20 29 7b     if( a[1]>0 ){
18c30 0a 20 20 20 20 20 20 20 20 77 69 6e 49 6f 65 72  .        winIoer
18c40 72 52 65 74 72 79 44 65 6c 61 79 20 3d 20 61 5b  rRetryDelay = a[
18c50 31 5d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  1];.      }else{
18c60 0a 20 20 20 20 20 20 20 20 61 5b 31 5d 20 3d 20  .        a[1] = 
18c70 77 69 6e 49 6f 65 72 72 52 65 74 72 79 44 65 6c  winIoerrRetryDel
18c80 61 79 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ay;.      }.    
18c90 20 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54    OSTRACE(("FCNT
18ca0 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51  L file=%p, rc=SQ
18cb0 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c  LITE_OK\n", pFil
18cc0 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65  e->h));.      re
18cd0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
18ce0 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c      }.#ifdef SQL
18cf0 49 54 45 5f 54 45 53 54 0a 20 20 20 20 63 61 73  ITE_TEST.    cas
18d00 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 57  e SQLITE_FCNTL_W
18d10 49 4e 33 32 5f 53 45 54 5f 48 41 4e 44 4c 45 3a  IN32_SET_HANDLE:
18d20 20 7b 0a 20 20 20 20 20 20 4c 50 48 41 4e 44 4c   {.      LPHANDL
18d30 45 20 70 68 46 69 6c 65 20 3d 20 28 4c 50 48 41  E phFile = (LPHA
18d40 4e 44 4c 45 29 70 41 72 67 3b 0a 20 20 20 20 20  NDLE)pArg;.     
18d50 20 48 41 4e 44 4c 45 20 68 4f 6c 64 46 69 6c 65   HANDLE hOldFile
18d60 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 20   = pFile->h;.   
18d70 20 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 2a 70     pFile->h = *p
18d80 68 46 69 6c 65 3b 0a 20 20 20 20 20 20 2a 70 68  hFile;.      *ph
18d90 46 69 6c 65 20 3d 20 68 4f 6c 64 46 69 6c 65 3b  File = hOldFile;
18da0 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
18db0 22 46 43 4e 54 4c 20 6f 6c 64 46 69 6c 65 3d 25  "FCNTL oldFile=%
18dc0 70 2c 20 6e 65 77 46 69 6c 65 3d 25 70 2c 20 72  p, newFile=%p, r
18dd0 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a  c=SQLITE_OK\n",.
18de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 68                 h
18df0 4f 6c 64 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e  OldFile, pFile->
18e00 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  h));.      retur
18e10 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
18e20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61   }.#endif.    ca
18e30 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
18e40 54 45 4d 50 46 49 4c 45 4e 41 4d 45 3a 20 7b 0a  TEMPFILENAME: {.
18e50 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 46 69        char *zTFi
18e60 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e  le = 0;.      in
18e70 74 20 72 63 20 3d 20 77 69 6e 47 65 74 54 65 6d  t rc = winGetTem
18e80 70 6e 61 6d 65 28 70 46 69 6c 65 2d 3e 70 56 66  pname(pFile->pVf
18e90 73 2c 20 26 7a 54 46 69 6c 65 29 3b 0a 20 20 20  s, &zTFile);.   
18ea0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
18eb0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
18ec0 2a 28 63 68 61 72 2a 2a 29 70 41 72 67 20 3d 20  *(char**)pArg = 
18ed0 7a 54 46 69 6c 65 3b 0a 20 20 20 20 20 20 7d 0a  zTFile;.      }.
18ee0 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
18ef0 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72  FCNTL file=%p, r
18f00 63 3d 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  c=%s\n", pFile->
18f10 68 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d  h, sqlite3ErrNam
18f20 65 28 72 63 29 29 29 3b 0a 20 20 20 20 20 20 72  e(rc)));.      r
18f30 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
18f40 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  #if SQLITE_MAX_M
18f50 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 20 20 63  MAP_SIZE>0.    c
18f60 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
18f70 5f 4d 4d 41 50 5f 53 49 5a 45 3a 20 7b 0a 20 20  _MMAP_SIZE: {.  
18f80 20 20 20 20 69 36 34 20 6e 65 77 4c 69 6d 69 74      i64 newLimit
18f90 20 3d 20 2a 28 69 36 34 2a 29 70 41 72 67 3b 0a   = *(i64*)pArg;.
18fa0 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53        int rc = S
18fb0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
18fc0 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e 73 71 6c  if( newLimit>sql
18fd0 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
18fe0 2e 6d 78 4d 6d 61 70 20 29 7b 0a 20 20 20 20 20  .mxMmap ){.     
18ff0 20 20 20 6e 65 77 4c 69 6d 69 74 20 3d 20 73 71     newLimit = sq
19000 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
19010 67 2e 6d 78 4d 6d 61 70 3b 0a 20 20 20 20 20 20  g.mxMmap;.      
19020 7d 0a 20 20 20 20 20 20 2a 28 69 36 34 2a 29 70  }.      *(i64*)p
19030 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61  Arg = pFile->mma
19040 70 53 69 7a 65 4d 61 78 3b 0a 20 20 20 20 20 20  pSizeMax;.      
19050 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e 3d 30 20  if( newLimit>=0 
19060 26 26 20 6e 65 77 4c 69 6d 69 74 21 3d 70 46 69  && newLimit!=pFi
19070 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20  le->mmapSizeMax 
19080 26 26 20 70 46 69 6c 65 2d 3e 6e 46 65 74 63 68  && pFile->nFetch
19090 4f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Out==0 ){.      
190a0 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a    pFile->mmapSiz
190b0 65 4d 61 78 20 3d 20 6e 65 77 4c 69 6d 69 74 3b  eMax = newLimit;
190c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 46 69  .        if( pFi
190d0 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 3e 30 20 29  le->mmapSize>0 )
190e0 7b 0a 20 20 20 20 20 20 20 20 20 20 77 69 6e 55  {.          winU
190f0 6e 6d 61 70 66 69 6c 65 28 70 46 69 6c 65 29 3b  nmapfile(pFile);
19100 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
19110 77 69 6e 4d 61 70 66 69 6c 65 28 70 46 69 6c 65  winMapfile(pFile
19120 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 7d  , -1);.        }
19130 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 4f  .      }.      O
19140 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66  STRACE(("FCNTL f
19150 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22  ile=%p, rc=%s\n"
19160 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 73 71 6c 69  , pFile->h, sqli
19170 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29  te3ErrName(rc)))
19180 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
19190 63 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  c;.    }.#endif.
191a0 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22    }.  OSTRACE(("
191b0 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72  FCNTL file=%p, r
191c0 63 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  c=SQLITE_NOTFOUN
191d0 44 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29  D\n", pFile->h))
191e0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
191f0 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 7d 0a 0a 2f  E_NOTFOUND;.}../
19200 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
19210 73 65 63 74 6f 72 20 73 69 7a 65 20 69 6e 20 62  sector size in b
19220 79 74 65 73 20 6f 66 20 74 68 65 20 75 6e 64 65  ytes of the unde
19230 72 6c 79 69 6e 67 20 62 6c 6f 63 6b 20 64 65 76  rlying block dev
19240 69 63 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73  ice for.** the s
19250 70 65 63 69 66 69 65 64 20 66 69 6c 65 2e 20 54  pecified file. T
19260 68 69 73 20 69 73 20 61 6c 6d 6f 73 74 20 61 6c  his is almost al
19270 77 61 79 73 20 35 31 32 20 62 79 74 65 73 2c 20  ways 512 bytes, 
19280 62 75 74 20 6d 61 79 20 62 65 0a 2a 2a 20 6c 61  but may be.** la
19290 72 67 65 72 20 66 6f 72 20 73 6f 6d 65 20 64 65  rger for some de
192a0 76 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c  vices..**.** SQL
192b0 69 74 65 20 63 6f 64 65 20 61 73 73 75 6d 65 73  ite code assumes
192c0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   this function c
192d0 61 6e 6e 6f 74 20 66 61 69 6c 2e 20 49 74 20 61  annot fail. It a
192e0 6c 73 6f 20 61 73 73 75 6d 65 73 20 74 68 61 74  lso assumes that
192f0 0a 2a 2a 20 69 66 20 74 77 6f 20 66 69 6c 65 73  .** if two files
19300 20 61 72 65 20 63 72 65 61 74 65 64 20 69 6e 20   are created in 
19310 74 68 65 20 73 61 6d 65 20 66 69 6c 65 2d 73 79  the same file-sy
19320 73 74 65 6d 20 64 69 72 65 63 74 6f 72 79 20 28  stem directory (
19330 69 2e 65 2e 0a 2a 2a 20 61 20 64 61 74 61 62 61  i.e..** a databa
19340 73 65 20 61 6e 64 20 69 74 73 20 6a 6f 75 72 6e  se and its journ
19350 61 6c 20 66 69 6c 65 29 20 74 68 61 74 20 74 68  al file) that th
19360 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 77 69  e sector size wi
19370 6c 6c 20 62 65 20 74 68 65 0a 2a 2a 20 73 61 6d  ll be the.** sam
19380 65 20 66 6f 72 20 62 6f 74 68 2e 0a 2a 2f 0a 73  e for both..*/.s
19390 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 65 63  tatic int winSec
193a0 74 6f 72 53 69 7a 65 28 73 71 6c 69 74 65 33 5f  torSize(sqlite3_
193b0 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 28 76 6f  file *id){.  (vo
193c0 69 64 29 69 64 3b 0a 20 20 72 65 74 75 72 6e 20  id)id;.  return 
193d0 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53  SQLITE_DEFAULT_S
193e0 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 7d 0a 0a 2f  ECTOR_SIZE;.}../
193f0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 76 65  *.** Return a ve
19400 63 74 6f 72 20 6f 66 20 64 65 76 69 63 65 20 63  ctor of device c
19410 68 61 72 61 63 74 65 72 69 73 74 69 63 73 2e 0a  haracteristics..
19420 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
19430 6e 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  nDeviceCharacter
19440 69 73 74 69 63 73 28 73 71 6c 69 74 65 33 5f 66  istics(sqlite3_f
19450 69 6c 65 20 2a 69 64 29 7b 0a 20 20 77 69 6e 46  ile *id){.  winF
19460 69 6c 65 20 2a 70 20 3d 20 28 77 69 6e 46 69 6c  ile *p = (winFil
19470 65 2a 29 69 64 3b 0a 20 20 72 65 74 75 72 6e 20  e*)id;.  return 
19480 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44  SQLITE_IOCAP_UND
19490 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50  ELETABLE_WHEN_OP
194a0 45 4e 20 7c 0a 20 20 20 20 20 20 20 20 20 28 28  EN |.         ((
194b0 70 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 57  p->ctrlFlags & W
194c0 49 4e 46 49 4c 45 5f 50 53 4f 57 29 3f 53 51 4c  INFILE_PSOW)?SQL
194d0 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53  ITE_IOCAP_POWERS
194e0 41 46 45 5f 4f 56 45 52 57 52 49 54 45 3a 30 29  AFE_OVERWRITE:0)
194f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 69 6e 64 6f  ;.}../*.** Windo
19500 77 73 20 77 69 6c 6c 20 6f 6e 6c 79 20 6c 65 74  ws will only let
19510 20 79 6f 75 20 63 72 65 61 74 65 20 66 69 6c 65   you create file
19520 20 76 69 65 77 20 6d 61 70 70 69 6e 67 73 0a 2a   view mappings.*
19530 2a 20 6f 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  * on allocation 
19540 73 69 7a 65 20 67 72 61 6e 75 6c 61 72 69 74 79  size granularity
19550 20 62 6f 75 6e 64 61 72 69 65 73 2e 0a 2a 2a 20   boundaries..** 
19560 44 75 72 69 6e 67 20 73 71 6c 69 74 65 33 5f 6f  During sqlite3_o
19570 73 5f 69 6e 69 74 28 29 20 77 65 20 64 6f 20 61  s_init() we do a
19580 20 47 65 74 53 79 73 74 65 6d 49 6e 66 6f 28 29   GetSystemInfo()
19590 0a 2a 2a 20 74 6f 20 67 65 74 20 74 68 65 20 67  .** to get the g
195a0 72 61 6e 75 6c 61 72 69 74 79 20 73 69 7a 65 2e  ranularity size.
195b0 0a 2a 2f 0a 73 74 61 74 69 63 20 53 59 53 54 45  .*/.static SYSTE
195c0 4d 5f 49 4e 46 4f 20 77 69 6e 53 79 73 49 6e 66  M_INFO winSysInf
195d0 6f 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  o;..#ifndef SQLI
195e0 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 0a 2f 2a 0a  TE_OMIT_WAL../*.
195f0 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e 63 74 69  ** Helper functi
19600 6f 6e 73 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e  ons to obtain an
19610 64 20 72 65 6c 69 6e 71 75 69 73 68 20 74 68 65  d relinquish the
19620 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 2e 20 54   global mutex. T
19630 68 65 0a 2a 2a 20 67 6c 6f 62 61 6c 20 6d 75 74  he.** global mut
19640 65 78 20 69 73 20 75 73 65 64 20 74 6f 20 70 72  ex is used to pr
19650 6f 74 65 63 74 20 74 68 65 20 77 69 6e 4c 6f 63  otect the winLoc
19660 6b 49 6e 66 6f 20 6f 62 6a 65 63 74 73 20 75 73  kInfo objects us
19670 65 64 20 62 79 0a 2a 2a 20 74 68 69 73 20 66 69  ed by.** this fi
19680 6c 65 2c 20 61 6c 6c 20 6f 66 20 77 68 69 63 68  le, all of which
19690 20 6d 61 79 20 62 65 20 73 68 61 72 65 64 20 62   may be shared b
196a0 79 20 6d 75 6c 74 69 70 6c 65 20 74 68 72 65 61  y multiple threa
196b0 64 73 2e 0a 2a 2a 0a 2a 2a 20 46 75 6e 63 74 69  ds..**.** Functi
196c0 6f 6e 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65  on winShmMutexHe
196d0 6c 64 28 29 20 69 73 20 75 73 65 64 20 74 6f 20  ld() is used to 
196e0 61 73 73 65 72 74 28 29 20 74 68 61 74 20 74 68  assert() that th
196f0 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 0a 2a  e global mutex.*
19700 2a 20 69 73 20 68 65 6c 64 20 77 68 65 6e 20 72  * is held when r
19710 65 71 75 69 72 65 64 2e 20 54 68 69 73 20 66 75  equired. This fu
19720 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75  nction is only u
19730 73 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 61  sed as part of a
19740 73 73 65 72 74 28 29 0a 2a 2a 20 73 74 61 74 65  ssert().** state
19750 6d 65 6e 74 73 2e 20 65 2e 67 2e 0a 2a 2a 0a 2a  ments. e.g..**.*
19760 2a 20 20 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d  *   winShmEnterM
19770 75 74 65 78 28 29 0a 2a 2a 20 20 20 20 20 61 73  utex().**     as
19780 73 65 72 74 28 20 77 69 6e 53 68 6d 4d 75 74 65  sert( winShmMute
19790 78 48 65 6c 64 28 29 20 29 3b 0a 2a 2a 20 20 20  xHeld() );.**   
197a0 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65 78  winShmLeaveMutex
197b0 28 29 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ().*/.static voi
197c0 64 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74  d winShmEnterMut
197d0 65 78 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69  ex(void){.  sqli
197e0 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
197f0 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
19800 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
19810 54 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a  TATIC_MASTER));.
19820 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69  }.static void wi
19830 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 76  nShmLeaveMutex(v
19840 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  oid){.  sqlite3_
19850 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69  mutex_leave(sqli
19860 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
19870 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
19880 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 23 69  C_MASTER));.}.#i
19890 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 73 74 61  fndef NDEBUG.sta
198a0 74 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 4d 75  tic int winShmMu
198b0 74 65 78 48 65 6c 64 28 76 6f 69 64 29 20 7b 0a  texHeld(void) {.
198c0 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
198d0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 73 71 6c 69  _mutex_held(sqli
198e0 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
198f0 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
19900 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 23 65  C_MASTER));.}.#e
19910 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65  ndif../*.** Obje
19920 63 74 20 75 73 65 64 20 74 6f 20 72 65 70 72 65  ct used to repre
19930 73 65 6e 74 20 61 20 73 69 6e 67 6c 65 20 66 69  sent a single fi
19940 6c 65 20 6f 70 65 6e 65 64 20 61 6e 64 20 6d 6d  le opened and mm
19950 61 70 70 65 64 20 74 6f 20 70 72 6f 76 69 64 65  apped to provide
19960 0a 2a 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  .** shared memor
19970 79 2e 20 20 57 68 65 6e 20 6d 75 6c 74 69 70 6c  y.  When multipl
19980 65 20 74 68 72 65 61 64 73 20 61 6c 6c 20 72 65  e threads all re
19990 66 65 72 65 6e 63 65 20 74 68 65 20 73 61 6d 65  ference the same
199a0 0a 2a 2a 20 6c 6f 67 2d 73 75 6d 6d 61 72 79 2c  .** log-summary,
199b0 20 65 61 63 68 20 74 68 72 65 61 64 20 68 61 73   each thread has
199c0 20 69 74 73 20 6f 77 6e 20 77 69 6e 46 69 6c 65   its own winFile
199d0 20 6f 62 6a 65 63 74 2c 20 62 75 74 20 74 68 65   object, but the
199e0 79 20 61 6c 6c 0a 2a 2a 20 70 6f 69 6e 74 20 74  y all.** point t
199f0 6f 20 61 20 73 69 6e 67 6c 65 20 69 6e 73 74 61  o a single insta
19a00 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62 6a 65  nce of this obje
19a10 63 74 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  ct.  In other wo
19a20 72 64 73 2c 20 65 61 63 68 0a 2a 2a 20 6c 6f 67  rds, each.** log
19a30 2d 73 75 6d 6d 61 72 79 20 69 73 20 6f 70 65 6e  -summary is open
19a40 65 64 20 6f 6e 6c 79 20 6f 6e 63 65 20 70 65 72  ed only once per
19a50 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   process..**.** 
19a60 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28  winShmMutexHeld(
19a70 29 20 6d 75 73 74 20 62 65 20 74 72 75 65 20 77  ) must be true w
19a80 68 65 6e 20 63 72 65 61 74 69 6e 67 20 6f 72 20  hen creating or 
19a90 64 65 73 74 72 6f 79 69 6e 67 0a 2a 2a 20 74 68  destroying.** th
19aa0 69 73 20 6f 62 6a 65 63 74 20 6f 72 20 77 68 69  is object or whi
19ab0 6c 65 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72  le reading or wr
19ac0 69 74 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77  iting the follow
19ad0 69 6e 67 20 66 69 65 6c 64 73 3a 0a 2a 2a 0a 2a  ing fields:.**.*
19ae0 2a 20 20 20 20 20 20 6e 52 65 66 0a 2a 2a 20 20  *      nRef.**  
19af0 20 20 20 20 70 4e 65 78 74 0a 2a 2a 0a 2a 2a 20      pNext.**.** 
19b00 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69  The following fi
19b10 65 6c 64 73 20 61 72 65 20 72 65 61 64 2d 6f 6e  elds are read-on
19b20 6c 79 20 61 66 74 65 72 20 74 68 65 20 6f 62 6a  ly after the obj
19b30 65 63 74 20 69 73 20 63 72 65 61 74 65 64 3a 0a  ect is created:.
19b40 2a 2a 0a 2a 2a 20 20 20 20 20 20 66 69 64 0a 2a  **.**      fid.*
19b50 2a 20 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65  *      zFilename
19b60 0a 2a 2a 0a 2a 2a 20 45 69 74 68 65 72 20 77 69  .**.** Either wi
19b70 6e 53 68 6d 4e 6f 64 65 2e 6d 75 74 65 78 20 6d  nShmNode.mutex m
19b80 75 73 74 20 62 65 20 68 65 6c 64 20 6f 72 20 77  ust be held or w
19b90 69 6e 53 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d  inShmNode.nRef==
19ba0 30 20 61 6e 64 0a 2a 2a 20 77 69 6e 53 68 6d 4d  0 and.** winShmM
19bb0 75 74 65 78 48 65 6c 64 28 29 20 69 73 20 74 72  utexHeld() is tr
19bc0 75 65 20 77 68 65 6e 20 72 65 61 64 69 6e 67 20  ue when reading 
19bd0 6f 72 20 77 72 69 74 69 6e 67 20 61 6e 79 20 6f  or writing any o
19be0 74 68 65 72 20 66 69 65 6c 64 0a 2a 2a 20 69 6e  ther field.** in
19bf0 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 2e   this structure.
19c00 0a 2a 2a 0a 2a 2f 0a 73 74 72 75 63 74 20 77 69  .**.*/.struct wi
19c10 6e 53 68 6d 4e 6f 64 65 20 7b 0a 20 20 73 71 6c  nShmNode {.  sql
19c20 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65  ite3_mutex *mute
19c30 78 3b 20 20 20 20 20 20 2f 2a 20 4d 75 74 65 78  x;      /* Mutex
19c40 20 74 6f 20 61 63 63 65 73 73 20 74 68 69 73 20   to access this 
19c50 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 68 61 72  object */.  char
19c60 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20   *zFilename;    
19c70 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
19c80 66 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20  f the file */.  
19c90 77 69 6e 46 69 6c 65 20 68 46 69 6c 65 3b 20 20  winFile hFile;  
19ca0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
19cb0 6c 65 20 68 61 6e 64 6c 65 20 66 72 6f 6d 20 77  le handle from w
19cc0 69 6e 4f 70 65 6e 20 2a 2f 0a 0a 20 20 69 6e 74  inOpen */..  int
19cd0 20 73 7a 52 65 67 69 6f 6e 3b 20 20 20 20 20 20   szRegion;      
19ce0 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
19cf0 6f 66 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  of shared-memory
19d00 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e   regions */.  in
19d10 74 20 6e 52 65 67 69 6f 6e 3b 20 20 20 20 20 20  t nRegion;      
19d20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
19d30 20 6f 66 20 61 72 72 61 79 20 61 70 52 65 67 69   of array apRegi
19d40 6f 6e 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  on */.  struct S
19d50 68 6d 52 65 67 69 6f 6e 20 7b 0a 20 20 20 20 48  hmRegion {.    H
19d60 41 4e 44 4c 45 20 68 4d 61 70 3b 20 20 20 20 20  ANDLE hMap;     
19d70 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
19d80 68 61 6e 64 6c 65 20 66 72 6f 6d 20 43 72 65 61  handle from Crea
19d90 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 20 2a 2f  teFileMapping */
19da0 0a 20 20 20 20 76 6f 69 64 20 2a 70 4d 61 70 3b  .    void *pMap;
19db0 0a 20 20 7d 20 2a 61 52 65 67 69 6f 6e 3b 0a 20  .  } *aRegion;. 
19dc0 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f   DWORD lastErrno
19dd0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;           /* T
19de0 68 65 20 57 69 6e 64 6f 77 73 20 65 72 72 6e 6f  he Windows errno
19df0 20 66 72 6f 6d 20 74 68 65 20 6c 61 73 74 20 49   from the last I
19e00 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a 0a 20 20 69  /O error */..  i
19e10 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20  nt nRef;        
19e20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
19e30 62 65 72 20 6f 66 20 77 69 6e 53 68 6d 20 6f 62  ber of winShm ob
19e40 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e 67 20 74  jects pointing t
19e50 6f 20 74 68 69 73 20 2a 2f 0a 20 20 77 69 6e 53  o this */.  winS
19e60 68 6d 20 2a 70 46 69 72 73 74 3b 20 20 20 20 20  hm *pFirst;     
19e70 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 77 69         /* All wi
19e80 6e 53 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69  nShm objects poi
19e90 6e 74 69 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f  nting to this */
19ea0 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70  .  winShmNode *p
19eb0 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20 2f 2a  Next;         /*
19ec0 20 4e 65 78 74 20 69 6e 20 6c 69 73 74 20 6f 66   Next in list of
19ed0 20 61 6c 6c 20 77 69 6e 53 68 6d 4e 6f 64 65 20   all winShmNode 
19ee0 6f 62 6a 65 63 74 73 20 2a 2f 0a 23 69 66 64 65  objects */.#ifde
19ef0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
19f00 20 75 38 20 6e 65 78 74 53 68 6d 49 64 3b 20 20   u8 nextShmId;  
19f10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
19f20 65 78 74 20 61 76 61 69 6c 61 62 6c 65 20 77 69  ext available wi
19f30 6e 53 68 6d 2e 69 64 20 76 61 6c 75 65 20 2a 2f  nShm.id value */
19f40 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a  .#endif.};../*.*
19f50 2a 20 41 20 67 6c 6f 62 61 6c 20 61 72 72 61 79  * A global array
19f60 20 6f 66 20 61 6c 6c 20 77 69 6e 53 68 6d 4e 6f   of all winShmNo
19f70 64 65 20 6f 62 6a 65 63 74 73 2e 0a 2a 2a 0a 2a  de objects..**.*
19f80 2a 20 54 68 65 20 77 69 6e 53 68 6d 4d 75 74 65  * The winShmMute
19f90 78 48 65 6c 64 28 29 20 6d 75 73 74 20 62 65 20  xHeld() must be 
19fa0 74 72 75 65 20 77 68 69 6c 65 20 72 65 61 64 69  true while readi
19fb0 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68  ng or writing th
19fc0 69 73 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74  is list..*/.stat
19fd0 69 63 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 77  ic winShmNode *w
19fe0 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 20 3d 20  inShmNodeList = 
19ff0 30 3b 0a 0a 2f 2a 0a 2a 2a 20 53 74 72 75 63 74  0;../*.** Struct
1a000 75 72 65 20 75 73 65 64 20 69 6e 74 65 72 6e 61  ure used interna
1a010 6c 6c 79 20 62 79 20 74 68 69 73 20 56 46 53 20  lly by this VFS 
1a020 74 6f 20 72 65 63 6f 72 64 20 74 68 65 20 73 74  to record the st
1a030 61 74 65 20 6f 66 20 61 6e 0a 2a 2a 20 6f 70 65  ate of an.** ope
1a040 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  n shared memory 
1a050 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  connection..**.*
1a060 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
1a070 66 69 65 6c 64 73 20 61 72 65 20 69 6e 69 74 69  fields are initi
1a080 61 6c 69 7a 65 64 20 77 68 65 6e 20 74 68 69 73  alized when this
1a090 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61 74   object is creat
1a0a0 65 64 20 61 6e 64 0a 2a 2a 20 61 72 65 20 72 65  ed and.** are re
1a0b0 61 64 2d 6f 6e 6c 79 20 74 68 65 72 65 61 66 74  ad-only thereaft
1a0c0 65 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 77 69 6e  er:.**.**    win
1a0d0 53 68 6d 2e 70 53 68 6d 4e 6f 64 65 0a 2a 2a 20  Shm.pShmNode.** 
1a0e0 20 20 20 77 69 6e 53 68 6d 2e 69 64 0a 2a 2a 0a     winShm.id.**.
1a0f0 2a 2a 20 41 6c 6c 20 6f 74 68 65 72 20 66 69 65  ** All other fie
1a100 6c 64 73 20 61 72 65 20 72 65 61 64 2f 77 72 69  lds are read/wri
1a110 74 65 2e 20 20 54 68 65 20 77 69 6e 53 68 6d 2e  te.  The winShm.
1a120 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20  pShmNode->mutex 
1a130 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20  must be held.** 
1a140 77 68 69 6c 65 20 61 63 63 65 73 73 69 6e 67 20  while accessing 
1a150 61 6e 79 20 72 65 61 64 2f 77 72 69 74 65 20 66  any read/write f
1a160 69 65 6c 64 73 2e 0a 2a 2f 0a 73 74 72 75 63 74  ields..*/.struct
1a170 20 77 69 6e 53 68 6d 20 7b 0a 20 20 77 69 6e 53   winShm {.  winS
1a180 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65  hmNode *pShmNode
1a190 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e  ;      /* The un
1a1a0 64 65 72 6c 79 69 6e 67 20 77 69 6e 53 68 6d 4e  derlying winShmN
1a1b0 6f 64 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ode object */.  
1a1c0 77 69 6e 53 68 6d 20 2a 70 4e 65 78 74 3b 20 20  winShm *pNext;  
1a1d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
1a1e0 78 74 20 77 69 6e 53 68 6d 20 77 69 74 68 20 74  xt winShm with t
1a1f0 68 65 20 73 61 6d 65 20 77 69 6e 53 68 6d 4e 6f  he same winShmNo
1a200 64 65 20 2a 2f 0a 20 20 75 38 20 68 61 73 4d 75  de */.  u8 hasMu
1a210 74 65 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  tex;            
1a220 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 68 6f     /* True if ho
1a230 6c 64 69 6e 67 20 74 68 65 20 77 69 6e 53 68 6d  lding the winShm
1a240 4e 6f 64 65 20 6d 75 74 65 78 20 2a 2f 0a 20 20  Node mutex */.  
1a250 75 31 36 20 73 68 61 72 65 64 4d 61 73 6b 3b 20  u16 sharedMask; 
1a260 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
1a270 73 6b 20 6f 66 20 73 68 61 72 65 64 20 6c 6f 63  sk of shared loc
1a280 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75 31 36  ks held */.  u16
1a290 20 65 78 63 6c 4d 61 73 6b 3b 20 20 20 20 20 20   exclMask;      
1a2a0 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
1a2b0 6f 66 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  of exclusive loc
1a2c0 6b 73 20 68 65 6c 64 20 2a 2f 0a 23 69 66 64 65  ks held */.#ifde
1a2d0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
1a2e0 20 75 38 20 69 64 3b 20 20 20 20 20 20 20 20 20   u8 id;         
1a2f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
1a300 64 20 6f 66 20 74 68 69 73 20 63 6f 6e 6e 65 63  d of this connec
1a310 74 69 6f 6e 20 77 69 74 68 20 69 74 73 20 77 69  tion with its wi
1a320 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 23 65 6e 64  nShmNode */.#end
1a330 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  if.};../*.** Con
1a340 73 74 61 6e 74 73 20 75 73 65 64 20 66 6f 72 20  stants used for 
1a350 6c 6f 63 6b 69 6e 67 0a 2a 2f 0a 23 64 65 66 69  locking.*/.#defi
1a360 6e 65 20 57 49 4e 5f 53 48 4d 5f 42 41 53 45 20  ne WIN_SHM_BASE 
1a370 20 20 28 28 32 32 2b 53 51 4c 49 54 45 5f 53 48    ((22+SQLITE_SH
1a380 4d 5f 4e 4c 4f 43 4b 29 2a 34 29 20 20 20 20 20  M_NLOCK)*4)     
1a390 20 20 20 2f 2a 20 66 69 72 73 74 20 6c 6f 63 6b     /* first lock
1a3a0 20 62 79 74 65 20 2a 2f 0a 23 64 65 66 69 6e 65   byte */.#define
1a3b0 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 20 20 20 20   WIN_SHM_DMS    
1a3c0 28 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2b 53 51  (WIN_SHM_BASE+SQ
1a3d0 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 20  LITE_SHM_NLOCK) 
1a3e0 20 2f 2a 20 64 65 61 64 6d 61 6e 20 73 77 69 74   /* deadman swit
1a3f0 63 68 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 70 70  ch */../*.** App
1a400 6c 79 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b  ly advisory lock
1a410 73 20 66 6f 72 20 61 6c 6c 20 6e 20 62 79 74 65  s for all n byte
1a420 73 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 6f  s beginning at o
1a430 66 73 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  fst..*/.#define 
1a440 5f 53 48 4d 5f 55 4e 4c 43 4b 20 20 31 0a 23 64  _SHM_UNLCK  1.#d
1a450 65 66 69 6e 65 20 5f 53 48 4d 5f 52 44 4c 43 4b  efine _SHM_RDLCK
1a460 20 20 32 0a 23 64 65 66 69 6e 65 20 5f 53 48 4d    2.#define _SHM
1a470 5f 57 52 4c 43 4b 20 20 33 0a 73 74 61 74 69 63  _WRLCK  3.static
1a480 20 69 6e 74 20 77 69 6e 53 68 6d 53 79 73 74 65   int winShmSyste
1a490 6d 4c 6f 63 6b 28 0a 20 20 77 69 6e 53 68 6d 4e  mLock(.  winShmN
1a4a0 6f 64 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 2f  ode *pFile,    /
1a4b0 2a 20 41 70 70 6c 79 20 6c 6f 63 6b 73 20 74 6f  * Apply locks to
1a4c0 20 74 68 69 73 20 6f 70 65 6e 20 73 68 61 72 65   this open share
1a4d0 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74  d-memory segment
1a4e0 20 2a 2f 0a 20 20 69 6e 74 20 6c 6f 63 6b 54 79   */.  int lockTy
1a4f0 70 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 5f  pe,         /* _
1a500 53 48 4d 5f 55 4e 4c 43 4b 2c 20 5f 53 48 4d 5f  SHM_UNLCK, _SHM_
1a510 52 44 4c 43 4b 2c 20 6f 72 20 5f 53 48 4d 5f 57  RDLCK, or _SHM_W
1a520 52 4c 43 4b 20 2a 2f 0a 20 20 69 6e 74 20 6f 66  RLCK */.  int of
1a530 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  st,             
1a540 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 66 69 72  /* Offset to fir
1a550 73 74 20 62 79 74 65 20 74 6f 20 62 65 20 6c 6f  st byte to be lo
1a560 63 6b 65 64 2f 75 6e 6c 6f 63 6b 65 64 20 2a 2f  cked/unlocked */
1a570 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 20 20 20  .  int nByte    
1a580 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1a590 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 6c  er of bytes to l
1a5a0 6f 63 6b 20 6f 72 20 75 6e 6c 6f 63 6b 20 2a 2f  ock or unlock */
1a5b0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30  .){.  int rc = 0
1a5c0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  ;           /* R
1a5d0 65 73 75 6c 74 20 63 6f 64 65 20 66 6f 72 6d 20  esult code form 
1a5e0 4c 6f 63 6b 2f 55 6e 6c 6f 63 6b 46 69 6c 65 45  Lock/UnlockFileE
1a5f0 78 28 29 20 2a 2f 0a 0a 20 20 2f 2a 20 41 63 63  x() */..  /* Acc
1a600 65 73 73 20 74 6f 20 74 68 65 20 77 69 6e 53 68  ess to the winSh
1a610 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 69 73 20  mNode object is 
1a620 73 65 72 69 61 6c 69 7a 65 64 20 62 79 20 74 68  serialized by th
1a630 65 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 61 73  e caller */.  as
1a640 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
1a650 74 65 78 5f 68 65 6c 64 28 70 46 69 6c 65 2d 3e  tex_held(pFile->
1a660 6d 75 74 65 78 29 20 7c 7c 20 70 46 69 6c 65 2d  mutex) || pFile-
1a670 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 4f  >nRef==0 );..  O
1a680 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43  STRACE(("SHM-LOC
1a690 4b 20 66 69 6c 65 3d 25 70 2c 20 6c 6f 63 6b 3d  K file=%p, lock=
1a6a0 25 64 2c 20 6f 66 66 73 65 74 3d 25 64 2c 20 73  %d, offset=%d, s
1a6b0 69 7a 65 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  ize=%d\n",.     
1a6c0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 46 69        pFile->hFi
1a6d0 6c 65 2e 68 2c 20 6c 6f 63 6b 54 79 70 65 2c 20  le.h, lockType, 
1a6e0 6f 66 73 74 2c 20 6e 42 79 74 65 29 29 3b 0a 0a  ofst, nByte));..
1a6f0 20 20 2f 2a 20 52 65 6c 65 61 73 65 2f 41 63 71    /* Release/Acq
1a700 75 69 72 65 20 74 68 65 20 73 79 73 74 65 6d 2d  uire the system-
1a710 6c 65 76 65 6c 20 6c 6f 63 6b 20 2a 2f 0a 20 20  level lock */.  
1a720 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 5f 53  if( lockType==_S
1a730 48 4d 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20  HM_UNLCK ){.    
1a740 72 63 20 3d 20 77 69 6e 55 6e 6c 6f 63 6b 46 69  rc = winUnlockFi
1a750 6c 65 28 26 70 46 69 6c 65 2d 3e 68 46 69 6c 65  le(&pFile->hFile
1a760 2e 68 2c 20 6f 66 73 74 2c 20 30 2c 20 6e 42 79  .h, ofst, 0, nBy
1a770 74 65 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b  te, 0);.  }else{
1a780 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  .    /* Initiali
1a790 7a 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70  ze the locking p
1a7a0 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 20  arameters */.   
1a7b0 20 44 57 4f 52 44 20 64 77 46 6c 61 67 73 20 3d   DWORD dwFlags =
1a7c0 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49   LOCKFILE_FAIL_I
1a7d0 4d 4d 45 44 49 41 54 45 4c 59 3b 0a 20 20 20 20  MMEDIATELY;.    
1a7e0 69 66 28 20 6c 6f 63 6b 54 79 70 65 20 3d 3d 20  if( lockType == 
1a7f0 5f 53 48 4d 5f 57 52 4c 43 4b 20 29 20 64 77 46  _SHM_WRLCK ) dwF
1a800 6c 61 67 73 20 7c 3d 20 4c 4f 43 4b 46 49 4c 45  lags |= LOCKFILE
1a810 5f 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b  _EXCLUSIVE_LOCK;
1a820 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 63  .    rc = winLoc
1a830 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 46  kFile(&pFile->hF
1a840 69 6c 65 2e 68 2c 20 64 77 46 6c 61 67 73 2c 20  ile.h, dwFlags, 
1a850 6f 66 73 74 2c 20 30 2c 20 6e 42 79 74 65 2c 20  ofst, 0, nByte, 
1a860 30 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72  0);.  }..  if( r
1a870 63 21 3d 20 30 20 29 7b 0a 20 20 20 20 72 63 20  c!= 0 ){.    rc 
1a880 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  = SQLITE_OK;.  }
1a890 65 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d  else{.    pFile-
1a8a0 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 20 6f 73  >lastErrno =  os
1a8b0 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
1a8c0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1a8d0 42 55 53 59 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54  BUSY;.  }..  OST
1a8e0 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20  RACE(("SHM-LOCK 
1a8f0 66 69 6c 65 3d 25 70 2c 20 66 75 6e 63 3d 25 73  file=%p, func=%s
1a900 2c 20 65 72 72 6e 6f 3d 25 6c 75 2c 20 72 63 3d  , errno=%lu, rc=
1a910 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
1a920 20 20 70 46 69 6c 65 2d 3e 68 46 69 6c 65 2e 68    pFile->hFile.h
1a930 2c 20 28 6c 6f 63 6b 54 79 70 65 20 3d 3d 20 5f  , (lockType == _
1a940 53 48 4d 5f 55 4e 4c 43 4b 29 20 3f 20 22 77 69  SHM_UNLCK) ? "wi
1a950 6e 55 6e 6c 6f 63 6b 46 69 6c 65 22 20 3a 0a 20  nUnlockFile" :. 
1a960 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 4c 6f            "winLo
1a970 63 6b 46 69 6c 65 22 2c 20 70 46 69 6c 65 2d 3e  ckFile", pFile->
1a980 6c 61 73 74 45 72 72 6e 6f 2c 20 73 71 6c 69 74  lastErrno, sqlit
1a990 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b  e3ErrName(rc)));
1a9a0 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
1a9b0 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66  ../* Forward ref
1a9c0 65 72 65 6e 63 65 73 20 74 6f 20 56 46 53 20 6d  erences to VFS m
1a9d0 65 74 68 6f 64 73 20 2a 2f 0a 73 74 61 74 69 63  ethods */.static
1a9e0 20 69 6e 74 20 77 69 6e 4f 70 65 6e 28 73 71 6c   int winOpen(sql
1a9f0 69 74 65 33 5f 76 66 73 2a 2c 63 6f 6e 73 74 20  ite3_vfs*,const 
1aa00 63 68 61 72 2a 2c 73 71 6c 69 74 65 33 5f 66 69  char*,sqlite3_fi
1aa10 6c 65 2a 2c 69 6e 74 2c 69 6e 74 2a 29 3b 0a 73  le*,int,int*);.s
1aa20 74 61 74 69 63 20 69 6e 74 20 77 69 6e 44 65 6c  tatic int winDel
1aa30 65 74 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ete(sqlite3_vfs 
1aa40 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e  *,const char*,in
1aa50 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50 75 72 67 65  t);../*.** Purge
1aa60 20 74 68 65 20 77 69 6e 53 68 6d 4e 6f 64 65 4c   the winShmNodeL
1aa70 69 73 74 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20  ist list of all 
1aa80 65 6e 74 72 69 65 73 20 77 69 74 68 20 77 69 6e  entries with win
1aa90 53 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30 2e  ShmNode.nRef==0.
1aaa0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e  .**.** This is n
1aab0 6f 74 20 61 20 56 46 53 20 73 68 61 72 65 64 2d  ot a VFS shared-
1aac0 6d 65 6d 6f 72 79 20 6d 65 74 68 6f 64 3b 20 69  memory method; i
1aad0 74 20 69 73 20 61 20 75 74 69 6c 69 74 79 20 66  t is a utility f
1aae0 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 0a 2a  unction called.*
1aaf0 2a 20 62 79 20 56 46 53 20 73 68 61 72 65 64 2d  * by VFS shared-
1ab00 6d 65 6d 6f 72 79 20 6d 65 74 68 6f 64 73 2e 0a  memory methods..
1ab10 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
1ab20 69 6e 53 68 6d 50 75 72 67 65 28 73 71 6c 69 74  inShmPurge(sqlit
1ab30 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e  e3_vfs *pVfs, in
1ab40 74 20 64 65 6c 65 74 65 46 6c 61 67 29 7b 0a 20  t deleteFlag){. 
1ab50 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2a 70 70   winShmNode **pp
1ab60 3b 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a  ;.  winShmNode *
1ab70 70 3b 0a 20 20 61 73 73 65 72 74 28 20 77 69 6e  p;.  assert( win
1ab80 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 29  ShmMutexHeld() )
1ab90 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 48  ;.  OSTRACE(("SH
1aba0 4d 2d 50 55 52 47 45 20 70 69 64 3d 25 6c 75 2c  M-PURGE pid=%lu,
1abb0 20 64 65 6c 65 74 65 46 6c 61 67 3d 25 64 5c 6e   deleteFlag=%d\n
1abc0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73  ",.           os
1abd0 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
1abe0 73 49 64 28 29 2c 20 64 65 6c 65 74 65 46 6c 61  sId(), deleteFla
1abf0 67 29 29 3b 0a 20 20 70 70 20 3d 20 26 77 69 6e  g));.  pp = &win
1ac00 53 68 6d 4e 6f 64 65 4c 69 73 74 3b 0a 20 20 77  ShmNodeList;.  w
1ac10 68 69 6c 65 28 20 28 70 20 3d 20 2a 70 70 29 21  hile( (p = *pp)!
1ac20 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  =0 ){.    if( p-
1ac30 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
1ac40 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 69    int i;.      i
1ac50 66 28 20 70 2d 3e 6d 75 74 65 78 20 29 7b 20 73  f( p->mutex ){ s
1ac60 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65  qlite3_mutex_fre
1ac70 65 28 70 2d 3e 6d 75 74 65 78 29 3b 20 7d 0a 20  e(p->mutex); }. 
1ac80 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
1ac90 70 2d 3e 6e 52 65 67 69 6f 6e 3b 20 69 2b 2b 29  p->nRegion; i++)
1aca0 7b 0a 20 20 20 20 20 20 20 20 42 4f 4f 4c 20 62  {.        BOOL b
1acb0 52 63 20 3d 20 6f 73 55 6e 6d 61 70 56 69 65 77  Rc = osUnmapView
1acc0 4f 66 46 69 6c 65 28 70 2d 3e 61 52 65 67 69 6f  OfFile(p->aRegio
1acd0 6e 5b 69 5d 2e 70 4d 61 70 29 3b 0a 20 20 20 20  n[i].pMap);.    
1ace0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 53 48      OSTRACE(("SH
1acf0 4d 2d 50 55 52 47 45 2d 55 4e 4d 41 50 20 70 69  M-PURGE-UNMAP pi
1ad00 64 3d 25 6c 75 2c 20 72 65 67 69 6f 6e 3d 25 64  d=%lu, region=%d
1ad10 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20  , rc=%s\n",.    
1ad20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47               osG
1ad30 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
1ad40 49 64 28 29 2c 20 69 2c 20 62 52 63 20 3f 20 22  Id(), i, bRc ? "
1ad50 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29  ok" : "failed"))
1ad60 3b 0a 20 20 20 20 20 20 20 20 55 4e 55 53 45 44  ;.        UNUSED
1ad70 5f 56 41 52 49 41 42 4c 45 5f 56 41 4c 55 45 28  _VARIABLE_VALUE(
1ad80 62 52 63 29 3b 0a 20 20 20 20 20 20 20 20 62 52  bRc);.        bR
1ad90 63 20 3d 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c  c = osCloseHandl
1ada0 65 28 70 2d 3e 61 52 65 67 69 6f 6e 5b 69 5d 2e  e(p->aRegion[i].
1adb0 68 4d 61 70 29 3b 0a 20 20 20 20 20 20 20 20 4f  hMap);.        O
1adc0 53 54 52 41 43 45 28 28 22 53 48 4d 2d 50 55 52  STRACE(("SHM-PUR
1add0 47 45 2d 43 4c 4f 53 45 20 70 69 64 3d 25 6c 75  GE-CLOSE pid=%lu
1ade0 2c 20 72 65 67 69 6f 6e 3d 25 64 2c 20 72 63 3d  , region=%d, rc=
1adf0 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
1ae00 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
1ae10 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
1ae20 20 69 2c 20 62 52 63 20 3f 20 22 6f 6b 22 20 3a   i, bRc ? "ok" :
1ae30 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20   "failed"));.   
1ae40 20 20 20 20 20 55 4e 55 53 45 44 5f 56 41 52 49       UNUSED_VARI
1ae50 41 42 4c 45 5f 56 41 4c 55 45 28 62 52 63 29 3b  ABLE_VALUE(bRc);
1ae60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1ae70 66 28 20 70 2d 3e 68 46 69 6c 65 2e 68 21 3d 4e  f( p->hFile.h!=N
1ae80 55 4c 4c 20 26 26 20 70 2d 3e 68 46 69 6c 65 2e  ULL && p->hFile.
1ae90 68 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c  h!=INVALID_HANDL
1aea0 45 5f 56 41 4c 55 45 20 29 7b 0a 20 20 20 20 20  E_VALUE ){.     
1aeb0 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
1aec0 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20  orBenign(1);.   
1aed0 20 20 20 20 20 77 69 6e 43 6c 6f 73 65 28 28 73       winClose((s
1aee0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 26 70  qlite3_file *)&p
1aef0 2d 3e 68 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  ->hFile);.      
1af00 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
1af10 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20  rBenign(0);.    
1af20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 64 65    }.      if( de
1af30 6c 65 74 65 46 6c 61 67 20 29 7b 0a 20 20 20 20  leteFlag ){.    
1af40 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
1af50 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20  rorBenign(1);.  
1af60 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67        sqlite3Beg
1af70 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
1af80 3b 0a 20 20 20 20 20 20 20 20 77 69 6e 44 65 6c  ;.        winDel
1af90 65 74 65 28 70 56 66 73 2c 20 70 2d 3e 7a 46 69  ete(pVfs, p->zFi
1afa0 6c 65 6e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20  lename, 0);.    
1afb0 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65      sqlite3EndBe
1afc0 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
1afd0 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
1afe0 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a  ErrorBenign(0);.
1aff0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70        }.      *p
1b000 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  p = p->pNext;.  
1b010 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
1b020 28 70 2d 3e 61 52 65 67 69 6f 6e 29 3b 0a 20 20  (p->aRegion);.  
1b030 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
1b040 28 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  (p);.    }else{.
1b050 20 20 20 20 20 20 70 70 20 3d 20 26 70 2d 3e 70        pp = &p->p
1b060 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Next;.    }.  }.
1b070 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68  }../*.** Open th
1b080 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  e shared-memory 
1b090 61 72 65 61 20 61 73 73 6f 63 69 61 74 65 64 20  area associated 
1b0a0 77 69 74 68 20 64 61 74 61 62 61 73 65 20 66 69  with database fi
1b0b0 6c 65 20 70 44 62 46 64 2e 0a 2a 2a 0a 2a 2a 20  le pDbFd..**.** 
1b0c0 57 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20 6e  When opening a n
1b0d0 65 77 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ew shared-memory
1b0e0 20 66 69 6c 65 2c 20 69 66 20 6e 6f 20 6f 74 68   file, if no oth
1b0f0 65 72 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20  er instances of 
1b100 74 68 61 74 0a 2a 2a 20 66 69 6c 65 20 61 72 65  that.** file are
1b110 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e 2c   currently open,
1b120 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73   in this process
1b130 20 6f 72 20 69 6e 20 6f 74 68 65 72 20 70 72 6f   or in other pro
1b140 63 65 73 73 65 73 2c 20 74 68 65 6e 0a 2a 2a 20  cesses, then.** 
1b150 74 68 65 20 66 69 6c 65 20 6d 75 73 74 20 62 65  the file must be
1b160 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65   truncated to ze
1b170 72 6f 20 6c 65 6e 67 74 68 20 6f 72 20 68 61 76  ro length or hav
1b180 65 20 69 74 73 20 68 65 61 64 65 72 20 63 6c 65  e its header cle
1b190 61 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ared..*/.static 
1b1a0 69 6e 74 20 77 69 6e 4f 70 65 6e 53 68 61 72 65  int winOpenShare
1b1b0 64 4d 65 6d 6f 72 79 28 77 69 6e 46 69 6c 65 20  dMemory(winFile 
1b1c0 2a 70 44 62 46 64 29 7b 0a 20 20 73 74 72 75 63  *pDbFd){.  struc
1b1d0 74 20 77 69 6e 53 68 6d 20 2a 70 3b 20 20 20 20  t winShm *p;    
1b1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b1f0 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   The connection 
1b200 74 6f 20 62 65 20 6f 70 65 6e 65 64 20 2a 2f 0a  to be opened */.
1b210 20 20 73 74 72 75 63 74 20 77 69 6e 53 68 6d 4e    struct winShmN
1b220 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 20 3d 20  ode *pShmNode = 
1b230 30 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65  0;   /* The unde
1b240 72 6c 79 69 6e 67 20 6d 6d 61 70 70 65 64 20 66  rlying mmapped f
1b250 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ile */.  int rc;
1b260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b270 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1b280 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20  esult code */.  
1b290 73 74 72 75 63 74 20 77 69 6e 53 68 6d 4e 6f 64  struct winShmNod
1b2a0 65 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20  e *pNew;        
1b2b0 20 20 20 2f 2a 20 4e 65 77 6c 79 20 61 6c 6c 6f     /* Newly allo
1b2c0 63 61 74 65 64 20 77 69 6e 53 68 6d 4e 6f 64 65  cated winShmNode
1b2d0 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b   */.  int nName;
1b2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b2f0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
1b300 20 6f 66 20 7a 4e 61 6d 65 20 69 6e 20 62 79 74   of zName in byt
1b310 65 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  es */..  assert(
1b320 20 70 44 62 46 64 2d 3e 70 53 68 6d 3d 3d 30 20   pDbFd->pShm==0 
1b330 29 3b 20 20 20 20 2f 2a 20 4e 6f 74 20 70 72 65  );    /* Not pre
1b340 76 69 6f 75 73 6c 79 20 6f 70 65 6e 65 64 20 2a  viously opened *
1b350 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  /..  /* Allocate
1b360 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 6e   space for the n
1b370 65 77 20 73 71 6c 69 74 65 33 5f 73 68 6d 20 6f  ew sqlite3_shm o
1b380 62 6a 65 63 74 2e 20 20 41 6c 73 6f 20 73 70 65  bject.  Also spe
1b390 63 75 6c 61 74 69 76 65 6c 79 0a 20 20 2a 2a 20  culatively.  ** 
1b3a0 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  allocate space f
1b3b0 6f 72 20 61 20 6e 65 77 20 77 69 6e 53 68 6d 4e  or a new winShmN
1b3c0 6f 64 65 20 61 6e 64 20 66 69 6c 65 6e 61 6d 65  ode and filename
1b3d0 2e 0a 20 20 2a 2f 0a 20 20 70 20 3d 20 73 71 6c  ..  */.  p = sql
1b3e0 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20  ite3MallocZero( 
1b3f0 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20  sizeof(*p) );.  
1b400 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
1b410 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  n SQLITE_IOERR_N
1b420 4f 4d 45 4d 3b 0a 20 20 6e 4e 61 6d 65 20 3d 20  OMEM;.  nName = 
1b430 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
1b440 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20  pDbFd->zPath);. 
1b450 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 4d   pNew = sqlite3M
1b460 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f  allocZero( sizeo
1b470 66 28 2a 70 53 68 6d 4e 6f 64 65 29 20 2b 20 6e  f(*pShmNode) + n
1b480 4e 61 6d 65 20 2b 20 31 37 20 29 3b 0a 20 20 69  Name + 17 );.  i
1b490 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( pNew==0 ){.  
1b4a0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
1b4b0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
1b4c0 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
1b4d0 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 7a 46  ;.  }.  pNew->zF
1b4e0 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a  ilename = (char*
1b4f0 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 73 71 6c  )&pNew[1];.  sql
1b500 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4e  ite3_snprintf(nN
1b510 61 6d 65 2b 31 35 2c 20 70 4e 65 77 2d 3e 7a 46  ame+15, pNew->zF
1b520 69 6c 65 6e 61 6d 65 2c 20 22 25 73 2d 73 68 6d  ilename, "%s-shm
1b530 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29  ", pDbFd->zPath)
1b540 3b 0a 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53  ;.  sqlite3FileS
1b550 75 66 66 69 78 33 28 70 44 62 46 64 2d 3e 7a 50  uffix3(pDbFd->zP
1b560 61 74 68 2c 20 70 4e 65 77 2d 3e 7a 46 69 6c 65  ath, pNew->zFile
1b570 6e 61 6d 65 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f  name);..  /* Loo
1b580 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 72  k to see if ther
1b590 65 20 69 73 20 61 6e 20 65 78 69 73 74 69 6e 67  e is an existing
1b5a0 20 77 69 6e 53 68 6d 4e 6f 64 65 20 74 68 61 74   winShmNode that
1b5b0 20 63 61 6e 20 62 65 20 75 73 65 64 2e 0a 20 20   can be used..  
1b5c0 2a 2a 20 49 66 20 6e 6f 20 6d 61 74 63 68 69 6e  ** If no matchin
1b5d0 67 20 77 69 6e 53 68 6d 4e 6f 64 65 20 63 75 72  g winShmNode cur
1b5e0 72 65 6e 74 6c 79 20 65 78 69 73 74 73 2c 20 63  rently exists, c
1b5f0 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 2e  reate a new one.
1b600 0a 20 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 45 6e  .  */.  winShmEn
1b610 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 66 6f  terMutex();.  fo
1b620 72 28 70 53 68 6d 4e 6f 64 65 20 3d 20 77 69 6e  r(pShmNode = win
1b630 53 68 6d 4e 6f 64 65 4c 69 73 74 3b 20 70 53 68  ShmNodeList; pSh
1b640 6d 4e 6f 64 65 3b 20 70 53 68 6d 4e 6f 64 65 3d  mNode; pShmNode=
1b650 70 53 68 6d 4e 6f 64 65 2d 3e 70 4e 65 78 74 29  pShmNode->pNext)
1b660 7b 0a 20 20 20 20 2f 2a 20 54 42 44 20 6e 65 65  {.    /* TBD nee
1b670 64 20 74 6f 20 63 6f 6d 65 20 75 70 20 77 69 74  d to come up wit
1b680 68 20 62 65 74 74 65 72 20 6d 61 74 63 68 20 68  h better match h
1b690 65 72 65 2e 20 20 50 65 72 68 61 70 73 0a 20 20  ere.  Perhaps.  
1b6a0 20 20 2a 2a 20 75 73 65 20 46 49 4c 45 5f 49 44    ** use FILE_ID
1b6b0 5f 42 4f 54 48 5f 44 49 52 5f 49 4e 46 4f 20 53  _BOTH_DIR_INFO S
1b6c0 74 72 75 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f  tructure..    */
1b6d0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
1b6e0 53 74 72 49 43 6d 70 28 70 53 68 6d 4e 6f 64 65  StrICmp(pShmNode
1b6f0 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 4e 65  ->zFilename, pNe
1b700 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3d 3d 30  w->zFilename)==0
1b710 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
1b720 69 66 28 20 70 53 68 6d 4e 6f 64 65 20 29 7b 0a  if( pShmNode ){.
1b730 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
1b740 28 70 4e 65 77 29 3b 0a 20 20 7d 65 6c 73 65 7b  (pNew);.  }else{
1b750 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20  .    pShmNode = 
1b760 70 4e 65 77 3b 0a 20 20 20 20 70 4e 65 77 20 3d  pNew;.    pNew =
1b770 20 30 3b 0a 20 20 20 20 28 28 77 69 6e 46 69 6c   0;.    ((winFil
1b780 65 2a 29 28 26 70 53 68 6d 4e 6f 64 65 2d 3e 68  e*)(&pShmNode->h
1b790 46 69 6c 65 29 29 2d 3e 68 20 3d 20 49 4e 56 41  File))->h = INVA
1b7a0 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
1b7b0 3b 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e  ;.    pShmNode->
1b7c0 70 4e 65 78 74 20 3d 20 77 69 6e 53 68 6d 4e 6f  pNext = winShmNo
1b7d0 64 65 4c 69 73 74 3b 0a 20 20 20 20 77 69 6e 53  deList;.    winS
1b7e0 68 6d 4e 6f 64 65 4c 69 73 74 20 3d 20 70 53 68  hmNodeList = pSh
1b7f0 6d 4e 6f 64 65 3b 0a 0a 20 20 20 20 70 53 68 6d  mNode;..    pShm
1b800 4e 6f 64 65 2d 3e 6d 75 74 65 78 20 3d 20 73 71  Node->mutex = sq
1b810 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f  lite3_mutex_allo
1b820 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46  c(SQLITE_MUTEX_F
1b830 41 53 54 29 3b 0a 20 20 20 20 69 66 28 20 70 53  AST);.    if( pS
1b840 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 3d 3d 30  hmNode->mutex==0
1b850 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
1b860 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
1b870 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68  M;.      goto sh
1b880 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20  m_open_err;.    
1b890 7d 0a 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4f  }..    rc = winO
1b8a0 70 65 6e 28 70 44 62 46 64 2d 3e 70 56 66 73 2c  pen(pDbFd->pVfs,
1b8b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1b8c0 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c    pShmNode->zFil
1b8d0 65 6e 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20  ename,          
1b8e0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
1b8f0 65 20 66 69 6c 65 20 28 55 54 46 2d 38 29 20 2a  e file (UTF-8) *
1b900 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
1b910 20 20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65     (sqlite3_file
1b920 2a 29 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69  *)&pShmNode->hFi
1b930 6c 65 2c 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e  le,  /* File han
1b940 64 6c 65 20 68 65 72 65 20 2a 2f 0a 20 20 20 20  dle here */.    
1b950 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
1b960 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 7c 20 53  ITE_OPEN_WAL | S
1b970 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
1b980 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  RITE | SQLITE_OP
1b990 45 4e 5f 43 52 45 41 54 45 2c 0a 20 20 20 20 20  EN_CREATE,.     
1b9a0 20 20 20 20 20 20 20 20 20 20 20 20 30 29 3b 0a              0);.
1b9b0 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f      if( SQLITE_O
1b9c0 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20 20 20 67  K!=rc ){.      g
1b9d0 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72  oto shm_open_err
1b9e0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1b9f0 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
1ba00 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  another process 
1ba10 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 64  is holding the d
1ba20 65 61 64 2d 6d 61 6e 20 73 77 69 74 63 68 2e 0a  ead-man switch..
1ba30 20 20 20 20 2a 2a 20 49 66 20 6e 6f 74 2c 20 74      ** If not, t
1ba40 72 75 6e 63 61 74 65 20 74 68 65 20 66 69 6c 65  runcate the file
1ba50 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68 2e   to zero length.
1ba60 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1ba70 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b  winShmSystemLock
1ba80 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f  (pShmNode, _SHM_
1ba90 57 52 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44  WRLCK, WIN_SHM_D
1baa0 4d 53 2c 20 31 29 3d 3d 53 51 4c 49 54 45 5f 4f  MS, 1)==SQLITE_O
1bab0 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
1bac0 77 69 6e 54 72 75 6e 63 61 74 65 28 28 73 71 6c  winTruncate((sql
1bad0 69 74 65 33 5f 66 69 6c 65 20 2a 29 26 70 53 68  ite3_file *)&pSh
1bae0 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c 20 30 29  mNode->hFile, 0)
1baf0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
1bb00 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1bb10 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67       rc = winLog
1bb20 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
1bb30 52 52 5f 53 48 4d 4f 50 45 4e 2c 20 6f 73 47 65  RR_SHMOPEN, osGe
1bb40 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20  tLastError(),.  
1bb50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb60 20 20 20 20 20 20 20 22 77 69 6e 4f 70 65 6e 53         "winOpenS
1bb70 68 6d 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74  hm", pDbFd->zPat
1bb80 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  h);.      }.    
1bb90 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
1bba0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1bbb0 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63   winShmSystemLoc
1bbc0 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d  k(pShmNode, _SHM
1bbd0 5f 55 4e 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f  _UNLCK, WIN_SHM_
1bbe0 44 4d 53 2c 20 31 29 3b 0a 20 20 20 20 20 20 72  DMS, 1);.      r
1bbf0 63 20 3d 20 77 69 6e 53 68 6d 53 79 73 74 65 6d  c = winShmSystem
1bc00 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f  Lock(pShmNode, _
1bc10 53 48 4d 5f 52 44 4c 43 4b 2c 20 57 49 4e 5f 53  SHM_RDLCK, WIN_S
1bc20 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20 20 20 20  HM_DMS, 1);.    
1bc30 7d 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  }.    if( rc ) g
1bc40 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72  oto shm_open_err
1bc50 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  ;.  }..  /* Make
1bc60 20 74 68 65 20 6e 65 77 20 63 6f 6e 6e 65 63 74   the new connect
1bc70 69 6f 6e 20 61 20 63 68 69 6c 64 20 6f 66 20 74  ion a child of t
1bc80 68 65 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f  he winShmNode */
1bc90 0a 20 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d  .  p->pShmNode =
1bca0 20 70 53 68 6d 4e 6f 64 65 3b 0a 23 69 66 64 65   pShmNode;.#ifde
1bcb0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
1bcc0 20 70 2d 3e 69 64 20 3d 20 70 53 68 6d 4e 6f 64   p->id = pShmNod
1bcd0 65 2d 3e 6e 65 78 74 53 68 6d 49 64 2b 2b 3b 0a  e->nextShmId++;.
1bce0 23 65 6e 64 69 66 0a 20 20 70 53 68 6d 4e 6f 64  #endif.  pShmNod
1bcf0 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 70 44 62  e->nRef++;.  pDb
1bd00 46 64 2d 3e 70 53 68 6d 20 3d 20 70 3b 0a 20 20  Fd->pShm = p;.  
1bd10 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65 78  winShmLeaveMutex
1bd20 28 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 72 65  ();..  /* The re
1bd30 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e  ference count on
1bd40 20 70 53 68 6d 4e 6f 64 65 20 68 61 73 20 61 6c   pShmNode has al
1bd50 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65  ready been incre
1bd60 6d 65 6e 74 65 64 20 75 6e 64 65 72 0a 20 20 2a  mented under.  *
1bd70 2a 20 74 68 65 20 63 6f 76 65 72 20 6f 66 20 74  * the cover of t
1bd80 68 65 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75  he winShmEnterMu
1bd90 74 65 78 28 29 20 6d 75 74 65 78 20 61 6e 64 20  tex() mutex and 
1bda0 74 68 65 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d  the pointer from
1bdb0 20 74 68 65 0a 20 20 2a 2a 20 6e 65 77 20 28 73   the.  ** new (s
1bdc0 74 72 75 63 74 20 77 69 6e 53 68 6d 29 20 6f 62  truct winShm) ob
1bdd0 6a 65 63 74 20 74 6f 20 74 68 65 20 70 53 68 6d  ject to the pShm
1bde0 4e 6f 64 65 20 68 61 73 20 62 65 65 6e 20 73 65  Node has been se
1bdf0 74 2e 20 41 6c 6c 20 74 68 61 74 20 69 73 0a 20  t. All that is. 
1be00 20 2a 2a 20 6c 65 66 74 20 74 6f 20 64 6f 20 69   ** left to do i
1be10 73 20 74 6f 20 6c 69 6e 6b 20 74 68 65 20 6e 65  s to link the ne
1be20 77 20 6f 62 6a 65 63 74 20 69 6e 74 6f 20 74 68  w object into th
1be30 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 74  e linked list st
1be40 61 72 74 69 6e 67 0a 20 20 2a 2a 20 61 74 20 70  arting.  ** at p
1be50 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 2e  ShmNode->pFirst.
1be60 20 54 68 69 73 20 6d 75 73 74 20 62 65 20 64 6f   This must be do
1be70 6e 65 20 77 68 69 6c 65 20 68 6f 6c 64 69 6e 67  ne while holding
1be80 20 74 68 65 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d   the pShmNode->m
1be90 75 74 65 78 0a 20 20 2a 2a 20 6d 75 74 65 78 2e  utex.  ** mutex.
1bea0 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  .  */.  sqlite3_
1beb0 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d  mutex_enter(pShm
1bec0 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  Node->mutex);.  
1bed0 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 68 6d 4e  p->pNext = pShmN
1bee0 6f 64 65 2d 3e 70 46 69 72 73 74 3b 0a 20 20 70  ode->pFirst;.  p
1bef0 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 20  ShmNode->pFirst 
1bf00 3d 20 70 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  = p;.  sqlite3_m
1bf10 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e  utex_leave(pShmN
1bf20 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  ode->mutex);.  r
1bf30 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1bf40 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65  ..  /* Jump here
1bf50 20 6f 6e 20 61 6e 79 20 65 72 72 6f 72 20 2a 2f   on any error */
1bf60 0a 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3a 0a 20  .shm_open_err:. 
1bf70 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63   winShmSystemLoc
1bf80 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d  k(pShmNode, _SHM
1bf90 5f 55 4e 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f  _UNLCK, WIN_SHM_
1bfa0 44 4d 53 2c 20 31 29 3b 0a 20 20 77 69 6e 53 68  DMS, 1);.  winSh
1bfb0 6d 50 75 72 67 65 28 70 44 62 46 64 2d 3e 70 56  mPurge(pDbFd->pV
1bfc0 66 73 2c 20 30 29 3b 20 20 20 20 20 20 2f 2a 20  fs, 0);      /* 
1bfd0 54 68 69 73 20 63 61 6c 6c 20 66 72 65 65 73 20  This call frees 
1bfe0 70 53 68 6d 4e 6f 64 65 20 69 66 20 72 65 71 75  pShmNode if requ
1bff0 69 72 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ired */.  sqlite
1c000 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 73 71 6c  3_free(p);.  sql
1c010 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77 29 3b  ite3_free(pNew);
1c020 0a 20 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75  .  winShmLeaveMu
1c030 74 65 78 28 29 3b 0a 20 20 72 65 74 75 72 6e 20  tex();.  return 
1c040 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  rc;.}../*.** Clo
1c050 73 65 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  se a connection 
1c060 74 6f 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  to shared-memory
1c070 2e 20 20 44 65 6c 65 74 65 20 74 68 65 20 75 6e  .  Delete the un
1c080 64 65 72 6c 79 69 6e 67 0a 2a 2a 20 73 74 6f 72  derlying.** stor
1c090 61 67 65 20 69 66 20 64 65 6c 65 74 65 46 6c 61  age if deleteFla
1c0a0 67 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 73 74  g is true..*/.st
1c0b0 61 74 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 55  atic int winShmU
1c0c0 6e 6d 61 70 28 0a 20 20 73 71 6c 69 74 65 33 5f  nmap(.  sqlite3_
1c0d0 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20  file *fd,       
1c0e0 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68     /* Database h
1c0f0 6f 6c 64 69 6e 67 20 73 68 61 72 65 64 20 6d 65  olding shared me
1c100 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74 20 64 65  mory */.  int de
1c110 6c 65 74 65 46 6c 61 67 20 20 20 20 20 20 20 20  leteFlag        
1c120 20 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 61       /* Delete a
1c130 66 74 65 72 20 63 6c 6f 73 69 6e 67 20 69 66 20  fter closing if 
1c140 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e  true */.){.  win
1c150 46 69 6c 65 20 2a 70 44 62 46 64 3b 20 20 20 20  File *pDbFd;    
1c160 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68     /* Database h
1c170 6f 6c 64 69 6e 67 20 73 68 61 72 65 64 2d 6d 65  olding shared-me
1c180 6d 6f 72 79 20 2a 2f 0a 20 20 77 69 6e 53 68 6d  mory */.  winShm
1c190 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
1c1a0 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f  /* The connectio
1c1b0 6e 20 74 6f 20 62 65 20 63 6c 6f 73 65 64 20 2a  n to be closed *
1c1c0 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a  /.  winShmNode *
1c1d0 70 53 68 6d 4e 6f 64 65 3b 20 2f 2a 20 54 68 65  pShmNode; /* The
1c1e0 20 75 6e 64 65 72 6c 79 69 6e 67 20 73 68 61 72   underlying shar
1c1f0 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a  ed-memory file *
1c200 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 2a 70 70 3b  /.  winShm **pp;
1c210 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
1c220 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 73 69   looping over si
1c230 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e  bling connection
1c240 73 20 2a 2f 0a 0a 20 20 70 44 62 46 64 20 3d 20  s */..  pDbFd = 
1c250 28 77 69 6e 46 69 6c 65 2a 29 66 64 3b 0a 20 20  (winFile*)fd;.  
1c260 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b  p = pDbFd->pShm;
1c270 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
1c280 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1c290 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e    pShmNode = p->
1c2a0 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20 2f 2a 20  pShmNode;..  /* 
1c2b0 52 65 6d 6f 76 65 20 63 6f 6e 6e 65 63 74 69 6f  Remove connectio
1c2c0 6e 20 70 20 66 72 6f 6d 20 74 68 65 20 73 65 74  n p from the set
1c2d0 20 6f 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20   of connections 
1c2e0 61 73 73 6f 63 69 61 74 65 64 0a 20 20 2a 2a 20  associated.  ** 
1c2f0 77 69 74 68 20 70 53 68 6d 4e 6f 64 65 20 2a 2f  with pShmNode */
1c300 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1c310 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d  _enter(pShmNode-
1c320 3e 6d 75 74 65 78 29 3b 0a 20 20 66 6f 72 28 70  >mutex);.  for(p
1c330 70 3d 26 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69  p=&pShmNode->pFi
1c340 72 73 74 3b 20 28 2a 70 70 29 21 3d 70 3b 20 70  rst; (*pp)!=p; p
1c350 70 20 3d 20 26 28 2a 70 70 29 2d 3e 70 4e 65 78  p = &(*pp)->pNex
1c360 74 29 7b 7d 0a 20 20 2a 70 70 20 3d 20 70 2d 3e  t){}.  *pp = p->
1c370 70 4e 65 78 74 3b 0a 0a 20 20 2f 2a 20 46 72 65  pNext;..  /* Fre
1c380 65 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  e the connection
1c390 20 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f   p */.  sqlite3_
1c3a0 66 72 65 65 28 70 29 3b 0a 20 20 70 44 62 46 64  free(p);.  pDbFd
1c3b0 2d 3e 70 53 68 6d 20 3d 20 30 3b 0a 20 20 73 71  ->pShm = 0;.  sq
1c3c0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
1c3d0 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  e(pShmNode->mute
1c3e0 78 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 53 68  x);..  /* If pSh
1c3f0 6d 4e 6f 64 65 2d 3e 6e 52 65 66 20 68 61 73 20  mNode->nRef has 
1c400 72 65 61 63 68 65 64 20 30 2c 20 74 68 65 6e 20  reached 0, then 
1c410 63 6c 6f 73 65 20 74 68 65 20 75 6e 64 65 72 6c  close the underl
1c420 79 69 6e 67 0a 20 20 2a 2a 20 73 68 61 72 65 64  ying.  ** shared
1c430 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20 74 6f  -memory file, to
1c440 6f 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 45 6e 74  o */.  winShmEnt
1c450 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 61 73 73  erMutex();.  ass
1c460 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  ert( pShmNode->n
1c470 52 65 66 3e 30 20 29 3b 0a 20 20 70 53 68 6d 4e  Ref>0 );.  pShmN
1c480 6f 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69  ode->nRef--;.  i
1c490 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  f( pShmNode->nRe
1c4a0 66 3d 3d 30 20 29 7b 0a 20 20 20 20 77 69 6e 53  f==0 ){.    winS
1c4b0 68 6d 50 75 72 67 65 28 70 44 62 46 64 2d 3e 70  hmPurge(pDbFd->p
1c4c0 56 66 73 2c 20 64 65 6c 65 74 65 46 6c 61 67 29  Vfs, deleteFlag)
1c4d0 3b 0a 20 20 7d 0a 20 20 77 69 6e 53 68 6d 4c 65  ;.  }.  winShmLe
1c4e0 61 76 65 4d 75 74 65 78 28 29 3b 0a 0a 20 20 72  aveMutex();..  r
1c4f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1c500 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
1c510 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20   the lock state 
1c520 66 6f 72 20 61 20 73 68 61 72 65 64 2d 6d 65 6d  for a shared-mem
1c530 6f 72 79 20 73 65 67 6d 65 6e 74 2e 0a 2a 2f 0a  ory segment..*/.
1c540 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 68  static int winSh
1c550 6d 4c 6f 63 6b 28 0a 20 20 73 71 6c 69 74 65 33  mLock(.  sqlite3
1c560 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20  _file *fd,      
1c570 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
1c580 66 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65  file holding the
1c590 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a   shared memory *
1c5a0 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20 20 20  /.  int ofst,   
1c5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c5c0 2a 20 46 69 72 73 74 20 6c 6f 63 6b 20 74 6f 20  * First lock to 
1c5d0 61 63 71 75 69 72 65 20 6f 72 20 72 65 6c 65 61  acquire or relea
1c5e0 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20 20  se */.  int n,  
1c5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c600 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1c610 6c 6f 63 6b 73 20 74 6f 20 61 63 71 75 69 72 65  locks to acquire
1c620 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20   or release */. 
1c630 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20   int flags      
1c640 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
1c650 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 74  hat to do with t
1c660 68 65 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20  he lock */.){.  
1c670 77 69 6e 46 69 6c 65 20 2a 70 44 62 46 64 20 3d  winFile *pDbFd =
1c680 20 28 77 69 6e 46 69 6c 65 2a 29 66 64 3b 20 20   (winFile*)fd;  
1c690 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74        /* Connect
1c6a0 69 6f 6e 20 68 6f 6c 64 69 6e 67 20 73 68 61 72  ion holding shar
1c6b0 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 77  ed memory */.  w
1c6c0 69 6e 53 68 6d 20 2a 70 20 3d 20 70 44 62 46 64  inShm *p = pDbFd
1c6d0 2d 3e 70 53 68 6d 3b 20 20 20 20 20 20 20 20 20  ->pShm;         
1c6e0 20 20 20 20 20 2f 2a 20 54 68 65 20 73 68 61 72       /* The shar
1c6f0 65 64 20 6d 65 6d 6f 72 79 20 62 65 69 6e 67 20  ed memory being 
1c700 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 77 69 6e 53  locked */.  winS
1c710 68 6d 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20  hm *pX;         
1c720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c730 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
1c740 20 6f 76 65 72 20 61 6c 6c 20 73 69 62 6c 69 6e   over all siblin
1c750 67 73 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f  gs */.  winShmNo
1c760 64 65 20 2a 70 53 68 6d 4e 6f 64 65 20 3d 20 70  de *pShmNode = p
1c770 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 6e  ->pShmNode;.  in
1c780 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1c790 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1c7a0 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
1c7b0 64 65 20 2a 2f 0a 20 20 75 31 36 20 6d 61 73 6b  de */.  u16 mask
1c7c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1c7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c7e0 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 74   Mask of locks t
1c7f0 6f 20 74 61 6b 65 20 6f 72 20 72 65 6c 65 61 73  o take or releas
1c800 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  e */..  assert( 
1c810 6f 66 73 74 3e 3d 30 20 26 26 20 6f 66 73 74 2b  ofst>=0 && ofst+
1c820 6e 3c 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c  n<=SQLITE_SHM_NL
1c830 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
1c840 20 6e 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65 72   n>=1 );.  asser
1c850 74 28 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54  t( flags==(SQLIT
1c860 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c  E_SHM_LOCK | SQL
1c870 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a  ITE_SHM_SHARED).
1c880 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d         || flags=
1c890 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43  =(SQLITE_SHM_LOC
1c8a0 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45  K | SQLITE_SHM_E
1c8b0 58 43 4c 55 53 49 56 45 29 0a 20 20 20 20 20 20  XCLUSIVE).      
1c8c0 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49   || flags==(SQLI
1c8d0 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20  TE_SHM_UNLOCK | 
1c8e0 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45  SQLITE_SHM_SHARE
1c8f0 44 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61  D).       || fla
1c900 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f  gs==(SQLITE_SHM_
1c910 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f  UNLOCK | SQLITE_
1c920 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 20 29  SHM_EXCLUSIVE) )
1c930 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 31  ;.  assert( n==1
1c940 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 53 51 4c   || (flags & SQL
1c950 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56  ITE_SHM_EXCLUSIV
1c960 45 29 21 3d 30 20 29 3b 0a 0a 20 20 6d 61 73 6b  E)!=0 );..  mask
1c970 20 3d 20 28 75 31 36 29 28 28 31 55 3c 3c 28 6f   = (u16)((1U<<(o
1c980 66 73 74 2b 6e 29 29 20 2d 20 28 31 55 3c 3c 6f  fst+n)) - (1U<<o
1c990 66 73 74 29 29 3b 0a 20 20 61 73 73 65 72 74 28  fst));.  assert(
1c9a0 20 6e 3e 31 20 7c 7c 20 6d 61 73 6b 3d 3d 28 31   n>1 || mask==(1
1c9b0 3c 3c 6f 66 73 74 29 20 29 3b 0a 20 20 73 71 6c  <<ofst) );.  sql
1c9c0 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
1c9d0 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
1c9e0 29 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26  );.  if( flags &
1c9f0 20 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f   SQLITE_SHM_UNLO
1ca00 43 4b 20 29 7b 0a 20 20 20 20 75 31 36 20 61 6c  CK ){.    u16 al
1ca10 6c 4d 61 73 6b 20 3d 20 30 3b 20 2f 2a 20 4d 61  lMask = 0; /* Ma
1ca20 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64  sk of locks held
1ca30 20 62 79 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a   by siblings */.
1ca40 0a 20 20 20 20 2f 2a 20 53 65 65 20 69 66 20 61  .    /* See if a
1ca50 6e 79 20 73 69 62 6c 69 6e 67 73 20 68 6f 6c 64  ny siblings hold
1ca60 20 74 68 69 73 20 73 61 6d 65 20 6c 6f 63 6b 20   this same lock 
1ca70 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53  */.    for(pX=pS
1ca80 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20  hmNode->pFirst; 
1ca90 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74  pX; pX=pX->pNext
1caa0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 58 3d  ){.      if( pX=
1cab0 3d 70 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =p ) continue;. 
1cac0 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 58       assert( (pX
1cad0 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 28 70 2d  ->exclMask & (p-
1cae0 3e 65 78 63 6c 4d 61 73 6b 7c 70 2d 3e 73 68 61  >exclMask|p->sha
1caf0 72 65 64 4d 61 73 6b 29 29 3d 3d 30 20 29 3b 0a  redMask))==0 );.
1cb00 20 20 20 20 20 20 61 6c 6c 4d 61 73 6b 20 7c 3d        allMask |=
1cb10 20 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b   pX->sharedMask;
1cb20 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55  .    }..    /* U
1cb30 6e 6c 6f 63 6b 20 74 68 65 20 73 79 73 74 65 6d  nlock the system
1cb40 2d 6c 65 76 65 6c 20 6c 6f 63 6b 73 20 2a 2f 0a  -level locks */.
1cb50 20 20 20 20 69 66 28 20 28 6d 61 73 6b 20 26 20      if( (mask & 
1cb60 61 6c 6c 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20  allMask)==0 ){. 
1cb70 20 20 20 20 20 72 63 20 3d 20 77 69 6e 53 68 6d       rc = winShm
1cb80 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e  SystemLock(pShmN
1cb90 6f 64 65 2c 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c  ode, _SHM_UNLCK,
1cba0 20 6f 66 73 74 2b 57 49 4e 5f 53 48 4d 5f 42 41   ofst+WIN_SHM_BA
1cbb0 53 45 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73  SE, n);.    }els
1cbc0 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  e{.      rc = SQ
1cbd0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a  LITE_OK;.    }..
1cbe0 20 20 20 20 2f 2a 20 55 6e 64 6f 20 74 68 65 20      /* Undo the 
1cbf0 6c 6f 63 61 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20  local locks */. 
1cc00 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1cc10 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d  E_OK ){.      p-
1cc20 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61  >exclMask &= ~ma
1cc30 73 6b 3b 0a 20 20 20 20 20 20 70 2d 3e 73 68 61  sk;.      p->sha
1cc40 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b  redMask &= ~mask
1cc50 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
1cc60 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49  if( flags & SQLI
1cc70 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 20 29 7b  TE_SHM_SHARED ){
1cc80 0a 20 20 20 20 75 31 36 20 61 6c 6c 53 68 61 72  .    u16 allShar
1cc90 65 64 20 3d 20 30 3b 20 20 2f 2a 20 55 6e 69 6f  ed = 0;  /* Unio
1cca0 6e 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20  n of locks held 
1ccb0 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f  by connections o
1ccc0 74 68 65 72 20 74 68 61 6e 20 22 70 22 20 2a 2f  ther than "p" */
1ccd0 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 6f 75  ..    /* Find ou
1cce0 74 20 77 68 69 63 68 20 73 68 61 72 65 64 20 6c  t which shared l
1ccf0 6f 63 6b 73 20 61 72 65 20 61 6c 72 65 61 64 79  ocks are already
1cd00 20 68 65 6c 64 20 62 79 20 73 69 62 6c 69 6e 67   held by sibling
1cd10 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20 20   connections..  
1cd20 20 20 2a 2a 20 49 66 20 61 6e 79 20 73 69 62 6c    ** If any sibl
1cd30 69 6e 67 20 61 6c 72 65 61 64 79 20 68 6f 6c 64  ing already hold
1cd40 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  s an exclusive l
1cd50 6f 63 6b 2c 20 67 6f 20 61 68 65 61 64 20 61 6e  ock, go ahead an
1cd60 64 20 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20  d return.    ** 
1cd70 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20 20  SQLITE_BUSY..   
1cd80 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70   */.    for(pX=p
1cd90 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b  ShmNode->pFirst;
1cda0 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78   pX; pX=pX->pNex
1cdb0 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70  t){.      if( (p
1cdc0 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61  X->exclMask & ma
1cdd0 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)!=0 ){.      
1cde0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
1cdf0 53 59 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  SY;.        brea
1ce00 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
1ce10 20 61 6c 6c 53 68 61 72 65 64 20 7c 3d 20 70 58   allShared |= pX
1ce20 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20  ->sharedMask;.  
1ce30 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20    }..    /* Get 
1ce40 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 61 74 20  shared locks at 
1ce50 74 68 65 20 73 79 73 74 65 6d 20 6c 65 76 65 6c  the system level
1ce60 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a  , if necessary *
1ce70 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
1ce80 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1ce90 20 69 66 28 20 28 61 6c 6c 53 68 61 72 65 64 20   if( (allShared 
1cea0 26 20 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20  & mask)==0 ){.  
1ceb0 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 53 68        rc = winSh
1cec0 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d  mSystemLock(pShm
1ced0 4e 6f 64 65 2c 20 5f 53 48 4d 5f 52 44 4c 43 4b  Node, _SHM_RDLCK
1cee0 2c 20 6f 66 73 74 2b 57 49 4e 5f 53 48 4d 5f 42  , ofst+WIN_SHM_B
1cef0 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d  ASE, n);.      }
1cf00 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63  else{.        rc
1cf10 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1cf20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
1cf30 20 2f 2a 20 47 65 74 20 74 68 65 20 6c 6f 63 61   /* Get the loca
1cf40 6c 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 2a  l shared locks *
1cf50 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
1cf60 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1cf70 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 7c   p->sharedMask |
1cf80 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20  = mask;.    }.  
1cf90 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4d 61  }else{.    /* Ma
1cfa0 6b 65 20 73 75 72 65 20 6e 6f 20 73 69 62 6c 69  ke sure no sibli
1cfb0 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 68  ng connections h
1cfc0 6f 6c 64 20 6c 6f 63 6b 73 20 74 68 61 74 20 77  old locks that w
1cfd0 69 6c 6c 20 62 6c 6f 63 6b 20 74 68 69 73 0a 20  ill block this. 
1cfe0 20 20 20 2a 2a 20 6c 6f 63 6b 2e 20 20 49 66 20     ** lock.  If 
1cff0 61 6e 79 20 64 6f 2c 20 72 65 74 75 72 6e 20 53  any do, return S
1d000 51 4c 49 54 45 5f 42 55 53 59 20 72 69 67 68 74  QLITE_BUSY right
1d010 20 61 77 61 79 2e 0a 20 20 20 20 2a 2f 0a 20 20   away..    */.  
1d020 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64    for(pX=pShmNod
1d030 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70  e->pFirst; pX; p
1d040 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  X=pX->pNext){.  
1d050 20 20 20 20 69 66 28 20 28 70 58 2d 3e 65 78 63      if( (pX->exc
1d060 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30  lMask & mask)!=0
1d070 20 7c 7c 20 28 70 58 2d 3e 73 68 61 72 65 64 4d   || (pX->sharedM
1d080 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 29  ask & mask)!=0 )
1d090 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
1d0a0 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
1d0b0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1d0c0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
1d0d0 20 47 65 74 20 74 68 65 20 65 78 63 6c 75 73 69   Get the exclusi
1d0e0 76 65 20 6c 6f 63 6b 73 20 61 74 20 74 68 65 20  ve locks at the 
1d0f0 73 79 73 74 65 6d 20 6c 65 76 65 6c 2e 20 20 54  system level.  T
1d100 68 65 6e 20 69 66 20 73 75 63 63 65 73 73 66 75  hen if successfu
1d110 6c 0a 20 20 20 20 2a 2a 20 61 6c 73 6f 20 6d 61  l.    ** also ma
1d120 72 6b 20 74 68 65 20 6c 6f 63 61 6c 20 63 6f 6e  rk the local con
1d130 6e 65 63 74 69 6f 6e 20 61 73 20 62 65 69 6e 67  nection as being
1d140 20 6c 6f 63 6b 65 64 2e 0a 20 20 20 20 2a 2f 0a   locked..    */.
1d150 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1d160 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
1d170 63 20 3d 20 77 69 6e 53 68 6d 53 79 73 74 65 6d  c = winShmSystem
1d180 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f  Lock(pShmNode, _
1d190 53 48 4d 5f 57 52 4c 43 4b 2c 20 6f 66 73 74 2b  SHM_WRLCK, ofst+
1d1a0 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29  WIN_SHM_BASE, n)
1d1b0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
1d1c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1d1d0 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 2d       assert( (p-
1d1e0 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 20 6d 61  >sharedMask & ma
1d1f0 73 6b 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  sk)==0 );.      
1d200 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c 3d    p->exclMask |=
1d210 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 7d 0a 20   mask;.      }. 
1d220 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
1d230 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70  e3_mutex_leave(p
1d240 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b  ShmNode->mutex);
1d250 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d  .  OSTRACE(("SHM
1d260 2d 4c 4f 43 4b 20 70 69 64 3d 25 6c 75 2c 20 69  -LOCK pid=%lu, i
1d270 64 3d 25 64 2c 20 73 68 61 72 65 64 4d 61 73 6b  d=%d, sharedMask
1d280 3d 25 30 33 78 2c 20 65 78 63 6c 4d 61 73 6b 3d  =%03x, exclMask=
1d290 25 30 33 78 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a  %03x, rc=%s\n",.
1d2a0 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74             osGet
1d2b0 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
1d2c0 28 29 2c 20 70 2d 3e 69 64 2c 20 70 2d 3e 73 68  (), p->id, p->sh
1d2d0 61 72 65 64 4d 61 73 6b 2c 20 70 2d 3e 65 78 63  aredMask, p->exc
1d2e0 6c 4d 61 73 6b 2c 0a 20 20 20 20 20 20 20 20 20  lMask,.         
1d2f0 20 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65    sqlite3ErrName
1d300 28 72 63 29 29 29 3b 0a 20 20 72 65 74 75 72 6e  (rc)));.  return
1d310 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d   rc;.}../*.** Im
1d320 70 6c 65 6d 65 6e 74 20 61 20 6d 65 6d 6f 72 79  plement a memory
1d330 20 62 61 72 72 69 65 72 20 6f 72 20 6d 65 6d 6f   barrier or memo
1d340 72 79 20 66 65 6e 63 65 20 6f 6e 20 73 68 61 72  ry fence on shar
1d350 65 64 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a  ed memory..**.**
1d360 20 41 6c 6c 20 6c 6f 61 64 73 20 61 6e 64 20 73   All loads and s
1d370 74 6f 72 65 73 20 62 65 67 75 6e 20 62 65 66 6f  tores begun befo
1d380 72 65 20 74 68 65 20 62 61 72 72 69 65 72 20 6d  re the barrier m
1d390 75 73 74 20 63 6f 6d 70 6c 65 74 65 20 62 65 66  ust complete bef
1d3a0 6f 72 65 0a 2a 2a 20 61 6e 79 20 6c 6f 61 64 20  ore.** any load 
1d3b0 6f 72 20 73 74 6f 72 65 20 62 65 67 75 6e 20 61  or store begun a
1d3c0 66 74 65 72 20 74 68 65 20 62 61 72 72 69 65 72  fter the barrier
1d3d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1d3e0 20 77 69 6e 53 68 6d 42 61 72 72 69 65 72 28 0a   winShmBarrier(.
1d3f0 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
1d400 66 64 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  fd          /* D
1d410 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 20  atabase holding 
1d420 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  the shared memor
1d430 79 20 2a 2f 0a 29 7b 0a 20 20 55 4e 55 53 45 44  y */.){.  UNUSED
1d440 5f 50 41 52 41 4d 45 54 45 52 28 66 64 29 3b 0a  _PARAMETER(fd);.
1d450 20 20 2f 2a 20 4d 65 6d 6f 72 79 42 61 72 72 69    /* MemoryBarri
1d460 65 72 28 29 3b 20 2f 2f 20 64 6f 65 73 20 6e 6f  er(); // does no
1d470 74 20 77 6f 72 6b 20 2d 2d 20 64 6f 20 6e 6f 74  t work -- do not
1d480 20 6b 6e 6f 77 20 77 68 79 20 6e 6f 74 20 2a 2f   know why not */
1d490 0a 20 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75  .  winShmEnterMu
1d4a0 74 65 78 28 29 3b 0a 20 20 77 69 6e 53 68 6d 4c  tex();.  winShmL
1d4b0 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 0a  eaveMutex();.}..
1d4c0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
1d4d0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ion is called to
1d4e0 20 6f 62 74 61 69 6e 20 61 20 70 6f 69 6e 74 65   obtain a pointe
1d4f0 72 20 74 6f 20 72 65 67 69 6f 6e 20 69 52 65 67  r to region iReg
1d500 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 73 68  ion of the.** sh
1d510 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61 73 73 6f  ared-memory asso
1d520 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
1d530 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 64  database file fd
1d540 2e 20 53 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  . Shared-memory 
1d550 72 65 67 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 6e  regions.** are n
1d560 75 6d 62 65 72 65 64 20 73 74 61 72 74 69 6e 67  umbered starting
1d570 20 66 72 6f 6d 20 7a 65 72 6f 2e 20 45 61 63 68   from zero. Each
1d580 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72   shared-memory r
1d590 65 67 69 6f 6e 20 69 73 20 73 7a 52 65 67 69 6f  egion is szRegio
1d5a0 6e 0a 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69  n.** bytes in si
1d5b0 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ze..**.** If an 
1d5c0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e  error occurs, an
1d5d0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
1d5e0 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 20  eturned and *pp 
1d5f0 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a  is set to NULL..
1d600 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
1d610 20 69 66 20 74 68 65 20 69 73 57 72 69 74 65 20   if the isWrite 
1d620 70 61 72 61 6d 65 74 65 72 20 69 73 20 30 20 61  parameter is 0 a
1d630 6e 64 20 74 68 65 20 72 65 71 75 65 73 74 65 64  nd the requested
1d640 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 0a 2a   shared-memory.*
1d650 2a 20 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74  * region has not
1d660 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
1d670 28 62 79 20 61 6e 79 20 63 6c 69 65 6e 74 2c 20  (by any client, 
1d680 69 6e 63 6c 75 64 69 6e 67 20 6f 6e 65 20 72 75  including one ru
1d690 6e 6e 69 6e 67 20 69 6e 20 61 0a 2a 2a 20 73 65  nning in a.** se
1d6a0 70 61 72 61 74 65 20 70 72 6f 63 65 73 73 29 2c  parate process),
1d6b0 20 74 68 65 6e 20 2a 70 70 20 69 73 20 73 65 74   then *pp is set
1d6c0 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 53 51 4c   to NULL and SQL
1d6d0 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
1d6e0 20 49 66 0a 2a 2a 20 69 73 57 72 69 74 65 20 69   If.** isWrite i
1d6f0 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64 20 74  s non-zero and t
1d700 68 65 20 72 65 71 75 65 73 74 65 64 20 73 68 61  he requested sha
1d710 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f  red-memory regio
1d720 6e 20 68 61 73 20 6e 6f 74 20 79 65 74 0a 2a 2a  n has not yet.**
1d730 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c   been allocated,
1d740 20 69 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64   it is allocated
1d750 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
1d760 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  n..**.** If the 
1d770 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65  shared-memory re
1d780 67 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79  gion has already
1d790 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
1d7a0 6f 72 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  or is allocated 
1d7b0 62 79 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20  by.** this call 
1d7c0 61 73 20 64 65 73 63 72 69 62 65 64 20 61 62 6f  as described abo
1d7d0 76 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20 6d  ve, then it is m
1d7e0 61 70 70 65 64 20 69 6e 74 6f 20 74 68 69 73 20  apped into this 
1d7f0 70 72 6f 63 65 73 73 65 73 0a 2a 2a 20 61 64 64  processes.** add
1d800 72 65 73 73 20 73 70 61 63 65 20 28 69 66 20 69  ress space (if i
1d810 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  t is not already
1d820 29 2c 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f  ), *pp is set to
1d830 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6d 61   point to the ma
1d840 70 70 65 64 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61  pped.** memory a
1d850 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
1d860 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
1d870 20 69 6e 74 20 77 69 6e 53 68 6d 4d 61 70 28 0a   int winShmMap(.
1d880 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
1d890 66 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  fd,             
1d8a0 20 20 2f 2a 20 48 61 6e 64 6c 65 20 6f 70 65 6e    /* Handle open
1d8b0 20 6f 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c   on database fil
1d8c0 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67 69  e */.  int iRegi
1d8d0 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  on,             
1d8e0 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 6f 6e         /* Region
1d8f0 20 74 6f 20 72 65 74 72 69 65 76 65 20 2a 2f 0a   to retrieve */.
1d900 20 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e 2c 20    int szRegion, 
1d910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d920 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 72 65 67    /* Size of reg
1d930 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 69 73  ions */.  int is
1d940 57 72 69 74 65 2c 20 20 20 20 20 20 20 20 20 20  Write,          
1d950 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
1d960 65 20 74 6f 20 65 78 74 65 6e 64 20 66 69 6c 65  e to extend file
1d970 20 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f   if necessary */
1d980 0a 20 20 76 6f 69 64 20 76 6f 6c 61 74 69 6c 65  .  void volatile
1d990 20 2a 2a 70 70 20 20 20 20 20 20 20 20 20 20 20   **pp           
1d9a0 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 61 70 70 65     /* OUT: Mappe
1d9b0 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20  d memory */.){. 
1d9c0 20 77 69 6e 46 69 6c 65 20 2a 70 44 62 46 64 20   winFile *pDbFd 
1d9d0 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66 64 3b 0a  = (winFile*)fd;.
1d9e0 20 20 77 69 6e 53 68 6d 20 2a 70 20 3d 20 70 44    winShm *p = pD
1d9f0 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 77 69 6e  bFd->pShm;.  win
1da00 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64  ShmNode *pShmNod
1da10 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  e;.  int rc = SQ
1da20 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20  LITE_OK;..  if( 
1da30 21 70 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 77  !p ){.    rc = w
1da40 69 6e 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f  inOpenSharedMemo
1da50 72 79 28 70 44 62 46 64 29 3b 0a 20 20 20 20 69  ry(pDbFd);.    i
1da60 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1da70 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
1da80 20 20 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68    p = pDbFd->pSh
1da90 6d 3b 0a 20 20 7d 0a 20 20 70 53 68 6d 4e 6f 64  m;.  }.  pShmNod
1daa0 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b  e = p->pShmNode;
1dab0 0a 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ..  sqlite3_mute
1dac0 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65  x_enter(pShmNode
1dad0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65  ->mutex);.  asse
1dae0 72 74 28 20 73 7a 52 65 67 69 6f 6e 3d 3d 70 53  rt( szRegion==pS
1daf0 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f 6e  hmNode->szRegion
1db00 20 7c 7c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52   || pShmNode->nR
1db10 65 67 69 6f 6e 3d 3d 30 20 29 3b 0a 0a 20 20 69  egion==0 );..  i
1db20 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  f( pShmNode->nRe
1db30 67 69 6f 6e 3c 3d 69 52 65 67 69 6f 6e 20 29 7b  gion<=iRegion ){
1db40 0a 20 20 20 20 73 74 72 75 63 74 20 53 68 6d 52  .    struct ShmR
1db50 65 67 69 6f 6e 20 2a 61 70 4e 65 77 3b 20 20 20  egion *apNew;   
1db60 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 61          /* New a
1db70 52 65 67 69 6f 6e 5b 5d 20 61 72 72 61 79 20 2a  Region[] array *
1db80 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20  /.    int nByte 
1db90 3d 20 28 69 52 65 67 69 6f 6e 2b 31 29 2a 73 7a  = (iRegion+1)*sz
1dba0 52 65 67 69 6f 6e 3b 20 20 2f 2a 20 4d 69 6e 69  Region;  /* Mini
1dbb0 6d 75 6d 20 72 65 71 75 69 72 65 64 20 66 69 6c  mum required fil
1dbc0 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 73 71  e size */.    sq
1dbd0 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 3b 20  lite3_int64 sz; 
1dbe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dbf0 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 69 7a 65   /* Current size
1dc00 20 6f 66 20 77 61 6c 2d 69 6e 64 65 78 20 66 69   of wal-index fi
1dc10 6c 65 20 2a 2f 0a 0a 20 20 20 20 70 53 68 6d 4e  le */..    pShmN
1dc20 6f 64 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 3d 20  ode->szRegion = 
1dc30 73 7a 52 65 67 69 6f 6e 3b 0a 0a 20 20 20 20 2f  szRegion;..    /
1dc40 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64 20  * The requested 
1dc50 72 65 67 69 6f 6e 20 69 73 20 6e 6f 74 20 6d 61  region is not ma
1dc60 70 70 65 64 20 69 6e 74 6f 20 74 68 69 73 20 70  pped into this p
1dc70 72 6f 63 65 73 73 65 73 20 61 64 64 72 65 73 73  rocesses address
1dc80 20 73 70 61 63 65 2e 0a 20 20 20 20 2a 2a 20 43   space..    ** C
1dc90 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69  heck to see if i
1dca0 74 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63  t has been alloc
1dcb0 61 74 65 64 20 28 69 2e 65 2e 20 69 66 20 74 68  ated (i.e. if th
1dcc0 65 20 77 61 6c 2d 69 6e 64 65 78 20 66 69 6c 65  e wal-index file
1dcd0 20 69 73 0a 20 20 20 20 2a 2a 20 6c 61 72 67 65   is.    ** large
1dce0 20 65 6e 6f 75 67 68 20 74 6f 20 63 6f 6e 74 61   enough to conta
1dcf0 69 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64  in the requested
1dd00 20 72 65 67 69 6f 6e 29 2e 0a 20 20 20 20 2a 2f   region)..    */
1dd10 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 46 69 6c  .    rc = winFil
1dd20 65 53 69 7a 65 28 28 73 71 6c 69 74 65 33 5f 66  eSize((sqlite3_f
1dd30 69 6c 65 20 2a 29 26 70 53 68 6d 4e 6f 64 65 2d  ile *)&pShmNode-
1dd40 3e 68 46 69 6c 65 2c 20 26 73 7a 29 3b 0a 20 20  >hFile, &sz);.  
1dd50 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1dd60 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
1dd70 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  = winLogError(SQ
1dd80 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49  LITE_IOERR_SHMSI
1dd90 5a 45 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72  ZE, osGetLastErr
1dda0 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20  or(),.          
1ddb0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
1ddc0 6e 53 68 6d 4d 61 70 31 22 2c 20 70 44 62 46 64  nShmMap1", pDbFd
1ddd0 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20  ->zPath);.      
1dde0 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74  goto shmpage_out
1ddf0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
1de00 20 73 7a 3c 6e 42 79 74 65 20 29 7b 0a 20 20 20   sz<nByte ){.   
1de10 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73     /* The reques
1de20 74 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f  ted memory regio
1de30 6e 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  n does not exist
1de40 2e 20 49 66 20 69 73 57 72 69 74 65 20 69 73 20  . If isWrite is 
1de50 73 65 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  set to.      ** 
1de60 7a 65 72 6f 2c 20 65 78 69 74 20 65 61 72 6c 79  zero, exit early
1de70 2e 20 2a 70 70 20 77 69 6c 6c 20 62 65 20 73 65  . *pp will be se
1de80 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 53 51  t to NULL and SQ
1de90 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
1dea0 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
1deb0 20 2a 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 6c   ** Alternativel
1dec0 79 2c 20 69 66 20 69 73 57 72 69 74 65 20 69 73  y, if isWrite is
1ded0 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 75 73 65 20 66   non-zero, use f
1dee0 74 72 75 6e 63 61 74 65 28 29 20 74 6f 20 61 6c  truncate() to al
1def0 6c 6f 63 61 74 65 0a 20 20 20 20 20 20 2a 2a 20  locate.      ** 
1df00 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6d 65  the requested me
1df10 6d 6f 72 79 20 72 65 67 69 6f 6e 2e 0a 20 20 20  mory region..   
1df20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
1df30 21 69 73 57 72 69 74 65 20 29 20 67 6f 74 6f 20  !isWrite ) goto 
1df40 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20  shmpage_out;.   
1df50 20 20 20 72 63 20 3d 20 77 69 6e 54 72 75 6e 63     rc = winTrunc
1df60 61 74 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c  ate((sqlite3_fil
1df70 65 20 2a 29 26 70 53 68 6d 4e 6f 64 65 2d 3e 68  e *)&pShmNode->h
1df80 46 69 6c 65 2c 20 6e 42 79 74 65 29 3b 0a 20 20  File, nByte);.  
1df90 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1dfa0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1dfb0 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f   rc = winLogErro
1dfc0 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  r(SQLITE_IOERR_S
1dfd0 48 4d 53 49 5a 45 2c 20 6f 73 47 65 74 4c 61 73  HMSIZE, osGetLas
1dfe0 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20  tError(),.      
1dff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e000 20 20 20 22 77 69 6e 53 68 6d 4d 61 70 32 22 2c     "winShmMap2",
1e010 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a   pDbFd->zPath);.
1e020 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d          goto shm
1e030 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20  page_out;.      
1e040 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
1e050 4d 61 70 20 74 68 65 20 72 65 71 75 65 73 74 65  Map the requeste
1e060 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20  d memory region 
1e070 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73  into this proces
1e080 73 65 73 20 61 64 64 72 65 73 73 20 73 70 61 63  ses address spac
1e090 65 2e 20 2a 2f 0a 20 20 20 20 61 70 4e 65 77 20  e. */.    apNew 
1e0a0 3d 20 28 73 74 72 75 63 74 20 53 68 6d 52 65 67  = (struct ShmReg
1e0b0 69 6f 6e 20 2a 29 73 71 6c 69 74 65 33 5f 72 65  ion *)sqlite3_re
1e0c0 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20 70  alloc(.        p
1e0d0 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e  ShmNode->aRegion
1e0e0 2c 20 28 69 52 65 67 69 6f 6e 2b 31 29 2a 73 69  , (iRegion+1)*si
1e0f0 7a 65 6f 66 28 61 70 4e 65 77 5b 30 5d 29 0a 20  zeof(apNew[0]). 
1e100 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 21 61     );.    if( !a
1e110 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 72 63  pNew ){.      rc
1e120 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
1e130 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74  NOMEM;.      got
1e140 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20  o shmpage_out;. 
1e150 20 20 20 7d 0a 20 20 20 20 70 53 68 6d 4e 6f 64     }.    pShmNod
1e160 65 2d 3e 61 52 65 67 69 6f 6e 20 3d 20 61 70 4e  e->aRegion = apN
1e170 65 77 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28 20  ew;..    while( 
1e180 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f  pShmNode->nRegio
1e190 6e 3c 3d 69 52 65 67 69 6f 6e 20 29 7b 0a 20 20  n<=iRegion ){.  
1e1a0 20 20 20 20 48 41 4e 44 4c 45 20 68 4d 61 70 20      HANDLE hMap 
1e1b0 3d 20 4e 55 4c 4c 3b 20 20 20 20 20 20 20 20 20  = NULL;         
1e1c0 2f 2a 20 66 69 6c 65 2d 6d 61 70 70 69 6e 67 20  /* file-mapping 
1e1d0 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 20 20 20 20  handle */.      
1e1e0 76 6f 69 64 20 2a 70 4d 61 70 20 3d 20 30 3b 20  void *pMap = 0; 
1e1f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
1e200 61 70 70 65 64 20 6d 65 6d 6f 72 79 20 72 65 67  apped memory reg
1e210 69 6f 6e 20 2a 2f 0a 0a 23 69 66 20 53 51 4c 49  ion */..#if SQLI
1e220 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20  TE_OS_WINRT.    
1e230 20 20 68 4d 61 70 20 3d 20 6f 73 43 72 65 61 74    hMap = osCreat
1e240 65 46 69 6c 65 4d 61 70 70 69 6e 67 46 72 6f 6d  eFileMappingFrom
1e250 41 70 70 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 46  App(pShmNode->hF
1e260 69 6c 65 2e 68 2c 0a 20 20 20 20 20 20 20 20 20  ile.h,.         
1e270 20 4e 55 4c 4c 2c 20 50 41 47 45 5f 52 45 41 44   NULL, PAGE_READ
1e280 57 52 49 54 45 2c 20 6e 42 79 74 65 2c 20 4e 55  WRITE, nByte, NU
1e290 4c 4c 0a 20 20 20 20 20 20 29 3b 0a 23 65 6c 69  LL.      );.#eli
1e2a0 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
1e2b0 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29  _WIN32_HAS_WIDE)
1e2c0 0a 20 20 20 20 20 20 68 4d 61 70 20 3d 20 6f 73  .      hMap = os
1e2d0 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e  CreateFileMappin
1e2e0 67 57 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69  gW(pShmNode->hFi
1e2f0 6c 65 2e 68 2c 0a 20 20 20 20 20 20 20 20 20 20  le.h,.          
1e300 4e 55 4c 4c 2c 20 50 41 47 45 5f 52 45 41 44 57  NULL, PAGE_READW
1e310 52 49 54 45 2c 20 30 2c 20 6e 42 79 74 65 2c 20  RITE, 0, nByte, 
1e320 4e 55 4c 4c 0a 20 20 20 20 20 20 29 3b 0a 23 65  NULL.      );.#e
1e330 6c 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  lif defined(SQLI
1e340 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
1e350 49 29 0a 20 20 20 20 20 20 68 4d 61 70 20 3d 20  I).      hMap = 
1e360 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70  osCreateFileMapp
1e370 69 6e 67 41 28 70 53 68 6d 4e 6f 64 65 2d 3e 68  ingA(pShmNode->h
1e380 46 69 6c 65 2e 68 2c 0a 20 20 20 20 20 20 20 20  File.h,.        
1e390 20 20 4e 55 4c 4c 2c 20 50 41 47 45 5f 52 45 41    NULL, PAGE_REA
1e3a0 44 57 52 49 54 45 2c 20 30 2c 20 6e 42 79 74 65  DWRITE, 0, nByte
1e3b0 2c 20 4e 55 4c 4c 0a 20 20 20 20 20 20 29 3b 0a  , NULL.      );.
1e3c0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 4f 53 54  #endif.      OST
1e3d0 52 41 43 45 28 28 22 53 48 4d 2d 4d 41 50 2d 43  RACE(("SHM-MAP-C
1e3e0 52 45 41 54 45 20 70 69 64 3d 25 6c 75 2c 20 72  REATE pid=%lu, r
1e3f0 65 67 69 6f 6e 3d 25 64 2c 20 73 69 7a 65 3d 25  egion=%d, size=%
1e400 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20  d, rc=%s\n",.   
1e410 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65              osGe
1e420 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
1e430 64 28 29 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  d(), pShmNode->n
1e440 52 65 67 69 6f 6e 2c 20 6e 42 79 74 65 2c 0a 20  Region, nByte,. 
1e450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 68 4d                hM
1e460 61 70 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69  ap ? "ok" : "fai
1e470 6c 65 64 22 29 29 3b 0a 20 20 20 20 20 20 69 66  led"));.      if
1e480 28 20 68 4d 61 70 20 29 7b 0a 20 20 20 20 20 20  ( hMap ){.      
1e490 20 20 69 6e 74 20 69 4f 66 66 73 65 74 20 3d 20    int iOffset = 
1e4a0 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f  pShmNode->nRegio
1e4b0 6e 2a 73 7a 52 65 67 69 6f 6e 3b 0a 20 20 20 20  n*szRegion;.    
1e4c0 20 20 20 20 69 6e 74 20 69 4f 66 66 73 65 74 53      int iOffsetS
1e4d0 68 69 66 74 20 3d 20 69 4f 66 66 73 65 74 20 25  hift = iOffset %
1e4e0 20 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77 41 6c   winSysInfo.dwAl
1e4f0 6c 6f 63 61 74 69 6f 6e 47 72 61 6e 75 6c 61 72  locationGranular
1e500 69 74 79 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  ity;.#if SQLITE_
1e510 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 20 20 20  OS_WINRT.       
1e520 20 70 4d 61 70 20 3d 20 6f 73 4d 61 70 56 69 65   pMap = osMapVie
1e530 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 28 68  wOfFileFromApp(h
1e540 4d 61 70 2c 20 46 49 4c 45 5f 4d 41 50 5f 57 52  Map, FILE_MAP_WR
1e550 49 54 45 20 7c 20 46 49 4c 45 5f 4d 41 50 5f 52  ITE | FILE_MAP_R
1e560 45 41 44 2c 0a 20 20 20 20 20 20 20 20 20 20 20  EAD,.           
1e570 20 69 4f 66 66 73 65 74 20 2d 20 69 4f 66 66 73   iOffset - iOffs
1e580 65 74 53 68 69 66 74 2c 20 73 7a 52 65 67 69 6f  etShift, szRegio
1e590 6e 20 2b 20 69 4f 66 66 73 65 74 53 68 69 66 74  n + iOffsetShift
1e5a0 0a 20 20 20 20 20 20 20 20 29 3b 0a 23 65 6c 73  .        );.#els
1e5b0 65 0a 20 20 20 20 20 20 20 20 70 4d 61 70 20 3d  e.        pMap =
1e5c0 20 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 6c 65   osMapViewOfFile
1e5d0 28 68 4d 61 70 2c 20 46 49 4c 45 5f 4d 41 50 5f  (hMap, FILE_MAP_
1e5e0 57 52 49 54 45 20 7c 20 46 49 4c 45 5f 4d 41 50  WRITE | FILE_MAP
1e5f0 5f 52 45 41 44 2c 0a 20 20 20 20 20 20 20 20 20  _READ,.         
1e600 20 20 20 30 2c 20 69 4f 66 66 73 65 74 20 2d 20     0, iOffset - 
1e610 69 4f 66 66 73 65 74 53 68 69 66 74 2c 20 73 7a  iOffsetShift, sz
1e620 52 65 67 69 6f 6e 20 2b 20 69 4f 66 66 73 65 74  Region + iOffset
1e630 53 68 69 66 74 0a 20 20 20 20 20 20 20 20 29 3b  Shift.        );
1e640 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
1e650 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4d 41  OSTRACE(("SHM-MA
1e660 50 2d 4d 41 50 20 70 69 64 3d 25 6c 75 2c 20 72  P-MAP pid=%lu, r
1e670 65 67 69 6f 6e 3d 25 64 2c 20 6f 66 66 73 65 74  egion=%d, offset
1e680 3d 25 64 2c 20 73 69 7a 65 3d 25 64 2c 20 72 63  =%d, size=%d, rc
1e690 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%s\n",.        
1e6a0 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
1e6b0 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
1e6c0 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  , pShmNode->nReg
1e6d0 69 6f 6e 2c 20 69 4f 66 66 73 65 74 2c 0a 20 20  ion, iOffset,.  
1e6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
1e6f0 7a 52 65 67 69 6f 6e 2c 20 70 4d 61 70 20 3f 20  zRegion, pMap ? 
1e700 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29  "ok" : "failed")
1e710 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1e720 20 69 66 28 20 21 70 4d 61 70 20 29 7b 0a 20 20   if( !pMap ){.  
1e730 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
1e740 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
1e750 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
1e760 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f        rc = winLo
1e770 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
1e780 45 52 52 5f 53 48 4d 4d 41 50 2c 20 70 53 68 6d  ERR_SHMMAP, pShm
1e790 4e 6f 64 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c  Node->lastErrno,
1e7a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1e7b0 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 53 68            "winSh
1e7c0 6d 4d 61 70 33 22 2c 20 70 44 62 46 64 2d 3e 7a  mMap3", pDbFd->z
1e7d0 50 61 74 68 29 3b 0a 20 20 20 20 20 20 20 20 69  Path);.        i
1e7e0 66 28 20 68 4d 61 70 20 29 20 6f 73 43 6c 6f 73  f( hMap ) osClos
1e7f0 65 48 61 6e 64 6c 65 28 68 4d 61 70 29 3b 0a 20  eHandle(hMap);. 
1e800 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70         goto shmp
1e810 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d  age_out;.      }
1e820 0a 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65  ..      pShmNode
1e830 2d 3e 61 52 65 67 69 6f 6e 5b 70 53 68 6d 4e 6f  ->aRegion[pShmNo
1e840 64 65 2d 3e 6e 52 65 67 69 6f 6e 5d 2e 70 4d 61  de->nRegion].pMa
1e850 70 20 3d 20 70 4d 61 70 3b 0a 20 20 20 20 20 20  p = pMap;.      
1e860 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f  pShmNode->aRegio
1e870 6e 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  n[pShmNode->nReg
1e880 69 6f 6e 5d 2e 68 4d 61 70 20 3d 20 68 4d 61 70  ion].hMap = hMap
1e890 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65  ;.      pShmNode
1e8a0 2d 3e 6e 52 65 67 69 6f 6e 2b 2b 3b 0a 20 20 20  ->nRegion++;.   
1e8b0 20 7d 0a 20 20 7d 0a 0a 73 68 6d 70 61 67 65 5f   }.  }..shmpage_
1e8c0 6f 75 74 3a 0a 20 20 69 66 28 20 70 53 68 6d 4e  out:.  if( pShmN
1e8d0 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3e 69 52 65  ode->nRegion>iRe
1e8e0 67 69 6f 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20  gion ){.    int 
1e8f0 69 4f 66 66 73 65 74 20 3d 20 69 52 65 67 69 6f  iOffset = iRegio
1e900 6e 2a 73 7a 52 65 67 69 6f 6e 3b 0a 20 20 20 20  n*szRegion;.    
1e910 69 6e 74 20 69 4f 66 66 73 65 74 53 68 69 66 74  int iOffsetShift
1e920 20 3d 20 69 4f 66 66 73 65 74 20 25 20 77 69 6e   = iOffset % win
1e930 53 79 73 49 6e 66 6f 2e 64 77 41 6c 6c 6f 63 61  SysInfo.dwAlloca
1e940 74 69 6f 6e 47 72 61 6e 75 6c 61 72 69 74 79 3b  tionGranularity;
1e950 0a 20 20 20 20 63 68 61 72 20 2a 70 20 3d 20 28  .    char *p = (
1e960 63 68 61 72 20 2a 29 70 53 68 6d 4e 6f 64 65 2d  char *)pShmNode-
1e970 3e 61 52 65 67 69 6f 6e 5b 69 52 65 67 69 6f 6e  >aRegion[iRegion
1e980 5d 2e 70 4d 61 70 3b 0a 20 20 20 20 2a 70 70 20  ].pMap;.    *pp 
1e990 3d 20 28 76 6f 69 64 20 2a 29 26 70 5b 69 4f 66  = (void *)&p[iOf
1e9a0 66 73 65 74 53 68 69 66 74 5d 3b 0a 20 20 7d 65  fsetShift];.  }e
1e9b0 6c 73 65 7b 0a 20 20 20 20 2a 70 70 20 3d 20 30  lse{.    *pp = 0
1e9c0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
1e9d0 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d  mutex_leave(pShm
1e9e0 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  Node->mutex);.  
1e9f0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65  return rc;.}..#e
1ea00 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 77 69 6e  lse.# define win
1ea10 53 68 6d 4d 61 70 20 20 20 20 20 30 0a 23 20 64  ShmMap     0.# d
1ea20 65 66 69 6e 65 20 77 69 6e 53 68 6d 4c 6f 63 6b  efine winShmLock
1ea30 20 20 20 20 30 0a 23 20 64 65 66 69 6e 65 20 77      0.# define w
1ea40 69 6e 53 68 6d 42 61 72 72 69 65 72 20 30 0a 23  inShmBarrier 0.#
1ea50 20 64 65 66 69 6e 65 20 77 69 6e 53 68 6d 55 6e   define winShmUn
1ea60 6d 61 70 20 20 20 30 0a 23 65 6e 64 69 66 20 2f  map   0.#endif /
1ea70 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  * #ifndef SQLITE
1ea80 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a  _OMIT_WAL */../*
1ea90 0a 2a 2a 20 43 6c 65 61 6e 73 20 75 70 20 74 68  .** Cleans up th
1eaa0 65 20 6d 61 70 70 65 64 20 72 65 67 69 6f 6e 20  e mapped region 
1eab0 6f 66 20 74 68 65 20 73 70 65 63 69 66 69 65 64  of the specified
1eac0 20 66 69 6c 65 2c 20 69 66 20 61 6e 79 2e 0a 2a   file, if any..*
1ead0 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  /.#if SQLITE_MAX
1eae0 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 73 74 61  _MMAP_SIZE>0.sta
1eaf0 74 69 63 20 69 6e 74 20 77 69 6e 55 6e 6d 61 70  tic int winUnmap
1eb00 66 69 6c 65 28 77 69 6e 46 69 6c 65 20 2a 70 46  file(winFile *pF
1eb10 69 6c 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ile){.  assert( 
1eb20 70 46 69 6c 65 21 3d 30 20 29 3b 0a 20 20 4f 53  pFile!=0 );.  OS
1eb30 54 52 41 43 45 28 28 22 55 4e 4d 41 50 2d 46 49  TRACE(("UNMAP-FI
1eb40 4c 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c  LE pid=%lu, pFil
1eb50 65 3d 25 70 2c 20 68 4d 61 70 3d 25 70 2c 20 70  e=%p, hMap=%p, p
1eb60 4d 61 70 52 65 67 69 6f 6e 3d 25 70 2c 20 22 0a  MapRegion=%p, ".
1eb70 20 20 20 20 20 20 20 20 20 20 20 22 6d 6d 61 70             "mmap
1eb80 53 69 7a 65 3d 25 6c 6c 64 2c 20 6d 6d 61 70 53  Size=%lld, mmapS
1eb90 69 7a 65 41 63 74 75 61 6c 3d 25 6c 6c 64 2c 20  izeActual=%lld, 
1eba0 6d 6d 61 70 53 69 7a 65 4d 61 78 3d 25 6c 6c 64  mmapSizeMax=%lld
1ebb0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
1ebc0 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
1ebd0 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 20  essId(), pFile, 
1ebe0 70 46 69 6c 65 2d 3e 68 4d 61 70 2c 20 70 46 69  pFile->hMap, pFi
1ebf0 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 2c 0a  le->pMapRegion,.
1ec00 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
1ec10 2d 3e 6d 6d 61 70 53 69 7a 65 2c 20 70 46 69 6c  ->mmapSize, pFil
1ec20 65 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61  e->mmapSizeActua
1ec30 6c 2c 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69  l, pFile->mmapSi
1ec40 7a 65 4d 61 78 29 29 3b 0a 20 20 69 66 28 20 70  zeMax));.  if( p
1ec50 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e  File->pMapRegion
1ec60 20 29 7b 0a 20 20 20 20 69 66 28 20 21 6f 73 55   ){.    if( !osU
1ec70 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 28 70  nmapViewOfFile(p
1ec80 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e  File->pMapRegion
1ec90 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  ) ){.      pFile
1eca0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73  ->lastErrno = os
1ecb0 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
1ecc0 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
1ecd0 55 4e 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d 25  UNMAP-FILE pid=%
1ece0 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 70 4d  lu, pFile=%p, pM
1ecf0 61 70 52 65 67 69 6f 6e 3d 25 70 2c 20 22 0a 20  apRegion=%p, ". 
1ed00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 72                "r
1ed10 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d  c=SQLITE_IOERR_M
1ed20 4d 41 50 5c 6e 22 2c 20 6f 73 47 65 74 43 75 72  MAP\n", osGetCur
1ed30 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
1ed40 20 70 46 69 6c 65 2c 0a 20 20 20 20 20 20 20 20   pFile,.        
1ed50 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 70 4d         pFile->pM
1ed60 61 70 52 65 67 69 6f 6e 29 29 3b 0a 20 20 20 20  apRegion));.    
1ed70 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45    return winLogE
1ed80 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
1ed90 52 5f 4d 4d 41 50 2c 20 70 46 69 6c 65 2d 3e 6c  R_MMAP, pFile->l
1eda0 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
1edb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1edc0 20 20 20 22 77 69 6e 55 6e 6d 61 70 66 69 6c 65     "winUnmapfile
1edd0 31 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  1", pFile->zPath
1ede0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 69  );.    }.    pFi
1edf0 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 3d  le->pMapRegion =
1ee00 20 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6d   0;.    pFile->m
1ee10 6d 61 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20  mapSize = 0;.   
1ee20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65   pFile->mmapSize
1ee30 41 63 74 75 61 6c 20 3d 20 30 3b 0a 20 20 7d 0a  Actual = 0;.  }.
1ee40 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 68 4d 61    if( pFile->hMa
1ee50 70 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 69  p!=NULL ){.    i
1ee60 66 28 20 21 6f 73 43 6c 6f 73 65 48 61 6e 64 6c  f( !osCloseHandl
1ee70 65 28 70 46 69 6c 65 2d 3e 68 4d 61 70 29 20 29  e(pFile->hMap) )
1ee80 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
1ee90 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
1eea0 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
1eeb0 20 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4d     OSTRACE(("UNM
1eec0 41 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c 75 2c  AP-FILE pid=%lu,
1eed0 20 70 46 69 6c 65 3d 25 70 2c 20 68 4d 61 70 3d   pFile=%p, hMap=
1eee0 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f  %p, rc=SQLITE_IO
1eef0 45 52 52 5f 4d 4d 41 50 5c 6e 22 2c 0a 20 20 20  ERR_MMAP\n",.   
1ef00 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65              osGe
1ef10 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
1ef20 64 28 29 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c  d(), pFile, pFil
1ef30 65 2d 3e 68 4d 61 70 29 29 3b 0a 20 20 20 20 20  e->hMap));.     
1ef40 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72   return winLogEr
1ef50 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
1ef60 5f 4d 4d 41 50 2c 20 70 46 69 6c 65 2d 3e 6c 61  _MMAP, pFile->la
1ef70 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
1ef80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef90 20 20 22 77 69 6e 55 6e 6d 61 70 66 69 6c 65 32    "winUnmapfile2
1efa0 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
1efb0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 69 6c  ;.    }.    pFil
1efc0 65 2d 3e 68 4d 61 70 20 3d 20 4e 55 4c 4c 3b 0a  e->hMap = NULL;.
1efd0 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22    }.  OSTRACE(("
1efe0 55 4e 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d 25  UNMAP-FILE pid=%
1eff0 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72 63  lu, pFile=%p, rc
1f000 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20  =SQLITE_OK\n",. 
1f010 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43            osGetC
1f020 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28  urrentProcessId(
1f030 29 2c 20 70 46 69 6c 65 29 29 3b 0a 20 20 72 65  ), pFile));.  re
1f040 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1f050 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 6d 6f 72 79 20  }../*.** Memory 
1f060 6d 61 70 20 6f 72 20 72 65 6d 61 70 20 74 68 65  map or remap the
1f070 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 62 79 20   file opened by 
1f080 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 20  file-descriptor 
1f090 70 46 64 20 28 69 66 20 74 68 65 20 66 69 6c 65  pFd (if the file
1f0a0 0a 2a 2a 20 69 73 20 61 6c 72 65 61 64 79 20 6d  .** is already m
1f0b0 61 70 70 65 64 2c 20 74 68 65 20 65 78 69 73 74  apped, the exist
1f0c0 69 6e 67 20 6d 61 70 70 69 6e 67 20 69 73 20 72  ing mapping is r
1f0d0 65 70 6c 61 63 65 64 20 62 79 20 74 68 65 20 6e  eplaced by the n
1f0e0 65 77 29 2e 20 4f 72 2c 20 69 66 0a 2a 2a 20 74  ew). Or, if.** t
1f0f0 68 65 72 65 20 61 6c 72 65 61 64 79 20 65 78 69  here already exi
1f100 73 74 73 20 61 20 6d 61 70 70 69 6e 67 20 66 6f  sts a mapping fo
1f110 72 20 74 68 69 73 20 66 69 6c 65 2c 20 61 6e 64  r this file, and
1f120 20 74 68 65 72 65 20 61 72 65 20 73 74 69 6c 6c   there are still
1f130 0a 2a 2a 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  .** outstanding 
1f140 78 46 65 74 63 68 28 29 20 72 65 66 65 72 65 6e  xFetch() referen
1f150 63 65 73 20 74 6f 20 69 74 2c 20 74 68 69 73 20  ces to it, this 
1f160 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
1f170 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61  -op..**.** If pa
1f180 72 61 6d 65 74 65 72 20 6e 42 79 74 65 20 69 73  rameter nByte is
1f190 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 2c 20 74   non-negative, t
1f1a0 68 65 6e 20 69 74 20 69 73 20 74 68 65 20 72 65  hen it is the re
1f1b0 71 75 65 73 74 65 64 20 73 69 7a 65 20 6f 66 0a  quested size of.
1f1c0 2a 2a 20 74 68 65 20 6d 61 70 70 69 6e 67 20 74  ** the mapping t
1f1d0 6f 20 63 72 65 61 74 65 2e 20 4f 74 68 65 72 77  o create. Otherw
1f1e0 69 73 65 2c 20 69 66 20 6e 42 79 74 65 20 69 73  ise, if nByte is
1f1f0 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c   less than zero,
1f200 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 72 65 71   then the.** req
1f210 75 65 73 74 65 64 20 73 69 7a 65 20 69 73 20 74  uested size is t
1f220 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66  he size of the f
1f230 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 54 68 65  ile on disk. The
1f240 20 61 63 74 75 61 6c 20 73 69 7a 65 20 6f 66 20   actual size of 
1f250 74 68 65 0a 2a 2a 20 63 72 65 61 74 65 64 20 6d  the.** created m
1f260 61 70 70 69 6e 67 20 69 73 20 65 69 74 68 65 72  apping is either
1f270 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 73   the requested s
1f280 69 7a 65 20 6f 72 20 74 68 65 20 76 61 6c 75 65  ize or the value
1f290 20 63 6f 6e 66 69 67 75 72 65 64 0a 2a 2a 20 75   configured.** u
1f2a0 73 69 6e 67 20 53 51 4c 49 54 45 5f 46 43 4e 54  sing SQLITE_FCNT
1f2b0 4c 5f 4d 4d 41 50 5f 53 49 5a 45 2c 20 77 68 69  L_MMAP_SIZE, whi
1f2c0 63 68 65 76 65 72 20 69 73 20 73 6d 61 6c 6c 65  chever is smalle
1f2d0 72 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f  r..**.** SQLITE_
1f2e0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  OK is returned i
1f2f0 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  f no error occur
1f300 73 20 28 65 76 65 6e 20 69 66 20 74 68 65 20 6d  s (even if the m
1f310 61 70 70 69 6e 67 20 69 73 20 6e 6f 74 0a 2a 2a  apping is not.**
1f320 20 72 65 63 72 65 61 74 65 64 20 61 73 20 61 20   recreated as a 
1f330 72 65 73 75 6c 74 20 6f 66 20 6f 75 74 73 74 61  result of outsta
1f340 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73  nding references
1f350 29 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65  ) or an SQLite e
1f360 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 6f 74 68  rror.** code oth
1f370 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  erwise..*/.stati
1f380 63 20 69 6e 74 20 77 69 6e 4d 61 70 66 69 6c 65  c int winMapfile
1f390 28 77 69 6e 46 69 6c 65 20 2a 70 46 64 2c 20 73  (winFile *pFd, s
1f3a0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 42 79  qlite3_int64 nBy
1f3b0 74 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69  te){.  sqlite3_i
1f3c0 6e 74 36 34 20 6e 4d 61 70 20 3d 20 6e 42 79 74  nt64 nMap = nByt
1f3d0 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  e;.  int rc;..  
1f3e0 61 73 73 65 72 74 28 20 6e 4d 61 70 3e 3d 30 20  assert( nMap>=0 
1f3f0 7c 7c 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75  || pFd->nFetchOu
1f400 74 3d 3d 30 20 29 3b 0a 20 20 4f 53 54 52 41 43  t==0 );.  OSTRAC
1f410 45 28 28 22 4d 41 50 2d 46 49 4c 45 20 70 69 64  E(("MAP-FILE pid
1f420 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20  =%lu, pFile=%p, 
1f430 73 69 7a 65 3d 25 6c 6c 64 5c 6e 22 2c 0a 20 20  size=%lld\n",.  
1f440 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
1f450 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
1f460 2c 20 70 46 64 2c 20 6e 42 79 74 65 29 29 3b 0a  , pFd, nByte));.
1f470 0a 20 20 69 66 28 20 70 46 64 2d 3e 6e 46 65 74  .  if( pFd->nFet
1f480 63 68 4f 75 74 3e 30 20 29 20 72 65 74 75 72 6e  chOut>0 ) return
1f490 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69   SQLITE_OK;..  i
1f4a0 66 28 20 6e 4d 61 70 3c 30 20 29 7b 0a 20 20 20  f( nMap<0 ){.   
1f4b0 20 72 63 20 3d 20 77 69 6e 46 69 6c 65 53 69 7a   rc = winFileSiz
1f4c0 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  e((sqlite3_file*
1f4d0 29 70 46 64 2c 20 26 6e 4d 61 70 29 3b 0a 20 20  )pFd, &nMap);.  
1f4e0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
1f4f0 20 20 4f 53 54 52 41 43 45 28 28 22 4d 41 50 2d    OSTRACE(("MAP-
1f500 46 49 4c 45 20 70 69 64 3d 25 6c 75 2c 20 70 46  FILE pid=%lu, pF
1f510 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  ile=%p, rc=SQLIT
1f520 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 5c 6e 22  E_IOERR_FSTAT\n"
1f530 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1f540 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
1f550 63 65 73 73 49 64 28 29 2c 20 70 46 64 29 29 3b  cessId(), pFd));
1f560 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1f570 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54  LITE_IOERR_FSTAT
1f580 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
1f590 28 20 6e 4d 61 70 3e 70 46 64 2d 3e 6d 6d 61 70  ( nMap>pFd->mmap
1f5a0 53 69 7a 65 4d 61 78 20 29 7b 0a 20 20 20 20 6e  SizeMax ){.    n
1f5b0 4d 61 70 20 3d 20 70 46 64 2d 3e 6d 6d 61 70 53  Map = pFd->mmapS
1f5c0 69 7a 65 4d 61 78 3b 0a 20 20 7d 0a 20 20 6e 4d  izeMax;.  }.  nM
1f5d0 61 70 20 26 3d 20 7e 28 73 71 6c 69 74 65 33 5f  ap &= ~(sqlite3_
1f5e0 69 6e 74 36 34 29 28 77 69 6e 53 79 73 49 6e 66  int64)(winSysInf
1f5f0 6f 2e 64 77 50 61 67 65 53 69 7a 65 20 2d 20 31  o.dwPageSize - 1
1f600 29 3b 0a 0a 20 20 69 66 28 20 6e 4d 61 70 3d 3d  );..  if( nMap==
1f610 30 20 26 26 20 70 46 64 2d 3e 6d 6d 61 70 53 69  0 && pFd->mmapSi
1f620 7a 65 3e 30 20 29 7b 0a 20 20 20 20 77 69 6e 55  ze>0 ){.    winU
1f630 6e 6d 61 70 66 69 6c 65 28 70 46 64 29 3b 0a 20  nmapfile(pFd);. 
1f640 20 7d 0a 20 20 69 66 28 20 6e 4d 61 70 21 3d 70   }.  if( nMap!=p
1f650 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a  Fd->mmapSize ){.
1f660 20 20 20 20 76 6f 69 64 20 2a 70 4e 65 77 20 3d      void *pNew =
1f670 20 30 3b 0a 20 20 20 20 44 57 4f 52 44 20 70 72   0;.    DWORD pr
1f680 6f 74 65 63 74 20 3d 20 50 41 47 45 5f 52 45 41  otect = PAGE_REA
1f690 44 4f 4e 4c 59 3b 0a 20 20 20 20 44 57 4f 52 44  DONLY;.    DWORD
1f6a0 20 66 6c 61 67 73 20 3d 20 46 49 4c 45 5f 4d 41   flags = FILE_MA
1f6b0 50 5f 52 45 41 44 3b 0a 0a 20 20 20 20 77 69 6e  P_READ;..    win
1f6c0 55 6e 6d 61 70 66 69 6c 65 28 70 46 64 29 3b 0a  Unmapfile(pFd);.
1f6d0 20 20 20 20 69 66 28 20 28 70 46 64 2d 3e 63 74      if( (pFd->ct
1f6e0 72 6c 46 6c 61 67 73 20 26 20 57 49 4e 46 49 4c  rlFlags & WINFIL
1f6f0 45 5f 52 44 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a  E_RDONLY)==0 ){.
1f700 20 20 20 20 20 20 70 72 6f 74 65 63 74 20 3d 20        protect = 
1f710 50 41 47 45 5f 52 45 41 44 57 52 49 54 45 3b 0a  PAGE_READWRITE;.
1f720 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 46        flags |= F
1f730 49 4c 45 5f 4d 41 50 5f 57 52 49 54 45 3b 0a 20  ILE_MAP_WRITE;. 
1f740 20 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f     }.#if SQLITE_
1f750 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 70 46 64  OS_WINRT.    pFd
1f760 2d 3e 68 4d 61 70 20 3d 20 6f 73 43 72 65 61 74  ->hMap = osCreat
1f770 65 46 69 6c 65 4d 61 70 70 69 6e 67 46 72 6f 6d  eFileMappingFrom
1f780 41 70 70 28 70 46 64 2d 3e 68 2c 20 4e 55 4c 4c  App(pFd->h, NULL
1f790 2c 20 70 72 6f 74 65 63 74 2c 20 6e 4d 61 70 2c  , protect, nMap,
1f7a0 20 4e 55 4c 4c 29 3b 0a 23 65 6c 69 66 20 64 65   NULL);.#elif de
1f7b0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
1f7c0 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 20  32_HAS_WIDE).   
1f7d0 20 70 46 64 2d 3e 68 4d 61 70 20 3d 20 6f 73 43   pFd->hMap = osC
1f7e0 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67  reateFileMapping
1f7f0 57 28 70 46 64 2d 3e 68 2c 20 4e 55 4c 4c 2c 20  W(pFd->h, NULL, 
1f800 70 72 6f 74 65 63 74 2c 0a 20 20 20 20 20 20 20  protect,.       
1f810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f820 20 20 20 20 20 20 20 20 20 28 44 57 4f 52 44 29           (DWORD)
1f830 28 28 6e 4d 61 70 3e 3e 33 32 29 20 26 20 30 78  ((nMap>>32) & 0x
1f840 66 66 66 66 66 66 66 66 29 2c 0a 20 20 20 20 20  ffffffff),.     
1f850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f860 20 20 20 20 20 20 20 20 20 20 20 28 44 57 4f 52             (DWOR
1f870 44 29 28 6e 4d 61 70 20 26 20 30 78 66 66 66 66  D)(nMap & 0xffff
1f880 66 66 66 66 29 2c 20 4e 55 4c 4c 29 3b 0a 23 65  ffff), NULL);.#e
1f890 6c 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  lif defined(SQLI
1f8a0 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
1f8b0 49 29 0a 20 20 20 20 70 46 64 2d 3e 68 4d 61 70  I).    pFd->hMap
1f8c0 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d   = osCreateFileM
1f8d0 61 70 70 69 6e 67 41 28 70 46 64 2d 3e 68 2c 20  appingA(pFd->h, 
1f8e0 4e 55 4c 4c 2c 20 70 72 6f 74 65 63 74 2c 0a 20  NULL, protect,. 
1f8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1f910 44 57 4f 52 44 29 28 28 6e 4d 61 70 3e 3e 33 32  DWORD)((nMap>>32
1f920 29 20 26 20 30 78 66 66 66 66 66 66 66 66 29 2c  ) & 0xffffffff),
1f930 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1f940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f950 20 28 44 57 4f 52 44 29 28 6e 4d 61 70 20 26 20   (DWORD)(nMap & 
1f960 30 78 66 66 66 66 66 66 66 66 29 2c 20 4e 55 4c  0xffffffff), NUL
1f970 4c 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69  L);.#endif.    i
1f980 66 28 20 70 46 64 2d 3e 68 4d 61 70 3d 3d 4e 55  f( pFd->hMap==NU
1f990 4c 4c 20 29 7b 0a 20 20 20 20 20 20 70 46 64 2d  LL ){.      pFd-
1f9a0 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47  >lastErrno = osG
1f9b0 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
1f9c0 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67       rc = winLog
1f9d0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
1f9e0 52 52 5f 4d 4d 41 50 2c 20 70 46 64 2d 3e 6c 61  RR_MMAP, pFd->la
1f9f0 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
1fa00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa10 22 77 69 6e 4d 61 70 66 69 6c 65 31 22 2c 20 70  "winMapfile1", p
1fa20 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20  Fd->zPath);.    
1fa30 20 20 2f 2a 20 4c 6f 67 20 74 68 65 20 65 72 72    /* Log the err
1fa40 6f 72 2c 20 62 75 74 20 63 6f 6e 74 69 6e 75 65  or, but continue
1fa50 20 6e 6f 72 6d 61 6c 20 6f 70 65 72 61 74 69 6f   normal operatio
1fa60 6e 20 75 73 69 6e 67 20 78 52 65 61 64 2f 78 57  n using xRead/xW
1fa70 72 69 74 65 20 2a 2f 0a 20 20 20 20 20 20 4f 53  rite */.      OS
1fa80 54 52 41 43 45 28 28 22 4d 41 50 2d 46 49 4c 45  TRACE(("MAP-FILE
1fa90 2d 43 52 45 41 54 45 20 70 69 64 3d 25 6c 75 2c  -CREATE pid=%lu,
1faa0 20 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73   pFile=%p, rc=%s
1fab0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
1fac0 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74      osGetCurrent
1fad0 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 64  ProcessId(), pFd
1fae0 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65  , sqlite3ErrName
1faf0 28 72 63 29 29 29 3b 0a 20 20 20 20 20 20 72 65  (rc)));.      re
1fb00 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1fb10 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
1fb20 28 20 28 6e 4d 61 70 20 25 20 77 69 6e 53 79 73  ( (nMap % winSys
1fb30 49 6e 66 6f 2e 64 77 50 61 67 65 53 69 7a 65 29  Info.dwPageSize)
1fb40 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
1fb50 74 28 20 73 69 7a 65 6f 66 28 53 49 5a 45 5f 54  t( sizeof(SIZE_T
1fb60 29 3d 3d 73 69 7a 65 6f 66 28 73 71 6c 69 74 65  )==sizeof(sqlite
1fb70 33 5f 69 6e 74 36 34 29 20 7c 7c 20 6e 4d 61 70  3_int64) || nMap
1fb80 3c 3d 30 78 66 66 66 66 66 66 66 66 20 29 3b 0a  <=0xffffffff );.
1fb90 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
1fba0 4e 52 54 0a 20 20 20 20 70 4e 65 77 20 3d 20 6f  NRT.    pNew = o
1fbb0 73 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 46 72  sMapViewOfFileFr
1fbc0 6f 6d 41 70 70 28 70 46 64 2d 3e 68 4d 61 70 2c  omApp(pFd->hMap,
1fbd0 20 66 6c 61 67 73 2c 20 30 2c 20 28 53 49 5a 45   flags, 0, (SIZE
1fbe0 5f 54 29 6e 4d 61 70 29 3b 0a 23 65 6c 73 65 0a  _T)nMap);.#else.
1fbf0 20 20 20 20 70 4e 65 77 20 3d 20 6f 73 4d 61 70      pNew = osMap
1fc00 56 69 65 77 4f 66 46 69 6c 65 28 70 46 64 2d 3e  ViewOfFile(pFd->
1fc10 68 4d 61 70 2c 20 66 6c 61 67 73 2c 20 30 2c 20  hMap, flags, 0, 
1fc20 30 2c 20 28 53 49 5a 45 5f 54 29 6e 4d 61 70 29  0, (SIZE_T)nMap)
1fc30 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  ;.#endif.    if(
1fc40 20 70 4e 65 77 3d 3d 4e 55 4c 4c 20 29 7b 0a 20   pNew==NULL ){. 
1fc50 20 20 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64       osCloseHand
1fc60 6c 65 28 70 46 64 2d 3e 68 4d 61 70 29 3b 0a 20  le(pFd->hMap);. 
1fc70 20 20 20 20 20 70 46 64 2d 3e 68 4d 61 70 20 3d       pFd->hMap =
1fc80 20 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 70 46 64   NULL;.      pFd
1fc90 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73  ->lastErrno = os
1fca0 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
1fcb0 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f        rc = winLo
1fcc0 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
1fcd0 45 52 52 5f 4d 4d 41 50 2c 20 70 46 64 2d 3e 6c  ERR_MMAP, pFd->l
1fce0 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
1fcf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd00 20 22 77 69 6e 4d 61 70 66 69 6c 65 32 22 2c 20   "winMapfile2", 
1fd10 70 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  pFd->zPath);.   
1fd20 20 20 20 2f 2a 20 4c 6f 67 20 74 68 65 20 65 72     /* Log the er
1fd30 72 6f 72 2c 20 62 75 74 20 63 6f 6e 74 69 6e 75  ror, but continu
1fd40 65 20 6e 6f 72 6d 61 6c 20 6f 70 65 72 61 74 69  e normal operati
1fd50 6f 6e 20 75 73 69 6e 67 20 78 52 65 61 64 2f 78  on using xRead/x
1fd60 57 72 69 74 65 20 2a 2f 0a 20 20 20 20 20 20 4f  Write */.      O
1fd70 53 54 52 41 43 45 28 28 22 4d 41 50 2d 46 49 4c  STRACE(("MAP-FIL
1fd80 45 2d 4d 41 50 20 70 69 64 3d 25 6c 75 2c 20 70  E-MAP pid=%lu, p
1fd90 46 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e  File=%p, rc=%s\n
1fda0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1fdb0 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72    osGetCurrentPr
1fdc0 6f 63 65 73 73 49 64 28 29 2c 20 70 46 64 2c 20  ocessId(), pFd, 
1fdd0 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72  sqlite3ErrName(r
1fde0 63 29 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75  c)));.      retu
1fdf0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1fe00 20 20 7d 0a 20 20 20 20 70 46 64 2d 3e 70 4d 61    }.    pFd->pMa
1fe10 70 52 65 67 69 6f 6e 20 3d 20 70 4e 65 77 3b 0a  pRegion = pNew;.
1fe20 20 20 20 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a      pFd->mmapSiz
1fe30 65 20 3d 20 6e 4d 61 70 3b 0a 20 20 20 20 70 46  e = nMap;.    pF
1fe40 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61  d->mmapSizeActua
1fe50 6c 20 3d 20 6e 4d 61 70 3b 0a 20 20 7d 0a 0a 20  l = nMap;.  }.. 
1fe60 20 4f 53 54 52 41 43 45 28 28 22 4d 41 50 2d 46   OSTRACE(("MAP-F
1fe70 49 4c 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69  ILE pid=%lu, pFi
1fe80 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
1fe90 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  _OK\n",.        
1fea0 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50     osGetCurrentP
1feb0 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 64 29  rocessId(), pFd)
1fec0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
1fed0 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20  TE_OK;.}.#endif 
1fee0 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  /* SQLITE_MAX_MM
1fef0 41 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a  AP_SIZE>0 */../*
1ff00 0a 2a 2a 20 49 66 20 70 6f 73 73 69 62 6c 65 2c  .** If possible,
1ff10 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
1ff20 72 20 74 6f 20 61 20 6d 61 70 70 69 6e 67 20 6f  r to a mapping o
1ff30 66 20 66 69 6c 65 20 66 64 20 73 74 61 72 74 69  f file fd starti
1ff40 6e 67 20 61 74 20 6f 66 66 73 65 74 0a 2a 2a 20  ng at offset.** 
1ff50 69 4f 66 66 2e 20 54 68 65 20 6d 61 70 70 69 6e  iOff. The mappin
1ff60 67 20 6d 75 73 74 20 62 65 20 76 61 6c 69 64 20  g must be valid 
1ff70 66 6f 72 20 61 74 20 6c 65 61 73 74 20 6e 41 6d  for at least nAm
1ff80 74 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49  t bytes..**.** I
1ff90 66 20 73 75 63 68 20 61 20 70 6f 69 6e 74 65 72  f such a pointer
1ffa0 20 63 61 6e 20 62 65 20 6f 62 74 61 69 6e 65 64   can be obtained
1ffb0 2c 20 73 74 6f 72 65 20 69 74 20 69 6e 20 2a 70  , store it in *p
1ffc0 70 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  p and return SQL
1ffd0 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 4f 72 2c 20 69  ITE_OK..** Or, i
1ffe0 66 20 6f 6e 65 20 63 61 6e 6e 6f 74 20 62 75 74  f one cannot but
1fff0 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   no error occurs
20000 2c 20 73 65 74 20 2a 70 70 20 74 6f 20 30 20 61  , set *pp to 0 a
20010 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
20020 5f 4f 4b 2e 0a 2a 2a 20 46 69 6e 61 6c 6c 79 2c  _OK..** Finally,
20030 20 69 66 20 61 6e 20 65 72 72 6f 72 20 64 6f 65   if an error doe
20040 73 20 6f 63 63 75 72 2c 20 72 65 74 75 72 6e 20  s occur, return 
20050 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
20060 63 6f 64 65 2e 20 54 68 65 20 66 69 6e 61 6c 0a  code. The final.
20070 2a 2a 20 76 61 6c 75 65 20 6f 66 20 2a 70 70 20  ** value of *pp 
20080 69 73 20 75 6e 64 65 66 69 6e 65 64 20 69 6e 20  is undefined in 
20090 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a  this case..**.**
200a0 20 49 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   If this functio
200b0 6e 20 64 6f 65 73 20 72 65 74 75 72 6e 20 61 20  n does return a 
200c0 70 6f 69 6e 74 65 72 2c 20 74 68 65 20 63 61 6c  pointer, the cal
200d0 6c 65 72 20 6d 75 73 74 20 65 76 65 6e 74 75 61  ler must eventua
200e0 6c 6c 79 0a 2a 2a 20 72 65 6c 65 61 73 65 20 74  lly.** release t
200f0 68 65 20 72 65 66 65 72 65 6e 63 65 20 62 79 20  he reference by 
20100 63 61 6c 6c 69 6e 67 20 77 69 6e 55 6e 66 65 74  calling winUnfet
20110 63 68 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ch()..*/.static 
20120 69 6e 74 20 77 69 6e 46 65 74 63 68 28 73 71 6c  int winFetch(sql
20130 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69  ite3_file *fd, i
20140 36 34 20 69 4f 66 66 2c 20 69 6e 74 20 6e 41 6d  64 iOff, int nAm
20150 74 2c 20 76 6f 69 64 20 2a 2a 70 70 29 7b 0a 23  t, void **pp){.#
20160 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
20170 41 50 5f 53 49 5a 45 3e 30 0a 20 20 77 69 6e 46  AP_SIZE>0.  winF
20180 69 6c 65 20 2a 70 46 64 20 3d 20 28 77 69 6e 46  ile *pFd = (winF
20190 69 6c 65 2a 29 66 64 3b 20 20 20 2f 2a 20 54 68  ile*)fd;   /* Th
201a0 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74  e underlying dat
201b0 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 23 65  abase file */.#e
201c0 6e 64 69 66 0a 20 20 2a 70 70 20 3d 20 30 3b 0a  ndif.  *pp = 0;.
201d0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 46 45 54  .  OSTRACE(("FET
201e0 43 48 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c  CH pid=%lu, pFil
201f0 65 3d 25 70 2c 20 6f 66 66 73 65 74 3d 25 6c 6c  e=%p, offset=%ll
20200 64 2c 20 61 6d 6f 75 6e 74 3d 25 64 2c 20 70 70  d, amount=%d, pp
20210 3d 25 70 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%p\n",.        
20220 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50     osGetCurrentP
20230 72 6f 63 65 73 73 49 64 28 29 2c 20 66 64 2c 20  rocessId(), fd, 
20240 69 4f 66 66 2c 20 6e 41 6d 74 2c 20 70 70 29 29  iOff, nAmt, pp))
20250 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  ;..#if SQLITE_MA
20260 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
20270 69 66 28 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a  if( pFd->mmapSiz
20280 65 4d 61 78 3e 30 20 29 7b 0a 20 20 20 20 69 66  eMax>0 ){.    if
20290 28 20 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f  ( pFd->pMapRegio
202a0 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  n==0 ){.      in
202b0 74 20 72 63 20 3d 20 77 69 6e 4d 61 70 66 69 6c  t rc = winMapfil
202c0 65 28 70 46 64 2c 20 2d 31 29 3b 0a 20 20 20 20  e(pFd, -1);.    
202d0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
202e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 4f  _OK ){.        O
202f0 53 54 52 41 43 45 28 28 22 46 45 54 43 48 20 70  STRACE(("FETCH p
20300 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70  id=%lu, pFile=%p
20310 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20  , rc=%s\n",.    
20320 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47               osG
20330 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
20340 49 64 28 29 2c 20 70 46 64 2c 20 73 71 6c 69 74  Id(), pFd, sqlit
20350 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b  e3ErrName(rc)));
20360 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
20370 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
20380 7d 0a 20 20 20 20 69 66 28 20 70 46 64 2d 3e 6d  }.    if( pFd->m
20390 6d 61 70 53 69 7a 65 20 3e 3d 20 69 4f 66 66 2b  mapSize >= iOff+
203a0 6e 41 6d 74 20 29 7b 0a 20 20 20 20 20 20 2a 70  nAmt ){.      *p
203b0 70 20 3d 20 26 28 28 75 38 20 2a 29 70 46 64 2d  p = &((u8 *)pFd-
203c0 3e 70 4d 61 70 52 65 67 69 6f 6e 29 5b 69 4f 66  >pMapRegion)[iOf
203d0 66 5d 3b 0a 20 20 20 20 20 20 70 46 64 2d 3e 6e  f];.      pFd->n
203e0 46 65 74 63 68 4f 75 74 2b 2b 3b 0a 20 20 20 20  FetchOut++;.    
203f0 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
20400 4f 53 54 52 41 43 45 28 28 22 46 45 54 43 48 20  OSTRACE(("FETCH 
20410 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25  pid=%lu, pFile=%
20420 70 2c 20 70 70 3d 25 70 2c 20 2a 70 70 3d 25 70  p, pp=%p, *pp=%p
20430 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e  , rc=SQLITE_OK\n
20440 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73  ",.           os
20450 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
20460 73 49 64 28 29 2c 20 66 64 2c 20 70 70 2c 20 2a  sId(), fd, pp, *
20470 70 70 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  pp));.  return S
20480 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
20490 2a 2a 20 49 66 20 74 68 65 20 74 68 69 72 64 20  ** If the third 
204a0 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 2d  argument is non-
204b0 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73 20  NULL, then this 
204c0 66 75 6e 63 74 69 6f 6e 20 72 65 6c 65 61 73 65  function release
204d0 73 20 61 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65  s a.** reference
204e0 20 6f 62 74 61 69 6e 65 64 20 62 79 20 61 6e 20   obtained by an 
204f0 65 61 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f 20  earlier call to 
20500 77 69 6e 46 65 74 63 68 28 29 2e 20 54 68 65 20  winFetch(). The 
20510 73 65 63 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d 65  second.** argume
20520 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74 68 69  nt passed to thi
20530 73 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20  s function must 
20540 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  be the same as t
20550 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
20560 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 74 68 61  .** argument tha
20570 74 20 77 61 73 20 70 61 73 73 65 64 20 74 6f 20  t was passed to 
20580 74 68 65 20 77 69 6e 46 65 74 63 68 28 29 20 69  the winFetch() i
20590 6e 76 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  nvocation..**.**
205a0 20 4f 72 2c 20 69 66 20 74 68 65 20 74 68 69 72   Or, if the thir
205b0 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 4e 55  d argument is NU
205c0 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75  LL, then this fu
205d0 6e 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20  nction is being 
205e0 63 61 6c 6c 65 64 0a 2a 2a 20 74 6f 20 69 6e 66  called.** to inf
205f0 6f 72 6d 20 74 68 65 20 56 46 53 20 6c 61 79 65  orm the VFS laye
20600 72 20 74 68 61 74 2c 20 61 63 63 6f 72 64 69 6e  r that, accordin
20610 67 20 74 6f 20 50 4f 53 49 58 2c 20 61 6e 79 20  g to POSIX, any 
20620 65 78 69 73 74 69 6e 67 20 6d 61 70 70 69 6e 67  existing mapping
20630 0a 2a 2a 20 6d 61 79 20 6e 6f 77 20 62 65 20 69  .** may now be i
20640 6e 76 61 6c 69 64 20 61 6e 64 20 73 68 6f 75 6c  nvalid and shoul
20650 64 20 62 65 20 75 6e 6d 61 70 70 65 64 2e 0a 2a  d be unmapped..*
20660 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
20670 55 6e 66 65 74 63 68 28 73 71 6c 69 74 65 33 5f  Unfetch(sqlite3_
20680 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 69 4f  file *fd, i64 iO
20690 66 66 2c 20 76 6f 69 64 20 2a 70 29 7b 0a 23 69  ff, void *p){.#i
206a0 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
206b0 50 5f 53 49 5a 45 3e 30 0a 20 20 77 69 6e 46 69  P_SIZE>0.  winFi
206c0 6c 65 20 2a 70 46 64 20 3d 20 28 77 69 6e 46 69  le *pFd = (winFi
206d0 6c 65 2a 29 66 64 3b 20 20 20 2f 2a 20 54 68 65  le*)fd;   /* The
206e0 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61   underlying data
206f0 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20  base file */..  
20700 2f 2a 20 49 66 20 70 3d 3d 30 20 28 75 6e 6d 61  /* If p==0 (unma
20710 70 20 74 68 65 20 65 6e 74 69 72 65 20 66 69 6c  p the entire fil
20720 65 29 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75  e) then there mu
20730 73 74 20 62 65 20 6e 6f 20 6f 75 74 73 74 61 6e  st be no outstan
20740 64 69 6e 67 0a 20 20 2a 2a 20 78 46 65 74 63 68  ding.  ** xFetch
20750 20 72 65 66 65 72 65 6e 63 65 73 2e 20 4f 72 2c   references. Or,
20760 20 69 66 20 70 21 3d 30 20 28 6d 65 61 6e 69 6e   if p!=0 (meanin
20770 67 20 69 74 20 69 73 20 61 6e 20 78 46 65 74 63  g it is an xFetc
20780 68 20 72 65 66 65 72 65 6e 63 65 29 2c 0a 20 20  h reference),.  
20790 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75  ** then there mu
207a0 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f  st be at least o
207b0 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 2e 20  ne outstanding. 
207c0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70   */.  assert( (p
207d0 3d 3d 30 29 3d 3d 28 70 46 64 2d 3e 6e 46 65 74  ==0)==(pFd->nFet
207e0 63 68 4f 75 74 3d 3d 30 29 20 29 3b 0a 0a 20 20  chOut==0) );..  
207f0 2f 2a 20 49 66 20 70 21 3d 30 2c 20 69 74 20 6d  /* If p!=0, it m
20800 75 73 74 20 6d 61 74 63 68 20 74 68 65 20 69 4f  ust match the iO
20810 66 66 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20 61  ff value. */.  a
20820 73 73 65 72 74 28 20 70 3d 3d 30 20 7c 7c 20 70  ssert( p==0 || p
20830 3d 3d 26 28 28 75 38 20 2a 29 70 46 64 2d 3e 70  ==&((u8 *)pFd->p
20840 4d 61 70 52 65 67 69 6f 6e 29 5b 69 4f 66 66 5d  MapRegion)[iOff]
20850 20 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28   );..  OSTRACE((
20860 22 55 4e 46 45 54 43 48 20 70 69 64 3d 25 6c 75  "UNFETCH pid=%lu
20870 2c 20 70 46 69 6c 65 3d 25 70 2c 20 6f 66 66 73  , pFile=%p, offs
20880 65 74 3d 25 6c 6c 64 2c 20 70 3d 25 70 5c 6e 22  et=%lld, p=%p\n"
20890 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 47  ,.           osG
208a0 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
208b0 49 64 28 29 2c 20 70 46 64 2c 20 69 4f 66 66 2c  Id(), pFd, iOff,
208c0 20 70 29 29 3b 0a 0a 20 20 69 66 28 20 70 20 29   p));..  if( p )
208d0 7b 0a 20 20 20 20 70 46 64 2d 3e 6e 46 65 74 63  {.    pFd->nFetc
208e0 68 4f 75 74 2d 2d 3b 0a 20 20 7d 65 6c 73 65 7b  hOut--;.  }else{
208f0 0a 20 20 20 20 2f 2a 20 46 49 58 4d 45 3a 20 20  .    /* FIXME:  
20900 49 66 20 57 69 6e 64 6f 77 73 20 74 72 75 6c 79  If Windows truly
20910 20 61 6c 77 61 79 73 20 70 72 65 76 65 6e 74 73   always prevents
20920 20 74 72 75 6e 63 61 74 69 6e 67 20 6f 72 20 64   truncating or d
20930 65 6c 65 74 69 6e 67 20 61 0a 20 20 20 20 2a 2a  eleting a.    **
20940 20 66 69 6c 65 20 77 68 69 6c 65 20 61 20 6d 61   file while a ma
20950 70 70 69 6e 67 20 69 73 20 68 65 6c 64 2c 20 74  pping is held, t
20960 68 65 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  hen the followin
20970 67 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28 29  g winUnmapfile()
20980 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 69 73 20   call.    ** is 
20990 75 6e 6e 65 63 65 73 73 61 72 79 20 63 61 6e 20  unnecessary can 
209a0 63 61 6e 20 62 65 20 6f 6d 69 74 74 65 64 20 2d  can be omitted -
209b0 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 69 6d 70   potentially imp
209c0 72 6f 76 69 6e 67 0a 20 20 20 20 2a 2a 20 70 65  roving.    ** pe
209d0 72 66 6f 72 6d 61 6e 63 65 2e 20 20 2a 2f 0a 20  rformance.  */. 
209e0 20 20 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28     winUnmapfile(
209f0 70 46 64 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  pFd);.  }..  ass
20a00 65 72 74 28 20 70 46 64 2d 3e 6e 46 65 74 63 68  ert( pFd->nFetch
20a10 4f 75 74 3e 3d 30 20 29 3b 0a 23 65 6e 64 69 66  Out>=0 );.#endif
20a20 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e  ..  OSTRACE(("UN
20a30 46 45 54 43 48 20 70 69 64 3d 25 6c 75 2c 20 70  FETCH pid=%lu, p
20a40 46 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49  File=%p, rc=SQLI
20a50 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20  TE_OK\n",.      
20a60 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e       osGetCurren
20a70 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 66 64  tProcessId(), fd
20a80 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ));.  return SQL
20a90 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
20aa0 20 48 65 72 65 20 65 6e 64 73 20 74 68 65 20 69   Here ends the i
20ab0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
20ac0 20 61 6c 6c 20 73 71 6c 69 74 65 33 5f 66 69 6c   all sqlite3_fil
20ad0 65 20 6d 65 74 68 6f 64 73 2e 0a 2a 2a 0a 2a 2a  e methods..**.**
20ae0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20af0 2a 2a 2a 2a 20 45 6e 64 20 73 71 6c 69 74 65 33  **** End sqlite3
20b00 5f 66 69 6c 65 20 4d 65 74 68 6f 64 73 20 2a 2a  _file Methods **
20b10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20b20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
20b30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20b40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20b50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20b60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20b70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f  ************/../
20b80 2a 0a 2a 2a 20 54 68 69 73 20 76 65 63 74 6f 72  *.** This vector
20b90 20 64 65 66 69 6e 65 73 20 61 6c 6c 20 74 68 65   defines all the
20ba0 20 6d 65 74 68 6f 64 73 20 74 68 61 74 20 63 61   methods that ca
20bb0 6e 20 6f 70 65 72 61 74 65 20 6f 6e 20 61 6e 0a  n operate on an.
20bc0 2a 2a 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ** sqlite3_file 
20bd0 66 6f 72 20 77 69 6e 33 32 2e 0a 2a 2f 0a 73 74  for win32..*/.st
20be0 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74  atic const sqlit
20bf0 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 77 69  e3_io_methods wi
20c00 6e 49 6f 4d 65 74 68 6f 64 20 3d 20 7b 0a 20 20  nIoMethod = {.  
20c10 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  3,              
20c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20c30 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20  /* iVersion */. 
20c40 20 77 69 6e 43 6c 6f 73 65 2c 20 20 20 20 20 20   winClose,      
20c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20c60 20 2f 2a 20 78 43 6c 6f 73 65 20 2a 2f 0a 20 20   /* xClose */.  
20c70 77 69 6e 52 65 61 64 2c 20 20 20 20 20 20 20 20  winRead,        
20c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20c90 2f 2a 20 78 52 65 61 64 20 2a 2f 0a 20 20 77 69  /* xRead */.  wi
20ca0 6e 57 72 69 74 65 2c 20 20 20 20 20 20 20 20 20  nWrite,         
20cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20cc0 20 78 57 72 69 74 65 20 2a 2f 0a 20 20 77 69 6e   xWrite */.  win
20cd0 54 72 75 6e 63 61 74 65 2c 20 20 20 20 20 20 20  Truncate,       
20ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20cf0 78 54 72 75 6e 63 61 74 65 20 2a 2f 0a 20 20 77  xTruncate */.  w
20d00 69 6e 53 79 6e 63 2c 20 20 20 20 20 20 20 20 20  inSync,         
20d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20d20 2a 20 78 53 79 6e 63 20 2a 2f 0a 20 20 77 69 6e  * xSync */.  win
20d30 46 69 6c 65 53 69 7a 65 2c 20 20 20 20 20 20 20  FileSize,       
20d40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20d50 78 46 69 6c 65 53 69 7a 65 20 2a 2f 0a 20 20 77  xFileSize */.  w
20d60 69 6e 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  inLock,         
20d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20d80 2a 20 78 4c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e  * xLock */.  win
20d90 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  Unlock,         
20da0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20db0 78 55 6e 6c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e  xUnlock */.  win
20dc0 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
20dd0 6b 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  k,           /* 
20de0 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
20df0 63 6b 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 43  ck */.  winFileC
20e00 6f 6e 74 72 6f 6c 2c 20 20 20 20 20 20 20 20 20  ontrol,         
20e10 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65          /* xFile
20e20 43 6f 6e 74 72 6f 6c 20 2a 2f 0a 20 20 77 69 6e  Control */.  win
20e30 53 65 63 74 6f 72 53 69 7a 65 2c 20 20 20 20 20  SectorSize,     
20e40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20e50 78 53 65 63 74 6f 72 53 69 7a 65 20 2a 2f 0a 20  xSectorSize */. 
20e60 20 77 69 6e 44 65 76 69 63 65 43 68 61 72 61 63   winDeviceCharac
20e70 74 65 72 69 73 74 69 63 73 2c 20 20 20 20 20 20  teristics,      
20e80 20 2f 2a 20 78 44 65 76 69 63 65 43 68 61 72 61   /* xDeviceChara
20e90 63 74 65 72 69 73 74 69 63 73 20 2a 2f 0a 20 20  cteristics */.  
20ea0 77 69 6e 53 68 6d 4d 61 70 2c 20 20 20 20 20 20  winShmMap,      
20eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ec0 2f 2a 20 78 53 68 6d 4d 61 70 20 2a 2f 0a 20 20  /* xShmMap */.  
20ed0 77 69 6e 53 68 6d 4c 6f 63 6b 2c 20 20 20 20 20  winShmLock,     
20ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ef0 2f 2a 20 78 53 68 6d 4c 6f 63 6b 20 2a 2f 0a 20  /* xShmLock */. 
20f00 20 77 69 6e 53 68 6d 42 61 72 72 69 65 72 2c 20   winShmBarrier, 
20f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f20 20 2f 2a 20 78 53 68 6d 42 61 72 72 69 65 72 20   /* xShmBarrier 
20f30 2a 2f 0a 20 20 77 69 6e 53 68 6d 55 6e 6d 61 70  */.  winShmUnmap
20f40 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
20f50 20 20 20 20 20 2f 2a 20 78 53 68 6d 55 6e 6d 61       /* xShmUnma
20f60 70 20 2a 2f 0a 20 20 77 69 6e 46 65 74 63 68 2c  p */.  winFetch,
20f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f80 20 20 20 20 20 20 20 2f 2a 20 78 46 65 74 63 68         /* xFetch
20f90 20 2a 2f 0a 20 20 77 69 6e 55 6e 66 65 74 63 68   */.  winUnfetch
20fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20fb0 20 20 20 20 20 20 2f 2a 20 78 55 6e 66 65 74 63        /* xUnfetc
20fc0 68 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a  h */.};../******
20fd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20fe0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20ff0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21000 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21010 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
21020 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21030 2a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66 73 20  *** sqlite3_vfs 
21040 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a  methods ********
21050 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21060 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ****.**.** This 
21070 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e  division contain
21080 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
21090 74 69 6f 6e 20 6f 66 20 6d 65 74 68 6f 64 73 20  tion of methods 
210a0 6f 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65  on the.** sqlite
210b0 33 5f 76 66 73 20 6f 62 6a 65 63 74 2e 0a 2a 2f  3_vfs object..*/
210c0 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  ..#if defined(__
210d0 43 59 47 57 49 4e 5f 5f 29 0a 2f 2a 0a 2a 2a 20  CYGWIN__)./*.** 
210e0 43 6f 6e 76 65 72 74 20 61 20 66 69 6c 65 6e 61  Convert a filena
210f0 6d 65 20 66 72 6f 6d 20 77 68 61 74 65 76 65 72  me from whatever
21100 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
21110 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
21120 0a 2a 2a 20 73 75 70 70 6f 72 74 73 20 66 6f 72  .** supports for
21130 20 66 69 6c 65 6e 61 6d 65 73 20 69 6e 74 6f 20   filenames into 
21140 55 54 46 2d 38 2e 20 20 53 70 61 63 65 20 74 6f  UTF-8.  Space to
21150 20 68 6f 6c 64 20 74 68 65 20 72 65 73 75 6c 74   hold the result
21160 20 69 73 0a 2a 2a 20 6f 62 74 61 69 6e 65 64 20   is.** obtained 
21170 66 72 6f 6d 20 6d 61 6c 6c 6f 63 20 61 6e 64 20  from malloc and 
21180 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79  must be freed by
21190 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   the calling fun
211a0 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
211b0 20 63 68 61 72 20 2a 77 69 6e 43 6f 6e 76 65 72   char *winConver
211c0 74 54 6f 55 74 66 38 46 69 6c 65 6e 61 6d 65 28  tToUtf8Filename(
211d0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 46 69 6c  const void *zFil
211e0 65 6e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a  ename){.  char *
211f0 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 30 3b 0a  zConverted = 0;.
21200 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29    if( osIsNT() )
21210 7b 0a 20 20 20 20 7a 43 6f 6e 76 65 72 74 65 64  {.    zConverted
21220 20 3d 20 77 69 6e 55 6e 69 63 6f 64 65 54 6f 55   = winUnicodeToU
21230 74 66 38 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  tf8(zFilename);.
21240 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
21250 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
21260 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 7a 43 6f  .  else{.    zCo
21270 6e 76 65 72 74 65 64 20 3d 20 73 71 6c 69 74 65  nverted = sqlite
21280 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f  3_win32_mbcs_to_
21290 75 74 66 38 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  utf8(zFilename);
212a0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2f 2a  .  }.#endif.  /*
212b0 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 68 61 6e   caller will han
212c0 64 6c 65 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72  dle out of memor
212d0 79 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 7a 43  y */.  return zC
212e0 6f 6e 76 65 72 74 65 64 3b 0a 7d 0a 23 65 6e 64  onverted;.}.#end
212f0 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  if../*.** Conver
21300 74 20 61 20 55 54 46 2d 38 20 66 69 6c 65 6e 61  t a UTF-8 filena
21310 6d 65 20 69 6e 74 6f 20 77 68 61 74 65 76 65 72  me into whatever
21320 20 66 6f 72 6d 20 74 68 65 20 75 6e 64 65 72 6c   form the underl
21330 79 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6e  ying.** operatin
21340 67 20 73 79 73 74 65 6d 20 77 61 6e 74 73 20 66  g system wants f
21350 69 6c 65 6e 61 6d 65 73 20 69 6e 2e 20 20 53 70  ilenames in.  Sp
21360 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ace to hold the 
21370 72 65 73 75 6c 74 0a 2a 2a 20 69 73 20 6f 62 74  result.** is obt
21380 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f  ained from mallo
21390 63 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66 72  c and must be fr
213a0 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69  eed by the calli
213b0 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a  ng.** function..
213c0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a  */.static void *
213d0 77 69 6e 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74  winConvertFromUt
213e0 66 38 46 69 6c 65 6e 61 6d 65 28 63 6f 6e 73 74  f8Filename(const
213f0 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
21400 29 7b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76  ){.  void *zConv
21410 65 72 74 65 64 20 3d 20 30 3b 0a 20 20 69 66 28  erted = 0;.  if(
21420 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 20 20   osIsNT() ){.   
21430 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77 69   zConverted = wi
21440 6e 55 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a  nUtf8ToUnicode(z
21450 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 23  Filename);.  }.#
21460 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  ifdef SQLITE_WIN
21470 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c  32_HAS_ANSI.  el
21480 73 65 7b 0a 20 20 20 20 7a 43 6f 6e 76 65 72 74  se{.    zConvert
21490 65 64 20 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e  ed = sqlite3_win
214a0 33 32 5f 75 74 66 38 5f 74 6f 5f 6d 62 63 73 28  32_utf8_to_mbcs(
214b0 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a  zFilename);.  }.
214c0 23 65 6e 64 69 66 0a 20 20 2f 2a 20 63 61 6c 6c  #endif.  /* call
214d0 65 72 20 77 69 6c 6c 20 68 61 6e 64 6c 65 20 6f  er will handle o
214e0 75 74 20 6f 66 20 6d 65 6d 6f 72 79 20 2a 2f 0a  ut of memory */.
214f0 20 20 72 65 74 75 72 6e 20 7a 43 6f 6e 76 65 72    return zConver
21500 74 65 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ted;.}../*.** Th
21510 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
21520 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20  rns non-zero if 
21530 74 68 65 20 73 70 65 63 69 66 69 65 64 20 55 54  the specified UT
21540 46 2d 38 20 73 74 72 69 6e 67 20 62 75 66 66 65  F-8 string buffe
21550 72 0a 2a 2a 20 65 6e 64 73 20 77 69 74 68 20 61  r.** ends with a
21560 20 64 69 72 65 63 74 6f 72 79 20 73 65 70 61 72   directory separ
21570 61 74 6f 72 20 63 68 61 72 61 63 74 65 72 20 6f  ator character o
21580 72 20 6f 6e 65 20 77 61 73 20 73 75 63 63 65 73  r one was succes
21590 73 66 75 6c 6c 79 0a 2a 2a 20 61 64 64 65 64 20  sfully.** added 
215a0 74 6f 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  to it..*/.static
215b0 20 69 6e 74 20 77 69 6e 4d 61 6b 65 45 6e 64 49   int winMakeEndI
215c0 6e 44 69 72 53 65 70 28 69 6e 74 20 6e 42 75 66  nDirSep(int nBuf
215d0 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20  , char *zBuf){. 
215e0 20 69 66 28 20 7a 42 75 66 20 29 7b 0a 20 20 20   if( zBuf ){.   
215f0 20 69 6e 74 20 6e 4c 65 6e 20 3d 20 73 71 6c 69   int nLen = sqli
21600 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 42 75 66  te3Strlen30(zBuf
21610 29 3b 0a 20 20 20 20 69 66 28 20 6e 4c 65 6e 3e  );.    if( nLen>
21620 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 77  0 ){.      if( w
21630 69 6e 49 73 44 69 72 53 65 70 28 7a 42 75 66 5b  inIsDirSep(zBuf[
21640 6e 4c 65 6e 2d 31 5d 29 20 29 7b 0a 20 20 20 20  nLen-1]) ){.    
21650 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
21660 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 4c      }else if( nL
21670 65 6e 2b 31 3c 6e 42 75 66 20 29 7b 0a 20 20 20  en+1<nBuf ){.   
21680 20 20 20 20 20 7a 42 75 66 5b 6e 4c 65 6e 5d 20       zBuf[nLen] 
21690 3d 20 77 69 6e 47 65 74 44 69 72 53 65 70 28 29  = winGetDirSep()
216a0 3b 0a 20 20 20 20 20 20 20 20 7a 42 75 66 5b 6e  ;.        zBuf[n
216b0 4c 65 6e 2b 31 5d 20 3d 20 27 5c 30 27 3b 0a 20  Len+1] = '\0';. 
216c0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
216d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
216e0 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
216f0 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
21700 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
21710 6e 61 6d 65 20 61 6e 64 20 73 74 6f 72 65 20 74  name and store t
21720 68 65 20 72 65 73 75 6c 74 69 6e 67 20 70 6f 69  he resulting poi
21730 6e 74 65 72 20 69 6e 74 6f 20 70 7a 42 75 66 2e  nter into pzBuf.
21740 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20  .** The pointer 
21750 72 65 74 75 72 6e 65 64 20 69 6e 20 70 7a 42 75  returned in pzBu
21760 66 20 6d 75 73 74 20 62 65 20 66 72 65 65 64 20  f must be freed 
21770 76 69 61 20 73 71 6c 69 74 65 33 5f 66 72 65 65  via sqlite3_free
21780 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ()..*/.static in
21790 74 20 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65  t winGetTempname
217a0 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56  (sqlite3_vfs *pV
217b0 66 73 2c 20 63 68 61 72 20 2a 2a 70 7a 42 75 66  fs, char **pzBuf
217c0 29 7b 0a 20 20 73 74 61 74 69 63 20 63 68 61 72  ){.  static char
217d0 20 7a 43 68 61 72 73 5b 5d 20 3d 0a 20 20 20 20   zChars[] =.    
217e0 22 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f  "abcdefghijklmno
217f0 70 71 72 73 74 75 76 77 78 79 7a 22 0a 20 20 20  pqrstuvwxyz".   
21800 20 22 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e   "ABCDEFGHIJKLMN
21810 4f 50 51 52 53 54 55 56 57 58 59 5a 22 0a 20 20  OPQRSTUVWXYZ".  
21820 20 20 22 30 31 32 33 34 35 36 37 38 39 22 3b 0a    "0123456789";.
21830 20 20 73 69 7a 65 5f 74 20 69 2c 20 6a 3b 0a 20    size_t i, j;. 
21840 20 69 6e 74 20 6e 50 72 65 20 3d 20 73 71 6c 69   int nPre = sqli
21850 74 65 33 53 74 72 6c 65 6e 33 30 28 53 51 4c 49  te3Strlen30(SQLI
21860 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45  TE_TEMP_FILE_PRE
21870 46 49 58 29 3b 0a 20 20 69 6e 74 20 6e 4d 61 78  FIX);.  int nMax
21880 2c 20 6e 42 75 66 2c 20 6e 44 69 72 2c 20 6e 4c  , nBuf, nDir, nL
21890 65 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 42 75 66  en;.  char *zBuf
218a0 3b 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64 64  ;..  /* It's odd
218b0 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e 20   to simulate an 
218c0 69 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c 20 62  io-error here, b
218d0 75 74 20 72 65 61 6c 6c 79 20 74 68 69 73 20 69  ut really this i
218e0 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e  s just.  ** usin
218f0 67 20 74 68 65 20 69 6f 2d 65 72 72 6f 72 20 69  g the io-error i
21900 6e 66 72 61 73 74 72 75 63 74 75 72 65 20 74 6f  nfrastructure to
21910 20 74 65 73 74 20 74 68 61 74 20 53 51 4c 69 74   test that SQLit
21920 65 20 68 61 6e 64 6c 65 73 20 74 68 69 73 0a 20  e handles this. 
21930 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61 69   ** function fai
21940 6c 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d  ling..  */.  Sim
21950 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
21960 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
21970 52 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  R );..  /* Alloc
21980 61 74 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20  ate a temporary 
21990 62 75 66 66 65 72 20 74 6f 20 73 74 6f 72 65 20  buffer to store 
219a0 74 68 65 20 66 75 6c 6c 79 20 71 75 61 6c 69 66  the fully qualif
219b0 69 65 64 20 66 69 6c 65 0a 20 20 2a 2a 20 6e 61  ied file.  ** na
219c0 6d 65 20 66 6f 72 20 74 68 65 20 74 65 6d 70 6f  me for the tempo
219d0 72 61 72 79 20 66 69 6c 65 2e 20 20 49 66 20 74  rary file.  If t
219e0 68 69 73 20 66 61 69 6c 73 2c 20 77 65 20 63 61  his fails, we ca
219f0 6e 6e 6f 74 20 63 6f 6e 74 69 6e 75 65 2e 0a 20  nnot continue.. 
21a00 20 2a 2f 0a 20 20 6e 4d 61 78 20 3d 20 70 56 66   */.  nMax = pVf
21a10 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 3b 20 6e  s->mxPathname; n
21a20 42 75 66 20 3d 20 6e 4d 61 78 20 2b 20 32 3b 0a  Buf = nMax + 2;.
21a30 20 20 7a 42 75 66 20 3d 20 73 71 6c 69 74 65 33    zBuf = sqlite3
21a40 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42 75 66  MallocZero( nBuf
21a50 20 29 3b 0a 20 20 69 66 28 20 21 7a 42 75 66 20   );.  if( !zBuf 
21a60 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  ){.    OSTRACE((
21a70 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72  "TEMP-FILENAME r
21a80 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  c=SQLITE_IOERR_N
21a90 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 72  OMEM\n"));.    r
21aa0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
21ab0 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20  RR_NOMEM;.  }.. 
21ac0 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 74   /* Figure out t
21ad0 68 65 20 65 66 66 65 63 74 69 76 65 20 74 65 6d  he effective tem
21ae0 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72 79  porary directory
21af0 2e 20 20 46 69 72 73 74 2c 20 63 68 65 63 6b 20  .  First, check 
21b00 69 66 20 6f 6e 65 0a 20 20 2a 2a 20 68 61 73 20  if one.  ** has 
21b10 62 65 65 6e 20 65 78 70 6c 69 63 69 74 6c 79 20  been explicitly 
21b20 73 65 74 20 62 79 20 74 68 65 20 61 70 70 6c 69  set by the appli
21b30 63 61 74 69 6f 6e 3b 20 6f 74 68 65 72 77 69 73  cation; otherwis
21b40 65 2c 20 75 73 65 20 74 68 65 20 6f 6e 65 0a 20  e, use the one. 
21b50 20 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64 20 62   ** configured b
21b60 79 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20  y the operating 
21b70 73 79 73 74 65 6d 2e 0a 20 20 2a 2f 0a 20 20 6e  system..  */.  n
21b80 44 69 72 20 3d 20 6e 4d 61 78 20 2d 20 28 6e 50  Dir = nMax - (nP
21b90 72 65 20 2b 20 31 35 29 3b 0a 20 20 61 73 73 65  re + 15);.  asse
21ba0 72 74 28 20 6e 44 69 72 3e 30 20 29 3b 0a 20 20  rt( nDir>0 );.  
21bb0 69 66 28 20 73 71 6c 69 74 65 33 5f 74 65 6d 70  if( sqlite3_temp
21bc0 5f 64 69 72 65 63 74 6f 72 79 20 29 7b 0a 20 20  _directory ){.  
21bd0 20 20 69 6e 74 20 6e 44 69 72 4c 65 6e 20 3d 20    int nDirLen = 
21be0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
21bf0 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72  sqlite3_temp_dir
21c00 65 63 74 6f 72 79 29 3b 0a 20 20 20 20 69 66 28  ectory);.    if(
21c10 20 6e 44 69 72 4c 65 6e 3e 30 20 29 7b 0a 20 20   nDirLen>0 ){.  
21c20 20 20 20 20 69 66 28 20 21 77 69 6e 49 73 44 69      if( !winIsDi
21c30 72 53 65 70 28 73 71 6c 69 74 65 33 5f 74 65 6d  rSep(sqlite3_tem
21c40 70 5f 64 69 72 65 63 74 6f 72 79 5b 6e 44 69 72  p_directory[nDir
21c50 4c 65 6e 2d 31 5d 29 20 29 7b 0a 20 20 20 20 20  Len-1]) ){.     
21c60 20 20 20 6e 44 69 72 4c 65 6e 2b 2b 3b 0a 20 20     nDirLen++;.  
21c70 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
21c80 6e 44 69 72 4c 65 6e 3e 6e 44 69 72 20 29 7b 0a  nDirLen>nDir ){.
21c90 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
21ca0 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20  free(zBuf);.    
21cb0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45      OSTRACE(("TE
21cc0 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53  MP-FILENAME rc=S
21cd0 51 4c 49 54 45 5f 45 52 52 4f 52 5c 6e 22 29 29  QLITE_ERROR\n"))
21ce0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
21cf0 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
21d00 49 54 45 5f 45 52 52 4f 52 2c 20 30 2c 20 22 77  ITE_ERROR, 0, "w
21d10 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65 31 22 2c  inGetTempname1",
21d20 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
21d30 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
21d40 6e 74 66 28 6e 4d 61 78 2c 20 7a 42 75 66 2c 20  ntf(nMax, zBuf, 
21d50 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 74 65  "%s", sqlite3_te
21d60 6d 70 5f 64 69 72 65 63 74 6f 72 79 29 3b 0a 20  mp_directory);. 
21d70 20 20 20 7d 0a 20 20 7d 0a 23 69 66 20 64 65 66     }.  }.#if def
21d80 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29  ined(__CYGWIN__)
21d90 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 73 74 61  .  else{.    sta
21da0 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
21db0 61 7a 44 69 72 73 5b 5d 20 3d 20 7b 0a 20 20 20  azDirs[] = {.   
21dc0 20 20 20 20 30 2c 20 2f 2a 20 67 65 74 65 6e 76      0, /* getenv
21dd0 28 22 53 51 4c 49 54 45 5f 54 4d 50 44 49 52 22  ("SQLITE_TMPDIR"
21de0 29 20 2a 2f 0a 20 20 20 20 20 20 20 30 2c 20 2f  ) */.       0, /
21df0 2a 20 67 65 74 65 6e 76 28 22 54 4d 50 44 49 52  * getenv("TMPDIR
21e00 22 29 20 2a 2f 0a 20 20 20 20 20 20 20 30 2c 20  ") */.       0, 
21e10 2f 2a 20 67 65 74 65 6e 76 28 22 54 4d 50 22 29  /* getenv("TMP")
21e20 20 2a 2f 0a 20 20 20 20 20 20 20 30 2c 20 2f 2a   */.       0, /*
21e30 20 67 65 74 65 6e 76 28 22 54 45 4d 50 22 29 20   getenv("TEMP") 
21e40 2a 2f 0a 20 20 20 20 20 20 20 30 2c 20 2f 2a 20  */.       0, /* 
21e50 67 65 74 65 6e 76 28 22 55 53 45 52 50 52 4f 46  getenv("USERPROF
21e60 49 4c 45 22 29 20 2a 2f 0a 20 20 20 20 20 20 20  ILE") */.       
21e70 22 2f 76 61 72 2f 74 6d 70 22 2c 0a 20 20 20 20  "/var/tmp",.    
21e80 20 20 20 22 2f 75 73 72 2f 74 6d 70 22 2c 0a 20     "/usr/tmp",. 
21e90 20 20 20 20 20 20 22 2f 74 6d 70 22 2c 0a 20 20        "/tmp",.  
21ea0 20 20 20 20 20 22 2e 22 2c 0a 20 20 20 20 20 20       ".",.      
21eb0 20 30 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73   0        /* Lis
21ec0 74 20 74 65 72 6d 69 6e 61 74 6f 72 20 2a 2f 0a  t terminator */.
21ed0 20 20 20 20 7d 3b 0a 20 20 20 20 75 6e 73 69 67      };.    unsig
21ee0 6e 65 64 20 69 6e 74 20 69 3b 0a 20 20 20 20 63  ned int i;.    c
21ef0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 69 72 20  onst char *zDir 
21f00 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 21 61  = 0;..    if( !a
21f10 7a 44 69 72 73 5b 30 5d 20 29 20 61 7a 44 69 72  zDirs[0] ) azDir
21f20 73 5b 30 5d 20 3d 20 67 65 74 65 6e 76 28 22 53  s[0] = getenv("S
21f30 51 4c 49 54 45 5f 54 4d 50 44 49 52 22 29 3b 0a  QLITE_TMPDIR");.
21f40 20 20 20 20 69 66 28 20 21 61 7a 44 69 72 73 5b      if( !azDirs[
21f50 31 5d 20 29 20 61 7a 44 69 72 73 5b 31 5d 20 3d  1] ) azDirs[1] =
21f60 20 67 65 74 65 6e 76 28 22 54 4d 50 44 49 52 22   getenv("TMPDIR"
21f70 29 3b 0a 20 20 20 20 69 66 28 20 21 61 7a 44 69  );.    if( !azDi
21f80 72 73 5b 32 5d 20 29 20 61 7a 44 69 72 73 5b 32  rs[2] ) azDirs[2
21f90 5d 20 3d 20 67 65 74 65 6e 76 28 22 54 4d 50 22  ] = getenv("TMP"
21fa0 29 3b 0a 20 20 20 20 69 66 28 20 21 61 7a 44 69  );.    if( !azDi
21fb0 72 73 5b 33 5d 20 29 20 61 7a 44 69 72 73 5b 33  rs[3] ) azDirs[3
21fc0 5d 20 3d 20 67 65 74 65 6e 76 28 22 54 45 4d 50  ] = getenv("TEMP
21fd0 22 29 3b 0a 20 20 20 20 69 66 28 20 21 61 7a 44  ");.    if( !azD
21fe0 69 72 73 5b 34 5d 20 29 20 61 7a 44 69 72 73 5b  irs[4] ) azDirs[
21ff0 34 5d 20 3d 20 67 65 74 65 6e 76 28 22 55 53 45  4] = getenv("USE
22000 52 50 52 4f 46 49 4c 45 22 29 3b 0a 20 20 20 20  RPROFILE");.    
22010 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f  for(i=0; i<sizeo
22020 66 28 61 7a 44 69 72 73 29 2f 73 69 7a 65 6f 66  f(azDirs)/sizeof
22030 28 61 7a 44 69 72 73 5b 30 5d 29 3b 20 7a 44 69  (azDirs[0]); zDi
22040 72 3d 61 7a 44 69 72 73 5b 69 2b 2b 5d 29 7b 0a  r=azDirs[i++]){.
22050 20 20 20 20 20 20 76 6f 69 64 20 2a 7a 43 6f 6e        void *zCon
22060 76 65 72 74 65 64 3b 0a 20 20 20 20 20 20 69 66  verted;.      if
22070 28 20 7a 44 69 72 3d 3d 30 20 29 20 63 6f 6e 74  ( zDir==0 ) cont
22080 69 6e 75 65 3b 0a 20 20 20 20 20 20 2f 2a 20 49  inue;.      /* I
22090 66 20 74 68 65 20 70 61 74 68 20 73 74 61 72 74  f the path start
220a0 73 20 77 69 74 68 20 61 20 64 72 69 76 65 20 6c  s with a drive l
220b0 65 74 74 65 72 20 66 6f 6c 6c 6f 77 65 64 20 62  etter followed b
220c0 79 20 74 68 65 20 63 6f 6c 6f 6e 0a 20 20 20 20  y the colon.    
220d0 20 20 2a 2a 20 63 68 61 72 61 63 74 65 72 2c 20    ** character, 
220e0 61 73 73 75 6d 65 20 69 74 20 69 73 20 61 6c 72  assume it is alr
220f0 65 61 64 79 20 61 20 6e 61 74 69 76 65 20 57 69  eady a native Wi
22100 6e 33 32 20 70 61 74 68 3b 20 6f 74 68 65 72 77  n32 path; otherw
22110 69 73 65 2c 0a 20 20 20 20 20 20 2a 2a 20 69 74  ise,.      ** it
22120 20 6d 75 73 74 20 62 65 20 63 6f 6e 76 65 72 74   must be convert
22130 65 64 20 74 6f 20 61 20 6e 61 74 69 76 65 20 57  ed to a native W
22140 69 6e 33 32 20 70 61 74 68 20 76 69 61 20 74 68  in32 path via th
22150 65 20 43 79 67 77 69 6e 20 41 50 49 0a 20 20 20  e Cygwin API.   
22160 20 20 20 2a 2a 20 70 72 69 6f 72 20 74 6f 20 75     ** prior to u
22170 73 69 6e 67 20 69 74 2e 0a 20 20 20 20 20 20 2a  sing it..      *
22180 2f 0a 20 20 20 20 20 20 69 66 28 20 77 69 6e 49  /.      if( winI
22190 73 44 72 69 76 65 4c 65 74 74 65 72 41 6e 64 43  sDriveLetterAndC
221a0 6f 6c 6f 6e 28 7a 44 69 72 29 20 29 7b 0a 20 20  olon(zDir) ){.  
221b0 20 20 20 20 20 20 7a 43 6f 6e 76 65 72 74 65 64        zConverted
221c0 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74 46 72 6f   = winConvertFro
221d0 6d 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 44  mUtf8Filename(zD
221e0 69 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ir);.        if(
221f0 20 21 7a 43 6f 6e 76 65 72 74 65 64 20 29 7b 0a   !zConverted ){.
22200 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
22210 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20  3_free(zBuf);.  
22220 20 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28          OSTRACE(
22230 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20  ("TEMP-FILENAME 
22240 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rc=SQLITE_IOERR_
22250 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20  NOMEM\n"));.    
22260 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
22270 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b  ITE_IOERR_NOMEM;
22280 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
22290 20 20 20 69 66 28 20 77 69 6e 49 73 44 69 72 28     if( winIsDir(
222a0 7a 43 6f 6e 76 65 72 74 65 64 29 20 29 7b 0a 20  zConverted) ){. 
222b0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
222c0 5f 73 6e 70 72 69 6e 74 66 28 6e 4d 61 78 2c 20  _snprintf(nMax, 
222d0 7a 42 75 66 2c 20 22 25 73 22 2c 20 7a 44 69 72  zBuf, "%s", zDir
222e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
222f0 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65  ite3_free(zConve
22300 72 74 65 64 29 3b 0a 20 20 20 20 20 20 20 20 20  rted);.         
22310 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
22320 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
22330 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
22340 64 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  d);.      }else{
22350 0a 20 20 20 20 20 20 20 20 7a 43 6f 6e 76 65 72  .        zConver
22360 74 65 64 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  ted = sqlite3Mal
22370 6c 6f 63 5a 65 72 6f 28 20 6e 4d 61 78 2b 31 20  locZero( nMax+1 
22380 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  );.        if( !
22390 7a 43 6f 6e 76 65 72 74 65 64 20 29 7b 0a 20 20  zConverted ){.  
223a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
223b0 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20  free(zBuf);.    
223c0 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
223d0 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63  TEMP-FILENAME rc
223e0 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f  =SQLITE_IOERR_NO
223f0 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20  MEM\n"));.      
22400 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
22410 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20  E_IOERR_NOMEM;. 
22420 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
22430 20 69 66 28 20 63 79 67 77 69 6e 5f 63 6f 6e 76   if( cygwin_conv
22440 5f 70 61 74 68 28 0a 20 20 20 20 20 20 20 20 20  _path(.         
22450 20 20 20 20 20 20 20 6f 73 49 73 4e 54 28 29 20         osIsNT() 
22460 3f 20 43 43 50 5f 50 4f 53 49 58 5f 54 4f 5f 57  ? CCP_POSIX_TO_W
22470 49 4e 5f 57 20 3a 20 43 43 50 5f 50 4f 53 49 58  IN_W : CCP_POSIX
22480 5f 54 4f 5f 57 49 4e 5f 41 2c 20 7a 44 69 72 2c  _TO_WIN_A, zDir,
22490 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
224a0 20 7a 43 6f 6e 76 65 72 74 65 64 2c 20 6e 4d 61   zConverted, nMa
224b0 78 2b 31 29 3c 30 20 29 7b 0a 20 20 20 20 20 20  x+1)<0 ){.      
224c0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
224d0 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
224e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
224f0 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20  free(zBuf);.    
22500 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
22510 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63  TEMP-FILENAME rc
22520 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4f  =SQLITE_IOERR_CO
22530 4e 56 50 41 54 48 5c 6e 22 29 29 3b 0a 20 20 20  NVPATH\n"));.   
22540 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69         return wi
22550 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
22560 5f 49 4f 45 52 52 5f 43 4f 4e 56 50 41 54 48 2c  _IOERR_CONVPATH,
22570 20 28 44 57 4f 52 44 29 65 72 72 6e 6f 2c 0a 20   (DWORD)errno,. 
22580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22590 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
225a0 47 65 74 54 65 6d 70 6e 61 6d 65 32 22 2c 20 7a  GetTempname2", z
225b0 44 69 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Dir);.        }.
225c0 20 20 20 20 20 20 20 20 69 66 28 20 77 69 6e 49          if( winI
225d0 73 44 69 72 28 7a 43 6f 6e 76 65 72 74 65 64 29  sDir(zConverted)
225e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
225f0 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   At this point, 
22600 77 65 20 6b 6e 6f 77 20 74 68 65 20 63 61 6e 64  we know the cand
22610 69 64 61 74 65 20 64 69 72 65 63 74 6f 72 79 20  idate directory 
22620 65 78 69 73 74 73 20 61 6e 64 20 73 68 6f 75 6c  exists and shoul
22630 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62  d.          ** b
22640 65 20 75 73 65 64 2e 20 20 48 6f 77 65 76 65 72  e used.  However
22650 2c 20 77 65 20 6d 61 79 20 6e 65 65 64 20 74 6f  , we may need to
22660 20 63 6f 6e 76 65 72 74 20 74 68 65 20 73 74 72   convert the str
22670 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 20  ing containing. 
22680 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74 73 20           ** its 
22690 6e 61 6d 65 20 69 6e 74 6f 20 55 54 46 2d 38 20  name into UTF-8 
226a0 28 69 2e 65 2e 20 69 66 20 69 74 20 69 73 20 55  (i.e. if it is U
226b0 54 46 2d 31 36 20 72 69 67 68 74 20 6e 6f 77 29  TF-16 right now)
226c0 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
226d0 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a           char *z
226e0 55 74 66 38 20 3d 20 77 69 6e 43 6f 6e 76 65 72  Utf8 = winConver
226f0 74 54 6f 55 74 66 38 46 69 6c 65 6e 61 6d 65 28  tToUtf8Filename(
22700 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20  zConverted);.   
22710 20 20 20 20 20 20 20 69 66 28 20 21 7a 55 74 66         if( !zUtf
22720 38 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  8 ){.           
22730 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
22740 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20  onverted);.     
22750 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
22760 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20  ree(zBuf);.     
22770 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28         OSTRACE((
22780 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72  "TEMP-FILENAME r
22790 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  c=SQLITE_IOERR_N
227a0 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 20  OMEM\n"));.     
227b0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
227c0 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
227d0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
227e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
227f0 73 6e 70 72 69 6e 74 66 28 6e 4d 61 78 2c 20 7a  snprintf(nMax, z
22800 42 75 66 2c 20 22 25 73 22 2c 20 7a 55 74 66 38  Buf, "%s", zUtf8
22810 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
22820 69 74 65 33 5f 66 72 65 65 28 7a 55 74 66 38 29  ite3_free(zUtf8)
22830 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
22840 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
22850 74 65 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ted);.          
22860 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
22870 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
22880 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
22890 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
228a0 0a 20 20 7d 0a 23 65 6c 69 66 20 21 53 51 4c 49  .  }.#elif !SQLI
228b0 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 21  TE_OS_WINRT && !
228c0 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e  defined(__CYGWIN
228d0 5f 5f 29 0a 20 20 65 6c 73 65 20 69 66 28 20 6f  __).  else if( o
228e0 73 49 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 63  sIsNT() ){.    c
228f0 68 61 72 20 2a 7a 4d 75 6c 74 69 3b 0a 20 20 20  har *zMulti;.   
22900 20 4c 50 57 53 54 52 20 7a 57 69 64 65 50 61 74   LPWSTR zWidePat
22910 68 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  h = sqlite3Mallo
22920 63 5a 65 72 6f 28 20 6e 4d 61 78 2a 73 69 7a 65  cZero( nMax*size
22930 6f 66 28 57 43 48 41 52 29 20 29 3b 0a 20 20 20  of(WCHAR) );.   
22940 20 69 66 28 20 21 7a 57 69 64 65 50 61 74 68 20   if( !zWidePath 
22950 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
22960 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20  _free(zBuf);.   
22970 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d     OSTRACE(("TEM
22980 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51  P-FILENAME rc=SQ
22990 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
229a0 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 72 65 74  \n"));.      ret
229b0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
229c0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
229d0 20 20 69 66 28 20 6f 73 47 65 74 54 65 6d 70 50    if( osGetTempP
229e0 61 74 68 57 28 6e 4d 61 78 2c 20 7a 57 69 64 65  athW(nMax, zWide
229f0 50 61 74 68 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Path)==0 ){.    
22a00 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
22a10 57 69 64 65 50 61 74 68 29 3b 0a 20 20 20 20 20  WidePath);.     
22a20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42   sqlite3_free(zB
22a30 75 66 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41  uf);.      OSTRA
22a40 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41  CE(("TEMP-FILENA
22a50 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45  ME rc=SQLITE_IOE
22a60 52 52 5f 47 45 54 54 45 4d 50 50 41 54 48 5c 6e  RR_GETTEMPPATH\n
22a70 22 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  "));.      retur
22a80 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  n winLogError(SQ
22a90 4c 49 54 45 5f 49 4f 45 52 52 5f 47 45 54 54 45  LITE_IOERR_GETTE
22aa0 4d 50 50 41 54 48 2c 20 6f 73 47 65 74 4c 61 73  MPPATH, osGetLas
22ab0 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20  tError(),.      
22ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ad0 20 20 20 22 77 69 6e 47 65 74 54 65 6d 70 6e 61     "winGetTempna
22ae0 6d 65 32 22 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  me2", 0);.    }.
22af0 20 20 20 20 7a 4d 75 6c 74 69 20 3d 20 77 69 6e      zMulti = win
22b00 55 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 57  UnicodeToUtf8(zW
22b10 69 64 65 50 61 74 68 29 3b 0a 20 20 20 20 69 66  idePath);.    if
22b20 28 20 7a 4d 75 6c 74 69 20 29 7b 0a 20 20 20 20  ( zMulti ){.    
22b30 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
22b40 74 66 28 6e 4d 61 78 2c 20 7a 42 75 66 2c 20 22  tf(nMax, zBuf, "
22b50 25 73 22 2c 20 7a 4d 75 6c 74 69 29 3b 0a 20 20  %s", zMulti);.  
22b60 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
22b70 28 7a 4d 75 6c 74 69 29 3b 0a 20 20 20 20 20 20  (zMulti);.      
22b80 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 57 69  sqlite3_free(zWi
22b90 64 65 50 61 74 68 29 3b 0a 20 20 20 20 7d 65 6c  dePath);.    }el
22ba0 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
22bb0 33 5f 66 72 65 65 28 7a 57 69 64 65 50 61 74 68  3_free(zWidePath
22bc0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
22bd0 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20  _free(zBuf);.   
22be0 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d     OSTRACE(("TEM
22bf0 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51  P-FILENAME rc=SQ
22c00 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
22c10 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 72 65 74  \n"));.      ret
22c20 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
22c30 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
22c40 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
22c50 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20  WIN32_HAS_ANSI. 
22c60 20 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20   else{.    char 
22c70 2a 7a 55 74 66 38 3b 0a 20 20 20 20 63 68 61 72  *zUtf8;.    char
22c80 20 2a 7a 4d 62 63 73 50 61 74 68 20 3d 20 73 71   *zMbcsPath = sq
22c90 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
22ca0 20 6e 4d 61 78 20 29 3b 0a 20 20 20 20 69 66 28   nMax );.    if(
22cb0 20 21 7a 4d 62 63 73 50 61 74 68 20 29 7b 0a 20   !zMbcsPath ){. 
22cc0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
22cd0 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 4f  e(zBuf);.      O
22ce0 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49  STRACE(("TEMP-FI
22cf0 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45  LENAME rc=SQLITE
22d00 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29  _IOERR_NOMEM\n")
22d10 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
22d20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
22d30 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  EM;.    }.    if
22d40 28 20 6f 73 47 65 74 54 65 6d 70 50 61 74 68 41  ( osGetTempPathA
22d50 28 6e 4d 61 78 2c 20 7a 4d 62 63 73 50 61 74 68  (nMax, zMbcsPath
22d60 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  )==0 ){.      sq
22d70 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29  lite3_free(zBuf)
22d80 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  ;.      OSTRACE(
22d90 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20  ("TEMP-FILENAME 
22da0 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rc=SQLITE_IOERR_
22db0 47 45 54 54 45 4d 50 50 41 54 48 5c 6e 22 29 29  GETTEMPPATH\n"))
22dc0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 77  ;.      return w
22dd0 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
22de0 45 5f 49 4f 45 52 52 5f 47 45 54 54 45 4d 50 50  E_IOERR_GETTEMPP
22df0 41 54 48 2c 20 6f 73 47 65 74 4c 61 73 74 45 72  ATH, osGetLastEr
22e00 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20  ror(),.         
22e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e20 22 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65 33  "winGetTempname3
22e30 22 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ", 0);.    }.   
22e40 20 7a 55 74 66 38 20 3d 20 73 71 6c 69 74 65 33   zUtf8 = sqlite3
22e50 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75  _win32_mbcs_to_u
22e60 74 66 38 28 7a 4d 62 63 73 50 61 74 68 29 3b 0a  tf8(zMbcsPath);.
22e70 20 20 20 20 69 66 28 20 7a 55 74 66 38 20 29 7b      if( zUtf8 ){
22e80 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
22e90 6e 70 72 69 6e 74 66 28 6e 4d 61 78 2c 20 7a 42  nprintf(nMax, zB
22ea0 75 66 2c 20 22 25 73 22 2c 20 7a 55 74 66 38 29  uf, "%s", zUtf8)
22eb0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
22ec0 66 72 65 65 28 7a 55 74 66 38 29 3b 0a 20 20 20  free(zUtf8);.   
22ed0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
22ee0 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29  lite3_free(zBuf)
22ef0 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  ;.      OSTRACE(
22f00 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20  ("TEMP-FILENAME 
22f10 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rc=SQLITE_IOERR_
22f20 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20  NOMEM\n"));.    
22f30 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
22f40 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  IOERR_NOMEM;.   
22f50 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a   }.  }.#endif /*
22f60 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41   SQLITE_WIN32_HA
22f70 53 5f 41 4e 53 49 20 2a 2f 0a 23 65 6e 64 69 66  S_ANSI */.#endif
22f80 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57   /* !SQLITE_OS_W
22f90 49 4e 52 54 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20  INRT */..  /*.  
22fa0 2a 2a 20 43 68 65 63 6b 20 74 6f 20 6d 61 6b 65  ** Check to make
22fb0 20 73 75 72 65 20 74 68 65 20 74 65 6d 70 6f 72   sure the tempor
22fc0 61 72 79 20 64 69 72 65 63 74 6f 72 79 20 65 6e  ary directory en
22fd0 64 73 20 77 69 74 68 20 61 6e 20 61 70 70 72 6f  ds with an appro
22fe0 70 72 69 61 74 65 0a 20 20 2a 2a 20 73 65 70 61  priate.  ** sepa
22ff0 72 61 74 6f 72 2e 20 20 49 66 20 69 74 20 64 6f  rator.  If it do
23000 65 73 20 6e 6f 74 20 61 6e 64 20 74 68 65 72 65  es not and there
23010 20 69 73 20 6e 6f 74 20 65 6e 6f 75 67 68 20 73   is not enough s
23020 70 61 63 65 20 6c 65 66 74 20 74 6f 20 61 64 64  pace left to add
23030 0a 20 20 2a 2a 20 6f 6e 65 2c 20 66 61 69 6c 2e  .  ** one, fail.
23040 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 77 69 6e  .  */.  if( !win
23050 4d 61 6b 65 45 6e 64 49 6e 44 69 72 53 65 70 28  MakeEndInDirSep(
23060 6e 44 69 72 2b 31 2c 20 7a 42 75 66 29 20 29 7b  nDir+1, zBuf) ){
23070 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
23080 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 4f 53 54  e(zBuf);.    OST
23090 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45  RACE(("TEMP-FILE
230a0 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 45  NAME rc=SQLITE_E
230b0 52 52 4f 52 5c 6e 22 29 29 3b 0a 20 20 20 20 72  RROR\n"));.    r
230c0 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f  eturn winLogErro
230d0 72 28 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20  r(SQLITE_ERROR, 
230e0 30 2c 20 22 77 69 6e 47 65 74 54 65 6d 70 6e 61  0, "winGetTempna
230f0 6d 65 34 22 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20  me4", 0);.  }.. 
23100 20 2f 2a 0a 20 20 2a 2a 20 43 68 65 63 6b 20 74   /*.  ** Check t
23110 68 61 74 20 74 68 65 20 6f 75 74 70 75 74 20 62  hat the output b
23120 75 66 66 65 72 20 69 73 20 6c 61 72 67 65 20 65  uffer is large e
23130 6e 6f 75 67 68 20 66 6f 72 20 74 68 65 20 74 65  nough for the te
23140 6d 70 6f 72 61 72 79 20 66 69 6c 65 0a 20 20 2a  mporary file.  *
23150 2a 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 66 6f  * name in the fo
23160 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 61 74 3a 0a  llowing format:.
23170 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 22 3c 74 65    **.  **   "<te
23180 6d 70 6f 72 61 72 79 5f 64 69 72 65 63 74 6f 72  mporary_director
23190 79 3e 2f 65 74 69 6c 71 73 5f 58 58 58 58 58 58  y>/etilqs_XXXXXX
231a0 58 58 58 58 58 58 58 58 58 5c 30 5c 30 22 0a 20  XXXXXXXXX\0\0". 
231b0 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 6e 6f 74 2c   **.  ** If not,
231c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
231d0 52 52 4f 52 2e 20 20 54 68 65 20 6e 75 6d 62 65  RROR.  The numbe
231e0 72 20 31 37 20 69 73 20 75 73 65 64 20 68 65 72  r 17 is used her
231f0 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 0a 20 20  e in order to.  
23200 2a 2a 20 61 63 63 6f 75 6e 74 20 66 6f 72 20 74  ** account for t
23210 68 65 20 73 70 61 63 65 20 75 73 65 64 20 62 79  he space used by
23220 20 74 68 65 20 31 35 20 63 68 61 72 61 63 74 65   the 15 characte
23230 72 20 72 61 6e 64 6f 6d 20 73 75 66 66 69 78 20  r random suffix 
23240 61 6e 64 20 74 68 65 0a 20 20 2a 2a 20 74 77 6f  and the.  ** two
23250 20 74 72 61 69 6c 69 6e 67 20 4e 55 4c 20 63 68   trailing NUL ch
23260 61 72 61 63 74 65 72 73 2e 20 20 54 68 65 20 66  aracters.  The f
23270 69 6e 61 6c 20 64 69 72 65 63 74 6f 72 79 20 73  inal directory s
23280 65 70 61 72 61 74 6f 72 20 63 68 61 72 61 63 74  eparator charact
23290 65 72 0a 20 20 2a 2a 20 68 61 73 20 61 6c 72 65  er.  ** has alre
232a0 61 64 79 20 61 64 64 65 64 20 69 66 20 69 74 20  ady added if it 
232b0 77 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20  was not already 
232c0 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20  present..  */.  
232d0 6e 4c 65 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  nLen = sqlite3St
232e0 72 6c 65 6e 33 30 28 7a 42 75 66 29 3b 0a 20 20  rlen30(zBuf);.  
232f0 69 66 28 20 28 6e 4c 65 6e 20 2b 20 6e 50 72 65  if( (nLen + nPre
23300 20 2b 20 31 37 29 20 3e 20 6e 42 75 66 20 29 7b   + 17) > nBuf ){
23310 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
23320 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 4f 53 54  e(zBuf);.    OST
23330 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45  RACE(("TEMP-FILE
23340 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 45  NAME rc=SQLITE_E
23350 52 52 4f 52 5c 6e 22 29 29 3b 0a 20 20 20 20 72  RROR\n"));.    r
23360 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f  eturn winLogErro
23370 72 28 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20  r(SQLITE_ERROR, 
23380 30 2c 20 22 77 69 6e 47 65 74 54 65 6d 70 6e 61  0, "winGetTempna
23390 6d 65 35 22 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20  me5", 0);.  }.. 
233a0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
233b0 66 28 6e 42 75 66 2d 31 36 2d 6e 4c 65 6e 2c 20  f(nBuf-16-nLen, 
233c0 7a 42 75 66 2b 6e 4c 65 6e 2c 20 53 51 4c 49 54  zBuf+nLen, SQLIT
233d0 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46  E_TEMP_FILE_PREF
233e0 49 58 29 3b 0a 0a 20 20 6a 20 3d 20 73 71 6c 69  IX);..  j = sqli
233f0 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 42 75 66  te3Strlen30(zBuf
23400 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 61 6e  );.  sqlite3_ran
23410 64 6f 6d 6e 65 73 73 28 31 35 2c 20 26 7a 42 75  domness(15, &zBu
23420 66 5b 6a 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30  f[j]);.  for(i=0
23430 3b 20 69 3c 31 35 3b 20 69 2b 2b 2c 20 6a 2b 2b  ; i<15; i++, j++
23440 29 7b 0a 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d  ){.    zBuf[j] =
23450 20 28 63 68 61 72 29 7a 43 68 61 72 73 5b 20 28   (char)zChars[ (
23460 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 7a  (unsigned char)z
23470 42 75 66 5b 6a 5d 29 25 28 73 69 7a 65 6f 66 28  Buf[j])%(sizeof(
23480 7a 43 68 61 72 73 29 2d 31 29 20 5d 3b 0a 20 20  zChars)-1) ];.  
23490 7d 0a 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 30 3b  }.  zBuf[j] = 0;
234a0 0a 20 20 7a 42 75 66 5b 6a 2b 31 5d 20 3d 20 30  .  zBuf[j+1] = 0
234b0 3b 0a 20 20 2a 70 7a 42 75 66 20 3d 20 7a 42 75  ;.  *pzBuf = zBu
234c0 66 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22  f;..  OSTRACE(("
234d0 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 6e 61  TEMP-FILENAME na
234e0 6d 65 3d 25 73 2c 20 72 63 3d 53 51 4c 49 54 45  me=%s, rc=SQLITE
234f0 5f 4f 4b 5c 6e 22 2c 20 7a 42 75 66 29 29 3b 0a  _OK\n", zBuf));.
23500 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
23510 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  OK;.}../*.** Ret
23520 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
23530 6e 61 6d 65 64 20 66 69 6c 65 20 69 73 20 72 65  named file is re
23540 61 6c 6c 79 20 61 20 64 69 72 65 63 74 6f 72 79  ally a directory
23550 2e 20 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20  .  Return false 
23560 69 66 0a 2a 2a 20 69 74 20 69 73 20 73 6f 6d 65  if.** it is some
23570 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e  thing other than
23580 20 61 20 64 69 72 65 63 74 6f 72 79 2c 20 6f 72   a directory, or
23590 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 79   if there is any
235a0 20 6b 69 6e 64 20 6f 66 20 6d 65 6d 6f 72 79 0a   kind of memory.
235b0 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61  ** allocation fa
235c0 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  ilure..*/.static
235d0 20 69 6e 74 20 77 69 6e 49 73 44 69 72 28 63 6f   int winIsDir(co
235e0 6e 73 74 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65  nst void *zConve
235f0 72 74 65 64 29 7b 0a 20 20 44 57 4f 52 44 20 61  rted){.  DWORD a
23600 74 74 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ttr;.  int rc = 
23610 30 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45  0;.  DWORD lastE
23620 72 72 6e 6f 3b 0a 0a 20 20 69 66 28 20 6f 73 49  rrno;..  if( osI
23630 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 69 6e 74  sNT() ){.    int
23640 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 57 49   cnt = 0;.    WI
23650 4e 33 32 5f 46 49 4c 45 5f 41 54 54 52 49 42 55  N32_FILE_ATTRIBU
23660 54 45 5f 44 41 54 41 20 73 41 74 74 72 44 61 74  TE_DATA sAttrDat
23670 61 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73  a;.    memset(&s
23680 41 74 74 72 44 61 74 61 2c 20 30 2c 20 73 69 7a  AttrData, 0, siz
23690 65 6f 66 28 73 41 74 74 72 44 61 74 61 29 29 3b  eof(sAttrData));
236a0 0a 20 20 20 20 77 68 69 6c 65 28 20 21 28 72 63  .    while( !(rc
236b0 20 3d 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72   = osGetFileAttr
236c0 69 62 75 74 65 73 45 78 57 28 28 4c 50 43 57 53  ibutesExW((LPCWS
236d0 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20  TR)zConverted,. 
236e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
236f0 20 20 20 20 20 20 20 20 20 20 20 20 47 65 74 46              GetF
23700 69 6c 65 45 78 49 6e 66 6f 53 74 61 6e 64 61 72  ileExInfoStandar
23710 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
23720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23730 26 73 41 74 74 72 44 61 74 61 29 29 20 26 26 20  &sAttrData)) && 
23740 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28 26 63  winRetryIoerr(&c
23750 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20  nt, &lastErrno) 
23760 29 7b 7d 0a 20 20 20 20 69 66 28 20 21 72 63 20  ){}.    if( !rc 
23770 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
23780 30 3b 20 2f 2a 20 49 6e 76 61 6c 69 64 20 6e 61  0; /* Invalid na
23790 6d 65 3f 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  me? */.    }.   
237a0 20 61 74 74 72 20 3d 20 73 41 74 74 72 44 61 74   attr = sAttrDat
237b0 61 2e 64 77 46 69 6c 65 41 74 74 72 69 62 75 74  a.dwFileAttribut
237c0 65 73 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  es;.#if SQLITE_O
237d0 53 5f 57 49 4e 43 45 3d 3d 30 0a 20 20 7d 65 6c  S_WINCE==0.  }el
237e0 73 65 7b 0a 20 20 20 20 61 74 74 72 20 3d 20 6f  se{.    attr = o
237f0 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74  sGetFileAttribut
23800 65 73 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76  esA((char*)zConv
23810 65 72 74 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20  erted);.#endif. 
23820 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 61 74 74   }.  return (att
23830 72 21 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f  r!=INVALID_FILE_
23840 41 54 54 52 49 42 55 54 45 53 29 20 26 26 20 28  ATTRIBUTES) && (
23850 61 74 74 72 26 46 49 4c 45 5f 41 54 54 52 49 42  attr&FILE_ATTRIB
23860 55 54 45 5f 44 49 52 45 43 54 4f 52 59 29 3b 0a  UTE_DIRECTORY);.
23870 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20  }../*.** Open a 
23880 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
23890 69 6e 74 20 77 69 6e 4f 70 65 6e 28 0a 20 20 73  int winOpen(.  s
238a0 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
238b0 2c 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64  ,        /* Used
238c0 20 74 6f 20 67 65 74 20 6d 61 78 69 6d 75 6d 20   to get maximum 
238d0 70 61 74 68 20 6e 61 6d 65 20 6c 65 6e 67 74 68  path name length
238e0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
238f0 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20   *zName,        
23900 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66  /* Name of the f
23910 69 6c 65 20 28 55 54 46 2d 38 29 20 2a 2f 0a 20  ile (UTF-8) */. 
23920 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69   sqlite3_file *i
23930 64 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72  d,         /* Wr
23940 69 74 65 20 74 68 65 20 53 51 4c 69 74 65 20 66  ite the SQLite f
23950 69 6c 65 20 68 61 6e 64 6c 65 20 68 65 72 65 20  ile handle here 
23960 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
23970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23980 2a 20 4f 70 65 6e 20 6d 6f 64 65 20 66 6c 61 67  * Open mode flag
23990 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4f 75 74  s */.  int *pOut
239a0 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  Flags           
239b0 20 2f 2a 20 53 74 61 74 75 73 20 72 65 74 75 72   /* Status retur
239c0 6e 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20  n flags */.){.  
239d0 48 41 4e 44 4c 45 20 68 3b 0a 20 20 44 57 4f 52  HANDLE h;.  DWOR
239e0 44 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b  D lastErrno = 0;
239f0 0a 20 20 44 57 4f 52 44 20 64 77 44 65 73 69 72  .  DWORD dwDesir
23a00 65 64 41 63 63 65 73 73 3b 0a 20 20 44 57 4f 52  edAccess;.  DWOR
23a10 44 20 64 77 53 68 61 72 65 4d 6f 64 65 3b 0a 20  D dwShareMode;. 
23a20 20 44 57 4f 52 44 20 64 77 43 72 65 61 74 69 6f   DWORD dwCreatio
23a30 6e 44 69 73 70 6f 73 69 74 69 6f 6e 3b 0a 20 20  nDisposition;.  
23a40 44 57 4f 52 44 20 64 77 46 6c 61 67 73 41 6e 64  DWORD dwFlagsAnd
23a50 41 74 74 72 69 62 75 74 65 73 20 3d 20 30 3b 0a  Attributes = 0;.
23a60 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
23a70 4e 43 45 0a 20 20 69 6e 74 20 69 73 54 65 6d 70  NCE.  int isTemp
23a80 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 77   = 0;.#endif.  w
23a90 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  inFile *pFile = 
23aa0 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20  (winFile*)id;.  
23ab0 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64  void *zConverted
23ac0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
23ad0 2a 20 46 69 6c 65 6e 61 6d 65 20 69 6e 20 4f 53  * Filename in OS
23ae0 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 63   encoding */.  c
23af0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 74 66 38  onst char *zUtf8
23b00 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 20 2f 2a  Name = zName; /*
23b10 20 46 69 6c 65 6e 61 6d 65 20 69 6e 20 55 54 46   Filename in UTF
23b20 2d 38 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20  -8 encoding */. 
23b30 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 0a 20   int cnt = 0;.. 
23b40 20 2f 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20   /* If argument 
23b50 7a 50 61 74 68 20 69 73 20 61 20 4e 55 4c 4c 20  zPath is a NULL 
23b60 70 6f 69 6e 74 65 72 2c 20 74 68 69 73 20 66 75  pointer, this fu
23b70 6e 63 74 69 6f 6e 20 69 73 20 72 65 71 75 69 72  nction is requir
23b80 65 64 20 74 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20  ed to open.  ** 
23b90 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
23ba0 2e 20 55 73 65 20 74 68 69 73 20 62 75 66 66 65  . Use this buffe
23bb0 72 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 66  r to store the f
23bc0 69 6c 65 20 6e 61 6d 65 20 69 6e 2e 0a 20 20 2a  ile name in..  *
23bd0 2f 0a 20 20 63 68 61 72 20 2a 7a 54 6d 70 6e 61  /.  char *zTmpna
23be0 6d 65 20 3d 20 30 3b 20 2f 2a 20 46 6f 72 20 74  me = 0; /* For t
23bf0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 6e 61 6d  emporary filenam
23c00 65 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  e, if necessary.
23c10 20 2a 2f 0a 0a 20 20 69 6e 74 20 72 63 20 3d 20   */..  int rc = 
23c20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
23c30 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f        /* Functio
23c40 6e 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f  n Return Code */
23c50 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44  .#if !defined(ND
23c60 45 42 55 47 29 20 7c 7c 20 53 51 4c 49 54 45 5f  EBUG) || SQLITE_
23c70 4f 53 5f 57 49 4e 43 45 0a 20 20 69 6e 74 20 65  OS_WINCE.  int e
23c80 54 79 70 65 20 3d 20 66 6c 61 67 73 26 30 78 46  Type = flags&0xF
23c90 46 46 46 46 46 30 30 3b 20 20 2f 2a 20 54 79 70  FFFFF00;  /* Typ
23ca0 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 6f 70 65  e of file to ope
23cb0 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 69  n */.#endif..  i
23cc0 6e 74 20 69 73 45 78 63 6c 75 73 69 76 65 20 20  nt isExclusive  
23cd0 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
23ce0 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45  E_OPEN_EXCLUSIVE
23cf0 29 3b 0a 20 20 69 6e 74 20 69 73 44 65 6c 65 74  );.  int isDelet
23d00 65 20 20 20 20 20 3d 20 28 66 6c 61 67 73 20 26  e     = (flags &
23d10 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c   SQLITE_OPEN_DEL
23d20 45 54 45 4f 4e 43 4c 4f 53 45 29 3b 0a 20 20 69  ETEONCLOSE);.  i
23d30 6e 74 20 69 73 43 72 65 61 74 65 20 20 20 20 20  nt isCreate     
23d40 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
23d50 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a  E_OPEN_CREATE);.
23d60 20 20 69 6e 74 20 69 73 52 65 61 64 6f 6e 6c 79    int isReadonly
23d70 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51     = (flags & SQ
23d80 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
23d90 4c 59 29 3b 0a 20 20 69 6e 74 20 69 73 52 65 61  LY);.  int isRea
23da0 64 57 72 69 74 65 20 20 3d 20 28 66 6c 61 67 73  dWrite  = (flags
23db0 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   & SQLITE_OPEN_R
23dc0 45 41 44 57 52 49 54 45 29 3b 0a 0a 23 69 66 6e  EADWRITE);..#ifn
23dd0 64 65 66 20 4e 44 45 42 55 47 0a 20 20 69 6e 74  def NDEBUG.  int
23de0 20 69 73 4f 70 65 6e 4a 6f 75 72 6e 61 6c 20 3d   isOpenJournal =
23df0 20 28 69 73 43 72 65 61 74 65 20 26 26 20 28 0a   (isCreate && (.
23e00 20 20 20 20 20 20 20 20 65 54 79 70 65 3d 3d 53          eType==S
23e10 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45  QLITE_OPEN_MASTE
23e20 52 5f 4a 4f 55 52 4e 41 4c 0a 20 20 20 20 20 7c  R_JOURNAL.     |
23e30 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
23e40 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
23e50 4c 0a 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d  L.     || eType=
23e60 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c  =SQLITE_OPEN_WAL
23e70 0a 20 20 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  .  ));.#endif.. 
23e80 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 20   OSTRACE(("OPEN 
23e90 6e 61 6d 65 3d 25 73 2c 20 70 46 69 6c 65 3d 25  name=%s, pFile=%
23ea0 70 2c 20 66 6c 61 67 73 3d 25 78 2c 20 70 4f 75  p, flags=%x, pOu
23eb0 74 46 6c 61 67 73 3d 25 70 5c 6e 22 2c 0a 20 20  tFlags=%p\n",.  
23ec0 20 20 20 20 20 20 20 20 20 7a 55 74 66 38 4e 61           zUtf8Na
23ed0 6d 65 2c 20 69 64 2c 20 66 6c 61 67 73 2c 20 70  me, id, flags, p
23ee0 4f 75 74 46 6c 61 67 73 29 29 3b 0a 0a 20 20 2f  OutFlags));..  /
23ef0 2a 20 43 68 65 63 6b 20 74 68 65 20 66 6f 6c 6c  * Check the foll
23f00 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73  owing statements
23f10 20 61 72 65 20 74 72 75 65 3a 0a 20 20 2a 2a 0a   are true:.  **.
23f20 20 20 2a 2a 20 20 20 28 61 29 20 45 78 61 63 74    **   (a) Exact
23f30 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 52 45  ly one of the RE
23f40 41 44 57 52 49 54 45 20 61 6e 64 20 52 45 41 44  ADWRITE and READ
23f50 4f 4e 4c 59 20 66 6c 61 67 73 20 6d 75 73 74 20  ONLY flags must 
23f60 62 65 20 73 65 74 2c 20 61 6e 64 0a 20 20 2a 2a  be set, and.  **
23f70 20 20 20 28 62 29 20 69 66 20 43 52 45 41 54 45     (b) if CREATE
23f80 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 52 45   is set, then RE
23f90 41 44 57 52 49 54 45 20 6d 75 73 74 20 61 6c 73  ADWRITE must als
23fa0 6f 20 62 65 20 73 65 74 2c 20 61 6e 64 0a 20 20  o be set, and.  
23fb0 2a 2a 20 20 20 28 63 29 20 69 66 20 45 58 43 4c  **   (c) if EXCL
23fc0 55 53 49 56 45 20 69 73 20 73 65 74 2c 20 74 68  USIVE is set, th
23fd0 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74 20 61  en CREATE must a
23fe0 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a 2a  lso be set..  **
23ff0 20 20 20 28 64 29 20 69 66 20 44 45 4c 45 54 45     (d) if DELETE
24000 4f 4e 43 4c 4f 53 45 20 69 73 20 73 65 74 2c 20  ONCLOSE is set, 
24010 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74  then CREATE must
24020 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20   also be set..  
24030 2a 2f 0a 20 20 61 73 73 65 72 74 28 28 69 73 52  */.  assert((isR
24040 65 61 64 6f 6e 6c 79 3d 3d 30 20 7c 7c 20 69 73  eadonly==0 || is
24050 52 65 61 64 57 72 69 74 65 3d 3d 30 29 20 26 26  ReadWrite==0) &&
24060 20 28 69 73 52 65 61 64 57 72 69 74 65 20 7c 7c   (isReadWrite ||
24070 20 69 73 52 65 61 64 6f 6e 6c 79 29 29 3b 0a 20   isReadonly));. 
24080 20 61 73 73 65 72 74 28 69 73 43 72 65 61 74 65   assert(isCreate
24090 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57 72 69  ==0 || isReadWri
240a0 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73  te);.  assert(is
240b0 45 78 63 6c 75 73 69 76 65 3d 3d 30 20 7c 7c 20  Exclusive==0 || 
240c0 69 73 43 72 65 61 74 65 29 3b 0a 20 20 61 73 73  isCreate);.  ass
240d0 65 72 74 28 69 73 44 65 6c 65 74 65 3d 3d 30 20  ert(isDelete==0 
240e0 7c 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 0a 20  || isCreate);.. 
240f0 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 44 42 2c   /* The main DB,
24100 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 57   main journal, W
24110 41 4c 20 66 69 6c 65 20 61 6e 64 20 6d 61 73 74  AL file and mast
24120 65 72 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20 6e  er journal are n
24130 65 76 65 72 0a 20 20 2a 2a 20 61 75 74 6f 6d 61  ever.  ** automa
24140 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 2e  tically deleted.
24150 20 4e 6f 72 20 61 72 65 20 74 68 65 79 20 65 76   Nor are they ev
24160 65 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  er temporary fil
24170 65 73 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  es.  */.  assert
24180 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20  ( (!isDelete && 
24190 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21  zName) || eType!
241a0 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
241b0 4e 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74  N_DB );.  assert
241c0 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20  ( (!isDelete && 
241d0 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21  zName) || eType!
241e0 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
241f0 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 61  N_JOURNAL );.  a
24200 73 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74  ssert( (!isDelet
24210 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65  e && zName) || e
24220 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45  Type!=SQLITE_OPE
24230 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c  N_MASTER_JOURNAL
24240 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21   );.  assert( (!
24250 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d  isDelete && zNam
24260 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c  e) || eType!=SQL
24270 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 29 3b 0a  ITE_OPEN_WAL );.
24280 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61  .  /* Assert tha
24290 74 20 74 68 65 20 75 70 70 65 72 20 6c 61 79 65  t the upper laye
242a0 72 20 68 61 73 20 73 65 74 20 6f 6e 65 20 6f 66  r has set one of
242b0 20 74 68 65 20 22 66 69 6c 65 2d 74 79 70 65 22   the "file-type"
242c0 20 66 6c 61 67 73 2e 20 2a 2f 0a 20 20 61 73 73   flags. */.  ass
242d0 65 72 74 28 20 65 54 79 70 65 3d 3d 53 51 4c 49  ert( eType==SQLI
242e0 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20  TE_OPEN_MAIN_DB 
242f0 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53       || eType==S
24300 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
24310 44 42 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79  DB.       || eTy
24320 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
24330 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20  MAIN_JOURNAL || 
24340 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
24350 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 0a  EN_TEMP_JOURNAL.
24360 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d         || eType=
24370 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42  =SQLITE_OPEN_SUB
24380 4a 4f 55 52 4e 41 4c 20 20 20 7c 7c 20 65 54 79  JOURNAL   || eTy
24390 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
243a0 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 0a 20  MASTER_JOURNAL. 
243b0 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d        || eType==
243c0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e  SQLITE_OPEN_TRAN
243d0 53 49 45 4e 54 5f 44 42 20 7c 7c 20 65 54 79 70  SIENT_DB || eTyp
243e0 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57  e==SQLITE_OPEN_W
243f0 41 4c 0a 20 20 29 3b 0a 0a 20 20 61 73 73 65 72  AL.  );..  asser
24400 74 28 20 70 46 69 6c 65 21 3d 30 20 29 3b 0a 20  t( pFile!=0 );. 
24410 20 6d 65 6d 73 65 74 28 70 46 69 6c 65 2c 20 30   memset(pFile, 0
24420 2c 20 73 69 7a 65 6f 66 28 77 69 6e 46 69 6c 65  , sizeof(winFile
24430 29 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 68 20 3d  ));.  pFile->h =
24440 20 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f   INVALID_HANDLE_
24450 56 41 4c 55 45 3b 0a 0a 23 69 66 20 53 51 4c 49  VALUE;..#if SQLI
24460 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 69 66  TE_OS_WINRT.  if
24470 28 20 21 7a 55 74 66 38 4e 61 6d 65 20 26 26 20  ( !zUtf8Name && 
24480 21 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69  !sqlite3_temp_di
24490 72 65 63 74 6f 72 79 20 29 7b 0a 20 20 20 20 73  rectory ){.    s
244a0 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
244b0 45 5f 45 52 52 4f 52 2c 0a 20 20 20 20 20 20 20  E_ERROR,.       
244c0 20 22 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64   "sqlite3_temp_d
244d0 69 72 65 63 74 6f 72 79 20 76 61 72 69 61 62 6c  irectory variabl
244e0 65 20 73 68 6f 75 6c 64 20 62 65 20 73 65 74 20  e should be set 
244f0 66 6f 72 20 57 69 6e 52 54 22 29 3b 0a 20 20 7d  for WinRT");.  }
24500 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66  .#endif..  /* If
24510 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
24520 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
24530 63 74 69 6f 6e 20 69 73 20 4e 55 4c 4c 2c 20 67  ction is NULL, g
24540 65 6e 65 72 61 74 65 20 61 0a 20 20 2a 2a 20 74  enerate a.  ** t
24550 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6e 61  emporary file na
24560 6d 65 20 74 6f 20 75 73 65 0a 20 20 2a 2f 0a 20  me to use.  */. 
24570 20 69 66 28 20 21 7a 55 74 66 38 4e 61 6d 65 20   if( !zUtf8Name 
24580 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  ){.    assert( i
24590 73 44 65 6c 65 74 65 20 26 26 20 21 69 73 4f 70  sDelete && !isOp
245a0 65 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20  enJournal );.   
245b0 20 72 63 20 3d 20 77 69 6e 47 65 74 54 65 6d 70   rc = winGetTemp
245c0 6e 61 6d 65 28 70 56 66 73 2c 20 26 7a 54 6d 70  name(pVfs, &zTmp
245d0 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 72  name);.    if( r
245e0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
245f0 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
24600 4f 50 45 4e 20 6e 61 6d 65 3d 25 73 2c 20 72 63  OPEN name=%s, rc
24610 3d 25 73 22 2c 20 7a 55 74 66 38 4e 61 6d 65 2c  =%s", zUtf8Name,
24620 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28   sqlite3ErrName(
24630 72 63 29 29 29 3b 0a 20 20 20 20 20 20 72 65 74  rc)));.      ret
24640 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
24650 20 20 7a 55 74 66 38 4e 61 6d 65 20 3d 20 7a 54    zUtf8Name = zT
24660 6d 70 6e 61 6d 65 3b 0a 20 20 7d 0a 0a 20 20 2f  mpname;.  }..  /
24670 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 6e  * Database filen
24680 61 6d 65 73 20 61 72 65 20 64 6f 75 62 6c 65 2d  ames are double-
24690 7a 65 72 6f 20 74 65 72 6d 69 6e 61 74 65 64 20  zero terminated 
246a0 69 66 20 74 68 65 79 20 61 72 65 20 6e 6f 74 0a  if they are not.
246b0 20 20 2a 2a 20 55 52 49 73 20 77 69 74 68 20 70    ** URIs with p
246c0 61 72 61 6d 65 74 65 72 73 2e 20 20 48 65 6e 63  arameters.  Henc
246d0 65 2c 20 74 68 65 79 20 63 61 6e 20 61 6c 77 61  e, they can alwa
246e0 79 73 20 62 65 20 70 61 73 73 65 64 20 69 6e 74  ys be passed int
246f0 6f 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 75  o.  ** sqlite3_u
24700 72 69 5f 70 61 72 61 6d 65 74 65 72 28 29 2e 0a  ri_parameter()..
24710 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28    */.  assert( (
24720 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50  eType!=SQLITE_OP
24730 45 4e 5f 4d 41 49 4e 5f 44 42 29 20 7c 7c 20 28  EN_MAIN_DB) || (
24740 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
24750 50 45 4e 5f 55 52 49 29 20 7c 7c 0a 20 20 20 20  PEN_URI) ||.    
24760 20 20 20 7a 55 74 66 38 4e 61 6d 65 5b 73 71 6c     zUtf8Name[sql
24770 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 55 74  ite3Strlen30(zUt
24780 66 38 4e 61 6d 65 29 2b 31 5d 3d 3d 30 20 29 3b  f8Name)+1]==0 );
24790 0a 0a 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74  ..  /* Convert t
247a0 68 65 20 66 69 6c 65 6e 61 6d 65 20 74 6f 20 74  he filename to t
247b0 68 65 20 73 79 73 74 65 6d 20 65 6e 63 6f 64 69  he system encodi
247c0 6e 67 2e 20 2a 2f 0a 20 20 7a 43 6f 6e 76 65 72  ng. */.  zConver
247d0 74 65 64 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74  ted = winConvert
247e0 46 72 6f 6d 55 74 66 38 46 69 6c 65 6e 61 6d 65  FromUtf8Filename
247f0 28 7a 55 74 66 38 4e 61 6d 65 29 3b 0a 20 20 69  (zUtf8Name);.  i
24800 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30  f( zConverted==0
24810 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
24820 66 72 65 65 28 7a 54 6d 70 6e 61 6d 65 29 3b 0a  free(zTmpname);.
24830 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50      OSTRACE(("OP
24840 45 4e 20 6e 61 6d 65 3d 25 73 2c 20 72 63 3d 53  EN name=%s, rc=S
24850 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
24860 4d 22 2c 20 7a 55 74 66 38 4e 61 6d 65 29 29 3b  M", zUtf8Name));
24870 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
24880 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a  TE_IOERR_NOMEM;.
24890 20 20 7d 0a 0a 20 20 69 66 28 20 77 69 6e 49 73    }..  if( winIs
248a0 44 69 72 28 7a 43 6f 6e 76 65 72 74 65 64 29 20  Dir(zConverted) 
248b0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
248c0 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
248d0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
248e0 65 28 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20  e(zTmpname);.   
248f0 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 20   OSTRACE(("OPEN 
24900 6e 61 6d 65 3d 25 73 2c 20 72 63 3d 53 51 4c 49  name=%s, rc=SQLI
24910 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 49 53 44 49  TE_CANTOPEN_ISDI
24920 52 22 2c 20 7a 55 74 66 38 4e 61 6d 65 29 29 3b  R", zUtf8Name));
24930 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
24940 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 49 53 44 49  TE_CANTOPEN_ISDI
24950 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69 73  R;.  }..  if( is
24960 52 65 61 64 57 72 69 74 65 20 29 7b 0a 20 20 20  ReadWrite ){.   
24970 20 64 77 44 65 73 69 72 65 64 41 63 63 65 73 73   dwDesiredAccess
24980 20 3d 20 47 45 4e 45 52 49 43 5f 52 45 41 44 20   = GENERIC_READ 
24990 7c 20 47 45 4e 45 52 49 43 5f 57 52 49 54 45 3b  | GENERIC_WRITE;
249a0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 77  .  }else{.    dw
249b0 44 65 73 69 72 65 64 41 63 63 65 73 73 20 3d 20  DesiredAccess = 
249c0 47 45 4e 45 52 49 43 5f 52 45 41 44 3b 0a 20 20  GENERIC_READ;.  
249d0 7d 0a 0a 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  }..  /* SQLITE_O
249e0 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 69 73  PEN_EXCLUSIVE is
249f0 20 75 73 65 64 20 74 6f 20 6d 61 6b 65 20 73 75   used to make su
24a00 72 65 20 74 68 61 74 20 61 20 6e 65 77 20 66 69  re that a new fi
24a10 6c 65 20 69 73 0a 20 20 2a 2a 20 63 72 65 61 74  le is.  ** creat
24a20 65 64 2e 20 53 51 4c 69 74 65 20 64 6f 65 73 6e  ed. SQLite doesn
24a30 27 74 20 75 73 65 20 69 74 20 74 6f 20 69 6e 64  't use it to ind
24a40 69 63 61 74 65 20 22 65 78 63 6c 75 73 69 76 65  icate "exclusive
24a50 20 61 63 63 65 73 73 22 0a 20 20 2a 2a 20 61 73   access".  ** as
24a60 20 69 74 20 69 73 20 75 73 75 61 6c 6c 79 20 75   it is usually u
24a70 6e 64 65 72 73 74 6f 6f 64 2e 0a 20 20 2a 2f 0a  nderstood..  */.
24a80 20 20 69 66 28 20 69 73 45 78 63 6c 75 73 69 76    if( isExclusiv
24a90 65 20 29 7b 0a 20 20 20 20 2f 2a 20 43 72 65 61  e ){.    /* Crea
24aa0 74 65 73 20 61 20 6e 65 77 20 66 69 6c 65 2c 20  tes a new file, 
24ab0 6f 6e 6c 79 20 69 66 20 69 74 20 64 6f 65 73 20  only if it does 
24ac0 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69 73  not already exis
24ad0 74 2e 20 2a 2f 0a 20 20 20 20 2f 2a 20 49 66 20  t. */.    /* If 
24ae0 74 68 65 20 66 69 6c 65 20 65 78 69 73 74 73 2c  the file exists,
24af0 20 69 74 20 66 61 69 6c 73 2e 20 2a 2f 0a 20 20   it fails. */.  
24b00 20 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70    dwCreationDisp
24b10 6f 73 69 74 69 6f 6e 20 3d 20 43 52 45 41 54 45  osition = CREATE
24b20 5f 4e 45 57 3b 0a 20 20 7d 65 6c 73 65 20 69 66  _NEW;.  }else if
24b30 28 20 69 73 43 72 65 61 74 65 20 29 7b 0a 20 20  ( isCreate ){.  
24b40 20 20 2f 2a 20 4f 70 65 6e 20 65 78 69 73 74 69    /* Open existi
24b50 6e 67 20 66 69 6c 65 2c 20 6f 72 20 63 72 65 61  ng file, or crea
24b60 74 65 20 69 66 20 69 74 20 64 6f 65 73 6e 27 74  te if it doesn't
24b70 20 65 78 69 73 74 20 2a 2f 0a 20 20 20 20 64 77   exist */.    dw
24b80 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74  CreationDisposit
24b90 69 6f 6e 20 3d 20 4f 50 45 4e 5f 41 4c 57 41 59  ion = OPEN_ALWAY
24ba0 53 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  S;.  }else{.    
24bb0 2f 2a 20 4f 70 65 6e 73 20 61 20 66 69 6c 65 2c  /* Opens a file,
24bc0 20 6f 6e 6c 79 20 69 66 20 69 74 20 65 78 69 73   only if it exis
24bd0 74 73 2e 20 2a 2f 0a 20 20 20 20 64 77 43 72 65  ts. */.    dwCre
24be0 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e  ationDisposition
24bf0 20 3d 20 4f 50 45 4e 5f 45 58 49 53 54 49 4e 47   = OPEN_EXISTING
24c00 3b 0a 20 20 7d 0a 0a 20 20 64 77 53 68 61 72 65  ;.  }..  dwShare
24c10 4d 6f 64 65 20 3d 20 46 49 4c 45 5f 53 48 41 52  Mode = FILE_SHAR
24c20 45 5f 52 45 41 44 20 7c 20 46 49 4c 45 5f 53 48  E_READ | FILE_SH
24c30 41 52 45 5f 57 52 49 54 45 3b 0a 0a 20 20 69 66  ARE_WRITE;..  if
24c40 28 20 69 73 44 65 6c 65 74 65 20 29 7b 0a 23 69  ( isDelete ){.#i
24c50 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
24c60 45 0a 20 20 20 20 64 77 46 6c 61 67 73 41 6e 64  E.    dwFlagsAnd
24c70 41 74 74 72 69 62 75 74 65 73 20 3d 20 46 49 4c  Attributes = FIL
24c80 45 5f 41 54 54 52 49 42 55 54 45 5f 48 49 44 44  E_ATTRIBUTE_HIDD
24c90 45 4e 3b 0a 20 20 20 20 69 73 54 65 6d 70 20 3d  EN;.    isTemp =
24ca0 20 31 3b 0a 23 65 6c 73 65 0a 20 20 20 20 64 77   1;.#else.    dw
24cb0 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74  FlagsAndAttribut
24cc0 65 73 20 3d 20 46 49 4c 45 5f 41 54 54 52 49 42  es = FILE_ATTRIB
24cd0 55 54 45 5f 54 45 4d 50 4f 52 41 52 59 0a 20 20  UTE_TEMPORARY.  
24ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 46               | F
24d00 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 48 49  ILE_ATTRIBUTE_HI
24d10 44 44 45 4e 0a 20 20 20 20 20 20 20 20 20 20 20  DDEN.           
24d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24d30 20 20 20 20 7c 20 46 49 4c 45 5f 46 4c 41 47 5f      | FILE_FLAG_
24d40 44 45 4c 45 54 45 5f 4f 4e 5f 43 4c 4f 53 45 3b  DELETE_ON_CLOSE;
24d50 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b  .#endif.  }else{
24d60 0a 20 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41  .    dwFlagsAndA
24d70 74 74 72 69 62 75 74 65 73 20 3d 20 46 49 4c 45  ttributes = FILE
24d80 5f 41 54 54 52 49 42 55 54 45 5f 4e 4f 52 4d 41  _ATTRIBUTE_NORMA
24d90 4c 3b 0a 20 20 7d 0a 20 20 2f 2a 20 52 65 70 6f  L;.  }.  /* Repo
24da0 72 74 73 20 66 72 6f 6d 20 74 68 65 20 69 6e 74  rts from the int
24db0 65 72 6e 65 74 20 61 72 65 20 74 68 61 74 20 70  ernet are that p
24dc0 65 72 66 6f 72 6d 61 6e 63 65 20 69 73 20 61 6c  erformance is al
24dd0 77 61 79 73 0a 20 20 2a 2a 20 62 65 74 74 65 72  ways.  ** better
24de0 20 69 66 20 46 49 4c 45 5f 46 4c 41 47 5f 52 41   if FILE_FLAG_RA
24df0 4e 44 4f 4d 5f 41 43 43 45 53 53 20 69 73 20 75  NDOM_ACCESS is u
24e00 73 65 64 2e 20 20 54 69 63 6b 65 74 20 23 32 36  sed.  Ticket #26
24e10 39 39 2e 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54  99. */.#if SQLIT
24e20 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 64 77 46  E_OS_WINCE.  dwF
24e30 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65  lagsAndAttribute
24e40 73 20 7c 3d 20 46 49 4c 45 5f 46 4c 41 47 5f 52  s |= FILE_FLAG_R
24e50 41 4e 44 4f 4d 5f 41 43 43 45 53 53 3b 0a 23 65  ANDOM_ACCESS;.#e
24e60 6e 64 69 66 0a 0a 20 20 69 66 28 20 6f 73 49 73  ndif..  if( osIs
24e70 4e 54 28 29 20 29 7b 0a 23 69 66 20 53 51 4c 49  NT() ){.#if SQLI
24e80 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20  TE_OS_WINRT.    
24e90 43 52 45 41 54 45 46 49 4c 45 32 5f 45 58 54 45  CREATEFILE2_EXTE
24ea0 4e 44 45 44 5f 50 41 52 41 4d 45 54 45 52 53 20  NDED_PARAMETERS 
24eb0 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74 65  extendedParamete
24ec0 72 73 3b 0a 20 20 20 20 65 78 74 65 6e 64 65 64  rs;.    extended
24ed0 50 61 72 61 6d 65 74 65 72 73 2e 64 77 53 69 7a  Parameters.dwSiz
24ee0 65 20 3d 20 73 69 7a 65 6f 66 28 43 52 45 41 54  e = sizeof(CREAT
24ef0 45 46 49 4c 45 32 5f 45 58 54 45 4e 44 45 44 5f  EFILE2_EXTENDED_
24f00 50 41 52 41 4d 45 54 45 52 53 29 3b 0a 20 20 20  PARAMETERS);.   
24f10 20 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74   extendedParamet
24f20 65 72 73 2e 64 77 46 69 6c 65 41 74 74 72 69 62  ers.dwFileAttrib
24f30 75 74 65 73 20 3d 0a 20 20 20 20 20 20 20 20 20  utes =.         
24f40 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74     dwFlagsAndAtt
24f50 72 69 62 75 74 65 73 20 26 20 46 49 4c 45 5f 41  ributes & FILE_A
24f60 54 54 52 49 42 55 54 45 5f 4d 41 53 4b 3b 0a 20  TTRIBUTE_MASK;. 
24f70 20 20 20 65 78 74 65 6e 64 65 64 50 61 72 61 6d     extendedParam
24f80 65 74 65 72 73 2e 64 77 46 69 6c 65 46 6c 61 67  eters.dwFileFlag
24f90 73 20 3d 20 64 77 46 6c 61 67 73 41 6e 64 41 74  s = dwFlagsAndAt
24fa0 74 72 69 62 75 74 65 73 20 26 20 46 49 4c 45 5f  tributes & FILE_
24fb0 46 4c 41 47 5f 4d 41 53 4b 3b 0a 20 20 20 20 65  FLAG_MASK;.    e
24fc0 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72  xtendedParameter
24fd0 73 2e 64 77 53 65 63 75 72 69 74 79 51 6f 73 46  s.dwSecurityQosF
24fe0 6c 61 67 73 20 3d 20 53 45 43 55 52 49 54 59 5f  lags = SECURITY_
24ff0 41 4e 4f 4e 59 4d 4f 55 53 3b 0a 20 20 20 20 65  ANONYMOUS;.    e
25000 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72  xtendedParameter
25010 73 2e 6c 70 53 65 63 75 72 69 74 79 41 74 74 72  s.lpSecurityAttr
25020 69 62 75 74 65 73 20 3d 20 4e 55 4c 4c 3b 0a 20  ibutes = NULL;. 
25030 20 20 20 65 78 74 65 6e 64 65 64 50 61 72 61 6d     extendedParam
25040 65 74 65 72 73 2e 68 54 65 6d 70 6c 61 74 65 46  eters.hTemplateF
25050 69 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  ile = NULL;.    
25060 77 68 69 6c 65 28 20 28 68 20 3d 20 6f 73 43 72  while( (h = osCr
25070 65 61 74 65 46 69 6c 65 32 28 28 4c 50 43 57 53  eateFile2((LPCWS
25080 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20  TR)zConverted,. 
25090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
250a0 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77 44               dwD
250b0 65 73 69 72 65 64 41 63 63 65 73 73 2c 0a 20 20  esiredAccess,.  
250c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
250d0 20 20 20 20 20 20 20 20 20 20 20 20 64 77 53 68              dwSh
250e0 61 72 65 4d 6f 64 65 2c 0a 20 20 20 20 20 20 20  areMode,.       
250f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25100 20 20 20 20 20 20 20 64 77 43 72 65 61 74 69 6f         dwCreatio
25110 6e 44 69 73 70 6f 73 69 74 69 6f 6e 2c 0a 20 20  nDisposition,.  
25120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25130 20 20 20 20 20 20 20 20 20 20 20 20 26 65 78 74              &ext
25140 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73 29  endedParameters)
25150 29 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c  )==INVALID_HANDL
25160 45 5f 56 41 4c 55 45 20 26 26 0a 20 20 20 20 20  E_VALUE &&.     
25170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25180 20 20 20 20 20 20 20 20 20 77 69 6e 52 65 74 72           winRetr
25190 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c 61  yIoerr(&cnt, &la
251a0 73 74 45 72 72 6e 6f 29 20 29 7b 0a 20 20 20 20  stErrno) ){.    
251b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f             /* No
251c0 6f 70 20 2a 2f 0a 20 20 20 20 7d 0a 23 65 6c 73  op */.    }.#els
251d0 65 0a 20 20 20 20 77 68 69 6c 65 28 20 28 68 20  e.    while( (h 
251e0 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65 57 28  = osCreateFileW(
251f0 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72  (LPCWSTR)zConver
25200 74 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ted,.           
25210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25220 20 20 20 64 77 44 65 73 69 72 65 64 41 63 63 65     dwDesiredAcce
25230 73 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ss,.            
25240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25250 20 20 64 77 53 68 61 72 65 4d 6f 64 65 2c 20 4e    dwShareMode, N
25260 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ULL,.           
25270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25280 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73     dwCreationDis
25290 70 6f 73 69 74 69 6f 6e 2c 0a 20 20 20 20 20 20  position,.      
252a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
252b0 20 20 20 20 20 20 20 20 64 77 46 6c 61 67 73 41          dwFlagsA
252c0 6e 64 41 74 74 72 69 62 75 74 65 73 2c 0a 20 20  ndAttributes,.  
252d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
252e0 20 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c              NULL
252f0 29 29 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44  ))==INVALID_HAND
25300 4c 45 5f 56 41 4c 55 45 20 26 26 0a 20 20 20 20  LE_VALUE &&.    
25310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25320 20 20 20 20 20 20 20 20 20 20 77 69 6e 52 65 74            winRet
25330 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c  ryIoerr(&cnt, &l
25340 61 73 74 45 72 72 6e 6f 29 20 29 7b 0a 20 20 20  astErrno) ){.   
25350 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
25360 6f 6f 70 20 2a 2f 0a 20 20 20 20 7d 0a 23 65 6e  oop */.    }.#en
25370 64 69 66 0a 20 20 7d 0a 23 69 66 64 65 66 20 53  dif.  }.#ifdef S
25380 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
25390 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20  ANSI.  else{.   
253a0 20 77 68 69 6c 65 28 20 28 68 20 3d 20 6f 73 43   while( (h = osC
253b0 72 65 61 74 65 46 69 6c 65 41 28 28 4c 50 43 53  reateFileA((LPCS
253c0 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20  TR)zConverted,. 
253d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
253e0 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77 44               dwD
253f0 65 73 69 72 65 64 41 63 63 65 73 73 2c 0a 20 20  esiredAccess,.  
25400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25410 20 20 20 20 20 20 20 20 20 20 20 20 64 77 53 68              dwSh
25420 61 72 65 4d 6f 64 65 2c 20 4e 55 4c 4c 2c 0a 20  areMode, NULL,. 
25430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25440 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77 43               dwC
25450 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69  reationDispositi
25460 6f 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  on,.            
25470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25480 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72    dwFlagsAndAttr
25490 69 62 75 74 65 73 2c 0a 20 20 20 20 20 20 20 20  ibutes,.        
254a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
254b0 20 20 20 20 20 20 4e 55 4c 4c 29 29 3d 3d 49 4e        NULL))==IN
254c0 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c  VALID_HANDLE_VAL
254d0 55 45 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  UE &&.          
254e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
254f0 20 20 20 20 77 69 6e 52 65 74 72 79 49 6f 65 72      winRetryIoer
25500 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72  r(&cnt, &lastErr
25510 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  no) ){.         
25520 20 20 20 20 20 20 2f 2a 20 4e 6f 6f 70 20 2a 2f        /* Noop */
25530 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
25540 66 0a 20 20 77 69 6e 4c 6f 67 49 6f 65 72 72 28  f.  winLogIoerr(
25550 63 6e 74 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45  cnt);..  OSTRACE
25560 28 28 22 4f 50 45 4e 20 66 69 6c 65 3d 25 70 2c  (("OPEN file=%p,
25570 20 6e 61 6d 65 3d 25 73 2c 20 61 63 63 65 73 73   name=%s, access
25580 3d 25 6c 78 2c 20 72 63 3d 25 73 5c 6e 22 2c 20  =%lx, rc=%s\n", 
25590 68 2c 20 7a 55 74 66 38 4e 61 6d 65 2c 0a 20 20  h, zUtf8Name,.  
255a0 20 20 20 20 20 20 20 20 20 64 77 44 65 73 69 72           dwDesir
255b0 65 64 41 63 63 65 73 73 2c 20 28 68 3d 3d 49 4e  edAccess, (h==IN
255c0 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c  VALID_HANDLE_VAL
255d0 55 45 29 20 3f 20 22 66 61 69 6c 65 64 22 20 3a  UE) ? "failed" :
255e0 20 22 6f 6b 22 29 29 3b 0a 0a 20 20 69 66 28 20   "ok"));..  if( 
255f0 68 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c  h==INVALID_HANDL
25600 45 5f 56 41 4c 55 45 20 29 7b 0a 20 20 20 20 70  E_VALUE ){.    p
25610 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
25620 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20  = lastErrno;.   
25630 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
25640 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2c 20 70 46  ITE_CANTOPEN, pF
25650 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 20  ile->lastErrno, 
25660 22 77 69 6e 4f 70 65 6e 22 2c 20 7a 55 74 66 38  "winOpen", zUtf8
25670 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  Name);.    sqlit
25680 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74  e3_free(zConvert
25690 65 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ed);.    sqlite3
256a0 5f 66 72 65 65 28 7a 54 6d 70 6e 61 6d 65 29 3b  _free(zTmpname);
256b0 0a 20 20 20 20 69 66 28 20 69 73 52 65 61 64 57  .    if( isReadW
256c0 72 69 74 65 20 26 26 20 21 69 73 45 78 63 6c 75  rite && !isExclu
256d0 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20 72 65  sive ){.      re
256e0 74 75 72 6e 20 77 69 6e 4f 70 65 6e 28 70 56 66  turn winOpen(pVf
256f0 73 2c 20 7a 4e 61 6d 65 2c 20 69 64 2c 0a 20 20  s, zName, id,.  
25700 20 20 20 20 20 20 20 28 28 66 6c 61 67 73 7c 53         ((flags|S
25710 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
25720 4e 4c 59 29 20 26 0a 20 20 20 20 20 20 20 20 20  NLY) &.         
25730 20 20 20 20 20 20 20 20 20 20 20 20 7e 28 53 51              ~(SQ
25740 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
25750 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  |SQLITE_OPEN_REA
25760 44 57 52 49 54 45 29 29 2c 0a 20 20 20 20 20 20  DWRITE)),.      
25770 20 20 20 70 4f 75 74 46 6c 61 67 73 29 3b 0a 20     pOutFlags);. 
25780 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
25790 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41  return SQLITE_CA
257a0 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20  NTOPEN_BKPT;.   
257b0 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4f   }.  }..  if( pO
257c0 75 74 46 6c 61 67 73 20 29 7b 0a 20 20 20 20 69  utFlags ){.    i
257d0 66 28 20 69 73 52 65 61 64 57 72 69 74 65 20 29  f( isReadWrite )
257e0 7b 0a 20 20 20 20 20 20 2a 70 4f 75 74 46 6c 61  {.      *pOutFla
257f0 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs = SQLITE_OPEN
25800 5f 52 45 41 44 57 52 49 54 45 3b 0a 20 20 20 20  _READWRITE;.    
25810 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 4f  }else{.      *pO
25820 75 74 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45  utFlags = SQLITE
25830 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a  _OPEN_READONLY;.
25840 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 4f 53 54      }.  }..  OST
25850 52 41 43 45 28 28 22 4f 50 45 4e 20 66 69 6c 65  RACE(("OPEN file
25860 3d 25 70 2c 20 6e 61 6d 65 3d 25 73 2c 20 61 63  =%p, name=%s, ac
25870 63 65 73 73 3d 25 6c 78 2c 20 70 4f 75 74 46 6c  cess=%lx, pOutFl
25880 61 67 73 3d 25 70 2c 20 2a 70 4f 75 74 46 6c 61  ags=%p, *pOutFla
25890 67 73 3d 25 64 2c 20 22 0a 20 20 20 20 20 20 20  gs=%d, ".       
258a0 20 20 20 20 22 72 63 3d 25 73 5c 6e 22 2c 20 68      "rc=%s\n", h
258b0 2c 20 7a 55 74 66 38 4e 61 6d 65 2c 20 64 77 44  , zUtf8Name, dwD
258c0 65 73 69 72 65 64 41 63 63 65 73 73 2c 20 70 4f  esiredAccess, pO
258d0 75 74 46 6c 61 67 73 2c 20 70 4f 75 74 46 6c 61  utFlags, pOutFla
258e0 67 73 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20  gs ?.           
258f0 2a 70 4f 75 74 46 6c 61 67 73 20 3a 20 30 2c 20  *pOutFlags : 0, 
25900 28 68 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44  (h==INVALID_HAND
25910 4c 45 5f 56 41 4c 55 45 29 20 3f 20 22 66 61 69  LE_VALUE) ? "fai
25920 6c 65 64 22 20 3a 20 22 6f 6b 22 29 29 3b 0a 0a  led" : "ok"));..
25930 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
25940 4e 43 45 0a 20 20 69 66 28 20 69 73 52 65 61 64  NCE.  if( isRead
25950 57 72 69 74 65 20 26 26 20 65 54 79 70 65 3d 3d  Write && eType==
25960 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
25970 5f 44 42 0a 20 20 20 20 20 20 20 26 26 20 28 72  _DB.       && (r
25980 63 20 3d 20 77 69 6e 63 65 43 72 65 61 74 65 4c  c = winceCreateL
25990 6f 63 6b 28 7a 4e 61 6d 65 2c 20 70 46 69 6c 65  ock(zName, pFile
259a0 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20  ))!=SQLITE_OK.  
259b0 29 7b 0a 20 20 20 20 6f 73 43 6c 6f 73 65 48 61  ){.    osCloseHa
259c0 6e 64 6c 65 28 68 29 3b 0a 20 20 20 20 73 71 6c  ndle(h);.    sql
259d0 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65  ite3_free(zConve
259e0 72 74 65 64 29 3b 0a 20 20 20 20 73 71 6c 69 74  rted);.    sqlit
259f0 65 33 5f 66 72 65 65 28 7a 54 6d 70 6e 61 6d 65  e3_free(zTmpname
25a00 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  );.    OSTRACE((
25a10 22 4f 50 45 4e 2d 43 45 2d 4c 4f 43 4b 20 6e 61  "OPEN-CE-LOCK na
25a20 6d 65 3d 25 73 2c 20 72 63 3d 25 73 5c 6e 22 2c  me=%s, rc=%s\n",
25a30 20 7a 4e 61 6d 65 2c 20 73 71 6c 69 74 65 33 45   zName, sqlite3E
25a40 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20  rrName(rc)));.  
25a50 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
25a60 0a 20 20 69 66 28 20 69 73 54 65 6d 70 20 29 7b  .  if( isTemp ){
25a70 0a 20 20 20 20 70 46 69 6c 65 2d 3e 7a 44 65 6c  .    pFile->zDel
25a80 65 74 65 4f 6e 43 6c 6f 73 65 20 3d 20 7a 43 6f  eteOnClose = zCo
25a90 6e 76 65 72 74 65 64 3b 0a 20 20 7d 65 6c 73 65  nverted;.  }else
25aa0 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20  .#endif.  {.    
25ab0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
25ac0 6e 76 65 72 74 65 64 29 3b 0a 20 20 7d 0a 0a 20  nverted);.  }.. 
25ad0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54   sqlite3_free(zT
25ae0 6d 70 6e 61 6d 65 29 3b 0a 20 20 70 46 69 6c 65  mpname);.  pFile
25af0 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 26 77 69 6e  ->pMethod = &win
25b00 49 6f 4d 65 74 68 6f 64 3b 0a 20 20 70 46 69 6c  IoMethod;.  pFil
25b10 65 2d 3e 70 56 66 73 20 3d 20 70 56 66 73 3b 0a  e->pVfs = pVfs;.
25b20 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 68 3b 0a    pFile->h = h;.
25b30 20 20 69 66 28 20 69 73 52 65 61 64 6f 6e 6c 79    if( isReadonly
25b40 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63   ){.    pFile->c
25b50 74 72 6c 46 6c 61 67 73 20 7c 3d 20 57 49 4e 46  trlFlags |= WINF
25b60 49 4c 45 5f 52 44 4f 4e 4c 59 3b 0a 20 20 7d 0a  ILE_RDONLY;.  }.
25b70 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 75 72    if( sqlite3_ur
25b80 69 5f 62 6f 6f 6c 65 61 6e 28 7a 4e 61 6d 65 2c  i_boolean(zName,
25b90 20 22 70 73 6f 77 22 2c 20 53 51 4c 49 54 45 5f   "psow", SQLITE_
25ba0 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52  POWERSAFE_OVERWR
25bb0 49 54 45 29 20 29 7b 0a 20 20 20 20 70 46 69 6c  ITE) ){.    pFil
25bc0 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20  e->ctrlFlags |= 
25bd0 57 49 4e 46 49 4c 45 5f 50 53 4f 57 3b 0a 20 20  WINFILE_PSOW;.  
25be0 7d 0a 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  }.  pFile->lastE
25bf0 72 72 6e 6f 20 3d 20 4e 4f 5f 45 52 52 4f 52 3b  rrno = NO_ERROR;
25c00 0a 20 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 20  .  pFile->zPath 
25c10 3d 20 7a 4e 61 6d 65 3b 0a 23 69 66 20 53 51 4c  = zName;.#if SQL
25c20 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
25c30 45 3e 30 0a 20 20 70 46 69 6c 65 2d 3e 68 4d 61  E>0.  pFile->hMa
25c40 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20 70 46 69 6c  p = NULL;.  pFil
25c50 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 3d 20  e->pMapRegion = 
25c60 30 3b 0a 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70  0;.  pFile->mmap
25c70 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 46 69 6c  Size = 0;.  pFil
25c80 65 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61  e->mmapSizeActua
25c90 6c 20 3d 20 30 3b 0a 20 20 70 46 69 6c 65 2d 3e  l = 0;.  pFile->
25ca0 6d 6d 61 70 53 69 7a 65 4d 61 78 20 3d 20 73 71  mmapSizeMax = sq
25cb0 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
25cc0 67 2e 73 7a 4d 6d 61 70 3b 0a 23 65 6e 64 69 66  g.szMmap;.#endif
25cd0 0a 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28  ..  OpenCounter(
25ce0 2b 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  +1);.  return rc
25cf0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  ;.}../*.** Delet
25d00 65 20 74 68 65 20 6e 61 6d 65 64 20 66 69 6c 65  e the named file
25d10 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
25d20 74 20 57 69 6e 64 6f 77 73 20 64 6f 65 73 20 6e  t Windows does n
25d30 6f 74 20 61 6c 6c 6f 77 20 61 20 66 69 6c 65 20  ot allow a file 
25d40 74 6f 20 62 65 20 64 65 6c 65 74 65 64 20 69 66  to be deleted if
25d50 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 70   some other.** p
25d60 72 6f 63 65 73 73 20 68 61 73 20 69 74 20 6f 70  rocess has it op
25d70 65 6e 2e 20 20 53 6f 6d 65 74 69 6d 65 73 20 61  en.  Sometimes a
25d80 20 76 69 72 75 73 20 73 63 61 6e 6e 65 72 20 6f   virus scanner o
25d90 72 20 69 6e 64 65 78 69 6e 67 20 70 72 6f 67 72  r indexing progr
25da0 61 6d 0a 2a 2a 20 77 69 6c 6c 20 6f 70 65 6e 20  am.** will open 
25db0 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73  a journal file s
25dc0 68 6f 72 74 6c 79 20 61 66 74 65 72 20 69 74 20  hortly after it 
25dd0 69 73 20 63 72 65 61 74 65 64 20 69 6e 20 6f 72  is created in or
25de0 64 65 72 20 74 6f 20 64 6f 0a 2a 2a 20 77 68 61  der to do.** wha
25df0 74 65 76 65 72 20 69 74 20 64 6f 65 73 2e 20 20  tever it does.  
25e00 57 68 69 6c 65 20 74 68 69 73 20 6f 74 68 65 72  While this other
25e10 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64   process is hold
25e20 69 6e 67 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20  ing the.** file 
25e30 6f 70 65 6e 2c 20 77 65 20 77 69 6c 6c 20 62 65  open, we will be
25e40 20 75 6e 61 62 6c 65 20 74 6f 20 64 65 6c 65 74   unable to delet
25e50 65 20 69 74 2e 20 20 54 6f 20 77 6f 72 6b 20 61  e it.  To work a
25e60 72 6f 75 6e 64 20 74 68 69 73 0a 2a 2a 20 70 72  round this.** pr
25e70 6f 62 6c 65 6d 2c 20 77 65 20 64 65 6c 61 79 20  oblem, we delay 
25e80 31 30 30 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73  100 milliseconds
25e90 20 61 6e 64 20 74 72 79 20 74 6f 20 64 65 6c 65   and try to dele
25ea0 74 65 20 61 67 61 69 6e 2e 20 20 55 70 0a 2a 2a  te again.  Up.**
25eb0 20 74 6f 20 4d 58 5f 44 45 4c 45 54 49 4f 4e 5f   to MX_DELETION_
25ec0 41 54 54 45 4d 50 54 73 20 64 65 6c 65 74 69 6f  ATTEMPTs deletio
25ed0 6e 20 61 74 74 65 6d 70 74 73 20 61 72 65 20 72  n attempts are r
25ee0 75 6e 20 62 65 66 6f 72 65 20 67 69 76 69 6e 67  un before giving
25ef0 0a 2a 2a 20 75 70 20 61 6e 64 20 72 65 74 75 72  .** up and retur
25f00 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 2e 0a 2a  ning an error..*
25f10 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
25f20 44 65 6c 65 74 65 28 0a 20 20 73 71 6c 69 74 65  Delete(.  sqlite
25f30 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20  3_vfs *pVfs,    
25f40 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 75 73 65        /* Not use
25f50 64 20 6f 6e 20 77 69 6e 33 32 20 2a 2f 0a 20 20  d on win32 */.  
25f60 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
25f70 65 6e 61 6d 65 2c 20 20 20 20 20 20 2f 2a 20 4e  ename,      /* N
25f80 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 64  ame of file to d
25f90 65 6c 65 74 65 20 2a 2f 0a 20 20 69 6e 74 20 73  elete */.  int s
25fa0 79 6e 63 44 69 72 20 20 20 20 20 20 20 20 20 20  yncDir          
25fb0 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 75 73         /* Not us
25fc0 65 64 20 6f 6e 20 77 69 6e 33 32 20 2a 2f 0a 29  ed on win32 */.)
25fd0 7b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b  {.  int cnt = 0;
25fe0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 44 57 4f  .  int rc;.  DWO
25ff0 52 44 20 61 74 74 72 3b 0a 20 20 44 57 4f 52 44  RD attr;.  DWORD
26000 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 0a   lastErrno = 0;.
26010 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74    void *zConvert
26020 65 64 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  ed;.  UNUSED_PAR
26030 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20  AMETER(pVfs);.  
26040 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
26050 28 73 79 6e 63 44 69 72 29 3b 0a 0a 20 20 53 69  (syncDir);..  Si
26060 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65  mulateIOError(re
26070 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
26080 52 5f 44 45 4c 45 54 45 29 3b 0a 20 20 4f 53 54  R_DELETE);.  OST
26090 52 41 43 45 28 28 22 44 45 4c 45 54 45 20 6e 61  RACE(("DELETE na
260a0 6d 65 3d 25 73 2c 20 73 79 6e 63 44 69 72 3d 25  me=%s, syncDir=%
260b0 64 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  d\n", zFilename,
260c0 20 73 79 6e 63 44 69 72 29 29 3b 0a 0a 20 20 7a   syncDir));..  z
260d0 43 6f 6e 76 65 72 74 65 64 20 3d 20 77 69 6e 43  Converted = winC
260e0 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66 38 46 69  onvertFromUtf8Fi
260f0 6c 65 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65  lename(zFilename
26100 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65 72  );.  if( zConver
26110 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 4f 53  ted==0 ){.    OS
26120 54 52 41 43 45 28 28 22 44 45 4c 45 54 45 20 6e  TRACE(("DELETE n
26130 61 6d 65 3d 25 73 2c 20 72 63 3d 53 51 4c 49 54  ame=%s, rc=SQLIT
26140 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22  E_IOERR_NOMEM\n"
26150 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20  , zFilename));. 
26160 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
26170 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20  _IOERR_NOMEM;.  
26180 7d 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29  }.  if( osIsNT()
26190 20 29 7b 0a 20 20 20 20 64 6f 20 7b 0a 23 69 66   ){.    do {.#if
261a0 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
261b0 0a 20 20 20 20 20 20 57 49 4e 33 32 5f 46 49 4c  .      WIN32_FIL
261c0 45 5f 41 54 54 52 49 42 55 54 45 5f 44 41 54 41  E_ATTRIBUTE_DATA
261d0 20 73 41 74 74 72 44 61 74 61 3b 0a 20 20 20 20   sAttrData;.    
261e0 20 20 6d 65 6d 73 65 74 28 26 73 41 74 74 72 44    memset(&sAttrD
261f0 61 74 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  ata, 0, sizeof(s
26200 41 74 74 72 44 61 74 61 29 29 3b 0a 20 20 20 20  AttrData));.    
26210 20 20 69 66 20 28 20 6f 73 47 65 74 46 69 6c 65    if ( osGetFile
26220 41 74 74 72 69 62 75 74 65 73 45 78 57 28 7a 43  AttributesExW(zC
26230 6f 6e 76 65 72 74 65 64 2c 20 47 65 74 46 69 6c  onverted, GetFil
26240 65 45 78 49 6e 66 6f 53 74 61 6e 64 61 72 64 2c  eExInfoStandard,
26250 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
26260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26270 20 20 20 26 73 41 74 74 72 44 61 74 61 29 20 29     &sAttrData) )
26280 7b 0a 20 20 20 20 20 20 20 20 61 74 74 72 20 3d  {.        attr =
26290 20 73 41 74 74 72 44 61 74 61 2e 64 77 46 69 6c   sAttrData.dwFil
262a0 65 41 74 74 72 69 62 75 74 65 73 3b 0a 20 20 20  eAttributes;.   
262b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
262c0 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73    lastErrno = os
262d0 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
262e0 20 20 20 20 20 20 20 20 69 66 28 20 6c 61 73 74          if( last
262f0 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 46 49 4c  Errno==ERROR_FIL
26300 45 5f 4e 4f 54 5f 46 4f 55 4e 44 0a 20 20 20 20  E_NOT_FOUND.    
26310 20 20 20 20 20 7c 7c 20 6c 61 73 74 45 72 72 6e       || lastErrn
26320 6f 3d 3d 45 52 52 4f 52 5f 50 41 54 48 5f 4e 4f  o==ERROR_PATH_NO
26330 54 5f 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20 20  T_FOUND ){.     
26340 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
26350 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f  _IOERR_DELETE_NO
26360 45 4e 54 3b 20 2f 2a 20 41 6c 72 65 61 64 79 20  ENT; /* Already 
26370 67 6f 6e 65 3f 20 2a 2f 0a 20 20 20 20 20 20 20  gone? */.       
26380 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
26390 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
263a0 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ROR;.        }. 
263b0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
263c0 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20      }.#else.    
263d0 20 20 61 74 74 72 20 3d 20 6f 73 47 65 74 46 69    attr = osGetFi
263e0 6c 65 41 74 74 72 69 62 75 74 65 73 57 28 7a 43  leAttributesW(zC
263f0 6f 6e 76 65 72 74 65 64 29 3b 0a 23 65 6e 64 69  onverted);.#endi
26400 66 0a 20 20 20 20 20 20 69 66 20 28 20 61 74 74  f.      if ( att
26410 72 3d 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f  r==INVALID_FILE_
26420 41 54 54 52 49 42 55 54 45 53 20 29 7b 0a 20 20  ATTRIBUTES ){.  
26430 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 20        lastErrno 
26440 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
26450 28 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ();.        if( 
26460 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52  lastErrno==ERROR
26470 5f 46 49 4c 45 5f 4e 4f 54 5f 46 4f 55 4e 44 0a  _FILE_NOT_FOUND.
26480 20 20 20 20 20 20 20 20 20 7c 7c 20 6c 61 73 74           || last
26490 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 50 41 54  Errno==ERROR_PAT
264a0 48 5f 4e 4f 54 5f 46 4f 55 4e 44 20 29 7b 0a 20  H_NOT_FOUND ){. 
264b0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
264c0 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54  LITE_IOERR_DELET
264d0 45 5f 4e 4f 45 4e 54 3b 20 2f 2a 20 41 6c 72 65  E_NOENT; /* Alre
264e0 61 64 79 20 67 6f 6e 65 3f 20 2a 2f 0a 20 20 20  ady gone? */.   
264f0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
26500 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
26510 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  E_ERROR;.       
26520 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b   }.        break
26530 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
26540 69 66 20 28 20 61 74 74 72 26 46 49 4c 45 5f 41  if ( attr&FILE_A
26550 54 54 52 49 42 55 54 45 5f 44 49 52 45 43 54 4f  TTRIBUTE_DIRECTO
26560 52 59 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  RY ){.        rc
26570 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
26580 20 2f 2a 20 46 69 6c 65 73 20 6f 6e 6c 79 2e 20   /* Files only. 
26590 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  */.        break
265a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
265b0 69 66 20 28 20 6f 73 44 65 6c 65 74 65 46 69 6c  if ( osDeleteFil
265c0 65 57 28 7a 43 6f 6e 76 65 72 74 65 64 29 20 29  eW(zConverted) )
265d0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
265e0 51 4c 49 54 45 5f 4f 4b 3b 20 2f 2a 20 44 65 6c  QLITE_OK; /* Del
265f0 65 74 65 64 20 4f 4b 2e 20 2a 2f 0a 20 20 20 20  eted OK. */.    
26600 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
26610 20 7d 0a 20 20 20 20 20 20 69 66 20 28 20 21 77   }.      if ( !w
26620 69 6e 52 65 74 72 79 49 6f 65 72 72 28 26 63 6e  inRetryIoerr(&cn
26630 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29  t, &lastErrno) )
26640 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
26650 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 2f 2a 20  QLITE_ERROR; /* 
26660 4e 6f 20 6d 6f 72 65 20 72 65 74 72 69 65 73 2e  No more retries.
26670 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61   */.        brea
26680 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
26690 20 77 68 69 6c 65 28 31 29 3b 0a 20 20 7d 0a 23   while(1);.  }.#
266a0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  ifdef SQLITE_WIN
266b0 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c  32_HAS_ANSI.  el
266c0 73 65 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20  se{.    do {.   
266d0 20 20 20 61 74 74 72 20 3d 20 6f 73 47 65 74 46     attr = osGetF
266e0 69 6c 65 41 74 74 72 69 62 75 74 65 73 41 28 7a  ileAttributesA(z
266f0 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
26700 20 20 69 66 20 28 20 61 74 74 72 3d 3d 49 4e 56    if ( attr==INV
26710 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42  ALID_FILE_ATTRIB
26720 55 54 45 53 20 29 7b 0a 20 20 20 20 20 20 20 20  UTES ){.        
26730 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
26740 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
26750 20 20 20 20 20 20 69 66 28 20 6c 61 73 74 45 72        if( lastEr
26760 72 6e 6f 3d 3d 45 52 52 4f 52 5f 46 49 4c 45 5f  rno==ERROR_FILE_
26770 4e 4f 54 5f 46 4f 55 4e 44 0a 20 20 20 20 20 20  NOT_FOUND.      
26780 20 20 20 7c 7c 20 6c 61 73 74 45 72 72 6e 6f 3d     || lastErrno=
26790 3d 45 52 52 4f 52 5f 50 41 54 48 5f 4e 4f 54 5f  =ERROR_PATH_NOT_
267a0 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20 20 20 20  FOUND ){.       
267b0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
267c0 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e  OERR_DELETE_NOEN
267d0 54 3b 20 2f 2a 20 41 6c 72 65 61 64 79 20 67 6f  T; /* Already go
267e0 6e 65 3f 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d  ne? */.        }
267f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
26800 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
26810 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  R;.        }.   
26820 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
26830 20 20 7d 0a 20 20 20 20 20 20 69 66 20 28 20 61    }.      if ( a
26840 74 74 72 26 46 49 4c 45 5f 41 54 54 52 49 42 55  ttr&FILE_ATTRIBU
26850 54 45 5f 44 49 52 45 43 54 4f 52 59 20 29 7b 0a  TE_DIRECTORY ){.
26860 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
26870 49 54 45 5f 45 52 52 4f 52 3b 20 2f 2a 20 46 69  ITE_ERROR; /* Fi
26880 6c 65 73 20 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20  les only. */.   
26890 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
268a0 20 20 7d 0a 20 20 20 20 20 20 69 66 20 28 20 6f    }.      if ( o
268b0 73 44 65 6c 65 74 65 46 69 6c 65 41 28 7a 43 6f  sDeleteFileA(zCo
268c0 6e 76 65 72 74 65 64 29 20 29 7b 0a 20 20 20 20  nverted) ){.    
268d0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
268e0 4f 4b 3b 20 2f 2a 20 44 65 6c 65 74 65 64 20 4f  OK; /* Deleted O
268f0 4b 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72  K. */.        br
26900 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
26910 20 20 20 69 66 20 28 20 21 77 69 6e 52 65 74 72     if ( !winRetr
26920 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c 61  yIoerr(&cnt, &la
26930 73 74 45 72 72 6e 6f 29 20 29 7b 0a 20 20 20 20  stErrno) ){.    
26940 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
26950 45 52 52 4f 52 3b 20 2f 2a 20 4e 6f 20 6d 6f 72  ERROR; /* No mor
26960 65 20 72 65 74 72 69 65 73 2e 20 2a 2f 0a 20 20  e retries. */.  
26970 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
26980 20 20 20 7d 0a 20 20 20 20 7d 20 77 68 69 6c 65     }.    } while
26990 28 31 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  (1);.  }.#endif.
269a0 20 20 69 66 28 20 72 63 20 26 26 20 72 63 21 3d    if( rc && rc!=
269b0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c  SQLITE_IOERR_DEL
269c0 45 54 45 5f 4e 4f 45 4e 54 20 29 7b 0a 20 20 20  ETE_NOENT ){.   
269d0 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f   rc = winLogErro
269e0 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44  r(SQLITE_IOERR_D
269f0 45 4c 45 54 45 2c 20 6c 61 73 74 45 72 72 6e 6f  ELETE, lastErrno
26a00 2c 20 22 77 69 6e 44 65 6c 65 74 65 22 2c 20 7a  , "winDelete", z
26a10 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 65 6c  Filename);.  }el
26a20 73 65 7b 0a 20 20 20 20 77 69 6e 4c 6f 67 49 6f  se{.    winLogIo
26a30 65 72 72 28 63 6e 74 29 3b 0a 20 20 7d 0a 20 20  err(cnt);.  }.  
26a40 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
26a50 6e 76 65 72 74 65 64 29 3b 0a 20 20 4f 53 54 52  nverted);.  OSTR
26a60 41 43 45 28 28 22 44 45 4c 45 54 45 20 6e 61 6d  ACE(("DELETE nam
26a70 65 3d 25 73 2c 20 72 63 3d 25 73 5c 6e 22 2c 20  e=%s, rc=%s\n", 
26a80 7a 46 69 6c 65 6e 61 6d 65 2c 20 73 71 6c 69 74  zFilename, sqlit
26a90 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b  e3ErrName(rc)));
26aa0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
26ab0 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68 65  ./*.** Check the
26ac0 20 65 78 69 73 74 65 6e 63 65 20 61 6e 64 20 73   existence and s
26ad0 74 61 74 75 73 20 6f 66 20 61 20 66 69 6c 65 2e  tatus of a file.
26ae0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
26af0 69 6e 41 63 63 65 73 73 28 0a 20 20 73 71 6c 69  inAccess(.  sqli
26b00 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20  te3_vfs *pVfs,  
26b10 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 75 73         /* Not us
26b20 65 64 20 6f 6e 20 77 69 6e 33 32 20 2a 2f 0a 20  ed on win32 */. 
26b30 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
26b40 6c 65 6e 61 6d 65 2c 20 20 20 20 20 2f 2a 20 4e  lename,     /* N
26b50 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 63  ame of file to c
26b60 68 65 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  heck */.  int fl
26b70 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
26b80 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20       /* Type of 
26b90 74 65 73 74 20 74 6f 20 6d 61 6b 65 20 6f 6e 20  test to make on 
26ba0 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 69  this file */.  i
26bb0 6e 74 20 2a 70 52 65 73 4f 75 74 20 20 20 20 20  nt *pResOut     
26bc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
26bd0 3a 20 52 65 73 75 6c 74 20 2a 2f 0a 29 7b 0a 20  : Result */.){. 
26be0 20 44 57 4f 52 44 20 61 74 74 72 3b 0a 20 20 69   DWORD attr;.  i
26bf0 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 44 57 4f  nt rc = 0;.  DWO
26c00 52 44 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30  RD lastErrno = 0
26c10 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65  ;.  void *zConve
26c20 72 74 65 64 3b 0a 20 20 55 4e 55 53 45 44 5f 50  rted;.  UNUSED_P
26c30 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a  ARAMETER(pVfs);.
26c40 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
26c50 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
26c60 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 3b 20  E_IOERR_ACCESS; 
26c70 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 41  );.  OSTRACE(("A
26c80 43 43 45 53 53 20 6e 61 6d 65 3d 25 73 2c 20 66  CCESS name=%s, f
26c90 6c 61 67 73 3d 25 78 2c 20 70 52 65 73 4f 75 74  lags=%x, pResOut
26ca0 3d 25 70 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%p\n",.        
26cb0 20 20 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 66 6c     zFilename, fl
26cc0 61 67 73 2c 20 70 52 65 73 4f 75 74 29 29 3b 0a  ags, pResOut));.
26cd0 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20  .  zConverted = 
26ce0 77 69 6e 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74  winConvertFromUt
26cf0 66 38 46 69 6c 65 6e 61 6d 65 28 7a 46 69 6c 65  f8Filename(zFile
26d00 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f  name);.  if( zCo
26d10 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20  nverted==0 ){.  
26d20 20 20 4f 53 54 52 41 43 45 28 28 22 41 43 43 45    OSTRACE(("ACCE
26d30 53 53 20 6e 61 6d 65 3d 25 73 2c 20 72 63 3d 53  SS name=%s, rc=S
26d40 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
26d50 4d 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29  M\n", zFilename)
26d60 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
26d70 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
26d80 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 73 49 73  ;.  }.  if( osIs
26d90 4e 54 28 29 20 29 7b 0a 20 20 20 20 69 6e 74 20  NT() ){.    int 
26da0 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 57 49 4e  cnt = 0;.    WIN
26db0 33 32 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54  32_FILE_ATTRIBUT
26dc0 45 5f 44 41 54 41 20 73 41 74 74 72 44 61 74 61  E_DATA sAttrData
26dd0 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 41  ;.    memset(&sA
26de0 74 74 72 44 61 74 61 2c 20 30 2c 20 73 69 7a 65  ttrData, 0, size
26df0 6f 66 28 73 41 74 74 72 44 61 74 61 29 29 3b 0a  of(sAttrData));.
26e00 20 20 20 20 77 68 69 6c 65 28 20 21 28 72 63 20      while( !(rc 
26e10 3d 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69  = osGetFileAttri
26e20 62 75 74 65 73 45 78 57 28 28 4c 50 43 57 53 54  butesExW((LPCWST
26e30 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20  R)zConverted,.  
26e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26e50 20 20 20 20 20 20 20 20 20 20 20 47 65 74 46 69             GetFi
26e60 6c 65 45 78 49 6e 66 6f 53 74 61 6e 64 61 72 64  leExInfoStandard
26e70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
26e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
26e90 73 41 74 74 72 44 61 74 61 29 29 20 26 26 20 77  sAttrData)) && w
26ea0 69 6e 52 65 74 72 79 49 6f 65 72 72 28 26 63 6e  inRetryIoerr(&cn
26eb0 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29  t, &lastErrno) )
26ec0 7b 7d 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  {}.    if( rc ){
26ed0 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 61 6e  .      /* For an
26ee0 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
26ef0 58 49 53 54 53 20 71 75 65 72 79 2c 20 74 72 65  XISTS query, tre
26f00 61 74 20 61 20 7a 65 72 6f 2d 6c 65 6e 67 74 68  at a zero-length
26f10 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 61   file.      ** a
26f20 73 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74  s if it does not
26f30 20 65 78 69 73 74 2e 0a 20 20 20 20 20 20 2a 2f   exist..      */
26f40 0a 20 20 20 20 20 20 69 66 28 20 20 20 20 66 6c  .      if(    fl
26f50 61 67 73 3d 3d 53 51 4c 49 54 45 5f 41 43 43 45  ags==SQLITE_ACCE
26f60 53 53 5f 45 58 49 53 54 53 0a 20 20 20 20 20 20  SS_EXISTS.      
26f70 20 20 20 20 26 26 20 73 41 74 74 72 44 61 74 61      && sAttrData
26f80 2e 6e 46 69 6c 65 53 69 7a 65 48 69 67 68 3d 3d  .nFileSizeHigh==
26f90 30 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 73  0.          && s
26fa0 41 74 74 72 44 61 74 61 2e 6e 46 69 6c 65 53 69  AttrData.nFileSi
26fb0 7a 65 4c 6f 77 3d 3d 30 20 29 7b 0a 20 20 20 20  zeLow==0 ){.    
26fc0 20 20 20 20 61 74 74 72 20 3d 20 49 4e 56 41 4c      attr = INVAL
26fd0 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54  ID_FILE_ATTRIBUT
26fe0 45 53 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ES;.      }else{
26ff0 0a 20 20 20 20 20 20 20 20 61 74 74 72 20 3d 20  .        attr = 
27000 73 41 74 74 72 44 61 74 61 2e 64 77 46 69 6c 65  sAttrData.dwFile
27010 41 74 74 72 69 62 75 74 65 73 3b 0a 20 20 20 20  Attributes;.    
27020 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
27030 20 20 20 20 20 77 69 6e 4c 6f 67 49 6f 65 72 72       winLogIoerr
27040 28 63 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28  (cnt);.      if(
27050 20 6c 61 73 74 45 72 72 6e 6f 21 3d 45 52 52 4f   lastErrno!=ERRO
27060 52 5f 46 49 4c 45 5f 4e 4f 54 5f 46 4f 55 4e 44  R_FILE_NOT_FOUND
27070 20 26 26 20 6c 61 73 74 45 72 72 6e 6f 21 3d 45   && lastErrno!=E
27080 52 52 4f 52 5f 50 41 54 48 5f 4e 4f 54 5f 46 4f  RROR_PATH_NOT_FO
27090 55 4e 44 20 29 7b 0a 20 20 20 20 20 20 20 20 73  UND ){.        s
270a0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e  qlite3_free(zCon
270b0 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 20  verted);.       
270c0 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72   return winLogEr
270d0 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
270e0 5f 41 43 43 45 53 53 2c 20 6c 61 73 74 45 72 72  _ACCESS, lastErr
270f0 6e 6f 2c 20 22 77 69 6e 41 63 63 65 73 73 22 2c  no, "winAccess",
27100 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
27110 20 20 20 20 20 20 20 20 20 20 20 20 7a 46 69 6c              zFil
27120 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65  ename);.      }e
27130 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 74 74  lse{.        att
27140 72 20 3d 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45  r = INVALID_FILE
27150 5f 41 54 54 52 49 42 55 54 45 53 3b 0a 20 20 20  _ATTRIBUTES;.   
27160 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23     }.    }.  }.#
27170 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  ifdef SQLITE_WIN
27180 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c  32_HAS_ANSI.  el
27190 73 65 7b 0a 20 20 20 20 61 74 74 72 20 3d 20 6f  se{.    attr = o
271a0 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74  sGetFileAttribut
271b0 65 73 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76  esA((char*)zConv
271c0 65 72 74 65 64 29 3b 0a 20 20 7d 0a 23 65 6e 64  erted);.  }.#end
271d0 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  if.  sqlite3_fre
271e0 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
271f0 20 73 77 69 74 63 68 28 20 66 6c 61 67 73 20 29   switch( flags )
27200 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  {.    case SQLIT
27210 45 5f 41 43 43 45 53 53 5f 52 45 41 44 3a 0a 20  E_ACCESS_READ:. 
27220 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
27230 43 43 45 53 53 5f 45 58 49 53 54 53 3a 0a 20 20  CCESS_EXISTS:.  
27240 20 20 20 20 72 63 20 3d 20 61 74 74 72 21 3d 49      rc = attr!=I
27250 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52  NVALID_FILE_ATTR
27260 49 42 55 54 45 53 3b 0a 20 20 20 20 20 20 62 72  IBUTES;.      br
27270 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
27280 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44  LITE_ACCESS_READ
27290 57 52 49 54 45 3a 0a 20 20 20 20 20 20 72 63 20  WRITE:.      rc 
272a0 3d 20 61 74 74 72 21 3d 49 4e 56 41 4c 49 44 5f  = attr!=INVALID_
272b0 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 20  FILE_ATTRIBUTES 
272c0 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  &&.             
272d0 28 61 74 74 72 20 26 20 46 49 4c 45 5f 41 54 54  (attr & FILE_ATT
272e0 52 49 42 55 54 45 5f 52 45 41 44 4f 4e 4c 59 29  RIBUTE_READONLY)
272f0 3d 3d 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ==0;.      break
27300 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20  ;.    default:. 
27310 20 20 20 20 20 61 73 73 65 72 74 28 21 22 49 6e       assert(!"In
27320 76 61 6c 69 64 20 66 6c 61 67 73 20 61 72 67 75  valid flags argu
27330 6d 65 6e 74 22 29 3b 0a 20 20 7d 0a 20 20 2a 70  ment");.  }.  *p
27340 52 65 73 4f 75 74 20 3d 20 72 63 3b 0a 20 20 4f  ResOut = rc;.  O
27350 53 54 52 41 43 45 28 28 22 41 43 43 45 53 53 20  STRACE(("ACCESS 
27360 6e 61 6d 65 3d 25 73 2c 20 70 52 65 73 4f 75 74  name=%s, pResOut
27370 3d 25 70 2c 20 2a 70 52 65 73 4f 75 74 3d 25 64  =%p, *pResOut=%d
27380 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e  , rc=SQLITE_OK\n
27390 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 7a 46  ",.           zF
273a0 69 6c 65 6e 61 6d 65 2c 20 70 52 65 73 4f 75 74  ilename, pResOut
273b0 2c 20 2a 70 52 65 73 4f 75 74 29 29 3b 0a 20 20  , *pResOut));.  
273c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
273d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
273e0 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74  ns non-zero if t
273f0 68 65 20 73 70 65 63 69 66 69 65 64 20 70 61 74  he specified pat
27400 68 20 6e 61 6d 65 20 73 74 61 72 74 73 20 77 69  h name starts wi
27410 74 68 20 61 20 64 72 69 76 65 20 6c 65 74 74 65  th a drive lette
27420 72 0a 2a 2a 20 66 6f 6c 6c 6f 77 65 64 20 62 79  r.** followed by
27430 20 61 20 63 6f 6c 6f 6e 20 63 68 61 72 61 63 74   a colon charact
27440 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f  er..*/.static BO
27450 4f 4c 20 77 69 6e 49 73 44 72 69 76 65 4c 65 74  OL winIsDriveLet
27460 74 65 72 41 6e 64 43 6f 6c 6f 6e 28 0a 20 20 63  terAndColon(.  c
27470 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
27480 6e 61 6d 65 0a 29 7b 0a 20 20 72 65 74 75 72 6e  name.){.  return
27490 20 28 20 73 71 6c 69 74 65 33 49 73 61 6c 70 68   ( sqlite3Isalph
274a0 61 28 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 29 20  a(zPathname[0]) 
274b0 26 26 20 7a 50 61 74 68 6e 61 6d 65 5b 31 5d 3d  && zPathname[1]=
274c0 3d 27 3a 27 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  =':' );.}../*.**
274d0 20 52 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72   Returns non-zer
274e0 6f 20 69 66 20 74 68 65 20 73 70 65 63 69 66 69  o if the specifi
274f0 65 64 20 70 61 74 68 20 6e 61 6d 65 20 73 68 6f  ed path name sho
27500 75 6c 64 20 62 65 20 75 73 65 64 20 76 65 72 62  uld be used verb
27510 61 74 69 6d 2e 20 20 49 66 0a 2a 2a 20 6e 6f 6e  atim.  If.** non
27520 2d 7a 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65  -zero is returne
27530 64 20 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63  d from this func
27540 74 69 6f 6e 2c 20 74 68 65 20 63 61 6c 6c 69 6e  tion, the callin
27550 67 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20  g function must 
27560 73 69 6d 70 6c 79 0a 2a 2a 20 75 73 65 20 74 68  simply.** use th
27570 65 20 70 72 6f 76 69 64 65 64 20 70 61 74 68 20  e provided path 
27580 6e 61 6d 65 20 76 65 72 62 61 74 69 6d 20 2d 4f  name verbatim -O
27590 52 2d 20 72 65 73 6f 6c 76 65 20 69 74 20 69 6e  R- resolve it in
275a0 74 6f 20 61 20 66 75 6c 6c 20 70 61 74 68 20 6e  to a full path n
275b0 61 6d 65 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65  ame.** using the
275c0 20 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65   GetFullPathName
275d0 20 57 69 6e 33 32 20 41 50 49 20 66 75 6e 63 74   Win32 API funct
275e0 69 6f 6e 20 28 69 66 20 61 76 61 69 6c 61 62 6c  ion (if availabl
275f0 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f  e)..*/.static BO
27600 4f 4c 20 77 69 6e 49 73 56 65 72 62 61 74 69 6d  OL winIsVerbatim
27610 50 61 74 68 6e 61 6d 65 28 0a 20 20 63 6f 6e 73  Pathname(.  cons
27620 74 20 63 68 61 72 20 2a 7a 50 61 74 68 6e 61 6d  t char *zPathnam
27630 65 0a 29 7b 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49  e.){.  /*.  ** I
27640 66 20 74 68 65 20 70 61 74 68 20 6e 61 6d 65 20  f the path name 
27650 73 74 61 72 74 73 20 77 69 74 68 20 61 20 66 6f  starts with a fo
27660 72 77 61 72 64 20 73 6c 61 73 68 20 6f 72 20 61  rward slash or a
27670 20 62 61 63 6b 73 6c 61 73 68 2c 20 69 74 20 69   backslash, it i
27680 73 20 65 69 74 68 65 72 0a 20 20 2a 2a 20 61 20  s either.  ** a 
27690 6c 65 67 61 6c 20 55 4e 43 20 6e 61 6d 65 2c 20  legal UNC name, 
276a0 61 20 76 6f 6c 75 6d 65 20 72 65 6c 61 74 69 76  a volume relativ
276b0 65 20 70 61 74 68 2c 20 6f 72 20 61 6e 20 61 62  e path, or an ab
276c0 73 6f 6c 75 74 65 20 70 61 74 68 20 6e 61 6d 65  solute path name
276d0 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 22 55 6e   in the.  ** "Un
276e0 69 78 22 20 66 6f 72 6d 61 74 20 6f 6e 20 57 69  ix" format on Wi
276f0 6e 64 6f 77 73 2e 20 20 54 68 65 72 65 20 69 73  ndows.  There is
27700 20 6e 6f 20 65 61 73 79 20 77 61 79 20 74 6f 20   no easy way to 
27710 64 69 66 66 65 72 65 6e 74 69 61 74 65 20 62 65  differentiate be
27720 74 77 65 65 6e 0a 20 20 2a 2a 20 74 68 65 20 66  tween.  ** the f
27730 69 6e 61 6c 20 74 77 6f 20 63 61 73 65 73 3b 20  inal two cases; 
27740 74 68 65 72 65 66 6f 72 65 2c 20 77 65 20 72 65  therefore, we re
27750 74 75 72 6e 20 74 68 65 20 73 61 66 65 72 20 72  turn the safer r
27760 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 54  eturn value of T
27770 52 55 45 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74  RUE.  ** so that
27780 20 63 61 6c 6c 65 72 73 20 6f 66 20 74 68 69 73   callers of this
27790 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 73   function will s
277a0 69 6d 70 6c 79 20 75 73 65 20 69 74 20 76 65 72  imply use it ver
277b0 62 61 74 69 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66  batim..  */.  if
277c0 20 28 20 77 69 6e 49 73 44 69 72 53 65 70 28 7a   ( winIsDirSep(z
277d0 50 61 74 68 6e 61 6d 65 5b 30 5d 29 20 29 7b 0a  Pathname[0]) ){.
277e0 20 20 20 20 72 65 74 75 72 6e 20 54 52 55 45 3b      return TRUE;
277f0 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
27800 49 66 20 74 68 65 20 70 61 74 68 20 6e 61 6d 65  If the path name
27810 20 73 74 61 72 74 73 20 77 69 74 68 20 61 20 6c   starts with a l
27820 65 74 74 65 72 20 61 6e 64 20 61 20 63 6f 6c 6f  etter and a colo
27830 6e 20 69 74 20 69 73 20 65 69 74 68 65 72 20 61  n it is either a
27840 20 76 6f 6c 75 6d 65 0a 20 20 2a 2a 20 72 65 6c   volume.  ** rel
27850 61 74 69 76 65 20 70 61 74 68 20 6f 72 20 61 6e  ative path or an
27860 20 61 62 73 6f 6c 75 74 65 20 70 61 74 68 2e 20   absolute path. 
27870 20 43 61 6c 6c 65 72 73 20 6f 66 20 74 68 69 73   Callers of this
27880 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 6e   function must n
27890 6f 74 0a 20 20 2a 2a 20 61 74 74 65 6d 70 74 20  ot.  ** attempt 
278a0 74 6f 20 74 72 65 61 74 20 69 74 20 61 73 20 61  to treat it as a
278b0 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e   relative path n
278c0 61 6d 65 20 28 69 2e 65 2e 20 74 68 65 79 20 73  ame (i.e. they s
278d0 68 6f 75 6c 64 20 73 69 6d 70 6c 79 20 75 73 65  hould simply use
278e0 0a 20 20 2a 2a 20 69 74 20 76 65 72 62 61 74 69  .  ** it verbati
278f0 6d 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 20 28 20  m)..  */.  if ( 
27900 77 69 6e 49 73 44 72 69 76 65 4c 65 74 74 65 72  winIsDriveLetter
27910 41 6e 64 43 6f 6c 6f 6e 28 7a 50 61 74 68 6e 61  AndColon(zPathna
27920 6d 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  me) ){.    retur
27930 6e 20 54 52 55 45 3b 0a 20 20 7d 0a 0a 20 20 2f  n TRUE;.  }..  /
27940 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 67 65 74  *.  ** If we get
27950 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   to this point, 
27960 74 68 65 20 70 61 74 68 20 6e 61 6d 65 20 73 68  the path name sh
27970 6f 75 6c 64 20 61 6c 6d 6f 73 74 20 63 65 72 74  ould almost cert
27980 61 69 6e 6c 79 20 62 65 20 61 20 70 75 72 65 6c  ainly be a purel
27990 79 0a 20 20 2a 2a 20 72 65 6c 61 74 69 76 65 20  y.  ** relative 
279a0 6f 6e 65 20 28 69 2e 65 2e 20 6e 6f 74 20 61 20  one (i.e. not a 
279b0 55 4e 43 20 6e 61 6d 65 2c 20 6e 6f 74 20 61 62  UNC name, not ab
279c0 73 6f 6c 75 74 65 2c 20 61 6e 64 20 6e 6f 74 20  solute, and not 
279d0 76 6f 6c 75 6d 65 20 72 65 6c 61 74 69 76 65 29  volume relative)
279e0 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ..  */.  return 
279f0 46 41 4c 53 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  FALSE;.}../*.** 
27a00 54 75 72 6e 20 61 20 72 65 6c 61 74 69 76 65 20  Turn a relative 
27a10 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f 20 61 20  pathname into a 
27a20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 2e 20 20  full pathname.  
27a30 57 72 69 74 65 20 74 68 65 20 66 75 6c 6c 0a 2a  Write the full.*
27a40 2a 20 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f 20  * pathname into 
27a50 7a 4f 75 74 5b 5d 2e 20 20 7a 4f 75 74 5b 5d 20  zOut[].  zOut[] 
27a60 77 69 6c 6c 20 62 65 20 61 74 20 6c 65 61 73 74  will be at least
27a70 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
27a80 65 0a 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69  e.** bytes in si
27a90 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ze..*/.static in
27aa0 74 20 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d  t winFullPathnam
27ab0 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  e(.  sqlite3_vfs
27ac0 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20 20   *pVfs,         
27ad0 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
27ae0 20 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20   vfs object */. 
27af0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 65   const char *zRe
27b00 6c 61 74 69 76 65 2c 20 20 20 20 20 20 20 20 2f  lative,        /
27b10 2a 20 50 6f 73 73 69 62 6c 79 20 72 65 6c 61 74  * Possibly relat
27b20 69 76 65 20 69 6e 70 75 74 20 70 61 74 68 20 2a  ive input path *
27b30 2f 0a 20 20 69 6e 74 20 6e 46 75 6c 6c 2c 20 20  /.  int nFull,  
27b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27b50 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6f 75 74    /* Size of out
27b60 70 75 74 20 62 75 66 66 65 72 20 69 6e 20 62 79  put buffer in by
27b70 74 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  tes */.  char *z
27b80 46 75 6c 6c 20 20 20 20 20 20 20 20 20 20 20 20  Full            
27b90 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74         /* Output
27ba0 20 62 75 66 66 65 72 20 2a 2f 0a 29 7b 0a 0a 23   buffer */.){..#
27bb0 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 43 59 47  if defined(__CYG
27bc0 57 49 4e 5f 5f 29 0a 20 20 53 69 6d 75 6c 61 74  WIN__).  Simulat
27bd0 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
27be0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b   SQLITE_ERROR );
27bf0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
27c00 54 45 52 28 6e 46 75 6c 6c 29 3b 0a 20 20 61 73  TER(nFull);.  as
27c10 73 65 72 74 28 20 6e 46 75 6c 6c 3e 3d 70 56 66  sert( nFull>=pVf
27c20 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 29 3b  s->mxPathname );
27c30 0a 20 20 69 66 20 28 20 73 71 6c 69 74 65 33 5f  .  if ( sqlite3_
27c40 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79 20 26  data_directory &
27c50 26 20 21 77 69 6e 49 73 56 65 72 62 61 74 69 6d  & !winIsVerbatim
27c60 50 61 74 68 6e 61 6d 65 28 7a 52 65 6c 61 74 69  Pathname(zRelati
27c70 76 65 29 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20  ve) ){.    /*.  
27c80 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 65 20 61 72    ** NOTE: We ar
27c90 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61  e dealing with a
27ca0 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e   relative path n
27cb0 61 6d 65 20 61 6e 64 20 74 68 65 20 64 61 74 61  ame and the data
27cc0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 64 69  .    **       di
27cd0 72 65 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e  rectory has been
27ce0 20 73 65 74 2e 20 20 54 68 65 72 65 66 6f 72 65   set.  Therefore
27cf0 2c 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20  , use it as the 
27d00 62 61 73 69 73 0a 20 20 20 20 2a 2a 20 20 20 20  basis.    **    
27d10 20 20 20 66 6f 72 20 63 6f 6e 76 65 72 74 69 6e     for convertin
27d20 67 20 74 68 65 20 72 65 6c 61 74 69 76 65 20 70  g the relative p
27d30 61 74 68 20 6e 61 6d 65 20 74 6f 20 61 6e 20 61  ath name to an a
27d40 62 73 6f 6c 75 74 65 0a 20 20 20 20 2a 2a 20 20  bsolute.    **  
27d50 20 20 20 20 20 6f 6e 65 20 62 79 20 70 72 65 70       one by prep
27d60 65 6e 64 69 6e 67 20 74 68 65 20 64 61 74 61 20  ending the data 
27d70 64 69 72 65 63 74 6f 72 79 20 61 6e 64 20 61 20  directory and a 
27d80 73 6c 61 73 68 2e 0a 20 20 20 20 2a 2f 0a 20 20  slash..    */.  
27d90 20 20 63 68 61 72 20 2a 7a 4f 75 74 20 3d 20 73    char *zOut = s
27da0 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
27db0 28 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  ( pVfs->mxPathna
27dc0 6d 65 2b 31 20 29 3b 0a 20 20 20 20 69 66 28 20  me+1 );.    if( 
27dd0 21 7a 4f 75 74 20 29 7b 0a 20 20 20 20 20 20 72  !zOut ){.      r
27de0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
27df0 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  RR_NOMEM;.    }.
27e00 20 20 20 20 69 66 28 20 63 79 67 77 69 6e 5f 63      if( cygwin_c
27e10 6f 6e 76 5f 70 61 74 68 28 0a 20 20 20 20 20 20  onv_path(.      
27e20 20 20 20 20 20 20 28 6f 73 49 73 4e 54 28 29 20        (osIsNT() 
27e30 3f 20 43 43 50 5f 50 4f 53 49 58 5f 54 4f 5f 57  ? CCP_POSIX_TO_W
27e40 49 4e 5f 57 20 3a 20 43 43 50 5f 50 4f 53 49 58  IN_W : CCP_POSIX
27e50 5f 54 4f 5f 57 49 4e 5f 41 29 20 7c 0a 20 20 20  _TO_WIN_A) |.   
27e60 20 20 20 20 20 20 20 20 20 43 43 50 5f 52 45 4c           CCP_REL
27e70 41 54 49 56 45 2c 20 7a 52 65 6c 61 74 69 76 65  ATIVE, zRelative
27e80 2c 20 7a 4f 75 74 2c 20 70 56 66 73 2d 3e 6d 78  , zOut, pVfs->mx
27e90 50 61 74 68 6e 61 6d 65 2b 31 29 3c 30 20 29 7b  Pathname+1)<0 ){
27ea0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
27eb0 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20 20  ree(zOut);.     
27ec0 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72   return winLogEr
27ed0 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f  ror(SQLITE_CANTO
27ee0 50 45 4e 5f 43 4f 4e 56 50 41 54 48 2c 20 28 44  PEN_CONVPATH, (D
27ef0 57 4f 52 44 29 65 72 72 6e 6f 2c 0a 20 20 20 20  WORD)errno,.    
27f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27f10 20 20 20 20 20 22 77 69 6e 46 75 6c 6c 50 61 74       "winFullPat
27f20 68 6e 61 6d 65 31 22 2c 20 7a 52 65 6c 61 74 69  hname1", zRelati
27f30 76 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ve);.    }else{.
27f40 20 20 20 20 20 20 63 68 61 72 20 2a 7a 55 74 66        char *zUtf
27f50 38 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74 54 6f  8 = winConvertTo
27f60 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 4f 75  Utf8Filename(zOu
27f70 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a  t);.      if( !z
27f80 55 74 66 38 20 29 7b 0a 20 20 20 20 20 20 20 20  Utf8 ){.        
27f90 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 75  sqlite3_free(zOu
27fa0 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  t);.        retu
27fb0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
27fc0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20  NOMEM;.      }. 
27fd0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
27fe0 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c  rintf(MIN(nFull,
27ff0 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
28000 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 25 63  e), zFull, "%s%c
28010 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %s",.           
28020 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
28030 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f  te3_data_directo
28040 72 79 2c 20 77 69 6e 47 65 74 44 69 72 53 65 70  ry, winGetDirSep
28050 28 29 2c 20 7a 55 74 66 38 29 3b 0a 20 20 20 20  (), zUtf8);.    
28060 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
28070 55 74 66 38 29 3b 0a 20 20 20 20 20 20 73 71 6c  Utf8);.      sql
28080 69 74 65 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b  ite3_free(zOut);
28090 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
280a0 20 20 20 20 63 68 61 72 20 2a 7a 4f 75 74 20 3d      char *zOut =
280b0 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
280c0 72 6f 28 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  ro( pVfs->mxPath
280d0 6e 61 6d 65 2b 31 20 29 3b 0a 20 20 20 20 69 66  name+1 );.    if
280e0 28 20 21 7a 4f 75 74 20 29 7b 0a 20 20 20 20 20  ( !zOut ){.     
280f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
28100 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  OERR_NOMEM;.    
28110 7d 0a 20 20 20 20 69 66 28 20 63 79 67 77 69 6e  }.    if( cygwin
28120 5f 63 6f 6e 76 5f 70 61 74 68 28 0a 20 20 20 20  _conv_path(.    
28130 20 20 20 20 20 20 20 20 28 6f 73 49 73 4e 54 28          (osIsNT(
28140 29 20 3f 20 43 43 50 5f 50 4f 53 49 58 5f 54 4f  ) ? CCP_POSIX_TO
28150 5f 57 49 4e 5f 57 20 3a 20 43 43 50 5f 50 4f 53  _WIN_W : CCP_POS
28160 49 58 5f 54 4f 5f 57 49 4e 5f 41 29 2c 0a 20 20  IX_TO_WIN_A),.  
28170 20 20 20 20 20 20 20 20 20 20 7a 52 65 6c 61 74            zRelat
28180 69 76 65 2c 20 7a 4f 75 74 2c 20 70 56 66 73 2d  ive, zOut, pVfs-
28190 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3c 30  >mxPathname+1)<0
281a0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
281b0 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20  3_free(zOut);.  
281c0 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f      return winLo
281d0 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41  gError(SQLITE_CA
281e0 4e 54 4f 50 45 4e 5f 43 4f 4e 56 50 41 54 48 2c  NTOPEN_CONVPATH,
281f0 20 28 44 57 4f 52 44 29 65 72 72 6e 6f 2c 0a 20   (DWORD)errno,. 
28200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28210 20 20 20 20 20 20 20 20 22 77 69 6e 46 75 6c 6c          "winFull
28220 50 61 74 68 6e 61 6d 65 32 22 2c 20 7a 52 65 6c  Pathname2", zRel
28230 61 74 69 76 65 29 3b 0a 20 20 20 20 7d 65 6c 73  ative);.    }els
28240 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  e{.      char *z
28250 55 74 66 38 20 3d 20 77 69 6e 43 6f 6e 76 65 72  Utf8 = winConver
28260 74 54 6f 55 74 66 38 46 69 6c 65 6e 61 6d 65 28  tToUtf8Filename(
28270 7a 4f 75 74 29 3b 0a 20 20 20 20 20 20 69 66 28  zOut);.      if(
28280 20 21 7a 55 74 66 38 20 29 7b 0a 20 20 20 20 20   !zUtf8 ){.     
28290 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
282a0 7a 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 72  zOut);.        r
282b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
282c0 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  RR_NOMEM;.      
282d0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  }.      sqlite3_
282e0 73 6e 70 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75  snprintf(MIN(nFu
282f0 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  ll, pVfs->mxPath
28300 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25  name), zFull, "%
28310 73 22 2c 20 7a 55 74 66 38 29 3b 0a 20 20 20 20  s", zUtf8);.    
28320 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
28330 55 74 66 38 29 3b 0a 20 20 20 20 20 20 73 71 6c  Utf8);.      sql
28340 69 74 65 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b  ite3_free(zOut);
28350 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
28360 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23  urn SQLITE_OK;.#
28370 65 6e 64 69 66 0a 0a 23 69 66 20 28 53 51 4c 49  endif..#if (SQLI
28380 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 53  TE_OS_WINCE || S
28390 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 29 20  QLITE_OS_WINRT) 
283a0 26 26 20 21 64 65 66 69 6e 65 64 28 5f 5f 43 59  && !defined(__CY
283b0 47 57 49 4e 5f 5f 29 0a 20 20 53 69 6d 75 6c 61  GWIN__).  Simula
283c0 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
283d0 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29  n SQLITE_ERROR )
283e0 3b 0a 20 20 2f 2a 20 57 69 6e 43 45 20 68 61 73  ;.  /* WinCE has
283f0 20 6e 6f 20 63 6f 6e 63 65 70 74 20 6f 66 20 61   no concept of a
28400 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61   relative pathna
28410 6d 65 2c 20 6f 72 20 73 6f 20 49 20 61 6d 20 74  me, or so I am t
28420 6f 6c 64 2e 20 2a 2f 0a 20 20 2f 2a 20 57 69 6e  old. */.  /* Win
28430 52 54 20 68 61 73 20 6e 6f 20 77 61 79 20 74 6f  RT has no way to
28440 20 63 6f 6e 76 65 72 74 20 61 20 72 65 6c 61 74   convert a relat
28450 69 76 65 20 70 61 74 68 20 74 6f 20 61 6e 20 61  ive path to an a
28460 62 73 6f 6c 75 74 65 20 6f 6e 65 2e 20 2a 2f 0a  bsolute one. */.
28470 20 20 69 66 20 28 20 73 71 6c 69 74 65 33 5f 64    if ( sqlite3_d
28480 61 74 61 5f 64 69 72 65 63 74 6f 72 79 20 26 26  ata_directory &&
28490 20 21 77 69 6e 49 73 56 65 72 62 61 74 69 6d 50   !winIsVerbatimP
284a0 61 74 68 6e 61 6d 65 28 7a 52 65 6c 61 74 69 76  athname(zRelativ
284b0 65 29 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20  e) ){.    /*.   
284c0 20 2a 2a 20 4e 4f 54 45 3a 20 57 65 20 61 72 65   ** NOTE: We are
284d0 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20   dealing with a 
284e0 72 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61  relative path na
284f0 6d 65 20 61 6e 64 20 74 68 65 20 64 61 74 61 0a  me and the data.
28500 20 20 20 20 2a 2a 20 20 20 20 20 20 20 64 69 72      **       dir
28510 65 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20  ectory has been 
28520 73 65 74 2e 20 20 54 68 65 72 65 66 6f 72 65 2c  set.  Therefore,
28530 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20 62   use it as the b
28540 61 73 69 73 0a 20 20 20 20 2a 2a 20 20 20 20 20  asis.    **     
28550 20 20 66 6f 72 20 63 6f 6e 76 65 72 74 69 6e 67    for converting
28560 20 74 68 65 20 72 65 6c 61 74 69 76 65 20 70 61   the relative pa
28570 74 68 20 6e 61 6d 65 20 74 6f 20 61 6e 20 61 62  th name to an ab
28580 73 6f 6c 75 74 65 0a 20 20 20 20 2a 2a 20 20 20  solute.    **   
28590 20 20 20 20 6f 6e 65 20 62 79 20 70 72 65 70 65      one by prepe
285a0 6e 64 69 6e 67 20 74 68 65 20 64 61 74 61 20 64  nding the data d
285b0 69 72 65 63 74 6f 72 79 20 61 6e 64 20 61 20 62  irectory and a b
285c0 61 63 6b 73 6c 61 73 68 2e 0a 20 20 20 20 2a 2f  ackslash..    */
285d0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
285e0 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c  rintf(MIN(nFull,
285f0 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
28600 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 25 63  e), zFull, "%s%c
28610 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %s",.           
28620 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
28630 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79  3_data_directory
28640 2c 20 77 69 6e 47 65 74 44 69 72 53 65 70 28 29  , winGetDirSep()
28650 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20  , zRelative);.  
28660 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
28670 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49 4e 28  e3_snprintf(MIN(
28680 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78 50  nFull, pVfs->mxP
28690 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c  athname), zFull,
286a0 20 22 25 73 22 2c 20 7a 52 65 6c 61 74 69 76 65   "%s", zRelative
286b0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
286c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69  SQLITE_OK;.#endi
286d0 66 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  f..#if !SQLITE_O
286e0 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49  S_WINCE && !SQLI
286f0 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 21  TE_OS_WINRT && !
28700 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e  defined(__CYGWIN
28710 5f 5f 29 0a 20 20 44 57 4f 52 44 20 6e 42 79 74  __).  DWORD nByt
28720 65 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76  e;.  void *zConv
28730 65 72 74 65 64 3b 0a 20 20 63 68 61 72 20 2a 7a  erted;.  char *z
28740 4f 75 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  Out;..  /* If th
28750 69 73 20 70 61 74 68 20 6e 61 6d 65 20 62 65 67  is path name beg
28760 69 6e 73 20 77 69 74 68 20 22 2f 58 3a 22 2c 20  ins with "/X:", 
28770 77 68 65 72 65 20 22 58 22 20 69 73 20 61 6e 79  where "X" is any
28780 20 61 6c 70 68 61 62 65 74 69 63 0a 20 20 2a 2a   alphabetic.  **
28790 20 63 68 61 72 61 63 74 65 72 2c 20 64 69 73 63   character, disc
287a0 61 72 64 20 74 68 65 20 69 6e 69 74 69 61 6c 20  ard the initial 
287b0 22 2f 22 20 66 72 6f 6d 20 74 68 65 20 70 61 74  "/" from the pat
287c0 68 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  hname..  */.  if
287d0 28 20 7a 52 65 6c 61 74 69 76 65 5b 30 5d 3d 3d  ( zRelative[0]==
287e0 27 2f 27 20 26 26 20 77 69 6e 49 73 44 72 69 76  '/' && winIsDriv
287f0 65 4c 65 74 74 65 72 41 6e 64 43 6f 6c 6f 6e 28  eLetterAndColon(
28800 7a 52 65 6c 61 74 69 76 65 2b 31 29 20 29 7b 0a  zRelative+1) ){.
28810 20 20 20 20 7a 52 65 6c 61 74 69 76 65 2b 2b 3b      zRelative++;
28820 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 74 27 73 20  .  }..  /* It's 
28830 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20  odd to simulate 
28840 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65 72 65  an io-error here
28850 2c 20 62 75 74 20 72 65 61 6c 6c 79 20 74 68 69  , but really thi
28860 73 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75  s is just.  ** u
28870 73 69 6e 67 20 74 68 65 20 69 6f 2d 65 72 72 6f  sing the io-erro
28880 72 20 69 6e 66 72 61 73 74 72 75 63 74 75 72 65  r infrastructure
28890 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 53 51   to test that SQ
288a0 4c 69 74 65 20 68 61 6e 64 6c 65 73 20 74 68 69  Lite handles thi
288b0 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  s.  ** function 
288c0 66 61 69 6c 69 6e 67 2e 20 54 68 69 73 20 66 75  failing. This fu
288d0 6e 63 74 69 6f 6e 20 63 6f 75 6c 64 20 66 61 69  nction could fai
288e0 6c 20 69 66 2c 20 66 6f 72 20 65 78 61 6d 70 6c  l if, for exampl
288f0 65 2c 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72  e, the.  ** curr
28900 65 6e 74 20 77 6f 72 6b 69 6e 67 20 64 69 72 65  ent working dire
28910 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 75  ctory has been u
28920 6e 6c 69 6e 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20  nlinked..  */.  
28930 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
28940 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
28950 52 52 4f 52 20 29 3b 0a 20 20 69 66 20 28 20 73  RROR );.  if ( s
28960 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65  qlite3_data_dire
28970 63 74 6f 72 79 20 26 26 20 21 77 69 6e 49 73 56  ctory && !winIsV
28980 65 72 62 61 74 69 6d 50 61 74 68 6e 61 6d 65 28  erbatimPathname(
28990 7a 52 65 6c 61 74 69 76 65 29 20 29 7b 0a 20 20  zRelative) ){.  
289a0 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 4e 4f 54 45    /*.    ** NOTE
289b0 3a 20 57 65 20 61 72 65 20 64 65 61 6c 69 6e 67  : We are dealing
289c0 20 77 69 74 68 20 61 20 72 65 6c 61 74 69 76 65   with a relative
289d0 20 70 61 74 68 20 6e 61 6d 65 20 61 6e 64 20 74   path name and t
289e0 68 65 20 64 61 74 61 0a 20 20 20 20 2a 2a 20 20  he data.    **  
289f0 20 20 20 20 20 64 69 72 65 63 74 6f 72 79 20 68       directory h
28a00 61 73 20 62 65 65 6e 20 73 65 74 2e 20 20 54 68  as been set.  Th
28a10 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74 20  erefore, use it 
28a20 61 73 20 74 68 65 20 62 61 73 69 73 0a 20 20 20  as the basis.   
28a30 20 2a 2a 20 20 20 20 20 20 20 66 6f 72 20 63 6f   **       for co
28a40 6e 76 65 72 74 69 6e 67 20 74 68 65 20 72 65 6c  nverting the rel
28a50 61 74 69 76 65 20 70 61 74 68 20 6e 61 6d 65 20  ative path name 
28a60 74 6f 20 61 6e 20 61 62 73 6f 6c 75 74 65 0a 20  to an absolute. 
28a70 20 20 20 2a 2a 20 20 20 20 20 20 20 6f 6e 65 20     **       one 
28a80 62 79 20 70 72 65 70 65 6e 64 69 6e 67 20 74 68  by prepending th
28a90 65 20 64 61 74 61 20 64 69 72 65 63 74 6f 72 79  e data directory
28aa0 20 61 6e 64 20 61 20 62 61 63 6b 73 6c 61 73 68   and a backslash
28ab0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
28ac0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49  ite3_snprintf(MI
28ad0 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d  N(nFull, pVfs->m
28ae0 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c  xPathname), zFul
28af0 6c 2c 20 22 25 73 25 63 25 73 22 2c 0a 20 20 20  l, "%s%c%s",.   
28b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b10 20 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64    sqlite3_data_d
28b20 69 72 65 63 74 6f 72 79 2c 20 77 69 6e 47 65 74  irectory, winGet
28b30 44 69 72 53 65 70 28 29 2c 20 7a 52 65 6c 61 74  DirSep(), zRelat
28b40 69 76 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ive);.    return
28b50 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
28b60 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77    zConverted = w
28b70 69 6e 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66  inConvertFromUtf
28b80 38 46 69 6c 65 6e 61 6d 65 28 7a 52 65 6c 61 74  8Filename(zRelat
28b90 69 76 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e  ive);.  if( zCon
28ba0 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20  verted==0 ){.   
28bb0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
28bc0 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  OERR_NOMEM;.  }.
28bd0 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29    if( osIsNT() )
28be0 7b 0a 20 20 20 20 4c 50 57 53 54 52 20 7a 54 65  {.    LPWSTR zTe
28bf0 6d 70 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20  mp;.    nByte = 
28c00 6f 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d  osGetFullPathNam
28c10 65 57 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e  eW((LPCWSTR)zCon
28c20 76 65 72 74 65 64 2c 20 30 2c 20 30 2c 20 30 29  verted, 0, 0, 0)
28c30 3b 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65 3d  ;.    if( nByte=
28c40 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
28c50 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
28c60 74 65 64 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ted);.      retu
28c70 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53  rn winLogError(S
28c80 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46  QLITE_CANTOPEN_F
28c90 55 4c 4c 50 41 54 48 2c 20 6f 73 47 65 74 4c 61  ULLPATH, osGetLa
28ca0 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20  stError(),.     
28cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28cc0 20 20 20 20 22 77 69 6e 46 75 6c 6c 50 61 74 68      "winFullPath
28cd0 6e 61 6d 65 31 22 2c 20 7a 52 65 6c 61 74 69 76  name1", zRelativ
28ce0 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 42  e);.    }.    nB
28cf0 79 74 65 20 2b 3d 20 33 3b 0a 20 20 20 20 7a 54  yte += 3;.    zT
28d00 65 6d 70 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  emp = sqlite3Mal
28d10 6c 6f 63 5a 65 72 6f 28 20 6e 42 79 74 65 2a 73  locZero( nByte*s
28d20 69 7a 65 6f 66 28 7a 54 65 6d 70 5b 30 5d 29 20  izeof(zTemp[0]) 
28d30 29 3b 0a 20 20 20 20 69 66 28 20 7a 54 65 6d 70  );.    if( zTemp
28d40 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
28d50 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65  ite3_free(zConve
28d60 72 74 65 64 29 3b 0a 20 20 20 20 20 20 72 65 74  rted);.      ret
28d70 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
28d80 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
28d90 20 20 6e 42 79 74 65 20 3d 20 6f 73 47 65 74 46    nByte = osGetF
28da0 75 6c 6c 50 61 74 68 4e 61 6d 65 57 28 28 4c 50  ullPathNameW((LP
28db0 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64  CWSTR)zConverted
28dc0 2c 20 6e 42 79 74 65 2c 20 7a 54 65 6d 70 2c 20  , nByte, zTemp, 
28dd0 30 29 3b 0a 20 20 20 20 69 66 28 20 6e 42 79 74  0);.    if( nByt
28de0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  e==0 ){.      sq
28df0 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76  lite3_free(zConv
28e00 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 73 71  erted);.      sq
28e10 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 65 6d 70  lite3_free(zTemp
28e20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
28e30 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
28e40 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c  TE_CANTOPEN_FULL
28e50 50 41 54 48 2c 20 6f 73 47 65 74 4c 61 73 74 45  PATH, osGetLastE
28e60 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20  rror(),.        
28e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28e80 20 22 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d   "winFullPathnam
28e90 65 32 22 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b  e2", zRelative);
28ea0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
28eb0 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74  e3_free(zConvert
28ec0 65 64 29 3b 0a 20 20 20 20 7a 4f 75 74 20 3d 20  ed);.    zOut = 
28ed0 77 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66 38  winUnicodeToUtf8
28ee0 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 73 71 6c  (zTemp);.    sql
28ef0 69 74 65 33 5f 66 72 65 65 28 7a 54 65 6d 70 29  ite3_free(zTemp)
28f00 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c  ;.  }.#ifdef SQL
28f10 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
28f20 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 63  SI.  else{.    c
28f30 68 61 72 20 2a 7a 54 65 6d 70 3b 0a 20 20 20 20  har *zTemp;.    
28f40 6e 42 79 74 65 20 3d 20 6f 73 47 65 74 46 75 6c  nByte = osGetFul
28f50 6c 50 61 74 68 4e 61 6d 65 41 28 28 63 68 61 72  lPathNameA((char
28f60 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 30 2c  *)zConverted, 0,
28f70 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   0, 0);.    if( 
28f80 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nByte==0 ){.    
28f90 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
28fa0 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
28fb0 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45    return winLogE
28fc0 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54  rror(SQLITE_CANT
28fd0 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48 2c 20 6f  OPEN_FULLPATH, o
28fe0 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c  sGetLastError(),
28ff0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
29000 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 46 75            "winFu
29010 6c 6c 50 61 74 68 6e 61 6d 65 33 22 2c 20 7a 52  llPathname3", zR
29020 65 6c 61 74 69 76 65 29 3b 0a 20 20 20 20 7d 0a  elative);.    }.
29030 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 33 3b 0a      nByte += 3;.
29040 20 20 20 20 7a 54 65 6d 70 20 3d 20 73 71 6c 69      zTemp = sqli
29050 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e  te3MallocZero( n
29060 42 79 74 65 2a 73 69 7a 65 6f 66 28 7a 54 65 6d  Byte*sizeof(zTem
29070 70 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28  p[0]) );.    if(
29080 20 7a 54 65 6d 70 3d 3d 30 20 29 7b 0a 20 20 20   zTemp==0 ){.   
29090 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
290a0 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20  zConverted);.   
290b0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
290c0 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20  _IOERR_NOMEM;.  
290d0 20 20 7d 0a 20 20 20 20 6e 42 79 74 65 20 3d 20    }.    nByte = 
290e0 6f 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d  osGetFullPathNam
290f0 65 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65  eA((char*)zConve
29100 72 74 65 64 2c 20 6e 42 79 74 65 2c 20 7a 54 65  rted, nByte, zTe
29110 6d 70 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  mp, 0);.    if( 
29120 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nByte==0 ){.    
29130 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
29140 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
29150 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
29160 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 72 65 74  Temp);.      ret
29170 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  urn winLogError(
29180 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
29190 46 55 4c 4c 50 41 54 48 2c 20 6f 73 47 65 74 4c  FULLPATH, osGetL
291a0 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20  astError(),.    
291b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
291c0 20 20 20 20 20 22 77 69 6e 46 75 6c 6c 50 61 74       "winFullPat
291d0 68 6e 61 6d 65 34 22 2c 20 7a 52 65 6c 61 74 69  hname4", zRelati
291e0 76 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ve);.    }.    s
291f0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e  qlite3_free(zCon
29200 76 65 72 74 65 64 29 3b 0a 20 20 20 20 7a 4f 75  verted);.    zOu
29210 74 20 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e 33  t = sqlite3_win3
29220 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28 7a  2_mbcs_to_utf8(z
29230 54 65 6d 70 29 3b 0a 20 20 20 20 73 71 6c 69 74  Temp);.    sqlit
29240 65 33 5f 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a  e3_free(zTemp);.
29250 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28    }.#endif.  if(
29260 20 7a 4f 75 74 20 29 7b 0a 20 20 20 20 73 71 6c   zOut ){.    sql
29270 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49  ite3_snprintf(MI
29280 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d  N(nFull, pVfs->m
29290 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c  xPathname), zFul
292a0 6c 2c 20 22 25 73 22 2c 20 7a 4f 75 74 29 3b 0a  l, "%s", zOut);.
292b0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
292c0 28 7a 4f 75 74 29 3b 0a 20 20 20 20 72 65 74 75  (zOut);.    retu
292d0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
292e0 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
292f0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  n SQLITE_IOERR_N
29300 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  OMEM;.  }.#endif
29310 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
29320 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54  TE_OMIT_LOAD_EXT
29330 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74  ENSION./*.** Int
29340 65 72 66 61 63 65 73 20 66 6f 72 20 6f 70 65 6e  erfaces for open
29350 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 69 62  ing a shared lib
29360 72 61 72 79 2c 20 66 69 6e 64 69 6e 67 20 65 6e  rary, finding en
29370 74 72 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 77 69  try points.** wi
29380 74 68 69 6e 20 74 68 65 20 73 68 61 72 65 64 20  thin the shared 
29390 6c 69 62 72 61 72 79 2c 20 61 6e 64 20 63 6c 6f  library, and clo
293a0 73 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20  sing the shared 
293b0 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 73 74 61 74  library..*/.stat
293c0 69 63 20 76 6f 69 64 20 2a 77 69 6e 44 6c 4f 70  ic void *winDlOp
293d0 65 6e 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  en(sqlite3_vfs *
293e0 70 56 66 73 2c 20 63 6f 6e 73 74 20 63 68 61 72  pVfs, const char
293f0 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20   *zFilename){.  
29400 48 41 4e 44 4c 45 20 68 3b 0a 23 69 66 20 64 65  HANDLE h;.#if de
29410 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f  fined(__CYGWIN__
29420 29 0a 20 20 69 6e 74 20 6e 46 75 6c 6c 20 3d 20  ).  int nFull = 
29430 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
29440 2b 31 3b 0a 20 20 63 68 61 72 20 2a 7a 46 75 6c  +1;.  char *zFul
29450 6c 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  l = sqlite3Mallo
29460 63 5a 65 72 6f 28 20 6e 46 75 6c 6c 20 29 3b 0a  cZero( nFull );.
29470 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74    void *zConvert
29480 65 64 20 3d 20 30 3b 0a 20 20 69 66 28 20 7a 46  ed = 0;.  if( zF
29490 75 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 4f 53  ull==0 ){.    OS
294a0 54 52 41 43 45 28 28 22 44 4c 4f 50 45 4e 20 6e  TRACE(("DLOPEN n
294b0 61 6d 65 3d 25 73 2c 20 68 61 6e 64 6c 65 3d 25  ame=%s, handle=%
294c0 70 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  p\n", zFilename,
294d0 20 28 76 6f 69 64 2a 29 30 29 29 3b 0a 20 20 20   (void*)0));.   
294e0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
294f0 20 69 66 28 20 77 69 6e 46 75 6c 6c 50 61 74 68   if( winFullPath
29500 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65  name(pVfs, zFile
29510 6e 61 6d 65 2c 20 6e 46 75 6c 6c 2c 20 7a 46 75  name, nFull, zFu
29520 6c 6c 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ll)!=SQLITE_OK )
29530 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
29540 65 65 28 7a 46 75 6c 6c 29 3b 0a 20 20 20 20 4f  ee(zFull);.    O
29550 53 54 52 41 43 45 28 28 22 44 4c 4f 50 45 4e 20  STRACE(("DLOPEN 
29560 6e 61 6d 65 3d 25 73 2c 20 68 61 6e 64 6c 65 3d  name=%s, handle=
29570 25 70 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65  %p\n", zFilename
29580 2c 20 28 76 6f 69 64 2a 29 30 29 29 3b 0a 20 20  , (void*)0));.  
29590 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
295a0 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77    zConverted = w
295b0 69 6e 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66  inConvertFromUtf
295c0 38 46 69 6c 65 6e 61 6d 65 28 7a 46 75 6c 6c 29  8Filename(zFull)
295d0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
295e0 28 7a 46 75 6c 6c 29 3b 0a 23 65 6c 73 65 0a 20  (zFull);.#else. 
295f0 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65   void *zConverte
29600 64 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74 46 72  d = winConvertFr
29610 6f 6d 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a  omUtf8Filename(z
29620 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 55 4e 55  Filename);.  UNU
29630 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56  SED_PARAMETER(pV
29640 66 73 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66  fs);.#endif.  if
29650 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20  ( zConverted==0 
29660 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  ){.    OSTRACE((
29670 22 44 4c 4f 50 45 4e 20 6e 61 6d 65 3d 25 73 2c  "DLOPEN name=%s,
29680 20 68 61 6e 64 6c 65 3d 25 70 5c 6e 22 2c 20 7a   handle=%p\n", z
29690 46 69 6c 65 6e 61 6d 65 2c 20 28 76 6f 69 64 2a  Filename, (void*
296a0 29 30 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  )0));.    return
296b0 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 73   0;.  }.  if( os
296c0 49 73 4e 54 28 29 20 29 7b 0a 23 69 66 20 53 51  IsNT() ){.#if SQ
296d0 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
296e0 20 20 68 20 3d 20 6f 73 4c 6f 61 64 50 61 63 6b    h = osLoadPack
296f0 61 67 65 64 4c 69 62 72 61 72 79 28 28 4c 50 43  agedLibrary((LPC
29700 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c  WSTR)zConverted,
29710 20 30 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 68   0);.#else.    h
29720 20 3d 20 6f 73 4c 6f 61 64 4c 69 62 72 61 72 79   = osLoadLibrary
29730 57 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76  W((LPCWSTR)zConv
29740 65 72 74 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20  erted);.#endif. 
29750 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
29760 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a  _WIN32_HAS_ANSI.
29770 20 20 65 6c 73 65 7b 0a 20 20 20 20 68 20 3d 20    else{.    h = 
29780 6f 73 4c 6f 61 64 4c 69 62 72 61 72 79 41 28 28  osLoadLibraryA((
29790 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64  char*)zConverted
297a0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
297b0 4f 53 54 52 41 43 45 28 28 22 44 4c 4f 50 45 4e  OSTRACE(("DLOPEN
297c0 20 6e 61 6d 65 3d 25 73 2c 20 68 61 6e 64 6c 65   name=%s, handle
297d0 3d 25 70 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d  =%p\n", zFilenam
297e0 65 2c 20 28 76 6f 69 64 2a 29 68 29 29 3b 0a 20  e, (void*)h));. 
297f0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
29800 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 72 65 74  onverted);.  ret
29810 75 72 6e 20 28 76 6f 69 64 2a 29 68 3b 0a 7d 0a  urn (void*)h;.}.
29820 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 44  static void winD
29830 6c 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76  lError(sqlite3_v
29840 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42  fs *pVfs, int nB
29850 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 4f 75  uf, char *zBufOu
29860 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  t){.  UNUSED_PAR
29870 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20  AMETER(pVfs);.  
29880 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 4d  winGetLastErrorM
29890 73 67 28 6f 73 47 65 74 4c 61 73 74 45 72 72 6f  sg(osGetLastErro
298a0 72 28 29 2c 20 6e 42 75 66 2c 20 7a 42 75 66 4f  r(), nBuf, zBufO
298b0 75 74 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  ut);.}.static vo
298c0 69 64 20 28 2a 77 69 6e 44 6c 53 79 6d 28 73 71  id (*winDlSym(sq
298d0 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
298e0 76 6f 69 64 20 2a 70 48 2c 63 6f 6e 73 74 20 63  void *pH,const c
298f0 68 61 72 20 2a 7a 53 79 6d 29 29 28 76 6f 69 64  har *zSym))(void
29900 29 7b 0a 20 20 46 41 52 50 52 4f 43 20 70 72 6f  ){.  FARPROC pro
29910 63 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  c;.  UNUSED_PARA
29920 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 70  METER(pVfs);.  p
29930 72 6f 63 20 3d 20 6f 73 47 65 74 50 72 6f 63 41  roc = osGetProcA
29940 64 64 72 65 73 73 41 28 28 48 41 4e 44 4c 45 29  ddressA((HANDLE)
29950 70 48 2c 20 7a 53 79 6d 29 3b 0a 20 20 4f 53 54  pH, zSym);.  OST
29960 52 41 43 45 28 28 22 44 4c 53 59 4d 20 68 61 6e  RACE(("DLSYM han
29970 64 6c 65 3d 25 70 2c 20 73 79 6d 62 6f 6c 3d 25  dle=%p, symbol=%
29980 73 2c 20 61 64 64 72 65 73 73 3d 25 70 5c 6e 22  s, address=%p\n"
29990 2c 0a 20 20 20 20 20 20 20 20 20 20 20 28 76 6f  ,.           (vo
299a0 69 64 2a 29 70 48 2c 20 7a 53 79 6d 2c 20 28 76  id*)pH, zSym, (v
299b0 6f 69 64 2a 29 70 72 6f 63 29 29 3b 0a 20 20 72  oid*)proc));.  r
299c0 65 74 75 72 6e 20 28 76 6f 69 64 28 2a 29 28 76  eturn (void(*)(v
299d0 6f 69 64 29 29 70 72 6f 63 3b 0a 7d 0a 73 74 61  oid))proc;.}.sta
299e0 74 69 63 20 76 6f 69 64 20 77 69 6e 44 6c 43 6c  tic void winDlCl
299f0 6f 73 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ose(sqlite3_vfs 
29a00 2a 70 56 66 73 2c 20 76 6f 69 64 20 2a 70 48 61  *pVfs, void *pHa
29a10 6e 64 6c 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f  ndle){.  UNUSED_
29a20 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b  PARAMETER(pVfs);
29a30 0a 20 20 6f 73 46 72 65 65 4c 69 62 72 61 72 79  .  osFreeLibrary
29a40 28 28 48 41 4e 44 4c 45 29 70 48 61 6e 64 6c 65  ((HANDLE)pHandle
29a50 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 44  );.  OSTRACE(("D
29a60 4c 43 4c 4f 53 45 20 68 61 6e 64 6c 65 3d 25 70  LCLOSE handle=%p
29a70 5c 6e 22 2c 20 28 76 6f 69 64 2a 29 70 48 61 6e  \n", (void*)pHan
29a80 64 6c 65 29 29 3b 0a 7d 0a 23 65 6c 73 65 20 2f  dle));.}.#else /
29a90 2a 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  * if SQLITE_OMIT
29aa0 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 20  _LOAD_EXTENSION 
29ab0 69 73 20 64 65 66 69 6e 65 64 3a 20 2a 2f 0a 20  is defined: */. 
29ac0 20 23 64 65 66 69 6e 65 20 77 69 6e 44 6c 4f 70   #define winDlOp
29ad0 65 6e 20 20 30 0a 20 20 23 64 65 66 69 6e 65 20  en  0.  #define 
29ae0 77 69 6e 44 6c 45 72 72 6f 72 20 30 0a 20 20 23  winDlError 0.  #
29af0 64 65 66 69 6e 65 20 77 69 6e 44 6c 53 79 6d 20  define winDlSym 
29b00 20 20 30 0a 20 20 23 64 65 66 69 6e 65 20 77 69    0.  #define wi
29b10 6e 44 6c 43 6c 6f 73 65 20 30 0a 23 65 6e 64 69  nDlClose 0.#endi
29b20 66 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  f.../*.** Write 
29b30 75 70 20 74 6f 20 6e 42 75 66 20 62 79 74 65 73  up to nBuf bytes
29b40 20 6f 66 20 72 61 6e 64 6f 6d 6e 65 73 73 20 69   of randomness i
29b50 6e 74 6f 20 7a 42 75 66 2e 0a 2a 2f 0a 73 74 61  nto zBuf..*/.sta
29b60 74 69 63 20 69 6e 74 20 77 69 6e 52 61 6e 64 6f  tic int winRando
29b70 6d 6e 65 73 73 28 73 71 6c 69 74 65 33 5f 76 66  mness(sqlite3_vf
29b80 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 75  s *pVfs, int nBu
29b90 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a  f, char *zBuf){.
29ba0 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 55    int n = 0;.  U
29bb0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
29bc0 70 56 66 73 29 3b 0a 23 69 66 20 64 65 66 69 6e  pVfs);.#if defin
29bd0 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a  ed(SQLITE_TEST).
29be0 20 20 6e 20 3d 20 6e 42 75 66 3b 0a 20 20 6d 65    n = nBuf;.  me
29bf0 6d 73 65 74 28 7a 42 75 66 2c 20 30 2c 20 6e 42  mset(zBuf, 0, nB
29c00 75 66 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28  uf);.#else.  if(
29c10 20 73 69 7a 65 6f 66 28 53 59 53 54 45 4d 54 49   sizeof(SYSTEMTI
29c20 4d 45 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20  ME)<=nBuf-n ){. 
29c30 20 20 20 53 59 53 54 45 4d 54 49 4d 45 20 78 3b     SYSTEMTIME x;
29c40 0a 20 20 20 20 6f 73 47 65 74 53 79 73 74 65 6d  .    osGetSystem
29c50 54 69 6d 65 28 26 78 29 3b 0a 20 20 20 20 6d 65  Time(&x);.    me
29c60 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26  mcpy(&zBuf[n], &
29c70 78 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20  x, sizeof(x));. 
29c80 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 78     n += sizeof(x
29c90 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 69 7a  );.  }.  if( siz
29ca0 65 6f 66 28 44 57 4f 52 44 29 3c 3d 6e 42 75 66  eof(DWORD)<=nBuf
29cb0 2d 6e 20 29 7b 0a 20 20 20 20 44 57 4f 52 44 20  -n ){.    DWORD 
29cc0 70 69 64 20 3d 20 6f 73 47 65 74 43 75 72 72 65  pid = osGetCurre
29cd0 6e 74 50 72 6f 63 65 73 73 49 64 28 29 3b 0a 20  ntProcessId();. 
29ce0 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b     memcpy(&zBuf[
29cf0 6e 5d 2c 20 26 70 69 64 2c 20 73 69 7a 65 6f 66  n], &pid, sizeof
29d00 28 70 69 64 29 29 3b 0a 20 20 20 20 6e 20 2b 3d  (pid));.    n +=
29d10 20 73 69 7a 65 6f 66 28 70 69 64 29 3b 0a 20 20   sizeof(pid);.  
29d20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  }.#if SQLITE_OS_
29d30 57 49 4e 52 54 0a 20 20 69 66 28 20 73 69 7a 65  WINRT.  if( size
29d40 6f 66 28 55 4c 4f 4e 47 4c 4f 4e 47 29 3c 3d 6e  of(ULONGLONG)<=n
29d50 42 75 66 2d 6e 20 29 7b 0a 20 20 20 20 55 4c 4f  Buf-n ){.    ULO
29d60 4e 47 4c 4f 4e 47 20 63 6e 74 20 3d 20 6f 73 47  NGLONG cnt = osG
29d70 65 74 54 69 63 6b 43 6f 75 6e 74 36 34 28 29 3b  etTickCount64();
29d80 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75  .    memcpy(&zBu
29d90 66 5b 6e 5d 2c 20 26 63 6e 74 2c 20 73 69 7a 65  f[n], &cnt, size
29da0 6f 66 28 63 6e 74 29 29 3b 0a 20 20 20 20 6e 20  of(cnt));.    n 
29db0 2b 3d 20 73 69 7a 65 6f 66 28 63 6e 74 29 3b 0a  += sizeof(cnt);.
29dc0 20 20 7d 0a 23 65 6c 73 65 0a 20 20 69 66 28 20    }.#else.  if( 
29dd0 73 69 7a 65 6f 66 28 44 57 4f 52 44 29 3c 3d 6e  sizeof(DWORD)<=n
29de0 42 75 66 2d 6e 20 29 7b 0a 20 20 20 20 44 57 4f  Buf-n ){.    DWO
29df0 52 44 20 63 6e 74 20 3d 20 6f 73 47 65 74 54 69  RD cnt = osGetTi
29e00 63 6b 43 6f 75 6e 74 28 29 3b 0a 20 20 20 20 6d  ckCount();.    m
29e10 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20  emcpy(&zBuf[n], 
29e20 26 63 6e 74 2c 20 73 69 7a 65 6f 66 28 63 6e 74  &cnt, sizeof(cnt
29e30 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a  ));.    n += siz
29e40 65 6f 66 28 63 6e 74 29 3b 0a 20 20 7d 0a 23 65  eof(cnt);.  }.#e
29e50 6e 64 69 66 0a 20 20 69 66 28 20 73 69 7a 65 6f  ndif.  if( sizeo
29e60 66 28 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 29  f(LARGE_INTEGER)
29e70 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20 20  <=nBuf-n ){.    
29e80 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 20 69 3b  LARGE_INTEGER i;
29e90 0a 20 20 20 20 6f 73 51 75 65 72 79 50 65 72 66  .    osQueryPerf
29ea0 6f 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72 28 26  ormanceCounter(&
29eb0 69 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  i);.    memcpy(&
29ec0 7a 42 75 66 5b 6e 5d 2c 20 26 69 2c 20 73 69 7a  zBuf[n], &i, siz
29ed0 65 6f 66 28 69 29 29 3b 0a 20 20 20 20 6e 20 2b  eof(i));.    n +
29ee0 3d 20 73 69 7a 65 6f 66 28 69 29 3b 0a 20 20 7d  = sizeof(i);.  }
29ef0 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
29f00 20 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 6c   n;.}.../*.** Sl
29f10 65 65 70 20 66 6f 72 20 61 20 6c 69 74 74 6c 65  eep for a little
29f20 20 77 68 69 6c 65 2e 20 20 52 65 74 75 72 6e 20   while.  Return 
29f30 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69  the amount of ti
29f40 6d 65 20 73 6c 65 70 74 2e 0a 2a 2f 0a 73 74 61  me slept..*/.sta
29f50 74 69 63 20 69 6e 74 20 77 69 6e 53 6c 65 65 70  tic int winSleep
29f60 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56  (sqlite3_vfs *pV
29f70 66 73 2c 20 69 6e 74 20 6d 69 63 72 6f 73 65 63  fs, int microsec
29f80 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 77 69 6e  ){.  sqlite3_win
29f90 33 32 5f 73 6c 65 65 70 28 28 6d 69 63 72 6f 73  32_sleep((micros
29fa0 65 63 2b 39 39 39 29 2f 31 30 30 30 29 3b 0a 20  ec+999)/1000);. 
29fb0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
29fc0 52 28 70 56 66 73 29 3b 0a 20 20 72 65 74 75 72  R(pVfs);.  retur
29fd0 6e 20 28 28 6d 69 63 72 6f 73 65 63 2b 39 39 39  n ((microsec+999
29fe0 29 2f 31 30 30 30 29 2a 31 30 30 30 3b 0a 7d 0a  )/1000)*1000;.}.
29ff0 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
2a000 77 69 6e 67 20 76 61 72 69 61 62 6c 65 2c 20 69  wing variable, i
2a010 66 20 73 65 74 20 74 6f 20 61 20 6e 6f 6e 2d 7a  f set to a non-z
2a020 65 72 6f 20 76 61 6c 75 65 2c 20 69 73 20 69 6e  ero value, is in
2a030 74 65 72 70 72 65 74 65 64 20 61 73 0a 2a 2a 20  terpreted as.** 
2a040 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 65  the number of se
2a050 63 6f 6e 64 73 20 73 69 6e 63 65 20 31 39 37 30  conds since 1970
2a060 20 61 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20   and is used to 
2a070 73 65 74 20 74 68 65 20 72 65 73 75 6c 74 20 6f  set the result o
2a080 66 0a 2a 2a 20 73 71 6c 69 74 65 33 4f 73 43 75  f.** sqlite3OsCu
2a090 72 72 65 6e 74 54 69 6d 65 28 29 20 64 75 72 69  rrentTime() duri
2a0a0 6e 67 20 74 65 73 74 69 6e 67 2e 0a 2a 2f 0a 23  ng testing..*/.#
2a0b0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
2a0c0 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 75  T.int sqlite3_cu
2a0d0 72 72 65 6e 74 5f 74 69 6d 65 20 3d 20 30 3b 20  rrent_time = 0; 
2a0e0 20 2f 2a 20 46 61 6b 65 20 73 79 73 74 65 6d 20   /* Fake system 
2a0f0 74 69 6d 65 20 69 6e 20 73 65 63 6f 6e 64 73 20  time in seconds 
2a100 73 69 6e 63 65 20 31 39 37 30 2e 20 2a 2f 0a 23  since 1970. */.#
2a110 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e  endif../*.** Fin
2a120 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 69  d the current ti
2a130 6d 65 20 28 69 6e 20 55 6e 69 76 65 72 73 61 6c  me (in Universal
2a140 20 43 6f 6f 72 64 69 6e 61 74 65 64 20 54 69 6d   Coordinated Tim
2a150 65 29 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20  e).  Write into 
2a160 2a 70 69 4e 6f 77 0a 2a 2a 20 74 68 65 20 63 75  *piNow.** the cu
2a170 72 72 65 6e 74 20 74 69 6d 65 20 61 6e 64 20 64  rrent time and d
2a180 61 74 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20  ate as a Julian 
2a190 44 61 79 20 6e 75 6d 62 65 72 20 74 69 6d 65 73  Day number times
2a1a0 20 38 36 5f 34 30 30 5f 30 30 30 2e 20 20 49 6e   86_400_000.  In
2a1b0 0a 2a 2a 20 6f 74 68 65 72 20 77 6f 72 64 73 2c  .** other words,
2a1c0 20 77 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e   write into *piN
2a1d0 6f 77 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ow the number of
2a1e0 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 73 69   milliseconds si
2a1f0 6e 63 65 20 74 68 65 20 4a 75 6c 69 61 6e 0a 2a  nce the Julian.*
2a200 2a 20 65 70 6f 63 68 20 6f 66 20 6e 6f 6f 6e 20  * epoch of noon 
2a210 69 6e 20 47 72 65 65 6e 77 69 63 68 20 6f 6e 20  in Greenwich on 
2a220 4e 6f 76 65 6d 62 65 72 20 32 34 2c 20 34 37 31  November 24, 471
2a230 34 20 42 2e 43 20 61 63 63 6f 72 64 69 6e 67 20  4 B.C according 
2a240 74 6f 20 74 68 65 0a 2a 2a 20 70 72 6f 6c 65 70  to the.** prolep
2a250 74 69 63 20 47 72 65 67 6f 72 69 61 6e 20 63 61  tic Gregorian ca
2a260 6c 65 6e 64 61 72 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  lendar..**.** On
2a270 20 73 75 63 63 65 73 73 2c 20 72 65 74 75 72 6e   success, return
2a280 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 20 52 65 74   SQLITE_OK.  Ret
2a290 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
2a2a0 20 69 66 20 74 68 65 20 74 69 6d 65 20 61 6e 64   if the time and
2a2b0 20 64 61 74 65 0a 2a 2a 20 63 61 6e 6e 6f 74 20   date.** cannot 
2a2c0 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61  be found..*/.sta
2a2d0 74 69 63 20 69 6e 74 20 77 69 6e 43 75 72 72 65  tic int winCurre
2a2e0 6e 74 54 69 6d 65 49 6e 74 36 34 28 73 71 6c 69  ntTimeInt64(sqli
2a2f0 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 73  te3_vfs *pVfs, s
2a300 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 69  qlite3_int64 *pi
2a310 4e 6f 77 29 7b 0a 20 20 2f 2a 20 46 49 4c 45 54  Now){.  /* FILET
2a320 49 4d 45 20 73 74 72 75 63 74 75 72 65 20 69 73  IME structure is
2a330 20 61 20 36 34 2d 62 69 74 20 76 61 6c 75 65 20   a 64-bit value 
2a340 72 65 70 72 65 73 65 6e 74 69 6e 67 20 74 68 65  representing the
2a350 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 20   number of.     
2a360 31 30 30 2d 6e 61 6e 6f 73 65 63 6f 6e 64 20 69  100-nanosecond i
2a370 6e 74 65 72 76 61 6c 73 20 73 69 6e 63 65 20 4a  ntervals since J
2a380 61 6e 75 61 72 79 20 31 2c 20 31 36 30 31 20 28  anuary 1, 1601 (
2a390 3d 20 4a 44 20 32 33 30 35 38 31 33 2e 35 29 2e  = JD 2305813.5).
2a3a0 0a 20 20 2a 2f 0a 20 20 46 49 4c 45 54 49 4d 45  .  */.  FILETIME
2a3b0 20 66 74 3b 0a 20 20 73 74 61 74 69 63 20 63 6f   ft;.  static co
2a3c0 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  nst sqlite3_int6
2a3d0 34 20 77 69 6e 46 69 6c 65 74 69 6d 65 45 70 6f  4 winFiletimeEpo
2a3e0 63 68 20 3d 20 32 33 30 35 38 31 33 35 2a 28 73  ch = 23058135*(s
2a3f0 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 38 36 34  qlite3_int64)864
2a400 30 30 30 30 3b 0a 23 69 66 64 65 66 20 53 51 4c  0000;.#ifdef SQL
2a410 49 54 45 5f 54 45 53 54 0a 20 20 73 74 61 74 69  ITE_TEST.  stati
2a420 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  c const sqlite3_
2a430 69 6e 74 36 34 20 75 6e 69 78 45 70 6f 63 68 20  int64 unixEpoch 
2a440 3d 20 32 34 34 30 35 38 37 35 2a 28 73 71 6c 69  = 24405875*(sqli
2a450 74 65 33 5f 69 6e 74 36 34 29 38 36 34 30 30 30  te3_int64)864000
2a460 30 3b 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20 32  0;.#endif.  /* 2
2a470 5e 33 32 20 2d 20 74 6f 20 61 76 6f 69 64 20 75  ^32 - to avoid u
2a480 73 65 20 6f 66 20 4c 4c 20 61 6e 64 20 77 61 72  se of LL and war
2a490 6e 69 6e 67 73 20 69 6e 20 67 63 63 20 2a 2f 0a  nings in gcc */.
2a4a0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73    static const s
2a4b0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 61 78  qlite3_int64 max
2a4c0 33 32 42 69 74 56 61 6c 75 65 20 3d 0a 20 20 20  32BitValue =.   
2a4d0 20 20 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36     (sqlite3_int6
2a4e0 34 29 32 30 30 30 30 30 30 30 30 30 20 2b 20 28  4)2000000000 + (
2a4f0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 32 30  sqlite3_int64)20
2a500 30 30 30 30 30 30 30 30 20 2b 0a 20 20 20 20 20  00000000 +.     
2a510 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29   (sqlite3_int64)
2a520 32 39 34 39 36 37 32 39 36 3b 0a 0a 23 69 66 20  294967296;..#if 
2a530 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
2a540 20 20 53 59 53 54 45 4d 54 49 4d 45 20 74 69 6d    SYSTEMTIME tim
2a550 65 3b 0a 20 20 6f 73 47 65 74 53 79 73 74 65 6d  e;.  osGetSystem
2a560 54 69 6d 65 28 26 74 69 6d 65 29 3b 0a 20 20 2f  Time(&time);.  /
2a570 2a 20 69 66 20 53 79 73 74 65 6d 54 69 6d 65 54  * if SystemTimeT
2a580 6f 46 69 6c 65 54 69 6d 65 28 29 20 66 61 69 6c  oFileTime() fail
2a590 73 2c 20 69 74 20 72 65 74 75 72 6e 73 20 7a 65  s, it returns ze
2a5a0 72 6f 2e 20 2a 2f 0a 20 20 69 66 20 28 21 6f 73  ro. */.  if (!os
2a5b0 53 79 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65  SystemTimeToFile
2a5c0 54 69 6d 65 28 26 74 69 6d 65 2c 26 66 74 29 29  Time(&time,&ft))
2a5d0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
2a5e0 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 23  ITE_ERROR;.  }.#
2a5f0 65 6c 73 65 0a 20 20 6f 73 47 65 74 53 79 73 74  else.  osGetSyst
2a600 65 6d 54 69 6d 65 41 73 46 69 6c 65 54 69 6d 65  emTimeAsFileTime
2a610 28 20 26 66 74 20 29 3b 0a 23 65 6e 64 69 66 0a  ( &ft );.#endif.
2a620 0a 20 20 2a 70 69 4e 6f 77 20 3d 20 77 69 6e 46  .  *piNow = winF
2a630 69 6c 65 74 69 6d 65 45 70 6f 63 68 20 2b 0a 20  iletimeEpoch +. 
2a640 20 20 20 20 20 20 20 20 20 20 20 28 28 28 28 73             ((((s
2a650 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 66 74 2e  qlite3_int64)ft.
2a660 64 77 48 69 67 68 44 61 74 65 54 69 6d 65 29 2a  dwHighDateTime)*
2a670 6d 61 78 33 32 42 69 74 56 61 6c 75 65 29 20 2b  max32BitValue) +
2a680 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2a690 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 66  (sqlite3_int64)f
2a6a0 74 2e 64 77 4c 6f 77 44 61 74 65 54 69 6d 65 29  t.dwLowDateTime)
2a6b0 2f 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  /(sqlite3_int64)
2a6c0 31 30 30 30 30 3b 0a 0a 23 69 66 64 65 66 20 53  10000;..#ifdef S
2a6d0 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28  QLITE_TEST.  if(
2a6e0 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74   sqlite3_current
2a6f0 5f 74 69 6d 65 20 29 7b 0a 20 20 20 20 2a 70 69  _time ){.    *pi
2a700 4e 6f 77 20 3d 20 31 30 30 30 2a 28 73 71 6c 69  Now = 1000*(sqli
2a710 74 65 33 5f 69 6e 74 36 34 29 73 71 6c 69 74 65  te3_int64)sqlite
2a720 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 2b  3_current_time +
2a730 20 75 6e 69 78 45 70 6f 63 68 3b 0a 20 20 7d 0a   unixEpoch;.  }.
2a740 23 65 6e 64 69 66 0a 20 20 55 4e 55 53 45 44 5f  #endif.  UNUSED_
2a750 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b  PARAMETER(pVfs);
2a760 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
2a770 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69  _OK;.}../*.** Fi
2a780 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  nd the current t
2a790 69 6d 65 20 28 69 6e 20 55 6e 69 76 65 72 73 61  ime (in Universa
2a7a0 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64 20 54 69  l Coordinated Ti
2a7b0 6d 65 29 2e 20 20 57 72 69 74 65 20 74 68 65 0a  me).  Write the.
2a7c0 2a 2a 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20  ** current time 
2a7d0 61 6e 64 20 64 61 74 65 20 61 73 20 61 20 4a 75  and date as a Ju
2a7e0 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62 65 72 20  lian Day number 
2a7f0 69 6e 74 6f 20 2a 70 72 4e 6f 77 20 61 6e 64 0a  into *prNow and.
2a800 2a 2a 20 72 65 74 75 72 6e 20 30 2e 20 20 52 65  ** return 0.  Re
2a810 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 74 69  turn 1 if the ti
2a820 6d 65 20 61 6e 64 20 64 61 74 65 20 63 61 6e 6e  me and date cann
2a830 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a  ot be found..*/.
2a840 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 43 75  static int winCu
2a850 72 72 65 6e 74 54 69 6d 65 28 73 71 6c 69 74 65  rrentTime(sqlite
2a860 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 64 6f 75  3_vfs *pVfs, dou
2a870 62 6c 65 20 2a 70 72 4e 6f 77 29 7b 0a 20 20 69  ble *prNow){.  i
2a880 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33  nt rc;.  sqlite3
2a890 5f 69 6e 74 36 34 20 69 3b 0a 20 20 72 63 20 3d  _int64 i;.  rc =
2a8a0 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 49   winCurrentTimeI
2a8b0 6e 74 36 34 28 70 56 66 73 2c 20 26 69 29 3b 0a  nt64(pVfs, &i);.
2a8c0 20 20 69 66 28 20 21 72 63 20 29 7b 0a 20 20 20    if( !rc ){.   
2a8d0 20 2a 70 72 4e 6f 77 20 3d 20 69 2f 38 36 34 30   *prNow = i/8640
2a8e0 30 30 30 30 2e 30 3b 0a 20 20 7d 0a 20 20 72 65  0000.0;.  }.  re
2a8f0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2a900 2a 20 54 68 65 20 69 64 65 61 20 69 73 20 74 68  * The idea is th
2a910 61 74 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  at this function
2a920 20 77 6f 72 6b 73 20 6c 69 6b 65 20 61 20 63 6f   works like a co
2a930 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 0a 2a 2a 20  mbination of.** 
2a940 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 20 61  GetLastError() a
2a950 6e 64 20 46 6f 72 6d 61 74 4d 65 73 73 61 67 65  nd FormatMessage
2a960 28 29 20 6f 6e 20 57 69 6e 64 6f 77 73 20 28 6f  () on Windows (o
2a970 72 20 65 72 72 6e 6f 20 61 6e 64 0a 2a 2a 20 73  r errno and.** s
2a980 74 72 65 72 72 6f 72 5f 72 28 29 20 6f 6e 20 55  trerror_r() on U
2a990 6e 69 78 29 2e 20 41 66 74 65 72 20 61 6e 20 65  nix). After an e
2a9a0 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  rror is returned
2a9b0 20 62 79 20 61 6e 20 4f 53 0a 2a 2a 20 66 75 6e   by an OS.** fun
2a9c0 63 74 69 6f 6e 2c 20 53 51 4c 69 74 65 20 63 61  ction, SQLite ca
2a9d0 6c 6c 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f  lls this functio
2a9e0 6e 20 77 69 74 68 20 7a 42 75 66 20 70 6f 69 6e  n with zBuf poin
2a9f0 74 69 6e 67 20 74 6f 0a 2a 2a 20 61 20 62 75 66  ting to.** a buf
2aa00 66 65 72 20 6f 66 20 6e 42 75 66 20 62 79 74 65  fer of nBuf byte
2aa10 73 2e 20 54 68 65 20 4f 53 20 6c 61 79 65 72 20  s. The OS layer 
2aa20 73 68 6f 75 6c 64 20 70 6f 70 75 6c 61 74 65 20  should populate 
2aa30 74 68 65 0a 2a 2a 20 62 75 66 66 65 72 20 77 69  the.** buffer wi
2aa40 74 68 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  th a nul-termina
2aa50 74 65 64 20 55 54 46 2d 38 20 65 6e 63 6f 64 65  ted UTF-8 encode
2aa60 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a  d error message.
2aa70 2a 2a 20 64 65 73 63 72 69 62 69 6e 67 20 74 68  ** describing th
2aa80 65 20 6c 61 73 74 20 49 4f 20 65 72 72 6f 72 20  e last IO error 
2aa90 74 6f 20 68 61 76 65 20 6f 63 63 75 72 72 65 64  to have occurred
2aaa0 20 77 69 74 68 69 6e 20 74 68 65 20 63 61 6c 6c   within the call
2aab0 69 6e 67 0a 2a 2a 20 74 68 72 65 61 64 2e 0a 2a  ing.** thread..*
2aac0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 72 72 6f  *.** If the erro
2aad0 72 20 6d 65 73 73 61 67 65 20 69 73 20 74 6f 6f  r message is too
2aae0 20 6c 61 72 67 65 20 66 6f 72 20 74 68 65 20 73   large for the s
2aaf0 75 70 70 6c 69 65 64 20 62 75 66 66 65 72 2c 0a  upplied buffer,.
2ab00 2a 2a 20 69 74 20 73 68 6f 75 6c 64 20 62 65 20  ** it should be 
2ab10 74 72 75 6e 63 61 74 65 64 2e 20 54 68 65 20 72  truncated. The r
2ab20 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 78  eturn value of x
2ab30 47 65 74 4c 61 73 74 45 72 72 6f 72 0a 2a 2a 20  GetLastError.** 
2ab40 69 73 20 7a 65 72 6f 20 69 66 20 74 68 65 20 65  is zero if the e
2ab50 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66 69 74  rror message fit
2ab60 73 20 69 6e 20 74 68 65 20 62 75 66 66 65 72 2c  s in the buffer,
2ab70 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20   or non-zero.** 
2ab80 6f 74 68 65 72 77 69 73 65 20 28 69 66 20 74 68  otherwise (if th
2ab90 65 20 6d 65 73 73 61 67 65 20 77 61 73 20 74 72  e message was tr
2aba0 75 6e 63 61 74 65 64 29 2e 20 49 66 20 6e 6f 6e  uncated). If non
2abb0 2d 7a 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65  -zero is returne
2abc0 64 2c 0a 2a 2a 20 74 68 65 6e 20 69 74 20 69 73  d,.** then it is
2abd0 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74   not necessary t
2abe0 6f 20 69 6e 63 6c 75 64 65 20 74 68 65 20 6e 75  o include the nu
2abf0 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20 63 68 61  l-terminator cha
2ac00 72 61 63 74 65 72 0a 2a 2a 20 69 6e 20 74 68 65  racter.** in the
2ac10 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 2e 0a   output buffer..
2ac20 2a 2a 0a 2a 2a 20 4e 6f 74 20 73 75 70 70 6c 79  **.** Not supply
2ac30 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ing an error mes
2ac40 73 61 67 65 20 77 69 6c 6c 20 68 61 76 65 20 6e  sage will have n
2ac50 6f 20 61 64 76 65 72 73 65 20 65 66 66 65 63 74  o adverse effect
2ac60 0a 2a 2a 20 6f 6e 20 53 51 4c 69 74 65 2e 20 49  .** on SQLite. I
2ac70 74 20 69 73 20 66 69 6e 65 20 74 6f 20 68 61 76  t is fine to hav
2ac80 65 20 61 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74  e an implementat
2ac90 69 6f 6e 20 74 68 61 74 20 6e 65 76 65 72 0a 2a  ion that never.*
2aca0 2a 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72  * returns an err
2acb0 6f 72 20 6d 65 73 73 61 67 65 3a 0a 2a 2a 0a 2a  or message:.**.*
2acc0 2a 20 20 20 69 6e 74 20 78 47 65 74 4c 61 73 74  *   int xGetLast
2acd0 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66  Error(sqlite3_vf
2ace0 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 75  s *pVfs, int nBu
2acf0 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a  f, char *zBuf){.
2ad00 2a 2a 20 20 20 20 20 61 73 73 65 72 74 28 7a 42  **     assert(zB
2ad10 75 66 5b 30 5d 3d 3d 27 5c 30 27 29 3b 0a 2a 2a  uf[0]=='\0');.**
2ad20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 2a       return 0;.*
2ad30 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 48 6f 77 65  *   }.**.** Howe
2ad40 76 65 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20  ver if an error 
2ad50 6d 65 73 73 61 67 65 20 69 73 20 73 75 70 70 6c  message is suppl
2ad60 69 65 64 2c 20 69 74 20 77 69 6c 6c 20 62 65 20  ied, it will be 
2ad70 69 6e 63 6f 72 70 6f 72 61 74 65 64 0a 2a 2a 20  incorporated.** 
2ad80 62 79 20 73 71 6c 69 74 65 20 69 6e 74 6f 20 74  by sqlite into t
2ad90 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  he error message
2ada0 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 74 68   available to th
2adb0 65 20 75 73 65 72 20 75 73 69 6e 67 0a 2a 2a 20  e user using.** 
2adc0 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 29  sqlite3_errmsg()
2add0 2c 20 70 6f 73 73 69 62 6c 79 20 6d 61 6b 69 6e  , possibly makin
2ade0 67 20 49 4f 20 65 72 72 6f 72 73 20 65 61 73 69  g IO errors easi
2adf0 65 72 20 74 6f 20 64 65 62 75 67 2e 0a 2a 2f 0a  er to debug..*/.
2ae00 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 47 65  static int winGe
2ae10 74 4c 61 73 74 45 72 72 6f 72 28 73 71 6c 69 74  tLastError(sqlit
2ae20 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e  e3_vfs *pVfs, in
2ae30 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42  t nBuf, char *zB
2ae40 75 66 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  uf){.  UNUSED_PA
2ae50 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20  RAMETER(pVfs);. 
2ae60 20 72 65 74 75 72 6e 20 77 69 6e 47 65 74 4c 61   return winGetLa
2ae70 73 74 45 72 72 6f 72 4d 73 67 28 6f 73 47 65 74  stErrorMsg(osGet
2ae80 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 6e 42 75  LastError(), nBu
2ae90 66 2c 20 7a 42 75 66 29 3b 0a 7d 0a 0a 2f 2a 0a  f, zBuf);.}../*.
2aea0 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e  ** Initialize an
2aeb0 64 20 64 65 69 6e 69 74 69 61 6c 69 7a 65 20 74  d deinitialize t
2aec0 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  he operating sys
2aed0 74 65 6d 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a  tem interface..*
2aee0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73  /.int sqlite3_os
2aef0 5f 69 6e 69 74 28 76 6f 69 64 29 7b 0a 20 20 73  _init(void){.  s
2af00 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 76 66  tatic sqlite3_vf
2af10 73 20 77 69 6e 56 66 73 20 3d 20 7b 0a 20 20 20  s winVfs = {.   
2af20 20 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   3,             
2af30 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f        /* iVersio
2af40 6e 20 2a 2f 0a 20 20 20 20 73 69 7a 65 6f 66 28  n */.    sizeof(
2af50 77 69 6e 46 69 6c 65 29 2c 20 20 20 20 20 2f 2a  winFile),     /*
2af60 20 73 7a 4f 73 46 69 6c 65 20 2a 2f 0a 20 20 20   szOsFile */.   
2af70 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41   SQLITE_WIN32_MA
2af80 58 5f 50 41 54 48 5f 42 59 54 45 53 2c 20 2f 2a  X_PATH_BYTES, /*
2af90 20 6d 78 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20   mxPathname */. 
2afa0 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20     0,           
2afb0 20 20 20 20 20 20 20 20 2f 2a 20 70 4e 65 78 74          /* pNext
2afc0 20 2a 2f 0a 20 20 20 20 22 77 69 6e 33 32 22 2c   */.    "win32",
2afd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2afe0 7a 4e 61 6d 65 20 2a 2f 0a 20 20 20 20 30 2c 20  zName */.    0, 
2aff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b000 20 20 2f 2a 20 70 41 70 70 44 61 74 61 20 2a 2f    /* pAppData */
2b010 0a 20 20 20 20 77 69 6e 4f 70 65 6e 2c 20 20 20  .    winOpen,   
2b020 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4f 70            /* xOp
2b030 65 6e 20 2a 2f 0a 20 20 20 20 77 69 6e 44 65 6c  en */.    winDel
2b040 65 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ete,           /
2b050 2a 20 78 44 65 6c 65 74 65 20 2a 2f 0a 20 20 20  * xDelete */.   
2b060 20 77 69 6e 41 63 63 65 73 73 2c 20 20 20 20 20   winAccess,     
2b070 20 20 20 20 20 20 2f 2a 20 78 41 63 63 65 73 73        /* xAccess
2b080 20 2a 2f 0a 20 20 20 20 77 69 6e 46 75 6c 6c 50   */.    winFullP
2b090 61 74 68 6e 61 6d 65 2c 20 20 20 20 20 2f 2a 20  athname,     /* 
2b0a0 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 2a 2f  xFullPathname */
2b0b0 0a 20 20 20 20 77 69 6e 44 6c 4f 70 65 6e 2c 20  .    winDlOpen, 
2b0c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c            /* xDl
2b0d0 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 77 69 6e 44  Open */.    winD
2b0e0 6c 45 72 72 6f 72 2c 20 20 20 20 20 20 20 20 20  lError,         
2b0f0 20 2f 2a 20 78 44 6c 45 72 72 6f 72 20 2a 2f 0a   /* xDlError */.
2b100 20 20 20 20 77 69 6e 44 6c 53 79 6d 2c 20 20 20      winDlSym,   
2b110 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 53           /* xDlS
2b120 79 6d 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 43  ym */.    winDlC
2b130 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  lose,          /
2b140 2a 20 78 44 6c 43 6c 6f 73 65 20 2a 2f 0a 20 20  * xDlClose */.  
2b150 20 20 77 69 6e 52 61 6e 64 6f 6d 6e 65 73 73 2c    winRandomness,
2b160 20 20 20 20 20 20 20 2f 2a 20 78 52 61 6e 64 6f         /* xRando
2b170 6d 6e 65 73 73 20 2a 2f 0a 20 20 20 20 77 69 6e  mness */.    win
2b180 53 6c 65 65 70 2c 20 20 20 20 20 20 20 20 20 20  Sleep,          
2b190 20 20 2f 2a 20 78 53 6c 65 65 70 20 2a 2f 0a 20    /* xSleep */. 
2b1a0 20 20 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d     winCurrentTim
2b1b0 65 2c 20 20 20 20 20 20 2f 2a 20 78 43 75 72 72  e,      /* xCurr
2b1c0 65 6e 74 54 69 6d 65 20 2a 2f 0a 20 20 20 20 77  entTime */.    w
2b1d0 69 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 2c 20  inGetLastError, 
2b1e0 20 20 20 20 2f 2a 20 78 47 65 74 4c 61 73 74 45      /* xGetLastE
2b1f0 72 72 6f 72 20 2a 2f 0a 20 20 20 20 77 69 6e 43  rror */.    winC
2b200 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 2c  urrentTimeInt64,
2b210 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65   /* xCurrentTime
2b220 49 6e 74 36 34 20 2a 2f 0a 20 20 20 20 77 69 6e  Int64 */.    win
2b230 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20  SetSystemCall,  
2b240 20 20 2f 2a 20 78 53 65 74 53 79 73 74 65 6d 43    /* xSetSystemC
2b250 61 6c 6c 20 2a 2f 0a 20 20 20 20 77 69 6e 47 65  all */.    winGe
2b260 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20 20  tSystemCall,    
2b270 2f 2a 20 78 47 65 74 53 79 73 74 65 6d 43 61 6c  /* xGetSystemCal
2b280 6c 20 2a 2f 0a 20 20 20 20 77 69 6e 4e 65 78 74  l */.    winNext
2b290 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20 2f 2a  SystemCall,   /*
2b2a0 20 78 4e 65 78 74 53 79 73 74 65 6d 43 61 6c 6c   xNextSystemCall
2b2b0 20 2a 2f 0a 20 20 7d 3b 0a 23 69 66 20 64 65 66   */.  };.#if def
2b2c0 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
2b2d0 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 73 74  2_HAS_WIDE).  st
2b2e0 61 74 69 63 20 73 71 6c 69 74 65 33 5f 76 66 73  atic sqlite3_vfs
2b2f0 20 77 69 6e 4c 6f 6e 67 50 61 74 68 56 66 73 20   winLongPathVfs 
2b300 3d 20 7b 0a 20 20 20 20 33 2c 20 20 20 20 20 20  = {.    3,      
2b310 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b320 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 20 20  iVersion */.    
2b330 73 69 7a 65 6f 66 28 77 69 6e 46 69 6c 65 29 2c  sizeof(winFile),
2b340 20 20 20 20 20 2f 2a 20 73 7a 4f 73 46 69 6c 65       /* szOsFile
2b350 20 2a 2f 0a 20 20 20 20 53 51 4c 49 54 45 5f 57   */.    SQLITE_W
2b360 49 4e 4e 54 5f 4d 41 58 5f 50 41 54 48 5f 42 59  INNT_MAX_PATH_BY
2b370 54 45 53 2c 20 2f 2a 20 6d 78 50 61 74 68 6e 61  TES, /* mxPathna
2b380 6d 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20  me */.    0,    
2b390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2b3a0 2a 20 70 4e 65 78 74 20 2a 2f 0a 20 20 20 20 22  * pNext */.    "
2b3b0 77 69 6e 33 32 2d 6c 6f 6e 67 70 61 74 68 22 2c  win32-longpath",
2b3c0 20 20 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a      /* zName */.
2b3d0 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20      0,          
2b3e0 20 20 20 20 20 20 20 20 20 2f 2a 20 70 41 70 70           /* pApp
2b3f0 44 61 74 61 20 2a 2f 0a 20 20 20 20 77 69 6e 4f  Data */.    winO
2b400 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  pen,            
2b410 20 2f 2a 20 78 4f 70 65 6e 20 2a 2f 0a 20 20 20   /* xOpen */.   
2b420 20 77 69 6e 44 65 6c 65 74 65 2c 20 20 20 20 20   winDelete,     
2b430 20 20 20 20 20 20 2f 2a 20 78 44 65 6c 65 74 65        /* xDelete
2b440 20 2a 2f 0a 20 20 20 20 77 69 6e 41 63 63 65 73   */.    winAcces
2b450 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s,           /* 
2b460 78 41 63 63 65 73 73 20 2a 2f 0a 20 20 20 20 77  xAccess */.    w
2b470 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20  inFullPathname, 
2b480 20 20 20 20 2f 2a 20 78 46 75 6c 6c 50 61 74 68      /* xFullPath
2b490 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 77 69 6e 44  name */.    winD
2b4a0 6c 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20  lOpen,          
2b4b0 20 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a 2f 0a 20   /* xDlOpen */. 
2b4c0 20 20 20 77 69 6e 44 6c 45 72 72 6f 72 2c 20 20     winDlError,  
2b4d0 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 45 72          /* xDlEr
2b4e0 72 6f 72 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c  ror */.    winDl
2b4f0 53 79 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  Sym,            
2b500 2f 2a 20 78 44 6c 53 79 6d 20 2a 2f 0a 20 20 20  /* xDlSym */.   
2b510 20 77 69 6e 44 6c 43 6c 6f 73 65 2c 20 20 20 20   winDlClose,    
2b520 20 20 20 20 20 20 2f 2a 20 78 44 6c 43 6c 6f 73        /* xDlClos
2b530 65 20 2a 2f 0a 20 20 20 20 77 69 6e 52 61 6e 64  e */.    winRand
2b540 6f 6d 6e 65 73 73 2c 20 20 20 20 20 20 20 2f 2a  omness,       /*
2b550 20 78 52 61 6e 64 6f 6d 6e 65 73 73 20 2a 2f 0a   xRandomness */.
2b560 20 20 20 20 77 69 6e 53 6c 65 65 70 2c 20 20 20      winSleep,   
2b570 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 6c 65           /* xSle
2b580 65 70 20 2a 2f 0a 20 20 20 20 77 69 6e 43 75 72  ep */.    winCur
2b590 72 65 6e 74 54 69 6d 65 2c 20 20 20 20 20 20 2f  rentTime,      /
2b5a0 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65 20 2a  * xCurrentTime *
2b5b0 2f 0a 20 20 20 20 77 69 6e 47 65 74 4c 61 73 74  /.    winGetLast
2b5c0 45 72 72 6f 72 2c 20 20 20 20 20 2f 2a 20 78 47  Error,     /* xG
2b5d0 65 74 4c 61 73 74 45 72 72 6f 72 20 2a 2f 0a 20  etLastError */. 
2b5e0 20 20 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d     winCurrentTim
2b5f0 65 49 6e 74 36 34 2c 20 2f 2a 20 78 43 75 72 72  eInt64, /* xCurr
2b600 65 6e 74 54 69 6d 65 49 6e 74 36 34 20 2a 2f 0a  entTimeInt64 */.
2b610 20 20 20 20 77 69 6e 53 65 74 53 79 73 74 65 6d      winSetSystem
2b620 43 61 6c 6c 2c 20 20 20 20 2f 2a 20 78 53 65 74  Call,    /* xSet
2b630 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20  SystemCall */.  
2b640 20 20 77 69 6e 47 65 74 53 79 73 74 65 6d 43 61    winGetSystemCa
2b650 6c 6c 2c 20 20 20 20 2f 2a 20 78 47 65 74 53 79  ll,    /* xGetSy
2b660 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20 20  stemCall */.    
2b670 77 69 6e 4e 65 78 74 53 79 73 74 65 6d 43 61 6c  winNextSystemCal
2b680 6c 2c 20 20 20 2f 2a 20 78 4e 65 78 74 53 79 73  l,   /* xNextSys
2b690 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 7d 3b 0a  temCall */.  };.
2b6a0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 6f 75  #endif..  /* Dou
2b6b0 62 6c 65 2d 63 68 65 63 6b 20 74 68 61 74 20 74  ble-check that t
2b6c0 68 65 20 61 53 79 73 63 61 6c 6c 5b 5d 20 61 72  he aSyscall[] ar
2b6d0 72 61 79 20 68 61 73 20 62 65 65 6e 20 63 6f 6e  ray has been con
2b6e0 73 74 72 75 63 74 65 64 0a 20 20 2a 2a 20 63 6f  structed.  ** co
2b6f0 72 72 65 63 74 6c 79 2e 20 20 53 65 65 20 74 69  rrectly.  See ti
2b700 63 6b 65 74 20 5b 62 62 33 61 38 36 65 38 39 30  cket [bb3a86e890
2b710 63 38 65 39 36 61 62 5d 20 2a 2f 0a 20 20 61 73  c8e96ab] */.  as
2b720 73 65 72 74 28 20 41 72 72 61 79 53 69 7a 65 28  sert( ArraySize(
2b730 61 53 79 73 63 61 6c 6c 29 3d 3d 37 37 20 29 3b  aSyscall)==77 );
2b740 0a 0a 20 20 2f 2a 20 67 65 74 20 6d 65 6d 6f 72  ..  /* get memor
2b750 79 20 6d 61 70 20 61 6c 6c 6f 63 61 74 69 6f 6e  y map allocation
2b760 20 67 72 61 6e 75 6c 61 72 69 74 79 20 2a 2f 0a   granularity */.
2b770 20 20 6d 65 6d 73 65 74 28 26 77 69 6e 53 79 73    memset(&winSys
2b780 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Info, 0, sizeof(
2b790 53 59 53 54 45 4d 5f 49 4e 46 4f 29 29 3b 0a 23  SYSTEM_INFO));.#
2b7a0 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
2b7b0 52 54 0a 20 20 6f 73 47 65 74 4e 61 74 69 76 65  RT.  osGetNative
2b7c0 53 79 73 74 65 6d 49 6e 66 6f 28 26 77 69 6e 53  SystemInfo(&winS
2b7d0 79 73 49 6e 66 6f 29 3b 0a 23 65 6c 73 65 0a 20  ysInfo);.#else. 
2b7e0 20 6f 73 47 65 74 53 79 73 74 65 6d 49 6e 66 6f   osGetSystemInfo
2b7f0 28 26 77 69 6e 53 79 73 49 6e 66 6f 29 3b 0a 23  (&winSysInfo);.#
2b800 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20  endif.  assert( 
2b810 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77 41 6c 6c  winSysInfo.dwAll
2b820 6f 63 61 74 69 6f 6e 47 72 61 6e 75 6c 61 72 69  ocationGranulari
2b830 74 79 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  ty>0 );.  assert
2b840 28 20 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77 50  ( winSysInfo.dwP
2b850 61 67 65 53 69 7a 65 3e 30 20 29 3b 0a 0a 20 20  ageSize>0 );..  
2b860 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69  sqlite3_vfs_regi
2b870 73 74 65 72 28 26 77 69 6e 56 66 73 2c 20 31 29  ster(&winVfs, 1)
2b880 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  ;..#if defined(S
2b890 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
2b8a0 57 49 44 45 29 0a 20 20 73 71 6c 69 74 65 33 5f  WIDE).  sqlite3_
2b8b0 76 66 73 5f 72 65 67 69 73 74 65 72 28 26 77 69  vfs_register(&wi
2b8c0 6e 4c 6f 6e 67 50 61 74 68 56 66 73 2c 20 30 29  nLongPathVfs, 0)
2b8d0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75  ;.#endif..  retu
2b8e0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
2b8f0 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f  .int sqlite3_os_
2b900 65 6e 64 28 76 6f 69 64 29 7b 0a 23 69 66 20 53  end(void){.#if S
2b910 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
2b920 20 69 66 28 20 73 6c 65 65 70 4f 62 6a 21 3d 4e   if( sleepObj!=N
2b930 55 4c 4c 20 29 7b 0a 20 20 20 20 6f 73 43 6c 6f  ULL ){.    osClo
2b940 73 65 48 61 6e 64 6c 65 28 73 6c 65 65 70 4f 62  seHandle(sleepOb
2b950 6a 29 3b 0a 20 20 20 20 73 6c 65 65 70 4f 62 6a  j);.    sleepObj
2b960 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 23 65 6e   = NULL;.  }.#en
2b970 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  dif.  return SQL
2b980 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69  ITE_OK;.}..#endi
2b990 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 53 5f 57  f /* SQLITE_OS_W
2b9a0 49 4e 20 2a 2f 0a                                IN */.