/ Hex Artifact Content
Login

Artifact 817005660016dcaee908b44e4437c000f3666b4c:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63   file contains c
0190: 6f 64 65 20 74 68 61 74 20 69 73 20 73 70 65 63  ode that is spec
01a0: 69 66 69 63 20 74 6f 20 57 69 6e 64 6f 77 73 2e  ific to Windows.
01b0: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71  .*/.#include "sq
01c0: 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 66 20 53  liteInt.h".#if S
01d0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 20 20 20  QLITE_OS_WIN    
01e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
01f0: 69 73 20 66 69 6c 65 20 69 73 20 75 73 65 64 20  is file is used 
0200: 66 6f 72 20 57 69 6e 64 6f 77 73 20 6f 6e 6c 79  for Windows only
0210: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 6c 75   */../*.** Inclu
0220: 64 65 20 63 6f 64 65 20 74 68 61 74 20 69 73 20  de code that is 
0230: 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6f 73  common to all os
0240: 5f 2a 2e 63 20 66 69 6c 65 73 0a 2a 2f 0a 23 69  _*.c files.*/.#i
0250: 6e 63 6c 75 64 65 20 22 6f 73 5f 63 6f 6d 6d 6f  nclude "os_commo
0260: 6e 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 6c  n.h"../*.** Incl
0270: 75 64 65 20 74 68 65 20 68 65 61 64 65 72 20 66  ude the header f
0280: 69 6c 65 20 66 6f 72 20 74 68 65 20 57 69 6e 64  ile for the Wind
0290: 6f 77 73 20 56 46 53 2e 0a 2a 2f 0a 23 69 6e 63  ows VFS..*/.#inc
02a0: 6c 75 64 65 20 22 6f 73 5f 77 69 6e 2e 68 22 0a  lude "os_win.h".
02b0: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 69 6e 67  ./*.** Compiling
02c0: 20 61 6e 64 20 75 73 69 6e 67 20 57 41 4c 20 6d   and using WAL m
02d0: 6f 64 65 20 72 65 71 75 69 72 65 73 20 73 65 76  ode requires sev
02e0: 65 72 61 6c 20 41 50 49 73 20 74 68 61 74 20 61  eral APIs that a
02f0: 72 65 20 6f 6e 6c 79 0a 2a 2a 20 61 76 61 69 6c  re only.** avail
0300: 61 62 6c 65 20 69 6e 20 57 69 6e 64 6f 77 73 20  able in Windows 
0310: 70 6c 61 74 66 6f 72 6d 73 20 62 61 73 65 64 20  platforms based 
0320: 6f 6e 20 74 68 65 20 4e 54 20 6b 65 72 6e 65 6c  on the NT kernel
0330: 2e 0a 2a 2f 0a 23 69 66 20 21 53 51 4c 49 54 45  ..*/.#if !SQLITE
0340: 5f 4f 53 5f 57 49 4e 4e 54 20 26 26 20 21 64 65  _OS_WINNT && !de
0350: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
0360: 54 5f 57 41 4c 29 0a 23 20 20 65 72 72 6f 72 20  T_WAL).#  error 
0370: 22 57 41 4c 20 6d 6f 64 65 20 72 65 71 75 69 72  "WAL mode requir
0380: 65 73 20 73 75 70 70 6f 72 74 20 66 72 6f 6d 20  es support from 
0390: 74 68 65 20 57 69 6e 64 6f 77 73 20 4e 54 20 6b  the Windows NT k
03a0: 65 72 6e 65 6c 2c 20 63 6f 6d 70 69 6c 65 5c 0a  ernel, compile\.
03b0: 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4f 4d 49   with SQLITE_OMI
03c0: 54 5f 57 41 4c 2e 22 0a 23 65 6e 64 69 66 0a 0a  T_WAL.".#endif..
03d0: 2f 2a 0a 2a 2a 20 41 72 65 20 6d 6f 73 74 20 6f  /*.** Are most o
03e0: 66 20 74 68 65 20 57 69 6e 33 32 20 41 4e 53 49  f the Win32 ANSI
03f0: 20 41 50 49 73 20 61 76 61 69 6c 61 62 6c 65 20   APIs available 
0400: 28 69 2e 65 2e 20 77 69 74 68 20 63 65 72 74 61  (i.e. with certa
0410: 69 6e 20 65 78 63 65 70 74 69 6f 6e 73 0a 2a 2a  in exceptions.**
0420: 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 73 75   based on the su
0430: 62 2d 70 6c 61 74 66 6f 72 6d 29 3f 0a 2a 2f 0a  b-platform)?.*/.
0440: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
0450: 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f  INCE && !SQLITE_
0460: 4f 53 5f 57 49 4e 52 54 20 26 26 20 21 64 65 66  OS_WINRT && !def
0470: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
0480: 32 5f 4e 4f 5f 41 4e 53 49 29 0a 23 20 20 64 65  2_NO_ANSI).#  de
0490: 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33  fine SQLITE_WIN3
04a0: 32 5f 48 41 53 5f 41 4e 53 49 0a 23 65 6e 64 69  2_HAS_ANSI.#endi
04b0: 66 0a 0a 2f 2a 0a 2a 2a 20 41 72 65 20 6d 6f 73  f../*.** Are mos
04c0: 74 20 6f 66 20 74 68 65 20 57 69 6e 33 32 20 55  t of the Win32 U
04d0: 6e 69 63 6f 64 65 20 41 50 49 73 20 61 76 61 69  nicode APIs avai
04e0: 6c 61 62 6c 65 20 28 69 2e 65 2e 20 77 69 74 68  lable (i.e. with
04f0: 20 63 65 72 74 61 69 6e 20 65 78 63 65 70 74 69   certain excepti
0500: 6f 6e 73 0a 2a 2a 20 62 61 73 65 64 20 6f 6e 20  ons.** based on 
0510: 74 68 65 20 73 75 62 2d 70 6c 61 74 66 6f 72 6d  the sub-platform
0520: 29 3f 0a 2a 2f 0a 23 69 66 20 28 53 51 4c 49 54  )?.*/.#if (SQLIT
0530: 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 53 51  E_OS_WINCE || SQ
0540: 4c 49 54 45 5f 4f 53 5f 57 49 4e 4e 54 20 7c 7c  LITE_OS_WINNT ||
0550: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
0560: 29 20 26 26 20 5c 0a 20 20 20 20 21 64 65 66 69  ) && \.    !defi
0570: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
0580: 5f 4e 4f 5f 57 49 44 45 29 0a 23 20 20 64 65 66  _NO_WIDE).#  def
0590: 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ine SQLITE_WIN32
05a0: 5f 48 41 53 5f 57 49 44 45 0a 23 65 6e 64 69 66  _HAS_WIDE.#endif
05b0: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
05c0: 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 73  e at least one s
05d0: 65 74 20 6f 66 20 57 69 6e 33 32 20 41 50 49 73  et of Win32 APIs
05e0: 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a   is available..*
05f0: 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  /.#if !defined(S
0600: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
0610: 41 4e 53 49 29 20 26 26 20 21 64 65 66 69 6e 65  ANSI) && !define
0620: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
0630: 41 53 5f 57 49 44 45 29 0a 23 20 20 65 72 72 6f  AS_WIDE).#  erro
0640: 72 20 22 41 74 20 6c 65 61 73 74 20 6f 6e 65 20  r "At least one 
0650: 6f 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  of SQLITE_WIN32_
0660: 48 41 53 5f 41 4e 53 49 20 61 6e 64 20 53 51 4c  HAS_ANSI and SQL
0670: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
0680: 44 45 5c 0a 20 6d 75 73 74 20 62 65 20 64 65 66  DE\. must be def
0690: 69 6e 65 64 2e 22 0a 23 65 6e 64 69 66 0a 0a 2f  ined.".#endif../
06a0: 2a 0a 2a 2a 20 44 65 66 69 6e 65 20 74 68 65 20  *.** Define the 
06b0: 72 65 71 75 69 72 65 64 20 57 69 6e 64 6f 77 73  required Windows
06c0: 20 53 44 4b 20 76 65 72 73 69 6f 6e 20 63 6f 6e   SDK version con
06d0: 73 74 61 6e 74 73 20 69 66 20 74 68 65 79 20 61  stants if they a
06e0: 72 65 20 6e 6f 74 0a 2a 2a 20 61 6c 72 65 61 64  re not.** alread
06f0: 79 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2f 0a  y available..*/.
0700: 23 69 66 6e 64 65 66 20 4e 54 44 44 49 5f 57 49  #ifndef NTDDI_WI
0710: 4e 38 0a 23 20 20 64 65 66 69 6e 65 20 4e 54 44  N8.#  define NTD
0720: 44 49 5f 57 49 4e 38 20 20 20 20 20 20 20 20 20  DI_WIN8         
0730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
0740: 78 30 36 30 32 30 30 30 30 0a 23 65 6e 64 69 66  x06020000.#endif
0750: 0a 0a 23 69 66 6e 64 65 66 20 4e 54 44 44 49 5f  ..#ifndef NTDDI_
0760: 57 49 4e 42 4c 55 45 0a 23 20 20 64 65 66 69 6e  WINBLUE.#  defin
0770: 65 20 4e 54 44 44 49 5f 57 49 4e 42 4c 55 45 20  e NTDDI_WINBLUE 
0780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0790: 20 20 20 20 30 78 30 36 30 33 30 30 30 30 0a 23      0x06030000.#
07a0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 68 65  endif../*.** Che
07b0: 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
07c0: 20 47 65 74 56 65 72 73 69 6f 6e 45 78 5b 41 57   GetVersionEx[AW
07d0: 5d 20 66 75 6e 63 74 69 6f 6e 73 20 61 72 65 20  ] functions are 
07e0: 64 65 70 72 65 63 61 74 65 64 20 6f 6e 20 74 68  deprecated on th
07f0: 65 0a 2a 2a 20 74 61 72 67 65 74 20 73 79 73 74  e.** target syst
0800: 65 6d 2e 20 20 47 65 74 56 65 72 73 69 6f 6e 45  em.  GetVersionE
0810: 78 20 77 61 73 20 66 69 72 73 74 20 64 65 70 72  x was first depr
0820: 65 63 61 74 65 64 20 69 6e 20 57 69 6e 38 2e 31  ecated in Win8.1
0830: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
0840: 49 54 45 5f 57 49 4e 33 32 5f 47 45 54 56 45 52  ITE_WIN32_GETVER
0850: 53 49 4f 4e 45 58 0a 23 20 20 69 66 20 64 65 66  SIONEX.#  if def
0860: 69 6e 65 64 28 4e 54 44 44 49 5f 56 45 52 53 49  ined(NTDDI_VERSI
0870: 4f 4e 29 20 26 26 20 4e 54 44 44 49 5f 56 45 52  ON) && NTDDI_VER
0880: 53 49 4f 4e 20 3e 3d 20 4e 54 44 44 49 5f 57 49  SION >= NTDDI_WI
0890: 4e 42 4c 55 45 0a 23 20 20 20 20 64 65 66 69 6e  NBLUE.#    defin
08a0: 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 47  e SQLITE_WIN32_G
08b0: 45 54 56 45 52 53 49 4f 4e 45 58 20 20 20 30 20  ETVERSIONEX   0 
08c0: 20 20 2f 2a 20 47 65 74 56 65 72 73 69 6f 6e 45    /* GetVersionE
08d0: 78 28 29 20 69 73 20 64 65 70 72 65 63 61 74 65  x() is deprecate
08e0: 64 20 2a 2f 0a 23 20 20 65 6c 73 65 0a 23 20 20  d */.#  else.#  
08f0: 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f    define SQLITE_
0900: 57 49 4e 33 32 5f 47 45 54 56 45 52 53 49 4f 4e  WIN32_GETVERSION
0910: 45 58 20 20 20 31 20 20 20 2f 2a 20 47 65 74 56  EX   1   /* GetV
0920: 65 72 73 69 6f 6e 45 78 28 29 20 69 73 20 63 75  ersionEx() is cu
0930: 72 72 65 6e 74 20 2a 2f 0a 23 20 20 65 6e 64 69  rrent */.#  endi
0940: 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  f.#endif../*.** 
0950: 54 68 69 73 20 63 6f 6e 73 74 61 6e 74 20 73 68  This constant sh
0960: 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 62 65 20  ould already be 
0970: 64 65 66 69 6e 65 64 20 28 69 6e 20 74 68 65 20  defined (in the 
0980: 22 57 69 6e 44 65 66 2e 68 22 20 53 44 4b 20 66  "WinDef.h" SDK f
0990: 69 6c 65 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  ile)..*/.#ifndef
09a0: 20 4d 41 58 5f 50 41 54 48 0a 23 20 20 64 65 66   MAX_PATH.#  def
09b0: 69 6e 65 20 4d 41 58 5f 50 41 54 48 20 20 20 20  ine MAX_PATH    
09c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09d0: 20 20 28 32 36 30 29 0a 23 65 6e 64 69 66 0a 0a    (260).#endif..
09e0: 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 70 61  /*.** Maximum pa
09f0: 74 68 6e 61 6d 65 20 6c 65 6e 67 74 68 20 28 69  thname length (i
0a00: 6e 20 63 68 61 72 73 29 20 66 6f 72 20 57 69 6e  n chars) for Win
0a10: 33 32 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64  32.  This should
0a20: 20 6e 6f 72 6d 61 6c 6c 79 20 62 65 0a 2a 2a 20   normally be.** 
0a30: 4d 41 58 5f 50 41 54 48 2e 0a 2a 2f 0a 23 69 66  MAX_PATH..*/.#if
0a40: 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  ndef SQLITE_WIN3
0a50: 32 5f 4d 41 58 5f 50 41 54 48 5f 43 48 41 52 53  2_MAX_PATH_CHARS
0a60: 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54  .#  define SQLIT
0a70: 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 50 41 54 48  E_WIN32_MAX_PATH
0a80: 5f 43 48 41 52 53 20 20 20 28 4d 41 58 5f 50 41  _CHARS   (MAX_PA
0a90: 54 48 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  TH).#endif../*.*
0aa0: 2a 20 54 68 69 73 20 63 6f 6e 73 74 61 6e 74 20  * This constant 
0ab0: 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 62  should already b
0ac0: 65 20 64 65 66 69 6e 65 64 20 28 69 6e 20 74 68  e defined (in th
0ad0: 65 20 22 57 69 6e 4e 54 2e 68 22 20 53 44 4b 20  e "WinNT.h" SDK 
0ae0: 66 69 6c 65 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65  file)..*/.#ifnde
0af0: 66 20 55 4e 49 43 4f 44 45 5f 53 54 52 49 4e 47  f UNICODE_STRING
0b00: 5f 4d 41 58 5f 43 48 41 52 53 0a 23 20 20 64 65  _MAX_CHARS.#  de
0b10: 66 69 6e 65 20 55 4e 49 43 4f 44 45 5f 53 54 52  fine UNICODE_STR
0b20: 49 4e 47 5f 4d 41 58 5f 43 48 41 52 53 20 20 20  ING_MAX_CHARS   
0b30: 20 20 20 28 33 32 37 36 37 29 0a 23 65 6e 64 69     (32767).#endi
0b40: 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d  f../*.** Maximum
0b50: 20 70 61 74 68 6e 61 6d 65 20 6c 65 6e 67 74 68   pathname length
0b60: 20 28 69 6e 20 63 68 61 72 73 29 20 66 6f 72 20   (in chars) for 
0b70: 57 69 6e 4e 54 2e 20 20 54 68 69 73 20 73 68 6f  WinNT.  This sho
0b80: 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20 62 65 0a  uld normally be.
0b90: 2a 2a 20 55 4e 49 43 4f 44 45 5f 53 54 52 49 4e  ** UNICODE_STRIN
0ba0: 47 5f 4d 41 58 5f 43 48 41 52 53 2e 0a 2a 2f 0a  G_MAX_CHARS..*/.
0bb0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57  #ifndef SQLITE_W
0bc0: 49 4e 4e 54 5f 4d 41 58 5f 50 41 54 48 5f 43 48  INNT_MAX_PATH_CH
0bd0: 41 52 53 0a 23 20 20 64 65 66 69 6e 65 20 53 51  ARS.#  define SQ
0be0: 4c 49 54 45 5f 57 49 4e 4e 54 5f 4d 41 58 5f 50  LITE_WINNT_MAX_P
0bf0: 41 54 48 5f 43 48 41 52 53 20 20 20 28 55 4e 49  ATH_CHARS   (UNI
0c00: 43 4f 44 45 5f 53 54 52 49 4e 47 5f 4d 41 58 5f  CODE_STRING_MAX_
0c10: 43 48 41 52 53 29 0a 23 65 6e 64 69 66 0a 0a 2f  CHARS).#endif../
0c20: 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 70 61 74  *.** Maximum pat
0c30: 68 6e 61 6d 65 20 6c 65 6e 67 74 68 20 28 69 6e  hname length (in
0c40: 20 62 79 74 65 73 29 20 66 6f 72 20 57 69 6e 33   bytes) for Win3
0c50: 32 2e 20 20 54 68 65 20 4d 41 58 5f 50 41 54 48  2.  The MAX_PATH
0c60: 20 6d 61 63 72 6f 20 69 73 20 69 6e 0a 2a 2a 20   macro is in.** 
0c70: 63 68 61 72 61 63 74 65 72 73 2c 20 73 6f 20 77  characters, so w
0c80: 65 20 61 6c 6c 6f 63 61 74 65 20 34 20 62 79 74  e allocate 4 byt
0c90: 65 73 20 70 65 72 20 63 68 61 72 61 63 74 65 72  es per character
0ca0: 20 61 73 73 75 6d 69 6e 67 20 77 6f 72 73 74 2d   assuming worst-
0cb0: 63 61 73 65 20 6f 66 0a 2a 2a 20 34 2d 62 79 74  case of.** 4-byt
0cc0: 65 73 2d 70 65 72 2d 63 68 61 72 61 63 74 65 72  es-per-character
0cd0: 20 66 6f 72 20 55 54 46 38 2e 0a 2a 2f 0a 23 69   for UTF8..*/.#i
0ce0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  fndef SQLITE_WIN
0cf0: 33 32 5f 4d 41 58 5f 50 41 54 48 5f 42 59 54 45  32_MAX_PATH_BYTE
0d00: 53 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49  S.#  define SQLI
0d10: 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 50 41 54  TE_WIN32_MAX_PAT
0d20: 48 5f 42 59 54 45 53 20 20 20 28 53 51 4c 49 54  H_BYTES   (SQLIT
0d30: 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 50 41 54 48  E_WIN32_MAX_PATH
0d40: 5f 43 48 41 52 53 2a 34 29 0a 23 65 6e 64 69 66  _CHARS*4).#endif
0d50: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20  ../*.** Maximum 
0d60: 70 61 74 68 6e 61 6d 65 20 6c 65 6e 67 74 68 20  pathname length 
0d70: 28 69 6e 20 62 79 74 65 73 29 20 66 6f 72 20 57  (in bytes) for W
0d80: 69 6e 4e 54 2e 20 20 54 68 69 73 20 73 68 6f 75  inNT.  This shou
0d90: 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20 62 65 0a 2a  ld normally be.*
0da0: 2a 20 55 4e 49 43 4f 44 45 5f 53 54 52 49 4e 47  * UNICODE_STRING
0db0: 5f 4d 41 58 5f 43 48 41 52 53 20 2a 20 73 69 7a  _MAX_CHARS * siz
0dc0: 65 6f 66 28 57 43 48 41 52 29 2e 0a 2a 2f 0a 23  eof(WCHAR)..*/.#
0dd0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49  ifndef SQLITE_WI
0de0: 4e 4e 54 5f 4d 41 58 5f 50 41 54 48 5f 42 59 54  NNT_MAX_PATH_BYT
0df0: 45 53 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c  ES.#  define SQL
0e00: 49 54 45 5f 57 49 4e 4e 54 5f 4d 41 58 5f 50 41  ITE_WINNT_MAX_PA
0e10: 54 48 5f 42 59 54 45 53 20 20 20 5c 0a 20 20 20  TH_BYTES   \.   
0e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e30: 20 20 20 20 20 20 20 20 20 28 73 69 7a 65 6f 66           (sizeof
0e40: 28 57 43 48 41 52 29 20 2a 20 53 51 4c 49 54 45  (WCHAR) * SQLITE
0e50: 5f 57 49 4e 4e 54 5f 4d 41 58 5f 50 41 54 48 5f  _WINNT_MAX_PATH_
0e60: 43 48 41 52 53 29 0a 23 65 6e 64 69 66 0a 0a 2f  CHARS).#endif../
0e70: 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 65 72 72  *.** Maximum err
0e80: 6f 72 20 6d 65 73 73 61 67 65 20 6c 65 6e 67 74  or message lengt
0e90: 68 20 28 69 6e 20 63 68 61 72 73 29 20 66 6f 72  h (in chars) for
0ea0: 20 57 69 6e 52 54 2e 0a 2a 2f 0a 23 69 66 6e 64   WinRT..*/.#ifnd
0eb0: 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ef SQLITE_WIN32_
0ec0: 4d 41 58 5f 45 52 52 4d 53 47 5f 43 48 41 52 53  MAX_ERRMSG_CHARS
0ed0: 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54  .#  define SQLIT
0ee0: 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 45 52 52 4d  E_WIN32_MAX_ERRM
0ef0: 53 47 5f 43 48 41 52 53 20 28 31 30 32 34 29 0a  SG_CHARS (1024).
0f00: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
0f10: 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20 69  turns non-zero i
0f20: 66 20 74 68 65 20 63 68 61 72 61 63 74 65 72 20  f the character 
0f30: 73 68 6f 75 6c 64 20 62 65 20 74 72 65 61 74 65  should be treate
0f40: 64 20 61 73 20 61 20 64 69 72 65 63 74 6f 72 79  d as a directory
0f50: 0a 2a 2a 20 73 65 70 61 72 61 74 6f 72 2e 0a 2a  .** separator..*
0f60: 2f 0a 23 69 66 6e 64 65 66 20 77 69 6e 49 73 44  /.#ifndef winIsD
0f70: 69 72 53 65 70 0a 23 20 20 64 65 66 69 6e 65 20  irSep.#  define 
0f80: 77 69 6e 49 73 44 69 72 53 65 70 28 61 29 20 20  winIsDirSep(a)  
0f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28                ((
0fa0: 28 61 29 20 3d 3d 20 27 2f 27 29 20 7c 7c 20 28  (a) == '/') || (
0fb0: 28 61 29 20 3d 3d 20 27 5c 5c 27 29 29 0a 23 65  (a) == '\\')).#e
0fc0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
0fd0: 20 6d 61 63 72 6f 20 69 73 20 75 73 65 64 20 77   macro is used w
0fe0: 68 65 6e 20 61 20 6c 6f 63 61 6c 20 76 61 72 69  hen a local vari
0ff0: 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f 20 61  able is set to a
1000: 20 76 61 6c 75 65 20 74 68 61 74 20 69 73 0a 2a   value that is.*
1010: 2a 20 5b 73 6f 6d 65 74 69 6d 65 73 5d 20 6e 6f  * [sometimes] no
1020: 74 20 75 73 65 64 20 62 79 20 74 68 65 20 63 6f  t used by the co
1030: 64 65 20 28 65 2e 67 2e 20 76 69 61 20 63 6f 6e  de (e.g. via con
1040: 64 69 74 69 6f 6e 61 6c 20 63 6f 6d 70 69 6c 61  ditional compila
1050: 74 69 6f 6e 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65  tion)..*/.#ifnde
1060: 66 20 55 4e 55 53 45 44 5f 56 41 52 49 41 42 4c  f UNUSED_VARIABL
1070: 45 5f 56 41 4c 55 45 0a 23 20 20 64 65 66 69 6e  E_VALUE.#  defin
1080: 65 20 55 4e 55 53 45 44 5f 56 41 52 49 41 42 4c  e UNUSED_VARIABL
1090: 45 5f 56 41 4c 55 45 28 78 29 20 20 20 20 20 20  E_VALUE(x)      
10a0: 28 76 6f 69 64 29 28 78 29 0a 23 65 6e 64 69 66  (void)(x).#endif
10b0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20  ../*.** Returns 
10c0: 74 68 65 20 63 68 61 72 61 63 74 65 72 20 74 68  the character th
10d0: 61 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65  at should be use
10e0: 64 20 61 73 20 74 68 65 20 64 69 72 65 63 74 6f  d as the directo
10f0: 72 79 20 73 65 70 61 72 61 74 6f 72 2e 0a 2a 2f  ry separator..*/
1100: 0a 23 69 66 6e 64 65 66 20 77 69 6e 47 65 74 44  .#ifndef winGetD
1110: 69 72 53 65 70 0a 23 20 20 64 65 66 69 6e 65 20  irSep.#  define 
1120: 77 69 6e 47 65 74 44 69 72 53 65 70 28 29 20 20  winGetDirSep()  
1130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 27 5c                '\
1140: 5c 27 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  \'.#endif../*.**
1150: 20 44 6f 20 77 65 20 6e 65 65 64 20 74 6f 20 6d   Do we need to m
1160: 61 6e 75 61 6c 6c 79 20 64 65 66 69 6e 65 20 74  anually define t
1170: 68 65 20 57 69 6e 33 32 20 66 69 6c 65 20 6d 61  he Win32 file ma
1180: 70 70 69 6e 67 20 41 50 49 73 20 66 6f 72 20 75  pping APIs for u
1190: 73 65 20 77 69 74 68 20 57 41 4c 0a 2a 2a 20 6d  se with WAL.** m
11a0: 6f 64 65 20 28 65 2e 67 2e 20 74 68 65 73 65 20  ode (e.g. these 
11b0: 41 50 49 73 20 61 72 65 20 61 76 61 69 6c 61 62  APIs are availab
11c0: 6c 65 20 69 6e 20 74 68 65 20 57 69 6e 64 6f 77  le in the Window
11d0: 73 20 43 45 20 53 44 4b 3b 20 68 6f 77 65 76 65  s CE SDK; howeve
11e0: 72 2c 20 74 68 65 79 0a 2a 2a 20 61 72 65 20 6e  r, they.** are n
11f0: 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68  ot present in th
1200: 65 20 68 65 61 64 65 72 20 66 69 6c 65 29 3f 0a  e header file)?.
1210: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 57 49  */.#if SQLITE_WI
1220: 4e 33 32 5f 46 49 4c 45 4d 41 50 50 49 4e 47 5f  N32_FILEMAPPING_
1230: 41 50 49 20 26 26 20 21 64 65 66 69 6e 65 64 28  API && !defined(
1240: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29  SQLITE_OMIT_WAL)
1250: 0a 2f 2a 0a 2a 2a 20 54 77 6f 20 6f 66 20 74 68  ./*.** Two of th
1260: 65 20 66 69 6c 65 20 6d 61 70 70 69 6e 67 20 41  e file mapping A
1270: 50 49 73 20 61 72 65 20 64 69 66 66 65 72 65 6e  PIs are differen
1280: 74 20 75 6e 64 65 72 20 57 69 6e 52 54 2e 20 20  t under WinRT.  
1290: 46 69 67 75 72 65 20 6f 75 74 20 77 68 69 63 68  Figure out which
12a0: 0a 2a 2a 20 73 65 74 20 77 65 20 6e 65 65 64 2e  .** set we need.
12b0: 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  .*/.#if SQLITE_O
12c0: 53 5f 57 49 4e 52 54 0a 57 49 4e 42 41 53 45 41  S_WINRT.WINBASEA
12d0: 50 49 20 48 41 4e 44 4c 45 20 57 49 4e 41 50 49  PI HANDLE WINAPI
12e0: 20 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69   CreateFileMappi
12f0: 6e 67 46 72 6f 6d 41 70 70 28 48 41 4e 44 4c 45  ngFromApp(HANDLE
1300: 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 53 45  , \.        LPSE
1310: 43 55 52 49 54 59 5f 41 54 54 52 49 42 55 54 45  CURITY_ATTRIBUTE
1320: 53 2c 20 55 4c 4f 4e 47 2c 20 55 4c 4f 4e 47 36  S, ULONG, ULONG6
1330: 34 2c 20 4c 50 43 57 53 54 52 29 3b 0a 0a 57 49  4, LPCWSTR);..WI
1340: 4e 42 41 53 45 41 50 49 20 4c 50 56 4f 49 44 20  NBASEAPI LPVOID 
1350: 57 49 4e 41 50 49 20 4d 61 70 56 69 65 77 4f 66  WINAPI MapViewOf
1360: 46 69 6c 65 46 72 6f 6d 41 70 70 28 48 41 4e 44  FileFromApp(HAND
1370: 4c 45 2c 20 55 4c 4f 4e 47 2c 20 55 4c 4f 4e 47  LE, ULONG, ULONG
1380: 36 34 2c 20 53 49 5a 45 5f 54 29 3b 0a 23 65 6c  64, SIZE_T);.#el
1390: 73 65 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  se.#if defined(S
13a0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
13b0: 41 4e 53 49 29 0a 57 49 4e 42 41 53 45 41 50 49  ANSI).WINBASEAPI
13c0: 20 48 41 4e 44 4c 45 20 57 49 4e 41 50 49 20 43   HANDLE WINAPI C
13d0: 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67  reateFileMapping
13e0: 41 28 48 41 4e 44 4c 45 2c 20 4c 50 53 45 43 55  A(HANDLE, LPSECU
13f0: 52 49 54 59 5f 41 54 54 52 49 42 55 54 45 53 2c  RITY_ATTRIBUTES,
1400: 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44   \.        DWORD
1410: 2c 20 44 57 4f 52 44 2c 20 44 57 4f 52 44 2c 20  , DWORD, DWORD, 
1420: 4c 50 43 53 54 52 29 3b 0a 23 65 6e 64 69 66 20  LPCSTR);.#endif 
1430: 2f 2a 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  /* defined(SQLIT
1440: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
1450: 29 20 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65  ) */..#if define
1460: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
1470: 41 53 5f 57 49 44 45 29 0a 57 49 4e 42 41 53 45  AS_WIDE).WINBASE
1480: 41 50 49 20 48 41 4e 44 4c 45 20 57 49 4e 41 50  API HANDLE WINAP
1490: 49 20 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70  I CreateFileMapp
14a0: 69 6e 67 57 28 48 41 4e 44 4c 45 2c 20 4c 50 53  ingW(HANDLE, LPS
14b0: 45 43 55 52 49 54 59 5f 41 54 54 52 49 42 55 54  ECURITY_ATTRIBUT
14c0: 45 53 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57  ES, \.        DW
14d0: 4f 52 44 2c 20 44 57 4f 52 44 2c 20 44 57 4f 52  ORD, DWORD, DWOR
14e0: 44 2c 20 4c 50 43 57 53 54 52 29 3b 0a 23 65 6e  D, LPCWSTR);.#en
14f0: 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53  dif /* defined(S
1500: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
1510: 57 49 44 45 29 20 2a 2f 0a 0a 57 49 4e 42 41 53  WIDE) */..WINBAS
1520: 45 41 50 49 20 4c 50 56 4f 49 44 20 57 49 4e 41  EAPI LPVOID WINA
1530: 50 49 20 4d 61 70 56 69 65 77 4f 66 46 69 6c 65  PI MapViewOfFile
1540: 28 48 41 4e 44 4c 45 2c 20 44 57 4f 52 44 2c 20  (HANDLE, DWORD, 
1550: 44 57 4f 52 44 2c 20 44 57 4f 52 44 2c 20 53 49  DWORD, DWORD, SI
1560: 5a 45 5f 54 29 3b 0a 23 65 6e 64 69 66 20 2f 2a  ZE_T);.#endif /*
1570: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
1580: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20   */../*.** This 
1590: 66 69 6c 65 20 6d 61 70 70 69 6e 67 20 41 50 49  file mapping API
15a0: 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20 62 6f   is common to bo
15b0: 74 68 20 57 69 6e 33 32 20 61 6e 64 20 57 69 6e  th Win32 and Win
15c0: 52 54 2e 0a 2a 2f 0a 57 49 4e 42 41 53 45 41 50  RT..*/.WINBASEAP
15d0: 49 20 42 4f 4f 4c 20 57 49 4e 41 50 49 20 55 6e  I BOOL WINAPI Un
15e0: 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 28 4c 50  mapViewOfFile(LP
15f0: 43 56 4f 49 44 29 3b 0a 23 65 6e 64 69 66 20 2f  CVOID);.#endif /
1600: 2a 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 46  * SQLITE_WIN32_F
1610: 49 4c 45 4d 41 50 50 49 4e 47 5f 41 50 49 20 26  ILEMAPPING_API &
1620: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
1630: 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 2a 2f 0a 0a  E_OMIT_WAL) */..
1640: 2f 2a 0a 2a 2a 20 53 6f 6d 65 20 4d 69 63 72 6f  /*.** Some Micro
1650: 73 6f 66 74 20 63 6f 6d 70 69 6c 65 72 73 20 6c  soft compilers l
1660: 61 63 6b 20 74 68 69 73 20 64 65 66 69 6e 69 74  ack this definit
1670: 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ion..*/.#ifndef 
1680: 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54  INVALID_FILE_ATT
1690: 52 49 42 55 54 45 53 0a 23 20 64 65 66 69 6e 65  RIBUTES.# define
16a0: 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54   INVALID_FILE_AT
16b0: 54 52 49 42 55 54 45 53 20 28 28 44 57 4f 52 44  TRIBUTES ((DWORD
16c0: 29 2d 31 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66  )-1).#endif..#if
16d0: 6e 64 65 66 20 46 49 4c 45 5f 46 4c 41 47 5f 4d  ndef FILE_FLAG_M
16e0: 41 53 4b 0a 23 20 64 65 66 69 6e 65 20 46 49 4c  ASK.# define FIL
16f0: 45 5f 46 4c 41 47 5f 4d 41 53 4b 20 20 20 20 20  E_FLAG_MASK     
1700: 20 20 20 20 20 28 30 78 46 46 33 43 30 30 30 30       (0xFF3C0000
1710: 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  ).#endif..#ifnde
1720: 66 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  f FILE_ATTRIBUTE
1730: 5f 4d 41 53 4b 0a 23 20 64 65 66 69 6e 65 20 46  _MASK.# define F
1740: 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 4d 41  ILE_ATTRIBUTE_MA
1750: 53 4b 20 20 20 20 20 28 30 78 30 30 30 33 46 46  SK     (0x0003FF
1760: 46 37 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  F7).#endif..#ifn
1770: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1780: 57 41 4c 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72  WAL./* Forward r
1790: 65 66 65 72 65 6e 63 65 73 20 74 6f 20 73 74 72  eferences to str
17a0: 75 63 74 75 72 65 73 20 75 73 65 64 20 66 6f 72  uctures used for
17b0: 20 57 41 4c 20 2a 2f 0a 74 79 70 65 64 65 66 20   WAL */.typedef 
17c0: 73 74 72 75 63 74 20 77 69 6e 53 68 6d 20 77 69  struct winShm wi
17d0: 6e 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20  nShm;           
17e0: 2f 2a 20 41 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  /* A connection 
17f0: 74 6f 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  to shared-memory
1800: 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75   */.typedef stru
1810: 63 74 20 77 69 6e 53 68 6d 4e 6f 64 65 20 77 69  ct winShmNode wi
1820: 6e 53 68 6d 4e 6f 64 65 3b 20 20 20 2f 2a 20 41  nShmNode;   /* A
1830: 20 72 65 67 69 6f 6e 20 6f 66 20 73 68 61 72 65   region of share
1840: 64 2d 6d 65 6d 6f 72 79 20 2a 2f 0a 23 65 6e 64  d-memory */.#end
1850: 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 69 6e 43 45 20  if../*.** WinCE 
1860: 6c 61 63 6b 73 20 6e 61 74 69 76 65 20 73 75 70  lacks native sup
1870: 70 6f 72 74 20 66 6f 72 20 66 69 6c 65 20 6c 6f  port for file lo
1880: 63 6b 69 6e 67 20 73 6f 20 77 65 20 68 61 76 65  cking so we have
1890: 20 74 6f 20 66 61 6b 65 20 69 74 0a 2a 2a 20 77   to fake it.** w
18a0: 69 74 68 20 73 6f 6d 65 20 63 6f 64 65 20 6f 66  ith some code of
18b0: 20 6f 75 72 20 6f 77 6e 2e 0a 2a 2f 0a 23 69 66   our own..*/.#if
18c0: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
18d0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
18e0: 77 69 6e 63 65 4c 6f 63 6b 20 7b 0a 20 20 69 6e  winceLock {.  in
18f0: 74 20 6e 52 65 61 64 65 72 73 3b 20 20 20 20 20  t nReaders;     
1900: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
1910: 65 61 64 65 72 20 6c 6f 63 6b 73 20 6f 62 74 61  eader locks obta
1920: 69 6e 65 64 20 2a 2f 0a 20 20 42 4f 4f 4c 20 62  ined */.  BOOL b
1930: 50 65 6e 64 69 6e 67 3b 20 20 20 20 20 20 2f 2a  Pending;      /*
1940: 20 49 6e 64 69 63 61 74 65 73 20 61 20 70 65 6e   Indicates a pen
1950: 64 69 6e 67 20 6c 6f 63 6b 20 68 61 73 20 62 65  ding lock has be
1960: 65 6e 20 6f 62 74 61 69 6e 65 64 20 2a 2f 0a 20  en obtained */. 
1970: 20 42 4f 4f 4c 20 62 52 65 73 65 72 76 65 64 3b   BOOL bReserved;
1980: 20 20 20 20 20 2f 2a 20 49 6e 64 69 63 61 74 65       /* Indicate
1990: 73 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63  s a reserved loc
19a0: 6b 20 68 61 73 20 62 65 65 6e 20 6f 62 74 61 69  k has been obtai
19b0: 6e 65 64 20 2a 2f 0a 20 20 42 4f 4f 4c 20 62 45  ned */.  BOOL bE
19c0: 78 63 6c 75 73 69 76 65 3b 20 20 20 20 2f 2a 20  xclusive;    /* 
19d0: 49 6e 64 69 63 61 74 65 73 20 61 6e 20 65 78 63  Indicates an exc
19e0: 6c 75 73 69 76 65 20 6c 6f 63 6b 20 68 61 73 20  lusive lock has 
19f0: 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 2a 2f  been obtained */
1a00: 0a 7d 20 77 69 6e 63 65 4c 6f 63 6b 3b 0a 23 65  .} winceLock;.#e
1a10: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
1a20: 77 69 6e 46 69 6c 65 20 73 74 72 75 63 74 75 72  winFile structur
1a30: 65 20 69 73 20 61 20 73 75 62 63 6c 61 73 73 20  e is a subclass 
1a40: 6f 66 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  of sqlite3_file*
1a50: 20 73 70 65 63 69 66 69 63 20 74 6f 20 74 68 65   specific to the
1a60: 20 77 69 6e 33 32 0a 2a 2a 20 70 6f 72 74 61 62   win32.** portab
1a70: 69 6c 69 74 79 20 6c 61 79 65 72 2e 0a 2a 2f 0a  ility layer..*/.
1a80: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 77  typedef struct w
1a90: 69 6e 46 69 6c 65 20 77 69 6e 46 69 6c 65 3b 0a  inFile winFile;.
1aa0: 73 74 72 75 63 74 20 77 69 6e 46 69 6c 65 20 7b  struct winFile {
1ab0: 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  .  const sqlite3
1ac0: 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 70 4d 65  _io_methods *pMe
1ad0: 74 68 6f 64 3b 20 2f 2a 2a 2a 20 4d 75 73 74 20  thod; /*** Must 
1ae0: 62 65 20 66 69 72 73 74 20 2a 2a 2a 2f 0a 20 20  be first ***/.  
1af0: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
1b00: 73 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56  s;      /* The V
1b10: 46 53 20 75 73 65 64 20 74 6f 20 6f 70 65 6e 20  FS used to open 
1b20: 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 48  this file */.  H
1b30: 41 4e 44 4c 45 20 68 3b 20 20 20 20 20 20 20 20  ANDLE h;        
1b40: 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65         /* Handle
1b50: 20 66 6f 72 20 61 63 63 65 73 73 69 6e 67 20 74   for accessing t
1b60: 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20  he file */.  u8 
1b70: 6c 6f 63 6b 74 79 70 65 3b 20 20 20 20 20 20 20  locktype;       
1b80: 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20       /* Type of 
1b90: 6c 6f 63 6b 20 63 75 72 72 65 6e 74 6c 79 20 68  lock currently h
1ba0: 65 6c 64 20 6f 6e 20 74 68 69 73 20 66 69 6c 65  eld on this file
1bb0: 20 2a 2f 0a 20 20 73 68 6f 72 74 20 73 68 61 72   */.  short shar
1bc0: 65 64 4c 6f 63 6b 42 79 74 65 3b 20 20 20 2f 2a  edLockByte;   /*
1bd0: 20 52 61 6e 64 6f 6d 6c 79 20 63 68 6f 73 65 6e   Randomly chosen
1be0: 20 62 79 74 65 20 75 73 65 64 20 61 73 20 61 20   byte used as a 
1bf0: 73 68 61 72 65 64 20 6c 6f 63 6b 20 2a 2f 0a 20  shared lock */. 
1c00: 20 75 38 20 63 74 72 6c 46 6c 61 67 73 3b 20 20   u8 ctrlFlags;  
1c10: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
1c20: 73 2e 20 20 53 65 65 20 57 49 4e 46 49 4c 45 5f  s.  See WINFILE_
1c30: 2a 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 44 57 4f  * below */.  DWO
1c40: 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 20 20 20  RD lastErrno;   
1c50: 20 20 20 20 20 2f 2a 20 54 68 65 20 57 69 6e 64       /* The Wind
1c60: 6f 77 73 20 65 72 72 6e 6f 20 66 72 6f 6d 20 74  ows errno from t
1c70: 68 65 20 6c 61 73 74 20 49 2f 4f 20 65 72 72 6f  he last I/O erro
1c80: 72 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  r */.#ifndef SQL
1c90: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 77  ITE_OMIT_WAL.  w
1ca0: 69 6e 53 68 6d 20 2a 70 53 68 6d 3b 20 20 20 20  inShm *pShm;    
1cb0: 20 20 20 20 20 20 20 2f 2a 20 49 6e 73 74 61 6e         /* Instan
1cc0: 63 65 20 6f 66 20 73 68 61 72 65 64 20 6d 65 6d  ce of shared mem
1cd0: 6f 72 79 20 6f 6e 20 74 68 69 73 20 66 69 6c 65  ory on this file
1ce0: 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 63 6f 6e   */.#endif.  con
1cf0: 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 3b 20  st char *zPath; 
1d00: 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20 70 61 74       /* Full pat
1d10: 68 6e 61 6d 65 20 6f 66 20 74 68 69 73 20 66 69  hname of this fi
1d20: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 43 68  le */.  int szCh
1d30: 75 6e 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  unk;            
1d40: 2f 2a 20 43 68 75 6e 6b 20 73 69 7a 65 20 63 6f  /* Chunk size co
1d50: 6e 66 69 67 75 72 65 64 20 62 79 20 46 43 4e 54  nfigured by FCNT
1d60: 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 20 2a 2f 0a  L_CHUNK_SIZE */.
1d70: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
1d80: 4e 43 45 0a 20 20 4c 50 57 53 54 52 20 7a 44 65  NCE.  LPWSTR zDe
1d90: 6c 65 74 65 4f 6e 43 6c 6f 73 65 3b 20 20 2f 2a  leteOnClose;  /*
1da0: 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f   Name of file to
1db0: 20 64 65 6c 65 74 65 20 77 68 65 6e 20 63 6c 6f   delete when clo
1dc0: 73 69 6e 67 20 2a 2f 0a 20 20 48 41 4e 44 4c 45  sing */.  HANDLE
1dd0: 20 68 4d 75 74 65 78 3b 20 20 20 20 20 20 20 20   hMutex;        
1de0: 20 20 2f 2a 20 4d 75 74 65 78 20 75 73 65 64 20    /* Mutex used 
1df0: 74 6f 20 63 6f 6e 74 72 6f 6c 20 61 63 63 65 73  to control acces
1e00: 73 20 74 6f 20 73 68 61 72 65 64 20 6c 6f 63 6b  s to shared lock
1e10: 20 2a 2f 0a 20 20 48 41 4e 44 4c 45 20 68 53 68   */.  HANDLE hSh
1e20: 61 72 65 64 3b 20 20 20 20 20 20 20 20 20 2f 2a  ared;         /*
1e30: 20 53 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 73   Shared memory s
1e40: 65 67 6d 65 6e 74 20 75 73 65 64 20 66 6f 72 20  egment used for 
1e50: 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20 77 69 6e  locking */.  win
1e60: 63 65 4c 6f 63 6b 20 6c 6f 63 61 6c 3b 20 20 20  ceLock local;   
1e70: 20 20 20 20 20 2f 2a 20 4c 6f 63 6b 73 20 6f 62       /* Locks ob
1e80: 74 61 69 6e 65 64 20 62 79 20 74 68 69 73 20 69  tained by this i
1e90: 6e 73 74 61 6e 63 65 20 6f 66 20 77 69 6e 46 69  nstance of winFi
1ea0: 6c 65 20 2a 2f 0a 20 20 77 69 6e 63 65 4c 6f 63  le */.  winceLoc
1eb0: 6b 20 2a 73 68 61 72 65 64 3b 20 20 20 20 20 20  k *shared;      
1ec0: 2f 2a 20 47 6c 6f 62 61 6c 20 73 68 61 72 65 64  /* Global shared
1ed0: 20 6c 6f 63 6b 20 6d 65 6d 6f 72 79 20 66 6f 72   lock memory for
1ee0: 20 74 68 65 20 66 69 6c 65 20 20 2a 2f 0a 23 65   the file  */.#e
1ef0: 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
1f00: 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
1f10: 20 20 69 6e 74 20 6e 46 65 74 63 68 4f 75 74 3b    int nFetchOut;
1f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f30: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 75 74  /* Number of out
1f40: 73 74 61 6e 64 69 6e 67 20 78 46 65 74 63 68 20  standing xFetch 
1f50: 72 65 66 65 72 65 6e 63 65 73 20 2a 2f 0a 20 20  references */.  
1f60: 48 41 4e 44 4c 45 20 68 4d 61 70 3b 20 20 20 20  HANDLE hMap;    
1f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f80: 20 48 61 6e 64 6c 65 20 66 6f 72 20 61 63 63 65   Handle for acce
1f90: 73 73 69 6e 67 20 6d 65 6d 6f 72 79 20 6d 61 70  ssing memory map
1fa0: 70 69 6e 67 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  ping */.  void *
1fb0: 70 4d 61 70 52 65 67 69 6f 6e 3b 20 20 20 20 20  pMapRegion;     
1fc0: 20 20 20 20 20 20 20 20 2f 2a 20 41 72 65 61 20          /* Area 
1fd0: 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64 20 2a 2f  memory mapped */
1fe0: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
1ff0: 20 6d 6d 61 70 53 69 7a 65 3b 20 20 20 20 20 20   mmapSize;      
2000: 20 2f 2a 20 55 73 61 62 6c 65 20 73 69 7a 65 20   /* Usable size 
2010: 6f 66 20 6d 61 70 70 65 64 20 72 65 67 69 6f 6e  of mapped region
2020: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
2030: 74 36 34 20 6d 6d 61 70 53 69 7a 65 41 63 74 75  t64 mmapSizeActu
2040: 61 6c 3b 20 2f 2a 20 41 63 74 75 61 6c 20 73 69  al; /* Actual si
2050: 7a 65 20 6f 66 20 6d 61 70 70 65 64 20 72 65 67  ze of mapped reg
2060: 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ion */.  sqlite3
2070: 5f 69 6e 74 36 34 20 6d 6d 61 70 53 69 7a 65 4d  _int64 mmapSizeM
2080: 61 78 3b 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67  ax;    /* Config
2090: 75 72 65 64 20 46 43 4e 54 4c 5f 4d 4d 41 50 5f  ured FCNTL_MMAP_
20a0: 53 49 5a 45 20 76 61 6c 75 65 20 2a 2f 0a 23 65  SIZE value */.#e
20b0: 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  ndif.};../*.** A
20c0: 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 20 66 6f  llowed values fo
20d0: 72 20 77 69 6e 46 69 6c 65 2e 63 74 72 6c 46 6c  r winFile.ctrlFl
20e0: 61 67 73 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 57  ags.*/.#define W
20f0: 49 4e 46 49 4c 45 5f 52 44 4f 4e 4c 59 20 20 20  INFILE_RDONLY   
2100: 20 20 20 20 20 20 20 30 78 30 32 20 20 20 2f 2a         0x02   /*
2110: 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 72   Connection is r
2120: 65 61 64 20 6f 6e 6c 79 20 2a 2f 0a 23 64 65 66  ead only */.#def
2130: 69 6e 65 20 57 49 4e 46 49 4c 45 5f 50 45 52 53  ine WINFILE_PERS
2140: 49 53 54 5f 57 41 4c 20 20 20 20 20 30 78 30 34  IST_WAL     0x04
2150: 20 20 20 2f 2a 20 50 65 72 73 69 73 74 65 6e 74     /* Persistent
2160: 20 57 41 4c 20 6d 6f 64 65 20 2a 2f 0a 23 64 65   WAL mode */.#de
2170: 66 69 6e 65 20 57 49 4e 46 49 4c 45 5f 50 53 4f  fine WINFILE_PSO
2180: 57 20 20 20 20 20 20 20 20 20 20 20 20 30 78 31  W            0x1
2190: 30 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4f  0   /* SQLITE_IO
21a0: 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56  CAP_POWERSAFE_OV
21b0: 45 52 57 52 49 54 45 20 2a 2f 0a 0a 2f 2a 0a 20  ERWRITE */../*. 
21c0: 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68  * The size of th
21d0: 65 20 62 75 66 66 65 72 20 75 73 65 64 20 62 79  e buffer used by
21e0: 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 77   sqlite3_win32_w
21f0: 72 69 74 65 5f 64 65 62 75 67 28 29 2e 0a 20 2a  rite_debug().. *
2200: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
2210: 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53  _WIN32_DBG_BUF_S
2220: 49 5a 45 0a 23 20 20 64 65 66 69 6e 65 20 53 51  IZE.#  define SQ
2230: 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42  LITE_WIN32_DBG_B
2240: 55 46 5f 53 49 5a 45 20 20 20 28 28 69 6e 74 29  UF_SIZE   ((int)
2250: 28 34 30 39 36 2d 73 69 7a 65 6f 66 28 44 57 4f  (4096-sizeof(DWO
2260: 52 44 29 29 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  RD))).#endif../*
2270: 0a 20 2a 20 54 68 65 20 76 61 6c 75 65 20 75 73  . * The value us
2280: 65 64 20 77 69 74 68 20 73 71 6c 69 74 65 33 5f  ed with sqlite3_
2290: 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74  win32_set_direct
22a0: 6f 72 79 28 29 20 74 6f 20 73 70 65 63 69 66 79  ory() to specify
22b0: 20 74 68 61 74 0a 20 2a 20 74 68 65 20 64 61 74   that. * the dat
22c0: 61 20 64 69 72 65 63 74 6f 72 79 20 73 68 6f 75  a directory shou
22d0: 6c 64 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 20  ld be changed.. 
22e0: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
22f0: 45 5f 57 49 4e 33 32 5f 44 41 54 41 5f 44 49 52  E_WIN32_DATA_DIR
2300: 45 43 54 4f 52 59 5f 54 59 50 45 0a 23 20 20 64  ECTORY_TYPE.#  d
2310: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e  efine SQLITE_WIN
2320: 33 32 5f 44 41 54 41 5f 44 49 52 45 43 54 4f 52  32_DATA_DIRECTOR
2330: 59 5f 54 59 50 45 20 28 31 29 0a 23 65 6e 64 69  Y_TYPE (1).#endi
2340: 66 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20 76 61 6c  f../*. * The val
2350: 75 65 20 75 73 65 64 20 77 69 74 68 20 73 71 6c  ue used with sql
2360: 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64  ite3_win32_set_d
2370: 69 72 65 63 74 6f 72 79 28 29 20 74 6f 20 73 70  irectory() to sp
2380: 65 63 69 66 79 20 74 68 61 74 0a 20 2a 20 74 68  ecify that. * th
2390: 65 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65  e temporary dire
23a0: 63 74 6f 72 79 20 73 68 6f 75 6c 64 20 62 65 20  ctory should be 
23b0: 63 68 61 6e 67 65 64 2e 0a 20 2a 2f 0a 23 69 66  changed.. */.#if
23c0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  ndef SQLITE_WIN3
23d0: 32 5f 54 45 4d 50 5f 44 49 52 45 43 54 4f 52 59  2_TEMP_DIRECTORY
23e0: 5f 54 59 50 45 0a 23 20 20 64 65 66 69 6e 65 20  _TYPE.#  define 
23f0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 54 45 4d  SQLITE_WIN32_TEM
2400: 50 5f 44 49 52 45 43 54 4f 52 59 5f 54 59 50 45  P_DIRECTORY_TYPE
2410: 20 28 32 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a   (2).#endif../*.
2420: 20 2a 20 49 66 20 63 6f 6d 70 69 6c 65 64 20 77   * If compiled w
2430: 69 74 68 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ith SQLITE_WIN32
2440: 5f 4d 41 4c 4c 4f 43 20 6f 6e 20 57 69 6e 64 6f  _MALLOC on Windo
2450: 77 73 2c 20 77 65 20 77 69 6c 6c 20 75 73 65 20  ws, we will use 
2460: 74 68 65 0a 20 2a 20 76 61 72 69 6f 75 73 20 57  the. * various W
2470: 69 6e 33 32 20 41 50 49 20 68 65 61 70 20 66 75  in32 API heap fu
2480: 6e 63 74 69 6f 6e 73 20 69 6e 73 74 65 61 64 20  nctions instead 
2490: 6f 66 20 6f 75 72 20 6f 77 6e 2e 0a 20 2a 2f 0a  of our own.. */.
24a0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49  #ifdef SQLITE_WI
24b0: 4e 33 32 5f 4d 41 4c 4c 4f 43 0a 0a 2f 2a 0a 20  N32_MALLOC../*. 
24c0: 2a 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 6e  * If this is non
24d0: 2d 7a 65 72 6f 2c 20 61 6e 20 69 73 6f 6c 61 74  -zero, an isolat
24e0: 65 64 20 68 65 61 70 20 77 69 6c 6c 20 62 65 20  ed heap will be 
24f0: 63 72 65 61 74 65 64 20 62 79 20 74 68 65 20 6e  created by the n
2500: 61 74 69 76 65 20 57 69 6e 33 32 0a 20 2a 20 61  ative Win32. * a
2510: 6c 6c 6f 63 61 74 6f 72 20 73 75 62 73 79 73 74  llocator subsyst
2520: 65 6d 3b 20 6f 74 68 65 72 77 69 73 65 2c 20 74  em; otherwise, t
2530: 68 65 20 64 65 66 61 75 6c 74 20 70 72 6f 63 65  he default proce
2540: 73 73 20 68 65 61 70 20 77 69 6c 6c 20 62 65 20  ss heap will be 
2550: 75 73 65 64 2e 20 20 54 68 69 73 0a 20 2a 20 73  used.  This. * s
2560: 65 74 74 69 6e 67 20 68 61 73 20 6e 6f 20 65 66  etting has no ef
2570: 66 65 63 74 20 77 68 65 6e 20 63 6f 6d 70 69 6c  fect when compil
2580: 69 6e 67 20 66 6f 72 20 57 69 6e 52 54 2e 20 20  ing for WinRT.  
2590: 42 79 20 64 65 66 61 75 6c 74 2c 20 74 68 69 73  By default, this
25a0: 20 69 73 20 65 6e 61 62 6c 65 64 0a 20 2a 20 61   is enabled. * a
25b0: 6e 64 20 61 6e 20 69 73 6f 6c 61 74 65 64 20 68  nd an isolated h
25c0: 65 61 70 20 77 69 6c 6c 20 62 65 20 63 72 65 61  eap will be crea
25d0: 74 65 64 20 74 6f 20 73 74 6f 72 65 20 61 6c 6c  ted to store all
25e0: 20 61 6c 6c 6f 63 61 74 65 64 20 64 61 74 61 2e   allocated data.
25f0: 0a 20 2a 0a 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  . *. ***********
2600: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2610: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2620: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2630: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2640: 2a 2a 2a 0a 20 2a 20 57 41 52 4e 49 4e 47 3a 20  ***. * WARNING: 
2650: 49 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20  It is important 
2660: 74 6f 20 6e 6f 74 65 20 74 68 61 74 20 77 68 65  to note that whe
2670: 6e 20 74 68 69 73 20 73 65 74 74 69 6e 67 20 69  n this setting i
2680: 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64 20 74  s non-zero and t
2690: 68 65 0a 20 2a 20 20 20 20 20 20 20 20 20 20 77  he. *          w
26a0: 69 6e 4d 65 6d 53 68 75 74 64 6f 77 6e 20 66 75  inMemShutdown fu
26b0: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
26c0: 20 28 65 2e 67 2e 20 62 79 20 74 68 65 20 73 71   (e.g. by the sq
26d0: 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 0a 20  lite3_shutdown. 
26e0: 2a 20 20 20 20 20 20 20 20 20 20 66 75 6e 63 74  *          funct
26f0: 69 6f 6e 29 2c 20 61 6c 6c 20 64 61 74 61 20 74  ion), all data t
2700: 68 61 74 20 77 61 73 20 61 6c 6c 6f 63 61 74 65  hat was allocate
2710: 64 20 75 73 69 6e 67 20 74 68 65 20 69 73 6f 6c  d using the isol
2720: 61 74 65 64 20 68 65 61 70 20 77 69 6c 6c 0a 20  ated heap will. 
2730: 2a 20 20 20 20 20 20 20 20 20 20 62 65 20 66 72  *          be fr
2740: 65 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  eed immediately 
2750: 61 6e 64 20 61 6e 79 20 61 74 74 65 6d 70 74 20  and any attempt 
2760: 74 6f 20 61 63 63 65 73 73 20 61 6e 79 20 6f 66  to access any of
2770: 20 74 68 61 74 20 66 72 65 65 64 0a 20 2a 20 20   that freed. *  
2780: 20 20 20 20 20 20 20 20 64 61 74 61 20 77 69 6c          data wil
2790: 6c 20 61 6c 6d 6f 73 74 20 63 65 72 74 61 69 6e  l almost certain
27a0: 6c 79 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20  ly result in an 
27b0: 69 6d 6d 65 64 69 61 74 65 20 61 63 63 65 73 73  immediate access
27c0: 20 76 69 6f 6c 61 74 69 6f 6e 2e 0a 20 2a 2a 2a   violation.. ***
27d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2800: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2810: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 2a 2f 0a  ***********. */.
2820: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57  #ifndef SQLITE_W
2830: 49 4e 33 32 5f 48 45 41 50 5f 43 52 45 41 54 45  IN32_HEAP_CREATE
2840: 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54  .#  define SQLIT
2850: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 43 52 45  E_WIN32_HEAP_CRE
2860: 41 54 45 20 20 20 20 28 54 52 55 45 29 0a 23 65  ATE    (TRUE).#e
2870: 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20  ndif../*. * The 
2880: 69 6e 69 74 69 61 6c 20 73 69 7a 65 20 6f 66 20  initial size of 
2890: 74 68 65 20 57 69 6e 33 32 2d 73 70 65 63 69 66  the Win32-specif
28a0: 69 63 20 68 65 61 70 2e 20 20 54 68 69 73 20 76  ic heap.  This v
28b0: 61 6c 75 65 20 6d 61 79 20 62 65 20 7a 65 72 6f  alue may be zero
28c0: 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  .. */.#ifndef SQ
28d0: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
28e0: 49 4e 49 54 5f 53 49 5a 45 0a 23 20 20 64 65 66  INIT_SIZE.#  def
28f0: 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ine SQLITE_WIN32
2900: 5f 48 45 41 50 5f 49 4e 49 54 5f 53 49 5a 45 20  _HEAP_INIT_SIZE 
2910: 28 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  ((SQLITE_DEFAULT
2920: 5f 43 41 43 48 45 5f 53 49 5a 45 29 20 2a 20 5c  _CACHE_SIZE) * \
2930: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2950: 20 20 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f          (SQLITE_
2960: 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
2970: 45 29 20 2b 20 34 31 39 34 33 30 34 29 0a 23 65  E) + 4194304).#e
2980: 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20  ndif../*. * The 
2990: 6d 61 78 69 6d 75 6d 20 73 69 7a 65 20 6f 66 20  maximum size of 
29a0: 74 68 65 20 57 69 6e 33 32 2d 73 70 65 63 69 66  the Win32-specif
29b0: 69 63 20 68 65 61 70 2e 20 20 54 68 69 73 20 76  ic heap.  This v
29c0: 61 6c 75 65 20 6d 61 79 20 62 65 20 7a 65 72 6f  alue may be zero
29d0: 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  .. */.#ifndef SQ
29e0: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
29f0: 4d 41 58 5f 53 49 5a 45 0a 23 20 20 64 65 66 69  MAX_SIZE.#  defi
2a00: 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ne SQLITE_WIN32_
2a10: 48 45 41 50 5f 4d 41 58 5f 53 49 5a 45 20 20 28  HEAP_MAX_SIZE  (
2a20: 30 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a  0).#endif../*. *
2a30: 20 54 68 65 20 65 78 74 72 61 20 66 6c 61 67 73   The extra flags
2a40: 20 74 6f 20 75 73 65 20 69 6e 20 63 61 6c 6c 73   to use in calls
2a50: 20 74 6f 20 74 68 65 20 57 69 6e 33 32 20 68 65   to the Win32 he
2a60: 61 70 20 41 50 49 73 2e 20 20 54 68 69 73 20 76  ap APIs.  This v
2a70: 61 6c 75 65 20 6d 61 79 20 62 65 0a 20 2a 20 7a  alue may be. * z
2a80: 65 72 6f 20 66 6f 72 20 74 68 65 20 64 65 66 61  ero for the defa
2a90: 75 6c 74 20 62 65 68 61 76 69 6f 72 2e 0a 20 2a  ult behavior.. *
2aa0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
2ab0: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47  _WIN32_HEAP_FLAG
2ac0: 53 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49  S.#  define SQLI
2ad0: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c  TE_WIN32_HEAP_FL
2ae0: 41 47 53 20 20 20 20 20 28 30 29 0a 23 65 6e 64  AGS     (0).#end
2af0: 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 77  if.../*.** The w
2b00: 69 6e 4d 65 6d 44 61 74 61 20 73 74 72 75 63 74  inMemData struct
2b10: 75 72 65 20 73 74 6f 72 65 73 20 69 6e 66 6f 72  ure stores infor
2b20: 6d 61 74 69 6f 6e 20 72 65 71 75 69 72 65 64 20  mation required 
2b30: 62 79 20 74 68 65 20 57 69 6e 33 32 2d 73 70 65  by the Win32-spe
2b40: 63 69 66 69 63 0a 2a 2a 20 73 71 6c 69 74 65 33  cific.** sqlite3
2b50: 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 69 6d 70  _mem_methods imp
2b60: 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2f 0a  lementation..*/.
2b70: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 77  typedef struct w
2b80: 69 6e 4d 65 6d 44 61 74 61 20 77 69 6e 4d 65 6d  inMemData winMem
2b90: 44 61 74 61 3b 0a 73 74 72 75 63 74 20 77 69 6e  Data;.struct win
2ba0: 4d 65 6d 44 61 74 61 20 7b 0a 23 69 66 6e 64 65  MemData {.#ifnde
2bb0: 66 20 4e 44 45 42 55 47 0a 20 20 75 33 32 20 6d  f NDEBUG.  u32 m
2bc0: 61 67 69 63 31 3b 20 20 20 2f 2a 20 4d 61 67 69  agic1;   /* Magi
2bd0: 63 20 6e 75 6d 62 65 72 20 74 6f 20 64 65 74 65  c number to dete
2be0: 63 74 20 73 74 72 75 63 74 75 72 65 20 63 6f 72  ct structure cor
2bf0: 72 75 70 74 69 6f 6e 2e 20 2a 2f 0a 23 65 6e 64  ruption. */.#end
2c00: 69 66 0a 20 20 48 41 4e 44 4c 45 20 68 48 65 61  if.  HANDLE hHea
2c10: 70 3b 20 2f 2a 20 54 68 65 20 68 61 6e 64 6c 65  p; /* The handle
2c20: 20 74 6f 20 6f 75 72 20 68 65 61 70 2e 20 2a 2f   to our heap. */
2c30: 0a 20 20 42 4f 4f 4c 20 62 4f 77 6e 65 64 3b 20  .  BOOL bOwned; 
2c40: 20 2f 2a 20 44 6f 20 77 65 20 6f 77 6e 20 74 68   /* Do we own th
2c50: 65 20 68 65 61 70 20 28 69 2e 65 2e 20 64 65 73  e heap (i.e. des
2c60: 74 72 6f 79 20 69 74 20 6f 6e 20 73 68 75 74 64  troy it on shutd
2c70: 6f 77 6e 29 3f 20 2a 2f 0a 23 69 66 6e 64 65 66  own)? */.#ifndef
2c80: 20 4e 44 45 42 55 47 0a 20 20 75 33 32 20 6d 61   NDEBUG.  u32 ma
2c90: 67 69 63 32 3b 20 20 20 2f 2a 20 4d 61 67 69 63  gic2;   /* Magic
2ca0: 20 6e 75 6d 62 65 72 20 74 6f 20 64 65 74 65 63   number to detec
2cb0: 74 20 73 74 72 75 63 74 75 72 65 20 63 6f 72 72  t structure corr
2cc0: 75 70 74 69 6f 6e 2e 20 2a 2f 0a 23 65 6e 64 69  uption. */.#endi
2cd0: 66 0a 7d 3b 0a 0a 23 69 66 6e 64 65 66 20 4e 44  f.};..#ifndef ND
2ce0: 45 42 55 47 0a 23 64 65 66 69 6e 65 20 57 49 4e  EBUG.#define WIN
2cf0: 4d 45 4d 5f 4d 41 47 49 43 31 20 20 20 20 20 30  MEM_MAGIC1     0
2d00: 78 34 32 62 32 38 33 30 62 0a 23 64 65 66 69 6e  x42b2830b.#defin
2d10: 65 20 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 32 20  e WINMEM_MAGIC2 
2d20: 20 20 20 20 30 78 62 64 34 64 37 63 66 34 0a 23      0xbd4d7cf4.#
2d30: 65 6e 64 69 66 0a 0a 73 74 61 74 69 63 20 73 74  endif..static st
2d40: 72 75 63 74 20 77 69 6e 4d 65 6d 44 61 74 61 20  ruct winMemData 
2d50: 77 69 6e 5f 6d 65 6d 5f 64 61 74 61 20 3d 20 7b  win_mem_data = {
2d60: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
2d70: 20 20 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 31 2c    WINMEM_MAGIC1,
2d80: 0a 23 65 6e 64 69 66 0a 20 20 4e 55 4c 4c 2c 20  .#endif.  NULL, 
2d90: 46 41 4c 53 45 0a 23 69 66 6e 64 65 66 20 4e 44  FALSE.#ifndef ND
2da0: 45 42 55 47 0a 20 20 2c 57 49 4e 4d 45 4d 5f 4d  EBUG.  ,WINMEM_M
2db0: 41 47 49 43 32 0a 23 65 6e 64 69 66 0a 7d 3b 0a  AGIC2.#endif.};.
2dc0: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
2dd0: 23 64 65 66 69 6e 65 20 77 69 6e 4d 65 6d 41 73  #define winMemAs
2de0: 73 65 72 74 4d 61 67 69 63 31 28 29 20 61 73 73  sertMagic1() ass
2df0: 65 72 74 28 20 77 69 6e 5f 6d 65 6d 5f 64 61 74  ert( win_mem_dat
2e00: 61 2e 6d 61 67 69 63 31 3d 3d 57 49 4e 4d 45 4d  a.magic1==WINMEM
2e10: 5f 4d 41 47 49 43 31 20 29 0a 23 64 65 66 69 6e  _MAGIC1 ).#defin
2e20: 65 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61  e winMemAssertMa
2e30: 67 69 63 32 28 29 20 61 73 73 65 72 74 28 20 77  gic2() assert( w
2e40: 69 6e 5f 6d 65 6d 5f 64 61 74 61 2e 6d 61 67 69  in_mem_data.magi
2e50: 63 32 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49 43  c2==WINMEM_MAGIC
2e60: 32 20 29 0a 23 64 65 66 69 6e 65 20 77 69 6e 4d  2 ).#define winM
2e70: 65 6d 41 73 73 65 72 74 4d 61 67 69 63 28 29 20  emAssertMagic() 
2e80: 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67   winMemAssertMag
2e90: 69 63 31 28 29 3b 20 77 69 6e 4d 65 6d 41 73 73  ic1(); winMemAss
2ea0: 65 72 74 4d 61 67 69 63 32 28 29 3b 0a 23 65 6c  ertMagic2();.#el
2eb0: 73 65 0a 23 64 65 66 69 6e 65 20 77 69 6e 4d 65  se.#define winMe
2ec0: 6d 41 73 73 65 72 74 4d 61 67 69 63 28 29 0a 23  mAssertMagic().#
2ed0: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 77  endif..#define w
2ee0: 69 6e 4d 65 6d 47 65 74 44 61 74 61 50 74 72 28  inMemGetDataPtr(
2ef0: 29 20 20 26 77 69 6e 5f 6d 65 6d 5f 64 61 74 61  )  &win_mem_data
2f00: 0a 23 64 65 66 69 6e 65 20 77 69 6e 4d 65 6d 47  .#define winMemG
2f10: 65 74 48 65 61 70 28 29 20 20 20 20 20 77 69 6e  etHeap()     win
2f20: 5f 6d 65 6d 5f 64 61 74 61 2e 68 48 65 61 70 0a  _mem_data.hHeap.
2f30: 23 64 65 66 69 6e 65 20 77 69 6e 4d 65 6d 47 65  #define winMemGe
2f40: 74 4f 77 6e 65 64 28 29 20 20 20 20 77 69 6e 5f  tOwned()    win_
2f50: 6d 65 6d 5f 64 61 74 61 2e 62 4f 77 6e 65 64 0a  mem_data.bOwned.
2f60: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 77 69  .static void *wi
2f70: 6e 4d 65 6d 4d 61 6c 6c 6f 63 28 69 6e 74 20 6e  nMemMalloc(int n
2f80: 42 79 74 65 73 29 3b 0a 73 74 61 74 69 63 20 76  Bytes);.static v
2f90: 6f 69 64 20 77 69 6e 4d 65 6d 46 72 65 65 28 76  oid winMemFree(v
2fa0: 6f 69 64 20 2a 70 50 72 69 6f 72 29 3b 0a 73 74  oid *pPrior);.st
2fb0: 61 74 69 63 20 76 6f 69 64 20 2a 77 69 6e 4d 65  atic void *winMe
2fc0: 6d 52 65 61 6c 6c 6f 63 28 76 6f 69 64 20 2a 70  mRealloc(void *p
2fd0: 50 72 69 6f 72 2c 20 69 6e 74 20 6e 42 79 74 65  Prior, int nByte
2fe0: 73 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77  s);.static int w
2ff0: 69 6e 4d 65 6d 53 69 7a 65 28 76 6f 69 64 20 2a  inMemSize(void *
3000: 70 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77  p);.static int w
3010: 69 6e 4d 65 6d 52 6f 75 6e 64 75 70 28 69 6e 74  inMemRoundup(int
3020: 20 6e 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20   n);.static int 
3030: 77 69 6e 4d 65 6d 49 6e 69 74 28 76 6f 69 64 20  winMemInit(void 
3040: 2a 70 41 70 70 44 61 74 61 29 3b 0a 73 74 61 74  *pAppData);.stat
3050: 69 63 20 76 6f 69 64 20 77 69 6e 4d 65 6d 53 68  ic void winMemSh
3060: 75 74 64 6f 77 6e 28 76 6f 69 64 20 2a 70 41 70  utdown(void *pAp
3070: 70 44 61 74 61 29 3b 0a 0a 63 6f 6e 73 74 20 73  pData);..const s
3080: 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f  qlite3_mem_metho
3090: 64 73 20 2a 73 71 6c 69 74 65 33 4d 65 6d 47 65  ds *sqlite3MemGe
30a0: 74 57 69 6e 33 32 28 76 6f 69 64 29 3b 0a 23 65  tWin32(void);.#e
30b0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 57  ndif /* SQLITE_W
30c0: 49 4e 33 32 5f 4d 41 4c 4c 4f 43 20 2a 2f 0a 0a  IN32_MALLOC */..
30d0: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
30e0: 69 6e 67 20 76 61 72 69 61 62 6c 65 20 69 73 20  ing variable is 
30f0: 28 6e 6f 72 6d 61 6c 6c 79 29 20 73 65 74 20 6f  (normally) set o
3100: 6e 63 65 20 61 6e 64 20 6e 65 76 65 72 20 63 68  nce and never ch
3110: 61 6e 67 65 73 0a 2a 2a 20 74 68 65 72 65 61 66  anges.** thereaf
3120: 74 65 72 2e 20 20 49 74 20 72 65 63 6f 72 64 73  ter.  It records
3130: 20 77 68 65 74 68 65 72 20 74 68 65 20 6f 70 65   whether the ope
3140: 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69 73  rating system is
3150: 20 57 69 6e 39 78 0a 2a 2a 20 6f 72 20 57 69 6e   Win9x.** or Win
3160: 4e 54 2e 0a 2a 2a 0a 2a 2a 20 30 3a 20 20 20 4f  NT..**.** 0:   O
3170: 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
3180: 75 6e 6b 6e 6f 77 6e 2e 0a 2a 2a 20 31 3a 20 20  unknown..** 1:  
3190: 20 4f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   Operating syste
31a0: 6d 20 69 73 20 57 69 6e 39 78 2e 0a 2a 2a 20 32  m is Win9x..** 2
31b0: 3a 20 20 20 4f 70 65 72 61 74 69 6e 67 20 73 79  :   Operating sy
31c0: 73 74 65 6d 20 69 73 20 57 69 6e 4e 54 2e 0a 2a  stem is WinNT..*
31d0: 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65 72 20 74 6f  *.** In order to
31e0: 20 66 61 63 69 6c 69 74 61 74 65 20 74 65 73 74   facilitate test
31f0: 69 6e 67 20 6f 6e 20 61 20 57 69 6e 4e 54 20 73  ing on a WinNT s
3200: 79 73 74 65 6d 2c 20 74 68 65 20 74 65 73 74 20  ystem, the test 
3210: 66 69 78 74 75 72 65 0a 2a 2a 20 63 61 6e 20 6d  fixture.** can m
3220: 61 6e 75 61 6c 6c 79 20 73 65 74 20 74 68 69 73  anually set this
3230: 20 76 61 6c 75 65 20 74 6f 20 31 20 74 6f 20 65   value to 1 to e
3240: 6d 75 6c 61 74 65 20 57 69 6e 39 38 20 62 65 68  mulate Win98 beh
3250: 61 76 69 6f 72 2e 0a 2a 2f 0a 23 69 66 64 65 66  avior..*/.#ifdef
3260: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 4c 4f 4e   SQLITE_TEST.LON
3270: 47 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 56  G SQLITE_WIN32_V
3280: 4f 4c 41 54 49 4c 45 20 73 71 6c 69 74 65 33 5f  OLATILE sqlite3_
3290: 6f 73 5f 74 79 70 65 20 3d 20 30 3b 0a 23 65 6c  os_type = 0;.#el
32a0: 73 65 0a 73 74 61 74 69 63 20 4c 4f 4e 47 20 53  se.static LONG S
32b0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 56 4f 4c 41  QLITE_WIN32_VOLA
32c0: 54 49 4c 45 20 73 71 6c 69 74 65 33 5f 6f 73 5f  TILE sqlite3_os_
32d0: 74 79 70 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66  type = 0;.#endif
32e0: 0a 0a 23 69 66 6e 64 65 66 20 53 59 53 43 41 4c  ..#ifndef SYSCAL
32f0: 4c 0a 23 20 20 64 65 66 69 6e 65 20 53 59 53 43  L.#  define SYSC
3300: 41 4c 4c 20 73 71 6c 69 74 65 33 5f 73 79 73 63  ALL sqlite3_sysc
3310: 61 6c 6c 5f 70 74 72 0a 23 65 6e 64 69 66 0a 0a  all_ptr.#endif..
3320: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
3330: 69 6f 6e 20 69 73 20 6e 6f 74 20 61 76 61 69 6c  ion is not avail
3340: 61 62 6c 65 20 6f 6e 20 57 69 6e 64 6f 77 73 20  able on Windows 
3350: 43 45 20 6f 72 20 57 69 6e 52 54 2e 0a 20 2a 2f  CE or WinRT.. */
3360: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
3370: 57 49 4e 43 45 20 7c 7c 20 53 51 4c 49 54 45 5f  WINCE || SQLITE_
3380: 4f 53 5f 57 49 4e 52 54 0a 23 20 20 64 65 66 69  OS_WINRT.#  defi
3390: 6e 65 20 6f 73 41 72 65 46 69 6c 65 41 70 69 73  ne osAreFileApis
33a0: 41 4e 53 49 28 29 20 20 20 20 20 20 20 31 0a 23  ANSI()       1.#
33b0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6e  endif../*.** Man
33c0: 79 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 61  y system calls a
33d0: 72 65 20 61 63 63 65 73 73 65 64 20 74 68 72 6f  re accessed thro
33e0: 75 67 68 20 70 6f 69 6e 74 65 72 2d 74 6f 2d 66  ugh pointer-to-f
33f0: 75 6e 63 74 69 6f 6e 73 20 73 6f 20 74 68 61 74  unctions so that
3400: 0a 2a 2a 20 74 68 65 79 20 6d 61 79 20 62 65 20  .** they may be 
3410: 6f 76 65 72 72 69 64 64 65 6e 20 61 74 20 72 75  overridden at ru
3420: 6e 74 69 6d 65 20 74 6f 20 66 61 63 69 6c 69 74  ntime to facilit
3430: 61 74 65 20 66 61 75 6c 74 20 69 6e 6a 65 63 74  ate fault inject
3440: 69 6f 6e 20 64 75 72 69 6e 67 0a 2a 2a 20 74 65  ion during.** te
3450: 73 74 69 6e 67 20 61 6e 64 20 73 61 6e 64 62 6f  sting and sandbo
3460: 78 69 6e 67 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  xing.  The follo
3470: 77 69 6e 67 20 61 72 72 61 79 20 68 6f 6c 64 73  wing array holds
3480: 20 74 68 65 20 6e 61 6d 65 73 20 61 6e 64 20 70   the names and p
3490: 6f 69 6e 74 65 72 73 0a 2a 2a 20 74 6f 20 61 6c  ointers.** to al
34a0: 6c 20 6f 76 65 72 72 69 64 65 61 62 6c 65 20 73  l overrideable s
34b0: 79 73 74 65 6d 20 63 61 6c 6c 73 2e 0a 2a 2f 0a  ystem calls..*/.
34c0: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 77 69  static struct wi
34d0: 6e 5f 73 79 73 63 61 6c 6c 20 7b 0a 20 20 63 6f  n_syscall {.  co
34e0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  nst char *zName;
34f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
3500: 61 6d 65 20 6f 66 20 74 68 65 20 73 79 73 74 65  ame of the syste
3510: 6d 20 63 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69  m call */.  sqli
3520: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20  te3_syscall_ptr 
3530: 70 43 75 72 72 65 6e 74 3b 20 2f 2a 20 43 75 72  pCurrent; /* Cur
3540: 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 74 68  rent value of th
3550: 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 2a 2f  e system call */
3560: 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61  .  sqlite3_sysca
3570: 6c 6c 5f 70 74 72 20 70 44 65 66 61 75 6c 74 3b  ll_ptr pDefault;
3580: 20 2f 2a 20 44 65 66 61 75 6c 74 20 76 61 6c 75   /* Default valu
3590: 65 20 2a 2f 0a 7d 20 61 53 79 73 63 61 6c 6c 5b  e */.} aSyscall[
35a0: 5d 20 3d 20 7b 0a 23 69 66 20 21 53 51 4c 49 54  ] = {.#if !SQLIT
35b0: 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53  E_OS_WINCE && !S
35c0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
35d0: 20 7b 20 22 41 72 65 46 69 6c 65 41 70 69 73 41   { "AreFileApisA
35e0: 4e 53 49 22 2c 20 20 20 20 20 20 20 20 20 28 53  NSI",         (S
35f0: 59 53 43 41 4c 4c 29 41 72 65 46 69 6c 65 41 70  YSCALL)AreFileAp
3600: 69 73 41 4e 53 49 2c 20 20 20 20 20 20 20 20 20  isANSI,         
3610: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
3620: 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49 22  AreFileApisANSI"
3630: 2c 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41  ,         (SYSCA
3640: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
3650: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
3660: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
3670: 20 6f 73 41 72 65 46 69 6c 65 41 70 69 73 41 4e   osAreFileApisAN
3680: 53 49 0a 23 64 65 66 69 6e 65 20 6f 73 41 72 65  SI.#define osAre
3690: 46 69 6c 65 41 70 69 73 41 4e 53 49 20 28 28 42  FileApisANSI ((B
36a0: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 56 4f 49  OOL(WINAPI*)(VOI
36b0: 44 29 29 61 53 79 73 63 61 6c 6c 5b 30 5d 2e 70  D))aSyscall[0].p
36c0: 43 75 72 72 65 6e 74 29 0a 23 65 6e 64 69 66 0a  Current).#endif.
36d0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
36e0: 49 4e 43 45 20 26 26 20 64 65 66 69 6e 65 64 28  INCE && defined(
36f0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
3700: 5f 57 49 44 45 29 0a 20 20 7b 20 22 43 68 61 72  _WIDE).  { "Char
3710: 4c 6f 77 65 72 57 22 2c 20 20 20 20 20 20 20 20  LowerW",        
3720: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43        (SYSCALL)C
3730: 68 61 72 4c 6f 77 65 72 57 2c 20 20 20 20 20 20  harLowerW,      
3740: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
3750: 73 65 0a 20 20 7b 20 22 43 68 61 72 4c 6f 77 65  se.  { "CharLowe
3760: 72 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  rW",            
3770: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
3780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3790: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
37a0: 0a 23 64 65 66 69 6e 65 20 6f 73 43 68 61 72 4c  .#define osCharL
37b0: 6f 77 65 72 57 20 28 28 4c 50 57 53 54 52 28 57  owerW ((LPWSTR(W
37c0: 49 4e 41 50 49 2a 29 28 4c 50 57 53 54 52 29 29  INAPI*)(LPWSTR))
37d0: 61 53 79 73 63 61 6c 6c 5b 31 5d 2e 70 43 75 72  aSyscall[1].pCur
37e0: 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54  rent)..#if SQLIT
37f0: 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 64 65  E_OS_WINCE && de
3800: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
3810: 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b  32_HAS_WIDE).  {
3820: 20 22 43 68 61 72 55 70 70 65 72 57 22 2c 20 20   "CharUpperW",  
3830: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
3840: 43 41 4c 4c 29 43 68 61 72 55 70 70 65 72 57 2c  CALL)CharUpperW,
3850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
3860: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 68  },.#else.  { "Ch
3870: 61 72 55 70 70 65 72 57 22 2c 20 20 20 20 20 20  arUpperW",      
3880: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
3890: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
38a0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
38b0: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
38c0: 73 43 68 61 72 55 70 70 65 72 57 20 28 28 4c 50  sCharUpperW ((LP
38d0: 57 53 54 52 28 57 49 4e 41 50 49 2a 29 28 4c 50  WSTR(WINAPI*)(LP
38e0: 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 32  WSTR))aSyscall[2
38f0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
3900: 20 22 43 6c 6f 73 65 48 61 6e 64 6c 65 22 2c 20   "CloseHandle", 
3910: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
3920: 43 41 4c 4c 29 43 6c 6f 73 65 48 61 6e 64 6c 65  CALL)CloseHandle
3930: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20  ,             0 
3940: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 6c  },..#define osCl
3950: 6f 73 65 48 61 6e 64 6c 65 20 28 28 42 4f 4f 4c  oseHandle ((BOOL
3960: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
3970: 29 29 61 53 79 73 63 61 6c 6c 5b 33 5d 2e 70 43  ))aSyscall[3].pC
3980: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66  urrent)..#if def
3990: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
39a0: 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20  2_HAS_ANSI).  { 
39b0: 22 43 72 65 61 74 65 46 69 6c 65 41 22 2c 20 20  "CreateFileA",  
39c0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
39d0: 41 4c 4c 29 43 72 65 61 74 65 46 69 6c 65 41 2c  ALL)CreateFileA,
39e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
39f0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65  ,.#else.  { "Cre
3a00: 61 74 65 46 69 6c 65 41 22 2c 20 20 20 20 20 20  ateFileA",      
3a10: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
3a20: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
3a30: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
3a40: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
3a50: 43 72 65 61 74 65 46 69 6c 65 41 20 28 28 48 41  CreateFileA ((HA
3a60: 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50  NDLE(WINAPI*)(LP
3a70: 43 53 54 52 2c 44 57 4f 52 44 2c 44 57 4f 52 44  CSTR,DWORD,DWORD
3a80: 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 53 45  , \.        LPSE
3a90: 43 55 52 49 54 59 5f 41 54 54 52 49 42 55 54 45  CURITY_ATTRIBUTE
3aa0: 53 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 48 41  S,DWORD,DWORD,HA
3ab0: 4e 44 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 34  NDLE))aSyscall[4
3ac0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
3ad0: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
3ae0: 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  T && defined(SQL
3af0: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
3b00: 44 45 29 0a 20 20 7b 20 22 43 72 65 61 74 65 46  DE).  { "CreateF
3b10: 69 6c 65 57 22 2c 20 20 20 20 20 20 20 20 20 20  ileW",          
3b20: 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72 65 61     (SYSCALL)Crea
3b30: 74 65 46 69 6c 65 57 2c 20 20 20 20 20 20 20 20  teFileW,        
3b40: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
3b50: 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65 57    { "CreateFileW
3b60: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ",             (
3b70: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
3b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b90: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
3ba0: 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65 46 69  efine osCreateFi
3bb0: 6c 65 57 20 28 28 48 41 4e 44 4c 45 28 57 49 4e  leW ((HANDLE(WIN
3bc0: 41 50 49 2a 29 28 4c 50 43 57 53 54 52 2c 44 57  API*)(LPCWSTR,DW
3bd0: 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20  ORD,DWORD, \.   
3be0: 20 20 20 20 20 4c 50 53 45 43 55 52 49 54 59 5f       LPSECURITY_
3bf0: 41 54 54 52 49 42 55 54 45 53 2c 44 57 4f 52 44  ATTRIBUTES,DWORD
3c00: 2c 44 57 4f 52 44 2c 48 41 4e 44 4c 45 29 29 61  ,DWORD,HANDLE))a
3c10: 53 79 73 63 61 6c 6c 5b 35 5d 2e 70 43 75 72 72  Syscall[5].pCurr
3c20: 65 6e 74 29 0a 0a 23 69 66 20 28 21 53 51 4c 49  ent)..#if (!SQLI
3c30: 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64  TE_OS_WINRT && d
3c40: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
3c50: 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 20 26 26  N32_HAS_ANSI) &&
3c60: 20 5c 0a 20 20 20 20 20 20 20 20 21 64 65 66 69   \.        !defi
3c70: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
3c80: 57 41 4c 29 29 0a 20 20 7b 20 22 43 72 65 61 74  WAL)).  { "Creat
3c90: 65 46 69 6c 65 4d 61 70 70 69 6e 67 41 22 2c 20  eFileMappingA", 
3ca0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72       (SYSCALL)Cr
3cb0: 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 41  eateFileMappingA
3cc0: 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73  ,      0 },.#els
3cd0: 65 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c  e.  { "CreateFil
3ce0: 65 4d 61 70 70 69 6e 67 41 22 2c 20 20 20 20 20  eMappingA",     
3cf0: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
3d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d10: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
3d20: 23 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65  #define osCreate
3d30: 46 69 6c 65 4d 61 70 70 69 6e 67 41 20 28 28 48  FileMappingA ((H
3d40: 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 48  ANDLE(WINAPI*)(H
3d50: 41 4e 44 4c 45 2c 4c 50 53 45 43 55 52 49 54 59  ANDLE,LPSECURITY
3d60: 5f 41 54 54 52 49 42 55 54 45 53 2c 20 5c 0a 20  _ATTRIBUTES, \. 
3d70: 20 20 20 20 20 20 20 44 57 4f 52 44 2c 44 57 4f         DWORD,DWO
3d80: 52 44 2c 44 57 4f 52 44 2c 4c 50 43 53 54 52 29  RD,DWORD,LPCSTR)
3d90: 29 61 53 79 73 63 61 6c 6c 5b 36 5d 2e 70 43 75  )aSyscall[6].pCu
3da0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49  rrent)..#if SQLI
3db0: 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 28  TE_OS_WINCE || (
3dc0: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
3dd0: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
3de0: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
3df0: 45 29 20 26 26 20 5c 0a 20 20 20 20 20 20 20 20  E) && \.        
3e00: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
3e10: 4f 4d 49 54 5f 57 41 4c 29 29 0a 20 20 7b 20 22  OMIT_WAL)).  { "
3e20: 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e  CreateFileMappin
3e30: 67 57 22 2c 20 20 20 20 20 20 28 53 59 53 43 41  gW",      (SYSCA
3e40: 4c 4c 29 43 72 65 61 74 65 46 69 6c 65 4d 61 70  LL)CreateFileMap
3e50: 70 69 6e 67 57 2c 20 20 20 20 20 20 30 20 7d 2c  pingW,      0 },
3e60: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65 61  .#else.  { "Crea
3e70: 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 22 2c  teFileMappingW",
3e80: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
3e90: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3ea0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
3eb0: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43  dif..#define osC
3ec0: 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67  reateFileMapping
3ed0: 57 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50  W ((HANDLE(WINAP
3ee0: 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 50 53 45 43  I*)(HANDLE,LPSEC
3ef0: 55 52 49 54 59 5f 41 54 54 52 49 42 55 54 45 53  URITY_ATTRIBUTES
3f00: 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52  , \.        DWOR
3f10: 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 4c 50  D,DWORD,DWORD,LP
3f20: 43 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b  CWSTR))aSyscall[
3f30: 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  7].pCurrent)..#i
3f40: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
3f50: 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  RT && defined(SQ
3f60: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57  LITE_WIN32_HAS_W
3f70: 49 44 45 29 0a 20 20 7b 20 22 43 72 65 61 74 65  IDE).  { "Create
3f80: 4d 75 74 65 78 57 22 2c 20 20 20 20 20 20 20 20  MutexW",        
3f90: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72 65      (SYSCALL)Cre
3fa0: 61 74 65 4d 75 74 65 78 57 2c 20 20 20 20 20 20  ateMutexW,      
3fb0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
3fc0: 0a 20 20 7b 20 22 43 72 65 61 74 65 4d 75 74 65  .  { "CreateMute
3fd0: 78 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  xW",            
3fe0: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
3ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4000: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
4010: 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65 4d  define osCreateM
4020: 75 74 65 78 57 20 28 28 48 41 4e 44 4c 45 28 57  utexW ((HANDLE(W
4030: 49 4e 41 50 49 2a 29 28 4c 50 53 45 43 55 52 49  INAPI*)(LPSECURI
4040: 54 59 5f 41 54 54 52 49 42 55 54 45 53 2c 42 4f  TY_ATTRIBUTES,BO
4050: 4f 4c 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  OL, \.        LP
4060: 43 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b  CWSTR))aSyscall[
4070: 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  8].pCurrent)..#i
4080: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
4090: 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29  _WIN32_HAS_ANSI)
40a0: 0a 20 20 7b 20 22 44 65 6c 65 74 65 46 69 6c 65  .  { "DeleteFile
40b0: 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  A",             
40c0: 28 53 59 53 43 41 4c 4c 29 44 65 6c 65 74 65 46  (SYSCALL)DeleteF
40d0: 69 6c 65 41 2c 20 20 20 20 20 20 20 20 20 20 20  ileA,           
40e0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
40f0: 20 22 44 65 6c 65 74 65 46 69 6c 65 41 22 2c 20   "DeleteFileA", 
4100: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
4110: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
4120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
4130: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
4140: 6e 65 20 6f 73 44 65 6c 65 74 65 46 69 6c 65 41  ne osDeleteFileA
4150: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
4160: 28 4c 50 43 53 54 52 29 29 61 53 79 73 63 61 6c  (LPCSTR))aSyscal
4170: 6c 5b 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  l[9].pCurrent)..
4180: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
4190: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
41a0: 45 29 0a 20 20 7b 20 22 44 65 6c 65 74 65 46 69  E).  { "DeleteFi
41b0: 6c 65 57 22 2c 20 20 20 20 20 20 20 20 20 20 20  leW",           
41c0: 20 20 28 53 59 53 43 41 4c 4c 29 44 65 6c 65 74    (SYSCALL)Delet
41d0: 65 46 69 6c 65 57 2c 20 20 20 20 20 20 20 20 20  eFileW,         
41e0: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
41f0: 20 7b 20 22 44 65 6c 65 74 65 46 69 6c 65 57 22   { "DeleteFileW"
4200: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ,             (S
4210: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
4220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4230: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
4240: 66 69 6e 65 20 6f 73 44 65 6c 65 74 65 46 69 6c  fine osDeleteFil
4250: 65 57 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  eW ((BOOL(WINAPI
4260: 2a 29 28 4c 50 43 57 53 54 52 29 29 61 53 79 73  *)(LPCWSTR))aSys
4270: 63 61 6c 6c 5b 31 30 5d 2e 70 43 75 72 72 65 6e  call[10].pCurren
4280: 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  t)..#if SQLITE_O
4290: 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 46 69 6c  S_WINCE.  { "Fil
42a0: 65 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65  eTimeToLocalFile
42b0: 54 69 6d 65 22 2c 20 28 53 59 53 43 41 4c 4c 29  Time", (SYSCALL)
42c0: 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63 61 6c 46  FileTimeToLocalF
42d0: 69 6c 65 54 69 6d 65 2c 20 30 20 7d 2c 0a 23 65  ileTime, 0 },.#e
42e0: 6c 73 65 0a 20 20 7b 20 22 46 69 6c 65 54 69 6d  lse.  { "FileTim
42f0: 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65  eToLocalFileTime
4300: 22 2c 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20  ", (SYSCALL)0,  
4310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4320: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
4330: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46 69 6c 65  ..#define osFile
4340: 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54  TimeToLocalFileT
4350: 69 6d 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  ime ((BOOL(WINAP
4360: 49 2a 29 28 43 4f 4e 53 54 20 46 49 4c 45 54 49  I*)(CONST FILETI
4370: 4d 45 2a 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c  ME*, \.        L
4380: 50 46 49 4c 45 54 49 4d 45 29 29 61 53 79 73 63  PFILETIME))aSysc
4390: 61 6c 6c 5b 31 31 5d 2e 70 43 75 72 72 65 6e 74  all[11].pCurrent
43a0: 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  )..#if SQLITE_OS
43b0: 5f 57 49 4e 43 45 0a 20 20 7b 20 22 46 69 6c 65  _WINCE.  { "File
43c0: 54 69 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d 65  TimeToSystemTime
43d0: 22 2c 20 20 20 20 28 53 59 53 43 41 4c 4c 29 46  ",    (SYSCALL)F
43e0: 69 6c 65 54 69 6d 65 54 6f 53 79 73 74 65 6d 54  ileTimeToSystemT
43f0: 69 6d 65 2c 20 20 20 20 30 20 7d 2c 0a 23 65 6c  ime,    0 },.#el
4400: 73 65 0a 20 20 7b 20 22 46 69 6c 65 54 69 6d 65  se.  { "FileTime
4410: 54 6f 53 79 73 74 65 6d 54 69 6d 65 22 2c 20 20  ToSystemTime",  
4420: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
4430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4440: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
4450: 0a 23 64 65 66 69 6e 65 20 6f 73 46 69 6c 65 54  .#define osFileT
4460: 69 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 20  imeToSystemTime 
4470: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
4480: 43 4f 4e 53 54 20 46 49 4c 45 54 49 4d 45 2a 2c  CONST FILETIME*,
4490: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 53 59 53   \.        LPSYS
44a0: 54 45 4d 54 49 4d 45 29 29 61 53 79 73 63 61 6c  TEMTIME))aSyscal
44b0: 6c 5b 31 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[12].pCurrent).
44c0: 0a 20 20 7b 20 22 46 6c 75 73 68 46 69 6c 65 42  .  { "FlushFileB
44d0: 75 66 66 65 72 73 22 2c 20 20 20 20 20 20 20 20  uffers",        
44e0: 28 53 59 53 43 41 4c 4c 29 46 6c 75 73 68 46 69  (SYSCALL)FlushFi
44f0: 6c 65 42 75 66 66 65 72 73 2c 20 20 20 20 20 20  leBuffers,      
4500: 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20    0 },..#define 
4510: 6f 73 46 6c 75 73 68 46 69 6c 65 42 75 66 66 65  osFlushFileBuffe
4520: 72 73 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  rs ((BOOL(WINAPI
4530: 2a 29 28 48 41 4e 44 4c 45 29 29 61 53 79 73 63  *)(HANDLE))aSysc
4540: 61 6c 6c 5b 31 33 5d 2e 70 43 75 72 72 65 6e 74  all[13].pCurrent
4550: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  )..#if defined(S
4560: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
4570: 41 4e 53 49 29 0a 20 20 7b 20 22 46 6f 72 6d 61  ANSI).  { "Forma
4580: 74 4d 65 73 73 61 67 65 41 22 2c 20 20 20 20 20  tMessageA",     
4590: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 46 6f       (SYSCALL)Fo
45a0: 72 6d 61 74 4d 65 73 73 61 67 65 41 2c 20 20 20  rmatMessageA,   
45b0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
45c0: 65 0a 20 20 7b 20 22 46 6f 72 6d 61 74 4d 65 73  e.  { "FormatMes
45d0: 73 61 67 65 41 22 2c 20 20 20 20 20 20 20 20 20  sageA",         
45e0: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
45f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4600: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
4610: 23 64 65 66 69 6e 65 20 6f 73 46 6f 72 6d 61 74  #define osFormat
4620: 4d 65 73 73 61 67 65 41 20 28 28 44 57 4f 52 44  MessageA ((DWORD
4630: 28 57 49 4e 41 50 49 2a 29 28 44 57 4f 52 44 2c  (WINAPI*)(DWORD,
4640: 4c 50 43 56 4f 49 44 2c 44 57 4f 52 44 2c 44 57  LPCVOID,DWORD,DW
4650: 4f 52 44 2c 4c 50 53 54 52 2c 20 5c 0a 20 20 20  ORD,LPSTR, \.   
4660: 20 20 20 20 20 44 57 4f 52 44 2c 76 61 5f 6c 69       DWORD,va_li
4670: 73 74 2a 29 29 61 53 79 73 63 61 6c 6c 5b 31 34  st*))aSyscall[14
4680: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
4690: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
46a0: 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a  WIN32_HAS_WIDE).
46b0: 20 20 7b 20 22 46 6f 72 6d 61 74 4d 65 73 73 61    { "FormatMessa
46c0: 67 65 57 22 2c 20 20 20 20 20 20 20 20 20 20 28  geW",          (
46d0: 53 59 53 43 41 4c 4c 29 46 6f 72 6d 61 74 4d 65  SYSCALL)FormatMe
46e0: 73 73 61 67 65 57 2c 20 20 20 20 20 20 20 20 20  ssageW,         
46f0: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
4700: 22 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 57 22  "FormatMessageW"
4710: 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43  ,          (SYSC
4720: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
4730: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
4740: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
4750: 65 20 6f 73 46 6f 72 6d 61 74 4d 65 73 73 61 67  e osFormatMessag
4760: 65 57 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50  eW ((DWORD(WINAP
4770: 49 2a 29 28 44 57 4f 52 44 2c 4c 50 43 56 4f 49  I*)(DWORD,LPCVOI
4780: 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 4c 50  D,DWORD,DWORD,LP
4790: 57 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20  WSTR, \.        
47a0: 44 57 4f 52 44 2c 76 61 5f 6c 69 73 74 2a 29 29  DWORD,va_list*))
47b0: 61 53 79 73 63 61 6c 6c 5b 31 35 5d 2e 70 43 75  aSyscall[15].pCu
47c0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 64 65 66  rrent)..#if !def
47d0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
47e0: 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 29  _LOAD_EXTENSION)
47f0: 0a 20 20 7b 20 22 46 72 65 65 4c 69 62 72 61 72  .  { "FreeLibrar
4800: 79 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  y",             
4810: 28 53 59 53 43 41 4c 4c 29 46 72 65 65 4c 69 62  (SYSCALL)FreeLib
4820: 72 61 72 79 2c 20 20 20 20 20 20 20 20 20 20 20  rary,           
4830: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
4840: 20 22 46 72 65 65 4c 69 62 72 61 72 79 22 2c 20   "FreeLibrary", 
4850: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
4860: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
4870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
4880: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
4890: 6e 65 20 6f 73 46 72 65 65 4c 69 62 72 61 72 79  ne osFreeLibrary
48a0: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
48b0: 28 48 4d 4f 44 55 4c 45 29 29 61 53 79 73 63 61  (HMODULE))aSysca
48c0: 6c 6c 5b 31 36 5d 2e 70 43 75 72 72 65 6e 74 29  ll[16].pCurrent)
48d0: 0a 0a 20 20 7b 20 22 47 65 74 43 75 72 72 65 6e  ..  { "GetCurren
48e0: 74 50 72 6f 63 65 73 73 49 64 22 2c 20 20 20 20  tProcessId",    
48f0: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 43 75 72   (SYSCALL)GetCur
4900: 72 65 6e 74 50 72 6f 63 65 73 73 49 64 2c 20 20  rentProcessId,  
4910: 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65     0 },..#define
4920: 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
4930: 63 65 73 73 49 64 20 28 28 44 57 4f 52 44 28 57  cessId ((DWORD(W
4940: 49 4e 41 50 49 2a 29 28 56 4f 49 44 29 29 61 53  INAPI*)(VOID))aS
4950: 79 73 63 61 6c 6c 5b 31 37 5d 2e 70 43 75 72 72  yscall[17].pCurr
4960: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
4970: 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 64 65  E_OS_WINCE && de
4980: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
4990: 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b  32_HAS_ANSI).  {
49a0: 20 22 47 65 74 44 69 73 6b 46 72 65 65 53 70 61   "GetDiskFreeSpa
49b0: 63 65 41 22 2c 20 20 20 20 20 20 20 28 53 59 53  ceA",       (SYS
49c0: 43 41 4c 4c 29 47 65 74 44 69 73 6b 46 72 65 65  CALL)GetDiskFree
49d0: 53 70 61 63 65 41 2c 20 20 20 20 20 20 20 30 20  SpaceA,       0 
49e0: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65  },.#else.  { "Ge
49f0: 74 44 69 73 6b 46 72 65 65 53 70 61 63 65 41 22  tDiskFreeSpaceA"
4a00: 2c 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c  ,       (SYSCALL
4a10: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
4a20: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
4a30: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
4a40: 73 47 65 74 44 69 73 6b 46 72 65 65 53 70 61 63  sGetDiskFreeSpac
4a50: 65 41 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  eA ((BOOL(WINAPI
4a60: 2a 29 28 4c 50 43 53 54 52 2c 4c 50 44 57 4f 52  *)(LPCSTR,LPDWOR
4a70: 44 2c 4c 50 44 57 4f 52 44 2c 4c 50 44 57 4f 52  D,LPDWORD,LPDWOR
4a80: 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 44  D, \.        LPD
4a90: 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 31  WORD))aSyscall[1
4aa0: 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  8].pCurrent)..#i
4ab0: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
4ac0: 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53  CE && !SQLITE_OS
4ad0: 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65  _WINRT && define
4ae0: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
4af0: 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 47 65  AS_WIDE).  { "Ge
4b00: 74 44 69 73 6b 46 72 65 65 53 70 61 63 65 57 22  tDiskFreeSpaceW"
4b10: 2c 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c  ,       (SYSCALL
4b20: 29 47 65 74 44 69 73 6b 46 72 65 65 53 70 61 63  )GetDiskFreeSpac
4b30: 65 57 2c 20 20 20 20 20 20 20 30 20 7d 2c 0a 23  eW,       0 },.#
4b40: 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 44 69 73  else.  { "GetDis
4b50: 6b 46 72 65 65 53 70 61 63 65 57 22 2c 20 20 20  kFreeSpaceW",   
4b60: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
4b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b80: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
4b90: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  f..#define osGet
4ba0: 44 69 73 6b 46 72 65 65 53 70 61 63 65 57 20 28  DiskFreeSpaceW (
4bb0: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c  (BOOL(WINAPI*)(L
4bc0: 50 43 57 53 54 52 2c 4c 50 44 57 4f 52 44 2c 4c  PCWSTR,LPDWORD,L
4bd0: 50 44 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 20  PDWORD,LPDWORD, 
4be0: 5c 0a 20 20 20 20 20 20 20 20 4c 50 44 57 4f 52  \.        LPDWOR
4bf0: 44 29 29 61 53 79 73 63 61 6c 6c 5b 31 39 5d 2e  D))aSyscall[19].
4c00: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64  pCurrent)..#if d
4c10: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
4c20: 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20  N32_HAS_ANSI).  
4c30: 7b 20 22 47 65 74 46 69 6c 65 41 74 74 72 69 62  { "GetFileAttrib
4c40: 75 74 65 73 41 22 2c 20 20 20 20 20 20 28 53 59  utesA",      (SY
4c50: 53 43 41 4c 4c 29 47 65 74 46 69 6c 65 41 74 74  SCALL)GetFileAtt
4c60: 72 69 62 75 74 65 73 41 2c 20 20 20 20 20 20 30  ributesA,      0
4c70: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47   },.#else.  { "G
4c80: 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
4c90: 41 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c  A",      (SYSCAL
4ca0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
4cb0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
4cc0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
4cd0: 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75  osGetFileAttribu
4ce0: 74 65 73 41 20 28 28 44 57 4f 52 44 28 57 49 4e  tesA ((DWORD(WIN
4cf0: 41 50 49 2a 29 28 4c 50 43 53 54 52 29 29 61 53  API*)(LPCSTR))aS
4d00: 79 73 63 61 6c 6c 5b 32 30 5d 2e 70 43 75 72 72  yscall[20].pCurr
4d10: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
4d20: 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65  E_OS_WINRT && de
4d30: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
4d40: 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b  32_HAS_WIDE).  {
4d50: 20 22 47 65 74 46 69 6c 65 41 74 74 72 69 62 75   "GetFileAttribu
4d60: 74 65 73 57 22 2c 20 20 20 20 20 20 28 53 59 53  tesW",      (SYS
4d70: 43 41 4c 4c 29 47 65 74 46 69 6c 65 41 74 74 72  CALL)GetFileAttr
4d80: 69 62 75 74 65 73 57 2c 20 20 20 20 20 20 30 20  ibutesW,      0 
4d90: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65  },.#else.  { "Ge
4da0: 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 57  tFileAttributesW
4db0: 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c  ",      (SYSCALL
4dc0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
4dd0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
4de0: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
4df0: 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74  sGetFileAttribut
4e00: 65 73 57 20 28 28 44 57 4f 52 44 28 57 49 4e 41  esW ((DWORD(WINA
4e10: 50 49 2a 29 28 4c 50 43 57 53 54 52 29 29 61 53  PI*)(LPCWSTR))aS
4e20: 79 73 63 61 6c 6c 5b 32 31 5d 2e 70 43 75 72 72  yscall[21].pCurr
4e30: 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65  ent)..#if define
4e40: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
4e50: 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 47 65  AS_WIDE).  { "Ge
4e60: 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 45  tFileAttributesE
4e70: 78 57 22 2c 20 20 20 20 28 53 59 53 43 41 4c 4c  xW",    (SYSCALL
4e80: 29 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74  )GetFileAttribut
4e90: 65 73 45 78 57 2c 20 20 20 20 30 20 7d 2c 0a 23  esExW,    0 },.#
4ea0: 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46 69 6c  else.  { "GetFil
4eb0: 65 41 74 74 72 69 62 75 74 65 73 45 78 57 22 2c  eAttributesExW",
4ec0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
4ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ee0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
4ef0: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  f..#define osGet
4f00: 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 45 78  FileAttributesEx
4f10: 57 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  W ((BOOL(WINAPI*
4f20: 29 28 4c 50 43 57 53 54 52 2c 47 45 54 5f 46 49  )(LPCWSTR,GET_FI
4f30: 4c 45 45 58 5f 49 4e 46 4f 5f 4c 45 56 45 4c 53  LEEX_INFO_LEVELS
4f40: 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 56 4f  , \.        LPVO
4f50: 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 32 32 5d  ID))aSyscall[22]
4f60: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
4f70: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
4f80: 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 53 69 7a  .  { "GetFileSiz
4f90: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
4fa0: 28 53 59 53 43 41 4c 4c 29 47 65 74 46 69 6c 65  (SYSCALL)GetFile
4fb0: 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20  Size,           
4fc0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
4fd0: 20 22 47 65 74 46 69 6c 65 53 69 7a 65 22 2c 20   "GetFileSize", 
4fe0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
4ff0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
5000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
5010: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
5020: 6e 65 20 6f 73 47 65 74 46 69 6c 65 53 69 7a 65  ne osGetFileSize
5030: 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a   ((DWORD(WINAPI*
5040: 29 28 48 41 4e 44 4c 45 2c 4c 50 44 57 4f 52 44  )(HANDLE,LPDWORD
5050: 29 29 61 53 79 73 63 61 6c 6c 5b 32 33 5d 2e 70  ))aSyscall[23].p
5060: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53  Current)..#if !S
5070: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26  QLITE_OS_WINCE &
5080: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
5090: 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29  _WIN32_HAS_ANSI)
50a0: 0a 20 20 7b 20 22 47 65 74 46 75 6c 6c 50 61 74  .  { "GetFullPat
50b0: 68 4e 61 6d 65 41 22 2c 20 20 20 20 20 20 20 20  hNameA",        
50c0: 28 53 59 53 43 41 4c 4c 29 47 65 74 46 75 6c 6c  (SYSCALL)GetFull
50d0: 50 61 74 68 4e 61 6d 65 41 2c 20 20 20 20 20 20  PathNameA,      
50e0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
50f0: 20 22 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d   "GetFullPathNam
5100: 65 41 22 2c 20 20 20 20 20 20 20 20 28 53 59 53  eA",        (SYS
5110: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
5120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
5130: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
5140: 6e 65 20 6f 73 47 65 74 46 75 6c 6c 50 61 74 68  ne osGetFullPath
5150: 4e 61 6d 65 41 20 28 28 44 57 4f 52 44 28 57 49  NameA ((DWORD(WI
5160: 4e 41 50 49 2a 29 28 4c 50 43 53 54 52 2c 44 57  NAPI*)(LPCSTR,DW
5170: 4f 52 44 2c 4c 50 53 54 52 2c 20 5c 0a 20 20 20  ORD,LPSTR, \.   
5180: 20 20 20 20 20 4c 50 53 54 52 2a 29 29 61 53 79       LPSTR*))aSy
5190: 73 63 61 6c 6c 5b 32 34 5d 2e 70 43 75 72 72 65  scall[24].pCurre
51a0: 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  nt)..#if !SQLITE
51b0: 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51  _OS_WINCE && !SQ
51c0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
51d0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
51e0: 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a  WIN32_HAS_WIDE).
51f0: 20 20 7b 20 22 47 65 74 46 75 6c 6c 50 61 74 68    { "GetFullPath
5200: 4e 61 6d 65 57 22 2c 20 20 20 20 20 20 20 20 28  NameW",        (
5210: 53 59 53 43 41 4c 4c 29 47 65 74 46 75 6c 6c 50  SYSCALL)GetFullP
5220: 61 74 68 4e 61 6d 65 57 2c 20 20 20 20 20 20 20  athNameW,       
5230: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
5240: 22 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65  "GetFullPathName
5250: 57 22 2c 20 20 20 20 20 20 20 20 28 53 59 53 43  W",        (SYSC
5260: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
5270: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
5280: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
5290: 65 20 6f 73 47 65 74 46 75 6c 6c 50 61 74 68 4e  e osGetFullPathN
52a0: 61 6d 65 57 20 28 28 44 57 4f 52 44 28 57 49 4e  ameW ((DWORD(WIN
52b0: 41 50 49 2a 29 28 4c 50 43 57 53 54 52 2c 44 57  API*)(LPCWSTR,DW
52c0: 4f 52 44 2c 4c 50 57 53 54 52 2c 20 5c 0a 20 20  ORD,LPWSTR, \.  
52d0: 20 20 20 20 20 20 4c 50 57 53 54 52 2a 29 29 61        LPWSTR*))a
52e0: 53 79 73 63 61 6c 6c 5b 32 35 5d 2e 70 43 75 72  Syscall[25].pCur
52f0: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 47 65 74 4c  rent)..  { "GetL
5300: 61 73 74 45 72 72 6f 72 22 2c 20 20 20 20 20 20  astError",      
5310: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47        (SYSCALL)G
5320: 65 74 4c 61 73 74 45 72 72 6f 72 2c 20 20 20 20  etLastError,    
5330: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64          0 },..#d
5340: 65 66 69 6e 65 20 6f 73 47 65 74 4c 61 73 74 45  efine osGetLastE
5350: 72 72 6f 72 20 28 28 44 57 4f 52 44 28 57 49 4e  rror ((DWORD(WIN
5360: 41 50 49 2a 29 28 56 4f 49 44 29 29 61 53 79 73  API*)(VOID))aSys
5370: 63 61 6c 6c 5b 32 36 5d 2e 70 43 75 72 72 65 6e  call[26].pCurren
5380: 74 29 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  t)..#if !defined
5390: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41  (SQLITE_OMIT_LOA
53a0: 44 5f 45 58 54 45 4e 53 49 4f 4e 29 0a 23 69 66  D_EXTENSION).#if
53b0: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
53c0: 0a 20 20 2f 2a 20 54 68 65 20 47 65 74 50 72 6f  .  /* The GetPro
53d0: 63 41 64 64 72 65 73 73 41 28 29 20 72 6f 75 74  cAddressA() rout
53e0: 69 6e 65 20 69 73 20 6f 6e 6c 79 20 61 76 61 69  ine is only avai
53f0: 6c 61 62 6c 65 20 6f 6e 20 57 69 6e 64 6f 77 73  lable on Windows
5400: 20 43 45 2e 20 2a 2f 0a 20 20 7b 20 22 47 65 74   CE. */.  { "Get
5410: 50 72 6f 63 41 64 64 72 65 73 73 41 22 2c 20 20  ProcAddressA",  
5420: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
5430: 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 41 2c  GetProcAddressA,
5440: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
5450: 6c 73 65 0a 20 20 2f 2a 20 41 6c 6c 20 6f 74 68  lse.  /* All oth
5460: 65 72 20 57 69 6e 64 6f 77 73 20 70 6c 61 74 66  er Windows platf
5470: 6f 72 6d 73 20 65 78 70 65 63 74 20 47 65 74 50  orms expect GetP
5480: 72 6f 63 41 64 64 72 65 73 73 28 29 20 74 6f 20  rocAddress() to 
5490: 74 61 6b 65 0a 20 20 2a 2a 20 61 6e 20 41 4e 53  take.  ** an ANS
54a0: 49 20 73 74 72 69 6e 67 20 72 65 67 61 72 64 6c  I string regardl
54b0: 65 73 73 20 6f 66 20 74 68 65 20 5f 55 4e 49 43  ess of the _UNIC
54c0: 4f 44 45 20 73 65 74 74 69 6e 67 20 2a 2f 0a 20  ODE setting */. 
54d0: 20 7b 20 22 47 65 74 50 72 6f 63 41 64 64 72 65   { "GetProcAddre
54e0: 73 73 41 22 2c 20 20 20 20 20 20 20 20 20 28 53  ssA",         (S
54f0: 59 53 43 41 4c 4c 29 47 65 74 50 72 6f 63 41 64  YSCALL)GetProcAd
5500: 64 72 65 73 73 2c 20 20 20 20 20 20 20 20 20 20  dress,          
5510: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 65 6c 73  0 },.#endif.#els
5520: 65 0a 20 20 7b 20 22 47 65 74 50 72 6f 63 41 64  e.  { "GetProcAd
5530: 64 72 65 73 73 41 22 2c 20 20 20 20 20 20 20 20  dressA",        
5540: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
5550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5560: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
5570: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 50 72 6f  #define osGetPro
5580: 63 41 64 64 72 65 73 73 41 20 28 28 46 41 52 50  cAddressA ((FARP
5590: 52 4f 43 28 57 49 4e 41 50 49 2a 29 28 48 4d 4f  ROC(WINAPI*)(HMO
55a0: 44 55 4c 45 2c 20 5c 0a 20 20 20 20 20 20 20 20  DULE, \.        
55b0: 4c 50 43 53 54 52 29 29 61 53 79 73 63 61 6c 6c  LPCSTR))aSyscall
55c0: 5b 32 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [27].pCurrent)..
55d0: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
55e0: 49 4e 52 54 0a 20 20 7b 20 22 47 65 74 53 79 73  INRT.  { "GetSys
55f0: 74 65 6d 49 6e 66 6f 22 2c 20 20 20 20 20 20 20  temInfo",       
5600: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74      (SYSCALL)Get
5610: 53 79 73 74 65 6d 49 6e 66 6f 2c 20 20 20 20 20  SystemInfo,     
5620: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
5630: 0a 20 20 7b 20 22 47 65 74 53 79 73 74 65 6d 49  .  { "GetSystemI
5640: 6e 66 6f 22 2c 20 20 20 20 20 20 20 20 20 20 20  nfo",           
5650: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
5660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5670: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
5680: 64 65 66 69 6e 65 20 6f 73 47 65 74 53 79 73 74  define osGetSyst
5690: 65 6d 49 6e 66 6f 20 28 28 56 4f 49 44 28 57 49  emInfo ((VOID(WI
56a0: 4e 41 50 49 2a 29 28 4c 50 53 59 53 54 45 4d 5f  NAPI*)(LPSYSTEM_
56b0: 49 4e 46 4f 29 29 61 53 79 73 63 61 6c 6c 5b 32  INFO))aSyscall[2
56c0: 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  8].pCurrent)..  
56d0: 7b 20 22 47 65 74 53 79 73 74 65 6d 54 69 6d 65  { "GetSystemTime
56e0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ",           (SY
56f0: 53 43 41 4c 4c 29 47 65 74 53 79 73 74 65 6d 54  SCALL)GetSystemT
5700: 69 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20 30  ime,           0
5710: 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47   },..#define osG
5720: 65 74 53 79 73 74 65 6d 54 69 6d 65 20 28 28 56  etSystemTime ((V
5730: 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 4c 50 53  OID(WINAPI*)(LPS
5740: 59 53 54 45 4d 54 49 4d 45 29 29 61 53 79 73 63  YSTEMTIME))aSysc
5750: 61 6c 6c 5b 32 39 5d 2e 70 43 75 72 72 65 6e 74  all[29].pCurrent
5760: 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  )..#if !SQLITE_O
5770: 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 47 65 74  S_WINCE.  { "Get
5780: 53 79 73 74 65 6d 54 69 6d 65 41 73 46 69 6c 65  SystemTimeAsFile
5790: 54 69 6d 65 22 2c 20 28 53 59 53 43 41 4c 4c 29  Time", (SYSCALL)
57a0: 47 65 74 53 79 73 74 65 6d 54 69 6d 65 41 73 46  GetSystemTimeAsF
57b0: 69 6c 65 54 69 6d 65 2c 20 30 20 7d 2c 0a 23 65  ileTime, 0 },.#e
57c0: 6c 73 65 0a 20 20 7b 20 22 47 65 74 53 79 73 74  lse.  { "GetSyst
57d0: 65 6d 54 69 6d 65 41 73 46 69 6c 65 54 69 6d 65  emTimeAsFileTime
57e0: 22 2c 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20  ", (SYSCALL)0,  
57f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5800: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
5810: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 53  ..#define osGetS
5820: 79 73 74 65 6d 54 69 6d 65 41 73 46 69 6c 65 54  ystemTimeAsFileT
5830: 69 6d 65 20 28 28 56 4f 49 44 28 57 49 4e 41 50  ime ((VOID(WINAP
5840: 49 2a 29 28 20 5c 0a 20 20 20 20 20 20 20 20 4c  I*)( \.        L
5850: 50 46 49 4c 45 54 49 4d 45 29 29 61 53 79 73 63  PFILETIME))aSysc
5860: 61 6c 6c 5b 33 30 5d 2e 70 43 75 72 72 65 6e 74  all[30].pCurrent
5870: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  )..#if defined(S
5880: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
5890: 41 4e 53 49 29 0a 20 20 7b 20 22 47 65 74 54 65  ANSI).  { "GetTe
58a0: 6d 70 50 61 74 68 41 22 2c 20 20 20 20 20 20 20  mpPathA",       
58b0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65       (SYSCALL)Ge
58c0: 74 54 65 6d 70 50 61 74 68 41 2c 20 20 20 20 20  tTempPathA,     
58d0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
58e0: 65 0a 20 20 7b 20 22 47 65 74 54 65 6d 70 50 61  e.  { "GetTempPa
58f0: 74 68 41 22 2c 20 20 20 20 20 20 20 20 20 20 20  thA",           
5900: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
5910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5920: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
5930: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 54 65 6d  #define osGetTem
5940: 70 50 61 74 68 41 20 28 28 44 57 4f 52 44 28 57  pPathA ((DWORD(W
5950: 49 4e 41 50 49 2a 29 28 44 57 4f 52 44 2c 4c 50  INAPI*)(DWORD,LP
5960: 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 33 31  STR))aSyscall[31
5970: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
5980: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
5990: 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  T && defined(SQL
59a0: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
59b0: 44 45 29 0a 20 20 7b 20 22 47 65 74 54 65 6d 70  DE).  { "GetTemp
59c0: 50 61 74 68 57 22 2c 20 20 20 20 20 20 20 20 20  PathW",         
59d0: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 54     (SYSCALL)GetT
59e0: 65 6d 70 50 61 74 68 57 2c 20 20 20 20 20 20 20  empPathW,       
59f0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
5a00: 20 20 7b 20 22 47 65 74 54 65 6d 70 50 61 74 68    { "GetTempPath
5a10: 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28  W",            (
5a20: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
5a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a40: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
5a50: 65 66 69 6e 65 20 6f 73 47 65 74 54 65 6d 70 50  efine osGetTempP
5a60: 61 74 68 57 20 28 28 44 57 4f 52 44 28 57 49 4e  athW ((DWORD(WIN
5a70: 41 50 49 2a 29 28 44 57 4f 52 44 2c 4c 50 57 53  API*)(DWORD,LPWS
5a80: 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 33 32 5d  TR))aSyscall[32]
5a90: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
5aa0: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
5ab0: 0a 20 20 7b 20 22 47 65 74 54 69 63 6b 43 6f 75  .  { "GetTickCou
5ac0: 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  nt",            
5ad0: 28 53 59 53 43 41 4c 4c 29 47 65 74 54 69 63 6b  (SYSCALL)GetTick
5ae0: 43 6f 75 6e 74 2c 20 20 20 20 20 20 20 20 20 20  Count,          
5af0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
5b00: 20 22 47 65 74 54 69 63 6b 43 6f 75 6e 74 22 2c   "GetTickCount",
5b10: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
5b20: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
5b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
5b40: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
5b50: 6e 65 20 6f 73 47 65 74 54 69 63 6b 43 6f 75 6e  ne osGetTickCoun
5b60: 74 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49  t ((DWORD(WINAPI
5b70: 2a 29 28 56 4f 49 44 29 29 61 53 79 73 63 61 6c  *)(VOID))aSyscal
5b80: 6c 5b 33 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[33].pCurrent).
5b90: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
5ba0: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
5bb0: 53 49 29 20 26 26 20 64 65 66 69 6e 65 64 28 53  SI) && defined(S
5bc0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 47 45 54 56  QLITE_WIN32_GETV
5bd0: 45 52 53 49 4f 4e 45 58 29 20 26 26 20 5c 0a 20  ERSIONEX) && \. 
5be0: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 57 49         SQLITE_WI
5bf0: 4e 33 32 5f 47 45 54 56 45 52 53 49 4f 4e 45 58  N32_GETVERSIONEX
5c00: 0a 20 20 7b 20 22 47 65 74 56 65 72 73 69 6f 6e  .  { "GetVersion
5c10: 45 78 41 22 2c 20 20 20 20 20 20 20 20 20 20 20  ExA",           
5c20: 28 53 59 53 43 41 4c 4c 29 47 65 74 56 65 72 73  (SYSCALL)GetVers
5c30: 69 6f 6e 45 78 41 2c 20 20 20 20 20 20 20 20 20  ionExA,         
5c40: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
5c50: 20 22 47 65 74 56 65 72 73 69 6f 6e 45 78 41 22   "GetVersionExA"
5c60: 2c 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53  ,           (SYS
5c70: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
5c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
5c90: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
5ca0: 6e 65 20 6f 73 47 65 74 56 65 72 73 69 6f 6e 45  ne osGetVersionE
5cb0: 78 41 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  xA ((BOOL(WINAPI
5cc0: 2a 29 28 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  *)( \.        LP
5cd0: 4f 53 56 45 52 53 49 4f 4e 49 4e 46 4f 41 29 29  OSVERSIONINFOA))
5ce0: 61 53 79 73 63 61 6c 6c 5b 33 34 5d 2e 70 43 75  aSyscall[34].pCu
5cf0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c  rrent)..#if !SQL
5d00: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20  ITE_OS_WINRT && 
5d10: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
5d20: 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 20 26  IN32_HAS_WIDE) &
5d30: 26 20 5c 0a 20 20 20 20 20 20 20 20 64 65 66 69  & \.        defi
5d40: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
5d50: 5f 47 45 54 56 45 52 53 49 4f 4e 45 58 29 20 26  _GETVERSIONEX) &
5d60: 26 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 47  & SQLITE_WIN32_G
5d70: 45 54 56 45 52 53 49 4f 4e 45 58 0a 20 20 7b 20  ETVERSIONEX.  { 
5d80: 22 47 65 74 56 65 72 73 69 6f 6e 45 78 57 22 2c  "GetVersionExW",
5d90: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
5da0: 41 4c 4c 29 47 65 74 56 65 72 73 69 6f 6e 45 78  ALL)GetVersionEx
5db0: 57 2c 20 20 20 20 20 20 20 20 20 20 20 30 20 7d  W,           0 }
5dc0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74  ,.#else.  { "Get
5dd0: 56 65 72 73 69 6f 6e 45 78 57 22 2c 20 20 20 20  VersionExW",    
5de0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
5df0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
5e00: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
5e10: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
5e20: 47 65 74 56 65 72 73 69 6f 6e 45 78 57 20 28 28  GetVersionExW ((
5e30: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 20 5c  BOOL(WINAPI*)( \
5e40: 0a 20 20 20 20 20 20 20 20 4c 50 4f 53 56 45 52  .        LPOSVER
5e50: 53 49 4f 4e 49 4e 46 4f 57 29 29 61 53 79 73 63  SIONINFOW))aSysc
5e60: 61 6c 6c 5b 33 35 5d 2e 70 43 75 72 72 65 6e 74  all[35].pCurrent
5e70: 29 0a 0a 20 20 7b 20 22 48 65 61 70 41 6c 6c 6f  )..  { "HeapAllo
5e80: 63 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  c",             
5e90: 20 20 28 53 59 53 43 41 4c 4c 29 48 65 61 70 41    (SYSCALL)HeapA
5ea0: 6c 6c 6f 63 2c 20 20 20 20 20 20 20 20 20 20 20  lloc,           
5eb0: 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e      0 },..#defin
5ec0: 65 20 6f 73 48 65 61 70 41 6c 6c 6f 63 20 28 28  e osHeapAlloc ((
5ed0: 4c 50 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28  LPVOID(WINAPI*)(
5ee0: 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 20 5c 0a  HANDLE,DWORD, \.
5ef0: 20 20 20 20 20 20 20 20 53 49 5a 45 5f 54 29 29          SIZE_T))
5f00: 61 53 79 73 63 61 6c 6c 5b 33 36 5d 2e 70 43 75  aSyscall[36].pCu
5f10: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c  rrent)..#if !SQL
5f20: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b  ITE_OS_WINRT.  {
5f30: 20 22 48 65 61 70 43 72 65 61 74 65 22 2c 20 20   "HeapCreate",  
5f40: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
5f50: 43 41 4c 4c 29 48 65 61 70 43 72 65 61 74 65 2c  CALL)HeapCreate,
5f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
5f70: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 48 65  },.#else.  { "He
5f80: 61 70 43 72 65 61 74 65 22 2c 20 20 20 20 20 20  apCreate",      
5f90: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
5fa0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
5fb0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
5fc0: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
5fd0: 73 48 65 61 70 43 72 65 61 74 65 20 28 28 48 41  sHeapCreate ((HA
5fe0: 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 44 57  NDLE(WINAPI*)(DW
5ff0: 4f 52 44 2c 53 49 5a 45 5f 54 2c 20 5c 0a 20 20  ORD,SIZE_T, \.  
6000: 20 20 20 20 20 20 53 49 5a 45 5f 54 29 29 61 53        SIZE_T))aS
6010: 79 73 63 61 6c 6c 5b 33 37 5d 2e 70 43 75 72 72  yscall[37].pCurr
6020: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
6030: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22  E_OS_WINRT.  { "
6040: 48 65 61 70 44 65 73 74 72 6f 79 22 2c 20 20 20  HeapDestroy",   
6050: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
6060: 4c 4c 29 48 65 61 70 44 65 73 74 72 6f 79 2c 20  LL)HeapDestroy, 
6070: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
6080: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 48 65 61 70  .#else.  { "Heap
6090: 44 65 73 74 72 6f 79 22 2c 20 20 20 20 20 20 20  Destroy",       
60a0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
60b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
60c0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
60d0: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48  dif..#define osH
60e0: 65 61 70 44 65 73 74 72 6f 79 20 28 28 42 4f 4f  eapDestroy ((BOO
60f0: 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  L(WINAPI*)(HANDL
6100: 45 29 29 61 53 79 73 63 61 6c 6c 5b 33 38 5d 2e  E))aSyscall[38].
6110: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
6120: 48 65 61 70 46 72 65 65 22 2c 20 20 20 20 20 20  HeapFree",      
6130: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
6140: 4c 4c 29 48 65 61 70 46 72 65 65 2c 20 20 20 20  LL)HeapFree,    
6150: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
6160: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 61 70  ..#define osHeap
6170: 46 72 65 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41  Free ((BOOL(WINA
6180: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52  PI*)(HANDLE,DWOR
6190: 44 2c 4c 50 56 4f 49 44 29 29 61 53 79 73 63 61  D,LPVOID))aSysca
61a0: 6c 6c 5b 33 39 5d 2e 70 43 75 72 72 65 6e 74 29  ll[39].pCurrent)
61b0: 0a 0a 20 20 7b 20 22 48 65 61 70 52 65 41 6c 6c  ..  { "HeapReAll
61c0: 6f 63 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  oc",            
61d0: 20 28 53 59 53 43 41 4c 4c 29 48 65 61 70 52 65   (SYSCALL)HeapRe
61e0: 41 6c 6c 6f 63 2c 20 20 20 20 20 20 20 20 20 20  Alloc,          
61f0: 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65     0 },..#define
6200: 20 6f 73 48 65 61 70 52 65 41 6c 6c 6f 63 20 28   osHeapReAlloc (
6210: 28 4c 50 56 4f 49 44 28 57 49 4e 41 50 49 2a 29  (LPVOID(WINAPI*)
6220: 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 4c 50  (HANDLE,DWORD,LP
6230: 56 4f 49 44 2c 20 5c 0a 20 20 20 20 20 20 20 20  VOID, \.        
6240: 53 49 5a 45 5f 54 29 29 61 53 79 73 63 61 6c 6c  SIZE_T))aSyscall
6250: 5b 34 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [40].pCurrent)..
6260: 20 20 7b 20 22 48 65 61 70 53 69 7a 65 22 2c 20    { "HeapSize", 
6270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
6280: 53 59 53 43 41 4c 4c 29 48 65 61 70 53 69 7a 65  SYSCALL)HeapSize
6290: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
62a0: 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f   0 },..#define o
62b0: 73 48 65 61 70 53 69 7a 65 20 28 28 53 49 5a 45  sHeapSize ((SIZE
62c0: 5f 54 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44  _T(WINAPI*)(HAND
62d0: 4c 45 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20  LE,DWORD, \.    
62e0: 20 20 20 20 4c 50 43 56 4f 49 44 29 29 61 53 79      LPCVOID))aSy
62f0: 73 63 61 6c 6c 5b 34 31 5d 2e 70 43 75 72 72 65  scall[41].pCurre
6300: 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  nt)..#if !SQLITE
6310: 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 48  _OS_WINRT.  { "H
6320: 65 61 70 56 61 6c 69 64 61 74 65 22 2c 20 20 20  eapValidate",   
6330: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
6340: 4c 29 48 65 61 70 56 61 6c 69 64 61 74 65 2c 20  L)HeapValidate, 
6350: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
6360: 23 65 6c 73 65 0a 20 20 7b 20 22 48 65 61 70 56  #else.  { "HeapV
6370: 61 6c 69 64 61 74 65 22 2c 20 20 20 20 20 20 20  alidate",       
6380: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
6390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
63a0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
63b0: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65  if..#define osHe
63c0: 61 70 56 61 6c 69 64 61 74 65 20 28 28 42 4f 4f  apValidate ((BOO
63d0: 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  L(WINAPI*)(HANDL
63e0: 45 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20  E,DWORD, \.     
63f0: 20 20 20 4c 50 43 56 4f 49 44 29 29 61 53 79 73     LPCVOID))aSys
6400: 63 61 6c 6c 5b 34 32 5d 2e 70 43 75 72 72 65 6e  call[42].pCurren
6410: 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  t)..#if !SQLITE_
6420: 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c  OS_WINCE && !SQL
6430: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b  ITE_OS_WINRT.  {
6440: 20 22 48 65 61 70 43 6f 6d 70 61 63 74 22 2c 20   "HeapCompact", 
6450: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
6460: 43 41 4c 4c 29 48 65 61 70 43 6f 6d 70 61 63 74  CALL)HeapCompact
6470: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20  ,             0 
6480: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 48 65  },.#else.  { "He
6490: 61 70 43 6f 6d 70 61 63 74 22 2c 20 20 20 20 20  apCompact",     
64a0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
64b0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
64c0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
64d0: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
64e0: 73 48 65 61 70 43 6f 6d 70 61 63 74 20 28 28 55  sHeapCompact ((U
64f0: 49 4e 54 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  INT(WINAPI*)(HAN
6500: 44 4c 45 2c 44 57 4f 52 44 29 29 61 53 79 73 63  DLE,DWORD))aSysc
6510: 61 6c 6c 5b 34 33 5d 2e 70 43 75 72 72 65 6e 74  all[43].pCurrent
6520: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  )..#if defined(S
6530: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
6540: 41 4e 53 49 29 20 26 26 20 21 64 65 66 69 6e 65  ANSI) && !define
6550: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f  d(SQLITE_OMIT_LO
6560: 41 44 5f 45 58 54 45 4e 53 49 4f 4e 29 0a 20 20  AD_EXTENSION).  
6570: 7b 20 22 4c 6f 61 64 4c 69 62 72 61 72 79 41 22  { "LoadLibraryA"
6580: 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ,            (SY
6590: 53 43 41 4c 4c 29 4c 6f 61 64 4c 69 62 72 61 72  SCALL)LoadLibrar
65a0: 79 41 2c 20 20 20 20 20 20 20 20 20 20 20 20 30  yA,            0
65b0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4c   },.#else.  { "L
65c0: 6f 61 64 4c 69 62 72 61 72 79 41 22 2c 20 20 20  oadLibraryA",   
65d0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
65e0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
65f0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
6600: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
6610: 6f 73 4c 6f 61 64 4c 69 62 72 61 72 79 41 20 28  osLoadLibraryA (
6620: 28 48 4d 4f 44 55 4c 45 28 57 49 4e 41 50 49 2a  (HMODULE(WINAPI*
6630: 29 28 4c 50 43 53 54 52 29 29 61 53 79 73 63 61  )(LPCSTR))aSysca
6640: 6c 6c 5b 34 34 5d 2e 70 43 75 72 72 65 6e 74 29  ll[44].pCurrent)
6650: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
6660: 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65  _WINRT && define
6670: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
6680: 41 53 5f 57 49 44 45 29 20 26 26 20 5c 0a 20 20  AS_WIDE) && \.  
6690: 20 20 20 20 20 20 21 64 65 66 69 6e 65 64 28 53        !defined(S
66a0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f  QLITE_OMIT_LOAD_
66b0: 45 58 54 45 4e 53 49 4f 4e 29 0a 20 20 7b 20 22  EXTENSION).  { "
66c0: 4c 6f 61 64 4c 69 62 72 61 72 79 57 22 2c 20 20  LoadLibraryW",  
66d0: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
66e0: 4c 4c 29 4c 6f 61 64 4c 69 62 72 61 72 79 57 2c  LL)LoadLibraryW,
66f0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
6700: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 61 64  .#else.  { "Load
6710: 4c 69 62 72 61 72 79 57 22 2c 20 20 20 20 20 20  LibraryW",      
6720: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
6730: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
6740: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
6750: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4c  dif..#define osL
6760: 6f 61 64 4c 69 62 72 61 72 79 57 20 28 28 48 4d  oadLibraryW ((HM
6770: 4f 44 55 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c  ODULE(WINAPI*)(L
6780: 50 43 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c  PCWSTR))aSyscall
6790: 5b 34 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [45].pCurrent)..
67a0: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
67b0: 49 4e 52 54 0a 20 20 7b 20 22 4c 6f 63 61 6c 46  INRT.  { "LocalF
67c0: 72 65 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ree",           
67d0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f 63      (SYSCALL)Loc
67e0: 61 6c 46 72 65 65 2c 20 20 20 20 20 20 20 20 20  alFree,         
67f0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
6800: 0a 20 20 7b 20 22 4c 6f 63 61 6c 46 72 65 65 22  .  { "LocalFree"
6810: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
6820: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
6830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6840: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
6850: 64 65 66 69 6e 65 20 6f 73 4c 6f 63 61 6c 46 72  define osLocalFr
6860: 65 65 20 28 28 48 4c 4f 43 41 4c 28 57 49 4e 41  ee ((HLOCAL(WINA
6870: 50 49 2a 29 28 48 4c 4f 43 41 4c 29 29 61 53 79  PI*)(HLOCAL))aSy
6880: 73 63 61 6c 6c 5b 34 36 5d 2e 70 43 75 72 72 65  scall[46].pCurre
6890: 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  nt)..#if !SQLITE
68a0: 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51  _OS_WINCE && !SQ
68b0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
68c0: 7b 20 22 4c 6f 63 6b 46 69 6c 65 22 2c 20 20 20  { "LockFile",   
68d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
68e0: 53 43 41 4c 4c 29 4c 6f 63 6b 46 69 6c 65 2c 20  SCALL)LockFile, 
68f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
6900: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4c   },.#else.  { "L
6910: 6f 63 6b 46 69 6c 65 22 2c 20 20 20 20 20 20 20  ockFile",       
6920: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
6930: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
6940: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
6950: 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
6960: 6f 73 4c 6f 63 6b 46 69 6c 65 0a 23 64 65 66 69  osLockFile.#defi
6970: 6e 65 20 6f 73 4c 6f 63 6b 46 69 6c 65 20 28 28  ne osLockFile ((
6980: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41  BOOL(WINAPI*)(HA
6990: 4e 44 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44  NDLE,DWORD,DWORD
69a0: 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20  ,DWORD, \.      
69b0: 20 20 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c    DWORD))aSyscal
69c0: 6c 5b 34 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[47].pCurrent).
69d0: 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 53 51 4c  #endif..#if !SQL
69e0: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 7b  ITE_OS_WINCE.  {
69f0: 20 22 4c 6f 63 6b 46 69 6c 65 45 78 22 2c 20 20   "LockFileEx",  
6a00: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
6a10: 43 41 4c 4c 29 4c 6f 63 6b 46 69 6c 65 45 78 2c  CALL)LockFileEx,
6a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
6a30: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f  },.#else.  { "Lo
6a40: 63 6b 46 69 6c 65 45 78 22 2c 20 20 20 20 20 20  ckFileEx",      
6a50: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
6a60: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
6a70: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
6a80: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 6f  endif..#ifndef o
6a90: 73 4c 6f 63 6b 46 69 6c 65 45 78 0a 23 64 65 66  sLockFileEx.#def
6aa0: 69 6e 65 20 6f 73 4c 6f 63 6b 46 69 6c 65 45 78  ine osLockFileEx
6ab0: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
6ac0: 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 44 57  (HANDLE,DWORD,DW
6ad0: 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c  ORD,DWORD,DWORD,
6ae0: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 4f 56 45   \.        LPOVE
6af0: 52 4c 41 50 50 45 44 29 29 61 53 79 73 63 61 6c  RLAPPED))aSyscal
6b00: 6c 5b 34 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[48].pCurrent).
6b10: 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49  #endif..#if SQLI
6b20: 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 28  TE_OS_WINCE || (
6b30: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
6b40: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
6b50: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 29 0a 20  ITE_OMIT_WAL)). 
6b60: 20 7b 20 22 4d 61 70 56 69 65 77 4f 66 46 69 6c   { "MapViewOfFil
6b70: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 53  e",           (S
6b80: 59 53 43 41 4c 4c 29 4d 61 70 56 69 65 77 4f 66  YSCALL)MapViewOf
6b90: 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  File,           
6ba0: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
6bb0: 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 22 2c 20  MapViewOfFile", 
6bc0: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
6bd0: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
6be0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
6bf0: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
6c00: 20 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 6c 65   osMapViewOfFile
6c10: 20 28 28 4c 50 56 4f 49 44 28 57 49 4e 41 50 49   ((LPVOID(WINAPI
6c20: 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c  *)(HANDLE,DWORD,
6c30: 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20  DWORD,DWORD, \. 
6c40: 20 20 20 20 20 20 20 53 49 5a 45 5f 54 29 29 61         SIZE_T))a
6c50: 53 79 73 63 61 6c 6c 5b 34 39 5d 2e 70 43 75 72  Syscall[49].pCur
6c60: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 4d 75 6c 74  rent)..  { "Mult
6c70: 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 22  iByteToWideChar"
6c80: 2c 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4d  ,     (SYSCALL)M
6c90: 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43 68  ultiByteToWideCh
6ca0: 61 72 2c 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64  ar,     0 },..#d
6cb0: 65 66 69 6e 65 20 6f 73 4d 75 6c 74 69 42 79 74  efine osMultiByt
6cc0: 65 54 6f 57 69 64 65 43 68 61 72 20 28 28 69 6e  eToWideChar ((in
6cd0: 74 28 57 49 4e 41 50 49 2a 29 28 55 49 4e 54 2c  t(WINAPI*)(UINT,
6ce0: 44 57 4f 52 44 2c 4c 50 43 53 54 52 2c 69 6e 74  DWORD,LPCSTR,int
6cf0: 2c 4c 50 57 53 54 52 2c 20 5c 0a 20 20 20 20 20  ,LPWSTR, \.     
6d00: 20 20 20 69 6e 74 29 29 61 53 79 73 63 61 6c 6c     int))aSyscall
6d10: 5b 35 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [50].pCurrent)..
6d20: 20 20 7b 20 22 51 75 65 72 79 50 65 72 66 6f 72    { "QueryPerfor
6d30: 6d 61 6e 63 65 43 6f 75 6e 74 65 72 22 2c 20 28  manceCounter", (
6d40: 53 59 53 43 41 4c 4c 29 51 75 65 72 79 50 65 72  SYSCALL)QueryPer
6d50: 66 6f 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72 2c  formanceCounter,
6d60: 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f   0 },..#define o
6d70: 73 51 75 65 72 79 50 65 72 66 6f 72 6d 61 6e 63  sQueryPerformanc
6d80: 65 43 6f 75 6e 74 65 72 20 28 28 42 4f 4f 4c 28  eCounter ((BOOL(
6d90: 57 49 4e 41 50 49 2a 29 28 20 5c 0a 20 20 20 20  WINAPI*)( \.    
6da0: 20 20 20 20 4c 41 52 47 45 5f 49 4e 54 45 47 45      LARGE_INTEGE
6db0: 52 2a 29 29 61 53 79 73 63 61 6c 6c 5b 35 31 5d  R*))aSyscall[51]
6dc0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
6dd0: 22 52 65 61 64 46 69 6c 65 22 2c 20 20 20 20 20  "ReadFile",     
6de0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
6df0: 41 4c 4c 29 52 65 61 64 46 69 6c 65 2c 20 20 20  ALL)ReadFile,   
6e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
6e10: 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 52 65 61  ,..#define osRea
6e20: 64 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e  dFile ((BOOL(WIN
6e30: 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 50 56  API*)(HANDLE,LPV
6e40: 4f 49 44 2c 44 57 4f 52 44 2c 4c 50 44 57 4f 52  OID,DWORD,LPDWOR
6e50: 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 4f  D, \.        LPO
6e60: 56 45 52 4c 41 50 50 45 44 29 29 61 53 79 73 63  VERLAPPED))aSysc
6e70: 61 6c 6c 5b 35 32 5d 2e 70 43 75 72 72 65 6e 74  all[52].pCurrent
6e80: 29 0a 0a 20 20 7b 20 22 53 65 74 45 6e 64 4f 66  )..  { "SetEndOf
6e90: 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20  File",          
6ea0: 20 20 28 53 59 53 43 41 4c 4c 29 53 65 74 45 6e    (SYSCALL)SetEn
6eb0: 64 4f 66 46 69 6c 65 2c 20 20 20 20 20 20 20 20  dOfFile,        
6ec0: 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e      0 },..#defin
6ed0: 65 20 6f 73 53 65 74 45 6e 64 4f 66 46 69 6c 65  e osSetEndOfFile
6ee0: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
6ef0: 28 48 41 4e 44 4c 45 29 29 61 53 79 73 63 61 6c  (HANDLE))aSyscal
6f00: 6c 5b 35 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[53].pCurrent).
6f10: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
6f20: 57 49 4e 52 54 0a 20 20 7b 20 22 53 65 74 46 69  WINRT.  { "SetFi
6f30: 6c 65 50 6f 69 6e 74 65 72 22 2c 20 20 20 20 20  lePointer",     
6f40: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 53 65       (SYSCALL)Se
6f50: 74 46 69 6c 65 50 6f 69 6e 74 65 72 2c 20 20 20  tFilePointer,   
6f60: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
6f70: 65 0a 20 20 7b 20 22 53 65 74 46 69 6c 65 50 6f  e.  { "SetFilePo
6f80: 69 6e 74 65 72 22 2c 20 20 20 20 20 20 20 20 20  inter",         
6f90: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
6fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6fb0: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
6fc0: 23 64 65 66 69 6e 65 20 6f 73 53 65 74 46 69 6c  #define osSetFil
6fd0: 65 50 6f 69 6e 74 65 72 20 28 28 44 57 4f 52 44  ePointer ((DWORD
6fe0: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
6ff0: 2c 4c 4f 4e 47 2c 50 4c 4f 4e 47 2c 20 5c 0a 20  ,LONG,PLONG, \. 
7000: 20 20 20 20 20 20 20 44 57 4f 52 44 29 29 61 53         DWORD))aS
7010: 79 73 63 61 6c 6c 5b 35 34 5d 2e 70 43 75 72 72  yscall[54].pCurr
7020: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
7030: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22  E_OS_WINRT.  { "
7040: 53 6c 65 65 70 22 2c 20 20 20 20 20 20 20 20 20  Sleep",         
7050: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
7060: 4c 4c 29 53 6c 65 65 70 2c 20 20 20 20 20 20 20  LL)Sleep,       
7070: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
7080: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 53 6c 65 65  .#else.  { "Slee
7090: 70 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  p",             
70a0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
70b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
70c0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
70d0: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 53  dif..#define osS
70e0: 6c 65 65 70 20 28 28 56 4f 49 44 28 57 49 4e 41  leep ((VOID(WINA
70f0: 50 49 2a 29 28 44 57 4f 52 44 29 29 61 53 79 73  PI*)(DWORD))aSys
7100: 63 61 6c 6c 5b 35 35 5d 2e 70 43 75 72 72 65 6e  call[55].pCurren
7110: 74 29 0a 0a 20 20 7b 20 22 53 79 73 74 65 6d 54  t)..  { "SystemT
7120: 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65 22 2c 20  imeToFileTime", 
7130: 20 20 20 28 53 59 53 43 41 4c 4c 29 53 79 73 74     (SYSCALL)Syst
7140: 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65  emTimeToFileTime
7150: 2c 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69  ,    0 },..#defi
7160: 6e 65 20 6f 73 53 79 73 74 65 6d 54 69 6d 65 54  ne osSystemTimeT
7170: 6f 46 69 6c 65 54 69 6d 65 20 28 28 42 4f 4f 4c  oFileTime ((BOOL
7180: 28 57 49 4e 41 50 49 2a 29 28 43 4f 4e 53 54 20  (WINAPI*)(CONST 
7190: 53 59 53 54 45 4d 54 49 4d 45 2a 2c 20 5c 0a 20  SYSTEMTIME*, \. 
71a0: 20 20 20 20 20 20 20 4c 50 46 49 4c 45 54 49 4d         LPFILETIM
71b0: 45 29 29 61 53 79 73 63 61 6c 6c 5b 35 36 5d 2e  E))aSyscall[56].
71c0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
71d0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
71e0: 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  && !SQLITE_OS_WI
71f0: 4e 52 54 0a 20 20 7b 20 22 55 6e 6c 6f 63 6b 46  NRT.  { "UnlockF
7200: 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ile",           
7210: 20 20 20 28 53 59 53 43 41 4c 4c 29 55 6e 6c 6f     (SYSCALL)Unlo
7220: 63 6b 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20  ckFile,         
7230: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
7240: 20 20 7b 20 22 55 6e 6c 6f 63 6b 46 69 6c 65 22    { "UnlockFile"
7250: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ,              (
7260: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
7270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7280: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 69   0 },.#endif..#i
7290: 66 6e 64 65 66 20 6f 73 55 6e 6c 6f 63 6b 46 69  fndef osUnlockFi
72a0: 6c 65 0a 23 64 65 66 69 6e 65 20 6f 73 55 6e 6c  le.#define osUnl
72b0: 6f 63 6b 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57  ockFile ((BOOL(W
72c0: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44  INAPI*)(HANDLE,D
72d0: 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44  WORD,DWORD,DWORD
72e0: 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52  , \.        DWOR
72f0: 44 29 29 61 53 79 73 63 61 6c 6c 5b 35 37 5d 2e  D))aSyscall[57].
7300: 70 43 75 72 72 65 6e 74 29 0a 23 65 6e 64 69 66  pCurrent).#endif
7310: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
7320: 5f 57 49 4e 43 45 0a 20 20 7b 20 22 55 6e 6c 6f  _WINCE.  { "Unlo
7330: 63 6b 46 69 6c 65 45 78 22 2c 20 20 20 20 20 20  ckFileEx",      
7340: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 55        (SYSCALL)U
7350: 6e 6c 6f 63 6b 46 69 6c 65 45 78 2c 20 20 20 20  nlockFileEx,    
7360: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
7370: 73 65 0a 20 20 7b 20 22 55 6e 6c 6f 63 6b 46 69  se.  { "UnlockFi
7380: 6c 65 45 78 22 2c 20 20 20 20 20 20 20 20 20 20  leEx",          
7390: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
73a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
73b0: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
73c0: 0a 23 64 65 66 69 6e 65 20 6f 73 55 6e 6c 6f 63  .#define osUnloc
73d0: 6b 46 69 6c 65 45 78 20 28 28 42 4f 4f 4c 28 57  kFileEx ((BOOL(W
73e0: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44  INAPI*)(HANDLE,D
73f0: 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44  WORD,DWORD,DWORD
7400: 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 4f 56  , \.        LPOV
7410: 45 52 4c 41 50 50 45 44 29 29 61 53 79 73 63 61  ERLAPPED))aSysca
7420: 6c 6c 5b 35 38 5d 2e 70 43 75 72 72 65 6e 74 29  ll[58].pCurrent)
7430: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
7440: 57 49 4e 43 45 20 7c 7c 20 21 64 65 66 69 6e 65  WINCE || !define
7450: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  d(SQLITE_OMIT_WA
7460: 4c 29 0a 20 20 7b 20 22 55 6e 6d 61 70 56 69 65  L).  { "UnmapVie
7470: 77 4f 66 46 69 6c 65 22 2c 20 20 20 20 20 20 20  wOfFile",       
7480: 20 20 28 53 59 53 43 41 4c 4c 29 55 6e 6d 61 70    (SYSCALL)Unmap
7490: 56 69 65 77 4f 66 46 69 6c 65 2c 20 20 20 20 20  ViewOfFile,     
74a0: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
74b0: 20 7b 20 22 55 6e 6d 61 70 56 69 65 77 4f 66 46   { "UnmapViewOfF
74c0: 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 28 53  ile",         (S
74d0: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
74e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
74f0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
7500: 66 69 6e 65 20 6f 73 55 6e 6d 61 70 56 69 65 77  fine osUnmapView
7510: 4f 66 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49  OfFile ((BOOL(WI
7520: 4e 41 50 49 2a 29 28 4c 50 43 56 4f 49 44 29 29  NAPI*)(LPCVOID))
7530: 61 53 79 73 63 61 6c 6c 5b 35 39 5d 2e 70 43 75  aSyscall[59].pCu
7540: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 57 69 64  rrent)..  { "Wid
7550: 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65  eCharToMultiByte
7560: 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29  ",     (SYSCALL)
7570: 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42  WideCharToMultiB
7580: 79 74 65 2c 20 20 20 20 20 30 20 7d 2c 0a 0a 23  yte,     0 },..#
7590: 64 65 66 69 6e 65 20 6f 73 57 69 64 65 43 68 61  define osWideCha
75a0: 72 54 6f 4d 75 6c 74 69 42 79 74 65 20 28 28 69  rToMultiByte ((i
75b0: 6e 74 28 57 49 4e 41 50 49 2a 29 28 55 49 4e 54  nt(WINAPI*)(UINT
75c0: 2c 44 57 4f 52 44 2c 4c 50 43 57 53 54 52 2c 69  ,DWORD,LPCWSTR,i
75d0: 6e 74 2c 4c 50 53 54 52 2c 69 6e 74 2c 20 5c 0a  nt,LPSTR,int, \.
75e0: 20 20 20 20 20 20 20 20 4c 50 43 53 54 52 2c 4c          LPCSTR,L
75f0: 50 42 4f 4f 4c 29 29 61 53 79 73 63 61 6c 6c 5b  PBOOL))aSyscall[
7600: 36 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  60].pCurrent).. 
7610: 20 7b 20 22 57 72 69 74 65 46 69 6c 65 22 2c 20   { "WriteFile", 
7620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
7630: 59 53 43 41 4c 4c 29 57 72 69 74 65 46 69 6c 65  YSCALL)WriteFile
7640: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
7650: 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73  0 },..#define os
7660: 57 72 69 74 65 46 69 6c 65 20 28 28 42 4f 4f 4c  WriteFile ((BOOL
7670: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
7680: 2c 4c 50 43 56 4f 49 44 2c 44 57 4f 52 44 2c 4c  ,LPCVOID,DWORD,L
7690: 50 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20  PDWORD, \.      
76a0: 20 20 4c 50 4f 56 45 52 4c 41 50 50 45 44 29 29    LPOVERLAPPED))
76b0: 61 53 79 73 63 61 6c 6c 5b 36 31 5d 2e 70 43 75  aSyscall[61].pCu
76c0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49  rrent)..#if SQLI
76d0: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20  TE_OS_WINRT.  { 
76e0: 22 43 72 65 61 74 65 45 76 65 6e 74 45 78 57 22  "CreateEventExW"
76f0: 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43  ,          (SYSC
7700: 41 4c 4c 29 43 72 65 61 74 65 45 76 65 6e 74 45  ALL)CreateEventE
7710: 78 57 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d  xW,          0 }
7720: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65  ,.#else.  { "Cre
7730: 61 74 65 45 76 65 6e 74 45 78 57 22 2c 20 20 20  ateEventExW",   
7740: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
7750: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
7760: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
7770: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
7780: 43 72 65 61 74 65 45 76 65 6e 74 45 78 57 20 28  CreateEventExW (
7790: 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29  (HANDLE(WINAPI*)
77a0: 28 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54 52  (LPSECURITY_ATTR
77b0: 49 42 55 54 45 53 2c 4c 50 43 57 53 54 52 2c 20  IBUTES,LPCWSTR, 
77c0: 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44 2c  \.        DWORD,
77d0: 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b  DWORD))aSyscall[
77e0: 36 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  62].pCurrent)..#
77f0: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
7800: 4e 52 54 0a 20 20 7b 20 22 57 61 69 74 46 6f 72  NRT.  { "WaitFor
7810: 53 69 6e 67 6c 65 4f 62 6a 65 63 74 22 2c 20 20  SingleObject",  
7820: 20 20 20 28 53 59 53 43 41 4c 4c 29 57 61 69 74     (SYSCALL)Wait
7830: 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 2c  ForSingleObject,
7840: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
7850: 20 20 7b 20 22 57 61 69 74 46 6f 72 53 69 6e 67    { "WaitForSing
7860: 6c 65 4f 62 6a 65 63 74 22 2c 20 20 20 20 20 28  leObject",     (
7870: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
7880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7890: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
78a0: 65 66 69 6e 65 20 6f 73 57 61 69 74 46 6f 72 53  efine osWaitForS
78b0: 69 6e 67 6c 65 4f 62 6a 65 63 74 20 28 28 44 57  ingleObject ((DW
78c0: 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  ORD(WINAPI*)(HAN
78d0: 44 4c 45 2c 20 5c 0a 20 20 20 20 20 20 20 20 44  DLE, \.        D
78e0: 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 36  WORD))aSyscall[6
78f0: 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  3].pCurrent)..#i
7900: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
7910: 54 0a 20 20 7b 20 22 57 61 69 74 46 6f 72 53 69  T.  { "WaitForSi
7920: 6e 67 6c 65 4f 62 6a 65 63 74 45 78 22 2c 20 20  ngleObjectEx",  
7930: 20 28 53 59 53 43 41 4c 4c 29 57 61 69 74 46 6f   (SYSCALL)WaitFo
7940: 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 45 78 2c  rSingleObjectEx,
7950: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
7960: 7b 20 22 57 61 69 74 46 6f 72 53 69 6e 67 6c 65  { "WaitForSingle
7970: 4f 62 6a 65 63 74 45 78 22 2c 20 20 20 28 53 59  ObjectEx",   (SY
7980: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
7990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
79a0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
79b0: 69 6e 65 20 6f 73 57 61 69 74 46 6f 72 53 69 6e  ine osWaitForSin
79c0: 67 6c 65 4f 62 6a 65 63 74 45 78 20 28 28 44 57  gleObjectEx ((DW
79d0: 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  ORD(WINAPI*)(HAN
79e0: 44 4c 45 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20  DLE,DWORD, \.   
79f0: 20 20 20 20 20 42 4f 4f 4c 29 29 61 53 79 73 63       BOOL))aSysc
7a00: 61 6c 6c 5b 36 34 5d 2e 70 43 75 72 72 65 6e 74  all[64].pCurrent
7a10: 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  )..#if SQLITE_OS
7a20: 5f 57 49 4e 52 54 0a 20 20 7b 20 22 53 65 74 46  _WINRT.  { "SetF
7a30: 69 6c 65 50 6f 69 6e 74 65 72 45 78 22 2c 20 20  ilePointerEx",  
7a40: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 53        (SYSCALL)S
7a50: 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 45 78 2c  etFilePointerEx,
7a60: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
7a70: 73 65 0a 20 20 7b 20 22 53 65 74 46 69 6c 65 50  se.  { "SetFileP
7a80: 6f 69 6e 74 65 72 45 78 22 2c 20 20 20 20 20 20  ointerEx",      
7a90: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
7aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ab0: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
7ac0: 0a 23 64 65 66 69 6e 65 20 6f 73 53 65 74 46 69  .#define osSetFi
7ad0: 6c 65 50 6f 69 6e 74 65 72 45 78 20 28 28 42 4f  lePointerEx ((BO
7ae0: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44  OL(WINAPI*)(HAND
7af0: 4c 45 2c 4c 41 52 47 45 5f 49 4e 54 45 47 45 52  LE,LARGE_INTEGER
7b00: 2c 20 5c 0a 20 20 20 20 20 20 20 20 50 4c 41 52  , \.        PLAR
7b10: 47 45 5f 49 4e 54 45 47 45 52 2c 44 57 4f 52 44  GE_INTEGER,DWORD
7b20: 29 29 61 53 79 73 63 61 6c 6c 5b 36 35 5d 2e 70  ))aSyscall[65].p
7b30: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51  Current)..#if SQ
7b40: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
7b50: 7b 20 22 47 65 74 46 69 6c 65 49 6e 66 6f 72 6d  { "GetFileInform
7b60: 61 74 69 6f 6e 42 79 48 61 6e 64 6c 65 45 78 22  ationByHandleEx"
7b70: 2c 20 28 53 59 53 43 41 4c 4c 29 47 65 74 46 69  , (SYSCALL)GetFi
7b80: 6c 65 49 6e 66 6f 72 6d 61 74 69 6f 6e 42 79 48  leInformationByH
7b90: 61 6e 64 6c 65 45 78 2c 20 30 20 7d 2c 0a 23 65  andleEx, 0 },.#e
7ba0: 6c 73 65 0a 20 20 7b 20 22 47 65 74 46 69 6c 65  lse.  { "GetFile
7bb0: 49 6e 66 6f 72 6d 61 74 69 6f 6e 42 79 48 61 6e  InformationByHan
7bc0: 64 6c 65 45 78 22 2c 20 28 53 59 53 43 41 4c 4c  dleEx", (SYSCALL
7bd0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
7be0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
7bf0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 46  ..#define osGetF
7c00: 69 6c 65 49 6e 66 6f 72 6d 61 74 69 6f 6e 42 79  ileInformationBy
7c10: 48 61 6e 64 6c 65 45 78 20 28 28 42 4f 4f 4c 28  HandleEx ((BOOL(
7c20: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c  WINAPI*)(HANDLE,
7c30: 20 5c 0a 20 20 20 20 20 20 20 20 46 49 4c 45 5f   \.        FILE_
7c40: 49 4e 46 4f 5f 42 59 5f 48 41 4e 44 4c 45 5f 43  INFO_BY_HANDLE_C
7c50: 4c 41 53 53 2c 4c 50 56 4f 49 44 2c 44 57 4f 52  LASS,LPVOID,DWOR
7c60: 44 29 29 61 53 79 73 63 61 6c 6c 5b 36 36 5d 2e  D))aSyscall[66].
7c70: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53  pCurrent)..#if S
7c80: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26  QLITE_OS_WINRT &
7c90: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
7ca0: 45 5f 4f 4d 49 54 5f 57 41 4c 29 0a 20 20 7b 20  E_OMIT_WAL).  { 
7cb0: 22 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 46 72  "MapViewOfFileFr
7cc0: 6f 6d 41 70 70 22 2c 20 20 20 20 28 53 59 53 43  omApp",    (SYSC
7cd0: 41 4c 4c 29 4d 61 70 56 69 65 77 4f 66 46 69 6c  ALL)MapViewOfFil
7ce0: 65 46 72 6f 6d 41 70 70 2c 20 20 20 20 30 20 7d  eFromApp,    0 }
7cf0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4d 61 70  ,.#else.  { "Map
7d00: 56 69 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70  ViewOfFileFromAp
7d10: 70 22 2c 20 20 20 20 28 53 59 53 43 41 4c 4c 29  p",    (SYSCALL)
7d20: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
7d30: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
7d40: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
7d50: 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 46 72 6f  MapViewOfFileFro
7d60: 6d 41 70 70 20 28 28 4c 50 56 4f 49 44 28 57 49  mApp ((LPVOID(WI
7d70: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 55 4c  NAPI*)(HANDLE,UL
7d80: 4f 4e 47 2c 55 4c 4f 4e 47 36 34 2c 20 5c 0a 20  ONG,ULONG64, \. 
7d90: 20 20 20 20 20 20 20 53 49 5a 45 5f 54 29 29 61         SIZE_T))a
7da0: 53 79 73 63 61 6c 6c 5b 36 37 5d 2e 70 43 75 72  Syscall[67].pCur
7db0: 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54  rent)..#if SQLIT
7dc0: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22  E_OS_WINRT.  { "
7dd0: 43 72 65 61 74 65 46 69 6c 65 32 22 2c 20 20 20  CreateFile2",   
7de0: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
7df0: 4c 4c 29 43 72 65 61 74 65 46 69 6c 65 32 2c 20  LL)CreateFile2, 
7e00: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
7e10: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65 61  .#else.  { "Crea
7e20: 74 65 46 69 6c 65 32 22 2c 20 20 20 20 20 20 20  teFile2",       
7e30: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
7e40: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
7e50: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
7e60: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43  dif..#define osC
7e70: 72 65 61 74 65 46 69 6c 65 32 20 28 28 48 41 4e  reateFile2 ((HAN
7e80: 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 43  DLE(WINAPI*)(LPC
7e90: 57 53 54 52 2c 44 57 4f 52 44 2c 44 57 4f 52 44  WSTR,DWORD,DWORD
7ea0: 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20  ,DWORD, \.      
7eb0: 20 20 4c 50 43 52 45 41 54 45 46 49 4c 45 32 5f    LPCREATEFILE2_
7ec0: 45 58 54 45 4e 44 45 44 5f 50 41 52 41 4d 45 54  EXTENDED_PARAMET
7ed0: 45 52 53 29 29 61 53 79 73 63 61 6c 6c 5b 36 38  ERS))aSyscall[68
7ee0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
7ef0: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
7f00: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
7f10: 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58  ITE_OMIT_LOAD_EX
7f20: 54 45 4e 53 49 4f 4e 29 0a 20 20 7b 20 22 4c 6f  TENSION).  { "Lo
7f30: 61 64 50 61 63 6b 61 67 65 64 4c 69 62 72 61 72  adPackagedLibrar
7f40: 79 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c 4c  y",     (SYSCALL
7f50: 29 4c 6f 61 64 50 61 63 6b 61 67 65 64 4c 69 62  )LoadPackagedLib
7f60: 72 61 72 79 2c 20 20 20 20 20 30 20 7d 2c 0a 23  rary,     0 },.#
7f70: 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 61 64 50 61  else.  { "LoadPa
7f80: 63 6b 61 67 65 64 4c 69 62 72 61 72 79 22 2c 20  ckagedLibrary", 
7f90: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
7fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7fb0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
7fc0: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4c 6f 61  f..#define osLoa
7fd0: 64 50 61 63 6b 61 67 65 64 4c 69 62 72 61 72 79  dPackagedLibrary
7fe0: 20 28 28 48 4d 4f 44 55 4c 45 28 57 49 4e 41 50   ((HMODULE(WINAP
7ff0: 49 2a 29 28 4c 50 43 57 53 54 52 2c 20 5c 0a 20  I*)(LPCWSTR, \. 
8000: 20 20 20 20 20 20 20 44 57 4f 52 44 29 29 61 53         DWORD))aS
8010: 79 73 63 61 6c 6c 5b 36 39 5d 2e 70 43 75 72 72  yscall[69].pCurr
8020: 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45  ent)..#if SQLITE
8030: 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 47  _OS_WINRT.  { "G
8040: 65 74 54 69 63 6b 43 6f 75 6e 74 36 34 22 2c 20  etTickCount64", 
8050: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
8060: 4c 29 47 65 74 54 69 63 6b 43 6f 75 6e 74 36 34  L)GetTickCount64
8070: 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a  ,          0 },.
8080: 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 54 69  #else.  { "GetTi
8090: 63 6b 43 6f 75 6e 74 36 34 22 2c 20 20 20 20 20  ckCount64",     
80a0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
80b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
80c0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
80d0: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65  if..#define osGe
80e0: 74 54 69 63 6b 43 6f 75 6e 74 36 34 20 28 28 55  tTickCount64 ((U
80f0: 4c 4f 4e 47 4c 4f 4e 47 28 57 49 4e 41 50 49 2a  LONGLONG(WINAPI*
8100: 29 28 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c  )(VOID))aSyscall
8110: 5b 37 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [70].pCurrent)..
8120: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
8130: 4e 52 54 0a 20 20 7b 20 22 47 65 74 4e 61 74 69  NRT.  { "GetNati
8140: 76 65 53 79 73 74 65 6d 49 6e 66 6f 22 2c 20 20  veSystemInfo",  
8150: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 4e     (SYSCALL)GetN
8160: 61 74 69 76 65 53 79 73 74 65 6d 49 6e 66 6f 2c  ativeSystemInfo,
8170: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
8180: 20 20 7b 20 22 47 65 74 4e 61 74 69 76 65 53 79    { "GetNativeSy
8190: 73 74 65 6d 49 6e 66 6f 22 2c 20 20 20 20 20 28  stemInfo",     (
81a0: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
81b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
81c0: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
81d0: 65 66 69 6e 65 20 6f 73 47 65 74 4e 61 74 69 76  efine osGetNativ
81e0: 65 53 79 73 74 65 6d 49 6e 66 6f 20 28 28 56 4f  eSystemInfo ((VO
81f0: 49 44 28 57 49 4e 41 50 49 2a 29 28 20 5c 0a 20  ID(WINAPI*)( \. 
8200: 20 20 20 20 20 20 20 4c 50 53 59 53 54 45 4d 5f         LPSYSTEM_
8210: 49 4e 46 4f 29 29 61 53 79 73 63 61 6c 6c 5b 37  INFO))aSyscall[7
8220: 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  1].pCurrent)..#i
8230: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
8240: 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29  _WIN32_HAS_ANSI)
8250: 0a 20 20 7b 20 22 4f 75 74 70 75 74 44 65 62 75  .  { "OutputDebu
8260: 67 53 74 72 69 6e 67 41 22 2c 20 20 20 20 20 20  gStringA",      
8270: 28 53 59 53 43 41 4c 4c 29 4f 75 74 70 75 74 44  (SYSCALL)OutputD
8280: 65 62 75 67 53 74 72 69 6e 67 41 2c 20 20 20 20  ebugStringA,    
8290: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
82a0: 20 22 4f 75 74 70 75 74 44 65 62 75 67 53 74 72   "OutputDebugStr
82b0: 69 6e 67 41 22 2c 20 20 20 20 20 20 28 53 59 53  ingA",      (SYS
82c0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
82d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
82e0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
82f0: 6e 65 20 6f 73 4f 75 74 70 75 74 44 65 62 75 67  ne osOutputDebug
8300: 53 74 72 69 6e 67 41 20 28 28 56 4f 49 44 28 57  StringA ((VOID(W
8310: 49 4e 41 50 49 2a 29 28 4c 50 43 53 54 52 29 29  INAPI*)(LPCSTR))
8320: 61 53 79 73 63 61 6c 6c 5b 37 32 5d 2e 70 43 75  aSyscall[72].pCu
8330: 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69  rrent)..#if defi
8340: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
8350: 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22  _HAS_WIDE).  { "
8360: 4f 75 74 70 75 74 44 65 62 75 67 53 74 72 69 6e  OutputDebugStrin
8370: 67 57 22 2c 20 20 20 20 20 20 28 53 59 53 43 41  gW",      (SYSCA
8380: 4c 4c 29 4f 75 74 70 75 74 44 65 62 75 67 53 74  LL)OutputDebugSt
8390: 72 69 6e 67 57 2c 20 20 20 20 20 20 30 20 7d 2c  ringW,      0 },
83a0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4f 75 74 70  .#else.  { "Outp
83b0: 75 74 44 65 62 75 67 53 74 72 69 6e 67 57 22 2c  utDebugStringW",
83c0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
83d0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
83e0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
83f0: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4f  dif..#define osO
8400: 75 74 70 75 74 44 65 62 75 67 53 74 72 69 6e 67  utputDebugString
8410: 57 20 28 28 56 4f 49 44 28 57 49 4e 41 50 49 2a  W ((VOID(WINAPI*
8420: 29 28 4c 50 43 57 53 54 52 29 29 61 53 79 73 63  )(LPCWSTR))aSysc
8430: 61 6c 6c 5b 37 33 5d 2e 70 43 75 72 72 65 6e 74  all[73].pCurrent
8440: 29 0a 0a 20 20 7b 20 22 47 65 74 50 72 6f 63 65  )..  { "GetProce
8450: 73 73 48 65 61 70 22 2c 20 20 20 20 20 20 20 20  ssHeap",        
8460: 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 50 72    (SYSCALL)GetPr
8470: 6f 63 65 73 73 48 65 61 70 2c 20 20 20 20 20 20  ocessHeap,      
8480: 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e      0 },..#defin
8490: 65 20 6f 73 47 65 74 50 72 6f 63 65 73 73 48 65  e osGetProcessHe
84a0: 61 70 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41  ap ((HANDLE(WINA
84b0: 50 49 2a 29 28 56 4f 49 44 29 29 61 53 79 73 63  PI*)(VOID))aSysc
84c0: 61 6c 6c 5b 37 34 5d 2e 70 43 75 72 72 65 6e 74  all[74].pCurrent
84d0: 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  )..#if SQLITE_OS
84e0: 5f 57 49 4e 52 54 20 26 26 20 21 64 65 66 69 6e  _WINRT && !defin
84f0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ed(SQLITE_OMIT_W
8500: 41 4c 29 0a 20 20 7b 20 22 43 72 65 61 74 65 46  AL).  { "CreateF
8510: 69 6c 65 4d 61 70 70 69 6e 67 46 72 6f 6d 41 70  ileMappingFromAp
8520: 70 22 2c 20 28 53 59 53 43 41 4c 4c 29 43 72 65  p", (SYSCALL)Cre
8530: 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 46 72  ateFileMappingFr
8540: 6f 6d 41 70 70 2c 20 30 20 7d 2c 0a 23 65 6c 73  omApp, 0 },.#els
8550: 65 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c  e.  { "CreateFil
8560: 65 4d 61 70 70 69 6e 67 46 72 6f 6d 41 70 70 22  eMappingFromApp"
8570: 2c 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20  , (SYSCALL)0,   
8580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8590: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
85a0: 23 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65  #define osCreate
85b0: 46 69 6c 65 4d 61 70 70 69 6e 67 46 72 6f 6d 41  FileMappingFromA
85c0: 70 70 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41  pp ((HANDLE(WINA
85d0: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 20 5c 0a 20  PI*)(HANDLE, \. 
85e0: 20 20 20 20 20 20 20 4c 50 53 45 43 55 52 49 54         LPSECURIT
85f0: 59 5f 41 54 54 52 49 42 55 54 45 53 2c 55 4c 4f  Y_ATTRIBUTES,ULO
8600: 4e 47 2c 55 4c 4f 4e 47 36 34 2c 4c 50 43 57 53  NG,ULONG64,LPCWS
8610: 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 37 35 5d  TR))aSyscall[75]
8620: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 2f 2a 0a 2a  .pCurrent)../*.*
8630: 2a 20 4e 4f 54 45 3a 20 4f 6e 20 73 6f 6d 65 20  * NOTE: On some 
8640: 73 75 62 2d 70 6c 61 74 66 6f 72 6d 73 2c 20 74  sub-platforms, t
8650: 68 65 20 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f  he InterlockedCo
8660: 6d 70 61 72 65 45 78 63 68 61 6e 67 65 20 22 66  mpareExchange "f
8670: 75 6e 63 74 69 6f 6e 22 0a 2a 2a 20 20 20 20 20  unction".**     
8680: 20 20 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74    is really just
8690: 20 61 20 6d 61 63 72 6f 20 74 68 61 74 20 75 73   a macro that us
86a0: 65 73 20 61 20 63 6f 6d 70 69 6c 65 72 20 69 6e  es a compiler in
86b0: 74 72 69 6e 73 69 63 20 28 65 2e 67 2e 20 78 36  trinsic (e.g. x6
86c0: 34 29 2e 0a 2a 2a 20 20 20 20 20 20 20 53 6f 20  4)..**       So 
86d0: 64 6f 20 6e 6f 74 20 74 72 79 20 74 6f 20 6d 61  do not try to ma
86e0: 6b 65 20 74 68 69 73 20 69 73 20 69 6e 74 6f 20  ke this is into 
86f0: 61 20 72 65 64 65 66 69 6e 61 62 6c 65 20 69 6e  a redefinable in
8700: 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 23 69 66 20  terface..*/.#if 
8710: 64 65 66 69 6e 65 64 28 49 6e 74 65 72 6c 6f 63  defined(Interloc
8720: 6b 65 64 43 6f 6d 70 61 72 65 45 78 63 68 61 6e  kedCompareExchan
8730: 67 65 29 0a 20 20 7b 20 22 49 6e 74 65 72 6c 6f  ge).  { "Interlo
8740: 63 6b 65 64 43 6f 6d 70 61 72 65 45 78 63 68 61  ckedCompareExcha
8750: 6e 67 65 22 2c 20 28 53 59 53 43 41 4c 4c 29 30  nge", (SYSCALL)0
8760: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
8770: 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69       0 },..#defi
8780: 6e 65 20 6f 73 49 6e 74 65 72 6c 6f 63 6b 65 64  ne osInterlocked
8790: 43 6f 6d 70 61 72 65 45 78 63 68 61 6e 67 65 20  CompareExchange 
87a0: 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61  InterlockedCompa
87b0: 72 65 45 78 63 68 61 6e 67 65 0a 23 65 6c 73 65  reExchange.#else
87c0: 0a 20 20 7b 20 22 49 6e 74 65 72 6c 6f 63 6b 65  .  { "Interlocke
87d0: 64 43 6f 6d 70 61 72 65 45 78 63 68 61 6e 67 65  dCompareExchange
87e0: 22 2c 20 28 53 59 53 43 41 4c 4c 29 49 6e 74 65  ", (SYSCALL)Inte
87f0: 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72 65 45 78  rlockedCompareEx
8800: 63 68 61 6e 67 65 2c 20 30 20 7d 2c 0a 0a 23 64  change, 0 },..#d
8810: 65 66 69 6e 65 20 6f 73 49 6e 74 65 72 6c 6f 63  efine osInterloc
8820: 6b 65 64 43 6f 6d 70 61 72 65 45 78 63 68 61 6e  kedCompareExchan
8830: 67 65 20 28 28 4c 4f 4e 47 28 57 49 4e 41 50 49  ge ((LONG(WINAPI
8840: 2a 29 28 4c 4f 4e 47 20 5c 0a 20 20 20 20 20 20  *)(LONG \.      
8850: 20 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 56    SQLITE_WIN32_V
8860: 4f 4c 41 54 49 4c 45 2a 2c 20 4c 4f 4e 47 2c 4c  OLATILE*, LONG,L
8870: 4f 4e 47 29 29 61 53 79 73 63 61 6c 6c 5b 37 36  ONG))aSyscall[76
8880: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 23 65 6e 64  ].pCurrent).#end
8890: 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 49 6e  if /* defined(In
88a0: 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72 65  terlockedCompare
88b0: 45 78 63 68 61 6e 67 65 29 20 2a 2f 0a 0a 7d 3b  Exchange) */..};
88c0: 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6f   /* End of the o
88d0: 76 65 72 72 69 64 65 61 62 6c 65 20 73 79 73 74  verrideable syst
88e0: 65 6d 20 63 61 6c 6c 73 20 2a 2f 0a 0a 2f 2a 0a  em calls */../*.
88f0: 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 78  ** This is the x
8900: 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 29 20  SetSystemCall() 
8910: 6d 65 74 68 6f 64 20 6f 66 20 73 71 6c 69 74 65  method of sqlite
8920: 33 5f 76 66 73 20 66 6f 72 20 61 6c 6c 20 6f 66  3_vfs for all of
8930: 20 74 68 65 0a 2a 2a 20 22 77 69 6e 33 32 22 20   the.** "win32" 
8940: 56 46 53 65 73 2e 20 20 52 65 74 75 72 6e 20 53  VFSes.  Return S
8950: 51 4c 49 54 45 5f 4f 4b 20 6f 70 6f 6e 20 73 75  QLITE_OK opon su
8960: 63 63 65 73 73 66 75 6c 6c 79 20 75 70 64 61 74  ccessfully updat
8970: 69 6e 67 20 74 68 65 0a 2a 2a 20 73 79 73 74 65  ing the.** syste
8980: 6d 20 63 61 6c 6c 20 70 6f 69 6e 74 65 72 2c 20  m call pointer, 
8990: 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55  or SQLITE_NOTFOU
89a0: 4e 44 20 69 66 20 74 68 65 72 65 20 69 73 20 6e  ND if there is n
89b0: 6f 20 63 6f 6e 66 69 67 75 72 61 62 6c 65 0a 2a  o configurable.*
89c0: 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6e 61  * system call na
89d0: 6d 65 64 20 7a 4e 61 6d 65 2e 0a 2a 2f 0a 73 74  med zName..*/.st
89e0: 61 74 69 63 20 69 6e 74 20 77 69 6e 53 65 74 53  atic int winSetS
89f0: 79 73 74 65 6d 43 61 6c 6c 28 0a 20 20 73 71 6c  ystemCall(.  sql
8a00: 69 74 65 33 5f 76 66 73 20 2a 70 4e 6f 74 55 73  ite3_vfs *pNotUs
8a10: 65 64 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ed,        /* Th
8a20: 65 20 56 46 53 20 70 6f 69 6e 74 65 72 2e 20 20  e VFS pointer.  
8a30: 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 63 6f  Not used */.  co
8a40: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
8a50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
8a60: 61 6d 65 20 6f 66 20 73 79 73 74 65 6d 20 63 61  ame of system ca
8a70: 6c 6c 20 74 6f 20 6f 76 65 72 72 69 64 65 20 2a  ll to override *
8a80: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73 63  /.  sqlite3_sysc
8a90: 61 6c 6c 5f 70 74 72 20 70 4e 65 77 46 75 6e 63  all_ptr pNewFunc
8aa0: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
8ab0: 6e 65 77 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  new system call 
8ac0: 76 61 6c 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e  value */.){.  un
8ad0: 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20 20  signed int i;.  
8ae0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
8af0: 4e 4f 54 46 4f 55 4e 44 3b 0a 0a 20 20 55 4e 55  NOTFOUND;..  UNU
8b00: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 4e  SED_PARAMETER(pN
8b10: 6f 74 55 73 65 64 29 3b 0a 20 20 69 66 28 20 7a  otUsed);.  if( z
8b20: 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  Name==0 ){.    /
8b30: 2a 20 49 66 20 6e 6f 20 7a 4e 61 6d 65 20 69 73  * If no zName is
8b40: 20 67 69 76 65 6e 2c 20 72 65 73 74 6f 72 65 20   given, restore 
8b50: 61 6c 6c 20 73 79 73 74 65 6d 20 63 61 6c 6c 73  all system calls
8b60: 20 74 6f 20 74 68 65 69 72 20 64 65 66 61 75 6c   to their defaul
8b70: 74 0a 20 20 20 20 2a 2a 20 73 65 74 74 69 6e 67  t.    ** setting
8b80: 73 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c  s and return NUL
8b90: 4c 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  L.    */.    rc 
8ba0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
8bb0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
8bc0: 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a  of(aSyscall)/siz
8bd0: 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29  eof(aSyscall[0])
8be0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
8bf0: 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44  ( aSyscall[i].pD
8c00: 65 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20 20  efault ){.      
8c10: 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43    aSyscall[i].pC
8c20: 75 72 72 65 6e 74 20 3d 20 61 53 79 73 63 61 6c  urrent = aSyscal
8c30: 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3b 0a 20  l[i].pDefault;. 
8c40: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
8c50: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20  else{.    /* If 
8c60: 7a 4e 61 6d 65 20 69 73 20 73 70 65 63 69 66 69  zName is specifi
8c70: 65 64 2c 20 6f 70 65 72 61 74 65 20 6f 6e 20 6f  ed, operate on o
8c80: 6e 6c 79 20 74 68 65 20 6f 6e 65 20 73 79 73 74  nly the one syst
8c90: 65 6d 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 73  em call.    ** s
8ca0: 70 65 63 69 66 69 65 64 2e 0a 20 20 20 20 2a 2f  pecified..    */
8cb0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
8cc0: 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 29  sizeof(aSyscall)
8cd0: 2f 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c  /sizeof(aSyscall
8ce0: 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  [0]); i++){.    
8cf0: 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 61    if( strcmp(zNa
8d00: 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e  me, aSyscall[i].
8d10: 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20  zName)==0 ){.   
8d20: 20 20 20 20 20 69 66 28 20 61 53 79 73 63 61 6c       if( aSyscal
8d30: 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3d 3d 30  l[i].pDefault==0
8d40: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 53   ){.          aS
8d50: 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75  yscall[i].pDefau
8d60: 6c 74 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d  lt = aSyscall[i]
8d70: 2e 70 43 75 72 72 65 6e 74 3b 0a 20 20 20 20 20  .pCurrent;.     
8d80: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20     }.        rc 
8d90: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
8da0: 20 20 20 20 20 69 66 28 20 70 4e 65 77 46 75 6e       if( pNewFun
8db0: 63 3d 3d 30 20 29 20 70 4e 65 77 46 75 6e 63 20  c==0 ) pNewFunc 
8dc0: 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44  = aSyscall[i].pD
8dd0: 65 66 61 75 6c 74 3b 0a 20 20 20 20 20 20 20 20  efault;.        
8de0: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72  aSyscall[i].pCur
8df0: 72 65 6e 74 20 3d 20 70 4e 65 77 46 75 6e 63 3b  rent = pNewFunc;
8e00: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
8e10: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
8e20: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
8e30: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
8e40: 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20 73 79  he value of a sy
8e50: 73 74 65 6d 20 63 61 6c 6c 2e 20 20 52 65 74 75  stem call.  Retu
8e60: 72 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e 61 6d 65  rn NULL if zName
8e70: 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 72 65 63   is not a.** rec
8e80: 6f 67 6e 69 7a 65 64 20 73 79 73 74 65 6d 20 63  ognized system c
8e90: 61 6c 6c 20 6e 61 6d 65 2e 20 20 4e 55 4c 4c 20  all name.  NULL 
8ea0: 69 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65 64  is also returned
8eb0: 20 69 66 20 74 68 65 20 73 79 73 74 65 6d 20 63   if the system c
8ec0: 61 6c 6c 0a 2a 2a 20 69 73 20 63 75 72 72 65 6e  all.** is curren
8ed0: 74 6c 79 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a  tly undefined..*
8ee0: 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33  /.static sqlite3
8ef0: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 77 69 6e  _syscall_ptr win
8f00: 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 0a 20  GetSystemCall(. 
8f10: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 4e   sqlite3_vfs *pN
8f20: 6f 74 55 73 65 64 2c 0a 20 20 63 6f 6e 73 74 20  otUsed,.  const 
8f30: 63 68 61 72 20 2a 7a 4e 61 6d 65 0a 29 7b 0a 20  char *zName.){. 
8f40: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b   unsigned int i;
8f50: 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ..  UNUSED_PARAM
8f60: 45 54 45 52 28 70 4e 6f 74 55 73 65 64 29 3b 0a  ETER(pNotUsed);.
8f70: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a    for(i=0; i<siz
8f80: 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69  eof(aSyscall)/si
8f90: 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d  zeof(aSyscall[0]
8fa0: 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ); i++){.    if(
8fb0: 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61   strcmp(zName, a
8fc0: 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65  Syscall[i].zName
8fd0: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 61 53  )==0 ) return aS
8fe0: 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65  yscall[i].pCurre
8ff0: 6e 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  nt;.  }.  return
9000: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   0;.}../*.** Ret
9010: 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  urn the name of 
9020: 74 68 65 20 66 69 72 73 74 20 73 79 73 74 65 6d  the first system
9030: 20 63 61 6c 6c 20 61 66 74 65 72 20 7a 4e 61 6d   call after zNam
9040: 65 2e 20 20 49 66 20 7a 4e 61 6d 65 3d 3d 4e 55  e.  If zName==NU
9050: 4c 4c 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75 72  LL.** then retur
9060: 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  n the name of th
9070: 65 20 66 69 72 73 74 20 73 79 73 74 65 6d 20 63  e first system c
9080: 61 6c 6c 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c  all.  Return NUL
9090: 4c 20 69 66 20 7a 4e 61 6d 65 0a 2a 2a 20 69 73  L if zName.** is
90a0: 20 74 68 65 20 6c 61 73 74 20 73 79 73 74 65 6d   the last system
90b0: 20 63 61 6c 6c 20 6f 72 20 69 66 20 7a 4e 61 6d   call or if zNam
90c0: 65 20 69 73 20 6e 6f 74 20 74 68 65 20 6e 61 6d  e is not the nam
90d0: 65 20 6f 66 20 61 20 76 61 6c 69 64 0a 2a 2a 20  e of a valid.** 
90e0: 73 79 73 74 65 6d 20 63 61 6c 6c 2e 0a 2a 2f 0a  system call..*/.
90f0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
9100: 72 20 2a 77 69 6e 4e 65 78 74 53 79 73 74 65 6d  r *winNextSystem
9110: 43 61 6c 6c 28 73 71 6c 69 74 65 33 5f 76 66 73  Call(sqlite3_vfs
9120: 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
9130: 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69  *zName){.  int i
9140: 20 3d 20 2d 31 3b 0a 0a 20 20 55 4e 55 53 45 44   = -1;..  UNUSED
9150: 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b 0a 20  _PARAMETER(p);. 
9160: 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20   if( zName ){.  
9170: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72    for(i=0; i<Arr
9180: 61 79 53 69 7a 65 28 61 53 79 73 63 61 6c 6c 29  aySize(aSyscall)
9190: 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  -1; i++){.      
91a0: 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65  if( strcmp(zName
91b0: 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e  , aSyscall[i].zN
91c0: 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b  ame)==0 ) break;
91d0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72  .    }.  }.  for
91e0: 28 69 2b 2b 3b 20 69 3c 41 72 72 61 79 53 69 7a  (i++; i<ArraySiz
91f0: 65 28 61 53 79 73 63 61 6c 6c 29 3b 20 69 2b 2b  e(aSyscall); i++
9200: 29 7b 0a 20 20 20 20 69 66 28 20 61 53 79 73 63  ){.    if( aSysc
9210: 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 21  all[i].pCurrent!
9220: 3d 30 20 29 20 72 65 74 75 72 6e 20 61 53 79 73  =0 ) return aSys
9230: 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20  call[i].zName;. 
9240: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
9250: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
9260: 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 0a 2f 2a 0a  WIN32_MALLOC./*.
9270: 2a 2a 20 49 66 20 61 20 57 69 6e 33 32 20 6e 61  ** If a Win32 na
9280: 74 69 76 65 20 68 65 61 70 20 68 61 73 20 62 65  tive heap has be
9290: 65 6e 20 63 6f 6e 66 69 67 75 72 65 64 2c 20 74  en configured, t
92a0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c  his function wil
92b0: 6c 20 61 74 74 65 6d 70 74 20 74 6f 0a 2a 2a 20  l attempt to.** 
92c0: 63 6f 6d 70 61 63 74 20 69 74 2e 20 20 55 70 6f  compact it.  Upo
92d0: 6e 20 73 75 63 63 65 73 73 2c 20 53 51 4c 49 54  n success, SQLIT
92e0: 45 5f 4f 4b 20 77 69 6c 6c 20 62 65 20 72 65 74  E_OK will be ret
92f0: 75 72 6e 65 64 2e 20 20 55 70 6f 6e 20 66 61 69  urned.  Upon fai
9300: 6c 75 72 65 2c 20 6f 6e 65 0a 2a 2a 20 6f 66 20  lure, one.** of 
9310: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 53 51  SQLITE_NOMEM, SQ
9320: 4c 49 54 45 5f 45 52 52 4f 52 2c 20 6f 72 20 53  LITE_ERROR, or S
9330: 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 77  QLITE_NOTFOUND w
9340: 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 2e  ill be returned.
9350: 20 20 54 68 65 0a 2a 2a 20 22 70 6e 4c 61 72 67    The.** "pnLarg
9360: 65 73 74 22 20 61 72 67 75 6d 65 6e 74 2c 20 69  est" argument, i
9370: 66 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 77 69 6c 6c  f non-zero, will
9380: 20 62 65 20 75 73 65 64 20 74 6f 20 72 65 74 75   be used to retu
9390: 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  rn the size of t
93a0: 68 65 0a 2a 2a 20 6c 61 72 67 65 73 74 20 63 6f  he.** largest co
93b0: 6d 6d 69 74 74 65 64 20 66 72 65 65 20 62 6c 6f  mmitted free blo
93c0: 63 6b 20 69 6e 20 74 68 65 20 68 65 61 70 2c 20  ck in the heap, 
93d0: 69 6e 20 62 79 74 65 73 2e 0a 2a 2f 0a 69 6e 74  in bytes..*/.int
93e0: 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 63   sqlite3_win32_c
93f0: 6f 6d 70 61 63 74 5f 68 65 61 70 28 4c 50 55 49  ompact_heap(LPUI
9400: 4e 54 20 70 6e 4c 61 72 67 65 73 74 29 7b 0a 20  NT pnLargest){. 
9410: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
9420: 5f 4f 4b 3b 0a 20 20 55 49 4e 54 20 6e 4c 61 72  _OK;.  UINT nLar
9430: 67 65 73 74 20 3d 20 30 3b 0a 20 20 48 41 4e 44  gest = 0;.  HAND
9440: 4c 45 20 68 48 65 61 70 3b 0a 0a 20 20 77 69 6e  LE hHeap;..  win
9450: 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63 28 29  MemAssertMagic()
9460: 3b 0a 20 20 68 48 65 61 70 20 3d 20 77 69 6e 4d  ;.  hHeap = winM
9470: 65 6d 47 65 74 48 65 61 70 28 29 3b 0a 20 20 61  emGetHeap();.  a
9480: 73 73 65 72 74 28 20 68 48 65 61 70 21 3d 30 20  ssert( hHeap!=0 
9490: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48 65  );.  assert( hHe
94a0: 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44  ap!=INVALID_HAND
94b0: 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66 20  LE_VALUE );.#if 
94c0: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
94d0: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
94e0: 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f  TE_WIN32_MALLOC_
94f0: 56 41 4c 49 44 41 54 45 29 0a 20 20 61 73 73 65  VALIDATE).  asse
9500: 72 74 28 20 6f 73 48 65 61 70 56 61 6c 69 64 61  rt( osHeapValida
9510: 74 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45  te(hHeap, SQLITE
9520: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47  _WIN32_HEAP_FLAG
9530: 53 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23 65 6e 64  S, NULL) );.#end
9540: 69 66 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  if.#if !SQLITE_O
9550: 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49  S_WINCE && !SQLI
9560: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 69 66  TE_OS_WINRT.  if
9570: 28 20 28 6e 4c 61 72 67 65 73 74 3d 6f 73 48 65  ( (nLargest=osHe
9580: 61 70 43 6f 6d 70 61 63 74 28 68 48 65 61 70 2c  apCompact(hHeap,
9590: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
95a0: 41 50 5f 46 4c 41 47 53 29 29 3d 3d 30 20 29 7b  AP_FLAGS))==0 ){
95b0: 0a 20 20 20 20 44 57 4f 52 44 20 6c 61 73 74 45  .    DWORD lastE
95c0: 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
95d0: 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 69 66 28  Error();.    if(
95e0: 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 4e 4f 5f 45   lastErrno==NO_E
95f0: 52 52 4f 52 20 29 7b 0a 20 20 20 20 20 20 73 71  RROR ){.      sq
9600: 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
9610: 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20  _NOMEM, "failed 
9620: 74 6f 20 48 65 61 70 43 6f 6d 70 61 63 74 20 28  to HeapCompact (
9630: 6e 6f 20 73 70 61 63 65 29 2c 20 68 65 61 70 3d  no space), heap=
9640: 25 70 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %p",.           
9650: 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 68 48         (void*)hH
9660: 65 61 70 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  eap);.      rc =
9670: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
9680: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
9690: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49  sqlite3_log(SQLI
96a0: 54 45 5f 45 52 52 4f 52 2c 20 22 66 61 69 6c 65  TE_ERROR, "faile
96b0: 64 20 74 6f 20 48 65 61 70 43 6f 6d 70 61 63 74  d to HeapCompact
96c0: 20 28 25 6c 75 29 2c 20 68 65 61 70 3d 25 70 22   (%lu), heap=%p"
96d0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
96e0: 20 20 20 20 6f 73 47 65 74 4c 61 73 74 45 72 72      osGetLastErr
96f0: 6f 72 28 29 2c 20 28 76 6f 69 64 2a 29 68 48 65  or(), (void*)hHe
9700: 61 70 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ap);.      rc = 
9710: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
9720: 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20    }.  }.#else.  
9730: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49  sqlite3_log(SQLI
9740: 54 45 5f 4e 4f 54 46 4f 55 4e 44 2c 20 22 66 61  TE_NOTFOUND, "fa
9750: 69 6c 65 64 20 74 6f 20 48 65 61 70 43 6f 6d 70  iled to HeapComp
9760: 61 63 74 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20  act, heap=%p",. 
9770: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f               (vo
9780: 69 64 2a 29 68 48 65 61 70 29 3b 0a 20 20 72 63  id*)hHeap);.  rc
9790: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55   = SQLITE_NOTFOU
97a0: 4e 44 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28  ND;.#endif.  if(
97b0: 20 70 6e 4c 61 72 67 65 73 74 20 29 20 2a 70 6e   pnLargest ) *pn
97c0: 4c 61 72 67 65 73 74 20 3d 20 6e 4c 61 72 67 65  Largest = nLarge
97d0: 73 74 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  st;.  return rc;
97e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 20 57  .}../*.** If a W
97f0: 69 6e 33 32 20 6e 61 74 69 76 65 20 68 65 61 70  in32 native heap
9800: 20 68 61 73 20 62 65 65 6e 20 63 6f 6e 66 69 67   has been config
9810: 75 72 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74  ured, this funct
9820: 69 6f 6e 20 77 69 6c 6c 20 61 74 74 65 6d 70 74  ion will attempt
9830: 20 74 6f 0a 2a 2a 20 64 65 73 74 72 6f 79 20 61   to.** destroy a
9840: 6e 64 20 72 65 63 72 65 61 74 65 20 69 74 2e 20  nd recreate it. 
9850: 20 49 66 20 74 68 65 20 57 69 6e 33 32 20 6e 61   If the Win32 na
9860: 74 69 76 65 20 68 65 61 70 20 69 73 20 6e 6f 74  tive heap is not
9870: 20 69 73 6f 6c 61 74 65 64 20 61 6e 64 2f 6f 72   isolated and/or
9880: 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33 5f  .** the sqlite3_
9890: 6d 65 6d 6f 72 79 5f 75 73 65 64 28 29 20 66 75  memory_used() fu
98a0: 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20  nction does not 
98b0: 72 65 74 75 72 6e 20 7a 65 72 6f 2c 20 53 51 4c  return zero, SQL
98c0: 49 54 45 5f 42 55 53 59 20 77 69 6c 6c 0a 2a 2a  ITE_BUSY will.**
98d0: 20 62 65 20 72 65 74 75 72 6e 65 64 20 61 6e 64   be returned and
98e0: 20 6e 6f 20 63 68 61 6e 67 65 73 20 77 69 6c 6c   no changes will
98f0: 20 62 65 20 6d 61 64 65 20 74 6f 20 74 68 65 20   be made to the 
9900: 57 69 6e 33 32 20 6e 61 74 69 76 65 20 68 65 61  Win32 native hea
9910: 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  p..*/.int sqlite
9920: 33 5f 77 69 6e 33 32 5f 72 65 73 65 74 5f 68 65  3_win32_reset_he
9930: 61 70 28 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ap(){.  int rc;.
9940: 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73    MUTEX_LOGIC( s
9950: 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 4d  qlite3_mutex *pM
9960: 61 73 74 65 72 3b 20 29 20 2f 2a 20 54 68 65 20  aster; ) /* The 
9970: 6d 61 69 6e 20 73 74 61 74 69 63 20 6d 75 74 65  main static mute
9980: 78 20 2a 2f 0a 20 20 4d 55 54 45 58 5f 4c 4f 47  x */.  MUTEX_LOG
9990: 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  IC( sqlite3_mute
99a0: 78 20 2a 70 4d 65 6d 3b 20 29 20 20 20 20 2f 2a  x *pMem; )    /*
99b0: 20 54 68 65 20 6d 65 6d 73 79 73 20 73 74 61 74   The memsys stat
99c0: 69 63 20 6d 75 74 65 78 20 2a 2f 0a 20 20 4d 55  ic mutex */.  MU
99d0: 54 45 58 5f 4c 4f 47 49 43 28 20 70 4d 61 73 74  TEX_LOGIC( pMast
99e0: 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65  er = sqlite3Mute
99f0: 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
9a00: 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45  TEX_STATIC_MASTE
9a10: 52 29 3b 20 29 0a 20 20 4d 55 54 45 58 5f 4c 4f  R); ).  MUTEX_LO
9a20: 47 49 43 28 20 70 4d 65 6d 20 3d 20 73 71 6c 69  GIC( pMem = sqli
9a30: 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
9a40: 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
9a50: 43 5f 4d 45 4d 29 3b 20 29 0a 20 20 73 71 6c 69  C_MEM); ).  sqli
9a60: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
9a70: 70 4d 61 73 74 65 72 29 3b 0a 20 20 73 71 6c 69  pMaster);.  sqli
9a80: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
9a90: 70 4d 65 6d 29 3b 0a 20 20 77 69 6e 4d 65 6d 41  pMem);.  winMemA
9aa0: 73 73 65 72 74 4d 61 67 69 63 28 29 3b 0a 20 20  ssertMagic();.  
9ab0: 69 66 28 20 77 69 6e 4d 65 6d 47 65 74 48 65 61  if( winMemGetHea
9ac0: 70 28 29 21 3d 4e 55 4c 4c 20 26 26 20 77 69 6e  p()!=NULL && win
9ad0: 4d 65 6d 47 65 74 4f 77 6e 65 64 28 29 20 26 26  MemGetOwned() &&
9ae0: 20 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f   sqlite3_memory_
9af0: 75 73 65 64 28 29 3d 3d 30 20 29 7b 0a 20 20 20  used()==0 ){.   
9b00: 20 2f 2a 0a 20 20 20 20 2a 2a 20 41 74 20 74 68   /*.    ** At th
9b10: 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 72 65 20  is point, there 
9b20: 73 68 6f 75 6c 64 20 62 65 20 6e 6f 20 6f 75 74  should be no out
9b30: 73 74 61 6e 64 69 6e 67 20 6d 65 6d 6f 72 79 20  standing memory 
9b40: 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 6f 6e 0a 20  allocations on. 
9b50: 20 20 20 2a 2a 20 74 68 65 20 68 65 61 70 2e 20     ** the heap. 
9b60: 20 41 6c 73 6f 2c 20 73 69 6e 63 65 20 62 6f 74   Also, since bot
9b70: 68 20 74 68 65 20 6d 61 73 74 65 72 20 61 6e 64  h the master and
9b80: 20 6d 65 6d 73 79 73 20 6c 6f 63 6b 73 20 61 72   memsys locks ar
9b90: 65 20 63 75 72 72 65 6e 74 6c 79 0a 20 20 20 20  e currently.    
9ba0: 2a 2a 20 62 65 69 6e 67 20 68 65 6c 64 20 62 79  ** being held by
9bb0: 20 75 73 2c 20 6e 6f 20 6f 74 68 65 72 20 66 75   us, no other fu
9bc0: 6e 63 74 69 6f 6e 20 28 69 2e 65 2e 20 66 72 6f  nction (i.e. fro
9bd0: 6d 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64  m another thread
9be0: 29 20 73 68 6f 75 6c 64 0a 20 20 20 20 2a 2a 20  ) should.    ** 
9bf0: 62 65 20 61 62 6c 65 20 74 6f 20 65 76 65 6e 20  be able to even 
9c00: 61 63 63 65 73 73 20 74 68 65 20 68 65 61 70 2e  access the heap.
9c10: 20 20 41 74 74 65 6d 70 74 20 74 6f 20 64 65 73    Attempt to des
9c20: 74 72 6f 79 20 61 6e 64 20 72 65 63 72 65 61 74  troy and recreat
9c30: 65 20 6f 75 72 0a 20 20 20 20 2a 2a 20 69 73 6f  e our.    ** iso
9c40: 6c 61 74 65 64 20 57 69 6e 33 32 20 6e 61 74 69  lated Win32 nati
9c50: 76 65 20 68 65 61 70 20 6e 6f 77 2e 0a 20 20 20  ve heap now..   
9c60: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
9c70: 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 21  winMemGetHeap()!
9c80: 3d 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 61 73 73  =NULL );.    ass
9c90: 65 72 74 28 20 77 69 6e 4d 65 6d 47 65 74 4f 77  ert( winMemGetOw
9ca0: 6e 65 64 28 29 20 29 3b 0a 20 20 20 20 61 73 73  ned() );.    ass
9cb0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 65 6d  ert( sqlite3_mem
9cc0: 6f 72 79 5f 75 73 65 64 28 29 3d 3d 30 20 29 3b  ory_used()==0 );
9cd0: 0a 20 20 20 20 77 69 6e 4d 65 6d 53 68 75 74 64  .    winMemShutd
9ce0: 6f 77 6e 28 77 69 6e 4d 65 6d 47 65 74 44 61 74  own(winMemGetDat
9cf0: 61 50 74 72 28 29 29 3b 0a 20 20 20 20 61 73 73  aPtr());.    ass
9d00: 65 72 74 28 20 77 69 6e 4d 65 6d 47 65 74 48 65  ert( winMemGetHe
9d10: 61 70 28 29 3d 3d 4e 55 4c 4c 20 29 3b 0a 20 20  ap()==NULL );.  
9d20: 20 20 61 73 73 65 72 74 28 20 21 77 69 6e 4d 65    assert( !winMe
9d30: 6d 47 65 74 4f 77 6e 65 64 28 29 20 29 3b 0a 20  mGetOwned() );. 
9d40: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
9d50: 65 33 5f 6d 65 6d 6f 72 79 5f 75 73 65 64 28 29  e3_memory_used()
9d60: 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ==0 );.    rc = 
9d70: 77 69 6e 4d 65 6d 49 6e 69 74 28 77 69 6e 4d 65  winMemInit(winMe
9d80: 6d 47 65 74 44 61 74 61 50 74 72 28 29 29 3b 0a  mGetDataPtr());.
9d90: 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
9da0: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 77 69 6e  SQLITE_OK || win
9db0: 4d 65 6d 47 65 74 48 65 61 70 28 29 21 3d 4e 55  MemGetHeap()!=NU
9dc0: 4c 4c 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  LL );.    assert
9dd0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
9de0: 7c 7c 20 77 69 6e 4d 65 6d 47 65 74 4f 77 6e 65  || winMemGetOwne
9df0: 64 28 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72  d() );.    asser
9e00: 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
9e10: 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 65 6d 6f   || sqlite3_memo
9e20: 72 79 5f 75 73 65 64 28 29 3d 3d 30 20 29 3b 0a  ry_used()==0 );.
9e30: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 0a    }else{.    /*.
9e40: 20 20 20 20 2a 2a 20 54 68 65 20 57 69 6e 33 32      ** The Win32
9e50: 20 6e 61 74 69 76 65 20 68 65 61 70 20 63 61 6e   native heap can
9e60: 6e 6f 74 20 62 65 20 6d 6f 64 69 66 69 65 64 20  not be modified 
9e70: 62 65 63 61 75 73 65 20 69 74 20 6d 61 79 20 62  because it may b
9e80: 65 20 69 6e 20 75 73 65 2e 0a 20 20 20 20 2a 2f  e in use..    */
9e90: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
9ea0: 5f 42 55 53 59 3b 0a 20 20 7d 0a 20 20 73 71 6c  _BUSY;.  }.  sql
9eb0: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
9ec0: 28 70 4d 65 6d 29 3b 0a 20 20 73 71 6c 69 74 65  (pMem);.  sqlite
9ed0: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 4d  3_mutex_leave(pM
9ee0: 61 73 74 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  aster);.  return
9ef0: 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a   rc;.}.#endif /*
9f00: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41   SQLITE_WIN32_MA
9f10: 4c 4c 4f 43 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  LLOC */../*.** T
9f20: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6f 75 74  his function out
9f30: 70 75 74 73 20 74 68 65 20 73 70 65 63 69 66 69  puts the specifi
9f40: 65 64 20 28 41 4e 53 49 29 20 73 74 72 69 6e 67  ed (ANSI) string
9f50: 20 74 6f 20 74 68 65 20 57 69 6e 33 32 20 64 65   to the Win32 de
9f60: 62 75 67 67 65 72 0a 2a 2a 20 28 69 66 20 61 76  bugger.** (if av
9f70: 61 69 6c 61 62 6c 65 29 2e 0a 2a 2f 0a 0a 76 6f  ailable)..*/..vo
9f80: 69 64 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32  id sqlite3_win32
9f90: 5f 77 72 69 74 65 5f 64 65 62 75 67 28 63 6f 6e  _write_debug(con
9fa0: 73 74 20 63 68 61 72 20 2a 7a 42 75 66 2c 20 69  st char *zBuf, i
9fb0: 6e 74 20 6e 42 75 66 29 7b 0a 20 20 63 68 61 72  nt nBuf){.  char
9fc0: 20 7a 44 62 67 42 75 66 5b 53 51 4c 49 54 45 5f   zDbgBuf[SQLITE_
9fd0: 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49  WIN32_DBG_BUF_SI
9fe0: 5a 45 5d 3b 0a 20 20 69 6e 74 20 6e 4d 69 6e 20  ZE];.  int nMin 
9ff0: 3d 20 4d 49 4e 28 6e 42 75 66 2c 20 28 53 51 4c  = MIN(nBuf, (SQL
a000: 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55  ITE_WIN32_DBG_BU
a010: 46 5f 53 49 5a 45 20 2d 20 31 29 29 3b 20 2f 2a  F_SIZE - 1)); /*
a020: 20 6d 61 79 20 62 65 20 6e 65 67 61 74 69 76 65   may be negative
a030: 2e 20 2a 2f 0a 20 20 69 66 28 20 6e 4d 69 6e 3c  . */.  if( nMin<
a040: 2d 31 20 29 20 6e 4d 69 6e 20 3d 20 2d 31 3b 20  -1 ) nMin = -1; 
a050: 2f 2a 20 61 6c 6c 20 6e 65 67 61 74 69 76 65 20  /* all negative 
a060: 76 61 6c 75 65 73 20 62 65 63 6f 6d 65 20 2d 31  values become -1
a070: 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e  . */.  assert( n
a080: 4d 69 6e 3d 3d 2d 31 20 7c 7c 20 6e 4d 69 6e 3d  Min==-1 || nMin=
a090: 3d 30 20 7c 7c 20 6e 4d 69 6e 3c 53 51 4c 49 54  =0 || nMin<SQLIT
a0a0: 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f  E_WIN32_DBG_BUF_
a0b0: 53 49 5a 45 20 29 3b 0a 23 69 66 20 64 65 66 69  SIZE );.#if defi
a0c0: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
a0d0: 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 69 66 28  _HAS_ANSI).  if(
a0e0: 20 6e 4d 69 6e 3e 30 20 29 7b 0a 20 20 20 20 6d   nMin>0 ){.    m
a0f0: 65 6d 73 65 74 28 7a 44 62 67 42 75 66 2c 20 30  emset(zDbgBuf, 0
a100: 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44  , SQLITE_WIN32_D
a110: 42 47 5f 42 55 46 5f 53 49 5a 45 29 3b 0a 20 20  BG_BUF_SIZE);.  
a120: 20 20 6d 65 6d 63 70 79 28 7a 44 62 67 42 75 66    memcpy(zDbgBuf
a130: 2c 20 7a 42 75 66 2c 20 6e 4d 69 6e 29 3b 0a 20  , zBuf, nMin);. 
a140: 20 20 20 6f 73 4f 75 74 70 75 74 44 65 62 75 67     osOutputDebug
a150: 53 74 72 69 6e 67 41 28 7a 44 62 67 42 75 66 29  StringA(zDbgBuf)
a160: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f  ;.  }else{.    o
a170: 73 4f 75 74 70 75 74 44 65 62 75 67 53 74 72 69  sOutputDebugStri
a180: 6e 67 41 28 7a 42 75 66 29 3b 0a 20 20 7d 0a 23  ngA(zBuf);.  }.#
a190: 65 6c 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  elif defined(SQL
a1a0: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
a1b0: 44 45 29 0a 20 20 6d 65 6d 73 65 74 28 7a 44 62  DE).  memset(zDb
a1c0: 67 42 75 66 2c 20 30 2c 20 53 51 4c 49 54 45 5f  gBuf, 0, SQLITE_
a1d0: 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49  WIN32_DBG_BUF_SI
a1e0: 5a 45 29 3b 0a 20 20 69 66 20 28 20 6f 73 4d 75  ZE);.  if ( osMu
a1f0: 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43 68 61  ltiByteToWideCha
a200: 72 28 0a 20 20 20 20 20 20 20 20 20 20 6f 73 41  r(.          osA
a210: 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49 28 29  reFileApisANSI()
a220: 20 3f 20 43 50 5f 41 43 50 20 3a 20 43 50 5f 4f   ? CP_ACP : CP_O
a230: 45 4d 43 50 2c 20 30 2c 20 7a 42 75 66 2c 0a 20  EMCP, 0, zBuf,. 
a240: 20 20 20 20 20 20 20 20 20 6e 4d 69 6e 2c 20 28           nMin, (
a250: 4c 50 57 53 54 52 29 7a 44 62 67 42 75 66 2c 20  LPWSTR)zDbgBuf, 
a260: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47  SQLITE_WIN32_DBG
a270: 5f 42 55 46 5f 53 49 5a 45 2f 73 69 7a 65 6f 66  _BUF_SIZE/sizeof
a280: 28 57 43 48 41 52 29 29 3c 3d 30 20 29 7b 0a 20  (WCHAR))<=0 ){. 
a290: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
a2a0: 20 6f 73 4f 75 74 70 75 74 44 65 62 75 67 53 74   osOutputDebugSt
a2b0: 72 69 6e 67 57 28 28 4c 50 43 57 53 54 52 29 7a  ringW((LPCWSTR)z
a2c0: 44 62 67 42 75 66 29 3b 0a 23 65 6c 73 65 0a 20  DbgBuf);.#else. 
a2d0: 20 69 66 28 20 6e 4d 69 6e 3e 30 20 29 7b 0a 20   if( nMin>0 ){. 
a2e0: 20 20 20 6d 65 6d 73 65 74 28 7a 44 62 67 42 75     memset(zDbgBu
a2f0: 66 2c 20 30 2c 20 53 51 4c 49 54 45 5f 57 49 4e  f, 0, SQLITE_WIN
a300: 33 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 29  32_DBG_BUF_SIZE)
a310: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 44 62  ;.    memcpy(zDb
a320: 67 42 75 66 2c 20 7a 42 75 66 2c 20 6e 4d 69 6e  gBuf, zBuf, nMin
a330: 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73  );.    fprintf(s
a340: 74 64 65 72 72 2c 20 22 25 73 22 2c 20 7a 44 62  tderr, "%s", zDb
a350: 67 42 75 66 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  gBuf);.  }else{.
a360: 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
a370: 72 72 2c 20 22 25 73 22 2c 20 7a 42 75 66 29 3b  rr, "%s", zBuf);
a380: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  .  }.#endif.}../
a390: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
a3a0: 6e 67 20 72 6f 75 74 69 6e 65 20 73 75 73 70 65  ng routine suspe
a3b0: 6e 64 73 20 74 68 65 20 63 75 72 72 65 6e 74 20  nds the current 
a3c0: 74 68 72 65 61 64 20 66 6f 72 20 61 74 20 6c 65  thread for at le
a3d0: 61 73 74 20 6d 73 0a 2a 2a 20 6d 69 6c 6c 69 73  ast ms.** millis
a3e0: 65 63 6f 6e 64 73 2e 20 20 54 68 69 73 20 69 73  econds.  This is
a3f0: 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 74   equivalent to t
a400: 68 65 20 57 69 6e 33 32 20 53 6c 65 65 70 28 29  he Win32 Sleep()
a410: 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 23   interface..*/.#
a420: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
a430: 52 54 0a 73 74 61 74 69 63 20 48 41 4e 44 4c 45  RT.static HANDLE
a440: 20 73 6c 65 65 70 4f 62 6a 20 3d 20 4e 55 4c 4c   sleepObj = NULL
a450: 3b 0a 23 65 6e 64 69 66 0a 0a 76 6f 69 64 20 73  ;.#endif..void s
a460: 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65  qlite3_win32_sle
a470: 65 70 28 44 57 4f 52 44 20 6d 69 6c 6c 69 73 65  ep(DWORD millise
a480: 63 6f 6e 64 73 29 7b 0a 23 69 66 20 53 51 4c 49  conds){.#if SQLI
a490: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 69 66  TE_OS_WINRT.  if
a4a0: 20 28 20 73 6c 65 65 70 4f 62 6a 3d 3d 4e 55 4c   ( sleepObj==NUL
a4b0: 4c 20 29 7b 0a 20 20 20 20 73 6c 65 65 70 4f 62  L ){.    sleepOb
a4c0: 6a 20 3d 20 6f 73 43 72 65 61 74 65 45 76 65 6e  j = osCreateEven
a4d0: 74 45 78 57 28 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c  tExW(NULL, NULL,
a4e0: 20 43 52 45 41 54 45 5f 45 56 45 4e 54 5f 4d 41   CREATE_EVENT_MA
a4f0: 4e 55 41 4c 5f 52 45 53 45 54 2c 0a 20 20 20 20  NUAL_RESET,.    
a500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a510: 20 20 20 20 20 20 20 20 20 20 20 20 53 59 4e 43              SYNC
a520: 48 52 4f 4e 49 5a 45 29 3b 0a 20 20 7d 0a 20 20  HRONIZE);.  }.  
a530: 61 73 73 65 72 74 28 20 73 6c 65 65 70 4f 62 6a  assert( sleepObj
a540: 21 3d 4e 55 4c 4c 20 29 3b 0a 20 20 6f 73 57 61  !=NULL );.  osWa
a550: 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63  itForSingleObjec
a560: 74 45 78 28 73 6c 65 65 70 4f 62 6a 2c 20 6d 69  tEx(sleepObj, mi
a570: 6c 6c 69 73 65 63 6f 6e 64 73 2c 20 46 41 4c 53  lliseconds, FALS
a580: 45 29 3b 0a 23 65 6c 73 65 0a 20 20 6f 73 53 6c  E);.#else.  osSl
a590: 65 65 70 28 6d 69 6c 6c 69 73 65 63 6f 6e 64 73  eep(milliseconds
a5a0: 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  );.#endif.}../*.
a5b0: 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 28  ** Return true (
a5c0: 6e 6f 6e 2d 7a 65 72 6f 29 20 69 66 20 77 65 20  non-zero) if we 
a5d0: 61 72 65 20 72 75 6e 6e 69 6e 67 20 75 6e 64 65  are running unde
a5e0: 72 20 57 69 6e 4e 54 2c 20 57 69 6e 32 4b 2c 20  r WinNT, Win2K, 
a5f0: 57 69 6e 58 50 2c 0a 2a 2a 20 6f 72 20 57 69 6e  WinXP,.** or Win
a600: 43 45 2e 20 20 52 65 74 75 72 6e 20 66 61 6c 73  CE.  Return fals
a610: 65 20 28 7a 65 72 6f 29 20 66 6f 72 20 57 69 6e  e (zero) for Win
a620: 39 35 2c 20 57 69 6e 39 38 2c 20 6f 72 20 57 69  95, Win98, or Wi
a630: 6e 4d 45 2e 0a 2a 2a 0a 2a 2a 20 48 65 72 65 20  nME..**.** Here 
a640: 69 73 20 61 6e 20 69 6e 74 65 72 65 73 74 69 6e  is an interestin
a650: 67 20 6f 62 73 65 72 76 61 74 69 6f 6e 3a 20 20  g observation:  
a660: 57 69 6e 39 35 2c 20 57 69 6e 39 38 2c 20 61 6e  Win95, Win98, an
a670: 64 20 57 69 6e 4d 45 20 6c 61 63 6b 0a 2a 2a 20  d WinME lack.** 
a680: 74 68 65 20 4c 6f 63 6b 46 69 6c 65 45 78 28 29  the LockFileEx()
a690: 20 41 50 49 2e 20 20 42 75 74 20 77 65 20 63 61   API.  But we ca
a6a0: 6e 20 73 74 69 6c 6c 20 73 74 61 74 69 63 61 6c  n still statical
a6b0: 6c 79 20 6c 69 6e 6b 20 61 67 61 69 6e 73 74 20  ly link against 
a6c0: 74 68 61 74 0a 2a 2a 20 41 50 49 20 61 73 20 6c  that.** API as l
a6d0: 6f 6e 67 20 61 73 20 77 65 20 64 6f 6e 27 74 20  ong as we don't 
a6e0: 63 61 6c 6c 20 69 74 20 77 68 65 6e 20 72 75 6e  call it when run
a6f0: 6e 69 6e 67 20 57 69 6e 39 35 2f 39 38 2f 4d 45  ning Win95/98/ME
a700: 2e 20 20 41 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20  .  A call to.** 
a710: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
a720: 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e  used to determin
a730: 65 20 69 66 20 74 68 65 20 68 6f 73 74 20 69 73  e if the host is
a740: 20 57 69 6e 39 35 2f 39 38 2f 4d 45 20 6f 72 0a   Win95/98/ME or.
a750: 2a 2a 20 57 69 6e 4e 54 2f 32 4b 2f 58 50 20 73  ** WinNT/2K/XP s
a760: 6f 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20 6b  o that we will k
a770: 6e 6f 77 20 77 68 65 74 68 65 72 20 6f 72 20 6e  now whether or n
a780: 6f 74 20 77 65 20 63 61 6e 20 73 61 66 65 6c 79  ot we can safely
a790: 20 63 61 6c 6c 0a 2a 2a 20 74 68 65 20 4c 6f 63   call.** the Loc
a7a0: 6b 46 69 6c 65 45 78 28 29 20 41 50 49 2e 0a 2a  kFileEx() API..*
a7b0: 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  /..#if !defined(
a7c0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 47 45 54  SQLITE_WIN32_GET
a7d0: 56 45 52 53 49 4f 4e 45 58 29 20 7c 7c 20 21 53  VERSIONEX) || !S
a7e0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 47 45 54 56  QLITE_WIN32_GETV
a7f0: 45 52 53 49 4f 4e 45 58 0a 23 20 64 65 66 69 6e  ERSIONEX.# defin
a800: 65 20 6f 73 49 73 4e 54 28 29 20 20 28 31 29 0a  e osIsNT()  (1).
a810: 23 65 6c 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  #elif SQLITE_OS_
a820: 57 49 4e 43 45 20 7c 7c 20 53 51 4c 49 54 45 5f  WINCE || SQLITE_
a830: 4f 53 5f 57 49 4e 52 54 20 7c 7c 20 21 64 65 66  OS_WINRT || !def
a840: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
a850: 32 5f 48 41 53 5f 41 4e 53 49 29 0a 23 20 64 65  2_HAS_ANSI).# de
a860: 66 69 6e 65 20 6f 73 49 73 4e 54 28 29 20 20 28  fine osIsNT()  (
a870: 31 29 0a 23 65 6c 69 66 20 21 64 65 66 69 6e 65  1).#elif !define
a880: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
a890: 41 53 5f 57 49 44 45 29 0a 23 20 64 65 66 69 6e  AS_WIDE).# defin
a8a0: 65 20 6f 73 49 73 4e 54 28 29 20 20 28 30 29 0a  e osIsNT()  (0).
a8b0: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 6f  #else.# define o
a8c0: 73 49 73 4e 54 28 29 20 20 28 28 73 71 6c 69 74  sIsNT()  ((sqlit
a8d0: 65 33 5f 6f 73 5f 74 79 70 65 3d 3d 32 29 20 7c  e3_os_type==2) |
a8e0: 7c 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  | sqlite3_win32_
a8f0: 69 73 5f 6e 74 28 29 29 0a 23 65 6e 64 69 66 0a  is_nt()).#endif.
a900: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
a910: 74 69 6f 6e 20 64 65 74 65 72 6d 69 6e 65 73 20  tion determines 
a920: 69 66 20 74 68 65 20 6d 61 63 68 69 6e 65 20 69  if the machine i
a930: 73 20 72 75 6e 6e 69 6e 67 20 61 20 76 65 72 73  s running a vers
a940: 69 6f 6e 20 6f 66 20 57 69 6e 64 6f 77 73 0a 2a  ion of Windows.*
a950: 2a 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 4e  * based on the N
a960: 54 20 6b 65 72 6e 65 6c 2e 0a 2a 2f 0a 69 6e 74  T kernel..*/.int
a970: 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 69   sqlite3_win32_i
a980: 73 5f 6e 74 28 76 6f 69 64 29 7b 0a 23 69 66 20  s_nt(void){.#if 
a990: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
a9a0: 20 20 2f 2a 0a 20 20 2a 2a 20 4e 4f 54 45 3a 20    /*.  ** NOTE: 
a9b0: 54 68 65 20 57 69 6e 52 54 20 73 75 62 2d 70 6c  The WinRT sub-pl
a9c0: 61 74 66 6f 72 6d 20 69 73 20 61 6c 77 61 79 73  atform is always
a9d0: 20 61 73 73 75 6d 65 64 20 74 6f 20 62 65 20 62   assumed to be b
a9e0: 61 73 65 64 20 6f 6e 20 74 68 65 20 4e 54 0a 20  ased on the NT. 
a9f0: 20 2a 2a 20 20 20 20 20 20 20 6b 65 72 6e 65 6c   **       kernel
aa00: 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ..  */.  return 
aa10: 31 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64  1;.#elif defined
aa20: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 47 45  (SQLITE_WIN32_GE
aa30: 54 56 45 52 53 49 4f 4e 45 58 29 20 26 26 20 53  TVERSIONEX) && S
aa40: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 47 45 54 56  QLITE_WIN32_GETV
aa50: 45 52 53 49 4f 4e 45 58 0a 20 20 69 66 28 20 6f  ERSIONEX.  if( o
aa60: 73 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70  sInterlockedComp
aa70: 61 72 65 45 78 63 68 61 6e 67 65 28 26 73 71 6c  areExchange(&sql
aa80: 69 74 65 33 5f 6f 73 5f 74 79 70 65 2c 20 30 2c  ite3_os_type, 0,
aa90: 20 30 29 3d 3d 30 20 29 7b 0a 23 69 66 20 64 65   0)==0 ){.#if de
aaa0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
aab0: 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 20  32_HAS_WIDE).   
aac0: 20 4f 53 56 45 52 53 49 4f 4e 49 4e 46 4f 57 20   OSVERSIONINFOW 
aad0: 73 49 6e 66 6f 3b 0a 20 20 20 20 73 49 6e 66 6f  sInfo;.    sInfo
aae0: 2e 64 77 4f 53 56 65 72 73 69 6f 6e 49 6e 66 6f  .dwOSVersionInfo
aaf0: 53 69 7a 65 20 3d 20 73 69 7a 65 6f 66 28 73 49  Size = sizeof(sI
ab00: 6e 66 6f 29 3b 0a 20 20 20 20 6f 73 47 65 74 56  nfo);.    osGetV
ab10: 65 72 73 69 6f 6e 45 78 57 28 26 73 49 6e 66 6f  ersionExW(&sInfo
ab20: 29 3b 0a 20 20 20 20 6f 73 49 6e 74 65 72 6c 6f  );.    osInterlo
ab30: 63 6b 65 64 43 6f 6d 70 61 72 65 45 78 63 68 61  ckedCompareExcha
ab40: 6e 67 65 28 26 73 71 6c 69 74 65 33 5f 6f 73 5f  nge(&sqlite3_os_
ab50: 74 79 70 65 2c 0a 20 20 20 20 20 20 20 20 28 73  type,.        (s
ab60: 49 6e 66 6f 2e 64 77 50 6c 61 74 66 6f 72 6d 49  Info.dwPlatformI
ab70: 64 20 3d 3d 20 56 45 52 5f 50 4c 41 54 46 4f 52  d == VER_PLATFOR
ab80: 4d 5f 57 49 4e 33 32 5f 4e 54 29 20 3f 20 32 20  M_WIN32_NT) ? 2 
ab90: 3a 20 31 2c 20 30 29 3b 0a 23 65 6c 69 66 20 64  : 1, 0);.#elif d
aba0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
abb0: 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20  N32_HAS_ANSI).  
abc0: 20 20 4f 53 56 45 52 53 49 4f 4e 49 4e 46 4f 41    OSVERSIONINFOA
abd0: 20 73 49 6e 66 6f 3b 0a 20 20 20 20 73 49 6e 66   sInfo;.    sInf
abe0: 6f 2e 64 77 4f 53 56 65 72 73 69 6f 6e 49 6e 66  o.dwOSVersionInf
abf0: 6f 53 69 7a 65 20 3d 20 73 69 7a 65 6f 66 28 73  oSize = sizeof(s
ac00: 49 6e 66 6f 29 3b 0a 20 20 20 20 6f 73 47 65 74  Info);.    osGet
ac10: 56 65 72 73 69 6f 6e 45 78 41 28 26 73 49 6e 66  VersionExA(&sInf
ac20: 6f 29 3b 0a 20 20 20 20 6f 73 49 6e 74 65 72 6c  o);.    osInterl
ac30: 6f 63 6b 65 64 43 6f 6d 70 61 72 65 45 78 63 68  ockedCompareExch
ac40: 61 6e 67 65 28 26 73 71 6c 69 74 65 33 5f 6f 73  ange(&sqlite3_os
ac50: 5f 74 79 70 65 2c 0a 20 20 20 20 20 20 20 20 28  _type,.        (
ac60: 73 49 6e 66 6f 2e 64 77 50 6c 61 74 66 6f 72 6d  sInfo.dwPlatform
ac70: 49 64 20 3d 3d 20 56 45 52 5f 50 4c 41 54 46 4f  Id == VER_PLATFO
ac80: 52 4d 5f 57 49 4e 33 32 5f 4e 54 29 20 3f 20 32  RM_WIN32_NT) ? 2
ac90: 20 3a 20 31 2c 20 30 29 3b 0a 23 65 6e 64 69 66   : 1, 0);.#endif
aca0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6f 73  .  }.  return os
acb0: 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61  InterlockedCompa
acc0: 72 65 45 78 63 68 61 6e 67 65 28 26 73 71 6c 69  reExchange(&sqli
acd0: 74 65 33 5f 6f 73 5f 74 79 70 65 2c 20 32 2c 20  te3_os_type, 2, 
ace0: 32 29 3d 3d 32 3b 0a 23 65 6c 69 66 20 53 51 4c  2)==2;.#elif SQL
acf0: 49 54 45 5f 54 45 53 54 0a 20 20 72 65 74 75 72  ITE_TEST.  retur
ad00: 6e 20 6f 73 49 6e 74 65 72 6c 6f 63 6b 65 64 43  n osInterlockedC
ad10: 6f 6d 70 61 72 65 45 78 63 68 61 6e 67 65 28 26  ompareExchange(&
ad20: 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 2c  sqlite3_os_type,
ad30: 20 32 2c 20 32 29 3d 3d 32 3b 0a 23 65 6c 73 65   2, 2)==2;.#else
ad40: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4e 4f 54 45 3a  .  /*.  ** NOTE:
ad50: 20 41 6c 6c 20 73 75 62 2d 70 6c 61 74 66 6f 72   All sub-platfor
ad60: 6d 73 20 77 68 65 72 65 20 74 68 65 20 47 65 74  ms where the Get
ad70: 56 65 72 73 69 6f 6e 45 78 5b 41 57 5d 20 66 75  VersionEx[AW] fu
ad80: 6e 63 74 69 6f 6e 73 20 61 72 65 0a 20 20 2a 2a  nctions are.  **
ad90: 20 20 20 20 20 20 20 64 65 70 72 65 63 61 74 65         deprecate
ada0: 64 20 61 72 65 20 61 6c 77 61 79 73 20 61 73 73  d are always ass
adb0: 75 6d 65 64 20 74 6f 20 62 65 20 62 61 73 65 64  umed to be based
adc0: 20 6f 6e 20 74 68 65 20 4e 54 20 6b 65 72 6e 65   on the NT kerne
add0: 6c 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e  l..  */.  return
ade0: 20 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 69   1;.#endif.}..#i
adf0: 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  fdef SQLITE_WIN3
ae00: 32 5f 4d 41 4c 4c 4f 43 0a 2f 2a 0a 2a 2a 20 41  2_MALLOC./*.** A
ae10: 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65 73 20 6f  llocate nBytes o
ae20: 66 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61  f memory..*/.sta
ae30: 74 69 63 20 76 6f 69 64 20 2a 77 69 6e 4d 65 6d  tic void *winMem
ae40: 4d 61 6c 6c 6f 63 28 69 6e 74 20 6e 42 79 74 65  Malloc(int nByte
ae50: 73 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 48 65  s){.  HANDLE hHe
ae60: 61 70 3b 0a 20 20 76 6f 69 64 20 2a 70 3b 0a 0a  ap;.  void *p;..
ae70: 20 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61    winMemAssertMa
ae80: 67 69 63 28 29 3b 0a 20 20 68 48 65 61 70 20 3d  gic();.  hHeap =
ae90: 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29   winMemGetHeap()
aea0: 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48 65 61  ;.  assert( hHea
aeb0: 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  p!=0 );.  assert
aec0: 28 20 68 48 65 61 70 21 3d 49 4e 56 41 4c 49 44  ( hHeap!=INVALID
aed0: 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b  _HANDLE_VALUE );
aee0: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
aef0: 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64  WINRT && defined
af00: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41  (SQLITE_WIN32_MA
af10: 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a 20  LLOC_VALIDATE). 
af20: 20 61 73 73 65 72 74 28 20 6f 73 48 65 61 70 56   assert( osHeapV
af30: 61 6c 69 64 61 74 65 28 68 48 65 61 70 2c 20 53  alidate(hHeap, S
af40: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
af50: 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c 29 20 29 3b  _FLAGS, NULL) );
af60: 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74  .#endif.  assert
af70: 28 20 6e 42 79 74 65 73 3e 3d 30 20 29 3b 0a 20  ( nBytes>=0 );. 
af80: 20 70 20 3d 20 6f 73 48 65 61 70 41 6c 6c 6f 63   p = osHeapAlloc
af90: 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57  (hHeap, SQLITE_W
afa0: 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c  IN32_HEAP_FLAGS,
afb0: 20 28 53 49 5a 45 5f 54 29 6e 42 79 74 65 73 29   (SIZE_T)nBytes)
afc0: 3b 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20  ;.  if( !p ){.  
afd0: 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51    sqlite3_log(SQ
afe0: 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69  LITE_NOMEM, "fai
aff0: 6c 65 64 20 74 6f 20 48 65 61 70 41 6c 6c 6f 63  led to HeapAlloc
b000: 20 25 75 20 62 79 74 65 73 20 28 25 6c 75 29 2c   %u bytes (%lu),
b010: 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20 20   heap=%p",.     
b020: 20 20 20 20 20 20 20 20 20 20 20 6e 42 79 74 65             nByte
b030: 73 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f  s, osGetLastErro
b040: 72 28 29 2c 20 28 76 6f 69 64 2a 29 68 48 65 61  r(), (void*)hHea
b050: 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  p);.  }.  return
b060: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65   p;.}../*.** Fre
b070: 65 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61  e memory..*/.sta
b080: 74 69 63 20 76 6f 69 64 20 77 69 6e 4d 65 6d 46  tic void winMemF
b090: 72 65 65 28 76 6f 69 64 20 2a 70 50 72 69 6f 72  ree(void *pPrior
b0a0: 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 48 65 61  ){.  HANDLE hHea
b0b0: 70 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65  p;..  winMemAsse
b0c0: 72 74 4d 61 67 69 63 28 29 3b 0a 20 20 68 48 65  rtMagic();.  hHe
b0d0: 61 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74 48 65  ap = winMemGetHe
b0e0: 61 70 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ap();.  assert( 
b0f0: 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61 73  hHeap!=0 );.  as
b100: 73 65 72 74 28 20 68 48 65 61 70 21 3d 49 4e 56  sert( hHeap!=INV
b110: 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
b120: 45 20 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45  E );.#if !SQLITE
b130: 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66  _OS_WINRT && def
b140: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
b150: 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54  2_MALLOC_VALIDAT
b160: 45 29 0a 20 20 61 73 73 65 72 74 28 20 6f 73 48  E).  assert( osH
b170: 65 61 70 56 61 6c 69 64 61 74 65 28 68 48 65 61  eapValidate(hHea
b180: 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  p, SQLITE_WIN32_
b190: 48 45 41 50 5f 46 4c 41 47 53 2c 20 70 50 72 69  HEAP_FLAGS, pPri
b1a0: 6f 72 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  or) );.#endif.  
b1b0: 69 66 28 20 21 70 50 72 69 6f 72 20 29 20 72 65  if( !pPrior ) re
b1c0: 74 75 72 6e 3b 20 2f 2a 20 50 61 73 73 69 6e 67  turn; /* Passing
b1d0: 20 4e 55 4c 4c 20 74 6f 20 48 65 61 70 46 72 65   NULL to HeapFre
b1e0: 65 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 20  e is undefined. 
b1f0: 2a 2f 0a 20 20 69 66 28 20 21 6f 73 48 65 61 70  */.  if( !osHeap
b200: 46 72 65 65 28 68 48 65 61 70 2c 20 53 51 4c 49  Free(hHeap, SQLI
b210: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c  TE_WIN32_HEAP_FL
b220: 41 47 53 2c 20 70 50 72 69 6f 72 29 20 29 7b 0a  AGS, pPrior) ){.
b230: 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
b240: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66  SQLITE_NOMEM, "f
b250: 61 69 6c 65 64 20 74 6f 20 48 65 61 70 46 72 65  ailed to HeapFre
b260: 65 20 62 6c 6f 63 6b 20 25 70 20 28 25 6c 75 29  e block %p (%lu)
b270: 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20  , heap=%p",.    
b280: 20 20 20 20 20 20 20 20 20 20 20 20 70 50 72 69              pPri
b290: 6f 72 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72  or, osGetLastErr
b2a0: 6f 72 28 29 2c 20 28 76 6f 69 64 2a 29 68 48 65  or(), (void*)hHe
b2b0: 61 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ap);.  }.}../*.*
b2c0: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 73 69 7a  * Change the siz
b2d0: 65 20 6f 66 20 61 6e 20 65 78 69 73 74 69 6e 67  e of an existing
b2e0: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
b2f0: 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  on.*/.static voi
b300: 64 20 2a 77 69 6e 4d 65 6d 52 65 61 6c 6c 6f 63  d *winMemRealloc
b310: 28 76 6f 69 64 20 2a 70 50 72 69 6f 72 2c 20 69  (void *pPrior, i
b320: 6e 74 20 6e 42 79 74 65 73 29 7b 0a 20 20 48 41  nt nBytes){.  HA
b330: 4e 44 4c 45 20 68 48 65 61 70 3b 0a 20 20 76 6f  NDLE hHeap;.  vo
b340: 69 64 20 2a 70 3b 0a 0a 20 20 77 69 6e 4d 65 6d  id *p;..  winMem
b350: 41 73 73 65 72 74 4d 61 67 69 63 28 29 3b 0a 20  AssertMagic();. 
b360: 20 68 48 65 61 70 20 3d 20 77 69 6e 4d 65 6d 47   hHeap = winMemG
b370: 65 74 48 65 61 70 28 29 3b 0a 20 20 61 73 73 65  etHeap();.  asse
b380: 72 74 28 20 68 48 65 61 70 21 3d 30 20 29 3b 0a  rt( hHeap!=0 );.
b390: 20 20 61 73 73 65 72 74 28 20 68 48 65 61 70 21    assert( hHeap!
b3a0: 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f  =INVALID_HANDLE_
b3b0: 56 41 4c 55 45 20 29 3b 0a 23 69 66 20 21 53 51  VALUE );.#if !SQ
b3c0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
b3d0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
b3e0: 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c  WIN32_MALLOC_VAL
b3f0: 49 44 41 54 45 29 0a 20 20 61 73 73 65 72 74 28  IDATE).  assert(
b400: 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74 65 28   osHeapValidate(
b410: 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49  hHeap, SQLITE_WI
b420: 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20  N32_HEAP_FLAGS, 
b430: 70 50 72 69 6f 72 29 20 29 3b 0a 23 65 6e 64 69  pPrior) );.#endi
b440: 66 0a 20 20 61 73 73 65 72 74 28 20 6e 42 79 74  f.  assert( nByt
b450: 65 73 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 21  es>=0 );.  if( !
b460: 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 70 20  pPrior ){.    p 
b470: 3d 20 6f 73 48 65 61 70 41 6c 6c 6f 63 28 68 48  = osHeapAlloc(hH
b480: 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33  eap, SQLITE_WIN3
b490: 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 28 53  2_HEAP_FLAGS, (S
b4a0: 49 5a 45 5f 54 29 6e 42 79 74 65 73 29 3b 0a 20  IZE_T)nBytes);. 
b4b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20   }else{.    p = 
b4c0: 6f 73 48 65 61 70 52 65 41 6c 6c 6f 63 28 68 48  osHeapReAlloc(hH
b4d0: 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33  eap, SQLITE_WIN3
b4e0: 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 70 50  2_HEAP_FLAGS, pP
b4f0: 72 69 6f 72 2c 20 28 53 49 5a 45 5f 54 29 6e 42  rior, (SIZE_T)nB
b500: 79 74 65 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ytes);.  }.  if(
b510: 20 21 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74   !p ){.    sqlit
b520: 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f  e3_log(SQLITE_NO
b530: 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f 20  MEM, "failed to 
b540: 25 73 20 25 75 20 62 79 74 65 73 20 28 25 6c 75  %s %u bytes (%lu
b550: 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20  ), heap=%p",.   
b560: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 72               pPr
b570: 69 6f 72 20 3f 20 22 48 65 61 70 52 65 41 6c 6c  ior ? "HeapReAll
b580: 6f 63 22 20 3a 20 22 48 65 61 70 41 6c 6c 6f 63  oc" : "HeapAlloc
b590: 22 2c 20 6e 42 79 74 65 73 2c 20 6f 73 47 65 74  ", nBytes, osGet
b5a0: 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20  LastError(),.   
b5b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f               (vo
b5c0: 69 64 2a 29 68 48 65 61 70 29 3b 0a 20 20 7d 0a  id*)hHeap);.  }.
b5d0: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
b5e0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
b5f0: 73 69 7a 65 20 6f 66 20 61 6e 20 6f 75 74 73 74  size of an outst
b600: 61 6e 64 69 6e 67 20 61 6c 6c 6f 63 61 74 69 6f  anding allocatio
b610: 6e 2c 20 69 6e 20 62 79 74 65 73 2e 0a 2a 2f 0a  n, in bytes..*/.
b620: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 65  static int winMe
b630: 6d 53 69 7a 65 28 76 6f 69 64 20 2a 70 29 7b 0a  mSize(void *p){.
b640: 20 20 48 41 4e 44 4c 45 20 68 48 65 61 70 3b 0a    HANDLE hHeap;.
b650: 20 20 53 49 5a 45 5f 54 20 6e 3b 0a 0a 20 20 77    SIZE_T n;..  w
b660: 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63  inMemAssertMagic
b670: 28 29 3b 0a 20 20 68 48 65 61 70 20 3d 20 77 69  ();.  hHeap = wi
b680: 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 3b 0a 20  nMemGetHeap();. 
b690: 20 61 73 73 65 72 74 28 20 68 48 65 61 70 21 3d   assert( hHeap!=
b6a0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68  0 );.  assert( h
b6b0: 48 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41  Heap!=INVALID_HA
b6c0: 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69  NDLE_VALUE );.#i
b6d0: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
b6e0: 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  RT && defined(SQ
b6f0: 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f  LITE_WIN32_MALLO
b700: 43 5f 56 41 4c 49 44 41 54 45 29 0a 20 20 61 73  C_VALIDATE).  as
b710: 73 65 72 74 28 20 6f 73 48 65 61 70 56 61 6c 69  sert( osHeapVali
b720: 64 61 74 65 28 68 48 65 61 70 2c 20 53 51 4c 49  date(hHeap, SQLI
b730: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c  TE_WIN32_HEAP_FL
b740: 41 47 53 2c 20 70 29 20 29 3b 0a 23 65 6e 64 69  AGS, p) );.#endi
b750: 66 0a 20 20 69 66 28 20 21 70 20 29 20 72 65 74  f.  if( !p ) ret
b760: 75 72 6e 20 30 3b 0a 20 20 6e 20 3d 20 6f 73 48  urn 0;.  n = osH
b770: 65 61 70 53 69 7a 65 28 68 48 65 61 70 2c 20 53  eapSize(hHeap, S
b780: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
b790: 5f 46 4c 41 47 53 2c 20 70 29 3b 0a 20 20 69 66  _FLAGS, p);.  if
b7a0: 28 20 6e 3d 3d 28 53 49 5a 45 5f 54 29 2d 31 20  ( n==(SIZE_T)-1 
b7b0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c  ){.    sqlite3_l
b7c0: 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c  og(SQLITE_NOMEM,
b7d0: 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65 61 70   "failed to Heap
b7e0: 53 69 7a 65 20 62 6c 6f 63 6b 20 25 70 20 28 25  Size block %p (%
b7f0: 6c 75 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20  lu), heap=%p",. 
b800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
b810: 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  , osGetLastError
b820: 28 29 2c 20 28 76 6f 69 64 2a 29 68 48 65 61 70  (), (void*)hHeap
b830: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
b840: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 69  .  }.  return (i
b850: 6e 74 29 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  nt)n;.}../*.** R
b860: 6f 75 6e 64 20 75 70 20 61 20 72 65 71 75 65 73  ound up a reques
b870: 74 20 73 69 7a 65 20 74 6f 20 74 68 65 20 6e 65  t size to the ne
b880: 78 74 20 76 61 6c 69 64 20 61 6c 6c 6f 63 61 74  xt valid allocat
b890: 69 6f 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61  ion size..*/.sta
b8a0: 74 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d 52 6f  tic int winMemRo
b8b0: 75 6e 64 75 70 28 69 6e 74 20 6e 29 7b 0a 20 20  undup(int n){.  
b8c0: 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a  return n;.}../*.
b8d0: 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  ** Initialize th
b8e0: 69 73 20 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a 73 74  is module..*/.st
b8f0: 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d 49  atic int winMemI
b900: 6e 69 74 28 76 6f 69 64 20 2a 70 41 70 70 44 61  nit(void *pAppDa
b910: 74 61 29 7b 0a 20 20 77 69 6e 4d 65 6d 44 61 74  ta){.  winMemDat
b920: 61 20 2a 70 57 69 6e 4d 65 6d 44 61 74 61 20 3d  a *pWinMemData =
b930: 20 28 77 69 6e 4d 65 6d 44 61 74 61 20 2a 29 70   (winMemData *)p
b940: 41 70 70 44 61 74 61 3b 0a 0a 20 20 69 66 28 20  AppData;..  if( 
b950: 21 70 57 69 6e 4d 65 6d 44 61 74 61 20 29 20 72  !pWinMemData ) r
b960: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
b970: 4f 52 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57  OR;.  assert( pW
b980: 69 6e 4d 65 6d 44 61 74 61 2d 3e 6d 61 67 69 63  inMemData->magic
b990: 31 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 31  1==WINMEM_MAGIC1
b9a0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57   );.  assert( pW
b9b0: 69 6e 4d 65 6d 44 61 74 61 2d 3e 6d 61 67 69 63  inMemData->magic
b9c0: 32 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 32  2==WINMEM_MAGIC2
b9d0: 20 29 3b 0a 0a 23 69 66 20 21 53 51 4c 49 54 45   );..#if !SQLITE
b9e0: 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 53 51 4c  _OS_WINRT && SQL
b9f0: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 43  ITE_WIN32_HEAP_C
ba00: 52 45 41 54 45 0a 20 20 69 66 28 20 21 70 57 69  REATE.  if( !pWi
ba10: 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20  nMemData->hHeap 
ba20: 29 7b 0a 20 20 20 20 44 57 4f 52 44 20 64 77 49  ){.    DWORD dwI
ba30: 6e 69 74 69 61 6c 53 69 7a 65 20 3d 20 53 51 4c  nitialSize = SQL
ba40: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 49  ITE_WIN32_HEAP_I
ba50: 4e 49 54 5f 53 49 5a 45 3b 0a 20 20 20 20 44 57  NIT_SIZE;.    DW
ba60: 4f 52 44 20 64 77 4d 61 78 69 6d 75 6d 53 69 7a  ORD dwMaximumSiz
ba70: 65 20 3d 20 28 44 57 4f 52 44 29 73 71 6c 69 74  e = (DWORD)sqlit
ba80: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e  e3GlobalConfig.n
ba90: 48 65 61 70 3b 0a 20 20 20 20 69 66 28 20 64 77  Heap;.    if( dw
baa0: 4d 61 78 69 6d 75 6d 53 69 7a 65 3d 3d 30 20 29  MaximumSize==0 )
bab0: 7b 0a 20 20 20 20 20 20 64 77 4d 61 78 69 6d 75  {.      dwMaximu
bac0: 6d 53 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f 57  mSize = SQLITE_W
bad0: 49 4e 33 32 5f 48 45 41 50 5f 4d 41 58 5f 53 49  IN32_HEAP_MAX_SI
bae0: 5a 45 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ZE;.    }else if
baf0: 28 20 64 77 49 6e 69 74 69 61 6c 53 69 7a 65 3e  ( dwInitialSize>
bb00: 64 77 4d 61 78 69 6d 75 6d 53 69 7a 65 20 29 7b  dwMaximumSize ){
bb10: 0a 20 20 20 20 20 20 64 77 49 6e 69 74 69 61 6c  .      dwInitial
bb20: 53 69 7a 65 20 3d 20 64 77 4d 61 78 69 6d 75 6d  Size = dwMaximum
bb30: 53 69 7a 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Size;.    }.    
bb40: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65  pWinMemData->hHe
bb50: 61 70 20 3d 20 6f 73 48 65 61 70 43 72 65 61 74  ap = osHeapCreat
bb60: 65 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  e(SQLITE_WIN32_H
bb70: 45 41 50 5f 46 4c 41 47 53 2c 0a 20 20 20 20 20  EAP_FLAGS,.     
bb80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bba0: 20 64 77 49 6e 69 74 69 61 6c 53 69 7a 65 2c 20   dwInitialSize, 
bbb0: 64 77 4d 61 78 69 6d 75 6d 53 69 7a 65 29 3b 0a  dwMaximumSize);.
bbc0: 20 20 20 20 69 66 28 20 21 70 57 69 6e 4d 65 6d      if( !pWinMem
bbd0: 44 61 74 61 2d 3e 68 48 65 61 70 20 29 7b 0a 20  Data->hHeap ){. 
bbe0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67       sqlite3_log
bbf0: 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 0a 20  (SQLITE_NOMEM,. 
bc00: 20 20 20 20 20 20 20 20 20 22 66 61 69 6c 65 64           "failed
bc10: 20 74 6f 20 48 65 61 70 43 72 65 61 74 65 20 28   to HeapCreate (
bc20: 25 6c 75 29 2c 20 66 6c 61 67 73 3d 25 75 2c 20  %lu), flags=%u, 
bc30: 69 6e 69 74 53 69 7a 65 3d 25 6c 75 2c 20 6d 61  initSize=%lu, ma
bc40: 78 53 69 7a 65 3d 25 6c 75 22 2c 0a 20 20 20 20  xSize=%lu",.    
bc50: 20 20 20 20 20 20 6f 73 47 65 74 4c 61 73 74 45        osGetLastE
bc60: 72 72 6f 72 28 29 2c 20 53 51 4c 49 54 45 5f 57  rror(), SQLITE_W
bc70: 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c  IN32_HEAP_FLAGS,
bc80: 20 64 77 49 6e 69 74 69 61 6c 53 69 7a 65 2c 0a   dwInitialSize,.
bc90: 20 20 20 20 20 20 20 20 20 20 64 77 4d 61 78 69            dwMaxi
bca0: 6d 75 6d 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  mumSize);.      
bcb0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
bcc0: 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  MEM;.    }.    p
bcd0: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e  WinMemData->bOwn
bce0: 65 64 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 61  ed = TRUE;.    a
bcf0: 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61  ssert( pWinMemDa
bd00: 74 61 2d 3e 62 4f 77 6e 65 64 20 29 3b 0a 20 20  ta->bOwned );.  
bd10: 7d 0a 23 65 6c 73 65 0a 20 20 70 57 69 6e 4d 65  }.#else.  pWinMe
bd20: 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 3d 20 6f  mData->hHeap = o
bd30: 73 47 65 74 50 72 6f 63 65 73 73 48 65 61 70 28  sGetProcessHeap(
bd40: 29 3b 0a 20 20 69 66 28 20 21 70 57 69 6e 4d 65  );.  if( !pWinMe
bd50: 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 29 7b 0a  mData->hHeap ){.
bd60: 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
bd70: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 0a 20 20  SQLITE_NOMEM,.  
bd80: 20 20 20 20 20 20 22 66 61 69 6c 65 64 20 74 6f        "failed to
bd90: 20 47 65 74 50 72 6f 63 65 73 73 48 65 61 70 20   GetProcessHeap 
bda0: 28 25 6c 75 29 22 2c 20 6f 73 47 65 74 4c 61 73  (%lu)", osGetLas
bdb0: 74 45 72 72 6f 72 28 29 29 3b 0a 20 20 20 20 72  tError());.    r
bdc0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
bdd0: 45 4d 3b 0a 20 20 7d 0a 20 20 70 57 69 6e 4d 65  EM;.  }.  pWinMe
bde0: 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20 3d 20  mData->bOwned = 
bdf0: 46 41 4c 53 45 3b 0a 20 20 61 73 73 65 72 74 28  FALSE;.  assert(
be00: 20 21 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62   !pWinMemData->b
be10: 4f 77 6e 65 64 20 29 3b 0a 23 65 6e 64 69 66 0a  Owned );.#endif.
be20: 20 20 61 73 73 65 72 74 28 20 70 57 69 6e 4d 65    assert( pWinMe
be30: 6d 44 61 74 61 2d 3e 68 48 65 61 70 21 3d 30 20  mData->hHeap!=0 
be40: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57 69  );.  assert( pWi
be50: 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 21  nMemData->hHeap!
be60: 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f  =INVALID_HANDLE_
be70: 56 41 4c 55 45 20 29 3b 0a 23 69 66 20 21 53 51  VALUE );.#if !SQ
be80: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
be90: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
bea0: 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c  WIN32_MALLOC_VAL
beb0: 49 44 41 54 45 29 0a 20 20 61 73 73 65 72 74 28  IDATE).  assert(
bec0: 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74 65 28   osHeapValidate(
bed0: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65  pWinMemData->hHe
bee0: 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ap, SQLITE_WIN32
bef0: 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 4e 55 4c  _HEAP_FLAGS, NUL
bf00: 4c 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72  L) );.#endif.  r
bf10: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
bf20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 69 6e 69 74  .}../*.** Deinit
bf30: 69 61 6c 69 7a 65 20 74 68 69 73 20 6d 6f 64 75  ialize this modu
bf40: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  le..*/.static vo
bf50: 69 64 20 77 69 6e 4d 65 6d 53 68 75 74 64 6f 77  id winMemShutdow
bf60: 6e 28 76 6f 69 64 20 2a 70 41 70 70 44 61 74 61  n(void *pAppData
bf70: 29 7b 0a 20 20 77 69 6e 4d 65 6d 44 61 74 61 20  ){.  winMemData 
bf80: 2a 70 57 69 6e 4d 65 6d 44 61 74 61 20 3d 20 28  *pWinMemData = (
bf90: 77 69 6e 4d 65 6d 44 61 74 61 20 2a 29 70 41 70  winMemData *)pAp
bfa0: 70 44 61 74 61 3b 0a 0a 20 20 69 66 28 20 21 70  pData;..  if( !p
bfb0: 57 69 6e 4d 65 6d 44 61 74 61 20 29 20 72 65 74  WinMemData ) ret
bfc0: 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70  urn;.  assert( p
bfd0: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 6d 61 67 69  WinMemData->magi
bfe0: 63 31 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49 43  c1==WINMEM_MAGIC
bff0: 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  1 );.  assert( p
c000: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 6d 61 67 69  WinMemData->magi
c010: 63 32 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49 43  c2==WINMEM_MAGIC
c020: 32 20 29 3b 0a 0a 20 20 69 66 28 20 70 57 69 6e  2 );..  if( pWin
c030: 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 29  MemData->hHeap )
c040: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 57  {.    assert( pW
c050: 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70  inMemData->hHeap
c060: 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  !=INVALID_HANDLE
c070: 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66 20 21 53  _VALUE );.#if !S
c080: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26  QLITE_OS_WINRT &
c090: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
c0a0: 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41  _WIN32_MALLOC_VA
c0b0: 4c 49 44 41 54 45 29 0a 20 20 20 20 61 73 73 65  LIDATE).    asse
c0c0: 72 74 28 20 6f 73 48 65 61 70 56 61 6c 69 64 61  rt( osHeapValida
c0d0: 74 65 28 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e  te(pWinMemData->
c0e0: 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49  hHeap, SQLITE_WI
c0f0: 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20  N32_HEAP_FLAGS, 
c100: 4e 55 4c 4c 29 20 29 3b 0a 23 65 6e 64 69 66 0a  NULL) );.#endif.
c110: 20 20 20 20 69 66 28 20 70 57 69 6e 4d 65 6d 44      if( pWinMemD
c120: 61 74 61 2d 3e 62 4f 77 6e 65 64 20 29 7b 0a 20  ata->bOwned ){. 
c130: 20 20 20 20 20 69 66 28 20 21 6f 73 48 65 61 70       if( !osHeap
c140: 44 65 73 74 72 6f 79 28 70 57 69 6e 4d 65 6d 44  Destroy(pWinMemD
c150: 61 74 61 2d 3e 68 48 65 61 70 29 20 29 7b 0a 20  ata->hHeap) ){. 
c160: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c         sqlite3_l
c170: 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c  og(SQLITE_NOMEM,
c180: 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65 61 70   "failed to Heap
c190: 44 65 73 74 72 6f 79 20 28 25 6c 75 29 2c 20 68  Destroy (%lu), h
c1a0: 65 61 70 3d 25 70 22 2c 0a 20 20 20 20 20 20 20  eap=%p",.       
c1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47               osG
c1c0: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 28  etLastError(), (
c1d0: 76 6f 69 64 2a 29 70 57 69 6e 4d 65 6d 44 61 74  void*)pWinMemDat
c1e0: 61 2d 3e 68 48 65 61 70 29 3b 0a 20 20 20 20 20  a->hHeap);.     
c1f0: 20 7d 0a 20 20 20 20 20 20 70 57 69 6e 4d 65 6d   }.      pWinMem
c200: 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20 3d 20 46  Data->bOwned = F
c210: 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ALSE;.    }.    
c220: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65  pWinMemData->hHe
c230: 61 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 7d  ap = NULL;.  }.}
c240: 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70 75 6c 61 74 65  ../*.** Populate
c250: 20 74 68 65 20 6c 6f 77 2d 6c 65 76 65 6c 20 6d   the low-level m
c260: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
c270: 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65   function pointe
c280: 72 73 20 69 6e 0a 2a 2a 20 73 71 6c 69 74 65 33  rs in.** sqlite3
c290: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 20 77  GlobalConfig.m w
c2a0: 69 74 68 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  ith pointers to 
c2b0: 74 68 65 20 72 6f 75 74 69 6e 65 73 20 69 6e 20  the routines in 
c2c0: 74 68 69 73 20 66 69 6c 65 2e 20 54 68 65 0a 2a  this file. The.*
c2d0: 2a 20 61 72 67 75 6d 65 6e 74 73 20 73 70 65 63  * arguments spec
c2e0: 69 66 79 20 74 68 65 20 62 6c 6f 63 6b 20 6f 66  ify the block of
c2f0: 20 6d 65 6d 6f 72 79 20 74 6f 20 6d 61 6e 61 67   memory to manag
c300: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
c310: 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61  utine is only ca
c320: 6c 6c 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f  lled by sqlite3_
c330: 63 6f 6e 66 69 67 28 29 2c 20 61 6e 64 20 74 68  config(), and th
c340: 65 72 65 66 6f 72 65 0a 2a 2a 20 69 73 20 6e 6f  erefore.** is no
c350: 74 20 72 65 71 75 69 72 65 64 20 74 6f 20 62 65  t required to be
c360: 20 74 68 72 65 61 64 73 61 66 65 20 28 69 74 20   threadsafe (it 
c370: 69 73 20 6e 6f 74 29 2e 0a 2a 2f 0a 63 6f 6e 73  is not)..*/.cons
c380: 74 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65  t sqlite3_mem_me
c390: 74 68 6f 64 73 20 2a 73 71 6c 69 74 65 33 4d 65  thods *sqlite3Me
c3a0: 6d 47 65 74 57 69 6e 33 32 28 76 6f 69 64 29 7b  mGetWin32(void){
c3b0: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
c3c0: 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68  sqlite3_mem_meth
c3d0: 6f 64 73 20 77 69 6e 4d 65 6d 4d 65 74 68 6f 64  ods winMemMethod
c3e0: 73 20 3d 20 7b 0a 20 20 20 20 77 69 6e 4d 65 6d  s = {.    winMem
c3f0: 4d 61 6c 6c 6f 63 2c 0a 20 20 20 20 77 69 6e 4d  Malloc,.    winM
c400: 65 6d 46 72 65 65 2c 0a 20 20 20 20 77 69 6e 4d  emFree,.    winM
c410: 65 6d 52 65 61 6c 6c 6f 63 2c 0a 20 20 20 20 77  emRealloc,.    w
c420: 69 6e 4d 65 6d 53 69 7a 65 2c 0a 20 20 20 20 77  inMemSize,.    w
c430: 69 6e 4d 65 6d 52 6f 75 6e 64 75 70 2c 0a 20 20  inMemRoundup,.  
c440: 20 20 77 69 6e 4d 65 6d 49 6e 69 74 2c 0a 20 20    winMemInit,.  
c450: 20 20 77 69 6e 4d 65 6d 53 68 75 74 64 6f 77 6e    winMemShutdown
c460: 2c 0a 20 20 20 20 26 77 69 6e 5f 6d 65 6d 5f 64  ,.    &win_mem_d
c470: 61 74 61 0a 20 20 7d 3b 0a 20 20 72 65 74 75 72  ata.  };.  retur
c480: 6e 20 26 77 69 6e 4d 65 6d 4d 65 74 68 6f 64 73  n &winMemMethods
c490: 3b 0a 7d 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65  ;.}..void sqlite
c4a0: 33 4d 65 6d 53 65 74 44 65 66 61 75 6c 74 28 76  3MemSetDefault(v
c4b0: 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  oid){.  sqlite3_
c4c0: 63 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f 43 4f  config(SQLITE_CO
c4d0: 4e 46 49 47 5f 4d 41 4c 4c 4f 43 2c 20 73 71 6c  NFIG_MALLOC, sql
c4e0: 69 74 65 33 4d 65 6d 47 65 74 57 69 6e 33 32 28  ite3MemGetWin32(
c4f0: 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ));.}.#endif /* 
c500: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c  SQLITE_WIN32_MAL
c510: 4c 4f 43 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f  LOC */../*.** Co
c520: 6e 76 65 72 74 20 61 20 55 54 46 2d 38 20 73 74  nvert a UTF-8 st
c530: 72 69 6e 67 20 74 6f 20 4d 69 63 72 6f 73 6f 66  ring to Microsof
c540: 74 20 55 6e 69 63 6f 64 65 20 28 55 54 46 2d 31  t Unicode (UTF-1
c550: 36 3f 29 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65  6?)..**.** Space
c560: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74   to hold the ret
c570: 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73 20  urned string is 
c580: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61  obtained from ma
c590: 6c 6c 6f 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lloc..*/.static 
c5a0: 4c 50 57 53 54 52 20 77 69 6e 55 74 66 38 54 6f  LPWSTR winUtf8To
c5b0: 55 6e 69 63 6f 64 65 28 63 6f 6e 73 74 20 63 68  Unicode(const ch
c5c0: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a  ar *zFilename){.
c5d0: 20 20 69 6e 74 20 6e 43 68 61 72 3b 0a 20 20 4c    int nChar;.  L
c5e0: 50 57 53 54 52 20 7a 57 69 64 65 46 69 6c 65 6e  PWSTR zWideFilen
c5f0: 61 6d 65 3b 0a 0a 20 20 6e 43 68 61 72 20 3d 20  ame;..  nChar = 
c600: 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64  osMultiByteToWid
c610: 65 43 68 61 72 28 43 50 5f 55 54 46 38 2c 20 30  eChar(CP_UTF8, 0
c620: 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c  , zFilename, -1,
c630: 20 4e 55 4c 4c 2c 20 30 29 3b 0a 20 20 69 66 28   NULL, 0);.  if(
c640: 20 6e 43 68 61 72 3d 3d 30 20 29 7b 0a 20 20 20   nChar==0 ){.   
c650: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
c660: 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 20 3d   zWideFilename =
c670: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
c680: 72 6f 28 20 6e 43 68 61 72 2a 73 69 7a 65 6f 66  ro( nChar*sizeof
c690: 28 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 5b 30  (zWideFilename[0
c6a0: 5d 29 20 29 3b 0a 20 20 69 66 28 20 7a 57 69 64  ]) );.  if( zWid
c6b0: 65 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a  eFilename==0 ){.
c6c0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
c6d0: 7d 0a 20 20 6e 43 68 61 72 20 3d 20 6f 73 4d 75  }.  nChar = osMu
c6e0: 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43 68 61  ltiByteToWideCha
c6f0: 72 28 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a 46  r(CP_UTF8, 0, zF
c700: 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a 57 69  ilename, -1, zWi
c710: 64 65 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20  deFilename,.    
c720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c730: 20 20 20 20 20 20 20 20 20 20 20 20 6e 43 68 61              nCha
c740: 72 29 3b 0a 20 20 69 66 28 20 6e 43 68 61 72 3d  r);.  if( nChar=
c750: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
c760: 33 5f 66 72 65 65 28 7a 57 69 64 65 46 69 6c 65  3_free(zWideFile
c770: 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 57 69 64 65  name);.    zWide
c780: 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20  Filename = 0;.  
c790: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 57 69 64 65  }.  return zWide
c7a0: 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a  Filename;.}../*.
c7b0: 2a 2a 20 43 6f 6e 76 65 72 74 20 4d 69 63 72 6f  ** Convert Micro
c7c0: 73 6f 66 74 20 55 6e 69 63 6f 64 65 20 74 6f 20  soft Unicode to 
c7d0: 55 54 46 2d 38 2e 20 20 53 70 61 63 65 20 74 6f  UTF-8.  Space to
c7e0: 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e   hold the return
c7f0: 65 64 20 73 74 72 69 6e 67 20 69 73 0a 2a 2a 20  ed string is.** 
c800: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
c810: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a  lite3_malloc()..
c820: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
c830: 77 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66 38  winUnicodeToUtf8
c840: 28 4c 50 43 57 53 54 52 20 7a 57 69 64 65 46 69  (LPCWSTR zWideFi
c850: 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 6e  lename){.  int n
c860: 42 79 74 65 3b 0a 20 20 63 68 61 72 20 2a 7a 46  Byte;.  char *zF
c870: 69 6c 65 6e 61 6d 65 3b 0a 0a 20 20 6e 42 79 74  ilename;..  nByt
c880: 65 20 3d 20 6f 73 57 69 64 65 43 68 61 72 54 6f  e = osWideCharTo
c890: 4d 75 6c 74 69 42 79 74 65 28 43 50 5f 55 54 46  MultiByte(CP_UTF
c8a0: 38 2c 20 30 2c 20 7a 57 69 64 65 46 69 6c 65 6e  8, 0, zWideFilen
c8b0: 61 6d 65 2c 20 2d 31 2c 20 30 2c 20 30 2c 20 30  ame, -1, 0, 0, 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 72 65  e == 0 ){.    re
c8e0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 46  turn 0;.  }.  zF
c8f0: 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ilename = sqlite
c900: 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42 79  3MallocZero( nBy
c910: 74 65 20 29 3b 0a 20 20 69 66 28 20 7a 46 69 6c  te );.  if( zFil
c920: 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  ename==0 ){.    
c930: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
c940: 6e 42 79 74 65 20 3d 20 6f 73 57 69 64 65 43 68  nByte = osWideCh
c950: 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 28 43 50  arToMultiByte(CP
c960: 5f 55 54 46 38 2c 20 30 2c 20 7a 57 69 64 65 46  _UTF8, 0, zWideF
c970: 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a 46 69  ilename, -1, zFi
c980: 6c 65 6e 61 6d 65 2c 20 6e 42 79 74 65 2c 0a 20  lename, nByte,. 
c990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
c9b0: 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e 42 79 74  , 0);.  if( nByt
c9c0: 65 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20 73 71  e == 0 ){.    sq
c9d0: 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 69 6c 65  lite3_free(zFile
c9e0: 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 46 69 6c 65  name);.    zFile
c9f0: 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  name = 0;.  }.  
ca00: 72 65 74 75 72 6e 20 7a 46 69 6c 65 6e 61 6d 65  return zFilename
ca10: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  ;.}../*.** Conve
ca20: 72 74 20 61 6e 20 41 4e 53 49 20 73 74 72 69 6e  rt an ANSI strin
ca30: 67 20 74 6f 20 4d 69 63 72 6f 73 6f 66 74 20 55  g to Microsoft U
ca40: 6e 69 63 6f 64 65 2c 20 62 61 73 65 64 20 6f 6e  nicode, based on
ca50: 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20   the.** current 
ca60: 63 6f 64 65 70 61 67 65 20 73 65 74 74 69 6e 67  codepage setting
ca70: 73 20 66 6f 72 20 66 69 6c 65 20 61 70 69 73 2e  s for file apis.
ca80: 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20  .**.** Space to 
ca90: 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65  hold the returne
caa0: 64 20 73 74 72 69 6e 67 20 69 73 20 6f 62 74 61  d string is obta
cab0: 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20 73 71 6c  ined.** from sql
cac0: 69 74 65 33 5f 6d 61 6c 6c 6f 63 2e 0a 2a 2f 0a  ite3_malloc..*/.
cad0: 73 74 61 74 69 63 20 4c 50 57 53 54 52 20 77 69  static LPWSTR wi
cae0: 6e 4d 62 63 73 54 6f 55 6e 69 63 6f 64 65 28 63  nMbcsToUnicode(c
caf0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
cb00: 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 6e 42 79  name){.  int nBy
cb10: 74 65 3b 0a 20 20 4c 50 57 53 54 52 20 7a 4d 62  te;.  LPWSTR zMb
cb20: 63 73 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 69 6e  csFilename;.  in
cb30: 74 20 63 6f 64 65 70 61 67 65 20 3d 20 6f 73 41  t codepage = osA
cb40: 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49 28 29  reFileApisANSI()
cb50: 20 3f 20 43 50 5f 41 43 50 20 3a 20 43 50 5f 4f   ? CP_ACP : CP_O
cb60: 45 4d 43 50 3b 0a 0a 20 20 6e 42 79 74 65 20 3d  EMCP;..  nByte =
cb70: 20 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f 57 69   osMultiByteToWi
cb80: 64 65 43 68 61 72 28 63 6f 64 65 70 61 67 65 2c  deChar(codepage,
cb90: 20 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d   0, zFilename, -
cba0: 31 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20  1, NULL,.       
cbb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cbc0: 20 20 20 20 20 20 20 20 20 30 29 2a 73 69 7a 65           0)*size
cbd0: 6f 66 28 57 43 48 41 52 29 3b 0a 20 20 69 66 28  of(WCHAR);.  if(
cbe0: 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20   nByte==0 ){.   
cbf0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
cc00: 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 20 3d   zMbcsFilename =
cc10: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
cc20: 72 6f 28 20 6e 42 79 74 65 2a 73 69 7a 65 6f 66  ro( nByte*sizeof
cc30: 28 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 5b 30  (zMbcsFilename[0
cc40: 5d 29 20 29 3b 0a 20 20 69 66 28 20 7a 4d 62 63  ]) );.  if( zMbc
cc50: 73 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a  sFilename==0 ){.
cc60: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
cc70: 7d 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73 4d 75  }.  nByte = osMu
cc80: 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43 68 61  ltiByteToWideCha
cc90: 72 28 63 6f 64 65 70 61 67 65 2c 20 30 2c 20 7a  r(codepage, 0, z
cca0: 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a 4d  Filename, -1, zM
ccb0: 62 63 73 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20  bcsFilename,.   
ccc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ccd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 42 79               nBy
cce0: 74 65 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65  te);.  if( nByte
ccf0: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
cd00: 65 33 5f 66 72 65 65 28 7a 4d 62 63 73 46 69 6c  e3_free(zMbcsFil
cd10: 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 4d 62 63  ename);.    zMbc
cd20: 73 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20  sFilename = 0;. 
cd30: 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4d 62 63   }.  return zMbc
cd40: 73 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a  sFilename;.}../*
cd50: 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 4d 69 63 72  .** Convert Micr
cd60: 6f 73 6f 66 74 20 55 6e 69 63 6f 64 65 20 74 6f  osoft Unicode to
cd70: 20 6d 75 6c 74 69 2d 62 79 74 65 20 63 68 61 72   multi-byte char
cd80: 61 63 74 65 72 20 73 74 72 69 6e 67 2c 20 62 61  acter string, ba
cd90: 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 75 73  sed on the.** us
cda0: 65 72 27 73 20 41 4e 53 49 20 63 6f 64 65 70 61  er's ANSI codepa
cdb0: 67 65 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20  ge..**.** Space 
cdc0: 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75  to hold the retu
cdd0: 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73 20 6f  rned string is o
cde0: 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20  btained from.** 
cdf0: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29  sqlite3_malloc()
ce00: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
ce10: 20 2a 77 69 6e 55 6e 69 63 6f 64 65 54 6f 4d 62   *winUnicodeToMb
ce20: 63 73 28 4c 50 43 57 53 54 52 20 7a 57 69 64 65  cs(LPCWSTR zWide
ce30: 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74  Filename){.  int
ce40: 20 6e 42 79 74 65 3b 0a 20 20 63 68 61 72 20 2a   nByte;.  char *
ce50: 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 69 6e 74  zFilename;.  int
ce60: 20 63 6f 64 65 70 61 67 65 20 3d 20 6f 73 41 72   codepage = osAr
ce70: 65 46 69 6c 65 41 70 69 73 41 4e 53 49 28 29 20  eFileApisANSI() 
ce80: 3f 20 43 50 5f 41 43 50 20 3a 20 43 50 5f 4f 45  ? CP_ACP : CP_OE
ce90: 4d 43 50 3b 0a 0a 20 20 6e 42 79 74 65 20 3d 20  MCP;..  nByte = 
cea0: 6f 73 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74  osWideCharToMult
ceb0: 69 42 79 74 65 28 63 6f 64 65 70 61 67 65 2c 20  iByte(codepage, 
cec0: 30 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65  0, zWideFilename
ced0: 2c 20 2d 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30  , -1, 0, 0, 0, 0
cee0: 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 20 3d  );.  if( nByte =
cef0: 3d 20 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  = 0 ){.    retur
cf00: 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c 65  n 0;.  }.  zFile
cf10: 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 61  name = sqlite3Ma
cf20: 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42 79 74 65 20  llocZero( nByte 
cf30: 29 3b 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61  );.  if( zFilena
cf40: 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  me==0 ){.    ret
cf50: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 42 79  urn 0;.  }.  nBy
cf60: 74 65 20 3d 20 6f 73 57 69 64 65 43 68 61 72 54  te = osWideCharT
cf70: 6f 4d 75 6c 74 69 42 79 74 65 28 63 6f 64 65 70  oMultiByte(codep
cf80: 61 67 65 2c 20 30 2c 20 7a 57 69 64 65 46 69 6c  age, 0, zWideFil
cf90: 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a 46 69 6c 65  ename, -1, zFile
cfa0: 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20  name,.          
cfb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cfc0: 20 20 20 20 20 20 6e 42 79 74 65 2c 20 30 2c 20        nByte, 0, 
cfd0: 30 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 20  0);.  if( nByte 
cfe0: 3d 3d 20 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  == 0 ){.    sqli
cff0: 74 65 33 5f 66 72 65 65 28 7a 46 69 6c 65 6e 61  te3_free(zFilena
d000: 6d 65 29 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61  me);.    zFilena
d010: 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  me = 0;.  }.  re
d020: 74 75 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a  turn zFilename;.
d030: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  }../*.** Convert
d040: 20 6d 75 6c 74 69 62 79 74 65 20 63 68 61 72 61   multibyte chara
d050: 63 74 65 72 20 73 74 72 69 6e 67 20 74 6f 20 55  cter string to U
d060: 54 46 2d 38 2e 20 20 53 70 61 63 65 20 74 6f 20  TF-8.  Space to 
d070: 68 6f 6c 64 20 74 68 65 0a 2a 2a 20 72 65 74 75  hold the.** retu
d080: 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73 20 6f  rned string is o
d090: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
d0a0: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a  ite3_malloc()..*
d0b0: 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f  /.char *sqlite3_
d0c0: 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74  win32_mbcs_to_ut
d0d0: 66 38 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  f8(const char *z
d0e0: 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 63 68 61  Filename){.  cha
d0f0: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 55 74 66 38  r *zFilenameUtf8
d100: 3b 0a 20 20 4c 50 57 53 54 52 20 7a 54 6d 70 57  ;.  LPWSTR zTmpW
d110: 69 64 65 3b 0a 0a 20 20 7a 54 6d 70 57 69 64 65  ide;..  zTmpWide
d120: 20 3d 20 77 69 6e 4d 62 63 73 54 6f 55 6e 69 63   = winMbcsToUnic
d130: 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  ode(zFilename);.
d140: 20 20 69 66 28 20 7a 54 6d 70 57 69 64 65 3d 3d    if( zTmpWide==
d150: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
d160: 30 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c 65 6e 61  0;.  }.  zFilena
d170: 6d 65 55 74 66 38 20 3d 20 77 69 6e 55 6e 69 63  meUtf8 = winUnic
d180: 6f 64 65 54 6f 55 74 66 38 28 7a 54 6d 70 57 69  odeToUtf8(zTmpWi
d190: 64 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  de);.  sqlite3_f
d1a0: 72 65 65 28 7a 54 6d 70 57 69 64 65 29 3b 0a 20  ree(zTmpWide);. 
d1b0: 20 72 65 74 75 72 6e 20 7a 46 69 6c 65 6e 61 6d   return zFilenam
d1c0: 65 55 74 66 38 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eUtf8;.}../*.** 
d1d0: 43 6f 6e 76 65 72 74 20 55 54 46 2d 38 20 74 6f  Convert UTF-8 to
d1e0: 20 6d 75 6c 74 69 62 79 74 65 20 63 68 61 72 61   multibyte chara
d1f0: 63 74 65 72 20 73 74 72 69 6e 67 2e 20 20 53 70  cter string.  Sp
d200: 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a  ace to hold the.
d210: 2a 2a 20 72 65 74 75 72 6e 65 64 20 73 74 72 69  ** returned stri
d220: 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66  ng is obtained f
d230: 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  rom sqlite3_mall
d240: 6f 63 28 29 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73  oc()..*/.char *s
d250: 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75 74 66  qlite3_win32_utf
d260: 38 5f 74 6f 5f 6d 62 63 73 28 63 6f 6e 73 74 20  8_to_mbcs(const 
d270: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29  char *zFilename)
d280: 7b 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  {.  char *zFilen
d290: 61 6d 65 4d 62 63 73 3b 0a 20 20 4c 50 57 53 54  ameMbcs;.  LPWST
d2a0: 52 20 7a 54 6d 70 57 69 64 65 3b 0a 0a 20 20 7a  R zTmpWide;..  z
d2b0: 54 6d 70 57 69 64 65 20 3d 20 77 69 6e 55 74 66  TmpWide = winUtf
d2c0: 38 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65  8ToUnicode(zFile
d2d0: 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 54 6d  name);.  if( zTm
d2e0: 70 57 69 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20  pWide==0 ){.    
d2f0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
d300: 7a 46 69 6c 65 6e 61 6d 65 4d 62 63 73 20 3d 20  zFilenameMbcs = 
d310: 77 69 6e 55 6e 69 63 6f 64 65 54 6f 4d 62 63 73  winUnicodeToMbcs
d320: 28 7a 54 6d 70 57 69 64 65 29 3b 0a 20 20 73 71  (zTmpWide);.  sq
d330: 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 6d 70 57  lite3_free(zTmpW
d340: 69 64 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a  ide);.  return z
d350: 46 69 6c 65 6e 61 6d 65 4d 62 63 73 3b 0a 7d 0a  FilenameMbcs;.}.
d360: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
d370: 74 69 6f 6e 20 73 65 74 73 20 74 68 65 20 64 61  tion sets the da
d380: 74 61 20 64 69 72 65 63 74 6f 72 79 20 6f 72 20  ta directory or 
d390: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 64 69  the temporary di
d3a0: 72 65 63 74 6f 72 79 20 62 61 73 65 64 20 6f 6e  rectory based on
d3b0: 0a 2a 2a 20 74 68 65 20 70 72 6f 76 69 64 65 64  .** the provided
d3c0: 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 54 68 65   arguments.  The
d3d0: 20 74 79 70 65 20 61 72 67 75 6d 65 6e 74 20 6d   type argument m
d3e0: 75 73 74 20 62 65 20 31 20 69 6e 20 6f 72 64 65  ust be 1 in orde
d3f0: 72 20 74 6f 20 73 65 74 20 74 68 65 0a 2a 2a 20  r to set the.** 
d400: 64 61 74 61 20 64 69 72 65 63 74 6f 72 79 20 6f  data directory o
d410: 72 20 32 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  r 2 in order to 
d420: 73 65 74 20 74 68 65 20 74 65 6d 70 6f 72 61 72  set the temporar
d430: 79 20 64 69 72 65 63 74 6f 72 79 2e 20 20 54 68  y directory.  Th
d440: 65 20 7a 56 61 6c 75 65 0a 2a 2a 20 61 72 67 75  e zValue.** argu
d450: 6d 65 6e 74 20 69 73 20 74 68 65 20 6e 61 6d 65  ment is the name
d460: 20 6f 66 20 74 68 65 20 64 69 72 65 63 74 6f 72   of the director
d470: 79 20 74 6f 20 75 73 65 2e 20 20 54 68 65 20 72  y to use.  The r
d480: 65 74 75 72 6e 20 76 61 6c 75 65 20 77 69 6c 6c  eturn value will
d490: 20 62 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b   be.** SQLITE_OK
d4a0: 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2e 0a   if successful..
d4b0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 77  */.int sqlite3_w
d4c0: 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f  in32_set_directo
d4d0: 72 79 28 44 57 4f 52 44 20 74 79 70 65 2c 20 4c  ry(DWORD type, L
d4e0: 50 43 57 53 54 52 20 7a 56 61 6c 75 65 29 7b 0a  PCWSTR zValue){.
d4f0: 20 20 63 68 61 72 20 2a 2a 70 70 44 69 72 65 63    char **ppDirec
d500: 74 6f 72 79 20 3d 20 30 3b 0a 23 69 66 6e 64 65  tory = 0;.#ifnde
d510: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
d520: 54 4f 49 4e 49 54 0a 20 20 69 6e 74 20 72 63 20  TOINIT.  int rc 
d530: 3d 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61  = sqlite3_initia
d540: 6c 69 7a 65 28 29 3b 0a 20 20 69 66 28 20 72 63  lize();.  if( rc
d550: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65   ) return rc;.#e
d560: 6e 64 69 66 0a 20 20 69 66 28 20 74 79 70 65 3d  ndif.  if( type=
d570: 3d 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 41  =SQLITE_WIN32_DA
d580: 54 41 5f 44 49 52 45 43 54 4f 52 59 5f 54 59 50  TA_DIRECTORY_TYP
d590: 45 20 29 7b 0a 20 20 20 20 70 70 44 69 72 65 63  E ){.    ppDirec
d5a0: 74 6f 72 79 20 3d 20 26 73 71 6c 69 74 65 33 5f  tory = &sqlite3_
d5b0: 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79 3b 0a  data_directory;.
d5c0: 20 20 7d 65 6c 73 65 20 69 66 28 20 74 79 70 65    }else if( type
d5d0: 3d 3d 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 54  ==SQLITE_WIN32_T
d5e0: 45 4d 50 5f 44 49 52 45 43 54 4f 52 59 5f 54 59  EMP_DIRECTORY_TY
d5f0: 50 45 20 29 7b 0a 20 20 20 20 70 70 44 69 72 65  PE ){.    ppDire
d600: 63 74 6f 72 79 20 3d 20 26 73 71 6c 69 74 65 33  ctory = &sqlite3
d610: 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 3b  _temp_directory;
d620: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21  .  }.  assert( !
d630: 70 70 44 69 72 65 63 74 6f 72 79 20 7c 7c 20 74  ppDirectory || t
d640: 79 70 65 3d 3d 53 51 4c 49 54 45 5f 57 49 4e 33  ype==SQLITE_WIN3
d650: 32 5f 44 41 54 41 5f 44 49 52 45 43 54 4f 52 59  2_DATA_DIRECTORY
d660: 5f 54 59 50 45 0a 20 20 20 20 20 20 20 20 20 20  _TYPE.          
d670: 7c 7c 20 74 79 70 65 3d 3d 53 51 4c 49 54 45 5f  || type==SQLITE_
d680: 57 49 4e 33 32 5f 54 45 4d 50 5f 44 49 52 45 43  WIN32_TEMP_DIREC
d690: 54 4f 52 59 5f 54 59 50 45 0a 20 20 29 3b 0a 20  TORY_TYPE.  );. 
d6a0: 20 61 73 73 65 72 74 28 20 21 70 70 44 69 72 65   assert( !ppDire
d6b0: 63 74 6f 72 79 20 7c 7c 20 73 71 6c 69 74 65 33  ctory || sqlite3
d6c0: 4d 65 6d 64 65 62 75 67 48 61 73 54 79 70 65 28  MemdebugHasType(
d6d0: 2a 70 70 44 69 72 65 63 74 6f 72 79 2c 20 4d 45  *ppDirectory, ME
d6e0: 4d 54 59 50 45 5f 48 45 41 50 29 20 29 3b 0a 20  MTYPE_HEAP) );. 
d6f0: 20 69 66 28 20 70 70 44 69 72 65 63 74 6f 72 79   if( ppDirectory
d700: 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 56   ){.    char *zV
d710: 61 6c 75 65 55 74 66 38 20 3d 20 30 3b 0a 20 20  alueUtf8 = 0;.  
d720: 20 20 69 66 28 20 7a 56 61 6c 75 65 20 26 26 20    if( zValue && 
d730: 7a 56 61 6c 75 65 5b 30 5d 20 29 7b 0a 20 20 20  zValue[0] ){.   
d740: 20 20 20 7a 56 61 6c 75 65 55 74 66 38 20 3d 20     zValueUtf8 = 
d750: 77 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66 38  winUnicodeToUtf8
d760: 28 7a 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20  (zValue);.      
d770: 69 66 20 28 20 7a 56 61 6c 75 65 55 74 66 38 3d  if ( zValueUtf8=
d780: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  =0 ){.        re
d790: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
d7a0: 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  M;.      }.    }
d7b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
d7c0: 65 28 2a 70 70 44 69 72 65 63 74 6f 72 79 29 3b  e(*ppDirectory);
d7d0: 0a 20 20 20 20 2a 70 70 44 69 72 65 63 74 6f 72  .    *ppDirector
d7e0: 79 20 3d 20 7a 56 61 6c 75 65 55 74 66 38 3b 0a  y = zValueUtf8;.
d7f0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
d800: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  E_OK;.  }.  retu
d810: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
d820: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 72 65  .}../*.** The re
d830: 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 77 69  turn value of wi
d840: 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67  nGetLastErrorMsg
d850: 0a 2a 2a 20 69 73 20 7a 65 72 6f 20 69 66 20 74  .** is zero if t
d860: 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  he error message
d870: 20 66 69 74 73 20 69 6e 20 74 68 65 20 62 75 66   fits in the buf
d880: 66 65 72 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f  fer, or non-zero
d890: 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65 20 28 69  .** otherwise (i
d8a0: 66 20 74 68 65 20 6d 65 73 73 61 67 65 20 77 61  f the message wa
d8b0: 73 20 74 72 75 6e 63 61 74 65 64 29 2e 0a 2a 2f  s truncated)..*/
d8c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 47  .static int winG
d8d0: 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67 28 44  etLastErrorMsg(D
d8e0: 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 2c 20  WORD lastErrno, 
d8f0: 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a  int nBuf, char *
d900: 7a 42 75 66 29 7b 0a 20 20 2f 2a 20 46 6f 72 6d  zBuf){.  /* Form
d910: 61 74 4d 65 73 73 61 67 65 20 72 65 74 75 72 6e  atMessage return
d920: 73 20 30 20 6f 6e 20 66 61 69 6c 75 72 65 2e 20  s 0 on failure. 
d930: 20 4f 74 68 65 72 77 69 73 65 20 69 74 0a 20 20   Otherwise it.  
d940: 2a 2a 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e  ** returns the n
d950: 75 6d 62 65 72 20 6f 66 20 54 43 48 41 52 73 20  umber of TCHARs 
d960: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6f  written to the o
d970: 75 74 70 75 74 0a 20 20 2a 2a 20 62 75 66 66 65  utput.  ** buffe
d980: 72 2c 20 65 78 63 6c 75 64 69 6e 67 20 74 68 65  r, excluding the
d990: 20 74 65 72 6d 69 6e 61 74 69 6e 67 20 6e 75 6c   terminating nul
d9a0: 6c 20 63 68 61 72 2e 0a 20 20 2a 2f 0a 20 20 44  l char..  */.  D
d9b0: 57 4f 52 44 20 64 77 4c 65 6e 20 3d 20 30 3b 0a  WORD dwLen = 0;.
d9c0: 20 20 63 68 61 72 20 2a 7a 4f 75 74 20 3d 20 30    char *zOut = 0
d9d0: 3b 0a 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28  ;..  if( osIsNT(
d9e0: 29 20 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f  ) ){.#if SQLITE_
d9f0: 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 57 43 48  OS_WINRT.    WCH
da00: 41 52 20 7a 54 65 6d 70 57 69 64 65 5b 53 51 4c  AR zTempWide[SQL
da10: 49 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 45 52  ITE_WIN32_MAX_ER
da20: 52 4d 53 47 5f 43 48 41 52 53 2b 31 5d 3b 0a 20  RMSG_CHARS+1];. 
da30: 20 20 20 64 77 4c 65 6e 20 3d 20 6f 73 46 6f 72     dwLen = osFor
da40: 6d 61 74 4d 65 73 73 61 67 65 57 28 46 4f 52 4d  matMessageW(FORM
da50: 41 54 5f 4d 45 53 53 41 47 45 5f 46 52 4f 4d 5f  AT_MESSAGE_FROM_
da60: 53 59 53 54 45 4d 20 7c 0a 20 20 20 20 20 20 20  SYSTEM |.       
da70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da80: 20 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d 45 53        FORMAT_MES
da90: 53 41 47 45 5f 49 47 4e 4f 52 45 5f 49 4e 53 45  SAGE_IGNORE_INSE
daa0: 52 54 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20  RTS,.           
dab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dac0: 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20    NULL,.        
dad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dae0: 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 2c 0a       lastErrno,.
daf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db00: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 0a               0,.
db10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db20: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 65               zTe
db30: 6d 70 57 69 64 65 2c 0a 20 20 20 20 20 20 20 20  mpWide,.        
db40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db50: 20 20 20 20 20 53 51 4c 49 54 45 5f 57 49 4e 33       SQLITE_WIN3
db60: 32 5f 4d 41 58 5f 45 52 52 4d 53 47 5f 43 48 41  2_MAX_ERRMSG_CHA
db70: 52 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  RS,.            
db80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db90: 20 30 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 4c   0);.#else.    L
dba0: 50 57 53 54 52 20 7a 54 65 6d 70 57 69 64 65 20  PWSTR zTempWide 
dbb0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 64 77 4c 65  = NULL;.    dwLe
dbc0: 6e 20 3d 20 6f 73 46 6f 72 6d 61 74 4d 65 73 73  n = osFormatMess
dbd0: 61 67 65 57 28 46 4f 52 4d 41 54 5f 4d 45 53 53  ageW(FORMAT_MESS
dbe0: 41 47 45 5f 41 4c 4c 4f 43 41 54 45 5f 42 55 46  AGE_ALLOCATE_BUF
dbf0: 46 45 52 20 7c 0a 20 20 20 20 20 20 20 20 20 20  FER |.          
dc00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc10: 20 20 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47     FORMAT_MESSAG
dc20: 45 5f 46 52 4f 4d 5f 53 59 53 54 45 4d 20 7c 0a  E_FROM_SYSTEM |.
dc30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc40: 20 20 20 20 20 20 20 20 20 20 20 20 20 46 4f 52               FOR
dc50: 4d 41 54 5f 4d 45 53 53 41 47 45 5f 49 47 4e 4f  MAT_MESSAGE_IGNO
dc60: 52 45 5f 49 4e 53 45 52 54 53 2c 0a 20 20 20 20  RE_INSERTS,.    
dc70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc80: 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 0a 20           NULL,. 
dc90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dca0: 20 20 20 20 20 20 20 20 20 20 20 20 6c 61 73 74              last
dcb0: 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  Errno,.         
dcc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dcd0: 20 20 20 20 30 2c 0a 20 20 20 20 20 20 20 20 20      0,.         
dce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dcf0: 20 20 20 20 28 4c 50 57 53 54 52 29 20 26 7a 54      (LPWSTR) &zT
dd00: 65 6d 70 57 69 64 65 2c 0a 20 20 20 20 20 20 20  empWide,.       
dd10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd20: 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20 20        0,.       
dd30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd40: 20 20 20 20 20 20 30 29 3b 0a 23 65 6e 64 69 66        0);.#endif
dd50: 0a 20 20 20 20 69 66 28 20 64 77 4c 65 6e 20 3e  .    if( dwLen >
dd60: 20 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 61   0 ){.      /* a
dd70: 6c 6c 6f 63 61 74 65 20 61 20 62 75 66 66 65 72  llocate a buffer
dd80: 20 61 6e 64 20 63 6f 6e 76 65 72 74 20 74 6f 20   and convert to 
dd90: 55 54 46 38 20 2a 2f 0a 20 20 20 20 20 20 73 71  UTF8 */.      sq
dda0: 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
ddb0: 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20  Malloc();.      
ddc0: 7a 4f 75 74 20 3d 20 77 69 6e 55 6e 69 63 6f 64  zOut = winUnicod
ddd0: 65 54 6f 55 74 66 38 28 7a 54 65 6d 70 57 69 64  eToUtf8(zTempWid
dde0: 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
ddf0: 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
de00: 28 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  ();.#if !SQLITE_
de10: 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 20 20 2f  OS_WINRT.      /
de20: 2a 20 66 72 65 65 20 74 68 65 20 73 79 73 74 65  * free the syste
de30: 6d 20 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74  m buffer allocat
de40: 65 64 20 62 79 20 46 6f 72 6d 61 74 4d 65 73 73  ed by FormatMess
de50: 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 6f 73 4c  age */.      osL
de60: 6f 63 61 6c 46 72 65 65 28 7a 54 65 6d 70 57 69  ocalFree(zTempWi
de70: 64 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  de);.#endif.    
de80: 7d 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c  }.  }.#ifdef SQL
de90: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
dea0: 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 63  SI.  else{.    c
deb0: 68 61 72 20 2a 7a 54 65 6d 70 20 3d 20 4e 55 4c  har *zTemp = NUL
dec0: 4c 3b 0a 20 20 20 20 64 77 4c 65 6e 20 3d 20 6f  L;.    dwLen = o
ded0: 73 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 41 28  sFormatMessageA(
dee0: 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 41  FORMAT_MESSAGE_A
def0: 4c 4c 4f 43 41 54 45 5f 42 55 46 46 45 52 20 7c  LLOCATE_BUFFER |
df00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
df10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 46 4f                FO
df20: 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 46 52 4f  RMAT_MESSAGE_FRO
df30: 4d 5f 53 59 53 54 45 4d 20 7c 0a 20 20 20 20 20  M_SYSTEM |.     
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 46 4f 52 4d 41 54 5f 4d          FORMAT_M
df60: 45 53 53 41 47 45 5f 49 47 4e 4f 52 45 5f 49 4e  ESSAGE_IGNORE_IN
df70: 53 45 52 54 53 2c 0a 20 20 20 20 20 20 20 20 20  SERTS,.         
df80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df90: 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20      NULL,.      
dfa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dfb0: 20 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f         lastErrno
dfc0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
dfd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
dfe0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
dff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
e000: 4c 50 53 54 52 29 20 26 7a 54 65 6d 70 2c 0a 20  LPSTR) &zTemp,. 
e010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e020: 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 0a 20              0,. 
e030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e040: 20 20 20 20 20 20 20 20 20 20 20 20 30 29 3b 0a              0);.
e050: 20 20 20 20 69 66 28 20 64 77 4c 65 6e 20 3e 20      if( dwLen > 
e060: 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 61 6c  0 ){.      /* al
e070: 6c 6f 63 61 74 65 20 61 20 62 75 66 66 65 72 20  locate a buffer 
e080: 61 6e 64 20 63 6f 6e 76 65 72 74 20 74 6f 20 55  and convert to U
e090: 54 46 38 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  TF8 */.      sql
e0a0: 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d  ite3BeginBenignM
e0b0: 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 7a  alloc();.      z
e0c0: 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 5f 77 69  Out = sqlite3_wi
e0d0: 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38  n32_mbcs_to_utf8
e0e0: 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 73  (zTemp);.      s
e0f0: 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
e100: 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 2f  alloc();.      /
e110: 2a 20 66 72 65 65 20 74 68 65 20 73 79 73 74 65  * free the syste
e120: 6d 20 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74  m buffer allocat
e130: 65 64 20 62 79 20 46 6f 72 6d 61 74 4d 65 73 73  ed by FormatMess
e140: 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 6f 73 4c  age */.      osL
e150: 6f 63 61 6c 46 72 65 65 28 7a 54 65 6d 70 29 3b  ocalFree(zTemp);
e160: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
e170: 66 0a 20 20 69 66 28 20 30 20 3d 3d 20 64 77 4c  f.  if( 0 == dwL
e180: 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  en ){.    sqlite
e190: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2c  3_snprintf(nBuf,
e1a0: 20 7a 42 75 66 2c 20 22 4f 73 45 72 72 6f 72 20   zBuf, "OsError 
e1b0: 30 78 25 6c 78 20 28 25 6c 75 29 22 2c 20 6c 61  0x%lx (%lu)", la
e1c0: 73 74 45 72 72 6e 6f 2c 20 6c 61 73 74 45 72 72  stErrno, lastErr
e1d0: 6e 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  no);.  }else{.  
e1e0: 20 20 2f 2a 20 63 6f 70 79 20 61 20 6d 61 78 69    /* copy a maxi
e1f0: 6d 75 6d 20 6f 66 20 6e 42 75 66 20 63 68 61 72  mum of nBuf char
e200: 73 20 74 6f 20 6f 75 74 70 75 74 20 62 75 66 66  s to output buff
e210: 65 72 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  er */.    sqlite
e220: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2c  3_snprintf(nBuf,
e230: 20 7a 42 75 66 2c 20 22 25 73 22 2c 20 7a 4f 75   zBuf, "%s", zOu
e240: 74 29 3b 0a 20 20 20 20 2f 2a 20 66 72 65 65 20  t);.    /* free 
e250: 74 68 65 20 55 54 46 38 20 62 75 66 66 65 72 20  the UTF8 buffer 
e260: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  */.    sqlite3_f
e270: 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 7d 0a 20  ree(zOut);.  }. 
e280: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
e290: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
e2a0: 74 69 6f 6e 20 2d 20 77 69 6e 4c 6f 67 45 72 72  tion - winLogErr
e2b0: 6f 72 41 74 4c 69 6e 65 28 29 20 2d 20 69 73 20  orAtLine() - is 
e2c0: 6f 6e 6c 79 20 65 76 65 72 20 63 61 6c 6c 65 64  only ever called
e2d0: 20 76 69 61 20 74 68 65 20 6d 61 63 72 6f 0a 2a   via the macro.*
e2e0: 2a 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 29 2e  * winLogError().
e2f0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
e300: 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 61  ine is invoked a
e310: 66 74 65 72 20 61 6e 20 65 72 72 6f 72 20 6f 63  fter an error oc
e320: 63 75 72 73 20 69 6e 20 61 6e 20 4f 53 20 66 75  curs in an OS fu
e330: 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20 6c 6f  nction..** It lo
e340: 67 73 20 61 20 6d 65 73 73 61 67 65 20 75 73 69  gs a message usi
e350: 6e 67 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29  ng sqlite3_log()
e360: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
e370: 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66  current value of
e380: 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 61  .** error code a
e390: 6e 64 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 2c  nd, if possible,
e3a0: 20 74 68 65 20 68 75 6d 61 6e 2d 72 65 61 64 61   the human-reada
e3b0: 62 6c 65 20 65 71 75 69 76 61 6c 65 6e 74 20 66  ble equivalent f
e3c0: 72 6f 6d 0a 2a 2a 20 46 6f 72 6d 61 74 4d 65 73  rom.** FormatMes
e3d0: 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  sage..**.** The 
e3e0: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 70  first argument p
e3f0: 61 73 73 65 64 20 74 6f 20 74 68 65 20 6d 61 63  assed to the mac
e400: 72 6f 20 73 68 6f 75 6c 64 20 62 65 20 74 68 65  ro should be the
e410: 20 65 72 72 6f 72 20 63 6f 64 65 20 74 68 61 74   error code that
e420: 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 74 75  .** will be retu
e430: 72 6e 65 64 20 74 6f 20 53 51 4c 69 74 65 20 28  rned to SQLite (
e440: 65 2e 67 2e 20 53 51 4c 49 54 45 5f 49 4f 45 52  e.g. SQLITE_IOER
e450: 52 5f 44 45 4c 45 54 45 2c 20 53 51 4c 49 54 45  R_DELETE, SQLITE
e460: 5f 43 41 4e 54 4f 50 45 4e 29 2e 0a 2a 2a 20 54  _CANTOPEN)..** T
e470: 68 65 20 74 77 6f 20 73 75 62 73 65 71 75 65 6e  he two subsequen
e480: 74 20 61 72 67 75 6d 65 6e 74 73 20 73 68 6f 75  t arguments shou
e490: 6c 64 20 62 65 20 74 68 65 20 6e 61 6d 65 20 6f  ld be the name o
e4a0: 66 20 74 68 65 20 4f 53 20 66 75 6e 63 74 69 6f  f the OS functio
e4b0: 6e 20 74 68 61 74 0a 2a 2a 20 66 61 69 6c 65 64  n that.** failed
e4c0: 20 61 6e 64 20 74 68 65 20 61 73 73 6f 63 69 61   and the associa
e4d0: 74 65 64 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  ted file-system 
e4e0: 70 61 74 68 2c 20 69 66 20 61 6e 79 2e 0a 2a 2f  path, if any..*/
e4f0: 0a 23 64 65 66 69 6e 65 20 77 69 6e 4c 6f 67 45  .#define winLogE
e500: 72 72 6f 72 28 61 2c 62 2c 63 2c 64 29 20 20 20  rror(a,b,c,d)   
e510: 77 69 6e 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e  winLogErrorAtLin
e520: 65 28 61 2c 62 2c 63 2c 64 2c 5f 5f 4c 49 4e 45  e(a,b,c,d,__LINE
e530: 5f 5f 29 0a 73 74 61 74 69 63 20 69 6e 74 20 77  __).static int w
e540: 69 6e 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65  inLogErrorAtLine
e550: 28 0a 20 20 69 6e 74 20 65 72 72 63 6f 64 65 2c  (.  int errcode,
e560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e570: 20 20 20 20 2f 2a 20 53 51 4c 69 74 65 20 65 72      /* SQLite er
e580: 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 44 57  ror code */.  DW
e590: 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 2c 20 20  ORD lastErrno,  
e5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e5b0: 20 57 69 6e 33 32 20 6c 61 73 74 20 65 72 72 6f   Win32 last erro
e5c0: 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  r */.  const cha
e5d0: 72 20 2a 7a 46 75 6e 63 2c 20 20 20 20 20 20 20  r *zFunc,       
e5e0: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
e5f0: 66 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20 74 68  f OS function th
e600: 61 74 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 63  at failed */.  c
e610: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
e620: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
e630: 2a 20 46 69 6c 65 20 70 61 74 68 20 61 73 73 6f  * File path asso
e640: 63 69 61 74 65 64 20 77 69 74 68 20 65 72 72 6f  ciated with erro
e650: 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 69 6e 65  r */.  int iLine
e660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e670: 20 20 20 20 20 20 20 2f 2a 20 53 6f 75 72 63 65         /* Source
e680: 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 77 68 65   line number whe
e690: 72 65 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65  re error occurre
e6a0: 64 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 7a  d */.){.  char z
e6b0: 4d 73 67 5b 35 30 30 5d 3b 20 20 20 20 20 20 20  Msg[500];       
e6c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 75 6d            /* Hum
e6d0: 61 6e 20 72 65 61 64 61 62 6c 65 20 65 72 72 6f  an readable erro
e6e0: 72 20 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20  r text */.  int 
e6f0: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
e700: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
e710: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a  oop counter */..
e720: 20 20 7a 4d 73 67 5b 30 5d 20 3d 20 30 3b 0a 20    zMsg[0] = 0;. 
e730: 20 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f 72   winGetLastError
e740: 4d 73 67 28 6c 61 73 74 45 72 72 6e 6f 2c 20 73  Msg(lastErrno, s
e750: 69 7a 65 6f 66 28 7a 4d 73 67 29 2c 20 7a 4d 73  izeof(zMsg), zMs
e760: 67 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 72  g);.  assert( er
e770: 72 63 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b  rcode!=SQLITE_OK
e780: 20 29 3b 0a 20 20 69 66 28 20 7a 50 61 74 68 3d   );.  if( zPath=
e790: 3d 30 20 29 20 7a 50 61 74 68 20 3d 20 22 22 3b  =0 ) zPath = "";
e7a0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a 4d 73 67  .  for(i=0; zMsg
e7b0: 5b 69 5d 20 26 26 20 7a 4d 73 67 5b 69 5d 21 3d  [i] && zMsg[i]!=
e7c0: 27 5c 72 27 20 26 26 20 7a 4d 73 67 5b 69 5d 21  '\r' && zMsg[i]!
e7d0: 3d 27 5c 6e 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20  ='\n'; i++){}.  
e7e0: 7a 4d 73 67 5b 69 5d 20 3d 20 30 3b 0a 20 20 73  zMsg[i] = 0;.  s
e7f0: 71 6c 69 74 65 33 5f 6c 6f 67 28 65 72 72 63 6f  qlite3_log(errco
e800: 64 65 2c 0a 20 20 20 20 20 20 22 6f 73 5f 77 69  de,.      "os_wi
e810: 6e 2e 63 3a 25 64 3a 20 28 25 6c 75 29 20 25 73  n.c:%d: (%lu) %s
e820: 28 25 73 29 20 2d 20 25 73 22 2c 0a 20 20 20 20  (%s) - %s",.    
e830: 20 20 69 4c 69 6e 65 2c 20 6c 61 73 74 45 72 72    iLine, lastErr
e840: 6e 6f 2c 20 7a 46 75 6e 63 2c 20 7a 50 61 74 68  no, zFunc, zPath
e850: 2c 20 7a 4d 73 67 0a 20 20 29 3b 0a 0a 20 20 72  , zMsg.  );..  r
e860: 65 74 75 72 6e 20 65 72 72 63 6f 64 65 3b 0a 7d  eturn errcode;.}
e870: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62  ../*.** The numb
e880: 65 72 20 6f 66 20 74 69 6d 65 73 20 74 68 61 74  er of times that
e890: 20 61 20 52 65 61 64 46 69 6c 65 28 29 2c 20 57   a ReadFile(), W
e8a0: 72 69 74 65 46 69 6c 65 28 29 2c 20 61 6e 64 20  riteFile(), and 
e8b0: 44 65 6c 65 74 65 46 69 6c 65 28 29 0a 2a 2a 20  DeleteFile().** 
e8c0: 77 69 6c 6c 20 62 65 20 72 65 74 72 69 65 64 20  will be retried 
e8d0: 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 6c 6f 63 6b  following a lock
e8e0: 69 6e 67 20 65 72 72 6f 72 20 2d 20 70 72 6f 62  ing error - prob
e8f0: 61 62 6c 79 20 63 61 75 73 65 64 20 62 79 0a 2a  ably caused by.*
e900: 2a 20 61 6e 74 69 76 69 72 75 73 20 73 6f 66 74  * antivirus soft
e910: 77 61 72 65 2e 20 20 41 6c 73 6f 20 74 68 65 20  ware.  Also the 
e920: 69 6e 69 74 69 61 6c 20 64 65 6c 61 79 20 62 65  initial delay be
e930: 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 72  fore the first r
e940: 65 74 72 79 2e 0a 2a 2a 20 54 68 65 20 64 65 6c  etry..** The del
e950: 61 79 20 69 6e 63 72 65 61 73 65 73 20 6c 69 6e  ay increases lin
e960: 65 61 72 6c 79 20 77 69 74 68 20 65 61 63 68 20  early with each 
e970: 72 65 74 72 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65  retry..*/.#ifnde
e980: 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49  f SQLITE_WIN32_I
e990: 4f 45 52 52 5f 52 45 54 52 59 0a 23 20 64 65 66  OERR_RETRY.# def
e9a0: 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ine SQLITE_WIN32
e9b0: 5f 49 4f 45 52 52 5f 52 45 54 52 59 20 31 30 0a  _IOERR_RETRY 10.
e9c0: 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53  #endif.#ifndef S
e9d0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52  QLITE_WIN32_IOER
e9e0: 52 5f 52 45 54 52 59 5f 44 45 4c 41 59 0a 23 20  R_RETRY_DELAY.# 
e9f0: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49  define SQLITE_WI
ea00: 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 5f  N32_IOERR_RETRY_
ea10: 44 45 4c 41 59 20 32 35 0a 23 65 6e 64 69 66 0a  DELAY 25.#endif.
ea20: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 49 6f  static int winIo
ea30: 65 72 72 52 65 74 72 79 20 3d 20 53 51 4c 49 54  errRetry = SQLIT
ea40: 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45  E_WIN32_IOERR_RE
ea50: 54 52 59 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  TRY;.static int 
ea60: 77 69 6e 49 6f 65 72 72 52 65 74 72 79 44 65 6c  winIoerrRetryDel
ea70: 61 79 20 3d 20 53 51 4c 49 54 45 5f 57 49 4e 33  ay = SQLITE_WIN3
ea80: 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 5f 44 45  2_IOERR_RETRY_DE
ea90: 4c 41 59 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  LAY;../*.** The 
eaa0: 22 77 69 6e 49 6f 65 72 72 43 61 6e 52 65 74 72  "winIoerrCanRetr
eab0: 79 31 22 20 6d 61 63 72 6f 20 69 73 20 75 73 65  y1" macro is use
eac0: 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69  d to determine i
ead0: 66 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 49  f a particular I
eae0: 2f 4f 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65  /O.** error code
eaf0: 20 6f 62 74 61 69 6e 65 64 20 76 69 61 20 47 65   obtained via Ge
eb00: 74 4c 61 73 74 45 72 72 6f 72 28 29 20 69 73 20  tLastError() is 
eb10: 65 6c 69 67 69 62 6c 65 20 74 6f 20 62 65 20 72  eligible to be r
eb20: 65 74 72 69 65 64 2e 20 20 49 74 0a 2a 2a 20 6d  etried.  It.** m
eb30: 75 73 74 20 61 63 63 65 70 74 20 74 68 65 20 65  ust accept the e
eb40: 72 72 6f 72 20 63 6f 64 65 20 44 57 4f 52 44 20  rror code DWORD 
eb50: 61 73 20 69 74 73 20 6f 6e 6c 79 20 61 72 67 75  as its only argu
eb60: 6d 65 6e 74 20 61 6e 64 20 73 68 6f 75 6c 64 20  ment and should 
eb70: 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65  return.** non-ze
eb80: 72 6f 20 69 66 20 74 68 65 20 65 72 72 6f 72 20  ro if the error 
eb90: 63 6f 64 65 20 69 73 20 74 72 61 6e 73 69 65 6e  code is transien
eba0: 74 20 69 6e 20 6e 61 74 75 72 65 20 61 6e 64 20  t in nature and 
ebb0: 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 0a 2a 2a  the operation.**
ebc0: 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
ebd0: 20 67 65 6e 65 72 61 74 69 6e 67 20 74 68 65 20   generating the 
ebe0: 6f 72 69 67 69 6e 61 6c 20 65 72 72 6f 72 20 6d  original error m
ebf0: 69 67 68 74 20 73 75 63 63 65 65 64 20 75 70 6f  ight succeed upo
ec00: 6e 20 62 65 69 6e 67 0a 2a 2a 20 72 65 74 72 69  n being.** retri
ec10: 65 64 2e 20 20 54 68 65 20 61 72 67 75 6d 65 6e  ed.  The argumen
ec20: 74 20 74 6f 20 74 68 69 73 20 6d 61 63 72 6f 20  t to this macro 
ec30: 73 68 6f 75 6c 64 20 62 65 20 61 20 76 61 72 69  should be a vari
ec40: 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 64 64 69  able..**.** Addi
ec50: 74 69 6f 6e 61 6c 6c 79 2c 20 61 20 6d 61 63 72  tionally, a macr
ec60: 6f 20 6e 61 6d 65 64 20 22 77 69 6e 49 6f 65 72  o named "winIoer
ec70: 72 43 61 6e 52 65 74 72 79 32 22 20 6d 61 79 20  rCanRetry2" may 
ec80: 62 65 20 64 65 66 69 6e 65 64 2e 20 20 49 66 20  be defined.  If 
ec90: 69 74 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65 64  it.** is defined
eca0: 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 63 6f 6e  , it will be con
ecb0: 73 75 6c 74 65 64 20 6f 6e 6c 79 20 77 68 65 6e  sulted only when
ecc0: 20 74 68 65 20 6d 61 63 72 6f 20 22 77 69 6e 49   the macro "winI
ecd0: 6f 65 72 72 43 61 6e 52 65 74 72 79 31 22 0a 2a  oerrCanRetry1".*
ece0: 2a 20 72 65 74 75 72 6e 73 20 7a 65 72 6f 2e 20  * returns zero. 
ecf0: 20 54 68 65 20 22 77 69 6e 49 6f 65 72 72 43 61   The "winIoerrCa
ed00: 6e 52 65 74 72 79 32 22 20 6d 61 63 72 6f 20 69  nRetry2" macro i
ed10: 73 20 63 6f 6d 70 6c 65 74 65 6c 79 20 6f 70 74  s completely opt
ed20: 69 6f 6e 61 6c 20 61 6e 64 0a 2a 2a 20 6d 61 79  ional and.** may
ed30: 20 62 65 20 75 73 65 64 20 74 6f 20 69 6e 63 6c   be used to incl
ed40: 75 64 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 65  ude additional e
ed50: 72 72 6f 72 20 63 6f 64 65 73 20 69 6e 20 74 68  rror codes in th
ed60: 65 20 73 65 74 20 74 68 61 74 20 73 68 6f 75 6c  e set that shoul
ed70: 64 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20 74  d.** result in t
ed80: 68 65 20 66 61 69 6c 69 6e 67 20 49 2f 4f 20 6f  he failing I/O o
ed90: 70 65 72 61 74 69 6f 6e 20 62 65 69 6e 67 20 72  peration being r
eda0: 65 74 72 69 65 64 20 62 79 20 74 68 65 20 63 61  etried by the ca
edb0: 6c 6c 65 72 2e 20 20 49 66 0a 2a 2a 20 64 65 66  ller.  If.** def
edc0: 69 6e 65 64 2c 20 74 68 65 20 22 77 69 6e 49 6f  ined, the "winIo
edd0: 65 72 72 43 61 6e 52 65 74 72 79 32 22 20 6d 61  errCanRetry2" ma
ede0: 63 72 6f 20 6d 75 73 74 20 65 78 68 69 62 69 74  cro must exhibit
edf0: 20 65 78 74 65 72 6e 61 6c 20 73 65 6d 61 6e 74   external semant
ee00: 69 63 73 0a 2a 2a 20 69 64 65 6e 74 69 63 61 6c  ics.** identical
ee10: 20 74 6f 20 74 68 6f 73 65 20 6f 66 20 74 68 65   to those of the
ee20: 20 22 77 69 6e 49 6f 65 72 72 43 61 6e 52 65 74   "winIoerrCanRet
ee30: 72 79 31 22 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23  ry1" macro..*/.#
ee40: 69 66 20 21 64 65 66 69 6e 65 64 28 77 69 6e 49  if !defined(winI
ee50: 6f 65 72 72 43 61 6e 52 65 74 72 79 31 29 0a 23  oerrCanRetry1).#
ee60: 64 65 66 69 6e 65 20 77 69 6e 49 6f 65 72 72 43  define winIoerrC
ee70: 61 6e 52 65 74 72 79 31 28 61 29 20 28 28 28 61  anRetry1(a) (((a
ee80: 29 3d 3d 45 52 52 4f 52 5f 41 43 43 45 53 53 5f  )==ERROR_ACCESS_
ee90: 44 45 4e 49 45 44 29 20 20 20 20 20 20 20 20 7c  DENIED)        |
eea0: 7c 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20  | \.            
eeb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eec0: 20 20 28 28 61 29 3d 3d 45 52 52 4f 52 5f 53 48    ((a)==ERROR_SH
eed0: 41 52 49 4e 47 5f 56 49 4f 4c 41 54 49 4f 4e 29  ARING_VIOLATION)
eee0: 20 20 20 20 7c 7c 20 5c 0a 20 20 20 20 20 20 20      || \.       
eef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef00: 20 20 20 20 20 20 20 28 28 61 29 3d 3d 45 52 52         ((a)==ERR
ef10: 4f 52 5f 4c 4f 43 4b 5f 56 49 4f 4c 41 54 49 4f  OR_LOCK_VIOLATIO
ef20: 4e 29 20 20 20 20 20 20 20 7c 7c 20 5c 0a 20 20  N)       || \.  
ef30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef40: 20 20 20 20 20 20 20 20 20 20 20 20 28 28 61 29              ((a)
ef50: 3d 3d 45 52 52 4f 52 5f 44 45 56 5f 4e 4f 54 5f  ==ERROR_DEV_NOT_
ef60: 45 58 49 53 54 29 20 20 20 20 20 20 20 20 7c 7c  EXIST)        ||
ef70: 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   \.             
ef80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef90: 20 28 28 61 29 3d 3d 45 52 52 4f 52 5f 4e 45 54   ((a)==ERROR_NET
efa0: 4e 41 4d 45 5f 44 45 4c 45 54 45 44 29 20 20 20  NAME_DELETED)   
efb0: 20 20 20 7c 7c 20 5c 0a 20 20 20 20 20 20 20 20     || \.        
efc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
efd0: 20 20 20 20 20 20 28 28 61 29 3d 3d 45 52 52 4f        ((a)==ERRO
efe0: 52 5f 53 45 4d 5f 54 49 4d 45 4f 55 54 29 20 20  R_SEM_TIMEOUT)  
eff0: 20 20 20 20 20 20 20 20 7c 7c 20 5c 0a 20 20 20          || \.   
f000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f010: 20 20 20 20 20 20 20 20 20 20 20 28 28 61 29 3d             ((a)=
f020: 3d 45 52 52 4f 52 5f 4e 45 54 57 4f 52 4b 5f 55  =ERROR_NETWORK_U
f030: 4e 52 45 41 43 48 41 42 4c 45 29 29 0a 23 65 6e  NREACHABLE)).#en
f040: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 20  dif../*.** If a 
f050: 52 65 61 64 46 69 6c 65 28 29 20 6f 72 20 57 72  ReadFile() or Wr
f060: 69 74 65 46 69 6c 65 28 29 20 65 72 72 6f 72 20  iteFile() error 
f070: 6f 63 63 75 72 73 2c 20 69 6e 76 6f 6b 65 20 74  occurs, invoke t
f080: 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 74  his routine.** t
f090: 6f 20 73 65 65 20 69 66 20 69 74 20 73 68 6f 75  o see if it shou
f0a0: 6c 64 20 62 65 20 72 65 74 72 69 65 64 2e 20 20  ld be retried.  
f0b0: 52 65 74 75 72 6e 20 54 52 55 45 20 74 6f 20 72  Return TRUE to r
f0c0: 65 74 72 79 2e 20 20 52 65 74 75 72 6e 20 46 41  etry.  Return FA
f0d0: 4c 53 45 0a 2a 2a 20 74 6f 20 67 69 76 65 20 75  LSE.** to give u
f0e0: 70 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72 2e  p with an error.
f0f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
f100: 69 6e 52 65 74 72 79 49 6f 65 72 72 28 69 6e 74  inRetryIoerr(int
f110: 20 2a 70 6e 52 65 74 72 79 2c 20 44 57 4f 52 44   *pnRetry, DWORD
f120: 20 2a 70 45 72 72 6f 72 29 7b 0a 20 20 44 57 4f   *pError){.  DWO
f130: 52 44 20 65 20 3d 20 6f 73 47 65 74 4c 61 73 74  RD e = osGetLast
f140: 45 72 72 6f 72 28 29 3b 0a 20 20 69 66 28 20 2a  Error();.  if( *
f150: 70 6e 52 65 74 72 79 3e 3d 77 69 6e 49 6f 65 72  pnRetry>=winIoer
f160: 72 52 65 74 72 79 20 29 7b 0a 20 20 20 20 69 66  rRetry ){.    if
f170: 28 20 70 45 72 72 6f 72 20 29 7b 0a 20 20 20 20  ( pError ){.    
f180: 20 20 2a 70 45 72 72 6f 72 20 3d 20 65 3b 0a 20    *pError = e;. 
f190: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
f1a0: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 77 69 6e  0;.  }.  if( win
f1b0: 49 6f 65 72 72 43 61 6e 52 65 74 72 79 31 28 65  IoerrCanRetry1(e
f1c0: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
f1d0: 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28 77 69 6e  _win32_sleep(win
f1e0: 49 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79 2a  IoerrRetryDelay*
f1f0: 28 31 2b 2a 70 6e 52 65 74 72 79 29 29 3b 0a 20  (1+*pnRetry));. 
f200: 20 20 20 2b 2b 2a 70 6e 52 65 74 72 79 3b 0a 20     ++*pnRetry;. 
f210: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
f220: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 77 69 6e  .#if defined(win
f230: 49 6f 65 72 72 43 61 6e 52 65 74 72 79 32 29 0a  IoerrCanRetry2).
f240: 20 20 65 6c 73 65 20 69 66 28 20 77 69 6e 49 6f    else if( winIo
f250: 65 72 72 43 61 6e 52 65 74 72 79 32 28 65 29 20  errCanRetry2(e) 
f260: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 77  ){.    sqlite3_w
f270: 69 6e 33 32 5f 73 6c 65 65 70 28 77 69 6e 49 6f  in32_sleep(winIo
f280: 65 72 72 52 65 74 72 79 44 65 6c 61 79 2a 28 31  errRetryDelay*(1
f290: 2b 2a 70 6e 52 65 74 72 79 29 29 3b 0a 20 20 20  +*pnRetry));.   
f2a0: 20 2b 2b 2a 70 6e 52 65 74 72 79 3b 0a 20 20 20   ++*pnRetry;.   
f2b0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 23   return 1;.  }.#
f2c0: 65 6e 64 69 66 0a 20 20 69 66 28 20 70 45 72 72  endif.  if( pErr
f2d0: 6f 72 20 29 7b 0a 20 20 20 20 2a 70 45 72 72 6f  or ){.    *pErro
f2e0: 72 20 3d 20 65 3b 0a 20 20 7d 0a 20 20 72 65 74  r = e;.  }.  ret
f2f0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
f300: 4c 6f 67 20 61 20 49 2f 4f 20 65 72 72 6f 72 20  Log a I/O error 
f310: 72 65 74 72 79 20 65 70 69 73 6f 64 65 2e 0a 2a  retry episode..*
f320: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69  /.static void wi
f330: 6e 4c 6f 67 49 6f 65 72 72 28 69 6e 74 20 6e 52  nLogIoerr(int nR
f340: 65 74 72 79 29 7b 0a 20 20 69 66 28 20 6e 52 65  etry){.  if( nRe
f350: 74 72 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  try ){.    sqlit
f360: 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 49 4f  e3_log(SQLITE_IO
f370: 45 52 52 2c 0a 20 20 20 20 20 20 22 64 65 6c 61  ERR,.      "dela
f380: 79 65 64 20 25 64 6d 73 20 66 6f 72 20 6c 6f 63  yed %dms for loc
f390: 6b 2f 73 68 61 72 69 6e 67 20 63 6f 6e 66 6c 69  k/sharing confli
f3a0: 63 74 22 2c 0a 20 20 20 20 20 20 77 69 6e 49 6f  ct",.      winIo
f3b0: 65 72 72 52 65 74 72 79 44 65 6c 61 79 2a 6e 52  errRetryDelay*nR
f3c0: 65 74 72 79 2a 28 6e 52 65 74 72 79 2b 31 29 2f  etry*(nRetry+1)/
f3d0: 32 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a 0a  2.    );.  }.}..
f3e0: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
f3f0: 4e 43 45 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  NCE./***********
f400: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f410: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f420: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f430: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
f440: 2a 20 54 68 69 73 20 73 65 63 74 69 6f 6e 20 63  * This section c
f450: 6f 6e 74 61 69 6e 73 20 63 6f 64 65 20 66 6f 72  ontains code for
f460: 20 57 69 6e 43 45 20 6f 6e 6c 79 2e 0a 2a 2f 0a   WinCE only..*/.
f470: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
f480: 49 54 45 5f 4d 53 56 43 5f 4c 4f 43 41 4c 54 49  ITE_MSVC_LOCALTI
f490: 4d 45 5f 41 50 49 29 20 7c 7c 20 21 53 51 4c 49  ME_API) || !SQLI
f4a0: 54 45 5f 4d 53 56 43 5f 4c 4f 43 41 4c 54 49 4d  TE_MSVC_LOCALTIM
f4b0: 45 5f 41 50 49 0a 2f 2a 0a 2a 2a 20 54 68 65 20  E_API./*.** The 
f4c0: 4d 53 56 43 20 43 52 54 20 6f 6e 20 57 69 6e 64  MSVC CRT on Wind
f4d0: 6f 77 73 20 43 45 20 6d 61 79 20 6e 6f 74 20 68  ows CE may not h
f4e0: 61 76 65 20 61 20 6c 6f 63 61 6c 74 69 6d 65 28  ave a localtime(
f4f0: 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 53 6f 0a  ) function.  So.
f500: 2a 2a 20 63 72 65 61 74 65 20 61 20 73 75 62 73  ** create a subs
f510: 74 69 74 75 74 65 2e 0a 2a 2f 0a 23 69 6e 63 6c  titute..*/.#incl
f520: 75 64 65 20 3c 74 69 6d 65 2e 68 3e 0a 73 74 72  ude <time.h>.str
f530: 75 63 74 20 74 6d 20 2a 5f 5f 63 64 65 63 6c 20  uct tm *__cdecl 
f540: 6c 6f 63 61 6c 74 69 6d 65 28 63 6f 6e 73 74 20  localtime(const 
f550: 74 69 6d 65 5f 74 20 2a 74 29 0a 7b 0a 20 20 73  time_t *t).{.  s
f560: 74 61 74 69 63 20 73 74 72 75 63 74 20 74 6d 20  tatic struct tm 
f570: 79 3b 0a 20 20 46 49 4c 45 54 49 4d 45 20 75 54  y;.  FILETIME uT
f580: 6d 2c 20 6c 54 6d 3b 0a 20 20 53 59 53 54 45 4d  m, lTm;.  SYSTEM
f590: 54 49 4d 45 20 70 54 6d 3b 0a 20 20 73 71 6c 69  TIME pTm;.  sqli
f5a0: 74 65 33 5f 69 6e 74 36 34 20 74 36 34 3b 0a 20  te3_int64 t64;. 
f5b0: 20 74 36 34 20 3d 20 2a 74 3b 0a 20 20 74 36 34   t64 = *t;.  t64
f5c0: 20 3d 20 28 74 36 34 20 2b 20 31 31 36 34 34 34   = (t64 + 116444
f5d0: 37 33 36 30 30 29 2a 31 30 30 30 30 30 30 30 3b  73600)*10000000;
f5e0: 0a 20 20 75 54 6d 2e 64 77 4c 6f 77 44 61 74 65  .  uTm.dwLowDate
f5f0: 54 69 6d 65 20 3d 20 28 44 57 4f 52 44 29 28 74  Time = (DWORD)(t
f600: 36 34 20 26 20 30 78 46 46 46 46 46 46 46 46 29  64 & 0xFFFFFFFF)
f610: 3b 0a 20 20 75 54 6d 2e 64 77 48 69 67 68 44 61  ;.  uTm.dwHighDa
f620: 74 65 54 69 6d 65 3d 20 28 44 57 4f 52 44 29 28  teTime= (DWORD)(
f630: 74 36 34 20 3e 3e 20 33 32 29 3b 0a 20 20 6f 73  t64 >> 32);.  os
f640: 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63 61 6c 46  FileTimeToLocalF
f650: 69 6c 65 54 69 6d 65 28 26 75 54 6d 2c 26 6c 54  ileTime(&uTm,&lT
f660: 6d 29 3b 0a 20 20 6f 73 46 69 6c 65 54 69 6d 65  m);.  osFileTime
f670: 54 6f 53 79 73 74 65 6d 54 69 6d 65 28 26 6c 54  ToSystemTime(&lT
f680: 6d 2c 26 70 54 6d 29 3b 0a 20 20 79 2e 74 6d 5f  m,&pTm);.  y.tm_
f690: 79 65 61 72 20 3d 20 70 54 6d 2e 77 59 65 61 72  year = pTm.wYear
f6a0: 20 2d 20 31 39 30 30 3b 0a 20 20 79 2e 74 6d 5f   - 1900;.  y.tm_
f6b0: 6d 6f 6e 20 3d 20 70 54 6d 2e 77 4d 6f 6e 74 68  mon = pTm.wMonth
f6c0: 20 2d 20 31 3b 0a 20 20 79 2e 74 6d 5f 77 64 61   - 1;.  y.tm_wda
f6d0: 79 20 3d 20 70 54 6d 2e 77 44 61 79 4f 66 57 65  y = pTm.wDayOfWe
f6e0: 65 6b 3b 0a 20 20 79 2e 74 6d 5f 6d 64 61 79 20  ek;.  y.tm_mday 
f6f0: 3d 20 70 54 6d 2e 77 44 61 79 3b 0a 20 20 79 2e  = pTm.wDay;.  y.
f700: 74 6d 5f 68 6f 75 72 20 3d 20 70 54 6d 2e 77 48  tm_hour = pTm.wH
f710: 6f 75 72 3b 0a 20 20 79 2e 74 6d 5f 6d 69 6e 20  our;.  y.tm_min 
f720: 3d 20 70 54 6d 2e 77 4d 69 6e 75 74 65 3b 0a 20  = pTm.wMinute;. 
f730: 20 79 2e 74 6d 5f 73 65 63 20 3d 20 70 54 6d 2e   y.tm_sec = pTm.
f740: 77 53 65 63 6f 6e 64 3b 0a 20 20 72 65 74 75 72  wSecond;.  retur
f750: 6e 20 26 79 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  n &y;.}.#endif..
f760: 23 64 65 66 69 6e 65 20 48 41 4e 44 4c 45 5f 54  #define HANDLE_T
f770: 4f 5f 57 49 4e 46 49 4c 45 28 61 29 20 28 77 69  O_WINFILE(a) (wi
f780: 6e 46 69 6c 65 2a 29 26 28 28 63 68 61 72 2a 29  nFile*)&((char*)
f790: 61 29 5b 2d 28 69 6e 74 29 6f 66 66 73 65 74 6f  a)[-(int)offseto
f7a0: 66 28 77 69 6e 46 69 6c 65 2c 68 29 5d 0a 0a 2f  f(winFile,h)]../
f7b0: 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 6c  *.** Acquire a l
f7c0: 6f 63 6b 20 6f 6e 20 74 68 65 20 68 61 6e 64 6c  ock on the handl
f7d0: 65 20 68 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  e h.*/.static vo
f7e0: 69 64 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71  id winceMutexAcq
f7f0: 75 69 72 65 28 48 41 4e 44 4c 45 20 68 29 7b 0a  uire(HANDLE h){.
f800: 20 20 20 44 57 4f 52 44 20 64 77 45 72 72 3b 0a     DWORD dwErr;.
f810: 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 64 77 45     do {.     dwE
f820: 72 72 20 3d 20 6f 73 57 61 69 74 46 6f 72 53 69  rr = osWaitForSi
f830: 6e 67 6c 65 4f 62 6a 65 63 74 28 68 2c 20 49 4e  ngleObject(h, IN
f840: 46 49 4e 49 54 45 29 3b 0a 20 20 20 7d 20 77 68  FINITE);.   } wh
f850: 69 6c 65 20 28 64 77 45 72 72 20 21 3d 20 57 41  ile (dwErr != WA
f860: 49 54 5f 4f 42 4a 45 43 54 5f 30 20 26 26 20 64  IT_OBJECT_0 && d
f870: 77 45 72 72 20 21 3d 20 57 41 49 54 5f 41 42 41  wErr != WAIT_ABA
f880: 4e 44 4f 4e 45 44 29 3b 0a 7d 0a 2f 2a 0a 2a 2a  NDONED);.}./*.**
f890: 20 52 65 6c 65 61 73 65 20 61 20 6c 6f 63 6b 20   Release a lock 
f8a0: 61 63 71 75 69 72 65 64 20 62 79 20 77 69 6e 63  acquired by winc
f8b0: 65 4d 75 74 65 78 41 63 71 75 69 72 65 28 29 0a  eMutexAcquire().
f8c0: 2a 2f 0a 23 64 65 66 69 6e 65 20 77 69 6e 63 65  */.#define wince
f8d0: 4d 75 74 65 78 52 65 6c 65 61 73 65 28 68 29 20  MutexRelease(h) 
f8e0: 52 65 6c 65 61 73 65 4d 75 74 65 78 28 68 29 0a  ReleaseMutex(h).
f8f0: 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74 68  ./*.** Create th
f900: 65 20 6d 75 74 65 78 20 61 6e 64 20 73 68 61 72  e mutex and shar
f910: 65 64 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 66  ed memory used f
f920: 6f 72 20 6c 6f 63 6b 69 6e 67 20 69 6e 20 74 68  or locking in th
f930: 65 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69  e file.** descri
f940: 70 74 6f 72 20 70 46 69 6c 65 0a 2a 2f 0a 73 74  ptor pFile.*/.st
f950: 61 74 69 63 20 69 6e 74 20 77 69 6e 63 65 43 72  atic int winceCr
f960: 65 61 74 65 4c 6f 63 6b 28 63 6f 6e 73 74 20 63  eateLock(const c
f970: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
f980: 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b  winFile *pFile){
f990: 0a 20 20 4c 50 57 53 54 52 20 7a 54 6f 6b 3b 0a  .  LPWSTR zTok;.
f9a0: 20 20 4c 50 57 53 54 52 20 7a 4e 61 6d 65 3b 0a    LPWSTR zName;.
f9b0: 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e    DWORD lastErrn
f9c0: 6f 3b 0a 20 20 42 4f 4f 4c 20 62 4c 6f 67 67 65  o;.  BOOL bLogge
f9d0: 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20 42 4f 4f  d = FALSE;.  BOO
f9e0: 4c 20 62 49 6e 69 74 20 3d 20 54 52 55 45 3b 0a  L bInit = TRUE;.
f9f0: 0a 20 20 7a 4e 61 6d 65 20 3d 20 77 69 6e 55 74  .  zName = winUt
fa00: 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c  f8ToUnicode(zFil
fa10: 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e  ename);.  if( zN
fa20: 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  ame==0 ){.    /*
fa30: 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 20 2a   out of memory *
fa40: 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  /.    return SQL
fa50: 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b  ITE_IOERR_NOMEM;
fa60: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69  .  }..  /* Initi
fa70: 61 6c 69 7a 65 20 74 68 65 20 6c 6f 63 61 6c 20  alize the local 
fa80: 6c 6f 63 6b 64 61 74 61 20 2a 2f 0a 20 20 6d 65  lockdata */.  me
fa90: 6d 73 65 74 28 26 70 46 69 6c 65 2d 3e 6c 6f 63  mset(&pFile->loc
faa0: 61 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 46  al, 0, sizeof(pF
fab0: 69 6c 65 2d 3e 6c 6f 63 61 6c 29 29 3b 0a 0a 20  ile->local));.. 
fac0: 20 2f 2a 20 52 65 70 6c 61 63 65 20 74 68 65 20   /* Replace the 
fad0: 62 61 63 6b 73 6c 61 73 68 65 73 20 66 72 6f 6d  backslashes from
fae0: 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 61 6e   the filename an
faf0: 64 20 6c 6f 77 65 72 63 61 73 65 20 69 74 0a 20  d lowercase it. 
fb00: 20 2a 2a 20 74 6f 20 64 65 72 69 76 65 20 61 20   ** to derive a 
fb10: 6d 75 74 65 78 20 6e 61 6d 65 2e 20 2a 2f 0a 20  mutex name. */. 
fb20: 20 7a 54 6f 6b 20 3d 20 6f 73 43 68 61 72 4c 6f   zTok = osCharLo
fb30: 77 65 72 57 28 7a 4e 61 6d 65 29 3b 0a 20 20 66  werW(zName);.  f
fb40: 6f 72 20 28 3b 2a 7a 54 6f 6b 3b 7a 54 6f 6b 2b  or (;*zTok;zTok+
fb50: 2b 29 7b 0a 20 20 20 20 69 66 20 28 2a 7a 54 6f  +){.    if (*zTo
fb60: 6b 20 3d 3d 20 27 5c 5c 27 29 20 2a 7a 54 6f 6b  k == '\\') *zTok
fb70: 20 3d 20 27 5f 27 3b 0a 20 20 7d 0a 0a 20 20 2f   = '_';.  }..  /
fb80: 2a 20 43 72 65 61 74 65 2f 6f 70 65 6e 20 74 68  * Create/open th
fb90: 65 20 6e 61 6d 65 64 20 6d 75 74 65 78 20 2a 2f  e named mutex */
fba0: 0a 20 20 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78  .  pFile->hMutex
fbb0: 20 3d 20 6f 73 43 72 65 61 74 65 4d 75 74 65 78   = osCreateMutex
fbc0: 57 28 4e 55 4c 4c 2c 20 46 41 4c 53 45 2c 20 7a  W(NULL, FALSE, z
fbd0: 4e 61 6d 65 29 3b 0a 20 20 69 66 20 28 21 70 46  Name);.  if (!pF
fbe0: 69 6c 65 2d 3e 68 4d 75 74 65 78 29 7b 0a 20 20  ile->hMutex){.  
fbf0: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
fc00: 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
fc10: 72 6f 72 28 29 3b 0a 20 20 20 20 73 71 6c 69 74  ror();.    sqlit
fc20: 65 33 5f 66 72 65 65 28 7a 4e 61 6d 65 29 3b 0a  e3_free(zName);.
fc30: 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f      return winLo
fc40: 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
fc50: 45 52 52 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74  ERR, pFile->last
fc60: 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  Errno,.         
fc70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
fc80: 69 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b 31 22  inceCreateLock1"
fc90: 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  , zFilename);.  
fca0: 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20  }..  /* Acquire 
fcb0: 74 68 65 20 6d 75 74 65 78 20 62 65 66 6f 72 65  the mutex before
fcc0: 20 63 6f 6e 74 69 6e 75 69 6e 67 20 2a 2f 0a 20   continuing */. 
fcd0: 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71 75 69   winceMutexAcqui
fce0: 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78  re(pFile->hMutex
fcf0: 29 3b 0a 0a 20 20 2f 2a 20 53 69 6e 63 65 20 74  );..  /* Since t
fd00: 68 65 20 6e 61 6d 65 73 20 6f 66 20 6e 61 6d 65  he names of name
fd10: 64 20 6d 75 74 65 78 65 73 2c 20 73 65 6d 61 70  d mutexes, semap
fd20: 68 6f 72 65 73 2c 20 66 69 6c 65 20 6d 61 70 70  hores, file mapp
fd30: 69 6e 67 73 20 65 74 63 20 61 72 65 0a 20 20 2a  ings etc are.  *
fd40: 2a 20 63 61 73 65 2d 73 65 6e 73 69 74 69 76 65  * case-sensitive
fd50: 2c 20 74 61 6b 65 20 61 64 76 61 6e 74 61 67 65  , take advantage
fd60: 20 6f 66 20 74 68 61 74 20 62 79 20 75 70 70 65   of that by uppe
fd70: 72 63 61 73 69 6e 67 20 74 68 65 20 6d 75 74 65  rcasing the mute
fd80: 78 20 6e 61 6d 65 0a 20 20 2a 2a 20 61 6e 64 20  x name.  ** and 
fd90: 75 73 69 6e 67 20 74 68 61 74 20 61 73 20 74 68  using that as th
fda0: 65 20 73 68 61 72 65 64 20 66 69 6c 65 6d 61 70  e shared filemap
fdb0: 70 69 6e 67 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a  ping name..  */.
fdc0: 20 20 6f 73 43 68 61 72 55 70 70 65 72 57 28 7a    osCharUpperW(z
fdd0: 4e 61 6d 65 29 3b 0a 20 20 70 46 69 6c 65 2d 3e  Name);.  pFile->
fde0: 68 53 68 61 72 65 64 20 3d 20 6f 73 43 72 65 61  hShared = osCrea
fdf0: 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 28 49  teFileMappingW(I
fe00: 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
fe10: 4c 55 45 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20  LUE, NULL,.     
fe20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fe30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fe40: 20 20 20 50 41 47 45 5f 52 45 41 44 57 52 49 54     PAGE_READWRIT
fe50: 45 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 69 6e  E, 0, sizeof(win
fe60: 63 65 4c 6f 63 6b 29 2c 0a 20 20 20 20 20 20 20  ceLock),.       
fe70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fe80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fe90: 20 7a 4e 61 6d 65 29 3b 0a 0a 20 20 2f 2a 20 53   zName);..  /* S
fea0: 65 74 20 61 20 66 6c 61 67 20 74 68 61 74 20 69  et a flag that i
feb0: 6e 64 69 63 61 74 65 73 20 77 65 27 72 65 20 74  ndicates we're t
fec0: 68 65 20 66 69 72 73 74 20 74 6f 20 63 72 65 61  he first to crea
fed0: 74 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 73 6f  te the memory so
fee0: 20 69 74 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65   it.  ** must be
fef0: 20 7a 65 72 6f 2d 69 6e 69 74 69 61 6c 69 7a 65   zero-initialize
ff00: 64 20 2a 2f 0a 20 20 6c 61 73 74 45 72 72 6e 6f  d */.  lastErrno
ff10: 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
ff20: 72 28 29 3b 0a 20 20 69 66 20 28 6c 61 73 74 45  r();.  if (lastE
ff30: 72 72 6e 6f 20 3d 3d 20 45 52 52 4f 52 5f 41 4c  rrno == ERROR_AL
ff40: 52 45 41 44 59 5f 45 58 49 53 54 53 29 7b 0a 20  READY_EXISTS){. 
ff50: 20 20 20 62 49 6e 69 74 20 3d 20 46 41 4c 53 45     bInit = FALSE
ff60: 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  ;.  }..  sqlite3
ff70: 5f 66 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 0a 20  _free(zName);.. 
ff80: 20 2f 2a 20 49 66 20 77 65 20 73 75 63 63 65 65   /* If we succee
ff90: 64 65 64 20 69 6e 20 6d 61 6b 69 6e 67 20 74 68  ded in making th
ffa0: 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  e shared memory 
ffb0: 68 61 6e 64 6c 65 2c 20 6d 61 70 20 69 74 2e 20  handle, map it. 
ffc0: 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
ffd0: 68 53 68 61 72 65 64 20 29 7b 0a 20 20 20 20 70  hShared ){.    p
ffe0: 46 69 6c 65 2d 3e 73 68 61 72 65 64 20 3d 20 28  File->shared = (
fff0: 77 69 6e 63 65 4c 6f 63 6b 2a 29 6f 73 4d 61 70  winceLock*)osMap
10000 56 69 65 77 4f 66 46 69 6c 65 28 70 46 69 6c 65  ViewOfFile(pFile
10010 2d 3e 68 53 68 61 72 65 64 2c 0a 20 20 20 20 20  ->hShared,.     
10020 20 20 20 20 20 20 20 20 46 49 4c 45 5f 4d 41 50          FILE_MAP
10030 5f 52 45 41 44 7c 46 49 4c 45 5f 4d 41 50 5f 57  _READ|FILE_MAP_W
10040 52 49 54 45 2c 20 30 2c 20 30 2c 20 73 69 7a 65  RITE, 0, 0, size
10050 6f 66 28 77 69 6e 63 65 4c 6f 63 6b 29 29 3b 0a  of(winceLock));.
10060 20 20 20 20 2f 2a 20 49 66 20 6d 61 70 70 69 6e      /* If mappin
10070 67 20 66 61 69 6c 65 64 2c 20 63 6c 6f 73 65 20  g failed, close 
10080 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  the shared memor
10090 79 20 68 61 6e 64 6c 65 20 61 6e 64 20 65 72 61  y handle and era
100a0 73 65 20 69 74 20 2a 2f 0a 20 20 20 20 69 66 28  se it */.    if(
100b0 20 21 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 20   !pFile->shared 
100c0 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
100d0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
100e0 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
100f0 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28      winLogError(
10100 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 70 46  SQLITE_IOERR, pF
10110 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a  ile->lastErrno,.
10120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10130 20 20 22 77 69 6e 63 65 43 72 65 61 74 65 4c 6f    "winceCreateLo
10140 63 6b 32 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29  ck2", zFilename)
10150 3b 0a 20 20 20 20 20 20 62 4c 6f 67 67 65 64 20  ;.      bLogged 
10160 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20 6f 73  = TRUE;.      os
10170 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c  CloseHandle(pFil
10180 65 2d 3e 68 53 68 61 72 65 64 29 3b 0a 20 20 20  e->hShared);.   
10190 20 20 20 70 46 69 6c 65 2d 3e 68 53 68 61 72 65     pFile->hShare
101a0 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a  d = NULL;.    }.
101b0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 73 68 61    }..  /* If sha
101c0 72 65 64 20 6d 65 6d 6f 72 79 20 63 6f 75 6c 64  red memory could
101d0 20 6e 6f 74 20 62 65 20 63 72 65 61 74 65 64 2c   not be created,
101e0 20 74 68 65 6e 20 63 6c 6f 73 65 20 74 68 65 20   then close the 
101f0 6d 75 74 65 78 20 61 6e 64 20 66 61 69 6c 20 2a  mutex and fail *
10200 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 68  /.  if( pFile->h
10210 53 68 61 72 65 64 3d 3d 4e 55 4c 4c 20 29 7b 0a  Shared==NULL ){.
10220 20 20 20 20 69 66 28 20 21 62 4c 6f 67 67 65 64      if( !bLogged
10230 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   ){.      pFile-
10240 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73  >lastErrno = las
10250 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 77 69  tErrno;.      wi
10260 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
10270 5f 49 4f 45 52 52 2c 20 70 46 69 6c 65 2d 3e 6c  _IOERR, pFile->l
10280 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
10290 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
102a0 63 65 43 72 65 61 74 65 4c 6f 63 6b 33 22 2c 20  ceCreateLock3", 
102b0 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  zFilename);.    
102c0 20 20 62 4c 6f 67 67 65 64 20 3d 20 54 52 55 45    bLogged = TRUE
102d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 69 6e 63  ;.    }.    winc
102e0 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28 70 46  eMutexRelease(pF
102f0 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20  ile->hMutex);.  
10300 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28    osCloseHandle(
10310 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a  pFile->hMutex);.
10320 20 20 20 20 70 46 69 6c 65 2d 3e 68 4d 75 74 65      pFile->hMute
10330 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 72 65  x = NULL;.    re
10340 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
10350 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69  R;.  }..  /* Ini
10360 74 69 61 6c 69 7a 65 20 74 68 65 20 73 68 61 72  tialize the shar
10370 65 64 20 6d 65 6d 6f 72 79 20 69 66 20 77 65 27  ed memory if we'
10380 72 65 20 73 75 70 70 6f 73 65 64 20 74 6f 20 2a  re supposed to *
10390 2f 0a 20 20 69 66 28 20 62 49 6e 69 74 20 29 7b  /.  if( bInit ){
103a0 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 46 69 6c  .    memset(pFil
103b0 65 2d 3e 73 68 61 72 65 64 2c 20 30 2c 20 73 69  e->shared, 0, si
103c0 7a 65 6f 66 28 77 69 6e 63 65 4c 6f 63 6b 29 29  zeof(winceLock))
103d0 3b 0a 20 20 7d 0a 0a 20 20 77 69 6e 63 65 4d 75  ;.  }..  winceMu
103e0 74 65 78 52 65 6c 65 61 73 65 28 70 46 69 6c 65  texRelease(pFile
103f0 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 72 65 74  ->hMutex);.  ret
10400 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
10410 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 74 72 6f 79 20  ../*.** Destroy 
10420 74 68 65 20 70 61 72 74 20 6f 66 20 77 69 6e 46  the part of winF
10430 69 6c 65 20 74 68 61 74 20 64 65 61 6c 73 20 77  ile that deals w
10440 69 74 68 20 77 69 6e 63 65 20 6c 6f 63 6b 73 0a  ith wince locks.
10450 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
10460 69 6e 63 65 44 65 73 74 72 6f 79 4c 6f 63 6b 28  inceDestroyLock(
10470 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b  winFile *pFile){
10480 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 68 4d  .  if (pFile->hM
10490 75 74 65 78 29 7b 0a 20 20 20 20 2f 2a 20 41 63  utex){.    /* Ac
104a0 71 75 69 72 65 20 74 68 65 20 6d 75 74 65 78 20  quire the mutex 
104b0 2a 2f 0a 20 20 20 20 77 69 6e 63 65 4d 75 74 65  */.    winceMute
104c0 78 41 63 71 75 69 72 65 28 70 46 69 6c 65 2d 3e  xAcquire(pFile->
104d0 68 4d 75 74 65 78 29 3b 0a 0a 20 20 20 20 2f 2a  hMutex);..    /*
104e0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62   The following b
104f0 6c 6f 63 6b 73 20 73 68 6f 75 6c 64 20 70 72 6f  locks should pro
10500 62 61 62 6c 79 20 61 73 73 65 72 74 20 69 6e 20  bably assert in 
10510 64 65 62 75 67 20 6d 6f 64 65 2c 20 62 75 74 20  debug mode, but 
10520 74 68 65 79 0a 20 20 20 20 20 20 20 61 72 65 20  they.       are 
10530 74 6f 20 63 6c 65 61 6e 75 70 20 69 6e 20 63 61  to cleanup in ca
10540 73 65 20 61 6e 79 20 6c 6f 63 6b 73 20 72 65 6d  se any locks rem
10550 61 69 6e 65 64 20 6f 70 65 6e 20 2a 2f 0a 20 20  ained open */.  
10560 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63    if (pFile->loc
10570 61 6c 2e 6e 52 65 61 64 65 72 73 29 7b 0a 20 20  al.nReaders){.  
10580 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65      pFile->share
10590 64 2d 3e 6e 52 65 61 64 65 72 73 20 2d 2d 3b 0a  d->nReaders --;.
105a0 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 70 46      }.    if (pF
105b0 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65  ile->local.bRese
105c0 72 76 65 64 29 7b 0a 20 20 20 20 20 20 70 46 69  rved){.      pFi
105d0 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52 65 73  le->shared->bRes
105e0 65 72 76 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20  erved = FALSE;. 
105f0 20 20 20 7d 0a 20 20 20 20 69 66 20 28 70 46 69     }.    if (pFi
10600 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69  le->local.bPendi
10610 6e 67 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  ng){.      pFile
10620 2d 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e 64 69  ->shared->bPendi
10630 6e 67 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20  ng = FALSE;.    
10640 7d 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d  }.    if (pFile-
10650 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69 76  >local.bExclusiv
10660 65 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  e){.      pFile-
10670 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75 73  >shared->bExclus
10680 69 76 65 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20  ive = FALSE;.   
10690 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 2d 72 65   }..    /* De-re
106a0 66 65 72 65 6e 63 65 20 61 6e 64 20 63 6c 6f 73  ference and clos
106b0 65 20 6f 75 72 20 63 6f 70 79 20 6f 66 20 74 68  e our copy of th
106c0 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  e shared memory 
106d0 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 20 20 6f 73  handle */.    os
106e0 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 28  UnmapViewOfFile(
106f0 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 29 3b 0a  pFile->shared);.
10700 20 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c      osCloseHandl
10710 65 28 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64  e(pFile->hShared
10720 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 6e 65 20  );..    /* Done 
10730 77 69 74 68 20 74 68 65 20 6d 75 74 65 78 20 2a  with the mutex *
10740 2f 0a 20 20 20 20 77 69 6e 63 65 4d 75 74 65 78  /.    winceMutex
10750 52 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68  Release(pFile->h
10760 4d 75 74 65 78 29 3b 0a 20 20 20 20 6f 73 43 6c  Mutex);.    osCl
10770 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d  oseHandle(pFile-
10780 3e 68 4d 75 74 65 78 29 3b 0a 20 20 20 20 70 46  >hMutex);.    pF
10790 69 6c 65 2d 3e 68 4d 75 74 65 78 20 3d 20 4e 55  ile->hMutex = NU
107a0 4c 4c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  LL;.  }.}../*.**
107b0 20 41 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69   An implementati
107c0 6f 6e 20 6f 66 20 74 68 65 20 4c 6f 63 6b 46 69  on of the LockFi
107d0 6c 65 28 29 20 41 50 49 20 6f 66 20 57 69 6e 64  le() API of Wind
107e0 6f 77 73 20 66 6f 72 20 43 45 0a 2a 2f 0a 73 74  ows for CE.*/.st
107f0 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 63 65 4c  atic BOOL winceL
10800 6f 63 6b 46 69 6c 65 28 0a 20 20 4c 50 48 41 4e  ockFile(.  LPHAN
10810 44 4c 45 20 70 68 46 69 6c 65 2c 0a 20 20 44 57  DLE phFile,.  DW
10820 4f 52 44 20 64 77 46 69 6c 65 4f 66 66 73 65 74  ORD dwFileOffset
10830 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 64 77 46  Low,.  DWORD dwF
10840 69 6c 65 4f 66 66 73 65 74 48 69 67 68 2c 0a 20  ileOffsetHigh,. 
10850 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66   DWORD nNumberOf
10860 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 2c 0a  BytesToLockLow,.
10870 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f    DWORD nNumberO
10880 66 42 79 74 65 73 54 6f 4c 6f 63 6b 48 69 67 68  fBytesToLockHigh
10890 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70  .){.  winFile *p
108a0 46 69 6c 65 20 3d 20 48 41 4e 44 4c 45 5f 54 4f  File = HANDLE_TO
108b0 5f 57 49 4e 46 49 4c 45 28 70 68 46 69 6c 65 29  _WINFILE(phFile)
108c0 3b 0a 20 20 42 4f 4f 4c 20 62 52 65 74 75 72 6e  ;.  BOOL bReturn
108d0 20 3d 20 46 41 4c 53 45 3b 0a 0a 20 20 55 4e 55   = FALSE;..  UNU
108e0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 77  SED_PARAMETER(dw
108f0 46 69 6c 65 4f 66 66 73 65 74 48 69 67 68 29 3b  FileOffsetHigh);
10900 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
10910 54 45 52 28 6e 4e 75 6d 62 65 72 4f 66 42 79 74  TER(nNumberOfByt
10920 65 73 54 6f 4c 6f 63 6b 48 69 67 68 29 3b 0a 0a  esToLockHigh);..
10930 20 20 69 66 20 28 21 70 46 69 6c 65 2d 3e 68 4d    if (!pFile->hM
10940 75 74 65 78 29 20 72 65 74 75 72 6e 20 54 52 55  utex) return TRU
10950 45 3b 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 41  E;.  winceMutexA
10960 63 71 75 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d  cquire(pFile->hM
10970 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 57 61 6e  utex);..  /* Wan
10980 74 69 6e 67 20 61 6e 20 65 78 63 6c 75 73 69 76  ting an exclusiv
10990 65 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 69 66 20  e lock? */.  if 
109a0 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77  (dwFileOffsetLow
109b0 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45   == (DWORD)SHARE
109c0 44 5f 46 49 52 53 54 0a 20 20 20 20 20 20 20 26  D_FIRST.       &
109d0 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  & nNumberOfBytes
109e0 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 28 44 57  ToLockLow == (DW
109f0 4f 52 44 29 53 48 41 52 45 44 5f 53 49 5a 45 29  ORD)SHARED_SIZE)
10a00 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d  {.    if (pFile-
10a10 3e 73 68 61 72 65 64 2d 3e 6e 52 65 61 64 65 72  >shared->nReader
10a20 73 20 3d 3d 20 30 20 26 26 20 70 46 69 6c 65 2d  s == 0 && pFile-
10a30 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75 73  >shared->bExclus
10a40 69 76 65 20 3d 3d 20 30 29 7b 0a 20 20 20 20 20  ive == 0){.     
10a50 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d    pFile->shared-
10a60 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 20 54 52  >bExclusive = TR
10a70 55 45 3b 0a 20 20 20 20 20 20 20 70 46 69 6c 65  UE;.       pFile
10a80 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69  ->local.bExclusi
10a90 76 65 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20  ve = TRUE;.     
10aa0 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45    bReturn = TRUE
10ab0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
10ac0 2a 20 57 61 6e 74 20 61 20 72 65 61 64 2d 6f 6e  * Want a read-on
10ad0 6c 79 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 65 6c  ly lock? */.  el
10ae0 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66  se if (dwFileOff
10af0 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44  setLow == (DWORD
10b00 29 53 48 41 52 45 44 5f 46 49 52 53 54 20 26 26  )SHARED_FIRST &&
10b10 0a 20 20 20 20 20 20 20 20 20 20 20 6e 4e 75 6d  .           nNum
10b20 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b  berOfBytesToLock
10b30 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20 69  Low == 1){.    i
10b40 66 20 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64  f (pFile->shared
10b50 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 3d 20  ->bExclusive == 
10b60 30 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  0){.      pFile-
10b70 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 20  >local.nReaders 
10b80 2b 2b 3b 0a 20 20 20 20 20 20 69 66 20 28 70 46  ++;.      if (pF
10b90 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64  ile->local.nRead
10ba0 65 72 73 20 3d 3d 20 31 29 7b 0a 20 20 20 20 20  ers == 1){.     
10bb0 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64     pFile->shared
10bc0 2d 3e 6e 52 65 61 64 65 72 73 20 2b 2b 3b 0a 20  ->nReaders ++;. 
10bd0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 52 65       }.      bRe
10be0 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20  turn = TRUE;.   
10bf0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 61 6e   }.  }..  /* Wan
10c00 74 20 61 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b  t a pending lock
10c10 3f 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20 28  ? */.  else if (
10c20 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20  dwFileOffsetLow 
10c30 3d 3d 20 28 44 57 4f 52 44 29 50 45 4e 44 49 4e  == (DWORD)PENDIN
10c40 47 5f 42 59 54 45 0a 20 20 20 20 20 20 20 20 20  G_BYTE.         
10c50 20 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79    && nNumberOfBy
10c60 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20  tesToLockLow == 
10c70 31 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f  1){.    /* If no
10c80 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 20 68 61   pending lock ha
10c90 73 20 62 65 65 6e 20 61 63 71 75 69 72 65 64 2c  s been acquired,
10ca0 20 74 68 65 6e 20 61 63 71 75 69 72 65 20 69 74   then acquire it
10cb0 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 46 69 6c   */.    if (pFil
10cc0 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e 64  e->shared->bPend
10cd0 69 6e 67 20 3d 3d 20 30 29 20 7b 0a 20 20 20 20  ing == 0) {.    
10ce0 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d    pFile->shared-
10cf0 3e 62 50 65 6e 64 69 6e 67 20 3d 20 54 52 55 45  >bPending = TRUE
10d00 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  ;.      pFile->l
10d10 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67 20 3d 20  ocal.bPending = 
10d20 54 52 55 45 3b 0a 20 20 20 20 20 20 62 52 65 74  TRUE;.      bRet
10d30 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20  urn = TRUE;.    
10d40 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 61 6e 74  }.  }..  /* Want
10d50 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b   a reserved lock
10d60 3f 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20 28  ? */.  else if (
10d70 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20  dwFileOffsetLow 
10d80 3d 3d 20 28 44 57 4f 52 44 29 52 45 53 45 52 56  == (DWORD)RESERV
10d90 45 44 5f 42 59 54 45 0a 20 20 20 20 20 20 20 20  ED_BYTE.        
10da0 20 20 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42     && nNumberOfB
10db0 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d  ytesToLockLow ==
10dc0 20 31 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69   1){.    if (pFi
10dd0 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52 65 73  le->shared->bRes
10de0 65 72 76 65 64 20 3d 3d 20 30 29 20 7b 0a 20 20  erved == 0) {.  
10df0 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65      pFile->share
10e00 64 2d 3e 62 52 65 73 65 72 76 65 64 20 3d 20 54  d->bReserved = T
10e10 52 55 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65  RUE;.      pFile
10e20 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76 65  ->local.bReserve
10e30 64 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20  d = TRUE;.      
10e40 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a  bReturn = TRUE;.
10e50 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 77 69 6e      }.  }..  win
10e60 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28 70  ceMutexRelease(p
10e70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20  File->hMutex);. 
10e80 20 72 65 74 75 72 6e 20 62 52 65 74 75 72 6e 3b   return bReturn;
10e90 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6d 70  .}../*.** An imp
10ea0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
10eb0 68 65 20 55 6e 6c 6f 63 6b 46 69 6c 65 20 41 50  he UnlockFile AP
10ec0 49 20 6f 66 20 57 69 6e 64 6f 77 73 20 66 6f 72  I of Windows for
10ed0 20 43 45 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f   CE.*/.static BO
10ee0 4f 4c 20 77 69 6e 63 65 55 6e 6c 6f 63 6b 46 69  OL winceUnlockFi
10ef0 6c 65 28 0a 20 20 4c 50 48 41 4e 44 4c 45 20 70  le(.  LPHANDLE p
10f00 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20 64  hFile,.  DWORD d
10f10 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 2c 0a  wFileOffsetLow,.
10f20 20 20 44 57 4f 52 44 20 64 77 46 69 6c 65 4f 66    DWORD dwFileOf
10f30 66 73 65 74 48 69 67 68 2c 0a 20 20 44 57 4f 52  fsetHigh,.  DWOR
10f40 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  D nNumberOfBytes
10f50 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 2c 0a 20 20 44  ToUnlockLow,.  D
10f60 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79  WORD nNumberOfBy
10f70 74 65 73 54 6f 55 6e 6c 6f 63 6b 48 69 67 68 0a  tesToUnlockHigh.
10f80 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46  ){.  winFile *pF
10f90 69 6c 65 20 3d 20 48 41 4e 44 4c 45 5f 54 4f 5f  ile = HANDLE_TO_
10fa0 57 49 4e 46 49 4c 45 28 70 68 46 69 6c 65 29 3b  WINFILE(phFile);
10fb0 0a 20 20 42 4f 4f 4c 20 62 52 65 74 75 72 6e 20  .  BOOL bReturn 
10fc0 3d 20 46 41 4c 53 45 3b 0a 0a 20 20 55 4e 55 53  = FALSE;..  UNUS
10fd0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 77 46  ED_PARAMETER(dwF
10fe0 69 6c 65 4f 66 66 73 65 74 48 69 67 68 29 3b 0a  ileOffsetHigh);.
10ff0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
11000 45 52 28 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65  ER(nNumberOfByte
11010 73 54 6f 55 6e 6c 6f 63 6b 48 69 67 68 29 3b 0a  sToUnlockHigh);.
11020 0a 20 20 69 66 20 28 21 70 46 69 6c 65 2d 3e 68  .  if (!pFile->h
11030 4d 75 74 65 78 29 20 72 65 74 75 72 6e 20 54 52  Mutex) return TR
11040 55 45 3b 0a 20 20 77 69 6e 63 65 4d 75 74 65 78  UE;.  winceMutex
11050 41 63 71 75 69 72 65 28 70 46 69 6c 65 2d 3e 68  Acquire(pFile->h
11060 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 52 65  Mutex);..  /* Re
11070 6c 65 61 73 69 6e 67 20 61 20 72 65 61 64 65 72  leasing a reader
11080 20 6c 6f 63 6b 20 6f 72 20 61 6e 20 65 78 63 6c   lock or an excl
11090 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20  usive lock */.  
110a0 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74  if (dwFileOffset
110b0 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48  Low == (DWORD)SH
110c0 41 52 45 44 5f 46 49 52 53 54 29 7b 0a 20 20 20  ARED_FIRST){.   
110d0 20 2f 2a 20 44 69 64 20 77 65 20 68 61 76 65 20   /* Did we have 
110e0 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
110f0 6b 3f 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 46  k? */.    if (pF
11100 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c  ile->local.bExcl
11110 75 73 69 76 65 29 7b 0a 20 20 20 20 20 20 61 73  usive){.      as
11120 73 65 72 74 28 6e 4e 75 6d 62 65 72 4f 66 42 79  sert(nNumberOfBy
11130 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d  tesToUnlockLow =
11140 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f  = (DWORD)SHARED_
11150 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 70 46 69  SIZE);.      pFi
11160 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75  le->local.bExclu
11170 73 69 76 65 20 3d 20 46 41 4c 53 45 3b 0a 20 20  sive = FALSE;.  
11180 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65      pFile->share
11190 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 20  d->bExclusive = 
111a0 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 62 52 65  FALSE;.      bRe
111b0 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20  turn = TRUE;.   
111c0 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 69 64 20 77   }..    /* Did w
111d0 65 20 6a 75 73 74 20 68 61 76 65 20 61 20 72 65  e just have a re
111e0 61 64 65 72 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20  ader lock? */.  
111f0 20 20 65 6c 73 65 20 69 66 20 28 70 46 69 6c 65    else if (pFile
11200 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73  ->local.nReaders
11210 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
11220 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f  nNumberOfBytesTo
11230 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 28 44 57  UnlockLow == (DW
11240 4f 52 44 29 53 48 41 52 45 44 5f 53 49 5a 45 0a  ORD)SHARED_SIZE.
11250 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
11260 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f  nNumberOfBytesTo
11270 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 3b  UnlockLow == 1);
11280 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f  .      pFile->lo
11290 63 61 6c 2e 6e 52 65 61 64 65 72 73 20 2d 2d 3b  cal.nReaders --;
112a0 0a 20 20 20 20 20 20 69 66 20 28 70 46 69 6c 65  .      if (pFile
112b0 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73  ->local.nReaders
112c0 20 3d 3d 20 30 29 0a 20 20 20 20 20 20 7b 0a 20   == 0).      {. 
112d0 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68         pFile->sh
112e0 61 72 65 64 2d 3e 6e 52 65 61 64 65 72 73 20 2d  ared->nReaders -
112f0 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  -;.      }.     
11300 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b   bReturn = TRUE;
11310 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
11320 20 52 65 6c 65 61 73 69 6e 67 20 61 20 70 65 6e   Releasing a pen
11330 64 69 6e 67 20 6c 6f 63 6b 20 2a 2f 0a 20 20 65  ding lock */.  e
11340 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66  lse if (dwFileOf
11350 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52  fsetLow == (DWOR
11360 44 29 50 45 4e 44 49 4e 47 5f 42 59 54 45 0a 20  D)PENDING_BYTE. 
11370 20 20 20 20 20 20 20 20 20 20 26 26 20 6e 4e 75            && nNu
11380 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c  mberOfBytesToUnl
11390 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20  ockLow == 1){.  
113a0 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63    if (pFile->loc
113b0 61 6c 2e 62 50 65 6e 64 69 6e 67 29 7b 0a 20 20  al.bPending){.  
113c0 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c      pFile->local
113d0 2e 62 50 65 6e 64 69 6e 67 20 3d 20 46 41 4c 53  .bPending = FALS
113e0 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  E;.      pFile->
113f0 73 68 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e 67  shared->bPending
11400 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20   = FALSE;.      
11410 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a  bReturn = TRUE;.
11420 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 52      }.  }.  /* R
11430 65 6c 65 61 73 69 6e 67 20 61 20 72 65 73 65 72  eleasing a reser
11440 76 65 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 65 6c  ved lock */.  el
11450 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66  se if (dwFileOff
11460 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44  setLow == (DWORD
11470 29 52 45 53 45 52 56 45 44 5f 42 59 54 45 0a 20  )RESERVED_BYTE. 
11480 20 20 20 20 20 20 20 20 20 20 26 26 20 6e 4e 75            && nNu
11490 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c  mberOfBytesToUnl
114a0 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20  ockLow == 1){.  
114b0 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63    if (pFile->loc
114c0 61 6c 2e 62 52 65 73 65 72 76 65 64 29 20 7b 0a  al.bReserved) {.
114d0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63        pFile->loc
114e0 61 6c 2e 62 52 65 73 65 72 76 65 64 20 3d 20 46  al.bReserved = F
114f0 41 4c 53 45 3b 0a 20 20 20 20 20 20 70 46 69 6c  ALSE;.      pFil
11500 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52 65 73 65  e->shared->bRese
11510 72 76 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20  rved = FALSE;.  
11520 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52      bReturn = TR
11530 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  UE;.    }.  }.. 
11540 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c 65 61   winceMutexRelea
11550 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78  se(pFile->hMutex
11560 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 52 65 74  );.  return bRet
11570 75 72 6e 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 45 6e 64  urn;.}./*.** End
11580 20 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c 20   of the special 
11590 63 6f 64 65 20 66 6f 72 20 77 69 6e 63 65 0a 2a  code for wince.*
115a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
115b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
115c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
115d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
115e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 65  ************/.#e
115f0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
11600 53 5f 57 49 4e 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a  S_WINCE */../*.*
11610 2a 20 4c 6f 63 6b 20 61 20 66 69 6c 65 20 72 65  * Lock a file re
11620 67 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  gion..*/.static 
11630 42 4f 4f 4c 20 77 69 6e 4c 6f 63 6b 46 69 6c 65  BOOL winLockFile
11640 28 0a 20 20 4c 50 48 41 4e 44 4c 45 20 70 68 46  (.  LPHANDLE phF
11650 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20 66 6c 61  ile,.  DWORD fla
11660 67 73 2c 0a 20 20 44 57 4f 52 44 20 6f 66 66 73  gs,.  DWORD offs
11670 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6f  etLow,.  DWORD o
11680 66 66 73 65 74 48 69 67 68 2c 0a 20 20 44 57 4f  ffsetHigh,.  DWO
11690 52 44 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 0a  RD numBytesLow,.
116a0 20 20 44 57 4f 52 44 20 6e 75 6d 42 79 74 65 73    DWORD numBytes
116b0 48 69 67 68 0a 29 7b 0a 23 69 66 20 53 51 4c 49  High.){.#if SQLI
116c0 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 2f 2a  TE_OS_WINCE.  /*
116d0 0a 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 69 6e 64  .  ** NOTE: Wind
116e0 6f 77 73 20 43 45 20 69 73 20 68 61 6e 64 6c 65  ows CE is handle
116f0 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20 68 65  d differently he
11700 72 65 20 64 75 65 20 69 74 73 20 6c 61 63 6b 20  re due its lack 
11710 6f 66 20 74 68 65 20 57 69 6e 33 32 0a 20 20 2a  of the Win32.  *
11720 2a 20 20 20 20 20 20 20 41 50 49 20 4c 6f 63 6b  *       API Lock
11730 46 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74  File..  */.  ret
11740 75 72 6e 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c  urn winceLockFil
11750 65 28 70 68 46 69 6c 65 2c 20 6f 66 66 73 65 74  e(phFile, offset
11760 4c 6f 77 2c 20 6f 66 66 73 65 74 48 69 67 68 2c  Low, offsetHigh,
11770 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11780 20 20 20 20 20 20 20 20 6e 75 6d 42 79 74 65 73          numBytes
11790 4c 6f 77 2c 20 6e 75 6d 42 79 74 65 73 48 69 67  Low, numBytesHig
117a0 68 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28 20  h);.#else.  if( 
117b0 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 20 20 20  osIsNT() ){.    
117c0 4f 56 45 52 4c 41 50 50 45 44 20 6f 76 6c 70 3b  OVERLAPPED ovlp;
117d0 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 6f 76 6c  .    memset(&ovl
117e0 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4f 56 45  p, 0, sizeof(OVE
117f0 52 4c 41 50 50 45 44 29 29 3b 0a 20 20 20 20 6f  RLAPPED));.    o
11800 76 6c 70 2e 4f 66 66 73 65 74 20 3d 20 6f 66 66  vlp.Offset = off
11810 73 65 74 4c 6f 77 3b 0a 20 20 20 20 6f 76 6c 70  setLow;.    ovlp
11820 2e 4f 66 66 73 65 74 48 69 67 68 20 3d 20 6f 66  .OffsetHigh = of
11830 66 73 65 74 48 69 67 68 3b 0a 20 20 20 20 72 65  fsetHigh;.    re
11840 74 75 72 6e 20 6f 73 4c 6f 63 6b 46 69 6c 65 45  turn osLockFileE
11850 78 28 2a 70 68 46 69 6c 65 2c 20 66 6c 61 67 73  x(*phFile, flags
11860 2c 20 30 2c 20 6e 75 6d 42 79 74 65 73 4c 6f 77  , 0, numBytesLow
11870 2c 20 6e 75 6d 42 79 74 65 73 48 69 67 68 2c 20  , numBytesHigh, 
11880 26 6f 76 6c 70 29 3b 0a 20 20 7d 65 6c 73 65 7b  &ovlp);.  }else{
11890 0a 20 20 20 20 72 65 74 75 72 6e 20 6f 73 4c 6f  .    return osLo
118a0 63 6b 46 69 6c 65 28 2a 70 68 46 69 6c 65 2c 20  ckFile(*phFile, 
118b0 6f 66 66 73 65 74 4c 6f 77 2c 20 6f 66 66 73 65  offsetLow, offse
118c0 74 48 69 67 68 2c 20 6e 75 6d 42 79 74 65 73 4c  tHigh, numBytesL
118d0 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ow,.            
118e0 20 20 20 20 20 20 20 20 20 20 6e 75 6d 42 79 74            numByt
118f0 65 73 48 69 67 68 29 3b 0a 20 20 7d 0a 23 65 6e  esHigh);.  }.#en
11900 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c  dif.}../*.** Unl
11910 6f 63 6b 20 61 20 66 69 6c 65 20 72 65 67 69 6f  ock a file regio
11920 6e 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 42 4f  n.. */.static BO
11930 4f 4c 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65  OL winUnlockFile
11940 28 0a 20 20 4c 50 48 41 4e 44 4c 45 20 70 68 46  (.  LPHANDLE phF
11950 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20 6f 66 66  ile,.  DWORD off
11960 73 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20  setLow,.  DWORD 
11970 6f 66 66 73 65 74 48 69 67 68 2c 0a 20 20 44 57  offsetHigh,.  DW
11980 4f 52 44 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c  ORD numBytesLow,
11990 0a 20 20 44 57 4f 52 44 20 6e 75 6d 42 79 74 65  .  DWORD numByte
119a0 73 48 69 67 68 0a 29 7b 0a 23 69 66 20 53 51 4c  sHigh.){.#if SQL
119b0 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 2f  ITE_OS_WINCE.  /
119c0 2a 0a 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 69 6e  *.  ** NOTE: Win
119d0 64 6f 77 73 20 43 45 20 69 73 20 68 61 6e 64 6c  dows CE is handl
119e0 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20 68  ed differently h
119f0 65 72 65 20 64 75 65 20 69 74 73 20 6c 61 63 6b  ere due its lack
11a00 20 6f 66 20 74 68 65 20 57 69 6e 33 32 0a 20 20   of the Win32.  
11a10 2a 2a 20 20 20 20 20 20 20 41 50 49 20 55 6e 6c  **       API Unl
11a20 6f 63 6b 46 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  ockFile..  */.  
11a30 72 65 74 75 72 6e 20 77 69 6e 63 65 55 6e 6c 6f  return winceUnlo
11a40 63 6b 46 69 6c 65 28 70 68 46 69 6c 65 2c 20 6f  ckFile(phFile, o
11a50 66 66 73 65 74 4c 6f 77 2c 20 6f 66 66 73 65 74  ffsetLow, offset
11a60 48 69 67 68 2c 0a 20 20 20 20 20 20 20 20 20 20  High,.          
11a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
11a80 75 6d 42 79 74 65 73 4c 6f 77 2c 20 6e 75 6d 42  umBytesLow, numB
11a90 79 74 65 73 48 69 67 68 29 3b 0a 23 65 6c 73 65  ytesHigh);.#else
11aa0 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20  .  if( osIsNT() 
11ab0 29 7b 0a 20 20 20 20 4f 56 45 52 4c 41 50 50 45  ){.    OVERLAPPE
11ac0 44 20 6f 76 6c 70 3b 0a 20 20 20 20 6d 65 6d 73  D ovlp;.    mems
11ad0 65 74 28 26 6f 76 6c 70 2c 20 30 2c 20 73 69 7a  et(&ovlp, 0, siz
11ae0 65 6f 66 28 4f 56 45 52 4c 41 50 50 45 44 29 29  eof(OVERLAPPED))
11af0 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66 66 73 65  ;.    ovlp.Offse
11b00 74 20 3d 20 6f 66 66 73 65 74 4c 6f 77 3b 0a 20  t = offsetLow;. 
11b10 20 20 20 6f 76 6c 70 2e 4f 66 66 73 65 74 48 69     ovlp.OffsetHi
11b20 67 68 20 3d 20 6f 66 66 73 65 74 48 69 67 68 3b  gh = offsetHigh;
11b30 0a 20 20 20 20 72 65 74 75 72 6e 20 6f 73 55 6e  .    return osUn
11b40 6c 6f 63 6b 46 69 6c 65 45 78 28 2a 70 68 46 69  lockFileEx(*phFi
11b50 6c 65 2c 20 30 2c 20 6e 75 6d 42 79 74 65 73 4c  le, 0, numBytesL
11b60 6f 77 2c 20 6e 75 6d 42 79 74 65 73 48 69 67 68  ow, numBytesHigh
11b70 2c 20 26 6f 76 6c 70 29 3b 0a 20 20 7d 65 6c 73  , &ovlp);.  }els
11b80 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6f 73  e{.    return os
11b90 55 6e 6c 6f 63 6b 46 69 6c 65 28 2a 70 68 46 69  UnlockFile(*phFi
11ba0 6c 65 2c 20 6f 66 66 73 65 74 4c 6f 77 2c 20 6f  le, offsetLow, o
11bb0 66 66 73 65 74 48 69 67 68 2c 20 6e 75 6d 42 79  ffsetHigh, numBy
11bc0 74 65 73 4c 6f 77 2c 0a 20 20 20 20 20 20 20 20  tesLow,.        
11bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11be0 6e 75 6d 42 79 74 65 73 48 69 67 68 29 3b 0a 20  numBytesHigh);. 
11bf0 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 2a   }.#endif.}../**
11c00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11c10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11c20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11c30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11c40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54  ***********.** T
11c50 68 65 20 6e 65 78 74 20 67 72 6f 75 70 20 6f 66  he next group of
11c60 20 72 6f 75 74 69 6e 65 73 20 69 6d 70 6c 65 6d   routines implem
11c70 65 6e 74 20 74 68 65 20 49 2f 4f 20 6d 65 74 68  ent the I/O meth
11c80 6f 64 73 20 73 70 65 63 69 66 69 65 64 0a 2a 2a  ods specified.**
11c90 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 33 5f   by the sqlite3_
11ca0 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
11cb0 74 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  t..*************
11cc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11cd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11ce0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11cf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11d00 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 20 4d  */../*.** Some M
11d10 69 63 72 6f 73 6f 66 74 20 63 6f 6d 70 69 6c 65  icrosoft compile
11d20 72 73 20 6c 61 63 6b 20 74 68 69 73 20 64 65 66  rs lack this def
11d30 69 6e 69 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e  inition..*/.#ifn
11d40 64 65 66 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f  def INVALID_SET_
11d50 46 49 4c 45 5f 50 4f 49 4e 54 45 52 0a 23 20 64  FILE_POINTER.# d
11d60 65 66 69 6e 65 20 49 4e 56 41 4c 49 44 5f 53 45  efine INVALID_SE
11d70 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 20 28  T_FILE_POINTER (
11d80 28 44 57 4f 52 44 29 2d 31 29 0a 23 65 6e 64 69  (DWORD)-1).#endi
11d90 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  f../*.** Move th
11da0 65 20 63 75 72 72 65 6e 74 20 70 6f 73 69 74 69  e current positi
11db0 6f 6e 20 6f 66 20 74 68 65 20 66 69 6c 65 20 68  on of the file h
11dc0 61 6e 64 6c 65 20 70 61 73 73 65 64 20 61 73 20  andle passed as 
11dd0 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 61 72 67  the first.** arg
11de0 75 6d 65 6e 74 20 74 6f 20 6f 66 66 73 65 74 20  ument to offset 
11df0 69 4f 66 66 73 65 74 20 77 69 74 68 69 6e 20 74  iOffset within t
11e00 68 65 20 66 69 6c 65 2e 20 49 66 20 73 75 63 63  he file. If succ
11e10 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e 20 30  essful, return 0
11e20 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
11e30 73 65 74 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  set pFile->lastE
11e40 72 72 6e 6f 20 61 6e 64 20 72 65 74 75 72 6e 20  rrno and return 
11e50 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61  non-zero..*/.sta
11e60 74 69 63 20 69 6e 74 20 77 69 6e 53 65 65 6b 46  tic int winSeekF
11e70 69 6c 65 28 77 69 6e 46 69 6c 65 20 2a 70 46 69  ile(winFile *pFi
11e80 6c 65 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  le, sqlite3_int6
11e90 34 20 69 4f 66 66 73 65 74 29 7b 0a 23 69 66 20  4 iOffset){.#if 
11ea0 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
11eb0 0a 20 20 4c 4f 4e 47 20 75 70 70 65 72 42 69 74  .  LONG upperBit
11ec0 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
11ed0 20 20 20 2f 2a 20 4d 6f 73 74 20 73 69 67 2e 20     /* Most sig. 
11ee0 33 32 20 62 69 74 73 20 6f 66 20 6e 65 77 20 6f  32 bits of new o
11ef0 66 66 73 65 74 20 2a 2f 0a 20 20 4c 4f 4e 47 20  ffset */.  LONG 
11f00 6c 6f 77 65 72 42 69 74 73 3b 20 20 20 20 20 20  lowerBits;      
11f10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
11f20 61 73 74 20 73 69 67 2e 20 33 32 20 62 69 74 73  ast sig. 32 bits
11f30 20 6f 66 20 6e 65 77 20 6f 66 66 73 65 74 20 2a   of new offset *
11f40 2f 0a 20 20 44 57 4f 52 44 20 64 77 52 65 74 3b  /.  DWORD dwRet;
11f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f60 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74      /* Value ret
11f70 75 72 6e 65 64 20 62 79 20 53 65 74 46 69 6c 65  urned by SetFile
11f80 50 6f 69 6e 74 65 72 28 29 20 2a 2f 0a 20 20 44  Pointer() */.  D
11f90 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 20  WORD lastErrno; 
11fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11fb0 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64  * Value returned
11fc0 20 62 79 20 47 65 74 4c 61 73 74 45 72 72 6f 72   by GetLastError
11fd0 28 29 20 2a 2f 0a 0a 20 20 4f 53 54 52 41 43 45  () */..  OSTRACE
11fe0 28 28 22 53 45 45 4b 20 66 69 6c 65 3d 25 70 2c  (("SEEK file=%p,
11ff0 20 6f 66 66 73 65 74 3d 25 6c 6c 64 5c 6e 22 2c   offset=%lld\n",
12000 20 70 46 69 6c 65 2d 3e 68 2c 20 69 4f 66 66 73   pFile->h, iOffs
12010 65 74 29 29 3b 0a 0a 20 20 75 70 70 65 72 42 69  et));..  upperBi
12020 74 73 20 3d 20 28 4c 4f 4e 47 29 28 28 69 4f 66  ts = (LONG)((iOf
12030 66 73 65 74 3e 3e 33 32 29 20 26 20 30 78 37 66  fset>>32) & 0x7f
12040 66 66 66 66 66 66 29 3b 0a 20 20 6c 6f 77 65 72  ffffff);.  lower
12050 42 69 74 73 20 3d 20 28 4c 4f 4e 47 29 28 69 4f  Bits = (LONG)(iO
12060 66 66 73 65 74 20 26 20 30 78 66 66 66 66 66 66  ffset & 0xffffff
12070 66 66 29 3b 0a 0a 20 20 2f 2a 20 41 50 49 20 6f  ff);..  /* API o
12080 64 64 69 74 79 3a 20 49 66 20 73 75 63 63 65 73  ddity: If succes
12090 73 66 75 6c 2c 20 53 65 74 46 69 6c 65 50 6f 69  sful, SetFilePoi
120a0 6e 74 65 72 28 29 20 72 65 74 75 72 6e 73 20 61  nter() returns a
120b0 20 64 77 6f 72 64 0a 20 20 2a 2a 20 63 6f 6e 74   dword.  ** cont
120c0 61 69 6e 69 6e 67 20 74 68 65 20 6c 6f 77 65 72  aining the lower
120d0 20 33 32 2d 62 69 74 73 20 6f 66 20 74 68 65 20   32-bits of the 
120e0 6e 65 77 20 66 69 6c 65 2d 6f 66 66 73 65 74 2e  new file-offset.
120f0 20 4f 72 2c 20 69 66 20 69 74 20 66 61 69 6c 73   Or, if it fails
12100 2c 0a 20 20 2a 2a 20 69 74 20 72 65 74 75 72 6e  ,.  ** it return
12110 73 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49  s INVALID_SET_FI
12120 4c 45 5f 50 4f 49 4e 54 45 52 2e 20 48 6f 77 65  LE_POINTER. Howe
12130 76 65 72 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  ver according to
12140 20 4d 53 44 4e 2c 0a 20 20 2a 2a 20 49 4e 56 41   MSDN,.  ** INVA
12150 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49  LID_SET_FILE_POI
12160 4e 54 45 52 20 6d 61 79 20 61 6c 73 6f 20 62 65  NTER may also be
12170 20 61 20 76 61 6c 69 64 20 6e 65 77 20 6f 66 66   a valid new off
12180 73 65 74 2e 20 53 6f 20 74 6f 20 64 65 74 65 72  set. So to deter
12190 6d 69 6e 65 0a 20 20 2a 2a 20 77 68 65 74 68 65  mine.  ** whethe
121a0 72 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 61  r an error has a
121b0 63 74 75 61 6c 6c 79 20 6f 63 63 75 72 72 65 64  ctually occurred
121c0 2c 20 69 74 20 69 73 20 61 6c 73 6f 20 6e 65 63  , it is also nec
121d0 65 73 73 61 72 79 20 74 6f 20 63 61 6c 6c 0a 20  essary to call. 
121e0 20 2a 2a 20 47 65 74 4c 61 73 74 45 72 72 6f 72   ** GetLastError
121f0 28 29 2e 0a 20 20 2a 2f 0a 20 20 64 77 52 65 74  ()..  */.  dwRet
12200 20 3d 20 6f 73 53 65 74 46 69 6c 65 50 6f 69 6e   = osSetFilePoin
12210 74 65 72 28 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f  ter(pFile->h, lo
12220 77 65 72 42 69 74 73 2c 20 26 75 70 70 65 72 42  werBits, &upperB
12230 69 74 73 2c 20 46 49 4c 45 5f 42 45 47 49 4e 29  its, FILE_BEGIN)
12240 3b 0a 0a 20 20 69 66 28 20 28 64 77 52 65 74 3d  ;..  if( (dwRet=
12250 3d 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c  =INVALID_SET_FIL
12260 45 5f 50 4f 49 4e 54 45 52 0a 20 20 20 20 20 20  E_POINTER.      
12270 26 26 20 28 28 6c 61 73 74 45 72 72 6e 6f 20 3d  && ((lastErrno =
12280 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
12290 29 29 21 3d 4e 4f 5f 45 52 52 4f 52 29 29 20 29  ))!=NO_ERROR)) )
122a0 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73  {.    pFile->las
122b0 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72  tErrno = lastErr
122c0 6e 6f 3b 0a 20 20 20 20 77 69 6e 4c 6f 67 45 72  no;.    winLogEr
122d0 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
122e0 5f 53 45 45 4b 2c 20 70 46 69 6c 65 2d 3e 6c 61  _SEEK, pFile->la
122f0 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
12300 20 20 20 20 20 20 20 20 20 22 77 69 6e 53 65 65           "winSee
12310 6b 46 69 6c 65 22 2c 20 70 46 69 6c 65 2d 3e 7a  kFile", pFile->z
12320 50 61 74 68 29 3b 0a 20 20 20 20 4f 53 54 52 41  Path);.    OSTRA
12330 43 45 28 28 22 53 45 45 4b 20 66 69 6c 65 3d 25  CE(("SEEK file=%
12340 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45  p, rc=SQLITE_IOE
12350 52 52 5f 53 45 45 4b 5c 6e 22 2c 20 70 46 69 6c  RR_SEEK\n", pFil
12360 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75  e->h));.    retu
12370 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54  rn 1;.  }..  OST
12380 52 41 43 45 28 28 22 53 45 45 4b 20 66 69 6c 65  RACE(("SEEK file
12390 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f  =%p, rc=SQLITE_O
123a0 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29  K\n", pFile->h))
123b0 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 23 65  ;.  return 0;.#e
123c0 6c 73 65 0a 20 20 2f 2a 0a 20 20 2a 2a 20 53 61  lse.  /*.  ** Sa
123d0 6d 65 20 61 73 20 61 62 6f 76 65 2c 20 65 78 63  me as above, exc
123e0 65 70 74 20 74 68 61 74 20 74 68 69 73 20 69 6d  ept that this im
123f0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 77 6f 72  plementation wor
12400 6b 73 20 66 6f 72 20 57 69 6e 52 54 2e 0a 20 20  ks for WinRT..  
12410 2a 2f 0a 0a 20 20 4c 41 52 47 45 5f 49 4e 54 45  */..  LARGE_INTE
12420 47 45 52 20 78 3b 20 20 20 20 20 20 20 20 20 20  GER x;          
12430 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77        /* The new
12440 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 42 4f 4f   offset */.  BOO
12450 4c 20 62 52 65 74 3b 20 20 20 20 20 20 20 20 20  L bRet;         
12460 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12470 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  Value returned b
12480 79 20 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72  y SetFilePointer
12490 45 78 28 29 20 2a 2f 0a 0a 20 20 78 2e 51 75 61  Ex() */..  x.Qua
124a0 64 50 61 72 74 20 3d 20 69 4f 66 66 73 65 74 3b  dPart = iOffset;
124b0 0a 20 20 62 52 65 74 20 3d 20 6f 73 53 65 74 46  .  bRet = osSetF
124c0 69 6c 65 50 6f 69 6e 74 65 72 45 78 28 70 46 69  ilePointerEx(pFi
124d0 6c 65 2d 3e 68 2c 20 78 2c 20 30 2c 20 46 49 4c  le->h, x, 0, FIL
124e0 45 5f 42 45 47 49 4e 29 3b 0a 0a 20 20 69 66 28  E_BEGIN);..  if(
124f0 21 62 52 65 74 29 7b 0a 20 20 20 20 70 46 69 6c  !bRet){.    pFil
12500 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f  e->lastErrno = o
12510 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b  sGetLastError();
12520 0a 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72  .    winLogError
12530 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 45  (SQLITE_IOERR_SE
12540 45 4b 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  EK, pFile->lastE
12550 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
12560 20 20 20 20 20 20 22 77 69 6e 53 65 65 6b 46 69        "winSeekFi
12570 6c 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  le", pFile->zPat
12580 68 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28  h);.    OSTRACE(
12590 28 22 53 45 45 4b 20 66 69 6c 65 3d 25 70 2c 20  ("SEEK file=%p, 
125a0 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rc=SQLITE_IOERR_
125b0 53 45 45 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  SEEK\n", pFile->
125c0 68 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  h));.    return 
125d0 31 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43  1;.  }..  OSTRAC
125e0 45 28 28 22 53 45 45 4b 20 66 69 6c 65 3d 25 70  E(("SEEK file=%p
125f0 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e  , rc=SQLITE_OK\n
12600 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20  ", pFile->h));. 
12610 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69   return 0;.#endi
12620 66 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  f.}..#if SQLITE_
12630 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
12640 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
12650 65 6e 63 65 73 20 74 6f 20 56 46 53 20 68 65 6c  ences to VFS hel
12660 70 65 72 20 6d 65 74 68 6f 64 73 20 75 73 65 64  per methods used
12670 20 66 6f 72 20 6d 65 6d 6f 72 79 20 6d 61 70 70   for memory mapp
12680 65 64 20 66 69 6c 65 73 20 2a 2f 0a 73 74 61 74  ed files */.stat
12690 69 63 20 69 6e 74 20 77 69 6e 4d 61 70 66 69 6c  ic int winMapfil
126a0 65 28 77 69 6e 46 69 6c 65 2a 2c 20 73 71 6c 69  e(winFile*, sqli
126b0 74 65 33 5f 69 6e 74 36 34 29 3b 0a 73 74 61 74  te3_int64);.stat
126c0 69 63 20 69 6e 74 20 77 69 6e 55 6e 6d 61 70 66  ic int winUnmapf
126d0 69 6c 65 28 77 69 6e 46 69 6c 65 2a 29 3b 0a 23  ile(winFile*);.#
126e0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  endif../*.** Clo
126f0 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  se a file..**.**
12700 20 49 74 20 69 73 20 72 65 70 6f 72 74 65 64 20   It is reported 
12710 74 68 61 74 20 61 6e 20 61 74 74 65 6d 70 74 20  that an attempt 
12720 74 6f 20 63 6c 6f 73 65 20 61 20 68 61 6e 64 6c  to close a handl
12730 65 20 6d 69 67 68 74 20 73 6f 6d 65 74 69 6d 65  e might sometime
12740 73 0a 2a 2a 20 66 61 69 6c 2e 20 20 54 68 69 73  s.** fail.  This
12750 20 69 73 20 61 20 76 65 72 79 20 75 6e 72 65 61   is a very unrea
12760 73 6f 6e 61 62 6c 65 20 72 65 73 75 6c 74 2c 20  sonable result, 
12770 62 75 74 20 57 69 6e 64 6f 77 73 20 69 73 20 6e  but Windows is n
12780 6f 74 6f 72 69 6f 75 73 0a 2a 2a 20 66 6f 72 20  otorious.** for 
12790 62 65 69 6e 67 20 75 6e 72 65 61 73 6f 6e 61 62  being unreasonab
127a0 6c 65 20 73 6f 20 49 20 64 6f 20 6e 6f 74 20 64  le so I do not d
127b0 6f 75 62 74 20 74 68 61 74 20 69 74 20 6d 69 67  oubt that it mig
127c0 68 74 20 68 61 70 70 65 6e 2e 20 20 49 66 0a 2a  ht happen.  If.*
127d0 2a 20 74 68 65 20 63 6c 6f 73 65 20 66 61 69 6c  * the close fail
127e0 73 2c 20 77 65 20 70 61 75 73 65 20 66 6f 72 20  s, we pause for 
127f0 31 30 30 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73  100 milliseconds
12800 20 61 6e 64 20 74 72 79 20 61 67 61 69 6e 2e 20   and try again. 
12810 20 41 73 0a 2a 2a 20 6d 61 6e 79 20 61 73 20 4d   As.** many as M
12820 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d 50 54 20  X_CLOSE_ATTEMPT 
12830 61 74 74 65 6d 70 74 73 20 74 6f 20 63 6c 6f 73  attempts to clos
12840 65 20 74 68 65 20 68 61 6e 64 6c 65 20 61 72 65  e the handle are
12850 20 6d 61 64 65 20 62 65 66 6f 72 65 0a 2a 2a 20   made before.** 
12860 67 69 76 69 6e 67 20 75 70 20 61 6e 64 20 72 65  giving up and re
12870 74 75 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72  turning an error
12880 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 58 5f  ..*/.#define MX_
12890 43 4c 4f 53 45 5f 41 54 54 45 4d 50 54 20 33 0a  CLOSE_ATTEMPT 3.
128a0 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 43 6c  static int winCl
128b0 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ose(sqlite3_file
128c0 20 2a 69 64 29 7b 0a 20 20 69 6e 74 20 72 63 2c   *id){.  int rc,
128d0 20 63 6e 74 20 3d 20 30 3b 0a 20 20 77 69 6e 46   cnt = 0;.  winF
128e0 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69  ile *pFile = (wi
128f0 6e 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 61 73  nFile*)id;..  as
12900 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 23  sert( id!=0 );.#
12910 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
12920 49 54 5f 57 41 4c 0a 20 20 61 73 73 65 72 74 28  IT_WAL.  assert(
12930 20 70 46 69 6c 65 2d 3e 70 53 68 6d 3d 3d 30 20   pFile->pShm==0 
12940 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65  );.#endif.  asse
12950 72 74 28 20 70 46 69 6c 65 2d 3e 68 21 3d 4e 55  rt( pFile->h!=NU
12960 4c 4c 20 26 26 20 70 46 69 6c 65 2d 3e 68 21 3d  LL && pFile->h!=
12970 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56  INVALID_HANDLE_V
12980 41 4c 55 45 20 29 3b 0a 20 20 4f 53 54 52 41 43  ALUE );.  OSTRAC
12990 45 28 28 22 43 4c 4f 53 45 20 66 69 6c 65 3d 25  E(("CLOSE file=%
129a0 70 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29  p\n", pFile->h))
129b0 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  ;..#if SQLITE_MA
129c0 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
129d0 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28 70 46 69  winUnmapfile(pFi
129e0 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 64  le);.#endif..  d
129f0 6f 7b 0a 20 20 20 20 72 63 20 3d 20 6f 73 43 6c  o{.    rc = osCl
12a00 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d  oseHandle(pFile-
12a10 3e 68 29 3b 0a 20 20 20 20 2f 2a 20 53 69 6d 75  >h);.    /* Simu
12a20 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d  lateIOError( rc=
12a30 30 3b 20 63 6e 74 3d 4d 58 5f 43 4c 4f 53 45 5f  0; cnt=MX_CLOSE_
12a40 41 54 54 45 4d 50 54 3b 20 29 3b 20 2a 2f 0a 20  ATTEMPT; ); */. 
12a50 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 30 20 26   }while( rc==0 &
12a60 26 20 2b 2b 63 6e 74 20 3c 20 4d 58 5f 43 4c 4f  & ++cnt < MX_CLO
12a70 53 45 5f 41 54 54 45 4d 50 54 20 26 26 20 28 73  SE_ATTEMPT && (s
12a80 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65  qlite3_win32_sle
12a90 65 70 28 31 30 30 29 2c 20 31 29 20 29 3b 0a 23  ep(100), 1) );.#
12aa0 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
12ab0 43 45 0a 23 64 65 66 69 6e 65 20 57 49 4e 43 45  CE.#define WINCE
12ac0 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d 50  _DELETION_ATTEMP
12ad0 54 53 20 33 0a 20 20 77 69 6e 63 65 44 65 73 74  TS 3.  winceDest
12ae0 72 6f 79 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a  royLock(pFile);.
12af0 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 7a 44 65    if( pFile->zDe
12b00 6c 65 74 65 4f 6e 43 6c 6f 73 65 20 29 7b 0a 20  leteOnClose ){. 
12b10 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a     int cnt = 0;.
12b20 20 20 20 20 77 68 69 6c 65 28 0a 20 20 20 20 20      while(.     
12b30 20 20 20 20 20 20 6f 73 44 65 6c 65 74 65 46 69        osDeleteFi
12b40 6c 65 57 28 70 46 69 6c 65 2d 3e 7a 44 65 6c 65  leW(pFile->zDele
12b50 74 65 4f 6e 43 6c 6f 73 65 29 3d 3d 30 0a 20 20  teOnClose)==0.  
12b60 20 20 20 20 20 20 26 26 20 6f 73 47 65 74 46 69        && osGetFi
12b70 6c 65 41 74 74 72 69 62 75 74 65 73 57 28 70 46  leAttributesW(pF
12b80 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c  ile->zDeleteOnCl
12b90 6f 73 65 29 21 3d 30 78 66 66 66 66 66 66 66 66  ose)!=0xffffffff
12ba0 0a 20 20 20 20 20 20 20 20 26 26 20 63 6e 74 2b  .        && cnt+
12bb0 2b 20 3c 20 57 49 4e 43 45 5f 44 45 4c 45 54 49  + < WINCE_DELETI
12bc0 4f 4e 5f 41 54 54 45 4d 50 54 53 0a 20 20 20 20  ON_ATTEMPTS.    
12bd0 29 7b 0a 20 20 20 20 20 20 20 73 71 6c 69 74 65  ){.       sqlite
12be0 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28 31 30  3_win32_sleep(10
12bf0 30 29 3b 20 20 2f 2a 20 57 61 69 74 20 61 20 6c  0);  /* Wait a l
12c00 69 74 74 6c 65 20 62 65 66 6f 72 65 20 74 72 79  ittle before try
12c10 69 6e 67 20 61 67 61 69 6e 20 2a 2f 0a 20 20 20  ing again */.   
12c20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
12c30 72 65 65 28 70 46 69 6c 65 2d 3e 7a 44 65 6c 65  ree(pFile->zDele
12c40 74 65 4f 6e 43 6c 6f 73 65 29 3b 0a 20 20 7d 0a  teOnClose);.  }.
12c50 23 65 6e 64 69 66 0a 20 20 69 66 28 20 72 63 20  #endif.  if( rc 
12c60 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68 20  ){.    pFile->h 
12c70 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 20 20 4f 70  = NULL;.  }.  Op
12c80 65 6e 43 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20  enCounter(-1);. 
12c90 20 4f 53 54 52 41 43 45 28 28 22 43 4c 4f 53 45   OSTRACE(("CLOSE
12ca0 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c   file=%p, rc=%s\
12cb0 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63  n", pFile->h, rc
12cc0 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65   ? "ok" : "faile
12cd0 64 22 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  d"));.  return r
12ce0 63 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20  c ? SQLITE_OK.  
12cf0 20 20 20 20 20 20 20 20 20 20 3a 20 77 69 6e 4c            : winL
12d00 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
12d10 4f 45 52 52 5f 43 4c 4f 53 45 2c 20 6f 73 47 65  OERR_CLOSE, osGe
12d20 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20  tLastError(),.  
12d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d40 20 20 20 20 20 20 20 20 22 77 69 6e 43 6c 6f 73          "winClos
12d50 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  e", pFile->zPath
12d60 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  );.}../*.** Read
12d70 20 64 61 74 61 20 66 72 6f 6d 20 61 20 66 69 6c   data from a fil
12d80 65 20 69 6e 74 6f 20 61 20 62 75 66 66 65 72 2e  e into a buffer.
12d90 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
12da0 4f 4b 20 69 66 20 61 6c 6c 0a 2a 2a 20 62 79 74  OK if all.** byt
12db0 65 73 20 77 65 72 65 20 72 65 61 64 20 73 75 63  es were read suc
12dc0 63 65 73 73 66 75 6c 6c 79 20 61 6e 64 20 53 51  cessfully and SQ
12dd0 4c 49 54 45 5f 49 4f 45 52 52 20 69 66 20 61 6e  LITE_IOERR if an
12de0 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77  ything goes.** w
12df0 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rong..*/.static 
12e00 69 6e 74 20 77 69 6e 52 65 61 64 28 0a 20 20 73  int winRead(.  s
12e10 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
12e20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
12e30 65 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a  e to read from *
12e40 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20  /.  void *pBuf, 
12e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12e60 2a 20 57 72 69 74 65 20 63 6f 6e 74 65 6e 74 20  * Write content 
12e70 69 6e 74 6f 20 74 68 69 73 20 62 75 66 66 65 72  into this buffer
12e80 20 2a 2f 0a 20 20 69 6e 74 20 61 6d 74 2c 20 20   */.  int amt,  
12e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ea0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
12eb0 74 65 73 20 74 6f 20 72 65 61 64 20 2a 2f 0a 20  tes to read */. 
12ec0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f   sqlite3_int64 o
12ed0 66 66 73 65 74 20 20 20 20 20 20 20 2f 2a 20 42  ffset       /* B
12ee0 65 67 69 6e 20 72 65 61 64 69 6e 67 20 61 74 20  egin reading at 
12ef0 74 68 69 73 20 6f 66 66 73 65 74 20 2a 2f 0a 29  this offset */.)
12f00 7b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  {.#if !SQLITE_OS
12f10 5f 57 49 4e 43 45 0a 20 20 4f 56 45 52 4c 41 50  _WINCE.  OVERLAP
12f20 50 45 44 20 6f 76 65 72 6c 61 70 70 65 64 3b 20  PED overlapped; 
12f30 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
12f40 6f 66 66 73 65 74 20 66 6f 72 20 52 65 61 64 46  offset for ReadF
12f50 69 6c 65 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  ile. */.#endif. 
12f60 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20   winFile *pFile 
12f70 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 20  = (winFile*)id; 
12f80 20 2f 2a 20 66 69 6c 65 20 68 61 6e 64 6c 65 20   /* file handle 
12f90 2a 2f 0a 20 20 44 57 4f 52 44 20 6e 52 65 61 64  */.  DWORD nRead
12fa0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
12fb0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
12fc0 66 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79  f bytes actually
12fd0 20 72 65 61 64 20 66 72 6f 6d 20 66 69 6c 65 20   read from file 
12fe0 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 74 72 79 20  */.  int nRetry 
12ff0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
13000 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
13010 66 20 72 65 74 72 79 73 20 2a 2f 0a 0a 20 20 61  f retrys */..  a
13020 73 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a  ssert( id!=0 );.
13030 20 20 61 73 73 65 72 74 28 20 61 6d 74 3e 30 20    assert( amt>0 
13040 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66  );.  assert( off
13050 73 65 74 3e 3d 30 20 29 3b 0a 20 20 53 69 6d 75  set>=0 );.  Simu
13060 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75  lateIOError(retu
13070 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
13080 52 45 41 44 29 3b 0a 20 20 4f 53 54 52 41 43 45  READ);.  OSTRACE
13090 28 28 22 52 45 41 44 20 66 69 6c 65 3d 25 70 2c  (("READ file=%p,
130a0 20 62 75 66 66 65 72 3d 25 70 2c 20 61 6d 6f 75   buffer=%p, amou
130b0 6e 74 3d 25 64 2c 20 6f 66 66 73 65 74 3d 25 6c  nt=%d, offset=%l
130c0 6c 64 2c 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 0a  ld, lock=%d\n",.
130d0 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
130e0 2d 3e 68 2c 20 70 42 75 66 2c 20 61 6d 74 2c 20  ->h, pBuf, amt, 
130f0 6f 66 66 73 65 74 2c 20 70 46 69 6c 65 2d 3e 6c  offset, pFile->l
13100 6f 63 6b 74 79 70 65 29 29 3b 0a 0a 23 69 66 20  ocktype));..#if 
13110 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
13120 53 49 5a 45 3e 30 0a 20 20 2f 2a 20 44 65 61 6c  SIZE>0.  /* Deal
13130 20 77 69 74 68 20 61 73 20 6d 75 63 68 20 6f 66   with as much of
13140 20 74 68 69 73 20 72 65 61 64 20 72 65 71 75 65   this read reque
13150 73 74 20 61 73 20 70 6f 73 73 69 62 6c 65 20 62  st as possible b
13160 79 20 74 72 61 6e 73 66 65 72 69 6e 67 0a 20 20  y transfering.  
13170 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65  ** data from the
13180 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20   memory mapping 
13190 75 73 69 6e 67 20 6d 65 6d 63 70 79 28 29 2e 20  using memcpy(). 
131a0 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73 65 74   */.  if( offset
131b0 3c 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65  <pFile->mmapSize
131c0 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 66 66 73   ){.    if( offs
131d0 65 74 2b 61 6d 74 20 3c 3d 20 70 46 69 6c 65 2d  et+amt <= pFile-
131e0 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20  >mmapSize ){.   
131f0 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20     memcpy(pBuf, 
13200 26 28 28 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e  &((u8 *)(pFile->
13210 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66  pMapRegion))[off
13220 73 65 74 5d 2c 20 61 6d 74 29 3b 0a 20 20 20 20  set], amt);.    
13230 20 20 4f 53 54 52 41 43 45 28 28 22 52 45 41 44    OSTRACE(("READ
13240 2d 4d 4d 41 50 20 66 69 6c 65 3d 25 70 2c 20 72  -MMAP file=%p, r
13250 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20  c=SQLITE_OK\n", 
13260 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20  pFile->h));.    
13270 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
13280 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  OK;.    }else{. 
13290 20 20 20 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d       int nCopy =
132a0 20 28 69 6e 74 29 28 70 46 69 6c 65 2d 3e 6d 6d   (int)(pFile->mm
132b0 61 70 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 29  apSize - offset)
132c0 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70  ;.      memcpy(p
132d0 42 75 66 2c 20 26 28 28 75 38 20 2a 29 28 70 46  Buf, &((u8 *)(pF
132e0 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29  ile->pMapRegion)
132f0 29 5b 6f 66 66 73 65 74 5d 2c 20 6e 43 6f 70 79  )[offset], nCopy
13300 29 3b 0a 20 20 20 20 20 20 70 42 75 66 20 3d 20  );.      pBuf = 
13310 26 28 28 75 38 20 2a 29 70 42 75 66 29 5b 6e 43  &((u8 *)pBuf)[nC
13320 6f 70 79 5d 3b 0a 20 20 20 20 20 20 61 6d 74 20  opy];.      amt 
13330 2d 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 20 20  -= nCopy;.      
13340 6f 66 66 73 65 74 20 2b 3d 20 6e 43 6f 70 79 3b  offset += nCopy;
13350 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
13360 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  f..#if SQLITE_OS
13370 5f 57 49 4e 43 45 0a 20 20 69 66 28 20 77 69 6e  _WINCE.  if( win
13380 53 65 65 6b 46 69 6c 65 28 70 46 69 6c 65 2c 20  SeekFile(pFile, 
13390 6f 66 66 73 65 74 29 20 29 7b 0a 20 20 20 20 4f  offset) ){.    O
133a0 53 54 52 41 43 45 28 28 22 52 45 41 44 20 66 69  STRACE(("READ fi
133b0 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
133c0 5f 46 55 4c 4c 5c 6e 22 2c 20 70 46 69 6c 65 2d  _FULL\n", pFile-
133d0 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  >h));.    return
133e0 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20   SQLITE_FULL;.  
133f0 7d 0a 20 20 77 68 69 6c 65 28 20 21 6f 73 52 65  }.  while( !osRe
13400 61 64 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c  adFile(pFile->h,
13410 20 70 42 75 66 2c 20 61 6d 74 2c 20 26 6e 52 65   pBuf, amt, &nRe
13420 61 64 2c 20 30 29 20 29 7b 0a 23 65 6c 73 65 0a  ad, 0) ){.#else.
13430 20 20 6d 65 6d 73 65 74 28 26 6f 76 65 72 6c 61    memset(&overla
13440 70 70 65 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28  pped, 0, sizeof(
13450 4f 56 45 52 4c 41 50 50 45 44 29 29 3b 0a 20 20  OVERLAPPED));.  
13460 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66 66 73 65  overlapped.Offse
13470 74 20 3d 20 28 4c 4f 4e 47 29 28 6f 66 66 73 65  t = (LONG)(offse
13480 74 20 26 20 30 78 66 66 66 66 66 66 66 66 29 3b  t & 0xffffffff);
13490 0a 20 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66  .  overlapped.Of
134a0 66 73 65 74 48 69 67 68 20 3d 20 28 4c 4f 4e 47  fsetHigh = (LONG
134b0 29 28 28 6f 66 66 73 65 74 3e 3e 33 32 29 20 26  )((offset>>32) &
134c0 20 30 78 37 66 66 66 66 66 66 66 29 3b 0a 20 20   0x7fffffff);.  
134d0 77 68 69 6c 65 28 20 21 6f 73 52 65 61 64 46 69  while( !osReadFi
134e0 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 70 42 75  le(pFile->h, pBu
134f0 66 2c 20 61 6d 74 2c 20 26 6e 52 65 61 64 2c 20  f, amt, &nRead, 
13500 26 6f 76 65 72 6c 61 70 70 65 64 29 20 26 26 0a  &overlapped) &&.
13510 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 4c 61           osGetLa
13520 73 74 45 72 72 6f 72 28 29 21 3d 45 52 52 4f 52  stError()!=ERROR
13530 5f 48 41 4e 44 4c 45 5f 45 4f 46 20 29 7b 0a 23  _HANDLE_EOF ){.#
13540 65 6e 64 69 66 0a 20 20 20 20 44 57 4f 52 44 20  endif.    DWORD 
13550 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 69  lastErrno;.    i
13560 66 28 20 77 69 6e 52 65 74 72 79 49 6f 65 72 72  f( winRetryIoerr
13570 28 26 6e 52 65 74 72 79 2c 20 26 6c 61 73 74 45  (&nRetry, &lastE
13580 72 72 6e 6f 29 20 29 20 63 6f 6e 74 69 6e 75 65  rrno) ) continue
13590 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73  ;.    pFile->las
135a0 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72  tErrno = lastErr
135b0 6e 6f 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28  no;.    OSTRACE(
135c0 28 22 52 45 41 44 20 66 69 6c 65 3d 25 70 2c 20  ("READ file=%p, 
135d0 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rc=SQLITE_IOERR_
135e0 52 45 41 44 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  READ\n", pFile->
135f0 68 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  h));.    return 
13600 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
13610 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 2c 20 70  TE_IOERR_READ, p
13620 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c  File->lastErrno,
13630 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13640 20 20 20 20 20 20 20 20 22 77 69 6e 52 65 61 64          "winRead
13650 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
13660 3b 0a 20 20 7d 0a 20 20 77 69 6e 4c 6f 67 49 6f  ;.  }.  winLogIo
13670 65 72 72 28 6e 52 65 74 72 79 29 3b 0a 20 20 69  err(nRetry);.  i
13680 66 28 20 6e 52 65 61 64 3c 28 44 57 4f 52 44 29  f( nRead<(DWORD)
13690 61 6d 74 20 29 7b 0a 20 20 20 20 2f 2a 20 55 6e  amt ){.    /* Un
136a0 72 65 61 64 20 70 61 72 74 73 20 6f 66 20 74 68  read parts of th
136b0 65 20 62 75 66 66 65 72 20 6d 75 73 74 20 62 65  e buffer must be
136c0 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 2a 2f 0a   zero-filled */.
136d0 20 20 20 20 6d 65 6d 73 65 74 28 26 28 28 63 68      memset(&((ch
136e0 61 72 2a 29 70 42 75 66 29 5b 6e 52 65 61 64 5d  ar*)pBuf)[nRead]
136f0 2c 20 30 2c 20 61 6d 74 2d 6e 52 65 61 64 29 3b  , 0, amt-nRead);
13700 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 52  .    OSTRACE(("R
13710 45 41 44 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  EAD file=%p, rc=
13720 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
13730 52 54 5f 52 45 41 44 5c 6e 22 2c 20 70 46 69 6c  RT_READ\n", pFil
13740 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75  e->h));.    retu
13750 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
13760 53 48 4f 52 54 5f 52 45 41 44 3b 0a 20 20 7d 0a  SHORT_READ;.  }.
13770 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52 45 41  .  OSTRACE(("REA
13780 44 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51  D file=%p, rc=SQ
13790 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c  LITE_OK\n", pFil
137a0 65 2d 3e 68 29 29 3b 0a 20 20 72 65 74 75 72 6e  e->h));.  return
137b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
137c0 2a 0a 2a 2a 20 57 72 69 74 65 20 64 61 74 61 20  *.** Write data 
137d0 66 72 6f 6d 20 61 20 62 75 66 66 65 72 20 69 6e  from a buffer in
137e0 74 6f 20 61 20 66 69 6c 65 2e 20 20 52 65 74 75  to a file.  Retu
137f0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
13800 73 75 63 63 65 73 73 0a 2a 2a 20 6f 72 20 73 6f  success.** or so
13810 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63  me other error c
13820 6f 64 65 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a  ode on failure..
13830 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
13840 6e 57 72 69 74 65 28 0a 20 20 73 71 6c 69 74 65  nWrite(.  sqlite
13850 33 5f 66 69 6c 65 20 2a 69 64 2c 20 20 20 20 20  3_file *id,     
13860 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
13870 65 20 74 6f 20 77 72 69 74 65 20 69 6e 74 6f 20  e to write into 
13880 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  */.  const void 
13890 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 20  *pBuf,          
138a0 20 20 20 20 20 2f 2a 20 54 68 65 20 62 79 74 65       /* The byte
138b0 73 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  s to be written 
138c0 2a 2f 0a 20 20 69 6e 74 20 61 6d 74 2c 20 20 20  */.  int amt,   
138d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
138e0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
138f0 66 20 62 79 74 65 73 20 74 6f 20 77 72 69 74 65  f bytes to write
13900 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
13910 74 36 34 20 6f 66 66 73 65 74 20 20 20 20 20 20  t64 offset      
13920 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
13930 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 20 74 6f  into the file to
13940 20 62 65 67 69 6e 20 77 72 69 74 69 6e 67 20 61   begin writing a
13950 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  t */.){.  int rc
13960 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
13970 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
13980 65 20 69 66 20 65 72 72 6f 72 20 68 61 73 20 6f  e if error has o
13990 63 63 75 72 72 65 64 2c 20 65 6c 73 65 20 66 61  ccurred, else fa
139a0 6c 73 65 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65  lse */.  winFile
139b0 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69   *pFile = (winFi
139c0 6c 65 2a 29 69 64 3b 20 20 2f 2a 20 46 69 6c 65  le*)id;  /* File
139d0 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74   handle */.  int
139e0 20 6e 52 65 74 72 79 20 3d 20 30 3b 20 20 20 20   nRetry = 0;    
139f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13a00 4e 75 6d 62 65 72 20 6f 66 20 72 65 74 72 69 65  Number of retrie
13a10 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  s */..  assert( 
13a20 61 6d 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  amt>0 );.  asser
13a30 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 53 69  t( pFile );.  Si
13a40 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65  mulateIOError(re
13a50 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
13a60 52 5f 57 52 49 54 45 29 3b 0a 20 20 53 69 6d 75  R_WRITE);.  Simu
13a70 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f  lateDiskfullErro
13a80 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  r(return SQLITE_
13a90 46 55 4c 4c 29 3b 0a 0a 20 20 4f 53 54 52 41 43  FULL);..  OSTRAC
13aa0 45 28 28 22 57 52 49 54 45 20 66 69 6c 65 3d 25  E(("WRITE file=%
13ab0 70 2c 20 62 75 66 66 65 72 3d 25 70 2c 20 61 6d  p, buffer=%p, am
13ac0 6f 75 6e 74 3d 25 64 2c 20 6f 66 66 73 65 74 3d  ount=%d, offset=
13ad0 25 6c 6c 64 2c 20 6c 6f 63 6b 3d 25 64 5c 6e 22  %lld, lock=%d\n"
13ae0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69  ,.           pFi
13af0 6c 65 2d 3e 68 2c 20 70 42 75 66 2c 20 61 6d 74  le->h, pBuf, amt
13b00 2c 20 6f 66 66 73 65 74 2c 20 70 46 69 6c 65 2d  , offset, pFile-
13b10 3e 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 0a 23 69  >locktype));..#i
13b20 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
13b30 50 5f 53 49 5a 45 3e 30 0a 20 20 2f 2a 20 44 65  P_SIZE>0.  /* De
13b40 61 6c 20 77 69 74 68 20 61 73 20 6d 75 63 68 20  al with as much 
13b50 6f 66 20 74 68 69 73 20 77 72 69 74 65 20 72 65  of this write re
13b60 71 75 65 73 74 20 61 73 20 70 6f 73 73 69 62 6c  quest as possibl
13b70 65 20 62 79 20 74 72 61 6e 73 66 65 72 69 6e 67  e by transfering
13b80 0a 20 20 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20  .  ** data from 
13b90 74 68 65 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69  the memory mappi
13ba0 6e 67 20 75 73 69 6e 67 20 6d 65 6d 63 70 79 28  ng using memcpy(
13bb0 29 2e 20 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66  ).  */.  if( off
13bc0 73 65 74 3c 70 46 69 6c 65 2d 3e 6d 6d 61 70 53  set<pFile->mmapS
13bd0 69 7a 65 20 29 7b 0a 20 20 20 20 69 66 28 20 6f  ize ){.    if( o
13be0 66 66 73 65 74 2b 61 6d 74 20 3c 3d 20 70 46 69  ffset+amt <= pFi
13bf0 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a  le->mmapSize ){.
13c00 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 28 28        memcpy(&((
13c10 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61  u8 *)(pFile->pMa
13c20 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74  pRegion))[offset
13c30 5d 2c 20 70 42 75 66 2c 20 61 6d 74 29 3b 0a 20  ], pBuf, amt);. 
13c40 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 57       OSTRACE(("W
13c50 52 49 54 45 2d 4d 4d 41 50 20 66 69 6c 65 3d 25  RITE-MMAP file=%
13c60 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c  p, rc=SQLITE_OK\
13c70 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  n", pFile->h));.
13c80 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
13c90 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73  ITE_OK;.    }els
13ca0 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6f  e{.      int nCo
13cb0 70 79 20 3d 20 28 69 6e 74 29 28 70 46 69 6c 65  py = (int)(pFile
13cc0 2d 3e 6d 6d 61 70 53 69 7a 65 20 2d 20 6f 66 66  ->mmapSize - off
13cd0 73 65 74 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  set);.      memc
13ce0 70 79 28 26 28 28 75 38 20 2a 29 28 70 46 69 6c  py(&((u8 *)(pFil
13cf0 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b  e->pMapRegion))[
13d00 6f 66 66 73 65 74 5d 2c 20 70 42 75 66 2c 20 6e  offset], pBuf, n
13d10 43 6f 70 79 29 3b 0a 20 20 20 20 20 20 70 42 75  Copy);.      pBu
13d20 66 20 3d 20 26 28 28 75 38 20 2a 29 70 42 75 66  f = &((u8 *)pBuf
13d30 29 5b 6e 43 6f 70 79 5d 3b 0a 20 20 20 20 20 20  )[nCopy];.      
13d40 61 6d 74 20 2d 3d 20 6e 43 6f 70 79 3b 0a 20 20  amt -= nCopy;.  
13d50 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 6e 43      offset += nC
13d60 6f 70 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  opy;.    }.  }.#
13d70 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54  endif..#if SQLIT
13d80 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 72 63 20  E_OS_WINCE.  rc 
13d90 3d 20 77 69 6e 53 65 65 6b 46 69 6c 65 28 70 46  = winSeekFile(pF
13da0 69 6c 65 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20  ile, offset);.  
13db0 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 23 65 6c  if( rc==0 ){.#el
13dc0 73 65 0a 20 20 7b 0a 23 65 6e 64 69 66 0a 23 69  se.  {.#endif.#i
13dd0 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
13de0 43 45 0a 20 20 20 20 4f 56 45 52 4c 41 50 50 45  CE.    OVERLAPPE
13df0 44 20 6f 76 65 72 6c 61 70 70 65 64 3b 20 20 20  D overlapped;   
13e00 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 66 66 73       /* The offs
13e10 65 74 20 66 6f 72 20 57 72 69 74 65 46 69 6c 65  et for WriteFile
13e20 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 20 20  . */.#endif.    
13e30 75 38 20 2a 61 52 65 6d 20 3d 20 28 75 38 20 2a  u8 *aRem = (u8 *
13e40 29 70 42 75 66 3b 20 20 20 20 20 20 20 20 2f 2a  )pBuf;        /*
13e50 20 44 61 74 61 20 79 65 74 20 74 6f 20 62 65 20   Data yet to be 
13e60 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 20 20 69  written */.    i
13e70 6e 74 20 6e 52 65 6d 20 3d 20 61 6d 74 3b 20 20  nt nRem = amt;  
13e80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13e90 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
13ea0 79 65 74 20 74 6f 20 62 65 20 77 72 69 74 74 65  yet to be writte
13eb0 6e 20 2a 2f 0a 20 20 20 20 44 57 4f 52 44 20 6e  n */.    DWORD n
13ec0 57 72 69 74 65 3b 20 20 20 20 20 20 20 20 20 20  Write;          
13ed0 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
13ee0 77 72 69 74 74 65 6e 20 62 79 20 65 61 63 68 20  written by each 
13ef0 57 72 69 74 65 46 69 6c 65 28 29 20 63 61 6c 6c  WriteFile() call
13f00 20 2a 2f 0a 20 20 20 20 44 57 4f 52 44 20 6c 61   */.    DWORD la
13f10 73 74 45 72 72 6e 6f 20 3d 20 4e 4f 5f 45 52 52  stErrno = NO_ERR
13f20 4f 52 3b 20 20 20 2f 2a 20 56 61 6c 75 65 20 72  OR;   /* Value r
13f30 65 74 75 72 6e 65 64 20 62 79 20 47 65 74 4c 61  eturned by GetLa
13f40 73 74 45 72 72 6f 72 28 29 20 2a 2f 0a 0a 23 69  stError() */..#i
13f50 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
13f60 43 45 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 6f  CE.    memset(&o
13f70 76 65 72 6c 61 70 70 65 64 2c 20 30 2c 20 73 69  verlapped, 0, si
13f80 7a 65 6f 66 28 4f 56 45 52 4c 41 50 50 45 44 29  zeof(OVERLAPPED)
13f90 29 3b 0a 20 20 20 20 6f 76 65 72 6c 61 70 70 65  );.    overlappe
13fa0 64 2e 4f 66 66 73 65 74 20 3d 20 28 4c 4f 4e 47  d.Offset = (LONG
13fb0 29 28 6f 66 66 73 65 74 20 26 20 30 78 66 66 66  )(offset & 0xfff
13fc0 66 66 66 66 66 29 3b 0a 20 20 20 20 6f 76 65 72  fffff);.    over
13fd0 6c 61 70 70 65 64 2e 4f 66 66 73 65 74 48 69 67  lapped.OffsetHig
13fe0 68 20 3d 20 28 4c 4f 4e 47 29 28 28 6f 66 66 73  h = (LONG)((offs
13ff0 65 74 3e 3e 33 32 29 20 26 20 30 78 37 66 66 66  et>>32) & 0x7fff
14000 66 66 66 66 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  ffff);.#endif.. 
14010 20 20 20 77 68 69 6c 65 28 20 6e 52 65 6d 3e 30     while( nRem>0
14020 20 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f   ){.#if SQLITE_O
14030 53 5f 57 49 4e 43 45 0a 20 20 20 20 20 20 69 66  S_WINCE.      if
14040 28 20 21 6f 73 57 72 69 74 65 46 69 6c 65 28 70  ( !osWriteFile(p
14050 46 69 6c 65 2d 3e 68 2c 20 61 52 65 6d 2c 20 6e  File->h, aRem, n
14060 52 65 6d 2c 20 26 6e 57 72 69 74 65 2c 20 30 29  Rem, &nWrite, 0)
14070 20 29 7b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20   ){.#else.      
14080 69 66 28 20 21 6f 73 57 72 69 74 65 46 69 6c 65  if( !osWriteFile
14090 28 70 46 69 6c 65 2d 3e 68 2c 20 61 52 65 6d 2c  (pFile->h, aRem,
140a0 20 6e 52 65 6d 2c 20 26 6e 57 72 69 74 65 2c 20   nRem, &nWrite, 
140b0 26 6f 76 65 72 6c 61 70 70 65 64 29 20 29 7b 0a  &overlapped) ){.
140c0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 69  #endif.        i
140d0 66 28 20 77 69 6e 52 65 74 72 79 49 6f 65 72 72  f( winRetryIoerr
140e0 28 26 6e 52 65 74 72 79 2c 20 26 6c 61 73 74 45  (&nRetry, &lastE
140f0 72 72 6e 6f 29 20 29 20 63 6f 6e 74 69 6e 75 65  rrno) ) continue
14100 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
14110 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
14120 73 73 65 72 74 28 20 6e 57 72 69 74 65 3d 3d 30  ssert( nWrite==0
14130 20 7c 7c 20 6e 57 72 69 74 65 3c 3d 28 44 57 4f   || nWrite<=(DWO
14140 52 44 29 6e 52 65 6d 20 29 3b 0a 20 20 20 20 20  RD)nRem );.     
14150 20 69 66 28 20 6e 57 72 69 74 65 3d 3d 30 20 7c   if( nWrite==0 |
14160 7c 20 6e 57 72 69 74 65 3e 28 44 57 4f 52 44 29  | nWrite>(DWORD)
14170 6e 52 65 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  nRem ){.        
14180 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
14190 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
141a0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
141b0 20 20 20 7d 0a 23 69 66 20 21 53 51 4c 49 54 45     }.#if !SQLITE
141c0 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20 20 20  _OS_WINCE.      
141d0 6f 66 66 73 65 74 20 2b 3d 20 6e 57 72 69 74 65  offset += nWrite
141e0 3b 0a 20 20 20 20 20 20 6f 76 65 72 6c 61 70 70  ;.      overlapp
141f0 65 64 2e 4f 66 66 73 65 74 20 3d 20 28 4c 4f 4e  ed.Offset = (LON
14200 47 29 28 6f 66 66 73 65 74 20 26 20 30 78 66 66  G)(offset & 0xff
14210 66 66 66 66 66 66 29 3b 0a 20 20 20 20 20 20 6f  ffffff);.      o
14220 76 65 72 6c 61 70 70 65 64 2e 4f 66 66 73 65 74  verlapped.Offset
14230 48 69 67 68 20 3d 20 28 4c 4f 4e 47 29 28 28 6f  High = (LONG)((o
14240 66 66 73 65 74 3e 3e 33 32 29 20 26 20 30 78 37  ffset>>32) & 0x7
14250 66 66 66 66 66 66 66 29 3b 0a 23 65 6e 64 69 66  fffffff);.#endif
14260 0a 20 20 20 20 20 20 61 52 65 6d 20 2b 3d 20 6e  .      aRem += n
14270 57 72 69 74 65 3b 0a 20 20 20 20 20 20 6e 52 65  Write;.      nRe
14280 6d 20 2d 3d 20 6e 57 72 69 74 65 3b 0a 20 20 20  m -= nWrite;.   
14290 20 7d 0a 20 20 20 20 69 66 28 20 6e 52 65 6d 3e   }.    if( nRem>
142a0 30 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  0 ){.      pFile
142b0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61  ->lastErrno = la
142c0 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72  stErrno;.      r
142d0 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  c = 1;.    }.  }
142e0 0a 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ..  if( rc ){.  
142f0 20 20 69 66 28 20 20 20 28 20 70 46 69 6c 65 2d    if(   ( pFile-
14300 3e 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f  >lastErrno==ERRO
14310 52 5f 48 41 4e 44 4c 45 5f 44 49 53 4b 5f 46 55  R_HANDLE_DISK_FU
14320 4c 4c 20 29 0a 20 20 20 20 20 20 20 7c 7c 20 28  LL ).       || (
14330 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
14340 6f 3d 3d 45 52 52 4f 52 5f 44 49 53 4b 5f 46 55  o==ERROR_DISK_FU
14350 4c 4c 20 29 29 7b 0a 20 20 20 20 20 20 4f 53 54  LL )){.      OST
14360 52 41 43 45 28 28 22 57 52 49 54 45 20 66 69 6c  RACE(("WRITE fil
14370 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%p, rc=SQLITE_
14380 46 55 4c 4c 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  FULL\n", pFile->
14390 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  h));.      retur
143a0 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  n winLogError(SQ
143b0 4c 49 54 45 5f 46 55 4c 4c 2c 20 70 46 69 6c 65  LITE_FULL, pFile
143c0 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20  ->lastErrno,.   
143d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
143e0 20 20 20 20 20 20 22 77 69 6e 57 72 69 74 65 31        "winWrite1
143f0 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
14400 3b 0a 20 20 20 20 7d 0a 20 20 20 20 4f 53 54 52  ;.    }.    OSTR
14410 41 43 45 28 28 22 57 52 49 54 45 20 66 69 6c 65  ACE(("WRITE file
14420 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49  =%p, rc=SQLITE_I
14430 4f 45 52 52 5f 57 52 49 54 45 5c 6e 22 2c 20 70  OERR_WRITE\n", p
14440 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72  File->h));.    r
14450 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f  eturn winLogErro
14460 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57  r(SQLITE_IOERR_W
14470 52 49 54 45 2c 20 70 46 69 6c 65 2d 3e 6c 61 73  RITE, pFile->las
14480 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
14490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
144a0 77 69 6e 57 72 69 74 65 32 22 2c 20 70 46 69 6c  winWrite2", pFil
144b0 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 65 6c  e->zPath);.  }el
144c0 73 65 7b 0a 20 20 20 20 77 69 6e 4c 6f 67 49 6f  se{.    winLogIo
144d0 65 72 72 28 6e 52 65 74 72 79 29 3b 0a 20 20 7d  err(nRetry);.  }
144e0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 57 52 49  .  OSTRACE(("WRI
144f0 54 45 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53  TE file=%p, rc=S
14500 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69  QLITE_OK\n", pFi
14510 6c 65 2d 3e 68 29 29 3b 0a 20 20 72 65 74 75 72  le->h));.  retur
14520 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
14530 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 61  /*.** Truncate a
14540 6e 20 6f 70 65 6e 20 66 69 6c 65 20 74 6f 20 61  n open file to a
14550 20 73 70 65 63 69 66 69 65 64 20 73 69 7a 65 0a   specified size.
14560 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
14570 6e 54 72 75 6e 63 61 74 65 28 73 71 6c 69 74 65  nTruncate(sqlite
14580 33 5f 66 69 6c 65 20 2a 69 64 2c 20 73 71 6c 69  3_file *id, sqli
14590 74 65 33 5f 69 6e 74 36 34 20 6e 42 79 74 65 29  te3_int64 nByte)
145a0 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69  {.  winFile *pFi
145b0 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69  le = (winFile*)i
145c0 64 3b 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64  d;  /* File hand
145d0 6c 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  le object */.  i
145e0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
145f0 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  K;             /
14600 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66 6f  * Return code fo
14610 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  r this function 
14620 2a 2f 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45  */.  DWORD lastE
14630 72 72 6e 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28  rrno;..  assert(
14640 20 70 46 69 6c 65 20 29 3b 0a 20 20 53 69 6d 75   pFile );.  Simu
14650 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75  lateIOError(retu
14660 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
14670 54 52 55 4e 43 41 54 45 29 3b 0a 20 20 4f 53 54  TRUNCATE);.  OST
14680 52 41 43 45 28 28 22 54 52 55 4e 43 41 54 45 20  RACE(("TRUNCATE 
14690 66 69 6c 65 3d 25 70 2c 20 73 69 7a 65 3d 25 6c  file=%p, size=%l
146a0 6c 64 2c 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 0a  ld, lock=%d\n",.
146b0 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
146c0 2d 3e 68 2c 20 6e 42 79 74 65 2c 20 70 46 69 6c  ->h, nByte, pFil
146d0 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 0a  e->locktype));..
146e0 20 20 2f 2a 20 49 66 20 74 68 65 20 75 73 65 72    /* If the user
146f0 20 68 61 73 20 63 6f 6e 66 69 67 75 72 65 64 20   has configured 
14700 61 20 63 68 75 6e 6b 2d 73 69 7a 65 20 66 6f 72  a chunk-size for
14710 20 74 68 69 73 20 66 69 6c 65 2c 20 74 72 75 6e   this file, trun
14720 63 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 66 69  cate the.  ** fi
14730 6c 65 20 73 6f 20 74 68 61 74 20 69 74 20 63 6f  le so that it co
14740 6e 73 69 73 74 73 20 6f 66 20 61 6e 20 69 6e 74  nsists of an int
14750 65 67 65 72 20 6e 75 6d 62 65 72 20 6f 66 20 63  eger number of c
14760 68 75 6e 6b 73 20 28 69 2e 65 2e 20 74 68 65 0a  hunks (i.e. the.
14770 20 20 2a 2a 20 61 63 74 75 61 6c 20 66 69 6c 65    ** actual file
14780 20 73 69 7a 65 20 61 66 74 65 72 20 74 68 65 20   size after the 
14790 6f 70 65 72 61 74 69 6f 6e 20 6d 61 79 20 62 65  operation may be
147a0 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
147b0 20 72 65 71 75 65 73 74 65 64 0a 20 20 2a 2a 20   requested.  ** 
147c0 73 69 7a 65 29 2e 0a 20 20 2a 2f 0a 20 20 69 66  size)..  */.  if
147d0 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b  ( pFile->szChunk
147e0 3e 30 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20  >0 ){.    nByte 
147f0 3d 20 28 28 6e 42 79 74 65 20 2b 20 70 46 69 6c  = ((nByte + pFil
14800 65 2d 3e 73 7a 43 68 75 6e 6b 20 2d 20 31 29 2f  e->szChunk - 1)/
14810 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 29 20  pFile->szChunk) 
14820 2a 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b  * pFile->szChunk
14830 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 45  ;.  }..  /* SetE
14840 6e 64 4f 66 46 69 6c 65 28 29 20 72 65 74 75 72  ndOfFile() retur
14850 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20 77 68 65 6e  ns non-zero when
14860 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20   successful, or 
14870 7a 65 72 6f 20 77 68 65 6e 20 69 74 20 66 61 69  zero when it fai
14880 6c 73 2e 20 2a 2f 0a 20 20 69 66 28 20 77 69 6e  ls. */.  if( win
14890 53 65 65 6b 46 69 6c 65 28 70 46 69 6c 65 2c 20  SeekFile(pFile, 
148a0 6e 42 79 74 65 29 20 29 7b 0a 20 20 20 20 72 63  nByte) ){.    rc
148b0 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53   = winLogError(S
148c0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e  QLITE_IOERR_TRUN
148d0 43 41 54 45 2c 20 70 46 69 6c 65 2d 3e 6c 61 73  CATE, pFile->las
148e0 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
148f0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
14900 6e 54 72 75 6e 63 61 74 65 31 22 2c 20 70 46 69  nTruncate1", pFi
14910 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 65  le->zPath);.  }e
14920 6c 73 65 20 69 66 28 20 30 3d 3d 6f 73 53 65 74  lse if( 0==osSet
14930 45 6e 64 4f 66 46 69 6c 65 28 70 46 69 6c 65 2d  EndOfFile(pFile-
14940 3e 68 29 20 26 26 0a 20 20 20 20 20 20 20 20 20  >h) &&.         
14950 20 20 20 28 28 6c 61 73 74 45 72 72 6e 6f 20 3d     ((lastErrno =
14960 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
14970 29 29 21 3d 45 52 52 4f 52 5f 55 53 45 52 5f 4d  ))!=ERROR_USER_M
14980 41 50 50 45 44 5f 46 49 4c 45 29 20 29 7b 0a 20  APPED_FILE) ){. 
14990 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
149a0 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b  rno = lastErrno;
149b0 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67  .    rc = winLog
149c0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
149d0 52 52 5f 54 52 55 4e 43 41 54 45 2c 20 70 46 69  RR_TRUNCATE, pFi
149e0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20  le->lastErrno,. 
149f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a00 20 20 20 20 22 77 69 6e 54 72 75 6e 63 61 74 65      "winTruncate
14a10 32 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  2", pFile->zPath
14a20 29 3b 0a 20 20 7d 0a 0a 23 69 66 20 53 51 4c 49  );.  }..#if SQLI
14a30 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
14a40 3e 30 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 66  >0.  /* If the f
14a50 69 6c 65 20 77 61 73 20 74 72 75 6e 63 61 74 65  ile was truncate
14a60 64 20 74 6f 20 61 20 73 69 7a 65 20 73 6d 61 6c  d to a size smal
14a70 6c 65 72 20 74 68 61 6e 20 74 68 65 20 63 75 72  ler than the cur
14a80 72 65 6e 74 6c 79 0a 20 20 2a 2a 20 6d 61 70 70  rently.  ** mapp
14a90 65 64 20 72 65 67 69 6f 6e 2c 20 72 65 64 75 63  ed region, reduc
14aa0 65 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20  e the effective 
14ab0 6d 61 70 70 69 6e 67 20 73 69 7a 65 20 61 73 20  mapping size as 
14ac0 77 65 6c 6c 2e 20 53 51 4c 69 74 65 20 77 69 6c  well. SQLite wil
14ad0 6c 0a 20 20 2a 2a 20 75 73 65 20 72 65 61 64 28  l.  ** use read(
14ae0 29 20 61 6e 64 20 77 72 69 74 65 28 29 20 74 6f  ) and write() to
14af0 20 61 63 63 65 73 73 20 64 61 74 61 20 62 65 79   access data bey
14b00 6f 6e 64 20 74 68 69 73 20 70 6f 69 6e 74 20 66  ond this point f
14b10 72 6f 6d 20 6e 6f 77 20 6f 6e 2e 0a 20 20 2a 2f  rom now on..  */
14b20 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 4d  .  if( pFile->pM
14b30 61 70 52 65 67 69 6f 6e 20 26 26 20 6e 42 79 74  apRegion && nByt
14b40 65 3c 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a  e<pFile->mmapSiz
14b50 65 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  e ){.    pFile->
14b60 6d 6d 61 70 53 69 7a 65 20 3d 20 6e 42 79 74 65  mmapSize = nByte
14b70 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
14b80 4f 53 54 52 41 43 45 28 28 22 54 52 55 4e 43 41  OSTRACE(("TRUNCA
14b90 54 45 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 25  TE file=%p, rc=%
14ba0 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  s\n", pFile->h, 
14bb0 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72  sqlite3ErrName(r
14bc0 63 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  c)));.  return r
14bd0 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  c;.}..#ifdef SQL
14be0 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 43  ITE_TEST./*.** C
14bf0 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20  ount the number 
14c00 6f 66 20 66 75 6c 6c 73 79 6e 63 73 20 61 6e 64  of fullsyncs and
14c10 20 6e 6f 72 6d 61 6c 20 73 79 6e 63 73 2e 20 20   normal syncs.  
14c20 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20  This is used to 
14c30 74 65 73 74 0a 2a 2a 20 74 68 61 74 20 73 79 6e  test.** that syn
14c40 63 73 20 61 6e 64 20 66 75 6c 6c 73 79 6e 63 73  cs and fullsyncs
14c50 20 61 72 65 20 6f 63 63 75 72 69 6e 67 20 61 74   are occuring at
14c60 20 74 68 65 20 72 69 67 68 74 20 74 69 6d 65 73   the right times
14c70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
14c80 5f 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b  _sync_count = 0;
14c90 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 66 75 6c  .int sqlite3_ful
14ca0 6c 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b  lsync_count = 0;
14cb0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d  .#endif../*.** M
14cc0 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 77 72 69  ake sure all wri
14cd0 74 65 73 20 74 6f 20 61 20 70 61 72 74 69 63 75  tes to a particu
14ce0 6c 61 72 20 66 69 6c 65 20 61 72 65 20 63 6f 6d  lar file are com
14cf0 6d 69 74 74 65 64 20 74 6f 20 64 69 73 6b 2e 0a  mitted to disk..
14d00 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
14d10 6e 53 79 6e 63 28 73 71 6c 69 74 65 33 5f 66 69  nSync(sqlite3_fi
14d20 6c 65 20 2a 69 64 2c 20 69 6e 74 20 66 6c 61 67  le *id, int flag
14d30 73 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  s){.#ifndef SQLI
14d40 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 2f 2a 0a  TE_NO_SYNC.  /*.
14d50 20 20 2a 2a 20 55 73 65 64 20 6f 6e 6c 79 20 77    ** Used only w
14d60 68 65 6e 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  hen SQLITE_NO_SY
14d70 4e 43 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65  NC is not define
14d80 64 2e 0a 20 20 20 2a 2f 0a 20 20 42 4f 4f 4c 20  d..   */.  BOOL 
14d90 72 63 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21  rc;.#endif.#if !
14da0 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20  defined(NDEBUG) 
14db0 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
14dc0 54 45 5f 4e 4f 5f 53 59 4e 43 29 20 7c 7c 20 5c  TE_NO_SYNC) || \
14dd0 0a 20 20 20 20 28 64 65 66 69 6e 65 64 28 53 51  .    (defined(SQ
14de0 4c 49 54 45 5f 54 45 53 54 29 20 26 26 20 64 65  LITE_TEST) && de
14df0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
14e00 55 47 29 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 55  UG)).  /*.  ** U
14e10 73 65 64 20 77 68 65 6e 20 53 51 4c 49 54 45 5f  sed when SQLITE_
14e20 4e 4f 5f 53 59 4e 43 20 69 73 20 6e 6f 74 20 64  NO_SYNC is not d
14e30 65 66 69 6e 65 64 20 61 6e 64 20 62 79 20 74 68  efined and by th
14e40 65 20 61 73 73 65 72 74 28 29 20 61 6e 64 2f 6f  e assert() and/o
14e50 72 0a 20 20 2a 2a 20 4f 53 54 52 41 43 45 28 29  r.  ** OSTRACE()
14e60 20 6d 61 63 72 6f 73 2e 0a 20 20 20 2a 2f 0a 20   macros..   */. 
14e70 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20   winFile *pFile 
14e80 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a  = (winFile*)id;.
14e90 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50  #else.  UNUSED_P
14ea0 41 52 41 4d 45 54 45 52 28 69 64 29 3b 0a 23 65  ARAMETER(id);.#e
14eb0 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
14ec0 70 46 69 6c 65 20 29 3b 0a 20 20 2f 2a 20 43 68  pFile );.  /* Ch
14ed0 65 63 6b 20 74 68 61 74 20 6f 6e 65 20 6f 66 20  eck that one of 
14ee0 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
14ef0 41 4c 20 6f 72 20 46 55 4c 4c 20 77 61 73 20 70  AL or FULL was p
14f00 61 73 73 65 64 20 2a 2f 0a 20 20 61 73 73 65 72  assed */.  asser
14f10 74 28 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d  t((flags&0x0F)==
14f20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
14f30 41 4c 0a 20 20 20 20 20 20 7c 7c 20 28 66 6c 61  AL.      || (fla
14f40 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45  gs&0x0F)==SQLITE
14f50 5f 53 59 4e 43 5f 46 55 4c 4c 0a 20 20 29 3b 0a  _SYNC_FULL.  );.
14f60 0a 20 20 2f 2a 20 55 6e 69 78 20 63 61 6e 6e 6f  .  /* Unix canno
14f70 74 2c 20 62 75 74 20 73 6f 6d 65 20 73 79 73 74  t, but some syst
14f80 65 6d 73 20 6d 61 79 20 72 65 74 75 72 6e 20 53  ems may return S
14f90 51 4c 49 54 45 5f 46 55 4c 4c 20 66 72 6f 6d 20  QLITE_FULL from 
14fa0 68 65 72 65 2e 20 54 68 69 73 0a 20 20 2a 2a 20  here. This.  ** 
14fb0 6c 69 6e 65 20 69 73 20 74 6f 20 74 65 73 74 20  line is to test 
14fc0 74 68 61 74 20 64 6f 69 6e 67 20 73 6f 20 64 6f  that doing so do
14fd0 65 73 20 6e 6f 74 20 63 61 75 73 65 20 61 6e 79  es not cause any
14fe0 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 2a 2f 0a   problems..  */.
14ff0 20 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75    SimulateDiskfu
15000 6c 6c 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  llError( return 
15010 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 3b 0a 0a  SQLITE_FULL );..
15020 20 20 4f 53 54 52 41 43 45 28 28 22 53 59 4e 43    OSTRACE(("SYNC
15030 20 66 69 6c 65 3d 25 70 2c 20 66 6c 61 67 73 3d   file=%p, flags=
15040 25 78 2c 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 0a  %x, lock=%d\n",.
15050 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
15060 2d 3e 68 2c 20 66 6c 61 67 73 2c 20 70 46 69 6c  ->h, flags, pFil
15070 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 0a  e->locktype));..
15080 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 54  #ifndef SQLITE_T
15090 45 53 54 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  EST.  UNUSED_PAR
150a0 41 4d 45 54 45 52 28 66 6c 61 67 73 29 3b 0a 23  AMETER(flags);.#
150b0 65 6c 73 65 0a 20 20 69 66 28 20 28 66 6c 61 67  else.  if( (flag
150c0 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f  s&0x0F)==SQLITE_
150d0 53 59 4e 43 5f 46 55 4c 4c 20 29 7b 0a 20 20 20  SYNC_FULL ){.   
150e0 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e   sqlite3_fullsyn
150f0 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 20 20 7d 0a 20  c_count++;.  }. 
15100 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f   sqlite3_sync_co
15110 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20  unt++;.#endif.. 
15120 20 2f 2a 20 49 66 20 77 65 20 63 6f 6d 70 69 6c   /* If we compil
15130 65 64 20 77 69 74 68 20 74 68 65 20 53 51 4c 49  ed with the SQLI
15140 54 45 5f 4e 4f 5f 53 59 4e 43 20 66 6c 61 67 2c  TE_NO_SYNC flag,
15150 20 74 68 65 6e 20 73 79 6e 63 69 6e 67 20 69 73   then syncing is
15160 20 61 0a 20 20 2a 2a 20 6e 6f 2d 6f 70 0a 20 20   a.  ** no-op.  
15170 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
15180 5f 4e 4f 5f 53 59 4e 43 0a 20 20 4f 53 54 52 41  _NO_SYNC.  OSTRA
15190 43 45 28 28 22 53 59 4e 43 2d 4e 4f 50 20 66 69  CE(("SYNC-NOP fi
151a0 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
151b0 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  _OK\n", pFile->h
151c0 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ));.  return SQL
151d0 49 54 45 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 20 20  ITE_OK;.#else.  
151e0 72 63 20 3d 20 6f 73 46 6c 75 73 68 46 69 6c 65  rc = osFlushFile
151f0 42 75 66 66 65 72 73 28 70 46 69 6c 65 2d 3e 68  Buffers(pFile->h
15200 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  );.  SimulateIOE
15210 72 72 6f 72 28 20 72 63 3d 46 41 4c 53 45 20 29  rror( rc=FALSE )
15220 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
15230 20 20 4f 53 54 52 41 43 45 28 28 22 53 59 4e 43    OSTRACE(("SYNC
15240 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c   file=%p, rc=SQL
15250 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65  ITE_OK\n", pFile
15260 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75 72  ->h));.    retur
15270 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
15280 65 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d  else{.    pFile-
15290 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47  >lastErrno = osG
152a0 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
152b0 20 20 20 4f 53 54 52 41 43 45 28 28 22 53 59 4e     OSTRACE(("SYN
152c0 43 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51  C file=%p, rc=SQ
152d0 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43  LITE_IOERR_FSYNC
152e0 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  \n", pFile->h));
152f0 0a 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c  .    return winL
15300 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
15310 4f 45 52 52 5f 46 53 59 4e 43 2c 20 70 46 69 6c  OERR_FSYNC, pFil
15320 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20  e->lastErrno,.  
15330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15340 20 20 20 20 20 22 77 69 6e 53 79 6e 63 22 2c 20       "winSync", 
15350 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
15360 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a   }.#endif.}../*.
15370 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65  ** Determine the
15380 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66   current size of
15390 20 61 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73   a file in bytes
153a0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
153b0 69 6e 46 69 6c 65 53 69 7a 65 28 73 71 6c 69 74  inFileSize(sqlit
153c0 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 73 71 6c  e3_file *id, sql
153d0 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 53 69 7a  ite3_int64 *pSiz
153e0 65 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70  e){.  winFile *p
153f0 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a  File = (winFile*
15400 29 69 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  )id;.  int rc = 
15410 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73  SQLITE_OK;..  as
15420 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20  sert( id!=0 );. 
15430 20 61 73 73 65 72 74 28 20 70 53 69 7a 65 21 3d   assert( pSize!=
15440 30 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49  0 );.  SimulateI
15450 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51  OError(return SQ
15460 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54  LITE_IOERR_FSTAT
15470 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53  );.  OSTRACE(("S
15480 49 5a 45 20 66 69 6c 65 3d 25 70 2c 20 70 53 69  IZE file=%p, pSi
15490 7a 65 3d 25 70 5c 6e 22 2c 20 70 46 69 6c 65 2d  ze=%p\n", pFile-
154a0 3e 68 2c 20 70 53 69 7a 65 29 29 3b 0a 0a 23 69  >h, pSize));..#i
154b0 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
154c0 54 0a 20 20 7b 0a 20 20 20 20 46 49 4c 45 5f 53  T.  {.    FILE_S
154d0 54 41 4e 44 41 52 44 5f 49 4e 46 4f 20 69 6e 66  TANDARD_INFO inf
154e0 6f 3b 0a 20 20 20 20 69 66 28 20 6f 73 47 65 74  o;.    if( osGet
154f0 46 69 6c 65 49 6e 66 6f 72 6d 61 74 69 6f 6e 42  FileInformationB
15500 79 48 61 6e 64 6c 65 45 78 28 70 46 69 6c 65 2d  yHandleEx(pFile-
15510 3e 68 2c 20 46 69 6c 65 53 74 61 6e 64 61 72 64  >h, FileStandard
15520 49 6e 66 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  Info,.          
15530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15540 20 20 20 20 20 20 20 20 20 20 20 26 69 6e 66 6f             &info
15550 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 20  , sizeof(info)) 
15560 29 7b 0a 20 20 20 20 20 20 2a 70 53 69 7a 65 20  ){.      *pSize 
15570 3d 20 69 6e 66 6f 2e 45 6e 64 4f 66 46 69 6c 65  = info.EndOfFile
15580 2e 51 75 61 64 50 61 72 74 3b 0a 20 20 20 20 7d  .QuadPart;.    }
15590 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 46 69 6c  else{.      pFil
155a0 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f  e->lastErrno = o
155b0 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b  sGetLastError();
155c0 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c  .      rc = winL
155d0 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
155e0 4f 45 52 52 5f 46 53 54 41 54 2c 20 70 46 69 6c  OERR_FSTAT, pFil
155f0 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20  e->lastErrno,.  
15600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15610 20 20 20 20 20 22 77 69 6e 46 69 6c 65 53 69 7a       "winFileSiz
15620 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  e", pFile->zPath
15630 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c  );.    }.  }.#el
15640 73 65 0a 20 20 7b 0a 20 20 20 20 44 57 4f 52 44  se.  {.    DWORD
15650 20 75 70 70 65 72 42 69 74 73 3b 0a 20 20 20 20   upperBits;.    
15660 44 57 4f 52 44 20 6c 6f 77 65 72 42 69 74 73 3b  DWORD lowerBits;
15670 0a 20 20 20 20 44 57 4f 52 44 20 6c 61 73 74 45  .    DWORD lastE
15680 72 72 6e 6f 3b 0a 0a 20 20 20 20 6c 6f 77 65 72  rrno;..    lower
15690 42 69 74 73 20 3d 20 6f 73 47 65 74 46 69 6c 65  Bits = osGetFile
156a0 53 69 7a 65 28 70 46 69 6c 65 2d 3e 68 2c 20 26  Size(pFile->h, &
156b0 75 70 70 65 72 42 69 74 73 29 3b 0a 20 20 20 20  upperBits);.    
156c0 2a 70 53 69 7a 65 20 3d 20 28 28 28 73 71 6c 69  *pSize = (((sqli
156d0 74 65 33 5f 69 6e 74 36 34 29 75 70 70 65 72 42  te3_int64)upperB
156e0 69 74 73 29 3c 3c 33 32 29 20 2b 20 6c 6f 77 65  its)<<32) + lowe
156f0 72 42 69 74 73 3b 0a 20 20 20 20 69 66 28 20 20  rBits;.    if(  
15700 20 28 6c 6f 77 65 72 42 69 74 73 20 3d 3d 20 49   (lowerBits == I
15710 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 53 49 5a 45  NVALID_FILE_SIZE
15720 29 0a 20 20 20 20 20 20 20 26 26 20 28 28 6c 61  ).       && ((la
15730 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
15740 61 73 74 45 72 72 6f 72 28 29 29 21 3d 4e 4f 5f  astError())!=NO_
15750 45 52 52 4f 52 29 20 29 7b 0a 20 20 20 20 20 20  ERROR) ){.      
15760 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
15770 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20   = lastErrno;.  
15780 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45      rc = winLogE
15790 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
157a0 52 5f 46 53 54 41 54 2c 20 70 46 69 6c 65 2d 3e  R_FSTAT, pFile->
157b0 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  lastErrno,.     
157c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
157d0 20 20 22 77 69 6e 46 69 6c 65 53 69 7a 65 22 2c    "winFileSize",
157e0 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
157f0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
15800 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 49 5a  .  OSTRACE(("SIZ
15810 45 20 66 69 6c 65 3d 25 70 2c 20 70 53 69 7a 65  E file=%p, pSize
15820 3d 25 70 2c 20 2a 70 53 69 7a 65 3d 25 6c 6c 64  =%p, *pSize=%lld
15830 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20  , rc=%s\n",.    
15840 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c         pFile->h,
15850 20 70 53 69 7a 65 2c 20 2a 70 53 69 7a 65 2c 20   pSize, *pSize, 
15860 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72  sqlite3ErrName(r
15870 63 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  c)));.  return r
15880 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 4f 43 4b  c;.}../*.** LOCK
15890 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49  FILE_FAIL_IMMEDI
158a0 41 54 45 4c 59 20 69 73 20 75 6e 64 65 66 69 6e  ATELY is undefin
158b0 65 64 20 6f 6e 20 73 6f 6d 65 20 57 69 6e 64 6f  ed on some Windo
158c0 77 73 20 73 79 73 74 65 6d 73 2e 0a 2a 2f 0a 23  ws systems..*/.#
158d0 69 66 6e 64 65 66 20 4c 4f 43 4b 46 49 4c 45 5f  ifndef LOCKFILE_
158e0 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59  FAIL_IMMEDIATELY
158f0 0a 23 20 64 65 66 69 6e 65 20 4c 4f 43 4b 46 49  .# define LOCKFI
15900 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54  LE_FAIL_IMMEDIAT
15910 45 4c 59 20 31 0a 23 65 6e 64 69 66 0a 0a 23 69  ELY 1.#endif..#i
15920 66 6e 64 65 66 20 4c 4f 43 4b 46 49 4c 45 5f 45  fndef LOCKFILE_E
15930 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 23 20  XCLUSIVE_LOCK.# 
15940 64 65 66 69 6e 65 20 4c 4f 43 4b 46 49 4c 45 5f  define LOCKFILE_
15950 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 32  EXCLUSIVE_LOCK 2
15960 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 48  .#endif../*.** H
15970 69 73 74 6f 72 69 63 61 6c 6c 79 2c 20 53 51 4c  istorically, SQL
15980 69 74 65 20 68 61 73 20 75 73 65 64 20 62 6f 74  ite has used bot
15990 68 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 20 61  h the LockFile a
159a0 6e 64 20 4c 6f 63 6b 46 69 6c 65 45 78 20 66 75  nd LockFileEx fu
159b0 6e 63 74 69 6f 6e 73 2e 0a 2a 2a 20 57 68 65 6e  nctions..** When
159c0 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 20 66 75   the LockFile fu
159d0 6e 63 74 69 6f 6e 20 77 61 73 20 75 73 65 64 2c  nction was used,
159e0 20 69 74 20 77 61 73 20 61 6c 77 61 79 73 20 65   it was always e
159f0 78 70 65 63 74 65 64 20 74 6f 20 66 61 69 6c 0a  xpected to fail.
15a00 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 69  ** immediately i
15a10 66 20 74 68 65 20 6c 6f 63 6b 20 63 6f 75 6c 64  f the lock could
15a20 20 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64   not be obtained
15a30 2e 20 20 41 6c 73 6f 2c 20 69 74 20 61 6c 77 61  .  Also, it alwa
15a40 79 73 20 65 78 70 65 63 74 65 64 20 74 6f 0a 2a  ys expected to.*
15a50 2a 20 6f 62 74 61 69 6e 20 61 6e 20 65 78 63 6c  * obtain an excl
15a60 75 73 69 76 65 20 6c 6f 63 6b 2e 20 20 54 68 65  usive lock.  The
15a70 73 65 20 66 6c 61 67 73 20 61 72 65 20 75 73 65  se flags are use
15a80 64 20 77 69 74 68 20 74 68 65 20 4c 6f 63 6b 46  d with the LockF
15a90 69 6c 65 45 78 20 66 75 6e 63 74 69 6f 6e 0a 2a  ileEx function.*
15aa0 2a 20 61 6e 64 20 72 65 66 6c 65 63 74 20 74 68  * and reflect th
15ab0 6f 73 65 20 65 78 70 65 63 74 61 74 69 6f 6e 73  ose expectations
15ac0 3b 20 74 68 65 72 65 66 6f 72 65 2c 20 74 68 65  ; therefore, the
15ad0 79 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20  y should not be 
15ae0 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 23 69 66 6e  changed..*/.#ifn
15af0 64 65 66 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46  def SQLITE_LOCKF
15b00 49 4c 45 5f 46 4c 41 47 53 0a 23 20 64 65 66 69  ILE_FLAGS.# defi
15b10 6e 65 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49  ne SQLITE_LOCKFI
15b20 4c 45 5f 46 4c 41 47 53 20 20 20 28 4c 4f 43 4b  LE_FLAGS   (LOCK
15b30 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49  FILE_FAIL_IMMEDI
15b40 41 54 45 4c 59 20 7c 20 5c 0a 20 20 20 20 20 20  ATELY | \.      
15b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15b60 20 20 20 20 20 20 20 20 20 20 20 20 4c 4f 43 4b              LOCK
15b70 46 49 4c 45 5f 45 58 43 4c 55 53 49 56 45 5f 4c  FILE_EXCLUSIVE_L
15b80 4f 43 4b 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  OCK).#endif../*.
15b90 2a 2a 20 43 75 72 72 65 6e 74 6c 79 2c 20 53 51  ** Currently, SQ
15ba0 4c 69 74 65 20 6e 65 76 65 72 20 63 61 6c 6c 73  Lite never calls
15bb0 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 45 78 20   the LockFileEx 
15bc0 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 6f 75 74  function without
15bd0 20 77 61 6e 74 69 6e 67 20 74 68 65 0a 2a 2a 20   wanting the.** 
15be0 63 61 6c 6c 20 74 6f 20 66 61 69 6c 20 69 6d 6d  call to fail imm
15bf0 65 64 69 61 74 65 6c 79 20 69 66 20 74 68 65 20  ediately if the 
15c00 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20 62 65 20 6f  lock cannot be o
15c10 62 74 61 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66 6e  btained..*/.#ifn
15c20 64 65 66 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46  def SQLITE_LOCKF
15c30 49 4c 45 45 58 5f 46 4c 41 47 53 0a 23 20 64 65  ILEEX_FLAGS.# de
15c40 66 69 6e 65 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  fine SQLITE_LOCK
15c50 46 49 4c 45 45 58 5f 46 4c 41 47 53 20 28 4c 4f  FILEEX_FLAGS (LO
15c60 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45  CKFILE_FAIL_IMME
15c70 44 49 41 54 45 4c 59 29 0a 23 65 6e 64 69 66 0a  DIATELY).#endif.
15c80 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61  ./*.** Acquire a
15c90 20 72 65 61 64 65 72 20 6c 6f 63 6b 2e 0a 2a 2a   reader lock..**
15ca0 20 44 69 66 66 65 72 65 6e 74 20 41 50 49 20 72   Different API r
15cb0 6f 75 74 69 6e 65 73 20 61 72 65 20 63 61 6c 6c  outines are call
15cc0 65 64 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20  ed depending on 
15cd0 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
15ce0 68 69 73 0a 2a 2a 20 69 73 20 57 69 6e 39 78 20  his.** is Win9x 
15cf0 6f 72 20 57 69 6e 4e 54 2e 0a 2a 2f 0a 73 74 61  or WinNT..*/.sta
15d00 74 69 63 20 69 6e 74 20 77 69 6e 47 65 74 52 65  tic int winGetRe
15d10 61 64 4c 6f 63 6b 28 77 69 6e 46 69 6c 65 20 2a  adLock(winFile *
15d20 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20 72 65  pFile){.  int re
15d30 73 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52  s;.  OSTRACE(("R
15d40 45 41 44 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70  EAD-LOCK file=%p
15d50 2c 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20 70 46  , lock=%d\n", pF
15d60 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c  ile->h, pFile->l
15d70 6f 63 6b 74 79 70 65 29 29 3b 0a 20 20 69 66 28  ocktype));.  if(
15d80 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 23 69 66   osIsNT() ){.#if
15d90 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
15da0 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 4e  .    /*.    ** N
15db0 4f 54 45 3a 20 57 69 6e 64 6f 77 73 20 43 45 20  OTE: Windows CE 
15dc0 69 73 20 68 61 6e 64 6c 65 64 20 64 69 66 66 65  is handled diffe
15dd0 72 65 6e 74 6c 79 20 68 65 72 65 20 64 75 65 20  rently here due 
15de0 69 74 73 20 6c 61 63 6b 20 6f 66 20 74 68 65 20  its lack of the 
15df0 57 69 6e 33 32 0a 20 20 20 20 2a 2a 20 20 20 20  Win32.    **    
15e00 20 20 20 41 50 49 20 4c 6f 63 6b 46 69 6c 65 45     API LockFileE
15e10 78 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65  x..    */.    re
15e20 73 20 3d 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c  s = winceLockFil
15e30 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41  e(&pFile->h, SHA
15e40 52 45 44 5f 46 49 52 53 54 2c 20 30 2c 20 31 2c  RED_FIRST, 0, 1,
15e50 20 30 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 72   0);.#else.    r
15e60 65 73 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65  es = winLockFile
15e70 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49  (&pFile->h, SQLI
15e80 54 45 5f 4c 4f 43 4b 46 49 4c 45 45 58 5f 46 4c  TE_LOCKFILEEX_FL
15e90 41 47 53 2c 20 53 48 41 52 45 44 5f 46 49 52 53  AGS, SHARED_FIRS
15ea0 54 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  T, 0,.          
15eb0 20 20 20 20 20 20 20 20 20 20 20 20 53 48 41 52              SHAR
15ec0 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 23 65 6e  ED_SIZE, 0);.#en
15ed0 64 69 66 0a 20 20 7d 0a 23 69 66 64 65 66 20 53  dif.  }.#ifdef S
15ee0 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
15ef0 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20  ANSI.  else{.   
15f00 20 69 6e 74 20 6c 6b 3b 0a 20 20 20 20 73 71 6c   int lk;.    sql
15f10 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28  ite3_randomness(
15f20 73 69 7a 65 6f 66 28 6c 6b 29 2c 20 26 6c 6b 29  sizeof(lk), &lk)
15f30 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61  ;.    pFile->sha
15f40 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20 28 73  redLockByte = (s
15f50 68 6f 72 74 29 28 28 6c 6b 20 26 20 30 78 37 66  hort)((lk & 0x7f
15f60 66 66 66 66 66 66 29 25 28 53 48 41 52 45 44 5f  ffffff)%(SHARED_
15f70 53 49 5a 45 20 2d 20 31 29 29 3b 0a 20 20 20 20  SIZE - 1));.    
15f80 72 65 73 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c  res = winLockFil
15f90 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c  e(&pFile->h, SQL
15fa0 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41  ITE_LOCKFILE_FLA
15fb0 47 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  GS,.            
15fc0 20 20 20 20 20 20 20 20 20 20 53 48 41 52 45 44            SHARED
15fd0 5f 46 49 52 53 54 2b 70 46 69 6c 65 2d 3e 73 68  _FIRST+pFile->sh
15fe0 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 30 2c  aredLockByte, 0,
15ff0 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64   1, 0);.  }.#end
16000 69 66 0a 20 20 69 66 28 20 72 65 73 20 3d 3d 20  if.  if( res == 
16010 30 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  0 ){.    pFile->
16020 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
16030 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
16040 20 20 2f 2a 20 4e 6f 20 6e 65 65 64 20 74 6f 20    /* No need to 
16050 6c 6f 67 20 61 20 66 61 69 6c 75 72 65 20 74 6f  log a failure to
16060 20 6c 6f 63 6b 20 2a 2f 0a 20 20 7d 0a 20 20 4f   lock */.  }.  O
16070 53 54 52 41 43 45 28 28 22 52 45 41 44 2d 4c 4f  STRACE(("READ-LO
16080 43 4b 20 66 69 6c 65 3d 25 70 2c 20 72 65 73 75  CK file=%p, resu
16090 6c 74 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d  lt=%d\n", pFile-
160a0 3e 68 2c 20 72 65 73 29 29 3b 0a 20 20 72 65 74  >h, res));.  ret
160b0 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn res;.}../*.*
160c0 2a 20 55 6e 64 6f 20 61 20 72 65 61 64 6c 6f 63  * Undo a readloc
160d0 6b 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  k.*/.static int 
160e0 77 69 6e 55 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63  winUnlockReadLoc
160f0 6b 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65  k(winFile *pFile
16100 29 7b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20  ){.  int res;.  
16110 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b  DWORD lastErrno;
16120 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52 45 41  .  OSTRACE(("REA
16130 44 2d 55 4e 4c 4f 43 4b 20 66 69 6c 65 3d 25 70  D-UNLOCK file=%p
16140 2c 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20 70 46  , lock=%d\n", pF
16150 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c  ile->h, pFile->l
16160 6f 63 6b 74 79 70 65 29 29 3b 0a 20 20 69 66 28  ocktype));.  if(
16170 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 20 20   osIsNT() ){.   
16180 20 72 65 73 20 3d 20 77 69 6e 55 6e 6c 6f 63 6b   res = winUnlock
16190 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20  File(&pFile->h, 
161a0 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c  SHARED_FIRST, 0,
161b0 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29   SHARED_SIZE, 0)
161c0 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c  ;.  }.#ifdef SQL
161d0 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
161e0 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 72  SI.  else{.    r
161f0 65 73 20 3d 20 77 69 6e 55 6e 6c 6f 63 6b 46 69  es = winUnlockFi
16200 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 48  le(&pFile->h, SH
16210 41 52 45 44 5f 46 49 52 53 54 2b 70 46 69 6c 65  ARED_FIRST+pFile
16220 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65  ->sharedLockByte
16230 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a  , 0, 1, 0);.  }.
16240 23 65 6e 64 69 66 0a 20 20 69 66 28 20 72 65 73  #endif.  if( res
16250 3d 3d 30 20 26 26 20 28 28 6c 61 73 74 45 72 72  ==0 && ((lastErr
16260 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
16270 72 6f 72 28 29 29 21 3d 45 52 52 4f 52 5f 4e 4f  ror())!=ERROR_NO
16280 54 5f 4c 4f 43 4b 45 44 29 20 29 7b 0a 20 20 20  T_LOCKED) ){.   
16290 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
162a0 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20  o = lastErrno;. 
162b0 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53     winLogError(S
162c0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
162d0 43 4b 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  CK, pFile->lastE
162e0 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
162f0 20 20 20 20 20 20 22 77 69 6e 55 6e 6c 6f 63 6b        "winUnlock
16300 52 65 61 64 4c 6f 63 6b 22 2c 20 70 46 69 6c 65  ReadLock", pFile
16310 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 20 20  ->zPath);.  }.  
16320 4f 53 54 52 41 43 45 28 28 22 52 45 41 44 2d 55  OSTRACE(("READ-U
16330 4e 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 72  NLOCK file=%p, r
16340 65 73 75 6c 74 3d 25 64 5c 6e 22 2c 20 70 46 69  esult=%d\n", pFi
16350 6c 65 2d 3e 68 2c 20 72 65 73 29 29 3b 0a 20 20  le->h, res));.  
16360 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f  return res;.}../
16370 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69  *.** Lock the fi
16380 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b  le with the lock
16390 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61   specified by pa
163a0 72 61 6d 65 74 65 72 20 6c 6f 63 6b 74 79 70 65  rameter locktype
163b0 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65   - one.** of the
163c0 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
163d0 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44  *     (1) SHARED
163e0 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29  _LOCK.**     (2)
163f0 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a   RESERVED_LOCK.*
16400 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e  *     (3) PENDIN
16410 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34  G_LOCK.**     (4
16420 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ) EXCLUSIVE_LOCK
16430 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73  .**.** Sometimes
16440 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67   when requesting
16450 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c   one lock state,
16460 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b   additional lock
16470 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69   states.** are i
16480 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65  nserted in betwe
16490 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67  en.  The locking
164a0 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f   might fail on o
164b0 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a  ne of the later.
164c0 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c  ** transitions l
164d0 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20  eaving the lock 
164e0 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20  state different 
164f0 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61  from what it sta
16500 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c  rted but.** stil
16510 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67  l short of its g
16520 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  oal.  The follow
16530 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20  ing chart shows 
16540 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74  the allowed.** t
16550 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74  ransitions and t
16560 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65  he inserted inte
16570 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a  rmediate states:
16580 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b  .**.**    UNLOCK
16590 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20  ED -> SHARED.** 
165a0 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53     SHARED -> RES
165b0 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  ERVED.**    SHAR
165c0 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
165d0 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
165e0 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28     RESERVED -> (
165f0 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
16600 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44  USIVE.**    PEND
16610 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  ING -> EXCLUSIVE
16620 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
16630 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e  ine will only in
16640 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20  crease a lock.  
16650 54 68 65 20 77 69 6e 55 6e 6c 6f 63 6b 28 29 20  The winUnlock() 
16660 72 6f 75 74 69 6e 65 0a 2a 2a 20 65 72 61 73 65  routine.** erase
16670 73 20 61 6c 6c 20 6c 6f 63 6b 73 20 61 74 20 6f  s all locks at o
16680 6e 63 65 20 61 6e 64 20 72 65 74 75 72 6e 73 20  nce and returns 
16690 75 73 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74  us immediately t
166a0 6f 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  o locking level 
166b0 30 2e 0a 2a 2a 20 49 74 20 69 73 20 6e 6f 74 20  0..** It is not 
166c0 70 6f 73 73 69 62 6c 65 20 74 6f 20 6c 6f 77 65  possible to lowe
166d0 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  r the locking le
166e0 76 65 6c 20 6f 6e 65 20 73 74 65 70 20 61 74 20  vel one step at 
166f0 61 20 74 69 6d 65 2e 20 20 59 6f 75 0a 2a 2a 20  a time.  You.** 
16700 6d 75 73 74 20 67 6f 20 73 74 72 61 69 67 68 74  must go straight
16710 20 74 6f 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65   to locking leve
16720 6c 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  l 0..*/.static i
16730 6e 74 20 77 69 6e 4c 6f 63 6b 28 73 71 6c 69 74  nt winLock(sqlit
16740 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
16750 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e   locktype){.  in
16760 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
16770 3b 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63  ;    /* Return c
16780 6f 64 65 20 66 72 6f 6d 20 73 75 62 72 6f 75 74  ode from subrout
16790 69 6e 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ines */.  int re
167a0 73 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20  s = 1;          
167b0 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20 61 20   /* Result of a 
167c0 57 69 6e 64 6f 77 73 20 6c 6f 63 6b 20 63 61 6c  Windows lock cal
167d0 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 65 77 4c 6f  l */.  int newLo
167e0 63 6b 74 79 70 65 3b 20 20 20 20 20 20 20 2f 2a  cktype;       /*
167f0 20 53 65 74 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b   Set pFile->lock
16800 74 79 70 65 20 74 6f 20 74 68 69 73 20 76 61 6c  type to this val
16810 75 65 20 62 65 66 6f 72 65 20 65 78 69 74 69 6e  ue before exitin
16820 67 20 2a 2f 0a 20 20 69 6e 74 20 67 6f 74 50 65  g */.  int gotPe
16830 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20 30 3b 2f 2a  ndingLock = 0;/*
16840 20 54 72 75 65 20 69 66 20 77 65 20 61 63 71 75   True if we acqu
16850 69 72 65 64 20 61 20 50 45 4e 44 49 4e 47 20 6c  ired a PENDING l
16860 6f 63 6b 20 74 68 69 73 20 74 69 6d 65 20 2a 2f  ock this time */
16870 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  .  winFile *pFil
16880 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64  e = (winFile*)id
16890 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72  ;.  DWORD lastEr
168a0 72 6e 6f 20 3d 20 4e 4f 5f 45 52 52 4f 52 3b 0a  rno = NO_ERROR;.
168b0 0a 20 20 61 73 73 65 72 74 28 20 69 64 21 3d 30  .  assert( id!=0
168c0 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22   );.  OSTRACE(("
168d0 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6f 6c  LOCK file=%p, ol
168e0 64 4c 6f 63 6b 3d 25 64 28 25 64 29 2c 20 6e 65  dLock=%d(%d), ne
168f0 77 4c 6f 63 6b 3d 25 64 5c 6e 22 2c 0a 20 20 20  wLock=%d\n",.   
16900 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68          pFile->h
16910 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  , pFile->locktyp
16920 65 2c 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64  e, pFile->shared
16930 4c 6f 63 6b 42 79 74 65 2c 20 6c 6f 63 6b 74 79  LockByte, lockty
16940 70 65 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  pe));..  /* If t
16950 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20  here is already 
16960 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20 74  a lock of this t
16970 79 70 65 20 6f 72 20 6d 6f 72 65 20 72 65 73 74  ype or more rest
16980 72 69 63 74 69 76 65 20 6f 6e 20 74 68 65 0a 20  rictive on the. 
16990 20 2a 2a 20 4f 73 46 69 6c 65 2c 20 64 6f 20 6e   ** OsFile, do n
169a0 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75 73  othing. Don't us
169b0 65 20 74 68 65 20 65 6e 64 5f 6c 6f 63 6b 3a 20  e the end_lock: 
169c0 65 78 69 74 20 70 61 74 68 2c 20 61 73 0a 20 20  exit path, as.  
169d0 2a 2a 20 73 71 6c 69 74 65 33 4f 73 45 6e 74 65  ** sqlite3OsEnte
169e0 72 4d 75 74 65 78 28 29 20 68 61 73 6e 27 74 20  rMutex() hasn't 
169f0 62 65 65 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e  been called yet.
16a00 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  .  */.  if( pFil
16a10 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 6c 6f 63  e->locktype>=loc
16a20 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 4f 53 54  ktype ){.    OST
16a30 52 41 43 45 28 28 22 4c 4f 43 4b 2d 48 45 4c 44  RACE(("LOCK-HELD
16a40 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c   file=%p, rc=SQL
16a50 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65  ITE_OK\n", pFile
16a60 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75 72  ->h));.    retur
16a70 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
16a80 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
16a90 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71   the locking seq
16aa0 75 65 6e 63 65 20 69 73 20 63 6f 72 72 65 63 74  uence is correct
16ab0 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
16ac0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 21  pFile->locktype!
16ad0 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 6c 6f 63 6b  =NO_LOCK || lock
16ae0 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
16af0 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c  K );.  assert( l
16b00 6f 63 6b 74 79 70 65 21 3d 50 45 4e 44 49 4e 47  ocktype!=PENDING
16b10 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
16b20 74 28 20 6c 6f 63 6b 74 79 70 65 21 3d 52 45 53  t( locktype!=RES
16b30 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46  ERVED_LOCK || pF
16b40 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53  ile->locktype==S
16b50 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20  HARED_LOCK );.. 
16b60 20 2f 2a 20 4c 6f 63 6b 20 74 68 65 20 50 45 4e   /* Lock the PEN
16b70 44 49 4e 47 5f 4c 4f 43 4b 20 62 79 74 65 20 69  DING_LOCK byte i
16b80 66 20 77 65 20 6e 65 65 64 20 74 6f 20 61 63 71  f we need to acq
16b90 75 69 72 65 20 61 20 50 45 4e 44 49 4e 47 20 6c  uire a PENDING l
16ba0 6f 63 6b 20 6f 72 0a 20 20 2a 2a 20 61 20 53 48  ock or.  ** a SH
16bb0 41 52 45 44 20 6c 6f 63 6b 2e 20 20 49 66 20 77  ARED lock.  If w
16bc0 65 20 61 72 65 20 61 63 71 75 69 72 69 6e 67 20  e are acquiring 
16bd0 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74  a SHARED lock, t
16be0 68 65 20 61 63 71 75 69 73 69 74 69 6f 6e 20 6f  he acquisition o
16bf0 66 0a 20 20 2a 2a 20 74 68 65 20 50 45 4e 44 49  f.  ** the PENDI
16c00 4e 47 5f 4c 4f 43 4b 20 62 79 74 65 20 69 73 20  NG_LOCK byte is 
16c10 74 65 6d 70 6f 72 61 72 79 2e 0a 20 20 2a 2f 0a  temporary..  */.
16c20 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20    newLocktype = 
16c30 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3b  pFile->locktype;
16c40 0a 20 20 69 66 28 20 20 20 28 70 46 69 6c 65 2d  .  if(   (pFile-
16c50 3e 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f  >locktype==NO_LO
16c60 43 4b 29 0a 20 20 20 20 20 7c 7c 20 28 20 20 20  CK).     || (   
16c70 28 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55  (locktype==EXCLU
16c80 53 49 56 45 5f 4c 4f 43 4b 29 0a 20 20 20 20 20  SIVE_LOCK).     
16c90 20 20 20 20 26 26 20 28 70 46 69 6c 65 2d 3e 6c      && (pFile->l
16ca0 6f 63 6b 74 79 70 65 3d 3d 52 45 53 45 52 56 45  ocktype==RESERVE
16cb0 44 5f 4c 4f 43 4b 29 29 0a 20 20 29 7b 0a 20 20  D_LOCK)).  ){.  
16cc0 20 20 69 6e 74 20 63 6e 74 20 3d 20 33 3b 0a 20    int cnt = 3;. 
16cd0 20 20 20 77 68 69 6c 65 28 20 63 6e 74 2d 2d 3e     while( cnt-->
16ce0 30 20 26 26 20 28 72 65 73 20 3d 20 77 69 6e 4c  0 && (res = winL
16cf0 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e  ockFile(&pFile->
16d00 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49  h, SQLITE_LOCKFI
16d10 4c 45 5f 46 4c 41 47 53 2c 0a 20 20 20 20 20 20  LE_FLAGS,.      
16d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16d40 20 20 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c     PENDING_BYTE,
16d50 20 30 2c 20 31 2c 20 30 29 29 3d 3d 30 20 29 7b   0, 1, 0))==0 ){
16d60 0a 20 20 20 20 20 20 2f 2a 20 54 72 79 20 33 20  .      /* Try 3 
16d70 74 69 6d 65 73 20 74 6f 20 67 65 74 20 74 68 65  times to get the
16d80 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 2e 20 20   pending lock.  
16d90 54 68 69 73 20 69 73 20 6e 65 65 64 65 64 20 74  This is needed t
16da0 6f 20 77 6f 72 6b 0a 20 20 20 20 20 20 2a 2a 20  o work.      ** 
16db0 61 72 6f 75 6e 64 20 70 72 6f 62 6c 65 6d 73 20  around problems 
16dc0 63 61 75 73 65 64 20 62 79 20 69 6e 64 65 78 69  caused by indexi
16dd0 6e 67 20 61 6e 64 2f 6f 72 20 61 6e 74 69 2d 76  ng and/or anti-v
16de0 69 72 75 73 20 73 6f 66 74 77 61 72 65 20 6f 6e  irus software on
16df0 0a 20 20 20 20 20 20 2a 2a 20 57 69 6e 64 6f 77  .      ** Window
16e00 73 20 73 79 73 74 65 6d 73 2e 0a 20 20 20 20 20  s systems..     
16e10 20 2a 2a 20 49 66 20 79 6f 75 20 61 72 65 20 75   ** If you are u
16e20 73 69 6e 67 20 74 68 69 73 20 63 6f 64 65 20 61  sing this code a
16e30 73 20 61 20 6d 6f 64 65 6c 20 66 6f 72 20 61 6c  s a model for al
16e40 74 65 72 6e 61 74 69 76 65 20 56 46 53 65 73 2c  ternative VFSes,
16e50 20 64 6f 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a   do not.      **
16e60 20 63 6f 70 79 20 74 68 69 73 20 72 65 74 72 79   copy this retry
16e70 20 6c 6f 67 69 63 2e 20 20 49 74 20 69 73 20 61   logic.  It is a
16e80 20 68 61 63 6b 20 69 6e 74 65 6e 64 65 64 20 66   hack intended f
16e90 6f 72 20 57 69 6e 64 6f 77 73 20 6f 6e 6c 79 2e  or Windows only.
16ea0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
16eb0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
16ec0 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
16ed0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f      OSTRACE(("LO
16ee0 43 4b 2d 50 45 4e 44 49 4e 47 2d 46 41 49 4c 20  CK-PENDING-FAIL 
16ef0 66 69 6c 65 3d 25 70 2c 20 63 6f 75 6e 74 3d 25  file=%p, count=%
16f00 64 2c 20 72 65 73 75 6c 74 3d 25 64 5c 6e 22 2c  d, result=%d\n",
16f10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16f20 70 46 69 6c 65 2d 3e 68 2c 20 63 6e 74 2c 20 72  pFile->h, cnt, r
16f30 65 73 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  es));.      if( 
16f40 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52  lastErrno==ERROR
16f50 5f 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 20  _INVALID_HANDLE 
16f60 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65  ){.        pFile
16f70 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61  ->lastErrno = la
16f80 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20  stErrno;.       
16f90 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
16fa0 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20  RR_LOCK;.       
16fb0 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 2d   OSTRACE(("LOCK-
16fc0 46 41 49 4c 20 66 69 6c 65 3d 25 70 2c 20 63 6f  FAIL file=%p, co
16fd0 75 6e 74 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22  unt=%d, rc=%s\n"
16fe0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
16ff0 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 63 6e 74     pFile->h, cnt
17000 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65  , sqlite3ErrName
17010 28 72 63 29 29 29 3b 0a 20 20 20 20 20 20 20 20  (rc)));.        
17020 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
17030 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 6e 74   }.      if( cnt
17040 20 29 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32   ) sqlite3_win32
17050 5f 73 6c 65 65 70 28 31 29 3b 0a 20 20 20 20 7d  _sleep(1);.    }
17060 0a 20 20 20 20 67 6f 74 50 65 6e 64 69 6e 67 4c  .    gotPendingL
17070 6f 63 6b 20 3d 20 72 65 73 3b 0a 20 20 20 20 69  ock = res;.    i
17080 66 28 20 21 72 65 73 20 29 7b 0a 20 20 20 20 20  f( !res ){.     
17090 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47   lastErrno = osG
170a0 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
170b0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41     }.  }..  /* A
170c0 63 71 75 69 72 65 20 61 20 73 68 61 72 65 64 20  cquire a shared 
170d0 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20  lock.  */.  if( 
170e0 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44  locktype==SHARED
170f0 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20 29 7b 0a  _LOCK && res ){.
17100 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c      assert( pFil
17110 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f  e->locktype==NO_
17120 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 65 73 20  LOCK );.    res 
17130 3d 20 77 69 6e 47 65 74 52 65 61 64 4c 6f 63 6b  = winGetReadLock
17140 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 69 66 28  (pFile);.    if(
17150 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20 6e 65   res ){.      ne
17160 77 4c 6f 63 6b 74 79 70 65 20 3d 20 53 48 41 52  wLocktype = SHAR
17170 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c  ED_LOCK;.    }el
17180 73 65 7b 0a 20 20 20 20 20 20 6c 61 73 74 45 72  se{.      lastEr
17190 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
171a0 72 72 6f 72 28 29 3b 0a 20 20 20 20 7d 0a 20 20  rror();.    }.  
171b0 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20  }..  /* Acquire 
171c0 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 0a  a RESERVED lock.
171d0 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74    */.  if( lockt
171e0 79 70 65 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ype==RESERVED_LO
171f0 43 4b 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20  CK && res ){.   
17200 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
17210 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44  locktype==SHARED
17220 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 65 73  _LOCK );.    res
17230 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26   = winLockFile(&
17240 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45  pFile->h, SQLITE
17250 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53 2c  _LOCKFILE_FLAGS,
17260 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20   RESERVED_BYTE, 
17270 30 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 69 66  0, 1, 0);.    if
17280 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20 6e  ( res ){.      n
17290 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 52 45 53  ewLocktype = RES
172a0 45 52 56 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20  ERVED_LOCK;.    
172b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c 61 73  }else{.      las
172c0 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
172d0 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 7d  stError();.    }
172e0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69  .  }..  /* Acqui
172f0 72 65 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63  re a PENDING loc
17300 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63  k.  */.  if( loc
17310 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45  ktype==EXCLUSIVE
17320 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20 29 7b 0a  _LOCK && res ){.
17330 20 20 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20      newLocktype 
17340 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a  = PENDING_LOCK;.
17350 20 20 20 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f      gotPendingLo
17360 63 6b 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  ck = 0;.  }..  /
17370 2a 20 41 63 71 75 69 72 65 20 61 6e 20 45 58 43  * Acquire an EXC
17380 4c 55 53 49 56 45 20 6c 6f 63 6b 0a 20 20 2a 2f  LUSIVE lock.  */
17390 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d  .  if( locktype=
173a0 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
173b0 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20 61 73  && res ){.    as
173c0 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63  sert( pFile->loc
173d0 6b 74 79 70 65 3e 3d 53 48 41 52 45 44 5f 4c 4f  ktype>=SHARED_LO
173e0 43 4b 20 29 3b 0a 20 20 20 20 72 65 73 20 3d 20  CK );.    res = 
173f0 77 69 6e 55 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63  winUnlockReadLoc
17400 6b 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 72 65  k(pFile);.    re
17410 73 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28  s = winLockFile(
17420 26 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54  &pFile->h, SQLIT
17430 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53  E_LOCKFILE_FLAGS
17440 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20  , SHARED_FIRST, 
17450 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
17460 20 20 20 20 20 20 20 20 20 53 48 41 52 45 44 5f           SHARED_
17470 53 49 5a 45 2c 20 30 29 3b 0a 20 20 20 20 69 66  SIZE, 0);.    if
17480 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20 6e  ( res ){.      n
17490 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 45 58 43  ewLocktype = EXC
174a0 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b 0a 20 20 20  LUSIVE_LOCK;.   
174b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c 61   }else{.      la
174c0 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
174d0 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
174e0 20 20 77 69 6e 47 65 74 52 65 61 64 4c 6f 63 6b    winGetReadLock
174f0 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20  (pFile);.    }. 
17500 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 61   }..  /* If we a
17510 72 65 20 68 6f 6c 64 69 6e 67 20 61 20 50 45 4e  re holding a PEN
17520 44 49 4e 47 20 6c 6f 63 6b 20 74 68 61 74 20 6f  DING lock that o
17530 75 67 68 74 20 74 6f 20 62 65 20 72 65 6c 65 61  ught to be relea
17540 73 65 64 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 72  sed, then.  ** r
17550 65 6c 65 61 73 65 20 69 74 20 6e 6f 77 2e 0a 20  elease it now.. 
17560 20 2a 2f 0a 20 20 69 66 28 20 67 6f 74 50 65 6e   */.  if( gotPen
17570 64 69 6e 67 4c 6f 63 6b 20 26 26 20 6c 6f 63 6b  dingLock && lock
17580 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
17590 4b 20 29 7b 0a 20 20 20 20 77 69 6e 55 6e 6c 6f  K ){.    winUnlo
175a0 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68  ckFile(&pFile->h
175b0 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20  , PENDING_BYTE, 
175c0 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20  0, 1, 0);.  }.. 
175d0 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 73   /* Update the s
175e0 74 61 74 65 20 6f 66 20 74 68 65 20 6c 6f 63 6b  tate of the lock
175f0 20 68 61 73 20 68 65 6c 64 20 69 6e 20 74 68 65   has held in the
17600 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
17610 20 74 68 65 6e 0a 20 20 2a 2a 20 72 65 74 75 72   then.  ** retur
17620 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  n the appropriat
17630 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 0a 20  e result code.. 
17640 20 2a 2f 0a 20 20 69 66 28 20 72 65 73 20 29 7b   */.  if( res ){
17650 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
17660 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _OK;.  }else{.  
17670 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
17680 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a  no = lastErrno;.
17690 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
176a0 42 55 53 59 3b 0a 20 20 20 20 4f 53 54 52 41 43  BUSY;.    OSTRAC
176b0 45 28 28 22 4c 4f 43 4b 2d 46 41 49 4c 20 66 69  E(("LOCK-FAIL fi
176c0 6c 65 3d 25 70 2c 20 77 61 6e 74 65 64 3d 25 64  le=%p, wanted=%d
176d0 2c 20 67 6f 74 3d 25 64 5c 6e 22 2c 0a 20 20 20  , got=%d\n",.   
176e0 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
176f0 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 2c 20 6e 65  >h, locktype, ne
17700 77 4c 6f 63 6b 74 79 70 65 29 29 3b 0a 20 20 7d  wLocktype));.  }
17710 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  .  pFile->lockty
17720 70 65 20 3d 20 28 75 38 29 6e 65 77 4c 6f 63 6b  pe = (u8)newLock
17730 74 79 70 65 3b 0a 20 20 4f 53 54 52 41 43 45 28  type;.  OSTRACE(
17740 28 22 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20  ("LOCK file=%p, 
17750 6c 6f 63 6b 3d 25 64 2c 20 72 63 3d 25 73 5c 6e  lock=%d, rc=%s\n
17760 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46  ",.           pF
17770 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c  ile->h, pFile->l
17780 6f 63 6b 74 79 70 65 2c 20 73 71 6c 69 74 65 33  ocktype, sqlite3
17790 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20  ErrName(rc)));. 
177a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
177b0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
177c0 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72  e checks if ther
177d0 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20  e is a RESERVED 
177e0 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65  lock held on the
177f0 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69   specified.** fi
17800 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e  le by this or an
17810 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e  y other process.
17820 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20   If such a lock 
17830 69 73 20 68 65 6c 64 2c 20 72 65 74 75 72 6e 0a  is held, return.
17840 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 6f 74 68  ** non-zero, oth
17850 65 72 77 69 73 65 20 7a 65 72 6f 2e 0a 2a 2f 0a  erwise zero..*/.
17860 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 43 68  static int winCh
17870 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
17880 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
17890 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b  , int *pResOut){
178a0 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 77 69  .  int res;.  wi
178b0 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  nFile *pFile = (
178c0 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20  winFile*)id;..  
178d0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
178e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
178f0 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56  OERR_CHECKRESERV
17900 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 4f 53 54  EDLOCK; );.  OST
17910 52 41 43 45 28 28 22 54 45 53 54 2d 57 52 2d 4c  RACE(("TEST-WR-L
17920 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 70 52 65  OCK file=%p, pRe
17930 73 4f 75 74 3d 25 70 5c 6e 22 2c 20 70 46 69 6c  sOut=%p\n", pFil
17940 65 2d 3e 68 2c 20 70 52 65 73 4f 75 74 29 29 3b  e->h, pResOut));
17950 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 21 3d  ..  assert( id!=
17960 30 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65  0 );.  if( pFile
17970 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 52 45 53 45  ->locktype>=RESE
17980 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  RVED_LOCK ){.   
17990 20 72 65 73 20 3d 20 31 3b 0a 20 20 20 20 4f 53   res = 1;.    OS
179a0 54 52 41 43 45 28 28 22 54 45 53 54 2d 57 52 2d  TRACE(("TEST-WR-
179b0 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 72 65  LOCK file=%p, re
179c0 73 75 6c 74 3d 25 64 20 28 6c 6f 63 61 6c 29 5c  sult=%d (local)\
179d0 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 65  n", pFile->h, re
179e0 73 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  s));.  }else{.  
179f0 20 20 72 65 73 20 3d 20 77 69 6e 4c 6f 63 6b 46    res = winLockF
17a00 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53  ile(&pFile->h, S
17a10 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 45 58  QLITE_LOCKFILEEX
17a20 5f 46 4c 41 47 53 2c 52 45 53 45 52 56 45 44 5f  _FLAGS,RESERVED_
17a30 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a  BYTE, 0, 1, 0);.
17a40 20 20 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20      if( res ){. 
17a50 20 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 46 69       winUnlockFi
17a60 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 52 45  le(&pFile->h, RE
17a70 53 45 52 56 45 44 5f 42 59 54 45 2c 20 30 2c 20  SERVED_BYTE, 0, 
17a80 31 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  1, 0);.    }.   
17a90 20 72 65 73 20 3d 20 21 72 65 73 3b 0a 20 20 20   res = !res;.   
17aa0 20 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 2d   OSTRACE(("TEST-
17ab0 57 52 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c  WR-LOCK file=%p,
17ac0 20 72 65 73 75 6c 74 3d 25 64 20 28 72 65 6d 6f   result=%d (remo
17ad0 74 65 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  te)\n", pFile->h
17ae0 2c 20 72 65 73 29 29 3b 0a 20 20 7d 0a 20 20 2a  , res));.  }.  *
17af0 70 52 65 73 4f 75 74 20 3d 20 72 65 73 3b 0a 20  pResOut = res;. 
17b00 20 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 2d   OSTRACE(("TEST-
17b10 57 52 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c  WR-LOCK file=%p,
17b20 20 70 52 65 73 4f 75 74 3d 25 70 2c 20 2a 70 52   pResOut=%p, *pR
17b30 65 73 4f 75 74 3d 25 64 2c 20 72 63 3d 53 51 4c  esOut=%d, rc=SQL
17b40 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20  ITE_OK\n",.     
17b50 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20        pFile->h, 
17b60 70 52 65 73 4f 75 74 2c 20 2a 70 52 65 73 4f 75  pResOut, *pResOu
17b70 74 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  t));.  return SQ
17b80 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
17b90 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b  * Lower the lock
17ba0 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c  ing level on fil
17bb0 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 64 20  e descriptor id 
17bc0 74 6f 20 6c 6f 63 6b 74 79 70 65 2e 20 20 6c 6f  to locktype.  lo
17bd0 63 6b 74 79 70 65 0a 2a 2a 20 6d 75 73 74 20 62  cktype.** must b
17be0 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b  e either NO_LOCK
17bf0 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e   or SHARED_LOCK.
17c00 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f  .**.** If the lo
17c10 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74  cking level of t
17c20 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
17c30 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74  or is already at
17c40 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65   or below.** the
17c50 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69   requested locki
17c60 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72  ng level, this r
17c70 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
17c80 70 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 6e  p..**.** It is n
17c90 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20  ot possible for 
17ca0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 20  this routine to 
17cb0 66 61 69 6c 20 69 66 20 74 68 65 20 73 65 63 6f  fail if the seco
17cc0 6e 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69  nd argument.** i
17cd0 73 20 4e 4f 5f 4c 4f 43 4b 2e 20 20 49 66 20 74  s NO_LOCK.  If t
17ce0 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
17cf0 6e 74 20 69 73 20 53 48 41 52 45 44 5f 4c 4f 43  nt is SHARED_LOC
17d00 4b 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  K then this rout
17d10 69 6e 65 0a 2a 2a 20 6d 69 67 68 74 20 72 65 74  ine.** might ret
17d20 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
17d30 3b 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.*/.static int 
17d40 77 69 6e 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65  winUnlock(sqlite
17d50 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
17d60 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74  locktype){.  int
17d70 20 74 79 70 65 3b 0a 20 20 77 69 6e 46 69 6c 65   type;.  winFile
17d80 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69   *pFile = (winFi
17d90 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72 63  le*)id;.  int rc
17da0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
17db0 61 73 73 65 72 74 28 20 70 46 69 6c 65 21 3d 30  assert( pFile!=0
17dc0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f   );.  assert( lo
17dd0 63 6b 74 79 70 65 3c 3d 53 48 41 52 45 44 5f 4c  cktype<=SHARED_L
17de0 4f 43 4b 20 29 3b 0a 20 20 4f 53 54 52 41 43 45  OCK );.  OSTRACE
17df0 28 28 22 55 4e 4c 4f 43 4b 20 66 69 6c 65 3d 25  (("UNLOCK file=%
17e00 70 2c 20 6f 6c 64 4c 6f 63 6b 3d 25 64 28 25 64  p, oldLock=%d(%d
17e10 29 2c 20 6e 65 77 4c 6f 63 6b 3d 25 64 5c 6e 22  ), newLock=%d\n"
17e20 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69  ,.           pFi
17e30 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f  le->h, pFile->lo
17e40 63 6b 74 79 70 65 2c 20 70 46 69 6c 65 2d 3e 73  cktype, pFile->s
17e50 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 6c  haredLockByte, l
17e60 6f 63 6b 74 79 70 65 29 29 3b 0a 20 20 74 79 70  ocktype));.  typ
17e70 65 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  e = pFile->lockt
17e80 79 70 65 3b 0a 20 20 69 66 28 20 74 79 70 65 3e  ype;.  if( type>
17e90 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
17ea0 29 7b 0a 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b  ){.    winUnlock
17eb0 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20  File(&pFile->h, 
17ec0 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c  SHARED_FIRST, 0,
17ed0 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29   SHARED_SIZE, 0)
17ee0 3b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 74 79  ;.    if( lockty
17ef0 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe==SHARED_LOCK 
17f00 26 26 20 21 77 69 6e 47 65 74 52 65 61 64 4c 6f  && !winGetReadLo
17f10 63 6b 28 70 46 69 6c 65 29 20 29 7b 0a 20 20 20  ck(pFile) ){.   
17f20 20 20 20 2f 2a 20 54 68 69 73 20 73 68 6f 75 6c     /* This shoul
17f30 64 20 6e 65 76 65 72 20 68 61 70 70 65 6e 2e 20  d never happen. 
17f40 20 57 65 20 73 68 6f 75 6c 64 20 61 6c 77 61 79   We should alway
17f50 73 20 62 65 20 61 62 6c 65 20 74 6f 0a 20 20 20  s be able to.   
17f60 20 20 20 2a 2a 20 72 65 61 63 71 75 69 72 65 20     ** reacquire 
17f70 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f  the read lock */
17f80 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c  .      rc = winL
17f90 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
17fa0 4f 45 52 52 5f 55 4e 4c 4f 43 4b 2c 20 6f 73 47  OERR_UNLOCK, osG
17fb0 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20  etLastError(),. 
17fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17fd0 20 20 20 20 20 20 22 77 69 6e 55 6e 6c 6f 63 6b        "winUnlock
17fe0 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
17ff0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
18000 28 20 74 79 70 65 3e 3d 52 45 53 45 52 56 45 44  ( type>=RESERVED
18010 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 77 69 6e  _LOCK ){.    win
18020 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c  UnlockFile(&pFil
18030 65 2d 3e 68 2c 20 52 45 53 45 52 56 45 44 5f 42  e->h, RESERVED_B
18040 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20  YTE, 0, 1, 0);. 
18050 20 7d 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70   }.  if( locktyp
18060 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 26 26 20 74 79  e==NO_LOCK && ty
18070 70 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe>=SHARED_LOCK 
18080 29 7b 0a 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b  ){.    winUnlock
18090 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b  ReadLock(pFile);
180a0 0a 20 20 7d 0a 20 20 69 66 28 20 74 79 70 65 3e  .  }.  if( type>
180b0 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 7b  =PENDING_LOCK ){
180c0 0a 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 46 69  .    winUnlockFi
180d0 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 50 45  le(&pFile->h, PE
180e0 4e 44 49 4e 47 5f 42 59 54 45 2c 20 30 2c 20 31  NDING_BYTE, 0, 1
180f0 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 70 46 69 6c  , 0);.  }.  pFil
18100 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 28 75  e->locktype = (u
18110 38 29 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 4f 53  8)locktype;.  OS
18120 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 66  TRACE(("UNLOCK f
18130 69 6c 65 3d 25 70 2c 20 6c 6f 63 6b 3d 25 64 2c  ile=%p, lock=%d,
18140 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20   rc=%s\n",.     
18150 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20        pFile->h, 
18160 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c  pFile->locktype,
18170 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28   sqlite3ErrName(
18180 72 63 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  rc)));.  return 
18190 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  rc;.}../*.** If 
181a0 2a 70 41 72 67 20 69 73 20 69 6e 69 74 69 74 69  *pArg is inititi
181b0 61 6c 6c 79 20 6e 65 67 61 74 69 76 65 20 74 68  ally negative th
181c0 65 6e 20 74 68 69 73 20 69 73 20 61 20 71 75 65  en this is a que
181d0 72 79 2e 20 20 53 65 74 20 2a 70 41 72 67 20 74  ry.  Set *pArg t
181e0 6f 0a 2a 2a 20 31 20 6f 72 20 30 20 64 65 70 65  o.** 1 or 0 depe
181f0 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72  nding on whether
18200 20 6f 72 20 6e 6f 74 20 62 69 74 20 6d 61 73 6b   or not bit mask
18210 20 6f 66 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46   of pFile->ctrlF
18220 6c 61 67 73 20 69 73 20 73 65 74 2e 0a 2a 2a 0a  lags is set..**.
18230 2a 2a 20 49 66 20 2a 70 41 72 67 20 69 73 20 30  ** If *pArg is 0
18240 20 6f 72 20 31 2c 20 74 68 65 6e 20 63 6c 65 61   or 1, then clea
18250 72 20 6f 72 20 73 65 74 20 74 68 65 20 6d 61 73  r or set the mas
18260 6b 20 62 69 74 20 6f 66 20 70 46 69 6c 65 2d 3e  k bit of pFile->
18270 63 74 72 6c 46 6c 61 67 73 2e 0a 2a 2f 0a 73 74  ctrlFlags..*/.st
18280 61 74 69 63 20 76 6f 69 64 20 77 69 6e 4d 6f 64  atic void winMod
18290 65 42 69 74 28 77 69 6e 46 69 6c 65 20 2a 70 46  eBit(winFile *pF
182a0 69 6c 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  ile, unsigned ch
182b0 61 72 20 6d 61 73 6b 2c 20 69 6e 74 20 2a 70 41  ar mask, int *pA
182c0 72 67 29 7b 0a 20 20 69 66 28 20 2a 70 41 72 67  rg){.  if( *pArg
182d0 3c 30 20 29 7b 0a 20 20 20 20 2a 70 41 72 67 20  <0 ){.    *pArg 
182e0 3d 20 28 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c  = (pFile->ctrlFl
182f0 61 67 73 20 26 20 6d 61 73 6b 29 21 3d 30 3b 0a  ags & mask)!=0;.
18300 20 20 7d 65 6c 73 65 20 69 66 28 20 28 2a 70 41    }else if( (*pA
18310 72 67 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 46  rg)==0 ){.    pF
18320 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26  ile->ctrlFlags &
18330 3d 20 7e 6d 61 73 6b 3b 0a 20 20 7d 65 6c 73 65  = ~mask;.  }else
18340 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72  {.    pFile->ctr
18350 6c 46 6c 61 67 73 20 7c 3d 20 6d 61 73 6b 3b 0a  lFlags |= mask;.
18360 20 20 7d 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72    }.}../* Forwar
18370 64 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  d references to 
18380 56 46 53 20 68 65 6c 70 65 72 20 6d 65 74 68 6f  VFS helper metho
18390 64 73 20 75 73 65 64 20 66 6f 72 20 74 65 6d 70  ds used for temp
183a0 6f 72 61 72 79 20 66 69 6c 65 73 20 2a 2f 0a 73  orary files */.s
183b0 74 61 74 69 63 20 69 6e 74 20 77 69 6e 47 65 74  tatic int winGet
183c0 54 65 6d 70 6e 61 6d 65 28 73 71 6c 69 74 65 33  Tempname(sqlite3
183d0 5f 76 66 73 20 2a 2c 20 63 68 61 72 20 2a 2a 29  _vfs *, char **)
183e0 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  ;.static int win
183f0 49 73 44 69 72 28 63 6f 6e 73 74 20 76 6f 69 64  IsDir(const void
18400 20 2a 29 3b 0a 73 74 61 74 69 63 20 42 4f 4f 4c   *);.static BOOL
18410 20 77 69 6e 49 73 44 72 69 76 65 4c 65 74 74 65   winIsDriveLette
18420 72 41 6e 64 43 6f 6c 6f 6e 28 63 6f 6e 73 74 20  rAndColon(const 
18430 63 68 61 72 20 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20  char *);../*.** 
18440 43 6f 6e 74 72 6f 6c 20 61 6e 64 20 71 75 65 72  Control and quer
18450 79 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 66 69  y of the open fi
18460 6c 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74  le handle..*/.st
18470 61 74 69 63 20 69 6e 74 20 77 69 6e 46 69 6c 65  atic int winFile
18480 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f  Control(sqlite3_
18490 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6f 70  file *id, int op
184a0 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20  , void *pArg){. 
184b0 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20   winFile *pFile 
184c0 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a  = (winFile*)id;.
184d0 20 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54    OSTRACE(("FCNT
184e0 4c 20 66 69 6c 65 3d 25 70 2c 20 6f 70 3d 25 64  L file=%p, op=%d
184f0 2c 20 70 41 72 67 3d 25 70 5c 6e 22 2c 20 70 46  , pArg=%p\n", pF
18500 69 6c 65 2d 3e 68 2c 20 6f 70 2c 20 70 41 72 67  ile->h, op, pArg
18510 29 29 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70  ));.  switch( op
18520 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c   ){.    case SQL
18530 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54  ITE_FCNTL_LOCKST
18540 41 54 45 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69  ATE: {.      *(i
18550 6e 74 2a 29 70 41 72 67 20 3d 20 70 46 69 6c 65  nt*)pArg = pFile
18560 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20  ->locktype;.    
18570 20 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54    OSTRACE(("FCNT
18580 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51  L file=%p, rc=SQ
18590 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c  LITE_OK\n", pFil
185a0 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65  e->h));.      re
185b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
185c0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
185d0 51 4c 49 54 45 5f 4c 41 53 54 5f 45 52 52 4e 4f  QLITE_LAST_ERRNO
185e0 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a  : {.      *(int*
185f0 29 70 41 72 67 20 3d 20 28 69 6e 74 29 70 46 69  )pArg = (int)pFi
18600 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20  le->lastErrno;. 
18610 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46       OSTRACE(("F
18620 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63  CNTL file=%p, rc
18630 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70  =SQLITE_OK\n", p
18640 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20  File->h));.     
18650 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
18660 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
18670 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 43  e SQLITE_FCNTL_C
18680 48 55 4e 4b 5f 53 49 5a 45 3a 20 7b 0a 20 20 20  HUNK_SIZE: {.   
18690 20 20 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e     pFile->szChun
186a0 6b 20 3d 20 2a 28 69 6e 74 20 2a 29 70 41 72 67  k = *(int *)pArg
186b0 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  ;.      OSTRACE(
186c0 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c  ("FCNTL file=%p,
186d0 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22   rc=SQLITE_OK\n"
186e0 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
186f0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
18700 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
18710 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
18720 4c 5f 53 49 5a 45 5f 48 49 4e 54 3a 20 7b 0a 20  L_SIZE_HINT: {. 
18730 20 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e       if( pFile->
18740 73 7a 43 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20  szChunk>0 ){.   
18750 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74       sqlite3_int
18760 36 34 20 6f 6c 64 53 7a 3b 0a 20 20 20 20 20 20  64 oldSz;.      
18770 20 20 69 6e 74 20 72 63 20 3d 20 77 69 6e 46 69    int rc = winFi
18780 6c 65 53 69 7a 65 28 69 64 2c 20 26 6f 6c 64 53  leSize(id, &oldS
18790 7a 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  z);.        if( 
187a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
187b0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
187c0 65 33 5f 69 6e 74 36 34 20 6e 65 77 53 7a 20 3d  e3_int64 newSz =
187d0 20 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34   *(sqlite3_int64
187e0 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20 20 20  *)pArg;.        
187f0 20 20 69 66 28 20 6e 65 77 53 7a 3e 6f 6c 64 53    if( newSz>oldS
18800 7a 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  z ){.           
18810 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
18820 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20  Benign(1);.     
18830 20 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 54         rc = winT
18840 72 75 6e 63 61 74 65 28 69 64 2c 20 6e 65 77 53  runcate(id, newS
18850 7a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  z);.            
18860 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
18870 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20  enign(0);.      
18880 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
18890 20 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28          OSTRACE(
188a0 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c  ("FCNTL file=%p,
188b0 20 72 63 3d 25 73 5c 6e 22 2c 20 70 46 69 6c 65   rc=%s\n", pFile
188c0 2d 3e 68 2c 20 73 71 6c 69 74 65 33 45 72 72 4e  ->h, sqlite3ErrN
188d0 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 20 20 20  ame(rc)));.     
188e0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
188f0 20 20 20 20 7d 0a 20 20 20 20 20 20 4f 53 54 52      }.      OSTR
18900 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65  ACE(("FCNTL file
18910 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f  =%p, rc=SQLITE_O
18920 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29  K\n", pFile->h))
18930 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
18940 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
18950 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
18960 46 43 4e 54 4c 5f 50 45 52 53 49 53 54 5f 57 41  FCNTL_PERSIST_WA
18970 4c 3a 20 7b 0a 20 20 20 20 20 20 77 69 6e 4d 6f  L: {.      winMo
18980 64 65 42 69 74 28 70 46 69 6c 65 2c 20 57 49 4e  deBit(pFile, WIN
18990 46 49 4c 45 5f 50 45 52 53 49 53 54 5f 57 41 4c  FILE_PERSIST_WAL
189a0 2c 20 28 69 6e 74 2a 29 70 41 72 67 29 3b 0a 20  , (int*)pArg);. 
189b0 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46       OSTRACE(("F
189c0 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63  CNTL file=%p, rc
189d0 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70  =SQLITE_OK\n", p
189e0 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20  File->h));.     
189f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
18a00 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
18a10 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50  e SQLITE_FCNTL_P
18a20 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49  OWERSAFE_OVERWRI
18a30 54 45 3a 20 7b 0a 20 20 20 20 20 20 77 69 6e 4d  TE: {.      winM
18a40 6f 64 65 42 69 74 28 70 46 69 6c 65 2c 20 57 49  odeBit(pFile, WI
18a50 4e 46 49 4c 45 5f 50 53 4f 57 2c 20 28 69 6e 74  NFILE_PSOW, (int
18a60 2a 29 70 41 72 67 29 3b 0a 20 20 20 20 20 20 4f  *)pArg);.      O
18a70 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66  STRACE(("FCNTL f
18a80 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  ile=%p, rc=SQLIT
18a90 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  E_OK\n", pFile->
18aa0 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  h));.      retur
18ab0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
18ac0 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
18ad0 54 45 5f 46 43 4e 54 4c 5f 56 46 53 4e 41 4d 45  TE_FCNTL_VFSNAME
18ae0 3a 20 7b 0a 20 20 20 20 20 20 2a 28 63 68 61 72  : {.      *(char
18af0 2a 2a 29 70 41 72 67 20 3d 20 73 71 6c 69 74 65  **)pArg = sqlite
18b00 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20  3_mprintf("%s", 
18b10 70 46 69 6c 65 2d 3e 70 56 66 73 2d 3e 7a 4e 61  pFile->pVfs->zNa
18b20 6d 65 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41  me);.      OSTRA
18b30 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d  CE(("FCNTL file=
18b40 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b  %p, rc=SQLITE_OK
18b50 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  \n", pFile->h));
18b60 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
18b70 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
18b80 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
18b90 43 4e 54 4c 5f 57 49 4e 33 32 5f 41 56 5f 52 45  CNTL_WIN32_AV_RE
18ba0 54 52 59 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  TRY: {.      int
18bb0 20 2a 61 20 3d 20 28 69 6e 74 2a 29 70 41 72 67   *a = (int*)pArg
18bc0 3b 0a 20 20 20 20 20 20 69 66 28 20 61 5b 30 5d  ;.      if( a[0]
18bd0 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 77 69  >0 ){.        wi
18be0 6e 49 6f 65 72 72 52 65 74 72 79 20 3d 20 61 5b  nIoerrRetry = a[
18bf0 30 5d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  0];.      }else{
18c00 0a 20 20 20 20 20 20 20 20 61 5b 30 5d 20 3d 20  .        a[0] = 
18c10 77 69 6e 49 6f 65 72 72 52 65 74 72 79 3b 0a 20  winIoerrRetry;. 
18c20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
18c30 20 61 5b 31 5d 3e 30 20 29 7b 0a 20 20 20 20 20   a[1]>0 ){.     
18c40 20 20 20 77 69 6e 49 6f 65 72 72 52 65 74 72 79     winIoerrRetry
18c50 44 65 6c 61 79 20 3d 20 61 5b 31 5d 3b 0a 20 20  Delay = a[1];.  
18c60 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
18c70 20 20 20 61 5b 31 5d 20 3d 20 77 69 6e 49 6f 65     a[1] = winIoe
18c80 72 72 52 65 74 72 79 44 65 6c 61 79 3b 0a 20 20  rrRetryDelay;.  
18c90 20 20 20 20 7d 0a 20 20 20 20 20 20 4f 53 54 52      }.      OSTR
18ca0 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65  ACE(("FCNTL file
18cb0 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f  =%p, rc=SQLITE_O
18cc0 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29  K\n", pFile->h))
18cd0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
18ce0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
18cf0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
18d00 53 54 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  ST.    case SQLI
18d10 54 45 5f 46 43 4e 54 4c 5f 57 49 4e 33 32 5f 53  TE_FCNTL_WIN32_S
18d20 45 54 5f 48 41 4e 44 4c 45 3a 20 7b 0a 20 20 20  ET_HANDLE: {.   
18d30 20 20 20 4c 50 48 41 4e 44 4c 45 20 70 68 46 69     LPHANDLE phFi
18d40 6c 65 20 3d 20 28 4c 50 48 41 4e 44 4c 45 29 70  le = (LPHANDLE)p
18d50 41 72 67 3b 0a 20 20 20 20 20 20 48 41 4e 44 4c  Arg;.      HANDL
18d60 45 20 68 4f 6c 64 46 69 6c 65 20 3d 20 70 46 69  E hOldFile = pFi
18d70 6c 65 2d 3e 68 3b 0a 20 20 20 20 20 20 70 46 69  le->h;.      pFi
18d80 6c 65 2d 3e 68 20 3d 20 2a 70 68 46 69 6c 65 3b  le->h = *phFile;
18d90 0a 20 20 20 20 20 20 2a 70 68 46 69 6c 65 20 3d  .      *phFile =
18da0 20 68 4f 6c 64 46 69 6c 65 3b 0a 20 20 20 20 20   hOldFile;.     
18db0 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c   OSTRACE(("FCNTL
18dc0 20 6f 6c 64 46 69 6c 65 3d 25 70 2c 20 6e 65 77   oldFile=%p, new
18dd0 46 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49  File=%p, rc=SQLI
18de0 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20  TE_OK\n",.      
18df0 20 20 20 20 20 20 20 20 20 68 4f 6c 64 46 69 6c           hOldFil
18e00 65 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20  e, pFile->h));. 
18e10 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
18e20 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23 65 6e  TE_OK;.    }.#en
18e30 64 69 66 0a 20 20 20 20 63 61 73 65 20 53 51 4c  dif.    case SQL
18e40 49 54 45 5f 46 43 4e 54 4c 5f 54 45 4d 50 46 49  ITE_FCNTL_TEMPFI
18e50 4c 45 4e 41 4d 45 3a 20 7b 0a 20 20 20 20 20 20  LENAME: {.      
18e60 63 68 61 72 20 2a 7a 54 46 69 6c 65 20 3d 20 30  char *zTFile = 0
18e70 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d  ;.      int rc =
18e80 20 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65 28   winGetTempname(
18e90 70 46 69 6c 65 2d 3e 70 56 66 73 2c 20 26 7a 54  pFile->pVfs, &zT
18ea0 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 69 66 28  File);.      if(
18eb0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
18ec0 7b 0a 20 20 20 20 20 20 20 20 2a 28 63 68 61 72  {.        *(char
18ed0 2a 2a 29 70 41 72 67 20 3d 20 7a 54 46 69 6c 65  **)pArg = zTFile
18ee0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
18ef0 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20  OSTRACE(("FCNTL 
18f00 66 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e  file=%p, rc=%s\n
18f10 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 73 71 6c  ", pFile->h, sql
18f20 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29  ite3ErrName(rc))
18f30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
18f40 72 63 3b 0a 20 20 20 20 7d 0a 23 69 66 20 53 51  rc;.    }.#if SQ
18f50 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
18f60 5a 45 3e 30 0a 20 20 20 20 63 61 73 65 20 53 51  ZE>0.    case SQ
18f70 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f  LITE_FCNTL_MMAP_
18f80 53 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20 69 36  SIZE: {.      i6
18f90 34 20 6e 65 77 4c 69 6d 69 74 20 3d 20 2a 28 69  4 newLimit = *(i
18fa0 36 34 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20  64*)pArg;.      
18fb0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
18fc0 4f 4b 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65  OK;.      if( ne
18fd0 77 4c 69 6d 69 74 3e 73 71 6c 69 74 65 33 47 6c  wLimit>sqlite3Gl
18fe0 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 78 4d 6d 61  obalConfig.mxMma
18ff0 70 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 65 77  p ){.        new
19000 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 47  Limit = sqlite3G
19010 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 78 4d 6d  lobalConfig.mxMm
19020 61 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ap;.      }.    
19030 20 20 2a 28 69 36 34 2a 29 70 41 72 67 20 3d 20    *(i64*)pArg = 
19040 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d  pFile->mmapSizeM
19050 61 78 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65  ax;.      if( ne
19060 77 4c 69 6d 69 74 3e 3d 30 20 26 26 20 6e 65 77  wLimit>=0 && new
19070 4c 69 6d 69 74 21 3d 70 46 69 6c 65 2d 3e 6d 6d  Limit!=pFile->mm
19080 61 70 53 69 7a 65 4d 61 78 20 26 26 20 70 46 69  apSizeMax && pFi
19090 6c 65 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30  le->nFetchOut==0
190a0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c   ){.        pFil
190b0 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 3d  e->mmapSizeMax =
190c0 20 6e 65 77 4c 69 6d 69 74 3b 0a 20 20 20 20 20   newLimit;.     
190d0 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6d 6d     if( pFile->mm
190e0 61 70 53 69 7a 65 3e 30 20 29 7b 0a 20 20 20 20  apSize>0 ){.    
190f0 20 20 20 20 20 20 77 69 6e 55 6e 6d 61 70 66 69        winUnmapfi
19100 6c 65 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20  le(pFile);.     
19110 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4d 61 70       rc = winMap
19120 66 69 6c 65 28 70 46 69 6c 65 2c 20 2d 31 29 3b  file(pFile, -1);
19130 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
19140 20 7d 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45   }.      OSTRACE
19150 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70  (("FCNTL file=%p
19160 2c 20 72 63 3d 25 73 5c 6e 22 2c 20 70 46 69 6c  , rc=%s\n", pFil
19170 65 2d 3e 68 2c 20 73 71 6c 69 74 65 33 45 72 72  e->h, sqlite3Err
19180 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 20 20  Name(rc)));.    
19190 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
191a0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20   }.#endif.  }.  
191b0 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20  OSTRACE(("FCNTL 
191c0 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49  file=%p, rc=SQLI
191d0 54 45 5f 4e 4f 54 46 4f 55 4e 44 5c 6e 22 2c 20  TE_NOTFOUND\n", 
191e0 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 72 65  pFile->h));.  re
191f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46  turn SQLITE_NOTF
19200 4f 55 4e 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  OUND;.}../*.** R
19210 65 74 75 72 6e 20 74 68 65 20 73 65 63 74 6f 72  eturn the sector
19220 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f   size in bytes o
19230 66 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  f the underlying
19240 20 62 6c 6f 63 6b 20 64 65 76 69 63 65 20 66 6f   block device fo
19250 72 0a 2a 2a 20 74 68 65 20 73 70 65 63 69 66 69  r.** the specifi
19260 65 64 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73  ed file. This is
19270 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 35   almost always 5
19280 31 32 20 62 79 74 65 73 2c 20 62 75 74 20 6d 61  12 bytes, but ma
19290 79 20 62 65 0a 2a 2a 20 6c 61 72 67 65 72 20 66  y be.** larger f
192a0 6f 72 20 73 6f 6d 65 20 64 65 76 69 63 65 73 2e  or some devices.
192b0 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 63 6f  .**.** SQLite co
192c0 64 65 20 61 73 73 75 6d 65 73 20 74 68 69 73 20  de assumes this 
192d0 66 75 6e 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20  function cannot 
192e0 66 61 69 6c 2e 20 49 74 20 61 6c 73 6f 20 61 73  fail. It also as
192f0 73 75 6d 65 73 20 74 68 61 74 0a 2a 2a 20 69 66  sumes that.** if
19300 20 74 77 6f 20 66 69 6c 65 73 20 61 72 65 20 63   two files are c
19310 72 65 61 74 65 64 20 69 6e 20 74 68 65 20 73 61  reated in the sa
19320 6d 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 64  me file-system d
19330 69 72 65 63 74 6f 72 79 20 28 69 2e 65 2e 0a 2a  irectory (i.e..*
19340 2a 20 61 20 64 61 74 61 62 61 73 65 20 61 6e 64  * a database and
19350 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   its journal fil
19360 65 29 20 74 68 61 74 20 74 68 65 20 73 65 63 74  e) that the sect
19370 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 20  or size will be 
19380 74 68 65 0a 2a 2a 20 73 61 6d 65 20 66 6f 72 20  the.** same for 
19390 62 6f 74 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  both..*/.static 
193a0 69 6e 74 20 77 69 6e 53 65 63 74 6f 72 53 69 7a  int winSectorSiz
193b0 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
193c0 69 64 29 7b 0a 20 20 28 76 6f 69 64 29 69 64 3b  id){.  (void)id;
193d0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
193e0 5f 44 45 46 41 55 4c 54 5f 53 45 43 54 4f 52 5f  _DEFAULT_SECTOR_
193f0 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  SIZE;.}../*.** R
19400 65 74 75 72 6e 20 61 20 76 65 63 74 6f 72 20 6f  eturn a vector o
19410 66 20 64 65 76 69 63 65 20 63 68 61 72 61 63 74  f device charact
19420 65 72 69 73 74 69 63 73 2e 0a 2a 2f 0a 73 74 61  eristics..*/.sta
19430 74 69 63 20 69 6e 74 20 77 69 6e 44 65 76 69 63  tic int winDevic
19440 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
19450 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
19460 64 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70  d){.  winFile *p
19470 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b   = (winFile*)id;
19480 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
19490 5f 49 4f 43 41 50 5f 55 4e 44 45 4c 45 54 41 42  _IOCAP_UNDELETAB
194a0 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 20 7c 0a 20  LE_WHEN_OPEN |. 
194b0 20 20 20 20 20 20 20 20 28 28 70 2d 3e 63 74 72          ((p->ctr
194c0 6c 46 6c 61 67 73 20 26 20 57 49 4e 46 49 4c 45  lFlags & WINFILE
194d0 5f 50 53 4f 57 29 3f 53 51 4c 49 54 45 5f 49 4f  _PSOW)?SQLITE_IO
194e0 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56  CAP_POWERSAFE_OV
194f0 45 52 57 52 49 54 45 3a 30 29 3b 0a 7d 0a 0a 2f  ERWRITE:0);.}../
19500 2a 0a 2a 2a 20 57 69 6e 64 6f 77 73 20 77 69 6c  *.** Windows wil
19510 6c 20 6f 6e 6c 79 20 6c 65 74 20 79 6f 75 20 63  l only let you c
19520 72 65 61 74 65 20 66 69 6c 65 20 76 69 65 77 20  reate file view 
19530 6d 61 70 70 69 6e 67 73 0a 2a 2a 20 6f 6e 20 61  mappings.** on a
19540 6c 6c 6f 63 61 74 69 6f 6e 20 73 69 7a 65 20 67  llocation size g
19550 72 61 6e 75 6c 61 72 69 74 79 20 62 6f 75 6e 64  ranularity bound
19560 61 72 69 65 73 2e 0a 2a 2a 20 44 75 72 69 6e 67  aries..** During
19570 20 73 71 6c 69 74 65 33 5f 6f 73 5f 69 6e 69 74   sqlite3_os_init
19580 28 29 20 77 65 20 64 6f 20 61 20 47 65 74 53 79  () we do a GetSy
19590 73 74 65 6d 49 6e 66 6f 28 29 0a 2a 2a 20 74 6f  stemInfo().** to
195a0 20 67 65 74 20 74 68 65 20 67 72 61 6e 75 6c 61   get the granula
195b0 72 69 74 79 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74  rity size..*/.st
195c0 61 74 69 63 20 53 59 53 54 45 4d 5f 49 4e 46 4f  atic SYSTEM_INFO
195d0 20 77 69 6e 53 79 73 49 6e 66 6f 3b 0a 0a 23 69   winSysInfo;..#i
195e0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
195f0 54 5f 57 41 4c 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c  T_WAL../*.** Hel
19600 70 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f  per functions to
19610 20 6f 62 74 61 69 6e 20 61 6e 64 20 72 65 6c 69   obtain and reli
19620 6e 71 75 69 73 68 20 74 68 65 20 67 6c 6f 62 61  nquish the globa
19630 6c 20 6d 75 74 65 78 2e 20 54 68 65 0a 2a 2a 20  l mutex. The.** 
19640 67 6c 6f 62 61 6c 20 6d 75 74 65 78 20 69 73 20  global mutex is 
19650 75 73 65 64 20 74 6f 20 70 72 6f 74 65 63 74 20  used to protect 
19660 74 68 65 20 77 69 6e 4c 6f 63 6b 49 6e 66 6f 20  the winLockInfo 
19670 6f 62 6a 65 63 74 73 20 75 73 65 64 20 62 79 0a  objects used by.
19680 2a 2a 20 74 68 69 73 20 66 69 6c 65 2c 20 61 6c  ** this file, al
19690 6c 20 6f 66 20 77 68 69 63 68 20 6d 61 79 20 62  l of which may b
196a0 65 20 73 68 61 72 65 64 20 62 79 20 6d 75 6c 74  e shared by mult
196b0 69 70 6c 65 20 74 68 72 65 61 64 73 2e 0a 2a 2a  iple threads..**
196c0 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 77 69 6e  .** Function win
196d0 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 69  ShmMutexHeld() i
196e0 73 20 75 73 65 64 20 74 6f 20 61 73 73 65 72 74  s used to assert
196f0 28 29 20 74 68 61 74 20 74 68 65 20 67 6c 6f 62  () that the glob
19700 61 6c 20 6d 75 74 65 78 0a 2a 2a 20 69 73 20 68  al mutex.** is h
19710 65 6c 64 20 77 68 65 6e 20 72 65 71 75 69 72 65  eld when require
19720 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  d. This function
19730 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 61 73   is only used as
19740 20 70 61 72 74 20 6f 66 20 61 73 73 65 72 74 28   part of assert(
19750 29 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 2e  ).** statements.
19760 20 65 2e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 77 69   e.g..**.**   wi
19770 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 29  nShmEnterMutex()
19780 0a 2a 2a 20 20 20 20 20 61 73 73 65 72 74 28 20  .**     assert( 
19790 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28  winShmMutexHeld(
197a0 29 20 29 3b 0a 2a 2a 20 20 20 77 69 6e 53 68 6d  ) );.**   winShm
197b0 4c 65 61 76 65 4d 75 74 65 78 28 29 0a 2a 2f 0a  LeaveMutex().*/.
197c0 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 53  static void winS
197d0 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 76 6f 69  hmEnterMutex(voi
197e0 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  d){.  sqlite3_mu
197f0 74 65 78 5f 65 6e 74 65 72 28 73 71 6c 69 74 65  tex_enter(sqlite
19800 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
19810 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
19820 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 73 74 61 74  MASTER));.}.stat
19830 69 63 20 76 6f 69 64 20 77 69 6e 53 68 6d 4c 65  ic void winShmLe
19840 61 76 65 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a  aveMutex(void){.
19850 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
19860 6c 65 61 76 65 28 73 71 6c 69 74 65 33 4d 75 74  leave(sqlite3Mut
19870 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
19880 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54  UTEX_STATIC_MAST
19890 45 52 29 29 3b 0a 7d 0a 23 69 66 6e 64 65 66 20  ER));.}.#ifndef 
198a0 4e 44 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e  NDEBUG.static in
198b0 74 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c  t winShmMutexHel
198c0 64 28 76 6f 69 64 29 20 7b 0a 20 20 72 65 74 75  d(void) {.  retu
198d0 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  rn sqlite3_mutex
198e0 5f 68 65 6c 64 28 73 71 6c 69 74 65 33 4d 75 74  _held(sqlite3Mut
198f0 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
19900 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54  UTEX_STATIC_MAST
19910 45 52 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ER));.}.#endif..
19920 2f 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20 75 73 65  /*.** Object use
19930 64 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20 61  d to represent a
19940 20 73 69 6e 67 6c 65 20 66 69 6c 65 20 6f 70 65   single file ope
19950 6e 65 64 20 61 6e 64 20 6d 6d 61 70 70 65 64 20  ned and mmapped 
19960 74 6f 20 70 72 6f 76 69 64 65 0a 2a 2a 20 73 68  to provide.** sh
19970 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20 20 57 68  ared memory.  Wh
19980 65 6e 20 6d 75 6c 74 69 70 6c 65 20 74 68 72 65  en multiple thre
19990 61 64 73 20 61 6c 6c 20 72 65 66 65 72 65 6e 63  ads all referenc
199a0 65 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 6c 6f  e the same.** lo
199b0 67 2d 73 75 6d 6d 61 72 79 2c 20 65 61 63 68 20  g-summary, each 
199c0 74 68 72 65 61 64 20 68 61 73 20 69 74 73 20 6f  thread has its o
199d0 77 6e 20 77 69 6e 46 69 6c 65 20 6f 62 6a 65 63  wn winFile objec
199e0 74 2c 20 62 75 74 20 74 68 65 79 20 61 6c 6c 0a  t, but they all.
199f0 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 61 20 73 69  ** point to a si
19a00 6e 67 6c 65 20 69 6e 73 74 61 6e 63 65 20 6f 66  ngle instance of
19a10 20 74 68 69 73 20 6f 62 6a 65 63 74 2e 20 20 49   this object.  I
19a20 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 65  n other words, e
19a30 61 63 68 0a 2a 2a 20 6c 6f 67 2d 73 75 6d 6d 61  ach.** log-summa
19a40 72 79 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 6c  ry is opened onl
19a50 79 20 6f 6e 63 65 20 70 65 72 20 70 72 6f 63 65  y once per proce
19a60 73 73 2e 0a 2a 2a 0a 2a 2a 20 77 69 6e 53 68 6d  ss..**.** winShm
19a70 4d 75 74 65 78 48 65 6c 64 28 29 20 6d 75 73 74  MutexHeld() must
19a80 20 62 65 20 74 72 75 65 20 77 68 65 6e 20 63 72   be true when cr
19a90 65 61 74 69 6e 67 20 6f 72 20 64 65 73 74 72 6f  eating or destro
19aa0 79 69 6e 67 0a 2a 2a 20 74 68 69 73 20 6f 62 6a  ying.** this obj
19ab0 65 63 74 20 6f 72 20 77 68 69 6c 65 20 72 65 61  ect or while rea
19ac0 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20  ding or writing 
19ad0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69  the following fi
19ae0 65 6c 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  elds:.**.**     
19af0 20 6e 52 65 66 0a 2a 2a 20 20 20 20 20 20 70 4e   nRef.**      pN
19b00 65 78 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  ext.**.** The fo
19b10 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 20 61  llowing fields a
19b20 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20 61 66 74  re read-only aft
19b30 65 72 20 74 68 65 20 6f 62 6a 65 63 74 20 69 73  er the object is
19b40 20 63 72 65 61 74 65 64 3a 0a 2a 2a 0a 2a 2a 20   created:.**.** 
19b50 20 20 20 20 20 66 69 64 0a 2a 2a 20 20 20 20 20       fid.**     
19b60 20 7a 46 69 6c 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a   zFilename.**.**
19b70 20 45 69 74 68 65 72 20 77 69 6e 53 68 6d 4e 6f   Either winShmNo
19b80 64 65 2e 6d 75 74 65 78 20 6d 75 73 74 20 62 65  de.mutex must be
19b90 20 68 65 6c 64 20 6f 72 20 77 69 6e 53 68 6d 4e   held or winShmN
19ba0 6f 64 65 2e 6e 52 65 66 3d 3d 30 20 61 6e 64 0a  ode.nRef==0 and.
19bb0 2a 2a 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65  ** winShmMutexHe
19bc0 6c 64 28 29 20 69 73 20 74 72 75 65 20 77 68 65  ld() is true whe
19bd0 6e 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69  n reading or wri
19be0 74 69 6e 67 20 61 6e 79 20 6f 74 68 65 72 20 66  ting any other f
19bf0 69 65 6c 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20  ield.** in this 
19c00 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2f  structure..**.*/
19c10 0a 73 74 72 75 63 74 20 77 69 6e 53 68 6d 4e 6f  .struct winShmNo
19c20 64 65 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  de {.  sqlite3_m
19c30 75 74 65 78 20 2a 6d 75 74 65 78 3b 20 20 20 20  utex *mutex;    
19c40 20 20 2f 2a 20 4d 75 74 65 78 20 74 6f 20 61 63    /* Mutex to ac
19c50 63 65 73 73 20 74 68 69 73 20 6f 62 6a 65 63 74  cess this object
19c60 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c   */.  char *zFil
19c70 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  ename;          
19c80 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
19c90 66 69 6c 65 20 2a 2f 0a 20 20 77 69 6e 46 69 6c  file */.  winFil
19ca0 65 20 68 46 69 6c 65 3b 20 20 20 20 20 20 20 20  e hFile;        
19cb0 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e       /* File han
19cc0 64 6c 65 20 66 72 6f 6d 20 77 69 6e 4f 70 65 6e  dle from winOpen
19cd0 20 2a 2f 0a 0a 20 20 69 6e 74 20 73 7a 52 65 67   */..  int szReg
19ce0 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  ion;            
19cf0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 68 61    /* Size of sha
19d00 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f  red-memory regio
19d10 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 67  ns */.  int nReg
19d20 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  ion;            
19d30 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 72     /* Size of ar
19d40 72 61 79 20 61 70 52 65 67 69 6f 6e 20 2a 2f 0a  ray apRegion */.
19d50 20 20 73 74 72 75 63 74 20 53 68 6d 52 65 67 69    struct ShmRegi
19d60 6f 6e 20 7b 0a 20 20 20 20 48 41 4e 44 4c 45 20  on {.    HANDLE 
19d70 68 4d 61 70 3b 20 20 20 20 20 20 20 20 20 20 20  hMap;           
19d80 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65    /* File handle
19d90 20 66 72 6f 6d 20 43 72 65 61 74 65 46 69 6c 65   from CreateFile
19da0 4d 61 70 70 69 6e 67 20 2a 2f 0a 20 20 20 20 76  Mapping */.    v
19db0 6f 69 64 20 2a 70 4d 61 70 3b 0a 20 20 7d 20 2a  oid *pMap;.  } *
19dc0 61 52 65 67 69 6f 6e 3b 0a 20 20 44 57 4f 52 44  aRegion;.  DWORD
19dd0 20 6c 61 73 74 45 72 72 6e 6f 3b 20 20 20 20 20   lastErrno;     
19de0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 69 6e        /* The Win
19df0 64 6f 77 73 20 65 72 72 6e 6f 20 66 72 6f 6d 20  dows errno from 
19e00 74 68 65 20 6c 61 73 74 20 49 2f 4f 20 65 72 72  the last I/O err
19e10 6f 72 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e 52 65  or */..  int nRe
19e20 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
19e30 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
19e40 20 77 69 6e 53 68 6d 20 6f 62 6a 65 63 74 73 20   winShm objects 
19e50 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 69 73  pointing to this
19e60 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70 46   */.  winShm *pF
19e70 69 72 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  irst;           
19e80 20 2f 2a 20 41 6c 6c 20 77 69 6e 53 68 6d 20 6f   /* All winShm o
19e90 62 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e 67 20  bjects pointing 
19ea0 74 6f 20 74 68 69 73 20 2a 2f 0a 20 20 77 69 6e  to this */.  win
19eb0 53 68 6d 4e 6f 64 65 20 2a 70 4e 65 78 74 3b 20  ShmNode *pNext; 
19ec0 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20          /* Next 
19ed0 69 6e 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 77  in list of all w
19ee0 69 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74  inShmNode object
19ef0 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  s */.#ifdef SQLI
19f00 54 45 5f 44 45 42 55 47 0a 20 20 75 38 20 6e 65  TE_DEBUG.  u8 ne
19f10 78 74 53 68 6d 49 64 3b 20 20 20 20 20 20 20 20  xtShmId;        
19f20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 61 76        /* Next av
19f30 61 69 6c 61 62 6c 65 20 77 69 6e 53 68 6d 2e 69  ailable winShm.i
19f40 64 20 76 61 6c 75 65 20 2a 2f 0a 23 65 6e 64 69  d value */.#endi
19f50 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 67 6c  f.};../*.** A gl
19f60 6f 62 61 6c 20 61 72 72 61 79 20 6f 66 20 61 6c  obal array of al
19f70 6c 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a  l winShmNode obj
19f80 65 63 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ects..**.** The 
19f90 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28  winShmMutexHeld(
19fa0 29 20 6d 75 73 74 20 62 65 20 74 72 75 65 20 77  ) must be true w
19fb0 68 69 6c 65 20 72 65 61 64 69 6e 67 20 6f 72 20  hile reading or 
19fc0 77 72 69 74 69 6e 67 20 74 68 69 73 20 6c 69 73  writing this lis
19fd0 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 77 69 6e  t..*/.static win
19fe0 53 68 6d 4e 6f 64 65 20 2a 77 69 6e 53 68 6d 4e  ShmNode *winShmN
19ff0 6f 64 65 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a  odeList = 0;../*
1a000 0a 2a 2a 20 53 74 72 75 63 74 75 72 65 20 75 73  .** Structure us
1a010 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 20 62 79  ed internally by
1a020 20 74 68 69 73 20 56 46 53 20 74 6f 20 72 65 63   this VFS to rec
1a030 6f 72 64 20 74 68 65 20 73 74 61 74 65 20 6f 66  ord the state of
1a040 20 61 6e 0a 2a 2a 20 6f 70 65 6e 20 73 68 61 72   an.** open shar
1a050 65 64 20 6d 65 6d 6f 72 79 20 63 6f 6e 6e 65 63  ed memory connec
1a060 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tion..**.** The 
1a070 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73  following fields
1a080 20 61 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64   are initialized
1a090 20 77 68 65 6e 20 74 68 69 73 20 6f 62 6a 65 63   when this objec
1a0a0 74 20 69 73 20 63 72 65 61 74 65 64 20 61 6e 64  t is created and
1a0b0 0a 2a 2a 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c  .** are read-onl
1a0c0 79 20 74 68 65 72 65 61 66 74 65 72 3a 0a 2a 2a  y thereafter:.**
1a0d0 0a 2a 2a 20 20 20 20 77 69 6e 53 68 6d 2e 70 53  .**    winShm.pS
1a0e0 68 6d 4e 6f 64 65 0a 2a 2a 20 20 20 20 77 69 6e  hmNode.**    win
1a0f0 53 68 6d 2e 69 64 0a 2a 2a 0a 2a 2a 20 41 6c 6c  Shm.id.**.** All
1a100 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20 61 72   other fields ar
1a110 65 20 72 65 61 64 2f 77 72 69 74 65 2e 20 20 54  e read/write.  T
1a120 68 65 20 77 69 6e 53 68 6d 2e 70 53 68 6d 4e 6f  he winShm.pShmNo
1a130 64 65 2d 3e 6d 75 74 65 78 20 6d 75 73 74 20 62  de->mutex must b
1a140 65 20 68 65 6c 64 0a 2a 2a 20 77 68 69 6c 65 20  e held.** while 
1a150 61 63 63 65 73 73 69 6e 67 20 61 6e 79 20 72 65  accessing any re
1a160 61 64 2f 77 72 69 74 65 20 66 69 65 6c 64 73 2e  ad/write fields.
1a170 0a 2a 2f 0a 73 74 72 75 63 74 20 77 69 6e 53 68  .*/.struct winSh
1a180 6d 20 7b 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65  m {.  winShmNode
1a190 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20   *pShmNode;     
1a1a0 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69   /* The underlyi
1a1b0 6e 67 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6f 62  ng winShmNode ob
1a1c0 6a 65 63 74 20 2a 2f 0a 20 20 77 69 6e 53 68 6d  ject */.  winShm
1a1d0 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20   *pNext;        
1a1e0 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 77 69 6e       /* Next win
1a1f0 53 68 6d 20 77 69 74 68 20 74 68 65 20 73 61 6d  Shm with the sam
1a200 65 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a  e winShmNode */.
1a210 20 20 75 38 20 68 61 73 4d 75 74 65 78 3b 20 20    u8 hasMutex;  
1a220 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a230 54 72 75 65 20 69 66 20 68 6f 6c 64 69 6e 67 20  True if holding 
1a240 74 68 65 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6d  the winShmNode m
1a250 75 74 65 78 20 2a 2f 0a 20 20 75 31 36 20 73 68  utex */.  u16 sh
1a260 61 72 65 64 4d 61 73 6b 3b 20 20 20 20 20 20 20  aredMask;       
1a270 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
1a280 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 68 65 6c  shared locks hel
1a290 64 20 2a 2f 0a 20 20 75 31 36 20 65 78 63 6c 4d  d */.  u16 exclM
1a2a0 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ask;            
1a2b0 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 65 78 63    /* Mask of exc
1a2c0 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 68 65 6c  lusive locks hel
1a2d0 64 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  d */.#ifdef SQLI
1a2e0 54 45 5f 44 45 42 55 47 0a 20 20 75 38 20 69 64  TE_DEBUG.  u8 id
1a2f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1a300 20 20 20 20 20 20 2f 2a 20 49 64 20 6f 66 20 74        /* Id of t
1a310 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  his connection w
1a320 69 74 68 20 69 74 73 20 77 69 6e 53 68 6d 4e 6f  ith its winShmNo
1a330 64 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a  de */.#endif.};.
1a340 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 61 6e 74 73  ./*.** Constants
1a350 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e   used for lockin
1a360 67 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e  g.*/.#define WIN
1a370 5f 53 48 4d 5f 42 41 53 45 20 20 20 28 28 32 32  _SHM_BASE   ((22
1a380 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43  +SQLITE_SHM_NLOC
1a390 4b 29 2a 34 29 20 20 20 20 20 20 20 20 2f 2a 20  K)*4)        /* 
1a3a0 66 69 72 73 74 20 6c 6f 63 6b 20 62 79 74 65 20  first lock byte 
1a3b0 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e 5f 53  */.#define WIN_S
1a3c0 48 4d 5f 44 4d 53 20 20 20 20 28 57 49 4e 5f 53  HM_DMS    (WIN_S
1a3d0 48 4d 5f 42 41 53 45 2b 53 51 4c 49 54 45 5f 53  HM_BASE+SQLITE_S
1a3e0 48 4d 5f 4e 4c 4f 43 4b 29 20 20 2f 2a 20 64 65  HM_NLOCK)  /* de
1a3f0 61 64 6d 61 6e 20 73 77 69 74 63 68 20 2a 2f 0a  adman switch */.
1a400 0a 2f 2a 0a 2a 2a 20 41 70 70 6c 79 20 61 64 76  ./*.** Apply adv
1a410 69 73 6f 72 79 20 6c 6f 63 6b 73 20 66 6f 72 20  isory locks for 
1a420 61 6c 6c 20 6e 20 62 79 74 65 73 20 62 65 67 69  all n bytes begi
1a430 6e 6e 69 6e 67 20 61 74 20 6f 66 73 74 2e 0a 2a  nning at ofst..*
1a440 2f 0a 23 64 65 66 69 6e 65 20 5f 53 48 4d 5f 55  /.#define _SHM_U
1a450 4e 4c 43 4b 20 20 31 0a 23 64 65 66 69 6e 65 20  NLCK  1.#define 
1a460 5f 53 48 4d 5f 52 44 4c 43 4b 20 20 32 0a 23 64  _SHM_RDLCK  2.#d
1a470 65 66 69 6e 65 20 5f 53 48 4d 5f 57 52 4c 43 4b  efine _SHM_WRLCK
1a480 20 20 33 0a 73 74 61 74 69 63 20 69 6e 74 20 77    3.static int w
1a490 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28  inShmSystemLock(
1a4a0 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70  .  winShmNode *p
1a4b0 46 69 6c 65 2c 20 20 20 20 2f 2a 20 41 70 70 6c  File,    /* Appl
1a4c0 79 20 6c 6f 63 6b 73 20 74 6f 20 74 68 69 73 20  y locks to this 
1a4d0 6f 70 65 6e 20 73 68 61 72 65 64 2d 6d 65 6d 6f  open shared-memo
1a4e0 72 79 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20  ry segment */.  
1a4f0 69 6e 74 20 6c 6f 63 6b 54 79 70 65 2c 20 20 20  int lockType,   
1a500 20 20 20 20 20 20 2f 2a 20 5f 53 48 4d 5f 55 4e        /* _SHM_UN
1a510 4c 43 4b 2c 20 5f 53 48 4d 5f 52 44 4c 43 4b 2c  LCK, _SHM_RDLCK,
1a520 20 6f 72 20 5f 53 48 4d 5f 57 52 4c 43 4b 20 2a   or _SHM_WRLCK *
1a530 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20 20 20  /.  int ofst,   
1a540 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
1a550 73 65 74 20 74 6f 20 66 69 72 73 74 20 62 79 74  set to first byt
1a560 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 2f 75  e to be locked/u
1a570 6e 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74  nlocked */.  int
1a580 20 6e 42 79 74 65 20 20 20 20 20 20 20 20 20 20   nByte          
1a590 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1a5a0 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 6f 72  bytes to lock or
1a5b0 20 75 6e 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20   unlock */.){.  
1a5c0 69 6e 74 20 72 63 20 3d 20 30 3b 20 20 20 20 20  int rc = 0;     
1a5d0 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
1a5e0 63 6f 64 65 20 66 6f 72 6d 20 4c 6f 63 6b 2f 55  code form Lock/U
1a5f0 6e 6c 6f 63 6b 46 69 6c 65 45 78 28 29 20 2a 2f  nlockFileEx() */
1a600 0a 0a 20 20 2f 2a 20 41 63 63 65 73 73 20 74 6f  ..  /* Access to
1a610 20 74 68 65 20 77 69 6e 53 68 6d 4e 6f 64 65 20   the winShmNode 
1a620 6f 62 6a 65 63 74 20 69 73 20 73 65 72 69 61 6c  object is serial
1a630 69 7a 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  ized by the call
1a640 65 72 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  er */.  assert( 
1a650 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
1a660 6c 64 28 70 46 69 6c 65 2d 3e 6d 75 74 65 78 29  ld(pFile->mutex)
1a670 20 7c 7c 20 70 46 69 6c 65 2d 3e 6e 52 65 66 3d   || pFile->nRef=
1a680 3d 30 20 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45  =0 );..  OSTRACE
1a690 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 66 69 6c 65  (("SHM-LOCK file
1a6a0 3d 25 70 2c 20 6c 6f 63 6b 3d 25 64 2c 20 6f 66  =%p, lock=%d, of
1a6b0 66 73 65 74 3d 25 64 2c 20 73 69 7a 65 3d 25 64  fset=%d, size=%d
1a6c0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
1a6d0 70 46 69 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c 20  pFile->hFile.h, 
1a6e0 6c 6f 63 6b 54 79 70 65 2c 20 6f 66 73 74 2c 20  lockType, ofst, 
1a6f0 6e 42 79 74 65 29 29 3b 0a 0a 20 20 2f 2a 20 52  nByte));..  /* R
1a700 65 6c 65 61 73 65 2f 41 63 71 75 69 72 65 20 74  elease/Acquire t
1a710 68 65 20 73 79 73 74 65 6d 2d 6c 65 76 65 6c 20  he system-level 
1a720 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 6c 6f  lock */.  if( lo
1a730 63 6b 54 79 70 65 3d 3d 5f 53 48 4d 5f 55 4e 4c  ckType==_SHM_UNL
1a740 43 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 77  CK ){.    rc = w
1a750 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46  inUnlockFile(&pF
1a760 69 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c 20 6f 66  ile->hFile.h, of
1a770 73 74 2c 20 30 2c 20 6e 42 79 74 65 2c 20 30 29  st, 0, nByte, 0)
1a780 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
1a790 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
1a7a0 20 6c 6f 63 6b 69 6e 67 20 70 61 72 61 6d 65 74   locking paramet
1a7b0 65 72 73 20 2a 2f 0a 20 20 20 20 44 57 4f 52 44  ers */.    DWORD
1a7c0 20 64 77 46 6c 61 67 73 20 3d 20 4c 4f 43 4b 46   dwFlags = LOCKF
1a7d0 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41  ILE_FAIL_IMMEDIA
1a7e0 54 45 4c 59 3b 0a 20 20 20 20 69 66 28 20 6c 6f  TELY;.    if( lo
1a7f0 63 6b 54 79 70 65 20 3d 3d 20 5f 53 48 4d 5f 57  ckType == _SHM_W
1a800 52 4c 43 4b 20 29 20 64 77 46 6c 61 67 73 20 7c  RLCK ) dwFlags |
1a810 3d 20 4c 4f 43 4b 46 49 4c 45 5f 45 58 43 4c 55  = LOCKFILE_EXCLU
1a820 53 49 56 45 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72  SIVE_LOCK;.    r
1a830 63 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28  c = winLockFile(
1a840 26 70 46 69 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c  &pFile->hFile.h,
1a850 20 64 77 46 6c 61 67 73 2c 20 6f 66 73 74 2c 20   dwFlags, ofst, 
1a860 30 2c 20 6e 42 79 74 65 2c 20 30 29 3b 0a 20 20  0, nByte, 0);.  
1a870 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d 20 30 20  }..  if( rc!= 0 
1a880 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
1a890 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  TE_OK;.  }else{.
1a8a0 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
1a8b0 72 72 6e 6f 20 3d 20 20 6f 73 47 65 74 4c 61 73  rrno =  osGetLas
1a8c0 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 72 63  tError();.    rc
1a8d0 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
1a8e0 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28 28    }..  OSTRACE((
1a8f0 22 53 48 4d 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25  "SHM-LOCK file=%
1a900 70 2c 20 66 75 6e 63 3d 25 73 2c 20 65 72 72 6e  p, func=%s, errn
1a910 6f 3d 25 6c 75 2c 20 72 63 3d 25 73 5c 6e 22 2c  o=%lu, rc=%s\n",
1a920 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c  .           pFil
1a930 65 2d 3e 68 46 69 6c 65 2e 68 2c 20 28 6c 6f 63  e->hFile.h, (loc
1a940 6b 54 79 70 65 20 3d 3d 20 5f 53 48 4d 5f 55 4e  kType == _SHM_UN
1a950 4c 43 4b 29 20 3f 20 22 77 69 6e 55 6e 6c 6f 63  LCK) ? "winUnloc
1a960 6b 46 69 6c 65 22 20 3a 0a 20 20 20 20 20 20 20  kFile" :.       
1a970 20 20 20 20 22 77 69 6e 4c 6f 63 6b 46 69 6c 65      "winLockFile
1a980 22 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  ", pFile->lastEr
1a990 72 6e 6f 2c 20 73 71 6c 69 74 65 33 45 72 72 4e  rno, sqlite3ErrN
1a9a0 61 6d 65 28 72 63 29 29 29 3b 0a 0a 20 20 72 65  ame(rc)));..  re
1a9b0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46  turn rc;.}../* F
1a9c0 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
1a9d0 73 20 74 6f 20 56 46 53 20 6d 65 74 68 6f 64 73  s to VFS methods
1a9e0 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77   */.static int w
1a9f0 69 6e 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76  inOpen(sqlite3_v
1aa00 66 73 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c  fs*,const char*,
1aa10 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 69 6e  sqlite3_file*,in
1aa20 74 2c 69 6e 74 2a 29 3b 0a 73 74 61 74 69 63 20  t,int*);.static 
1aa30 69 6e 74 20 77 69 6e 44 65 6c 65 74 65 28 73 71  int winDelete(sq
1aa40 6c 69 74 65 33 5f 76 66 73 20 2a 2c 63 6f 6e 73  lite3_vfs *,cons
1aa50 74 20 63 68 61 72 2a 2c 69 6e 74 29 3b 0a 0a 2f  t char*,int);../
1aa60 2a 0a 2a 2a 20 50 75 72 67 65 20 74 68 65 20 77  *.** Purge the w
1aa70 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 20 6c 69  inShmNodeList li
1aa80 73 74 20 6f 66 20 61 6c 6c 20 65 6e 74 72 69 65  st of all entrie
1aa90 73 20 77 69 74 68 20 77 69 6e 53 68 6d 4e 6f 64  s with winShmNod
1aaa0 65 2e 6e 52 65 66 3d 3d 30 2e 0a 2a 2a 0a 2a 2a  e.nRef==0..**.**
1aab0 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 56   This is not a V
1aac0 46 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  FS shared-memory
1aad0 20 6d 65 74 68 6f 64 3b 20 69 74 20 69 73 20 61   method; it is a
1aae0 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69 6f   utility functio
1aaf0 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 62 79 20 56  n called.** by V
1ab00 46 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  FS shared-memory
1ab10 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 73 74 61   methods..*/.sta
1ab20 74 69 63 20 76 6f 69 64 20 77 69 6e 53 68 6d 50  tic void winShmP
1ab30 75 72 67 65 28 73 71 6c 69 74 65 33 5f 76 66 73  urge(sqlite3_vfs
1ab40 20 2a 70 56 66 73 2c 20 69 6e 74 20 64 65 6c 65   *pVfs, int dele
1ab50 74 65 46 6c 61 67 29 7b 0a 20 20 77 69 6e 53 68  teFlag){.  winSh
1ab60 6d 4e 6f 64 65 20 2a 2a 70 70 3b 0a 20 20 77 69  mNode **pp;.  wi
1ab70 6e 53 68 6d 4e 6f 64 65 20 2a 70 3b 0a 20 20 61  nShmNode *p;.  a
1ab80 73 73 65 72 74 28 20 77 69 6e 53 68 6d 4d 75 74  ssert( winShmMut
1ab90 65 78 48 65 6c 64 28 29 20 29 3b 0a 20 20 4f 53  exHeld() );.  OS
1aba0 54 52 41 43 45 28 28 22 53 48 4d 2d 50 55 52 47  TRACE(("SHM-PURG
1abb0 45 20 70 69 64 3d 25 6c 75 2c 20 64 65 6c 65 74  E pid=%lu, delet
1abc0 65 46 6c 61 67 3d 25 64 5c 6e 22 2c 0a 20 20 20  eFlag=%d\n",.   
1abd0 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
1abe0 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
1abf0 20 64 65 6c 65 74 65 46 6c 61 67 29 29 3b 0a 20   deleteFlag));. 
1ac00 20 70 70 20 3d 20 26 77 69 6e 53 68 6d 4e 6f 64   pp = &winShmNod
1ac10 65 4c 69 73 74 3b 0a 20 20 77 68 69 6c 65 28 20  eList;.  while( 
1ac20 28 70 20 3d 20 2a 70 70 29 21 3d 30 20 29 7b 0a  (p = *pp)!=0 ){.
1ac30 20 20 20 20 69 66 28 20 70 2d 3e 6e 52 65 66 3d      if( p->nRef=
1ac40 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
1ac50 69 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  i;.      if( p->
1ac60 6d 75 74 65 78 20 29 7b 20 73 71 6c 69 74 65 33  mutex ){ sqlite3
1ac70 5f 6d 75 74 65 78 5f 66 72 65 65 28 70 2d 3e 6d  _mutex_free(p->m
1ac80 75 74 65 78 29 3b 20 7d 0a 20 20 20 20 20 20 66  utex); }.      f
1ac90 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 52 65  or(i=0; i<p->nRe
1aca0 67 69 6f 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  gion; i++){.    
1acb0 20 20 20 20 42 4f 4f 4c 20 62 52 63 20 3d 20 6f      BOOL bRc = o
1acc0 73 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65  sUnmapViewOfFile
1acd0 28 70 2d 3e 61 52 65 67 69 6f 6e 5b 69 5d 2e 70  (p->aRegion[i].p
1ace0 4d 61 70 29 3b 0a 20 20 20 20 20 20 20 20 4f 53  Map);.        OS
1acf0 54 52 41 43 45 28 28 22 53 48 4d 2d 50 55 52 47  TRACE(("SHM-PURG
1ad00 45 2d 55 4e 4d 41 50 20 70 69 64 3d 25 6c 75 2c  E-UNMAP pid=%lu,
1ad10 20 72 65 67 69 6f 6e 3d 25 64 2c 20 72 63 3d 25   region=%d, rc=%
1ad20 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
1ad30 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72         osGetCurr
1ad40 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
1ad50 69 2c 20 62 52 63 20 3f 20 22 6f 6b 22 20 3a 20  i, bRc ? "ok" : 
1ad60 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20 20  "failed"));.    
1ad70 20 20 20 20 55 4e 55 53 45 44 5f 56 41 52 49 41      UNUSED_VARIA
1ad80 42 4c 45 5f 56 41 4c 55 45 28 62 52 63 29 3b 0a  BLE_VALUE(bRc);.
1ad90 20 20 20 20 20 20 20 20 62 52 63 20 3d 20 6f 73          bRc = os
1ada0 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 2d 3e 61  CloseHandle(p->a
1adb0 52 65 67 69 6f 6e 5b 69 5d 2e 68 4d 61 70 29 3b  Region[i].hMap);
1adc0 0a 20 20 20 20 20 20 20 20 4f 53 54 52 41 43 45  .        OSTRACE
1add0 28 28 22 53 48 4d 2d 50 55 52 47 45 2d 43 4c 4f  (("SHM-PURGE-CLO
1ade0 53 45 20 70 69 64 3d 25 6c 75 2c 20 72 65 67 69  SE pid=%lu, regi
1adf0 6f 6e 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22 2c  on=%d, rc=%s\n",
1ae00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1ae10 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72    osGetCurrentPr
1ae20 6f 63 65 73 73 49 64 28 29 2c 20 69 2c 20 62 52  ocessId(), i, bR
1ae30 63 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c  c ? "ok" : "fail
1ae40 65 64 22 29 29 3b 0a 20 20 20 20 20 20 20 20 55  ed"));.        U
1ae50 4e 55 53 45 44 5f 56 41 52 49 41 42 4c 45 5f 56  NUSED_VARIABLE_V
1ae60 41 4c 55 45 28 62 52 63 29 3b 0a 20 20 20 20 20  ALUE(bRc);.     
1ae70 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e   }.      if( p->
1ae80 68 46 69 6c 65 2e 68 21 3d 4e 55 4c 4c 20 26 26  hFile.h!=NULL &&
1ae90 20 70 2d 3e 68 46 69 6c 65 2e 68 21 3d 49 4e 56   p->hFile.h!=INV
1aea0 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
1aeb0 45 20 29 7b 0a 20 20 20 20 20 20 20 20 53 69 6d  E ){.        Sim
1aec0 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
1aed0 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 20 20 77  gn(1);.        w
1aee0 69 6e 43 6c 6f 73 65 28 28 73 71 6c 69 74 65 33  inClose((sqlite3
1aef0 5f 66 69 6c 65 20 2a 29 26 70 2d 3e 68 46 69 6c  _file *)&p->hFil
1af00 65 29 3b 0a 20 20 20 20 20 20 20 20 53 69 6d 75  e);.        Simu
1af10 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
1af20 6e 28 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n(0);.      }.  
1af30 20 20 20 20 69 66 28 20 64 65 6c 65 74 65 46 6c      if( deleteFl
1af40 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 53 69  ag ){.        Si
1af50 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
1af60 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 20 20  ign(1);.        
1af70 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
1af80 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
1af90 20 20 20 20 77 69 6e 44 65 6c 65 74 65 28 70 56      winDelete(pV
1afa0 66 73 2c 20 70 2d 3e 7a 46 69 6c 65 6e 61 6d 65  fs, p->zFilename
1afb0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
1afc0 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
1afd0 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20  lloc();.        
1afe0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
1aff0 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20  enign(0);.      
1b000 7d 0a 20 20 20 20 20 20 2a 70 70 20 3d 20 70 2d  }.      *pp = p-
1b010 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 73 71  >pNext;.      sq
1b020 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 52  lite3_free(p->aR
1b030 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20 73 71  egion);.      sq
1b040 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
1b050 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1b060 70 70 20 3d 20 26 70 2d 3e 70 4e 65 78 74 3b 0a  pp = &p->pNext;.
1b070 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
1b080 2a 2a 20 4f 70 65 6e 20 74 68 65 20 73 68 61 72  ** Open the shar
1b090 65 64 2d 6d 65 6d 6f 72 79 20 61 72 65 61 20 61  ed-memory area a
1b0a0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 64  ssociated with d
1b0b0 61 74 61 62 61 73 65 20 66 69 6c 65 20 70 44 62  atabase file pDb
1b0c0 46 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6f  Fd..**.** When o
1b0d0 70 65 6e 69 6e 67 20 61 20 6e 65 77 20 73 68 61  pening a new sha
1b0e0 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c  red-memory file,
1b0f0 20 69 66 20 6e 6f 20 6f 74 68 65 72 20 69 6e 73   if no other ins
1b100 74 61 6e 63 65 73 20 6f 66 20 74 68 61 74 0a 2a  tances of that.*
1b110 2a 20 66 69 6c 65 20 61 72 65 20 63 75 72 72 65  * file are curre
1b120 6e 74 6c 79 20 6f 70 65 6e 2c 20 69 6e 20 74 68  ntly open, in th
1b130 69 73 20 70 72 6f 63 65 73 73 20 6f 72 20 69 6e  is process or in
1b140 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73   other processes
1b150 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 66 69  , then.** the fi
1b160 6c 65 20 6d 75 73 74 20 62 65 20 74 72 75 6e 63  le must be trunc
1b170 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 6c 65 6e  ated to zero len
1b180 67 74 68 20 6f 72 20 68 61 76 65 20 69 74 73 20  gth or have its 
1b190 68 65 61 64 65 72 20 63 6c 65 61 72 65 64 2e 0a  header cleared..
1b1a0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
1b1b0 6e 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72  nOpenSharedMemor
1b1c0 79 28 77 69 6e 46 69 6c 65 20 2a 70 44 62 46 64  y(winFile *pDbFd
1b1d0 29 7b 0a 20 20 73 74 72 75 63 74 20 77 69 6e 53  ){.  struct winS
1b1e0 68 6d 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  hm *p;          
1b1f0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
1b200 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65 20  onnection to be 
1b210 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75  opened */.  stru
1b220 63 74 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70  ct winShmNode *p
1b230 53 68 6d 4e 6f 64 65 20 3d 20 30 3b 20 20 20 2f  ShmNode = 0;   /
1b240 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  * The underlying
1b250 20 6d 6d 61 70 70 65 64 20 66 69 6c 65 20 2a 2f   mmapped file */
1b260 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
1b270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b280 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
1b290 63 6f 64 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  code */.  struct
1b2a0 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 4e 65   winShmNode *pNe
1b2b0 77 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  w;           /* 
1b2c0 4e 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  Newly allocated 
1b2d0 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20  winShmNode */.  
1b2e0 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20  int nName;      
1b2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b300 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 7a 4e     /* Size of zN
1b310 61 6d 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ame in bytes */.
1b320 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 46 64  .  assert( pDbFd
1b330 2d 3e 70 53 68 6d 3d 3d 30 20 29 3b 20 20 20 20  ->pShm==0 );    
1b340 2f 2a 20 4e 6f 74 20 70 72 65 76 69 6f 75 73 6c  /* Not previousl
1b350 79 20 6f 70 65 6e 65 64 20 2a 2f 0a 0a 20 20 2f  y opened */..  /
1b360 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  * Allocate space
1b370 20 66 6f 72 20 74 68 65 20 6e 65 77 20 73 71 6c   for the new sql
1b380 69 74 65 33 5f 73 68 6d 20 6f 62 6a 65 63 74 2e  ite3_shm object.
1b390 20 20 41 6c 73 6f 20 73 70 65 63 75 6c 61 74 69    Also speculati
1b3a0 76 65 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61  vely.  ** alloca
1b3b0 74 65 20 73 70 61 63 65 20 66 6f 72 20 61 20 6e  te space for a n
1b3c0 65 77 20 77 69 6e 53 68 6d 4e 6f 64 65 20 61 6e  ew winShmNode an
1b3d0 64 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 2a 2f  d filename..  */
1b3e0 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 4d 61  .  p = sqlite3Ma
1b3f0 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66  llocZero( sizeof
1b400 28 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70 3d  (*p) );.  if( p=
1b410 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
1b420 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a  TE_IOERR_NOMEM;.
1b430 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    nName = sqlite
1b440 33 53 74 72 6c 65 6e 33 30 28 70 44 62 46 64 2d  3Strlen30(pDbFd-
1b450 3e 7a 50 61 74 68 29 3b 0a 20 20 70 4e 65 77 20  >zPath);.  pNew 
1b460 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  = sqlite3MallocZ
1b470 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70 53 68  ero( sizeof(*pSh
1b480 6d 4e 6f 64 65 29 20 2b 20 6e 4e 61 6d 65 20 2b  mNode) + nName +
1b490 20 31 37 20 29 3b 0a 20 20 69 66 28 20 70 4e 65   17 );.  if( pNe
1b4a0 77 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  w==0 ){.    sqli
1b4b0 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20  te3_free(p);.   
1b4c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
1b4d0 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  OERR_NOMEM;.  }.
1b4e0 20 20 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d    pNew->zFilenam
1b4f0 65 20 3d 20 28 63 68 61 72 2a 29 26 70 4e 65 77  e = (char*)&pNew
1b500 5b 31 5d 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  [1];.  sqlite3_s
1b510 6e 70 72 69 6e 74 66 28 6e 4e 61 6d 65 2b 31 35  nprintf(nName+15
1b520 2c 20 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d  , pNew->zFilenam
1b530 65 2c 20 22 25 73 2d 73 68 6d 22 2c 20 70 44 62  e, "%s-shm", pDb
1b540 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 73 71  Fd->zPath);.  sq
1b550 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69 78 33  lite3FileSuffix3
1b560 28 70 44 62 46 64 2d 3e 7a 50 61 74 68 2c 20 70  (pDbFd->zPath, p
1b570 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b  New->zFilename);
1b580 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 74 6f 20 73  ..  /* Look to s
1b590 65 65 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ee if there is a
1b5a0 6e 20 65 78 69 73 74 69 6e 67 20 77 69 6e 53 68  n existing winSh
1b5b0 6d 4e 6f 64 65 20 74 68 61 74 20 63 61 6e 20 62  mNode that can b
1b5c0 65 20 75 73 65 64 2e 0a 20 20 2a 2a 20 49 66 20  e used..  ** If 
1b5d0 6e 6f 20 6d 61 74 63 68 69 6e 67 20 77 69 6e 53  no matching winS
1b5e0 68 6d 4e 6f 64 65 20 63 75 72 72 65 6e 74 6c 79  hmNode currently
1b5f0 20 65 78 69 73 74 73 2c 20 63 72 65 61 74 65 20   exists, create 
1b600 61 20 6e 65 77 20 6f 6e 65 2e 0a 20 20 2a 2f 0a  a new one..  */.
1b610 20 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74    winShmEnterMut
1b620 65 78 28 29 3b 0a 20 20 66 6f 72 28 70 53 68 6d  ex();.  for(pShm
1b630 4e 6f 64 65 20 3d 20 77 69 6e 53 68 6d 4e 6f 64  Node = winShmNod
1b640 65 4c 69 73 74 3b 20 70 53 68 6d 4e 6f 64 65 3b  eList; pShmNode;
1b650 20 70 53 68 6d 4e 6f 64 65 3d 70 53 68 6d 4e 6f   pShmNode=pShmNo
1b660 64 65 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  de->pNext){.    
1b670 2f 2a 20 54 42 44 20 6e 65 65 64 20 74 6f 20 63  /* TBD need to c
1b680 6f 6d 65 20 75 70 20 77 69 74 68 20 62 65 74 74  ome up with bett
1b690 65 72 20 6d 61 74 63 68 20 68 65 72 65 2e 20 20  er match here.  
1b6a0 50 65 72 68 61 70 73 0a 20 20 20 20 2a 2a 20 75  Perhaps.    ** u
1b6b0 73 65 20 46 49 4c 45 5f 49 44 5f 42 4f 54 48 5f  se FILE_ID_BOTH_
1b6c0 44 49 52 5f 49 4e 46 4f 20 53 74 72 75 63 74 75  DIR_INFO Structu
1b6d0 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  re..    */.    i
1b6e0 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
1b6f0 70 28 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c  p(pShmNode->zFil
1b700 65 6e 61 6d 65 2c 20 70 4e 65 77 2d 3e 7a 46 69  ename, pNew->zFi
1b710 6c 65 6e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65  lename)==0 ) bre
1b720 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53  ak;.  }.  if( pS
1b730 68 6d 4e 6f 64 65 20 29 7b 0a 20 20 20 20 73 71  hmNode ){.    sq
1b740 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77 29  lite3_free(pNew)
1b750 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
1b760 53 68 6d 4e 6f 64 65 20 3d 20 70 4e 65 77 3b 0a  ShmNode = pNew;.
1b770 20 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20      pNew = 0;.  
1b780 20 20 28 28 77 69 6e 46 69 6c 65 2a 29 28 26 70    ((winFile*)(&p
1b790 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 29 29  ShmNode->hFile))
1b7a0 2d 3e 68 20 3d 20 49 4e 56 41 4c 49 44 5f 48 41  ->h = INVALID_HA
1b7b0 4e 44 4c 45 5f 56 41 4c 55 45 3b 0a 20 20 20 20  NDLE_VALUE;.    
1b7c0 70 53 68 6d 4e 6f 64 65 2d 3e 70 4e 65 78 74 20  pShmNode->pNext 
1b7d0 3d 20 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74  = winShmNodeList
1b7e0 3b 0a 20 20 20 20 77 69 6e 53 68 6d 4e 6f 64 65  ;.    winShmNode
1b7f0 4c 69 73 74 20 3d 20 70 53 68 6d 4e 6f 64 65 3b  List = pShmNode;
1b800 0a 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e  ..    pShmNode->
1b810 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 5f  mutex = sqlite3_
1b820 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49  mutex_alloc(SQLI
1b830 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a  TE_MUTEX_FAST);.
1b840 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65      if( pShmNode
1b850 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20  ->mutex==0 ){.  
1b860 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1b870 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  IOERR_NOMEM;.   
1b880 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e     goto shm_open
1b890 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  _err;.    }..   
1b8a0 20 72 63 20 3d 20 77 69 6e 4f 70 65 6e 28 70 44   rc = winOpen(pD
1b8b0 62 46 64 2d 3e 70 56 66 73 2c 0a 20 20 20 20 20  bFd->pVfs,.     
1b8c0 20 20 20 20 20 20 20 20 20 20 20 20 70 53 68 6d              pShm
1b8d0 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  Node->zFilename,
1b8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b8f0 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65  Name of the file
1b900 20 28 55 54 46 2d 38 29 20 2a 2f 0a 20 20 20 20   (UTF-8) */.    
1b910 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73 71               (sq
1b920 6c 69 74 65 33 5f 66 69 6c 65 2a 29 26 70 53 68  lite3_file*)&pSh
1b930 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c 20 20 2f  mNode->hFile,  /
1b940 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 68 65  * File handle he
1b950 72 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  re */.          
1b960 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
1b970 45 4e 5f 57 41 4c 20 7c 20 53 51 4c 49 54 45 5f  EN_WAL | SQLITE_
1b980 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c  OPEN_READWRITE |
1b990 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
1b9a0 41 54 45 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ATE,.           
1b9b0 20 20 20 20 20 20 30 29 3b 0a 20 20 20 20 69 66        0);.    if
1b9c0 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20  ( SQLITE_OK!=rc 
1b9d0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68  ){.      goto sh
1b9e0 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20  m_open_err;.    
1b9f0 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  }..    /* Check 
1ba00 74 6f 20 73 65 65 20 69 66 20 61 6e 6f 74 68 65  to see if anothe
1ba10 72 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c  r process is hol
1ba20 64 69 6e 67 20 74 68 65 20 64 65 61 64 2d 6d 61  ding the dead-ma
1ba30 6e 20 73 77 69 74 63 68 2e 0a 20 20 20 20 2a 2a  n switch..    **
1ba40 20 49 66 20 6e 6f 74 2c 20 74 72 75 6e 63 61 74   If not, truncat
1ba50 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 7a 65  e the file to ze
1ba60 72 6f 20 6c 65 6e 67 74 68 2e 0a 20 20 20 20 2a  ro length..    *
1ba70 2f 0a 20 20 20 20 69 66 28 20 77 69 6e 53 68 6d  /.    if( winShm
1ba80 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e  SystemLock(pShmN
1ba90 6f 64 65 2c 20 5f 53 48 4d 5f 57 52 4c 43 4b 2c  ode, _SHM_WRLCK,
1baa0 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31 29   WIN_SHM_DMS, 1)
1bab0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1bac0 20 20 20 20 20 72 63 20 3d 20 77 69 6e 54 72 75       rc = winTru
1bad0 6e 63 61 74 65 28 28 73 71 6c 69 74 65 33 5f 66  ncate((sqlite3_f
1bae0 69 6c 65 20 2a 29 26 70 53 68 6d 4e 6f 64 65 2d  ile *)&pShmNode-
1baf0 3e 68 46 69 6c 65 2c 20 30 29 3b 0a 20 20 20 20  >hFile, 0);.    
1bb00 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1bb10 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
1bb20 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  c = winLogError(
1bb30 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d  SQLITE_IOERR_SHM
1bb40 4f 50 45 4e 2c 20 6f 73 47 65 74 4c 61 73 74 45  OPEN, osGetLastE
1bb50 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20  rror(),.        
1bb60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb70 20 22 77 69 6e 4f 70 65 6e 53 68 6d 22 2c 20 70   "winOpenShm", p
1bb80 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  DbFd->zPath);.  
1bb90 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1bba0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1bbb0 4b 20 29 7b 0a 20 20 20 20 20 20 77 69 6e 53 68  K ){.      winSh
1bbc0 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d  mSystemLock(pShm
1bbd0 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55 4e 4c 43 4b  Node, _SHM_UNLCK
1bbe0 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31  , WIN_SHM_DMS, 1
1bbf0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69  );.      rc = wi
1bc00 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70  nShmSystemLock(p
1bc10 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 52 44  ShmNode, _SHM_RD
1bc20 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53  LCK, WIN_SHM_DMS
1bc30 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 1);.    }.    
1bc40 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 73 68  if( rc ) goto sh
1bc50 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 7d 0a  m_open_err;.  }.
1bc60 0a 20 20 2f 2a 20 4d 61 6b 65 20 74 68 65 20 6e  .  /* Make the n
1bc70 65 77 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 20  ew connection a 
1bc80 63 68 69 6c 64 20 6f 66 20 74 68 65 20 77 69 6e  child of the win
1bc90 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 70 2d 3e  ShmNode */.  p->
1bca0 70 53 68 6d 4e 6f 64 65 20 3d 20 70 53 68 6d 4e  pShmNode = pShmN
1bcb0 6f 64 65 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  ode;.#ifdef SQLI
1bcc0 54 45 5f 44 45 42 55 47 0a 20 20 70 2d 3e 69 64  TE_DEBUG.  p->id
1bcd0 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 65 78   = pShmNode->nex
1bce0 74 53 68 6d 49 64 2b 2b 3b 0a 23 65 6e 64 69 66  tShmId++;.#endif
1bcf0 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  .  pShmNode->nRe
1bd00 66 2b 2b 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53  f++;.  pDbFd->pS
1bd10 68 6d 20 3d 20 70 3b 0a 20 20 77 69 6e 53 68 6d  hm = p;.  winShm
1bd20 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 0a 20  LeaveMutex();.. 
1bd30 20 2f 2a 20 54 68 65 20 72 65 66 65 72 65 6e 63   /* The referenc
1bd40 65 20 63 6f 75 6e 74 20 6f 6e 20 70 53 68 6d 4e  e count on pShmN
1bd50 6f 64 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  ode has already 
1bd60 62 65 65 6e 20 69 6e 63 72 65 6d 65 6e 74 65 64  been incremented
1bd70 20 75 6e 64 65 72 0a 20 20 2a 2a 20 74 68 65 20   under.  ** the 
1bd80 63 6f 76 65 72 20 6f 66 20 74 68 65 20 77 69 6e  cover of the win
1bd90 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 29 20  ShmEnterMutex() 
1bda0 6d 75 74 65 78 20 61 6e 64 20 74 68 65 20 70 6f  mutex and the po
1bdb0 69 6e 74 65 72 20 66 72 6f 6d 20 74 68 65 0a 20  inter from the. 
1bdc0 20 2a 2a 20 6e 65 77 20 28 73 74 72 75 63 74 20   ** new (struct 
1bdd0 77 69 6e 53 68 6d 29 20 6f 62 6a 65 63 74 20 74  winShm) object t
1bde0 6f 20 74 68 65 20 70 53 68 6d 4e 6f 64 65 20 68  o the pShmNode h
1bdf0 61 73 20 62 65 65 6e 20 73 65 74 2e 20 41 6c 6c  as been set. All
1be00 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 6c 65   that is.  ** le
1be10 66 74 20 74 6f 20 64 6f 20 69 73 20 74 6f 20 6c  ft to do is to l
1be20 69 6e 6b 20 74 68 65 20 6e 65 77 20 6f 62 6a 65  ink the new obje
1be30 63 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b  ct into the link
1be40 65 64 20 6c 69 73 74 20 73 74 61 72 74 69 6e 67  ed list starting
1be50 0a 20 20 2a 2a 20 61 74 20 70 53 68 6d 4e 6f 64  .  ** at pShmNod
1be60 65 2d 3e 70 46 69 72 73 74 2e 20 54 68 69 73 20  e->pFirst. This 
1be70 6d 75 73 74 20 62 65 20 64 6f 6e 65 20 77 68 69  must be done whi
1be80 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 70  le holding the p
1be90 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 0a 20  ShmNode->mutex. 
1bea0 20 2a 2a 20 6d 75 74 65 78 2e 0a 20 20 2a 2f 0a   ** mutex..  */.
1beb0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1bec0 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e  enter(pShmNode->
1bed0 6d 75 74 65 78 29 3b 0a 20 20 70 2d 3e 70 4e 65  mutex);.  p->pNe
1bee0 78 74 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 70  xt = pShmNode->p
1bef0 46 69 72 73 74 3b 0a 20 20 70 53 68 6d 4e 6f 64  First;.  pShmNod
1bf00 65 2d 3e 70 46 69 72 73 74 20 3d 20 70 3b 0a 20  e->pFirst = p;. 
1bf10 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
1bf20 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  eave(pShmNode->m
1bf30 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
1bf40 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a  SQLITE_OK;..  /*
1bf50 20 4a 75 6d 70 20 68 65 72 65 20 6f 6e 20 61 6e   Jump here on an
1bf60 79 20 65 72 72 6f 72 20 2a 2f 0a 73 68 6d 5f 6f  y error */.shm_o
1bf70 70 65 6e 5f 65 72 72 3a 0a 20 20 77 69 6e 53 68  pen_err:.  winSh
1bf80 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d  mSystemLock(pShm
1bf90 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55 4e 4c 43 4b  Node, _SHM_UNLCK
1bfa0 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31  , WIN_SHM_DMS, 1
1bfb0 29 3b 0a 20 20 77 69 6e 53 68 6d 50 75 72 67 65  );.  winShmPurge
1bfc0 28 70 44 62 46 64 2d 3e 70 56 66 73 2c 20 30 29  (pDbFd->pVfs, 0)
1bfd0 3b 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63  ;      /* This c
1bfe0 61 6c 6c 20 66 72 65 65 73 20 70 53 68 6d 4e 6f  all frees pShmNo
1bff0 64 65 20 69 66 20 72 65 71 75 69 72 65 64 20 2a  de if required *
1c000 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  /.  sqlite3_free
1c010 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  (p);.  sqlite3_f
1c020 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 77 69 6e  ree(pNew);.  win
1c030 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  ShmLeaveMutex();
1c040 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1c050 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63  ./*.** Close a c
1c060 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 73 68 61  onnection to sha
1c070 72 65 64 2d 6d 65 6d 6f 72 79 2e 20 20 44 65 6c  red-memory.  Del
1c080 65 74 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69  ete the underlyi
1c090 6e 67 0a 2a 2a 20 73 74 6f 72 61 67 65 20 69 66  ng.** storage if
1c0a0 20 64 65 6c 65 74 65 46 6c 61 67 20 69 73 20 74   deleteFlag is t
1c0b0 72 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  rue..*/.static i
1c0c0 6e 74 20 77 69 6e 53 68 6d 55 6e 6d 61 70 28 0a  nt winShmUnmap(.
1c0d0 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
1c0e0 66 64 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  fd,          /* 
1c0f0 44 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67  Database holding
1c100 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a   shared memory *
1c110 2f 0a 20 20 69 6e 74 20 64 65 6c 65 74 65 46 6c  /.  int deleteFl
1c120 61 67 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ag             /
1c130 2a 20 44 65 6c 65 74 65 20 61 66 74 65 72 20 63  * Delete after c
1c140 6c 6f 73 69 6e 67 20 69 66 20 74 72 75 65 20 2a  losing if true *
1c150 2f 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a  /.){.  winFile *
1c160 70 44 62 46 64 3b 20 20 20 20 20 20 20 2f 2a 20  pDbFd;       /* 
1c170 44 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67  Database holding
1c180 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 2a   shared-memory *
1c190 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70 3b 20 20  /.  winShm *p;  
1c1a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1c1b0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62   connection to b
1c1c0 65 20 63 6c 6f 73 65 64 20 2a 2f 0a 20 20 77 69  e closed */.  wi
1c1d0 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f  nShmNode *pShmNo
1c1e0 64 65 3b 20 2f 2a 20 54 68 65 20 75 6e 64 65 72  de; /* The under
1c1f0 6c 79 69 6e 67 20 73 68 61 72 65 64 2d 6d 65 6d  lying shared-mem
1c200 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 77 69  ory file */.  wi
1c210 6e 53 68 6d 20 2a 2a 70 70 3b 20 20 20 20 20 20  nShm **pp;      
1c220 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69      /* For loopi
1c230 6e 67 20 6f 76 65 72 20 73 69 62 6c 69 6e 67 20  ng over sibling 
1c240 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 0a  connections */..
1c250 20 20 70 44 62 46 64 20 3d 20 28 77 69 6e 46 69    pDbFd = (winFi
1c260 6c 65 2a 29 66 64 3b 0a 20 20 70 20 3d 20 70 44  le*)fd;.  p = pD
1c270 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 69 66 28  bFd->pShm;.  if(
1c280 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53   p==0 ) return S
1c290 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 53 68 6d  QLITE_OK;.  pShm
1c2a0 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f  Node = p->pShmNo
1c2b0 64 65 3b 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65  de;..  /* Remove
1c2c0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 66 72   connection p fr
1c2d0 6f 6d 20 74 68 65 20 73 65 74 20 6f 66 20 63 6f  om the set of co
1c2e0 6e 6e 65 63 74 69 6f 6e 73 20 61 73 73 6f 63 69  nnections associ
1c2f0 61 74 65 64 0a 20 20 2a 2a 20 77 69 74 68 20 70  ated.  ** with p
1c300 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c  ShmNode */.  sql
1c310 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
1c320 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
1c330 29 3b 0a 20 20 66 6f 72 28 70 70 3d 26 70 53 68  );.  for(pp=&pSh
1c340 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 28  mNode->pFirst; (
1c350 2a 70 70 29 21 3d 70 3b 20 70 70 20 3d 20 26 28  *pp)!=p; pp = &(
1c360 2a 70 70 29 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20  *pp)->pNext){}. 
1c370 20 2a 70 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b   *pp = p->pNext;
1c380 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74 68 65 20  ..  /* Free the 
1c390 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 2a 2f 0a  connection p */.
1c3a0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
1c3b0 29 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53 68 6d  );.  pDbFd->pShm
1c3c0 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = 0;.  sqlite3_
1c3d0 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d  mutex_leave(pShm
1c3e0 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 0a 20  Node->mutex);.. 
1c3f0 20 2f 2a 20 49 66 20 70 53 68 6d 4e 6f 64 65 2d   /* If pShmNode-
1c400 3e 6e 52 65 66 20 68 61 73 20 72 65 61 63 68 65  >nRef has reache
1c410 64 20 30 2c 20 74 68 65 6e 20 63 6c 6f 73 65 20  d 0, then close 
1c420 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a 20  the underlying. 
1c430 20 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72   ** shared-memor
1c440 79 20 66 69 6c 65 2c 20 74 6f 6f 20 2a 2f 0a 20  y file, too */. 
1c450 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65   winShmEnterMute
1c460 78 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  x();.  assert( p
1c470 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3e 30 20  ShmNode->nRef>0 
1c480 29 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  );.  pShmNode->n
1c490 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 53 68  Ref--;.  if( pSh
1c4a0 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 29  mNode->nRef==0 )
1c4b0 7b 0a 20 20 20 20 77 69 6e 53 68 6d 50 75 72 67  {.    winShmPurg
1c4c0 65 28 70 44 62 46 64 2d 3e 70 56 66 73 2c 20 64  e(pDbFd->pVfs, d
1c4d0 65 6c 65 74 65 46 6c 61 67 29 3b 0a 20 20 7d 0a  eleteFlag);.  }.
1c4e0 20 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74    winShmLeaveMut
1c4f0 65 78 28 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  ex();..  return 
1c500 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
1c510 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6c  .** Change the l
1c520 6f 63 6b 20 73 74 61 74 65 20 66 6f 72 20 61 20  ock state for a 
1c530 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73 65  shared-memory se
1c540 67 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  gment..*/.static
1c550 20 69 6e 74 20 77 69 6e 53 68 6d 4c 6f 63 6b 28   int winShmLock(
1c560 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
1c570 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  *fd,          /*
1c580 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   Database file h
1c590 6f 6c 64 69 6e 67 20 74 68 65 20 73 68 61 72 65  olding the share
1c5a0 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e  d memory */.  in
1c5b0 74 20 6f 66 73 74 2c 20 20 20 20 20 20 20 20 20  t ofst,         
1c5c0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
1c5d0 74 20 6c 6f 63 6b 20 74 6f 20 61 63 71 75 69 72  t lock to acquir
1c5e0 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a  e or release */.
1c5f0 20 20 69 6e 74 20 6e 2c 20 20 20 20 20 20 20 20    int n,        
1c600 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c610 4e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20  Number of locks 
1c620 74 6f 20 61 63 71 75 69 72 65 20 6f 72 20 72 65  to acquire or re
1c630 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 66  lease */.  int f
1c640 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20  lags            
1c650 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f        /* What to
1c660 20 64 6f 20 77 69 74 68 20 74 68 65 20 6c 6f 63   do with the loc
1c670 6b 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46 69 6c  k */.){.  winFil
1c680 65 20 2a 70 44 62 46 64 20 3d 20 28 77 69 6e 46  e *pDbFd = (winF
1c690 69 6c 65 2a 29 66 64 3b 20 20 20 20 20 20 20 20  ile*)fd;        
1c6a0 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 68 6f  /* Connection ho
1c6b0 6c 64 69 6e 67 20 73 68 61 72 65 64 20 6d 65 6d  lding shared mem
1c6c0 6f 72 79 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20  ory */.  winShm 
1c6d0 2a 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d  *p = pDbFd->pShm
1c6e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1c6f0 2a 20 54 68 65 20 73 68 61 72 65 64 20 6d 65 6d  * The shared mem
1c700 6f 72 79 20 62 65 69 6e 67 20 6c 6f 63 6b 65 64  ory being locked
1c710 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70 58   */.  winShm *pX
1c720 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1c730 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1c740 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
1c750 61 6c 6c 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a  all siblings */.
1c760 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53    winShmNode *pS
1c770 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d  hmNode = p->pShm
1c780 4e 6f 64 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d  Node;.  int rc =
1c790 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
1c7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c7b0 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a   Result code */.
1c7c0 20 20 75 31 36 20 6d 61 73 6b 3b 20 20 20 20 20    u16 mask;     
1c7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c7e0 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
1c7f0 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 74 61 6b 65  of locks to take
1c800 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 0a   or release */..
1c810 20 20 61 73 73 65 72 74 28 20 6f 66 73 74 3e 3d    assert( ofst>=
1c820 30 20 26 26 20 6f 66 73 74 2b 6e 3c 3d 53 51 4c  0 && ofst+n<=SQL
1c830 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 20 29 3b  ITE_SHM_NLOCK );
1c840 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 3d 31 20  .  assert( n>=1 
1c850 29 3b 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61  );.  assert( fla
1c860 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f  gs==(SQLITE_SHM_
1c870 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48  LOCK | SQLITE_SH
1c880 4d 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20 20  M_SHARED).      
1c890 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49   || flags==(SQLI
1c8a0 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51  TE_SHM_LOCK | SQ
1c8b0 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49  LITE_SHM_EXCLUSI
1c8c0 56 45 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c  VE).       || fl
1c8d0 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d  ags==(SQLITE_SHM
1c8e0 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45  _UNLOCK | SQLITE
1c8f0 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a 20 20 20  _SHM_SHARED).   
1c900 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53      || flags==(S
1c910 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b  QLITE_SHM_UNLOCK
1c920 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58   | SQLITE_SHM_EX
1c930 43 4c 55 53 49 56 45 29 20 29 3b 0a 20 20 61 73  CLUSIVE) );.  as
1c940 73 65 72 74 28 20 6e 3d 3d 31 20 7c 7c 20 28 66  sert( n==1 || (f
1c950 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48  lags & SQLITE_SH
1c960 4d 5f 45 58 43 4c 55 53 49 56 45 29 21 3d 30 20  M_EXCLUSIVE)!=0 
1c970 29 3b 0a 0a 20 20 6d 61 73 6b 20 3d 20 28 75 31  );..  mask = (u1
1c980 36 29 28 28 31 55 3c 3c 28 6f 66 73 74 2b 6e 29  6)((1U<<(ofst+n)
1c990 29 20 2d 20 28 31 55 3c 3c 6f 66 73 74 29 29 3b  ) - (1U<<ofst));
1c9a0 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 31 20 7c  .  assert( n>1 |
1c9b0 7c 20 6d 61 73 6b 3d 3d 28 31 3c 3c 6f 66 73 74  | mask==(1<<ofst
1c9c0 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ) );.  sqlite3_m
1c9d0 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e  utex_enter(pShmN
1c9e0 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69  ode->mutex);.  i
1c9f0 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54  f( flags & SQLIT
1ca00 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 29 7b 0a  E_SHM_UNLOCK ){.
1ca10 20 20 20 20 75 31 36 20 61 6c 6c 4d 61 73 6b 20      u16 allMask 
1ca20 3d 20 30 3b 20 2f 2a 20 4d 61 73 6b 20 6f 66 20  = 0; /* Mask of 
1ca30 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 73 69  locks held by si
1ca40 62 6c 69 6e 67 73 20 2a 2f 0a 0a 20 20 20 20 2f  blings */..    /
1ca50 2a 20 53 65 65 20 69 66 20 61 6e 79 20 73 69 62  * See if any sib
1ca60 6c 69 6e 67 73 20 68 6f 6c 64 20 74 68 69 73 20  lings hold this 
1ca70 73 61 6d 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20  same lock */.   
1ca80 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65   for(pX=pShmNode
1ca90 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58  ->pFirst; pX; pX
1caa0 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  =pX->pNext){.   
1cab0 20 20 20 69 66 28 20 70 58 3d 3d 70 20 29 20 63     if( pX==p ) c
1cac0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 61  ontinue;.      a
1cad0 73 73 65 72 74 28 20 28 70 58 2d 3e 65 78 63 6c  ssert( (pX->excl
1cae0 4d 61 73 6b 20 26 20 28 70 2d 3e 65 78 63 6c 4d  Mask & (p->exclM
1caf0 61 73 6b 7c 70 2d 3e 73 68 61 72 65 64 4d 61 73  ask|p->sharedMas
1cb00 6b 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  k))==0 );.      
1cb10 61 6c 6c 4d 61 73 6b 20 7c 3d 20 70 58 2d 3e 73  allMask |= pX->s
1cb20 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20 7d  haredMask;.    }
1cb30 0a 0a 20 20 20 20 2f 2a 20 55 6e 6c 6f 63 6b 20  ..    /* Unlock 
1cb40 74 68 65 20 73 79 73 74 65 6d 2d 6c 65 76 65 6c  the system-level
1cb50 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66   locks */.    if
1cb60 28 20 28 6d 61 73 6b 20 26 20 61 6c 6c 4d 61 73  ( (mask & allMas
1cb70 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  k)==0 ){.      r
1cb80 63 20 3d 20 77 69 6e 53 68 6d 53 79 73 74 65 6d  c = winShmSystem
1cb90 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f  Lock(pShmNode, _
1cba0 53 48 4d 5f 55 4e 4c 43 4b 2c 20 6f 66 73 74 2b  SHM_UNLCK, ofst+
1cbb0 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29  WIN_SHM_BASE, n)
1cbc0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1cbd0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
1cbe0 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  K;.    }..    /*
1cbf0 20 55 6e 64 6f 20 74 68 65 20 6c 6f 63 61 6c 20   Undo the local 
1cc00 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28  locks */.    if(
1cc10 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1cc20 7b 0a 20 20 20 20 20 20 70 2d 3e 65 78 63 6c 4d  {.      p->exclM
1cc30 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20  ask &= ~mask;.  
1cc40 20 20 20 20 70 2d 3e 73 68 61 72 65 64 4d 61 73      p->sharedMas
1cc50 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20  k &= ~mask;.    
1cc60 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c  }.  }else if( fl
1cc70 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d  ags & SQLITE_SHM
1cc80 5f 53 48 41 52 45 44 20 29 7b 0a 20 20 20 20 75  _SHARED ){.    u
1cc90 31 36 20 61 6c 6c 53 68 61 72 65 64 20 3d 20 30  16 allShared = 0
1cca0 3b 20 20 2f 2a 20 55 6e 69 6f 6e 20 6f 66 20 6c  ;  /* Union of l
1ccb0 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 63 6f 6e  ocks held by con
1ccc0 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65 72 20 74  nections other t
1ccd0 68 61 6e 20 22 70 22 20 2a 2f 0a 0a 20 20 20 20  han "p" */..    
1cce0 2f 2a 20 46 69 6e 64 20 6f 75 74 20 77 68 69 63  /* Find out whic
1ccf0 68 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 61  h shared locks a
1cd00 72 65 20 61 6c 72 65 61 64 79 20 68 65 6c 64 20  re already held 
1cd10 62 79 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65  by sibling conne
1cd20 63 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20 49  ctions..    ** I
1cd30 66 20 61 6e 79 20 73 69 62 6c 69 6e 67 20 61 6c  f any sibling al
1cd40 72 65 61 64 79 20 68 6f 6c 64 73 20 61 6e 20 65  ready holds an e
1cd50 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20 67  xclusive lock, g
1cd60 6f 20 61 68 65 61 64 20 61 6e 64 20 72 65 74 75  o ahead and retu
1cd70 72 6e 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45  rn.    ** SQLITE
1cd80 5f 42 55 53 59 2e 0a 20 20 20 20 2a 2f 0a 20 20  _BUSY..    */.  
1cd90 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64    for(pX=pShmNod
1cda0 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70  e->pFirst; pX; p
1cdb0 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  X=pX->pNext){.  
1cdc0 20 20 20 20 69 66 28 20 28 70 58 2d 3e 65 78 63      if( (pX->exc
1cdd0 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30  lMask & mask)!=0
1cde0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1cdf0 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
1ce00 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1ce10 20 20 20 7d 0a 20 20 20 20 20 20 61 6c 6c 53 68     }.      allSh
1ce20 61 72 65 64 20 7c 3d 20 70 58 2d 3e 73 68 61 72  ared |= pX->shar
1ce30 65 64 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20  edMask;.    }.. 
1ce40 20 20 20 2f 2a 20 47 65 74 20 73 68 61 72 65 64     /* Get shared
1ce50 20 6c 6f 63 6b 73 20 61 74 20 74 68 65 20 73 79   locks at the sy
1ce60 73 74 65 6d 20 6c 65 76 65 6c 2c 20 69 66 20 6e  stem level, if n
1ce70 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 20 20  ecessary */.    
1ce80 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1ce90 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  K ){.      if( (
1cea0 61 6c 6c 53 68 61 72 65 64 20 26 20 6d 61 73 6b  allShared & mask
1ceb0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
1cec0 72 63 20 3d 20 77 69 6e 53 68 6d 53 79 73 74 65  rc = winShmSyste
1ced0 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20  mLock(pShmNode, 
1cee0 5f 53 48 4d 5f 52 44 4c 43 4b 2c 20 6f 66 73 74  _SHM_RDLCK, ofst
1cef0 2b 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2c 20 6e  +WIN_SHM_BASE, n
1cf00 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
1cf10 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
1cf20 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
1cf30 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65      }..    /* Ge
1cf40 74 20 74 68 65 20 6c 6f 63 61 6c 20 73 68 61 72  t the local shar
1cf50 65 64 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20  ed locks */.    
1cf60 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1cf70 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 73 68  K ){.      p->sh
1cf80 61 72 65 64 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b  aredMask |= mask
1cf90 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
1cfa0 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  .    /* Make sur
1cfb0 65 20 6e 6f 20 73 69 62 6c 69 6e 67 20 63 6f 6e  e no sibling con
1cfc0 6e 65 63 74 69 6f 6e 73 20 68 6f 6c 64 20 6c 6f  nections hold lo
1cfd0 63 6b 73 20 74 68 61 74 20 77 69 6c 6c 20 62 6c  cks that will bl
1cfe0 6f 63 6b 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  ock this.    ** 
1cff0 6c 6f 63 6b 2e 20 20 49 66 20 61 6e 79 20 64 6f  lock.  If any do
1d000 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
1d010 42 55 53 59 20 72 69 67 68 74 20 61 77 61 79 2e  BUSY right away.
1d020 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
1d030 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69  pX=pShmNode->pFi
1d040 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e  rst; pX; pX=pX->
1d050 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  pNext){.      if
1d060 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20  ( (pX->exclMask 
1d070 26 20 6d 61 73 6b 29 21 3d 30 20 7c 7c 20 28 70  & mask)!=0 || (p
1d080 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 20  X->sharedMask & 
1d090 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20  mask)!=0 ){.    
1d0a0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1d0b0 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 62 72  BUSY;.        br
1d0c0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
1d0d0 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 74   }..    /* Get t
1d0e0 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  he exclusive loc
1d0f0 6b 73 20 61 74 20 74 68 65 20 73 79 73 74 65 6d  ks at the system
1d100 20 6c 65 76 65 6c 2e 20 20 54 68 65 6e 20 69 66   level.  Then if
1d110 20 73 75 63 63 65 73 73 66 75 6c 0a 20 20 20 20   successful.    
1d120 2a 2a 20 61 6c 73 6f 20 6d 61 72 6b 20 74 68 65  ** also mark the
1d130 20 6c 6f 63 61 6c 20 63 6f 6e 6e 65 63 74 69 6f   local connectio
1d140 6e 20 61 73 20 62 65 69 6e 67 20 6c 6f 63 6b 65  n as being locke
1d150 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  d..    */.    if
1d160 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1d170 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69  ){.      rc = wi
1d180 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70  nShmSystemLock(p
1d190 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 57 52  ShmNode, _SHM_WR
1d1a0 4c 43 4b 2c 20 6f 66 73 74 2b 57 49 4e 5f 53 48  LCK, ofst+WIN_SH
1d1b0 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20  M_BASE, n);.    
1d1c0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1d1d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61  _OK ){.        a
1d1e0 73 73 65 72 74 28 20 28 70 2d 3e 73 68 61 72 65  ssert( (p->share
1d1f0 64 4d 61 73 6b 20 26 20 6d 61 73 6b 29 3d 3d 30  dMask & mask)==0
1d200 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65   );.        p->e
1d210 78 63 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b  xclMask |= mask;
1d220 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1d230 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
1d240 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64  ex_leave(pShmNod
1d250 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 4f 53 54  e->mutex);.  OST
1d260 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20  RACE(("SHM-LOCK 
1d270 70 69 64 3d 25 6c 75 2c 20 69 64 3d 25 64 2c 20  pid=%lu, id=%d, 
1d280 73 68 61 72 65 64 4d 61 73 6b 3d 25 30 33 78 2c  sharedMask=%03x,
1d290 20 65 78 63 6c 4d 61 73 6b 3d 25 30 33 78 2c 20   exclMask=%03x, 
1d2a0 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  rc=%s\n",.      
1d2b0 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e       osGetCurren
1d2c0 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 2d  tProcessId(), p-
1d2d0 3e 69 64 2c 20 70 2d 3e 73 68 61 72 65 64 4d 61  >id, p->sharedMa
1d2e0 73 6b 2c 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 2c  sk, p->exclMask,
1d2f0 0a 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  .           sqli
1d300 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29  te3ErrName(rc)))
1d310 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1d320 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
1d330 74 20 61 20 6d 65 6d 6f 72 79 20 62 61 72 72 69  t a memory barri
1d340 65 72 20 6f 72 20 6d 65 6d 6f 72 79 20 66 65 6e  er or memory fen
1d350 63 65 20 6f 6e 20 73 68 61 72 65 64 20 6d 65 6d  ce on shared mem
1d360 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6c  ory..**.** All l
1d370 6f 61 64 73 20 61 6e 64 20 73 74 6f 72 65 73 20  oads and stores 
1d380 62 65 67 75 6e 20 62 65 66 6f 72 65 20 74 68 65  begun before the
1d390 20 62 61 72 72 69 65 72 20 6d 75 73 74 20 63 6f   barrier must co
1d3a0 6d 70 6c 65 74 65 20 62 65 66 6f 72 65 0a 2a 2a  mplete before.**
1d3b0 20 61 6e 79 20 6c 6f 61 64 20 6f 72 20 73 74 6f   any load or sto
1d3c0 72 65 20 62 65 67 75 6e 20 61 66 74 65 72 20 74  re begun after t
1d3d0 68 65 20 62 61 72 72 69 65 72 2e 0a 2a 2f 0a 73  he barrier..*/.s
1d3e0 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 53 68  tatic void winSh
1d3f0 6d 42 61 72 72 69 65 72 28 0a 20 20 73 71 6c 69  mBarrier(.  sqli
1d400 74 65 33 5f 66 69 6c 65 20 2a 66 64 20 20 20 20  te3_file *fd    
1d410 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
1d420 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 68  e holding the sh
1d430 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29  ared memory */.)
1d440 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
1d450 45 54 45 52 28 66 64 29 3b 0a 20 20 2f 2a 20 4d  ETER(fd);.  /* M
1d460 65 6d 6f 72 79 42 61 72 72 69 65 72 28 29 3b 20  emoryBarrier(); 
1d470 2f 2f 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b  // does not work
1d480 20 2d 2d 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 20   -- do not know 
1d490 77 68 79 20 6e 6f 74 20 2a 2f 0a 20 20 77 69 6e  why not */.  win
1d4a0 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  ShmEnterMutex();
1d4b0 0a 20 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75  .  winShmLeaveMu
1d4c0 74 65 78 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tex();.}../*.** 
1d4d0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1d4e0 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69   called to obtai
1d4f0 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 72  n a pointer to r
1d500 65 67 69 6f 6e 20 69 52 65 67 69 6f 6e 20 6f 66  egion iRegion of
1d510 20 74 68 65 0a 2a 2a 20 73 68 61 72 65 64 2d 6d   the.** shared-m
1d520 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64  emory associated
1d530 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61   with the databa
1d540 73 65 20 66 69 6c 65 20 66 64 2e 20 53 68 61 72  se file fd. Shar
1d550 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed-memory region
1d560 73 0a 2a 2a 20 61 72 65 20 6e 75 6d 62 65 72 65  s.** are numbere
1d570 64 20 73 74 61 72 74 69 6e 67 20 66 72 6f 6d 20  d starting from 
1d580 7a 65 72 6f 2e 20 45 61 63 68 20 73 68 61 72 65  zero. Each share
1d590 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20  d-memory region 
1d5a0 69 73 20 73 7a 52 65 67 69 6f 6e 0a 2a 2a 20 62  is szRegion.** b
1d5b0 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a  ytes in size..**
1d5c0 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
1d5d0 6f 63 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72  occurs, an error
1d5e0 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
1d5f0 64 20 61 6e 64 20 2a 70 70 20 69 73 20 73 65 74  d and *pp is set
1d600 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20   to NULL..**.** 
1d610 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68  Otherwise, if th
1d620 65 20 69 73 57 72 69 74 65 20 70 61 72 61 6d 65  e isWrite parame
1d630 74 65 72 20 69 73 20 30 20 61 6e 64 20 74 68 65  ter is 0 and the
1d640 20 72 65 71 75 65 73 74 65 64 20 73 68 61 72 65   requested share
1d650 64 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 72 65 67 69  d-memory.** regi
1d660 6f 6e 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  on has not been 
1d670 61 6c 6c 6f 63 61 74 65 64 20 28 62 79 20 61 6e  allocated (by an
1d680 79 20 63 6c 69 65 6e 74 2c 20 69 6e 63 6c 75 64  y client, includ
1d690 69 6e 67 20 6f 6e 65 20 72 75 6e 6e 69 6e 67 20  ing one running 
1d6a0 69 6e 20 61 0a 2a 2a 20 73 65 70 61 72 61 74 65  in a.** separate
1d6b0 20 70 72 6f 63 65 73 73 29 2c 20 74 68 65 6e 20   process), then 
1d6c0 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20 4e 55  *pp is set to NU
1d6d0 4c 4c 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b  LL and SQLITE_OK
1d6e0 20 72 65 74 75 72 6e 65 64 2e 20 49 66 0a 2a 2a   returned. If.**
1d6f0 20 69 73 57 72 69 74 65 20 69 73 20 6e 6f 6e 2d   isWrite is non-
1d700 7a 65 72 6f 20 61 6e 64 20 74 68 65 20 72 65 71  zero and the req
1d710 75 65 73 74 65 64 20 73 68 61 72 65 64 2d 6d 65  uested shared-me
1d720 6d 6f 72 79 20 72 65 67 69 6f 6e 20 68 61 73 20  mory region has 
1d730 6e 6f 74 20 79 65 74 0a 2a 2a 20 62 65 65 6e 20  not yet.** been 
1d740 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20 69 73  allocated, it is
1d750 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68   allocated by th
1d760 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  is function..**.
1d770 2a 2a 20 49 66 20 74 68 65 20 73 68 61 72 65 64  ** If the shared
1d780 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 68  -memory region h
1d790 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
1d7a0 61 6c 6c 6f 63 61 74 65 64 20 6f 72 20 69 73 20  allocated or is 
1d7b0 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20  allocated by.** 
1d7c0 74 68 69 73 20 63 61 6c 6c 20 61 73 20 64 65 73  this call as des
1d7d0 63 72 69 62 65 64 20 61 62 6f 76 65 2c 20 74 68  cribed above, th
1d7e0 65 6e 20 69 74 20 69 73 20 6d 61 70 70 65 64 20  en it is mapped 
1d7f0 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73  into this proces
1d800 73 65 73 0a 2a 2a 20 61 64 64 72 65 73 73 20 73  ses.** address s
1d810 70 61 63 65 20 28 69 66 20 69 74 20 69 73 20 6e  pace (if it is n
1d820 6f 74 20 61 6c 72 65 61 64 79 29 2c 20 2a 70 70  ot already), *pp
1d830 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74   is set to point
1d840 20 74 6f 20 74 68 65 20 6d 61 70 70 65 64 0a 2a   to the mapped.*
1d850 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20 53 51 4c  * memory and SQL
1d860 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
1d870 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
1d880 69 6e 53 68 6d 4d 61 70 28 0a 20 20 73 71 6c 69  inShmMap(.  sqli
1d890 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20  te3_file *fd,   
1d8a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
1d8b0 61 6e 64 6c 65 20 6f 70 65 6e 20 6f 6e 20 64 61  andle open on da
1d8c0 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
1d8d0 20 69 6e 74 20 69 52 65 67 69 6f 6e 2c 20 20 20   int iRegion,   
1d8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d8f0 20 2f 2a 20 52 65 67 69 6f 6e 20 74 6f 20 72 65   /* Region to re
1d900 74 72 69 65 76 65 20 2a 2f 0a 20 20 69 6e 74 20  trieve */.  int 
1d910 73 7a 52 65 67 69 6f 6e 2c 20 20 20 20 20 20 20  szRegion,       
1d920 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1d930 69 7a 65 20 6f 66 20 72 65 67 69 6f 6e 73 20 2a  ize of regions *
1d940 2f 0a 20 20 69 6e 74 20 69 73 57 72 69 74 65 2c  /.  int isWrite,
1d950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d960 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65      /* True to e
1d970 78 74 65 6e 64 20 66 69 6c 65 20 69 66 20 6e 65  xtend file if ne
1d980 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 76 6f 69  cessary */.  voi
1d990 64 20 76 6f 6c 61 74 69 6c 65 20 2a 2a 70 70 20  d volatile **pp 
1d9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d9b0 4f 55 54 3a 20 4d 61 70 70 65 64 20 6d 65 6d 6f  OUT: Mapped memo
1d9c0 72 79 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46 69  ry */.){.  winFi
1d9d0 6c 65 20 2a 70 44 62 46 64 20 3d 20 28 77 69 6e  le *pDbFd = (win
1d9e0 46 69 6c 65 2a 29 66 64 3b 0a 20 20 77 69 6e 53  File*)fd;.  winS
1d9f0 68 6d 20 2a 70 20 3d 20 70 44 62 46 64 2d 3e 70  hm *p = pDbFd->p
1da00 53 68 6d 3b 0a 20 20 77 69 6e 53 68 6d 4e 6f 64  Shm;.  winShmNod
1da10 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69  e *pShmNode;.  i
1da20 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1da30 4b 3b 0a 0a 20 20 69 66 28 20 21 70 20 29 7b 0a  K;..  if( !p ){.
1da40 20 20 20 20 72 63 20 3d 20 77 69 6e 4f 70 65 6e      rc = winOpen
1da50 53 68 61 72 65 64 4d 65 6d 6f 72 79 28 70 44 62  SharedMemory(pDb
1da60 46 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  Fd);.    if( rc!
1da70 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
1da80 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 20 3d 20  urn rc;.    p = 
1da90 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 7d  pDbFd->pShm;.  }
1daa0 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d  .  pShmNode = p-
1dab0 3e 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20 73 71  >pShmNode;..  sq
1dac0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
1dad0 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  r(pShmNode->mute
1dae0 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a  x);.  assert( sz
1daf0 52 65 67 69 6f 6e 3d 3d 70 53 68 6d 4e 6f 64 65  Region==pShmNode
1db00 2d 3e 73 7a 52 65 67 69 6f 6e 20 7c 7c 20 70 53  ->szRegion || pS
1db10 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3d  hmNode->nRegion=
1db20 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 53 68  =0 );..  if( pSh
1db30 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d  mNode->nRegion<=
1db40 69 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 73  iRegion ){.    s
1db50 74 72 75 63 74 20 53 68 6d 52 65 67 69 6f 6e 20  truct ShmRegion 
1db60 2a 61 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20  *apNew;         
1db70 20 20 2f 2a 20 4e 65 77 20 61 52 65 67 69 6f 6e    /* New aRegion
1db80 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20  [] array */.    
1db90 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 69 52 65  int nByte = (iRe
1dba0 67 69 6f 6e 2b 31 29 2a 73 7a 52 65 67 69 6f 6e  gion+1)*szRegion
1dbb0 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 72 65  ;  /* Minimum re
1dbc0 71 75 69 72 65 64 20 66 69 6c 65 20 73 69 7a 65  quired file size
1dbd0 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   */.    sqlite3_
1dbe0 69 6e 74 36 34 20 73 7a 3b 20 20 20 20 20 20 20  int64 sz;       
1dbf0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
1dc00 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 77 61  rrent size of wa
1dc10 6c 2d 69 6e 64 65 78 20 66 69 6c 65 20 2a 2f 0a  l-index file */.
1dc20 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73  .    pShmNode->s
1dc30 7a 52 65 67 69 6f 6e 20 3d 20 73 7a 52 65 67 69  zRegion = szRegi
1dc40 6f 6e 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20  on;..    /* The 
1dc50 72 65 71 75 65 73 74 65 64 20 72 65 67 69 6f 6e  requested region
1dc60 20 69 73 20 6e 6f 74 20 6d 61 70 70 65 64 20 69   is not mapped i
1dc70 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73  nto this process
1dc80 65 73 20 61 64 64 72 65 73 73 20 73 70 61 63 65  es address space
1dc90 2e 0a 20 20 20 20 2a 2a 20 43 68 65 63 6b 20 74  ..    ** Check t
1dca0 6f 20 73 65 65 20 69 66 20 69 74 20 68 61 73 20  o see if it has 
1dcb0 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 28  been allocated (
1dcc0 69 2e 65 2e 20 69 66 20 74 68 65 20 77 61 6c 2d  i.e. if the wal-
1dcd0 69 6e 64 65 78 20 66 69 6c 65 20 69 73 0a 20 20  index file is.  
1dce0 20 20 2a 2a 20 6c 61 72 67 65 20 65 6e 6f 75 67    ** large enoug
1dcf0 68 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65  h to contain the
1dd00 20 72 65 71 75 65 73 74 65 64 20 72 65 67 69 6f   requested regio
1dd10 6e 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  n)..    */.    r
1dd20 63 20 3d 20 77 69 6e 46 69 6c 65 53 69 7a 65 28  c = winFileSize(
1dd30 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29  (sqlite3_file *)
1dd40 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65  &pShmNode->hFile
1dd50 2c 20 26 73 7a 29 3b 0a 20 20 20 20 69 66 28 20  , &sz);.    if( 
1dd60 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1dd70 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c  .      rc = winL
1dd80 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
1dd90 4f 45 52 52 5f 53 48 4d 53 49 5a 45 2c 20 6f 73  OERR_SHMSIZE, os
1dda0 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a  GetLastError(),.
1ddb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ddc0 20 20 20 20 20 20 20 22 77 69 6e 53 68 6d 4d 61         "winShmMa
1ddd0 70 31 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74  p1", pDbFd->zPat
1dde0 68 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73  h);.      goto s
1ddf0 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  hmpage_out;.    
1de00 7d 0a 0a 20 20 20 20 69 66 28 20 73 7a 3c 6e 42  }..    if( sz<nB
1de10 79 74 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  yte ){.      /* 
1de20 54 68 65 20 72 65 71 75 65 73 74 65 64 20 6d 65  The requested me
1de30 6d 6f 72 79 20 72 65 67 69 6f 6e 20 64 6f 65 73  mory region does
1de40 20 6e 6f 74 20 65 78 69 73 74 2e 20 49 66 20 69   not exist. If i
1de50 73 57 72 69 74 65 20 69 73 20 73 65 74 20 74 6f  sWrite is set to
1de60 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 2c 20  .      ** zero, 
1de70 65 78 69 74 20 65 61 72 6c 79 2e 20 2a 70 70 20  exit early. *pp 
1de80 77 69 6c 6c 20 62 65 20 73 65 74 20 74 6f 20 4e  will be set to N
1de90 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  ULL and SQLITE_O
1dea0 4b 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 20 20  K returned..    
1deb0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 41 6c    **.      ** Al
1dec0 74 65 72 6e 61 74 69 76 65 6c 79 2c 20 69 66 20  ternatively, if 
1ded0 69 73 57 72 69 74 65 20 69 73 20 6e 6f 6e 2d 7a  isWrite is non-z
1dee0 65 72 6f 2c 20 75 73 65 20 66 74 72 75 6e 63 61  ero, use ftrunca
1def0 74 65 28 29 20 74 6f 20 61 6c 6c 6f 63 61 74 65  te() to allocate
1df00 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 72 65  .      ** the re
1df10 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72  quested memory r
1df20 65 67 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a  egion..      */.
1df30 20 20 20 20 20 20 69 66 28 20 21 69 73 57 72 69        if( !isWri
1df40 74 65 20 29 20 67 6f 74 6f 20 73 68 6d 70 61 67  te ) goto shmpag
1df50 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 72 63 20  e_out;.      rc 
1df60 3d 20 77 69 6e 54 72 75 6e 63 61 74 65 28 28 73  = winTruncate((s
1df70 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 26 70  qlite3_file *)&p
1df80 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c 20  ShmNode->hFile, 
1df90 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 69 66  nByte);.      if
1dfa0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1dfb0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1dfc0 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
1dfd0 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45  TE_IOERR_SHMSIZE
1dfe0 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  , osGetLastError
1dff0 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  (),.            
1e000 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
1e010 6e 53 68 6d 4d 61 70 32 22 2c 20 70 44 62 46 64  nShmMap2", pDbFd
1e020 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20  ->zPath);.      
1e030 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f    goto shmpage_o
1e040 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ut;.      }.    
1e050 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 70 20 74 68  }..    /* Map th
1e060 65 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f  e requested memo
1e070 72 79 20 72 65 67 69 6f 6e 20 69 6e 74 6f 20 74  ry region into t
1e080 68 69 73 20 70 72 6f 63 65 73 73 65 73 20 61 64  his processes ad
1e090 64 72 65 73 73 20 73 70 61 63 65 2e 20 2a 2f 0a  dress space. */.
1e0a0 20 20 20 20 61 70 4e 65 77 20 3d 20 28 73 74 72      apNew = (str
1e0b0 75 63 74 20 53 68 6d 52 65 67 69 6f 6e 20 2a 29  uct ShmRegion *)
1e0c0 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28  sqlite3_realloc(
1e0d0 0a 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64  .        pShmNod
1e0e0 65 2d 3e 61 52 65 67 69 6f 6e 2c 20 28 69 52 65  e->aRegion, (iRe
1e0f0 67 69 6f 6e 2b 31 29 2a 73 69 7a 65 6f 66 28 61  gion+1)*sizeof(a
1e100 70 4e 65 77 5b 30 5d 29 0a 20 20 20 20 29 3b 0a  pNew[0]).    );.
1e110 20 20 20 20 69 66 28 20 21 61 70 4e 65 77 20 29      if( !apNew )
1e120 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
1e130 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b  ITE_IOERR_NOMEM;
1e140 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70  .      goto shmp
1e150 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  age_out;.    }. 
1e160 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65     pShmNode->aRe
1e170 67 69 6f 6e 20 3d 20 61 70 4e 65 77 3b 0a 0a 20  gion = apNew;.. 
1e180 20 20 20 77 68 69 6c 65 28 20 70 53 68 6d 4e 6f     while( pShmNo
1e190 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d 69 52 65  de->nRegion<=iRe
1e1a0 67 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 48 41  gion ){.      HA
1e1b0 4e 44 4c 45 20 68 4d 61 70 20 3d 20 4e 55 4c 4c  NDLE hMap = NULL
1e1c0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 66 69 6c  ;         /* fil
1e1d0 65 2d 6d 61 70 70 69 6e 67 20 68 61 6e 64 6c 65  e-mapping handle
1e1e0 20 2a 2f 0a 20 20 20 20 20 20 76 6f 69 64 20 2a   */.      void *
1e1f0 70 4d 61 70 20 3d 20 30 3b 20 20 20 20 20 20 20  pMap = 0;       
1e200 20 20 20 20 20 20 2f 2a 20 4d 61 70 70 65 64 20        /* Mapped 
1e210 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 2a 2f  memory region */
1e220 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
1e230 57 49 4e 52 54 0a 20 20 20 20 20 20 68 4d 61 70  WINRT.      hMap
1e240 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d   = osCreateFileM
1e250 61 70 70 69 6e 67 46 72 6f 6d 41 70 70 28 70 53  appingFromApp(pS
1e260 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2e 68 2c  hmNode->hFile.h,
1e270 0a 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c  .          NULL,
1e280 20 50 41 47 45 5f 52 45 41 44 57 52 49 54 45 2c   PAGE_READWRITE,
1e290 20 6e 42 79 74 65 2c 20 4e 55 4c 4c 0a 20 20 20   nByte, NULL.   
1e2a0 20 20 20 29 3b 0a 23 65 6c 69 66 20 64 65 66 69     );.#elif defi
1e2b0 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
1e2c0 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 20 20 20  _HAS_WIDE).     
1e2d0 20 68 4d 61 70 20 3d 20 6f 73 43 72 65 61 74 65   hMap = osCreate
1e2e0 46 69 6c 65 4d 61 70 70 69 6e 67 57 28 70 53 68  FileMappingW(pSh
1e2f0 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2e 68 2c 0a  mNode->hFile.h,.
1e300 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 20            NULL, 
1e310 50 41 47 45 5f 52 45 41 44 57 52 49 54 45 2c 20  PAGE_READWRITE, 
1e320 30 2c 20 6e 42 79 74 65 2c 20 4e 55 4c 4c 0a 20  0, nByte, NULL. 
1e330 20 20 20 20 20 29 3b 0a 23 65 6c 69 66 20 64 65       );.#elif de
1e340 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
1e350 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 20  32_HAS_ANSI).   
1e360 20 20 20 68 4d 61 70 20 3d 20 6f 73 43 72 65 61     hMap = osCrea
1e370 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 41 28 70  teFileMappingA(p
1e380 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2e 68  ShmNode->hFile.h
1e390 2c 0a 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c  ,.          NULL
1e3a0 2c 20 50 41 47 45 5f 52 45 41 44 57 52 49 54 45  , PAGE_READWRITE
1e3b0 2c 20 30 2c 20 6e 42 79 74 65 2c 20 4e 55 4c 4c  , 0, nByte, NULL
1e3c0 0a 20 20 20 20 20 20 29 3b 0a 23 65 6e 64 69 66  .      );.#endif
1e3d0 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
1e3e0 22 53 48 4d 2d 4d 41 50 2d 43 52 45 41 54 45 20  "SHM-MAP-CREATE 
1e3f0 70 69 64 3d 25 6c 75 2c 20 72 65 67 69 6f 6e 3d  pid=%lu, region=
1e400 25 64 2c 20 73 69 7a 65 3d 25 64 2c 20 72 63 3d  %d, size=%d, rc=
1e410 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
1e420 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65        osGetCurre
1e430 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70  ntProcessId(), p
1e440 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
1e450 2c 20 6e 42 79 74 65 2c 0a 20 20 20 20 20 20 20  , nByte,.       
1e460 20 20 20 20 20 20 20 20 68 4d 61 70 20 3f 20 22          hMap ? "
1e470 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29  ok" : "failed"))
1e480 3b 0a 20 20 20 20 20 20 69 66 28 20 68 4d 61 70  ;.      if( hMap
1e490 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
1e4a0 69 4f 66 66 73 65 74 20 3d 20 70 53 68 6d 4e 6f  iOffset = pShmNo
1e4b0 64 65 2d 3e 6e 52 65 67 69 6f 6e 2a 73 7a 52 65  de->nRegion*szRe
1e4c0 67 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20 69 6e  gion;.        in
1e4d0 74 20 69 4f 66 66 73 65 74 53 68 69 66 74 20 3d  t iOffsetShift =
1e4e0 20 69 4f 66 66 73 65 74 20 25 20 77 69 6e 53 79   iOffset % winSy
1e4f0 73 49 6e 66 6f 2e 64 77 41 6c 6c 6f 63 61 74 69  sInfo.dwAllocati
1e500 6f 6e 47 72 61 6e 75 6c 61 72 69 74 79 3b 0a 23  onGranularity;.#
1e510 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
1e520 52 54 0a 20 20 20 20 20 20 20 20 70 4d 61 70 20  RT.        pMap 
1e530 3d 20 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 6c  = osMapViewOfFil
1e540 65 46 72 6f 6d 41 70 70 28 68 4d 61 70 2c 20 46  eFromApp(hMap, F
1e550 49 4c 45 5f 4d 41 50 5f 57 52 49 54 45 20 7c 20  ILE_MAP_WRITE | 
1e560 46 49 4c 45 5f 4d 41 50 5f 52 45 41 44 2c 0a 20  FILE_MAP_READ,. 
1e570 20 20 20 20 20 20 20 20 20 20 20 69 4f 66 66 73             iOffs
1e580 65 74 20 2d 20 69 4f 66 66 73 65 74 53 68 69 66  et - iOffsetShif
1e590 74 2c 20 73 7a 52 65 67 69 6f 6e 20 2b 20 69 4f  t, szRegion + iO
1e5a0 66 66 73 65 74 53 68 69 66 74 0a 20 20 20 20 20  ffsetShift.     
1e5b0 20 20 20 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20     );.#else.    
1e5c0 20 20 20 20 70 4d 61 70 20 3d 20 6f 73 4d 61 70      pMap = osMap
1e5d0 56 69 65 77 4f 66 46 69 6c 65 28 68 4d 61 70 2c  ViewOfFile(hMap,
1e5e0 20 46 49 4c 45 5f 4d 41 50 5f 57 52 49 54 45 20   FILE_MAP_WRITE 
1e5f0 7c 20 46 49 4c 45 5f 4d 41 50 5f 52 45 41 44 2c  | FILE_MAP_READ,
1e600 0a 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20  .            0, 
1e610 69 4f 66 66 73 65 74 20 2d 20 69 4f 66 66 73 65  iOffset - iOffse
1e620 74 53 68 69 66 74 2c 20 73 7a 52 65 67 69 6f 6e  tShift, szRegion
1e630 20 2b 20 69 4f 66 66 73 65 74 53 68 69 66 74 0a   + iOffsetShift.
1e640 20 20 20 20 20 20 20 20 29 3b 0a 23 65 6e 64 69          );.#endi
1e650 66 0a 20 20 20 20 20 20 20 20 4f 53 54 52 41 43  f.        OSTRAC
1e660 45 28 28 22 53 48 4d 2d 4d 41 50 2d 4d 41 50 20  E(("SHM-MAP-MAP 
1e670 70 69 64 3d 25 6c 75 2c 20 72 65 67 69 6f 6e 3d  pid=%lu, region=
1e680 25 64 2c 20 6f 66 66 73 65 74 3d 25 64 2c 20 73  %d, offset=%d, s
1e690 69 7a 65 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22  ize=%d, rc=%s\n"
1e6a0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1e6b0 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50     osGetCurrentP
1e6c0 72 6f 63 65 73 73 49 64 28 29 2c 20 70 53 68 6d  rocessId(), pShm
1e6d0 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2c 20 69  Node->nRegion, i
1e6e0 4f 66 66 73 65 74 2c 0a 20 20 20 20 20 20 20 20  Offset,.        
1e6f0 20 20 20 20 20 20 20 20 20 73 7a 52 65 67 69 6f           szRegio
1e700 6e 2c 20 70 4d 61 70 20 3f 20 22 6f 6b 22 20 3a  n, pMap ? "ok" :
1e710 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20   "failed"));.   
1e720 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21     }.      if( !
1e730 70 4d 61 70 20 29 7b 0a 20 20 20 20 20 20 20 20  pMap ){.        
1e740 70 53 68 6d 4e 6f 64 65 2d 3e 6c 61 73 74 45 72  pShmNode->lastEr
1e750 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
1e760 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 20 20  rror();.        
1e770 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72  rc = winLogError
1e780 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  (SQLITE_IOERR_SH
1e790 4d 4d 41 50 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e  MMAP, pShmNode->
1e7a0 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  lastErrno,.     
1e7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e7c0 20 20 20 20 22 77 69 6e 53 68 6d 4d 61 70 33 22      "winShmMap3"
1e7d0 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b  , pDbFd->zPath);
1e7e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 68 4d 61  .        if( hMa
1e7f0 70 20 29 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c  p ) osCloseHandl
1e800 65 28 68 4d 61 70 29 3b 0a 20 20 20 20 20 20 20  e(hMap);.       
1e810 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75   goto shmpage_ou
1e820 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  t;.      }..    
1e830 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67    pShmNode->aReg
1e840 69 6f 6e 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  ion[pShmNode->nR
1e850 65 67 69 6f 6e 5d 2e 70 4d 61 70 20 3d 20 70 4d  egion].pMap = pM
1e860 61 70 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f  ap;.      pShmNo
1e870 64 65 2d 3e 61 52 65 67 69 6f 6e 5b 70 53 68 6d  de->aRegion[pShm
1e880 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 5d 2e 68  Node->nRegion].h
1e890 4d 61 70 20 3d 20 68 4d 61 70 3b 0a 20 20 20 20  Map = hMap;.    
1e8a0 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67    pShmNode->nReg
1e8b0 69 6f 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d  ion++;.    }.  }
1e8c0 0a 0a 73 68 6d 70 61 67 65 5f 6f 75 74 3a 0a 20  ..shmpage_out:. 
1e8d0 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e   if( pShmNode->n
1e8e0 52 65 67 69 6f 6e 3e 69 52 65 67 69 6f 6e 20 29  Region>iRegion )
1e8f0 7b 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 73 65  {.    int iOffse
1e900 74 20 3d 20 69 52 65 67 69 6f 6e 2a 73 7a 52 65  t = iRegion*szRe
1e910 67 69 6f 6e 3b 0a 20 20 20 20 69 6e 74 20 69 4f  gion;.    int iO
1e920 66 66 73 65 74 53 68 69 66 74 20 3d 20 69 4f 66  ffsetShift = iOf
1e930 66 73 65 74 20 25 20 77 69 6e 53 79 73 49 6e 66  fset % winSysInf
1e940 6f 2e 64 77 41 6c 6c 6f 63 61 74 69 6f 6e 47 72  o.dwAllocationGr
1e950 61 6e 75 6c 61 72 69 74 79 3b 0a 20 20 20 20 63  anularity;.    c
1e960 68 61 72 20 2a 70 20 3d 20 28 63 68 61 72 20 2a  har *p = (char *
1e970 29 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69  )pShmNode->aRegi
1e980 6f 6e 5b 69 52 65 67 69 6f 6e 5d 2e 70 4d 61 70  on[iRegion].pMap
1e990 3b 0a 20 20 20 20 2a 70 70 20 3d 20 28 76 6f 69  ;.    *pp = (voi
1e9a0 64 20 2a 29 26 70 5b 69 4f 66 66 73 65 74 53 68  d *)&p[iOffsetSh
1e9b0 69 66 74 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ift];.  }else{. 
1e9c0 20 20 20 2a 70 70 20 3d 20 30 3b 0a 20 20 7d 0a     *pp = 0;.  }.
1e9d0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1e9e0 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e  leave(pShmNode->
1e9f0 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
1ea00 20 72 63 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 20   rc;.}..#else.# 
1ea10 64 65 66 69 6e 65 20 77 69 6e 53 68 6d 4d 61 70  define winShmMap
1ea20 20 20 20 20 20 30 0a 23 20 64 65 66 69 6e 65 20       0.# define 
1ea30 77 69 6e 53 68 6d 4c 6f 63 6b 20 20 20 20 30 0a  winShmLock    0.
1ea40 23 20 64 65 66 69 6e 65 20 77 69 6e 53 68 6d 42  # define winShmB
1ea50 61 72 72 69 65 72 20 30 0a 23 20 64 65 66 69 6e  arrier 0.# defin
1ea60 65 20 77 69 6e 53 68 6d 55 6e 6d 61 70 20 20 20  e winShmUnmap   
1ea70 30 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e  0.#endif /* #ifn
1ea80 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1ea90 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6c  WAL */../*.** Cl
1eaa0 65 61 6e 73 20 75 70 20 74 68 65 20 6d 61 70 70  eans up the mapp
1eab0 65 64 20 72 65 67 69 6f 6e 20 6f 66 20 74 68 65  ed region of the
1eac0 20 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 2c   specified file,
1ead0 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a 23 69 66 20   if any..*/.#if 
1eae0 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
1eaf0 53 49 5a 45 3e 30 0a 73 74 61 74 69 63 20 69 6e  SIZE>0.static in
1eb00 74 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28 77  t winUnmapfile(w
1eb10 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a  inFile *pFile){.
1eb20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 21    assert( pFile!
1eb30 3d 30 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  =0 );.  OSTRACE(
1eb40 28 22 55 4e 4d 41 50 2d 46 49 4c 45 20 70 69 64  ("UNMAP-FILE pid
1eb50 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20  =%lu, pFile=%p, 
1eb60 68 4d 61 70 3d 25 70 2c 20 70 4d 61 70 52 65 67  hMap=%p, pMapReg
1eb70 69 6f 6e 3d 25 70 2c 20 22 0a 20 20 20 20 20 20  ion=%p, ".      
1eb80 20 20 20 20 20 22 6d 6d 61 70 53 69 7a 65 3d 25       "mmapSize=%
1eb90 6c 6c 64 2c 20 6d 6d 61 70 53 69 7a 65 41 63 74  lld, mmapSizeAct
1eba0 75 61 6c 3d 25 6c 6c 64 2c 20 6d 6d 61 70 53 69  ual=%lld, mmapSi
1ebb0 7a 65 4d 61 78 3d 25 6c 6c 64 5c 6e 22 2c 0a 20  zeMax=%lld\n",. 
1ebc0 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43            osGetC
1ebd0 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28  urrentProcessId(
1ebe0 29 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d  ), pFile, pFile-
1ebf0 3e 68 4d 61 70 2c 20 70 46 69 6c 65 2d 3e 70 4d  >hMap, pFile->pM
1ec00 61 70 52 65 67 69 6f 6e 2c 0a 20 20 20 20 20 20  apRegion,.      
1ec10 20 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70       pFile->mmap
1ec20 53 69 7a 65 2c 20 70 46 69 6c 65 2d 3e 6d 6d 61  Size, pFile->mma
1ec30 70 53 69 7a 65 41 63 74 75 61 6c 2c 20 70 46 69  pSizeActual, pFi
1ec40 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 29  le->mmapSizeMax)
1ec50 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  );.  if( pFile->
1ec60 70 4d 61 70 52 65 67 69 6f 6e 20 29 7b 0a 20 20  pMapRegion ){.  
1ec70 20 20 69 66 28 20 21 6f 73 55 6e 6d 61 70 56 69    if( !osUnmapVi
1ec80 65 77 4f 66 46 69 6c 65 28 70 46 69 6c 65 2d 3e  ewOfFile(pFile->
1ec90 70 4d 61 70 52 65 67 69 6f 6e 29 20 29 7b 0a 20  pMapRegion) ){. 
1eca0 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
1ecb0 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
1ecc0 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20  tError();.      
1ecd0 4f 53 54 52 41 43 45 28 28 22 55 4e 4d 41 50 2d  OSTRACE(("UNMAP-
1ece0 46 49 4c 45 20 70 69 64 3d 25 6c 75 2c 20 70 46  FILE pid=%lu, pF
1ecf0 69 6c 65 3d 25 70 2c 20 70 4d 61 70 52 65 67 69  ile=%p, pMapRegi
1ed00 6f 6e 3d 25 70 2c 20 22 0a 20 20 20 20 20 20 20  on=%p, ".       
1ed10 20 20 20 20 20 20 20 20 22 72 63 3d 53 51 4c 49          "rc=SQLI
1ed20 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 5c 6e 22  TE_IOERR_MMAP\n"
1ed30 2c 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72  , osGetCurrentPr
1ed40 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65  ocessId(), pFile
1ed50 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1ed60 20 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69   pFile->pMapRegi
1ed70 6f 6e 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75  on));.      retu
1ed80 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53  rn winLogError(S
1ed90 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50  QLITE_IOERR_MMAP
1eda0 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  , pFile->lastErr
1edb0 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
1edc0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
1edd0 6e 55 6e 6d 61 70 66 69 6c 65 31 22 2c 20 70 46  nUnmapfile1", pF
1ede0 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  ile->zPath);.   
1edf0 20 7d 0a 20 20 20 20 70 46 69 6c 65 2d 3e 70 4d   }.    pFile->pM
1ee00 61 70 52 65 67 69 6f 6e 20 3d 20 30 3b 0a 20 20  apRegion = 0;.  
1ee10 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a    pFile->mmapSiz
1ee20 65 20 3d 20 30 3b 0a 20 20 20 20 70 46 69 6c 65  e = 0;.    pFile
1ee30 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c  ->mmapSizeActual
1ee40 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 0;.  }.  if( 
1ee50 70 46 69 6c 65 2d 3e 68 4d 61 70 21 3d 4e 55 4c  pFile->hMap!=NUL
1ee60 4c 20 29 7b 0a 20 20 20 20 69 66 28 20 21 6f 73  L ){.    if( !os
1ee70 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c  CloseHandle(pFil
1ee80 65 2d 3e 68 4d 61 70 29 20 29 7b 0a 20 20 20 20  e->hMap) ){.    
1ee90 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
1eea0 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
1eeb0 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 4f 53 54  ror();.      OST
1eec0 52 41 43 45 28 28 22 55 4e 4d 41 50 2d 46 49 4c  RACE(("UNMAP-FIL
1eed0 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65  E pid=%lu, pFile
1eee0 3d 25 70 2c 20 68 4d 61 70 3d 25 70 2c 20 72 63  =%p, hMap=%p, rc
1eef0 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d  =SQLITE_IOERR_MM
1ef00 41 50 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  AP\n",.         
1ef10 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65        osGetCurre
1ef20 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70  ntProcessId(), p
1ef30 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 4d 61  File, pFile->hMa
1ef40 70 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  p));.      retur
1ef50 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  n winLogError(SQ
1ef60 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 2c  LITE_IOERR_MMAP,
1ef70 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
1ef80 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
1ef90 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
1efa0 55 6e 6d 61 70 66 69 6c 65 32 22 2c 20 70 46 69  Unmapfile2", pFi
1efb0 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20  le->zPath);.    
1efc0 7d 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68 4d 61  }.    pFile->hMa
1efd0 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 20 20  p = NULL;.  }.  
1efe0 4f 53 54 52 41 43 45 28 28 22 55 4e 4d 41 50 2d  OSTRACE(("UNMAP-
1eff0 46 49 4c 45 20 70 69 64 3d 25 6c 75 2c 20 70 46  FILE pid=%lu, pF
1f000 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  ile=%p, rc=SQLIT
1f010 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20  E_OK\n",.       
1f020 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74      osGetCurrent
1f030 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69  ProcessId(), pFi
1f040 6c 65 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  le));.  return S
1f050 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
1f060 2a 2a 20 4d 65 6d 6f 72 79 20 6d 61 70 20 6f 72  ** Memory map or
1f070 20 72 65 6d 61 70 20 74 68 65 20 66 69 6c 65 20   remap the file 
1f080 6f 70 65 6e 65 64 20 62 79 20 66 69 6c 65 2d 64  opened by file-d
1f090 65 73 63 72 69 70 74 6f 72 20 70 46 64 20 28 69  escriptor pFd (i
1f0a0 66 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 69 73  f the file.** is
1f0b0 20 61 6c 72 65 61 64 79 20 6d 61 70 70 65 64 2c   already mapped,
1f0c0 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 6d 61   the existing ma
1f0d0 70 70 69 6e 67 20 69 73 20 72 65 70 6c 61 63 65  pping is replace
1f0e0 64 20 62 79 20 74 68 65 20 6e 65 77 29 2e 20 4f  d by the new). O
1f0f0 72 2c 20 69 66 0a 2a 2a 20 74 68 65 72 65 20 61  r, if.** there a
1f100 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 61 20  lready exists a 
1f110 6d 61 70 70 69 6e 67 20 66 6f 72 20 74 68 69 73  mapping for this
1f120 20 66 69 6c 65 2c 20 61 6e 64 20 74 68 65 72 65   file, and there
1f130 20 61 72 65 20 73 74 69 6c 6c 0a 2a 2a 20 6f 75   are still.** ou
1f140 74 73 74 61 6e 64 69 6e 67 20 78 46 65 74 63 68  tstanding xFetch
1f150 28 29 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  () references to
1f160 20 69 74 2c 20 74 68 69 73 20 66 75 6e 63 74 69   it, this functi
1f170 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  on is a no-op..*
1f180 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65  *.** If paramete
1f190 72 20 6e 42 79 74 65 20 69 73 20 6e 6f 6e 2d 6e  r nByte is non-n
1f1a0 65 67 61 74 69 76 65 2c 20 74 68 65 6e 20 69 74  egative, then it
1f1b0 20 69 73 20 74 68 65 20 72 65 71 75 65 73 74 65   is the requeste
1f1c0 64 20 73 69 7a 65 20 6f 66 0a 2a 2a 20 74 68 65  d size of.** the
1f1d0 20 6d 61 70 70 69 6e 67 20 74 6f 20 63 72 65 61   mapping to crea
1f1e0 74 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  te. Otherwise, i
1f1f0 66 20 6e 42 79 74 65 20 69 73 20 6c 65 73 73 20  f nByte is less 
1f200 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20  than zero, then 
1f210 74 68 65 0a 2a 2a 20 72 65 71 75 65 73 74 65 64  the.** requested
1f220 20 73 69 7a 65 20 69 73 20 74 68 65 20 73 69 7a   size is the siz
1f230 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 6f 6e  e of the file on
1f240 20 64 69 73 6b 2e 20 54 68 65 20 61 63 74 75 61   disk. The actua
1f250 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a  l size of the.**
1f260 20 63 72 65 61 74 65 64 20 6d 61 70 70 69 6e 67   created mapping
1f270 20 69 73 20 65 69 74 68 65 72 20 74 68 65 20 72   is either the r
1f280 65 71 75 65 73 74 65 64 20 73 69 7a 65 20 6f 72  equested size or
1f290 20 74 68 65 20 76 61 6c 75 65 20 63 6f 6e 66 69   the value confi
1f2a0 67 75 72 65 64 0a 2a 2a 20 75 73 69 6e 67 20 53  gured.** using S
1f2b0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50  QLITE_FCNTL_MMAP
1f2c0 5f 53 49 5a 45 2c 20 77 68 69 63 68 65 76 65 72  _SIZE, whichever
1f2d0 20 69 73 20 73 6d 61 6c 6c 65 72 2e 0a 2a 2a 0a   is smaller..**.
1f2e0 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
1f2f0 72 65 74 75 72 6e 65 64 20 69 66 20 6e 6f 20 65  returned if no e
1f300 72 72 6f 72 20 6f 63 63 75 72 73 20 28 65 76 65  rror occurs (eve
1f310 6e 20 69 66 20 74 68 65 20 6d 61 70 70 69 6e 67  n if the mapping
1f320 20 69 73 20 6e 6f 74 0a 2a 2a 20 72 65 63 72 65   is not.** recre
1f330 61 74 65 64 20 61 73 20 61 20 72 65 73 75 6c 74  ated as a result
1f340 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   of outstanding 
1f350 72 65 66 65 72 65 6e 63 65 73 29 20 6f 72 20 61  references) or a
1f360 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 0a 2a  n SQLite error.*
1f370 2a 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65  * code otherwise
1f380 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1f390 77 69 6e 4d 61 70 66 69 6c 65 28 77 69 6e 46 69  winMapfile(winFi
1f3a0 6c 65 20 2a 70 46 64 2c 20 73 71 6c 69 74 65 33  le *pFd, sqlite3
1f3b0 5f 69 6e 74 36 34 20 6e 42 79 74 65 29 7b 0a 20  _int64 nByte){. 
1f3c0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e   sqlite3_int64 n
1f3d0 4d 61 70 20 3d 20 6e 42 79 74 65 3b 0a 20 20 69  Map = nByte;.  i
1f3e0 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
1f3f0 28 20 6e 4d 61 70 3e 3d 30 20 7c 7c 20 70 46 64  ( nMap>=0 || pFd
1f400 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30 20 29  ->nFetchOut==0 )
1f410 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4d 41  ;.  OSTRACE(("MA
1f420 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c 75 2c 20  P-FILE pid=%lu, 
1f430 70 46 69 6c 65 3d 25 70 2c 20 73 69 7a 65 3d 25  pFile=%p, size=%
1f440 6c 6c 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  lld\n",.        
1f450 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50     osGetCurrentP
1f460 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 64 2c  rocessId(), pFd,
1f470 20 6e 42 79 74 65 29 29 3b 0a 0a 20 20 69 66 28   nByte));..  if(
1f480 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3e   pFd->nFetchOut>
1f490 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
1f4a0 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 6e 4d 61  E_OK;..  if( nMa
1f4b0 70 3c 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  p<0 ){.    rc = 
1f4c0 77 69 6e 46 69 6c 65 53 69 7a 65 28 28 73 71 6c  winFileSize((sql
1f4d0 69 74 65 33 5f 66 69 6c 65 2a 29 70 46 64 2c 20  ite3_file*)pFd, 
1f4e0 26 6e 4d 61 70 29 3b 0a 20 20 20 20 69 66 28 20  &nMap);.    if( 
1f4f0 72 63 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52  rc ){.      OSTR
1f500 41 43 45 28 28 22 4d 41 50 2d 46 49 4c 45 20 70  ACE(("MAP-FILE p
1f510 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70  id=%lu, pFile=%p
1f520 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52  , rc=SQLITE_IOER
1f530 52 5f 46 53 54 41 54 5c 6e 22 2c 0a 20 20 20 20  R_FSTAT\n",.    
1f540 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74             osGet
1f550 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
1f560 28 29 2c 20 70 46 64 29 29 3b 0a 20 20 20 20 20  (), pFd));.     
1f570 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
1f580 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20 20 20 20  OERR_FSTAT;.    
1f590 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4d 61 70  }.  }.  if( nMap
1f5a0 3e 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61  >pFd->mmapSizeMa
1f5b0 78 20 29 7b 0a 20 20 20 20 6e 4d 61 70 20 3d 20  x ){.    nMap = 
1f5c0 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78  pFd->mmapSizeMax
1f5d0 3b 0a 20 20 7d 0a 20 20 6e 4d 61 70 20 26 3d 20  ;.  }.  nMap &= 
1f5e0 7e 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  ~(sqlite3_int64)
1f5f0 28 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77 50 61  (winSysInfo.dwPa
1f600 67 65 53 69 7a 65 20 2d 20 31 29 3b 0a 0a 20 20  geSize - 1);..  
1f610 69 66 28 20 6e 4d 61 70 3d 3d 30 20 26 26 20 70  if( nMap==0 && p
1f620 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 3e 30 20 29  Fd->mmapSize>0 )
1f630 7b 0a 20 20 20 20 77 69 6e 55 6e 6d 61 70 66 69  {.    winUnmapfi
1f640 6c 65 28 70 46 64 29 3b 0a 20 20 7d 0a 20 20 69  le(pFd);.  }.  i
1f650 66 28 20 6e 4d 61 70 21 3d 70 46 64 2d 3e 6d 6d  f( nMap!=pFd->mm
1f660 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 76 6f  apSize ){.    vo
1f670 69 64 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20  id *pNew = 0;.  
1f680 20 20 44 57 4f 52 44 20 70 72 6f 74 65 63 74 20    DWORD protect 
1f690 3d 20 50 41 47 45 5f 52 45 41 44 4f 4e 4c 59 3b  = PAGE_READONLY;
1f6a0 0a 20 20 20 20 44 57 4f 52 44 20 66 6c 61 67 73  .    DWORD flags
1f6b0 20 3d 20 46 49 4c 45 5f 4d 41 50 5f 52 45 41 44   = FILE_MAP_READ
1f6c0 3b 0a 0a 20 20 20 20 77 69 6e 55 6e 6d 61 70 66  ;..    winUnmapf
1f6d0 69 6c 65 28 70 46 64 29 3b 0a 20 20 20 20 69 66  ile(pFd);.    if
1f6e0 28 20 28 70 46 64 2d 3e 63 74 72 6c 46 6c 61 67  ( (pFd->ctrlFlag
1f6f0 73 20 26 20 57 49 4e 46 49 4c 45 5f 52 44 4f 4e  s & WINFILE_RDON
1f700 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  LY)==0 ){.      
1f710 70 72 6f 74 65 63 74 20 3d 20 50 41 47 45 5f 52  protect = PAGE_R
1f720 45 41 44 57 52 49 54 45 3b 0a 20 20 20 20 20 20  EADWRITE;.      
1f730 66 6c 61 67 73 20 7c 3d 20 46 49 4c 45 5f 4d 41  flags |= FILE_MA
1f740 50 5f 57 52 49 54 45 3b 0a 20 20 20 20 7d 0a 23  P_WRITE;.    }.#
1f750 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
1f760 52 54 0a 20 20 20 20 70 46 64 2d 3e 68 4d 61 70  RT.    pFd->hMap
1f770 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d   = osCreateFileM
1f780 61 70 70 69 6e 67 46 72 6f 6d 41 70 70 28 70 46  appingFromApp(pF
1f790 64 2d 3e 68 2c 20 4e 55 4c 4c 2c 20 70 72 6f 74  d->h, NULL, prot
1f7a0 65 63 74 2c 20 6e 4d 61 70 2c 20 4e 55 4c 4c 29  ect, nMap, NULL)
1f7b0 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28  ;.#elif defined(
1f7c0 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
1f7d0 5f 57 49 44 45 29 0a 20 20 20 20 70 46 64 2d 3e  _WIDE).    pFd->
1f7e0 68 4d 61 70 20 3d 20 6f 73 43 72 65 61 74 65 46  hMap = osCreateF
1f7f0 69 6c 65 4d 61 70 70 69 6e 67 57 28 70 46 64 2d  ileMappingW(pFd-
1f800 3e 68 2c 20 4e 55 4c 4c 2c 20 70 72 6f 74 65 63  >h, NULL, protec
1f810 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
1f820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f830 20 20 20 28 44 57 4f 52 44 29 28 28 6e 4d 61 70     (DWORD)((nMap
1f840 3e 3e 33 32 29 20 26 20 30 78 66 66 66 66 66 66  >>32) & 0xffffff
1f850 66 66 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ff),.           
1f860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f870 20 20 20 20 20 28 44 57 4f 52 44 29 28 6e 4d 61       (DWORD)(nMa
1f880 70 20 26 20 30 78 66 66 66 66 66 66 66 66 29 2c  p & 0xffffffff),
1f890 20 4e 55 4c 4c 29 3b 0a 23 65 6c 69 66 20 64 65   NULL);.#elif de
1f8a0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
1f8b0 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 20  32_HAS_ANSI).   
1f8c0 20 70 46 64 2d 3e 68 4d 61 70 20 3d 20 6f 73 43   pFd->hMap = osC
1f8d0 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67  reateFileMapping
1f8e0 41 28 70 46 64 2d 3e 68 2c 20 4e 55 4c 4c 2c 20  A(pFd->h, NULL, 
1f8f0 70 72 6f 74 65 63 74 2c 0a 20 20 20 20 20 20 20  protect,.       
1f900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f910 20 20 20 20 20 20 20 20 20 28 44 57 4f 52 44 29           (DWORD)
1f920 28 28 6e 4d 61 70 3e 3e 33 32 29 20 26 20 30 78  ((nMap>>32) & 0x
1f930 66 66 66 66 66 66 66 66 29 2c 0a 20 20 20 20 20  ffffffff),.     
1f940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f950 20 20 20 20 20 20 20 20 20 20 20 28 44 57 4f 52             (DWOR
1f960 44 29 28 6e 4d 61 70 20 26 20 30 78 66 66 66 66  D)(nMap & 0xffff
1f970 66 66 66 66 29 2c 20 4e 55 4c 4c 29 3b 0a 23 65  ffff), NULL);.#e
1f980 6e 64 69 66 0a 20 20 20 20 69 66 28 20 70 46 64  ndif.    if( pFd
1f990 2d 3e 68 4d 61 70 3d 3d 4e 55 4c 4c 20 29 7b 0a  ->hMap==NULL ){.
1f9a0 20 20 20 20 20 20 70 46 64 2d 3e 6c 61 73 74 45        pFd->lastE
1f9b0 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
1f9c0 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 72  Error();.      r
1f9d0 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  c = winLogError(
1f9e0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41  SQLITE_IOERR_MMA
1f9f0 50 2c 20 70 46 64 2d 3e 6c 61 73 74 45 72 72 6e  P, pFd->lastErrn
1fa00 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
1fa10 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 4d 61            "winMa
1fa20 70 66 69 6c 65 31 22 2c 20 70 46 64 2d 3e 7a 50  pfile1", pFd->zP
1fa30 61 74 68 29 3b 0a 20 20 20 20 20 20 2f 2a 20 4c  ath);.      /* L
1fa40 6f 67 20 74 68 65 20 65 72 72 6f 72 2c 20 62 75  og the error, bu
1fa50 74 20 63 6f 6e 74 69 6e 75 65 20 6e 6f 72 6d 61  t continue norma
1fa60 6c 20 6f 70 65 72 61 74 69 6f 6e 20 75 73 69 6e  l operation usin
1fa70 67 20 78 52 65 61 64 2f 78 57 72 69 74 65 20 2a  g xRead/xWrite *
1fa80 2f 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  /.      OSTRACE(
1fa90 28 22 4d 41 50 2d 46 49 4c 45 2d 43 52 45 41 54  ("MAP-FILE-CREAT
1faa0 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65  E pid=%lu, pFile
1fab0 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20  =%p, rc=%s\n",. 
1fac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73                os
1fad0 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
1fae0 73 49 64 28 29 2c 20 70 46 64 2c 20 73 71 6c 69  sId(), pFd, sqli
1faf0 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29  te3ErrName(rc)))
1fb00 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
1fb10 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
1fb20 20 20 20 20 61 73 73 65 72 74 28 20 28 6e 4d 61      assert( (nMa
1fb30 70 20 25 20 77 69 6e 53 79 73 49 6e 66 6f 2e 64  p % winSysInfo.d
1fb40 77 50 61 67 65 53 69 7a 65 29 3d 3d 30 20 29 3b  wPageSize)==0 );
1fb50 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
1fb60 65 6f 66 28 53 49 5a 45 5f 54 29 3d 3d 73 69 7a  eof(SIZE_T)==siz
1fb70 65 6f 66 28 73 71 6c 69 74 65 33 5f 69 6e 74 36  eof(sqlite3_int6
1fb80 34 29 20 7c 7c 20 6e 4d 61 70 3c 3d 30 78 66 66  4) || nMap<=0xff
1fb90 66 66 66 66 66 66 20 29 3b 0a 23 69 66 20 53 51  ffffff );.#if SQ
1fba0 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
1fbb0 20 20 70 4e 65 77 20 3d 20 6f 73 4d 61 70 56 69    pNew = osMapVi
1fbc0 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 28  ewOfFileFromApp(
1fbd0 70 46 64 2d 3e 68 4d 61 70 2c 20 66 6c 61 67 73  pFd->hMap, flags
1fbe0 2c 20 30 2c 20 28 53 49 5a 45 5f 54 29 6e 4d 61  , 0, (SIZE_T)nMa
1fbf0 70 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 70 4e  p);.#else.    pN
1fc00 65 77 20 3d 20 6f 73 4d 61 70 56 69 65 77 4f 66  ew = osMapViewOf
1fc10 46 69 6c 65 28 70 46 64 2d 3e 68 4d 61 70 2c 20  File(pFd->hMap, 
1fc20 66 6c 61 67 73 2c 20 30 2c 20 30 2c 20 28 53 49  flags, 0, 0, (SI
1fc30 5a 45 5f 54 29 6e 4d 61 70 29 3b 0a 23 65 6e 64  ZE_T)nMap);.#end
1fc40 69 66 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d  if.    if( pNew=
1fc50 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 6f  =NULL ){.      o
1fc60 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 64  sCloseHandle(pFd
1fc70 2d 3e 68 4d 61 70 29 3b 0a 20 20 20 20 20 20 70  ->hMap);.      p
1fc80 46 64 2d 3e 68 4d 61 70 20 3d 20 4e 55 4c 4c 3b  Fd->hMap = NULL;
1fc90 0a 20 20 20 20 20 20 70 46 64 2d 3e 6c 61 73 74  .      pFd->last
1fca0 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
1fcb0 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20  tError();.      
1fcc0 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72  rc = winLogError
1fcd0 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d  (SQLITE_IOERR_MM
1fce0 41 50 2c 20 70 46 64 2d 3e 6c 61 73 74 45 72 72  AP, pFd->lastErr
1fcf0 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
1fd00 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 4d             "winM
1fd10 61 70 66 69 6c 65 32 22 2c 20 70 46 64 2d 3e 7a  apfile2", pFd->z
1fd20 50 61 74 68 29 3b 0a 20 20 20 20 20 20 2f 2a 20  Path);.      /* 
1fd30 4c 6f 67 20 74 68 65 20 65 72 72 6f 72 2c 20 62  Log the error, b
1fd40 75 74 20 63 6f 6e 74 69 6e 75 65 20 6e 6f 72 6d  ut continue norm
1fd50 61 6c 20 6f 70 65 72 61 74 69 6f 6e 20 75 73 69  al operation usi
1fd60 6e 67 20 78 52 65 61 64 2f 78 57 72 69 74 65 20  ng xRead/xWrite 
1fd70 2a 2f 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  */.      OSTRACE
1fd80 28 28 22 4d 41 50 2d 46 49 4c 45 2d 4d 41 50 20  (("MAP-FILE-MAP 
1fd90 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25  pid=%lu, pFile=%
1fda0 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20  p, rc=%s\n",.   
1fdb0 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65              osGe
1fdc0 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
1fdd0 64 28 29 2c 20 70 46 64 2c 20 73 71 6c 69 74 65  d(), pFd, sqlite
1fde0 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a  3ErrName(rc)));.
1fdf0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1fe00 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
1fe10 20 20 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f    pFd->pMapRegio
1fe20 6e 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 70 46  n = pNew;.    pF
1fe30 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d 20 6e 4d  d->mmapSize = nM
1fe40 61 70 3b 0a 20 20 20 20 70 46 64 2d 3e 6d 6d 61  ap;.    pFd->mma
1fe50 70 53 69 7a 65 41 63 74 75 61 6c 20 3d 20 6e 4d  pSizeActual = nM
1fe60 61 70 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41  ap;.  }..  OSTRA
1fe70 43 45 28 28 22 4d 41 50 2d 46 49 4c 45 20 70 69  CE(("MAP-FILE pi
1fe80 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c  d=%lu, pFile=%p,
1fe90 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22   rc=SQLITE_OK\n"
1fea0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 47  ,.           osG
1feb0 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
1fec0 49 64 28 29 2c 20 70 46 64 29 29 3b 0a 20 20 72  Id(), pFd));.  r
1fed0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1fee0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
1fef0 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
1ff00 45 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66  E>0 */../*.** If
1ff10 20 70 6f 73 73 69 62 6c 65 2c 20 72 65 74 75 72   possible, retur
1ff20 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
1ff30 20 6d 61 70 70 69 6e 67 20 6f 66 20 66 69 6c 65   mapping of file
1ff40 20 66 64 20 73 74 61 72 74 69 6e 67 20 61 74 20   fd starting at 
1ff50 6f 66 66 73 65 74 0a 2a 2a 20 69 4f 66 66 2e 20  offset.** iOff. 
1ff60 54 68 65 20 6d 61 70 70 69 6e 67 20 6d 75 73 74  The mapping must
1ff70 20 62 65 20 76 61 6c 69 64 20 66 6f 72 20 61 74   be valid for at
1ff80 20 6c 65 61 73 74 20 6e 41 6d 74 20 62 79 74 65   least nAmt byte
1ff90 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 68  s..**.** If such
1ffa0 20 61 20 70 6f 69 6e 74 65 72 20 63 61 6e 20 62   a pointer can b
1ffb0 65 20 6f 62 74 61 69 6e 65 64 2c 20 73 74 6f 72  e obtained, stor
1ffc0 65 20 69 74 20 69 6e 20 2a 70 70 20 61 6e 64 20  e it in *pp and 
1ffd0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1ffe0 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20 6f 6e 65 20  ..** Or, if one 
1fff0 63 61 6e 6e 6f 74 20 62 75 74 20 6e 6f 20 65 72  cannot but no er
20000 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20  ror occurs, set 
20010 2a 70 70 20 74 6f 20 30 20 61 6e 64 20 72 65 74  *pp to 0 and ret
20020 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  urn SQLITE_OK..*
20030 2a 20 46 69 6e 61 6c 6c 79 2c 20 69 66 20 61 6e  * Finally, if an
20040 20 65 72 72 6f 72 20 64 6f 65 73 20 6f 63 63 75   error does occu
20050 72 2c 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c  r, return an SQL
20060 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20  ite error code. 
20070 54 68 65 20 66 69 6e 61 6c 0a 2a 2a 20 76 61 6c  The final.** val
20080 75 65 20 6f 66 20 2a 70 70 20 69 73 20 75 6e 64  ue of *pp is und
20090 65 66 69 6e 65 64 20 69 6e 20 74 68 69 73 20 63  efined in this c
200a0 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ase..**.** If th
200b0 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73  is function does
200c0 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
200d0 72 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 6d 75  r, the caller mu
200e0 73 74 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a  st eventually.**
200f0 20 72 65 6c 65 61 73 65 20 74 68 65 20 72 65 66   release the ref
20100 65 72 65 6e 63 65 20 62 79 20 63 61 6c 6c 69 6e  erence by callin
20110 67 20 77 69 6e 55 6e 66 65 74 63 68 28 29 2e 0a  g winUnfetch()..
20120 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
20130 6e 46 65 74 63 68 28 73 71 6c 69 74 65 33 5f 66  nFetch(sqlite3_f
20140 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 69 4f 66  ile *fd, i64 iOf
20150 66 2c 20 69 6e 74 20 6e 41 6d 74 2c 20 76 6f 69  f, int nAmt, voi
20160 64 20 2a 2a 70 70 29 7b 0a 23 69 66 20 53 51 4c  d **pp){.#if SQL
20170 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
20180 45 3e 30 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70  E>0.  winFile *p
20190 46 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66  Fd = (winFile*)f
201a0 64 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65  d;   /* The unde
201b0 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65 20  rlying database 
201c0 66 69 6c 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  file */.#endif. 
201d0 20 2a 70 70 20 3d 20 30 3b 0a 0a 20 20 4f 53 54   *pp = 0;..  OST
201e0 52 41 43 45 28 28 22 46 45 54 43 48 20 70 69 64  RACE(("FETCH pid
201f0 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20  =%lu, pFile=%p, 
20200 6f 66 66 73 65 74 3d 25 6c 6c 64 2c 20 61 6d 6f  offset=%lld, amo
20210 75 6e 74 3d 25 64 2c 20 70 70 3d 25 70 5c 6e 22  unt=%d, pp=%p\n"
20220 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 47  ,.           osG
20230 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
20240 49 64 28 29 2c 20 66 64 2c 20 69 4f 66 66 2c 20  Id(), fd, iOff, 
20250 6e 41 6d 74 2c 20 70 70 29 29 3b 0a 0a 23 69 66  nAmt, pp));..#if
20260 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
20270 5f 53 49 5a 45 3e 30 0a 20 20 69 66 28 20 70 46  _SIZE>0.  if( pF
20280 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 3e 30  d->mmapSizeMax>0
20290 20 29 7b 0a 20 20 20 20 69 66 28 20 70 46 64 2d   ){.    if( pFd-
202a0 3e 70 4d 61 70 52 65 67 69 6f 6e 3d 3d 30 20 29  >pMapRegion==0 )
202b0 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d  {.      int rc =
202c0 20 77 69 6e 4d 61 70 66 69 6c 65 28 70 46 64 2c   winMapfile(pFd,
202d0 20 2d 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20   -1);.      if( 
202e0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
202f0 0a 20 20 20 20 20 20 20 20 4f 53 54 52 41 43 45  .        OSTRACE
20300 28 28 22 46 45 54 43 48 20 70 69 64 3d 25 6c 75  (("FETCH pid=%lu
20310 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d 25  , pFile=%p, rc=%
20320 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
20330 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72         osGetCurr
20340 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
20350 70 46 64 2c 20 73 71 6c 69 74 65 33 45 72 72 4e  pFd, sqlite3ErrN
20360 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 20 20 20  ame(rc)));.     
20370 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
20380 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
20390 69 66 28 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a  if( pFd->mmapSiz
203a0 65 20 3e 3d 20 69 4f 66 66 2b 6e 41 6d 74 20 29  e >= iOff+nAmt )
203b0 7b 0a 20 20 20 20 20 20 2a 70 70 20 3d 20 26 28  {.      *pp = &(
203c0 28 75 38 20 2a 29 70 46 64 2d 3e 70 4d 61 70 52  (u8 *)pFd->pMapR
203d0 65 67 69 6f 6e 29 5b 69 4f 66 66 5d 3b 0a 20 20  egion)[iOff];.  
203e0 20 20 20 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f      pFd->nFetchO
203f0 75 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ut++;.    }.  }.
20400 23 65 6e 64 69 66 0a 0a 20 20 4f 53 54 52 41 43  #endif..  OSTRAC
20410 45 28 28 22 46 45 54 43 48 20 70 69 64 3d 25 6c  E(("FETCH pid=%l
20420 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 70 70 3d  u, pFile=%p, pp=
20430 25 70 2c 20 2a 70 70 3d 25 70 2c 20 72 63 3d 53  %p, *pp=%p, rc=S
20440 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20  QLITE_OK\n",.   
20450 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
20460 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
20470 20 66 64 2c 20 70 70 2c 20 2a 70 70 29 29 3b 0a   fd, pp, *pp));.
20480 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
20490 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  OK;.}../*.** If 
204a0 74 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65  the third argume
204b0 6e 74 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20  nt is non-NULL, 
204c0 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  then this functi
204d0 6f 6e 20 72 65 6c 65 61 73 65 73 20 61 0a 2a 2a  on releases a.**
204e0 20 72 65 66 65 72 65 6e 63 65 20 6f 62 74 61 69   reference obtai
204f0 6e 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65  ned by an earlie
20500 72 20 63 61 6c 6c 20 74 6f 20 77 69 6e 46 65 74  r call to winFet
20510 63 68 28 29 2e 20 54 68 65 20 73 65 63 6f 6e 64  ch(). The second
20520 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 70 61 73  .** argument pas
20530 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63  sed to this func
20540 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 74 68 65  tion must be the
20550 20 73 61 6d 65 20 61 73 20 74 68 65 20 63 6f 72   same as the cor
20560 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 61 72  responding.** ar
20570 67 75 6d 65 6e 74 20 74 68 61 74 20 77 61 73 20  gument that was 
20580 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 77 69  passed to the wi
20590 6e 46 65 74 63 68 28 29 20 69 6e 76 6f 63 61 74  nFetch() invocat
205a0 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69  ion..**.** Or, i
205b0 66 20 74 68 65 20 74 68 69 72 64 20 61 72 67 75  f the third argu
205c0 6d 65 6e 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68  ment is NULL, th
205d0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
205e0 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64   is being called
205f0 0a 2a 2a 20 74 6f 20 69 6e 66 6f 72 6d 20 74 68  .** to inform th
20600 65 20 56 46 53 20 6c 61 79 65 72 20 74 68 61 74  e VFS layer that
20610 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 50  , according to P
20620 4f 53 49 58 2c 20 61 6e 79 20 65 78 69 73 74 69  OSIX, any existi
20630 6e 67 20 6d 61 70 70 69 6e 67 0a 2a 2a 20 6d 61  ng mapping.** ma
20640 79 20 6e 6f 77 20 62 65 20 69 6e 76 61 6c 69 64  y now be invalid
20650 20 61 6e 64 20 73 68 6f 75 6c 64 20 62 65 20 75   and should be u
20660 6e 6d 61 70 70 65 64 2e 0a 2a 2f 0a 73 74 61 74  nmapped..*/.stat
20670 69 63 20 69 6e 74 20 77 69 6e 55 6e 66 65 74 63  ic int winUnfetc
20680 68 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  h(sqlite3_file *
20690 66 64 2c 20 69 36 34 20 69 4f 66 66 2c 20 76 6f  fd, i64 iOff, vo
206a0 69 64 20 2a 70 29 7b 0a 23 69 66 20 53 51 4c 49  id *p){.#if SQLI
206b0 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
206c0 3e 30 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46  >0.  winFile *pF
206d0 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66 64  d = (winFile*)fd
206e0 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72  ;   /* The under
206f0 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65 20 66  lying database f
20700 69 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20  ile */..  /* If 
20710 70 3d 3d 30 20 28 75 6e 6d 61 70 20 74 68 65 20  p==0 (unmap the 
20720 65 6e 74 69 72 65 20 66 69 6c 65 29 20 74 68 65  entire file) the
20730 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20  n there must be 
20740 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 0a 20  no outstanding. 
20750 20 2a 2a 20 78 46 65 74 63 68 20 72 65 66 65 72   ** xFetch refer
20760 65 6e 63 65 73 2e 20 4f 72 2c 20 69 66 20 70 21  ences. Or, if p!
20770 3d 30 20 28 6d 65 61 6e 69 6e 67 20 69 74 20 69  =0 (meaning it i
20780 73 20 61 6e 20 78 46 65 74 63 68 20 72 65 66 65  s an xFetch refe
20790 72 65 6e 63 65 29 2c 0a 20 20 2a 2a 20 74 68 65  rence),.  ** the
207a0 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20  n there must be 
207b0 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 75 74  at least one out
207c0 73 74 61 6e 64 69 6e 67 2e 20 20 2a 2f 0a 20 20  standing.  */.  
207d0 61 73 73 65 72 74 28 20 28 70 3d 3d 30 29 3d 3d  assert( (p==0)==
207e0 28 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3d  (pFd->nFetchOut=
207f0 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  =0) );..  /* If 
20800 70 21 3d 30 2c 20 69 74 20 6d 75 73 74 20 6d 61  p!=0, it must ma
20810 74 63 68 20 74 68 65 20 69 4f 66 66 20 76 61 6c  tch the iOff val
20820 75 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ue. */.  assert(
20830 20 70 3d 3d 30 20 7c 7c 20 70 3d 3d 26 28 28 75   p==0 || p==&((u
20840 38 20 2a 29 70 46 64 2d 3e 70 4d 61 70 52 65 67  8 *)pFd->pMapReg
20850 69 6f 6e 29 5b 69 4f 66 66 5d 20 29 3b 0a 0a 20  ion)[iOff] );.. 
20860 20 4f 53 54 52 41 43 45 28 28 22 55 4e 46 45 54   OSTRACE(("UNFET
20870 43 48 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c  CH pid=%lu, pFil
20880 65 3d 25 70 2c 20 6f 66 66 73 65 74 3d 25 6c 6c  e=%p, offset=%ll
20890 64 2c 20 70 3d 25 70 5c 6e 22 2c 0a 20 20 20 20  d, p=%p\n",.    
208a0 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72         osGetCurr
208b0 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
208c0 70 46 64 2c 20 69 4f 66 66 2c 20 70 29 29 3b 0a  pFd, iOff, p));.
208d0 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
208e0 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 2d 2d  pFd->nFetchOut--
208f0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
20900 2a 20 46 49 58 4d 45 3a 20 20 49 66 20 57 69 6e  * FIXME:  If Win
20910 64 6f 77 73 20 74 72 75 6c 79 20 61 6c 77 61 79  dows truly alway
20920 73 20 70 72 65 76 65 6e 74 73 20 74 72 75 6e 63  s prevents trunc
20930 61 74 69 6e 67 20 6f 72 20 64 65 6c 65 74 69 6e  ating or deletin
20940 67 20 61 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  g a.    ** file 
20950 77 68 69 6c 65 20 61 20 6d 61 70 70 69 6e 67 20  while a mapping 
20960 69 73 20 68 65 6c 64 2c 20 74 68 65 6e 20 74 68  is held, then th
20970 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 69 6e 55  e following winU
20980 6e 6d 61 70 66 69 6c 65 28 29 20 63 61 6c 6c 0a  nmapfile() call.
20990 20 20 20 20 2a 2a 20 69 73 20 75 6e 6e 65 63 65      ** is unnece
209a0 73 73 61 72 79 20 63 61 6e 20 63 61 6e 20 62 65  ssary can can be
209b0 20 6f 6d 69 74 74 65 64 20 2d 20 70 6f 74 65 6e   omitted - poten
209c0 74 69 61 6c 6c 79 20 69 6d 70 72 6f 76 69 6e 67  tially improving
209d0 0a 20 20 20 20 2a 2a 20 70 65 72 66 6f 72 6d 61  .    ** performa
209e0 6e 63 65 2e 20 20 2a 2f 0a 20 20 20 20 77 69 6e  nce.  */.    win
209f0 55 6e 6d 61 70 66 69 6c 65 28 70 46 64 29 3b 0a  Unmapfile(pFd);.
20a00 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70    }..  assert( p
20a10 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3e 3d 30  Fd->nFetchOut>=0
20a20 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 4f 53   );.#endif..  OS
20a30 54 52 41 43 45 28 28 22 55 4e 46 45 54 43 48 20  TRACE(("UNFETCH 
20a40 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25  pid=%lu, pFile=%
20a50 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c  p, rc=SQLITE_OK\
20a60 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f  n",.           o
20a70 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
20a80 73 73 49 64 28 29 2c 20 66 64 29 29 3b 0a 20 20  ssId(), fd));.  
20a90 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
20aa0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20  ;.}../*.** Here 
20ab0 65 6e 64 73 20 74 68 65 20 69 6d 70 6c 65 6d 65  ends the impleme
20ac0 6e 74 61 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 73  ntation of all s
20ad0 71 6c 69 74 65 33 5f 66 69 6c 65 20 6d 65 74 68  qlite3_file meth
20ae0 6f 64 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ods..**.********
20af0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45  ************** E
20b00 6e 64 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  nd sqlite3_file 
20b10 4d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a  Methods ********
20b20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20b30 2a 2a 2a 2a 2a 2a 2a 0a 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 2a 2a 2a 2a  ****************
20b80 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  ******/../*.** T
20b90 68 69 73 20 76 65 63 74 6f 72 20 64 65 66 69 6e  his vector defin
20ba0 65 73 20 61 6c 6c 20 74 68 65 20 6d 65 74 68 6f  es all the metho
20bb0 64 73 20 74 68 61 74 20 63 61 6e 20 6f 70 65 72  ds that can oper
20bc0 61 74 65 20 6f 6e 20 61 6e 0a 2a 2a 20 73 71 6c  ate on an.** sql
20bd0 69 74 65 33 5f 66 69 6c 65 20 66 6f 72 20 77 69  ite3_file for wi
20be0 6e 33 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  n32..*/.static c
20bf0 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  onst sqlite3_io_
20c00 6d 65 74 68 6f 64 73 20 77 69 6e 49 6f 4d 65 74  methods winIoMet
20c10 68 6f 64 20 3d 20 7b 0a 20 20 33 2c 20 20 20 20  hod = {.  3,    
20c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20c30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65            /* iVe
20c40 72 73 69 6f 6e 20 2a 2f 0a 20 20 77 69 6e 43 6c  rsion */.  winCl
20c50 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ose,            
20c60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
20c70 6c 6f 73 65 20 2a 2f 0a 20 20 77 69 6e 52 65 61  lose */.  winRea
20c80 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
20c90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65            /* xRe
20ca0 61 64 20 2a 2f 0a 20 20 77 69 6e 57 72 69 74 65  ad */.  winWrite
20cb0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
20cc0 20 20 20 20 20 20 20 20 2f 2a 20 78 57 72 69 74          /* xWrit
20cd0 65 20 2a 2f 0a 20 20 77 69 6e 54 72 75 6e 63 61  e */.  winTrunca
20ce0 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  te,             
20cf0 20 20 20 20 20 20 20 2f 2a 20 78 54 72 75 6e 63         /* xTrunc
20d00 61 74 65 20 2a 2f 0a 20 20 77 69 6e 53 79 6e 63  ate */.  winSync
20d10 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
20d20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 79 6e           /* xSyn
20d30 63 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 53 69  c */.  winFileSi
20d40 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ze,             
20d50 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 53         /* xFileS
20d60 69 7a 65 20 2a 2f 0a 20 20 77 69 6e 4c 6f 63 6b  ize */.  winLock
20d70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
20d80 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63           /* xLoc
20d90 6b 20 2a 2f 0a 20 20 77 69 6e 55 6e 6c 6f 63 6b  k */.  winUnlock
20da0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
20db0 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63         /* xUnloc
20dc0 6b 20 2a 2f 0a 20 20 77 69 6e 43 68 65 63 6b 52  k */.  winCheckR
20dd0 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20 20  eservedLock,    
20de0 20 20 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b         /* xCheck
20df0 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 2a 2f 0a  ReservedLock */.
20e00 20 20 77 69 6e 46 69 6c 65 43 6f 6e 74 72 6f 6c    winFileControl
20e10 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
20e20 20 20 2f 2a 20 78 46 69 6c 65 43 6f 6e 74 72 6f    /* xFileContro
20e30 6c 20 2a 2f 0a 20 20 77 69 6e 53 65 63 74 6f 72  l */.  winSector
20e40 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20  Size,           
20e50 20 20 20 20 20 20 20 2f 2a 20 78 53 65 63 74 6f         /* xSecto
20e60 72 53 69 7a 65 20 2a 2f 0a 20 20 77 69 6e 44 65  rSize */.  winDe
20e70 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
20e80 69 63 73 2c 20 20 20 20 20 20 20 2f 2a 20 78 44  ics,       /* xD
20e90 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
20ea0 74 69 63 73 20 2a 2f 0a 20 20 77 69 6e 53 68 6d  tics */.  winShm
20eb0 4d 61 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  Map,            
20ec0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68            /* xSh
20ed0 6d 4d 61 70 20 2a 2f 0a 20 20 77 69 6e 53 68 6d  mMap */.  winShm
20ee0 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
20ef0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68            /* xSh
20f00 6d 4c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e 53 68  mLock */.  winSh
20f10 6d 42 61 72 72 69 65 72 2c 20 20 20 20 20 20 20  mBarrier,       
20f20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
20f30 68 6d 42 61 72 72 69 65 72 20 2a 2f 0a 20 20 77  hmBarrier */.  w
20f40 69 6e 53 68 6d 55 6e 6d 61 70 2c 20 20 20 20 20  inShmUnmap,     
20f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20f60 2a 20 78 53 68 6d 55 6e 6d 61 70 20 2a 2f 0a 20  * xShmUnmap */. 
20f70 20 77 69 6e 46 65 74 63 68 2c 20 20 20 20 20 20   winFetch,      
20f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f90 20 2f 2a 20 78 46 65 74 63 68 20 2a 2f 0a 20 20   /* xFetch */.  
20fa0 77 69 6e 55 6e 66 65 74 63 68 20 20 20 20 20 20  winUnfetch      
20fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20fc0 2f 2a 20 78 55 6e 66 65 74 63 68 20 2a 2f 0a 7d  /* xUnfetch */.}
20fd0 3b 0a 0a 2f 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 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21020 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
21030 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 73 71  ************* sq
21040 6c 69 74 65 33 5f 76 66 73 20 6d 65 74 68 6f 64  lite3_vfs method
21050 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  s **************
21060 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
21070 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76 69 73 69  *.** This divisi
21080 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  on contains the 
21090 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
210a0 66 20 6d 65 74 68 6f 64 73 20 6f 6e 20 74 68 65  f methods on the
210b0 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66 73 20  .** sqlite3_vfs 
210c0 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 0a 23 69 66 20  object..*/..#if 
210d0 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e  defined(__CYGWIN
210e0 5f 5f 29 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  __)./*.** Conver
210f0 74 20 61 20 66 69 6c 65 6e 61 6d 65 20 66 72 6f  t a filename fro
21100 6d 20 77 68 61 74 65 76 65 72 20 74 68 65 20 75  m whatever the u
21110 6e 64 65 72 6c 79 69 6e 67 20 6f 70 65 72 61 74  nderlying operat
21120 69 6e 67 20 73 79 73 74 65 6d 0a 2a 2a 20 73 75  ing system.** su
21130 70 70 6f 72 74 73 20 66 6f 72 20 66 69 6c 65 6e  pports for filen
21140 61 6d 65 73 20 69 6e 74 6f 20 55 54 46 2d 38 2e  ames into UTF-8.
21150 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20    Space to hold 
21160 74 68 65 20 72 65 73 75 6c 74 20 69 73 0a 2a 2a  the result is.**
21170 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d   obtained from m
21180 61 6c 6c 6f 63 20 61 6e 64 20 6d 75 73 74 20 62  alloc and must b
21190 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63  e freed by the c
211a0 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e  alling function.
211b0 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
211c0 2a 77 69 6e 43 6f 6e 76 65 72 74 54 6f 55 74 66  *winConvertToUtf
211d0 38 46 69 6c 65 6e 61 6d 65 28 63 6f 6e 73 74 20  8Filename(const 
211e0 76 6f 69 64 20 2a 7a 46 69 6c 65 6e 61 6d 65 29  void *zFilename)
211f0 7b 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6e 76 65  {.  char *zConve
21200 72 74 65 64 20 3d 20 30 3b 0a 20 20 69 66 28 20  rted = 0;.  if( 
21210 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 20 20 20  osIsNT() ){.    
21220 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77 69 6e  zConverted = win
21230 55 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 46  UnicodeToUtf8(zF
21240 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 23 69  ilename);.  }.#i
21250 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  fdef SQLITE_WIN3
21260 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73  2_HAS_ANSI.  els
21270 65 7b 0a 20 20 20 20 7a 43 6f 6e 76 65 72 74 65  e{.    zConverte
21280 64 20 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e 33  d = sqlite3_win3
21290 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28 7a  2_mbcs_to_utf8(z
212a0 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 23  Filename);.  }.#
212b0 65 6e 64 69 66 0a 20 20 2f 2a 20 63 61 6c 6c 65  endif.  /* calle
212c0 72 20 77 69 6c 6c 20 68 61 6e 64 6c 65 20 6f 75  r will handle ou
212d0 74 20 6f 66 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20  t of memory */. 
212e0 20 72 65 74 75 72 6e 20 7a 43 6f 6e 76 65 72 74   return zConvert
212f0 65 64 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ed;.}.#endif../*
21300 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 55 54  .** Convert a UT
21310 46 2d 38 20 66 69 6c 65 6e 61 6d 65 20 69 6e 74  F-8 filename int
21320 6f 20 77 68 61 74 65 76 65 72 20 66 6f 72 6d 20  o whatever form 
21330 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a 2a  the underlying.*
21340 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  * operating syst
21350 65 6d 20 77 61 6e 74 73 20 66 69 6c 65 6e 61 6d  em wants filenam
21360 65 73 20 69 6e 2e 20 20 53 70 61 63 65 20 74 6f  es in.  Space to
21370 20 68 6f 6c 64 20 74 68 65 20 72 65 73 75 6c 74   hold the result
21380 0a 2a 2a 20 69 73 20 6f 62 74 61 69 6e 65 64 20  .** is obtained 
21390 66 72 6f 6d 20 6d 61 6c 6c 6f 63 20 61 6e 64 20  from malloc and 
213a0 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79  must be freed by
213b0 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20   the calling.** 
213c0 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  function..*/.sta
213d0 74 69 63 20 76 6f 69 64 20 2a 77 69 6e 43 6f 6e  tic void *winCon
213e0 76 65 72 74 46 72 6f 6d 55 74 66 38 46 69 6c 65  vertFromUtf8File
213f0 6e 61 6d 65 28 63 6f 6e 73 74 20 63 68 61 72 20  name(const char 
21400 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 76  *zFilename){.  v
21410 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 20  oid *zConverted 
21420 3d 20 30 3b 0a 20 20 69 66 28 20 6f 73 49 73 4e  = 0;.  if( osIsN
21430 54 28 29 20 29 7b 0a 20 20 20 20 7a 43 6f 6e 76  T() ){.    zConv
21440 65 72 74 65 64 20 3d 20 77 69 6e 55 74 66 38 54  erted = winUtf8T
21450 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61  oUnicode(zFilena
21460 6d 65 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20  me);.  }.#ifdef 
21470 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
21480 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20  _ANSI.  else{.  
21490 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 73    zConverted = s
214a0 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75 74 66  qlite3_win32_utf
214b0 38 5f 74 6f 5f 6d 62 63 73 28 7a 46 69 6c 65 6e  8_to_mbcs(zFilen
214c0 61 6d 65 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ame);.  }.#endif
214d0 0a 20 20 2f 2a 20 63 61 6c 6c 65 72 20 77 69 6c  .  /* caller wil
214e0 6c 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20  l handle out of 
214f0 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 72 65 74 75  memory */.  retu
21500 72 6e 20 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 7d  rn zConverted;.}
21510 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
21520 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 6e 6f  ction returns no
21530 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 73 70  n-zero if the sp
21540 65 63 69 66 69 65 64 20 55 54 46 2d 38 20 73 74  ecified UTF-8 st
21550 72 69 6e 67 20 62 75 66 66 65 72 0a 2a 2a 20 65  ring buffer.** e
21560 6e 64 73 20 77 69 74 68 20 61 20 64 69 72 65 63  nds with a direc
21570 74 6f 72 79 20 73 65 70 61 72 61 74 6f 72 20 63  tory separator c
21580 68 61 72 61 63 74 65 72 20 6f 72 20 6f 6e 65 20  haracter or one 
21590 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79  was successfully
215a0 0a 2a 2a 20 61 64 64 65 64 20 74 6f 20 69 74 2e  .** added to it.
215b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
215c0 69 6e 4d 61 6b 65 45 6e 64 49 6e 44 69 72 53 65  inMakeEndInDirSe
215d0 70 28 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72  p(int nBuf, char
215e0 20 2a 7a 42 75 66 29 7b 0a 20 20 69 66 28 20 7a   *zBuf){.  if( z
215f0 42 75 66 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  Buf ){.    int n
21600 4c 65 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72  Len = sqlite3Str
21610 6c 65 6e 33 30 28 7a 42 75 66 29 3b 0a 20 20 20  len30(zBuf);.   
21620 20 69 66 28 20 6e 4c 65 6e 3e 30 20 29 7b 0a 20   if( nLen>0 ){. 
21630 20 20 20 20 20 69 66 28 20 77 69 6e 49 73 44 69       if( winIsDi
21640 72 53 65 70 28 7a 42 75 66 5b 6e 4c 65 6e 2d 31  rSep(zBuf[nLen-1
21650 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  ]) ){.        re
21660 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 65  turn 1;.      }e
21670 6c 73 65 20 69 66 28 20 6e 4c 65 6e 2b 31 3c 6e  lse if( nLen+1<n
21680 42 75 66 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  Buf ){.        z
21690 42 75 66 5b 6e 4c 65 6e 5d 20 3d 20 77 69 6e 47  Buf[nLen] = winG
216a0 65 74 44 69 72 53 65 70 28 29 3b 0a 20 20 20 20  etDirSep();.    
216b0 20 20 20 20 7a 42 75 66 5b 6e 4c 65 6e 2b 31 5d      zBuf[nLen+1]
216c0 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 20   = '\0';.       
216d0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
216e0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
216f0 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
21700 2a 20 43 72 65 61 74 65 20 61 20 74 65 6d 70 6f  * Create a tempo
21710 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65 20 61  rary file name a
21720 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73  nd store the res
21730 75 6c 74 69 6e 67 20 70 6f 69 6e 74 65 72 20 69  ulting pointer i
21740 6e 74 6f 20 70 7a 42 75 66 2e 0a 2a 2a 20 54 68  nto pzBuf..** Th
21750 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e  e pointer return
21760 65 64 20 69 6e 20 70 7a 42 75 66 20 6d 75 73 74  ed in pzBuf must
21770 20 62 65 20 66 72 65 65 64 20 76 69 61 20 73 71   be freed via sq
21780 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f  lite3_free()..*/
21790 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 47  .static int winG
217a0 65 74 54 65 6d 70 6e 61 6d 65 28 73 71 6c 69 74  etTempname(sqlit
217b0 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 63 68  e3_vfs *pVfs, ch
217c0 61 72 20 2a 2a 70 7a 42 75 66 29 7b 0a 20 20 73  ar **pzBuf){.  s
217d0 74 61 74 69 63 20 63 68 61 72 20 7a 43 68 61 72  tatic char zChar
217e0 73 5b 5d 20 3d 0a 20 20 20 20 22 61 62 63 64 65  s[] =.    "abcde
217f0 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75  fghijklmnopqrstu
21800 76 77 78 79 7a 22 0a 20 20 20 20 22 41 42 43 44  vwxyz".    "ABCD
21810 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54  EFGHIJKLMNOPQRST
21820 55 56 57 58 59 5a 22 0a 20 20 20 20 22 30 31 32  UVWXYZ".    "012
21830 33 34 35 36 37 38 39 22 3b 0a 20 20 73 69 7a 65  3456789";.  size
21840 5f 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e  _t i, j;.  int n
21850 50 72 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72  Pre = sqlite3Str
21860 6c 65 6e 33 30 28 53 51 4c 49 54 45 5f 54 45 4d  len30(SQLITE_TEM
21870 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 29 3b 0a  P_FILE_PREFIX);.
21880 20 20 69 6e 74 20 6e 4d 61 78 2c 20 6e 42 75 66    int nMax, nBuf
21890 2c 20 6e 44 69 72 2c 20 6e 4c 65 6e 3b 0a 20 20  , nDir, nLen;.  
218a0 63 68 61 72 20 2a 7a 42 75 66 3b 0a 0a 20 20 2f  char *zBuf;..  /
218b0 2a 20 49 74 27 73 20 6f 64 64 20 74 6f 20 73 69  * It's odd to si
218c0 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72 72  mulate an io-err
218d0 6f 72 20 68 65 72 65 2c 20 62 75 74 20 72 65 61  or here, but rea
218e0 6c 6c 79 20 74 68 69 73 20 69 73 20 6a 75 73 74  lly this is just
218f0 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20  .  ** using the 
21900 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61 73 74  io-error infrast
21910 72 75 63 74 75 72 65 20 74 6f 20 74 65 73 74 20  ructure to test 
21920 74 68 61 74 20 53 51 4c 69 74 65 20 68 61 6e 64  that SQLite hand
21930 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75  les this.  ** fu
21940 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 0a  nction failing..
21950 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49    */.  SimulateI
21960 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
21970 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 3b 0a 0a  QLITE_IOERR );..
21980 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20    /* Allocate a 
21990 74 65 6d 70 6f 72 61 72 79 20 62 75 66 66 65 72  temporary buffer
219a0 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 66 75   to store the fu
219b0 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 20 66 69  lly qualified fi
219c0 6c 65 0a 20 20 2a 2a 20 6e 61 6d 65 20 66 6f 72  le.  ** name for
219d0 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66   the temporary f
219e0 69 6c 65 2e 20 20 49 66 20 74 68 69 73 20 66 61  ile.  If this fa
219f0 69 6c 73 2c 20 77 65 20 63 61 6e 6e 6f 74 20 63  ils, we cannot c
21a00 6f 6e 74 69 6e 75 65 2e 0a 20 20 2a 2f 0a 20 20  ontinue..  */.  
21a10 6e 4d 61 78 20 3d 20 70 56 66 73 2d 3e 6d 78 50  nMax = pVfs->mxP
21a20 61 74 68 6e 61 6d 65 3b 20 6e 42 75 66 20 3d 20  athname; nBuf = 
21a30 6e 4d 61 78 20 2b 20 32 3b 0a 20 20 7a 42 75 66  nMax + 2;.  zBuf
21a40 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
21a50 5a 65 72 6f 28 20 6e 42 75 66 20 29 3b 0a 20 20  Zero( nBuf );.  
21a60 69 66 28 20 21 7a 42 75 66 20 29 7b 0a 20 20 20  if( !zBuf ){.   
21a70 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d   OSTRACE(("TEMP-
21a80 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49  FILENAME rc=SQLI
21a90 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e  TE_IOERR_NOMEM\n
21aa0 22 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  "));.    return 
21ab0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
21ac0 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69  EM;.  }..  /* Fi
21ad0 67 75 72 65 20 6f 75 74 20 74 68 65 20 65 66 66  gure out the eff
21ae0 65 63 74 69 76 65 20 74 65 6d 70 6f 72 61 72 79  ective temporary
21af0 20 64 69 72 65 63 74 6f 72 79 2e 20 20 46 69 72   directory.  Fir
21b00 73 74 2c 20 63 68 65 63 6b 20 69 66 20 6f 6e 65  st, check if one
21b10 0a 20 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 65  .  ** has been e
21b20 78 70 6c 69 63 69 74 6c 79 20 73 65 74 20 62 79  xplicitly set by
21b30 20 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e   the application
21b40 3b 20 6f 74 68 65 72 77 69 73 65 2c 20 75 73 65  ; otherwise, use
21b50 20 74 68 65 20 6f 6e 65 0a 20 20 2a 2a 20 63 6f   the one.  ** co
21b60 6e 66 69 67 75 72 65 64 20 62 79 20 74 68 65 20  nfigured by the 
21b70 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
21b80 2e 0a 20 20 2a 2f 0a 20 20 6e 44 69 72 20 3d 20  ..  */.  nDir = 
21b90 6e 4d 61 78 20 2d 20 28 6e 50 72 65 20 2b 20 31  nMax - (nPre + 1
21ba0 35 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 44  5);.  assert( nD
21bb0 69 72 3e 30 20 29 3b 0a 20 20 69 66 28 20 73 71  ir>0 );.  if( sq
21bc0 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63  lite3_temp_direc
21bd0 74 6f 72 79 20 29 7b 0a 20 20 20 20 69 6e 74 20  tory ){.    int 
21be0 6e 44 69 72 4c 65 6e 20 3d 20 73 71 6c 69 74 65  nDirLen = sqlite
21bf0 33 53 74 72 6c 65 6e 33 30 28 73 71 6c 69 74 65  3Strlen30(sqlite
21c00 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79  3_temp_directory
21c10 29 3b 0a 20 20 20 20 69 66 28 20 6e 44 69 72 4c  );.    if( nDirL
21c20 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 66  en>0 ){.      if
21c30 28 20 21 77 69 6e 49 73 44 69 72 53 65 70 28 73  ( !winIsDirSep(s
21c40 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65  qlite3_temp_dire
21c50 63 74 6f 72 79 5b 6e 44 69 72 4c 65 6e 2d 31 5d  ctory[nDirLen-1]
21c60 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 44 69  ) ){.        nDi
21c70 72 4c 65 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  rLen++;.      }.
21c80 20 20 20 20 20 20 69 66 28 20 6e 44 69 72 4c 65        if( nDirLe
21c90 6e 3e 6e 44 69 72 20 29 7b 0a 20 20 20 20 20 20  n>nDir ){.      
21ca0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
21cb0 42 75 66 29 3b 0a 20 20 20 20 20 20 20 20 4f 53  Buf);.        OS
21cc0 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c  TRACE(("TEMP-FIL
21cd0 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f  ENAME rc=SQLITE_
21ce0 45 52 52 4f 52 5c 6e 22 29 29 3b 0a 20 20 20 20  ERROR\n"));.    
21cf0 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f      return winLo
21d00 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 45 52  gError(SQLITE_ER
21d10 52 4f 52 2c 20 30 2c 20 22 77 69 6e 47 65 74 54  ROR, 0, "winGetT
21d20 65 6d 70 6e 61 6d 65 31 22 2c 20 30 29 3b 0a 20  empname1", 0);. 
21d30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
21d40 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4d  ite3_snprintf(nM
21d50 61 78 2c 20 7a 42 75 66 2c 20 22 25 73 22 2c 20  ax, zBuf, "%s", 
21d60 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72  sqlite3_temp_dir
21d70 65 63 74 6f 72 79 29 3b 0a 20 20 20 20 7d 0a 20  ectory);.    }. 
21d80 20 7d 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f   }.#if defined(_
21d90 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20 65 6c 73  _CYGWIN__).  els
21da0 65 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  e{.    static co
21db0 6e 73 74 20 63 68 61 72 20 2a 61 7a 44 69 72 73  nst char *azDirs
21dc0 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 30 2c  [] = {.       0,
21dd0 20 2f 2a 20 67 65 74 65 6e 76 28 22 53 51 4c 49   /* getenv("SQLI
21de0 54 45 5f 54 4d 50 44 49 52 22 29 20 2a 2f 0a 20  TE_TMPDIR") */. 
21df0 20 20 20 20 20 20 30 2c 20 2f 2a 20 67 65 74 65        0, /* gete
21e00 6e 76 28 22 54 4d 50 44 49 52 22 29 20 2a 2f 0a  nv("TMPDIR") */.
21e10 20 20 20 20 20 20 20 30 2c 20 2f 2a 20 67 65 74         0, /* get
21e20 65 6e 76 28 22 54 4d 50 22 29 20 2a 2f 0a 20 20  env("TMP") */.  
21e30 20 20 20 20 20 30 2c 20 2f 2a 20 67 65 74 65 6e       0, /* geten
21e40 76 28 22 54 45 4d 50 22 29 20 2a 2f 0a 20 20 20  v("TEMP") */.   
21e50 20 20 20 20 30 2c 20 2f 2a 20 67 65 74 65 6e 76      0, /* getenv
21e60 28 22 55 53 45 52 50 52 4f 46 49 4c 45 22 29 20  ("USERPROFILE") 
21e70 2a 2f 0a 20 20 20 20 20 20 20 22 2f 76 61 72 2f  */.       "/var/
21e80 74 6d 70 22 2c 0a 20 20 20 20 20 20 20 22 2f 75  tmp",.       "/u
21e90 73 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20 20 20  sr/tmp",.       
21ea0 22 2f 74 6d 70 22 2c 0a 20 20 20 20 20 20 20 22  "/tmp",.       "
21eb0 2e 22 2c 0a 20 20 20 20 20 20 20 30 20 20 20 20  .",.       0    
21ec0 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 65 72 6d      /* List term
21ed0 69 6e 61 74 6f 72 20 2a 2f 0a 20 20 20 20 7d 3b  inator */.    };
21ee0 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e  .    unsigned in
21ef0 74 20 69 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  t i;.    const c
21f00 68 61 72 20 2a 7a 44 69 72 20 3d 20 30 3b 0a 0a  har *zDir = 0;..
21f10 20 20 20 20 69 66 28 20 21 61 7a 44 69 72 73 5b      if( !azDirs[
21f20 30 5d 20 29 20 61 7a 44 69 72 73 5b 30 5d 20 3d  0] ) azDirs[0] =
21f30 20 67 65 74 65 6e 76 28 22 53 51 4c 49 54 45 5f   getenv("SQLITE_
21f40 54 4d 50 44 49 52 22 29 3b 0a 20 20 20 20 69 66  TMPDIR");.    if
21f50 28 20 21 61 7a 44 69 72 73 5b 31 5d 20 29 20 61  ( !azDirs[1] ) a
21f60 7a 44 69 72 73 5b 31 5d 20 3d 20 67 65 74 65 6e  zDirs[1] = geten
21f70 76 28 22 54 4d 50 44 49 52 22 29 3b 0a 20 20 20  v("TMPDIR");.   
21f80 20 69 66 28 20 21 61 7a 44 69 72 73 5b 32 5d 20   if( !azDirs[2] 
21f90 29 20 61 7a 44 69 72 73 5b 32 5d 20 3d 20 67 65  ) azDirs[2] = ge
21fa0 74 65 6e 76 28 22 54 4d 50 22 29 3b 0a 20 20 20  tenv("TMP");.   
21fb0 20 69 66 28 20 21 61 7a 44 69 72 73 5b 33 5d 20   if( !azDirs[3] 
21fc0 29 20 61 7a 44 69 72 73 5b 33 5d 20 3d 20 67 65  ) azDirs[3] = ge
21fd0 74 65 6e 76 28 22 54 45 4d 50 22 29 3b 0a 20 20  tenv("TEMP");.  
21fe0 20 20 69 66 28 20 21 61 7a 44 69 72 73 5b 34 5d    if( !azDirs[4]
21ff0 20 29 20 61 7a 44 69 72 73 5b 34 5d 20 3d 20 67   ) azDirs[4] = g
22000 65 74 65 6e 76 28 22 55 53 45 52 50 52 4f 46 49  etenv("USERPROFI
22010 4c 45 22 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  LE");.    for(i=
22020 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 7a 44 69  0; i<sizeof(azDi
22030 72 73 29 2f 73 69 7a 65 6f 66 28 61 7a 44 69 72  rs)/sizeof(azDir
22040 73 5b 30 5d 29 3b 20 7a 44 69 72 3d 61 7a 44 69  s[0]); zDir=azDi
22050 72 73 5b 69 2b 2b 5d 29 7b 0a 20 20 20 20 20 20  rs[i++]){.      
22060 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64  void *zConverted
22070 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 44 69 72  ;.      if( zDir
22080 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
22090 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
220a0 70 61 74 68 20 73 74 61 72 74 73 20 77 69 74 68  path starts with
220b0 20 61 20 64 72 69 76 65 20 6c 65 74 74 65 72 20   a drive letter 
220c0 66 6f 6c 6c 6f 77 65 64 20 62 79 20 74 68 65 20  followed by the 
220d0 63 6f 6c 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 63  colon.      ** c
220e0 68 61 72 61 63 74 65 72 2c 20 61 73 73 75 6d 65  haracter, assume
220f0 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 61   it is already a
22100 20 6e 61 74 69 76 65 20 57 69 6e 33 32 20 70 61   native Win32 pa
22110 74 68 3b 20 6f 74 68 65 72 77 69 73 65 2c 0a 20  th; otherwise,. 
22120 20 20 20 20 20 2a 2a 20 69 74 20 6d 75 73 74 20       ** it must 
22130 62 65 20 63 6f 6e 76 65 72 74 65 64 20 74 6f 20  be converted to 
22140 61 20 6e 61 74 69 76 65 20 57 69 6e 33 32 20 70  a native Win32 p
22150 61 74 68 20 76 69 61 20 74 68 65 20 43 79 67 77  ath via the Cygw
22160 69 6e 20 41 50 49 0a 20 20 20 20 20 20 2a 2a 20  in API.      ** 
22170 70 72 69 6f 72 20 74 6f 20 75 73 69 6e 67 20 69  prior to using i
22180 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
22190 20 20 69 66 28 20 77 69 6e 49 73 44 72 69 76 65    if( winIsDrive
221a0 4c 65 74 74 65 72 41 6e 64 43 6f 6c 6f 6e 28 7a  LetterAndColon(z
221b0 44 69 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Dir) ){.        
221c0 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77 69 6e  zConverted = win
221d0 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66 38 46  ConvertFromUtf8F
221e0 69 6c 65 6e 61 6d 65 28 7a 44 69 72 29 3b 0a 20  ilename(zDir);. 
221f0 20 20 20 20 20 20 20 69 66 28 20 21 7a 43 6f 6e         if( !zCon
22200 76 65 72 74 65 64 20 29 7b 0a 20 20 20 20 20 20  verted ){.      
22210 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
22220 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 20 20  (zBuf);.        
22230 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50    OSTRACE(("TEMP
22240 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c  -FILENAME rc=SQL
22250 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c  ITE_IOERR_NOMEM\
22260 6e 22 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  n"));.          
22270 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
22280 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ERR_NOMEM;.     
22290 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
222a0 20 77 69 6e 49 73 44 69 72 28 7a 43 6f 6e 76 65   winIsDir(zConve
222b0 72 74 65 64 29 20 29 7b 0a 20 20 20 20 20 20 20  rted) ){.       
222c0 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
222d0 6e 74 66 28 6e 4d 61 78 2c 20 7a 42 75 66 2c 20  ntf(nMax, zBuf, 
222e0 22 25 73 22 2c 20 7a 44 69 72 29 3b 0a 20 20 20  "%s", zDir);.   
222f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
22300 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
22310 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
22320 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
22330 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
22340 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
22350 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
22360 20 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20     zConverted = 
22370 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
22380 6f 28 20 6e 4d 61 78 2b 31 20 29 3b 0a 20 20 20  o( nMax+1 );.   
22390 20 20 20 20 20 69 66 28 20 21 7a 43 6f 6e 76 65       if( !zConve
223a0 72 74 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20  rted ){.        
223b0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
223c0 42 75 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Buf);.          
223d0 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46  OSTRACE(("TEMP-F
223e0 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54  ILENAME rc=SQLIT
223f0 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22  E_IOERR_NOMEM\n"
22400 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  ));.          re
22410 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
22420 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  R_NOMEM;.       
22430 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 63   }.        if( c
22440 79 67 77 69 6e 5f 63 6f 6e 76 5f 70 61 74 68 28  ygwin_conv_path(
22450 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22460 20 6f 73 49 73 4e 54 28 29 20 3f 20 43 43 50 5f   osIsNT() ? CCP_
22470 50 4f 53 49 58 5f 54 4f 5f 57 49 4e 5f 57 20 3a  POSIX_TO_WIN_W :
22480 20 43 43 50 5f 50 4f 53 49 58 5f 54 4f 5f 57 49   CCP_POSIX_TO_WI
22490 4e 5f 41 2c 20 7a 44 69 72 2c 0a 20 20 20 20 20  N_A, zDir,.     
224a0 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6e 76             zConv
224b0 65 72 74 65 64 2c 20 6e 4d 61 78 2b 31 29 3c 30  erted, nMax+1)<0
224c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
224d0 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76  lite3_free(zConv
224e0 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 20 20  erted);.        
224f0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
22500 42 75 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Buf);.          
22510 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46  OSTRACE(("TEMP-F
22520 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54  ILENAME rc=SQLIT
22530 45 5f 49 4f 45 52 52 5f 43 4f 4e 56 50 41 54 48  E_IOERR_CONVPATH
22540 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 20 20 20  \n"));.         
22550 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72   return winLogEr
22560 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
22570 5f 43 4f 4e 56 50 41 54 48 2c 20 28 44 57 4f 52  _CONVPATH, (DWOR
22580 44 29 65 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  D)errno,.       
22590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
225a0 20 20 20 20 20 20 22 77 69 6e 47 65 74 54 65 6d        "winGetTem
225b0 70 6e 61 6d 65 32 22 2c 20 7a 44 69 72 29 3b 0a  pname2", zDir);.
225c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
225d0 20 20 69 66 28 20 77 69 6e 49 73 44 69 72 28 7a    if( winIsDir(z
225e0 43 6f 6e 76 65 72 74 65 64 29 20 29 7b 0a 20 20  Converted) ){.  
225f0 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20 74 68          /* At th
22600 69 73 20 70 6f 69 6e 74 2c 20 77 65 20 6b 6e 6f  is point, we kno
22610 77 20 74 68 65 20 63 61 6e 64 69 64 61 74 65 20  w the candidate 
22620 64 69 72 65 63 74 6f 72 79 20 65 78 69 73 74 73  directory exists
22630 20 61 6e 64 20 73 68 6f 75 6c 64 0a 20 20 20 20   and should.    
22640 20 20 20 20 20 20 2a 2a 20 62 65 20 75 73 65 64        ** be used
22650 2e 20 20 48 6f 77 65 76 65 72 2c 20 77 65 20 6d  .  However, we m
22660 61 79 20 6e 65 65 64 20 74 6f 20 63 6f 6e 76 65  ay need to conve
22670 72 74 20 74 68 65 20 73 74 72 69 6e 67 20 63 6f  rt the string co
22680 6e 74 61 69 6e 69 6e 67 0a 20 20 20 20 20 20 20  ntaining.       
22690 20 20 20 2a 2a 20 69 74 73 20 6e 61 6d 65 20 69     ** its name i
226a0 6e 74 6f 20 55 54 46 2d 38 20 28 69 2e 65 2e 20  nto UTF-8 (i.e. 
226b0 69 66 20 69 74 20 69 73 20 55 54 46 2d 31 36 20  if it is UTF-16 
226c0 72 69 67 68 74 20 6e 6f 77 29 2e 0a 20 20 20 20  right now)..    
226d0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
226e0 20 20 20 63 68 61 72 20 2a 7a 55 74 66 38 20 3d     char *zUtf8 =
226f0 20 77 69 6e 43 6f 6e 76 65 72 74 54 6f 55 74 66   winConvertToUtf
22700 38 46 69 6c 65 6e 61 6d 65 28 7a 43 6f 6e 76 65  8Filename(zConve
22710 72 74 65 64 29 3b 0a 20 20 20 20 20 20 20 20 20  rted);.         
22720 20 69 66 28 20 21 7a 55 74 66 38 20 29 7b 0a 20   if( !zUtf8 ){. 
22730 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
22740 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74  e3_free(zConvert
22750 65 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ed);.           
22760 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42   sqlite3_free(zB
22770 75 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  uf);.           
22780 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d   OSTRACE(("TEMP-
22790 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49  FILENAME rc=SQLI
227a0 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e  TE_IOERR_NOMEM\n
227b0 22 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  "));.           
227c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
227d0 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  OERR_NOMEM;.    
227e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
227f0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
22800 74 66 28 6e 4d 61 78 2c 20 7a 42 75 66 2c 20 22  tf(nMax, zBuf, "
22810 25 73 22 2c 20 7a 55 74 66 38 29 3b 0a 20 20 20  %s", zUtf8);.   
22820 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
22830 72 65 65 28 7a 55 74 66 38 29 3b 0a 20 20 20 20  ree(zUtf8);.    
22840 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
22850 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
22860 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
22870 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
22880 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
22890 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20  zConverted);.   
228a0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23     }.    }.  }.#
228b0 65 6c 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  elif !SQLITE_OS_
228c0 57 49 4e 52 54 20 26 26 20 21 64 65 66 69 6e 65  WINRT && !define
228d0 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20  d(__CYGWIN__).  
228e0 65 6c 73 65 20 69 66 28 20 6f 73 49 73 4e 54 28  else if( osIsNT(
228f0 29 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  ) ){.    char *z
22900 4d 75 6c 74 69 3b 0a 20 20 20 20 4c 50 57 53 54  Multi;.    LPWST
22910 52 20 7a 57 69 64 65 50 61 74 68 20 3d 20 73 71  R zWidePath = sq
22920 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
22930 20 6e 4d 61 78 2a 73 69 7a 65 6f 66 28 57 43 48   nMax*sizeof(WCH
22940 41 52 29 20 29 3b 0a 20 20 20 20 69 66 28 20 21  AR) );.    if( !
22950 7a 57 69 64 65 50 61 74 68 20 29 7b 0a 20 20 20  zWidePath ){.   
22960 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
22970 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 4f 53 54  zBuf);.      OST
22980 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45  RACE(("TEMP-FILE
22990 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 49  NAME rc=SQLITE_I
229a0 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b  OERR_NOMEM\n"));
229b0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
229c0 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
229d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
229e0 6f 73 47 65 74 54 65 6d 70 50 61 74 68 57 28 6e  osGetTempPathW(n
229f0 4d 61 78 2c 20 7a 57 69 64 65 50 61 74 68 29 3d  Max, zWidePath)=
22a00 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
22a10 74 65 33 5f 66 72 65 65 28 7a 57 69 64 65 50 61  te3_free(zWidePa
22a20 74 68 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  th);.      sqlit
22a30 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20  e3_free(zBuf);. 
22a40 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54       OSTRACE(("T
22a50 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d  EMP-FILENAME rc=
22a60 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 47 45 54  SQLITE_IOERR_GET
22a70 54 45 4d 50 50 41 54 48 5c 6e 22 29 29 3b 0a 20  TEMPPATH\n"));. 
22a80 20 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c       return winL
22a90 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
22aa0 4f 45 52 52 5f 47 45 54 54 45 4d 50 50 41 54 48  OERR_GETTEMPPATH
22ab0 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  , osGetLastError
22ac0 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  (),.            
22ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
22ae0 6e 47 65 74 54 65 6d 70 6e 61 6d 65 32 22 2c 20  nGetTempname2", 
22af0 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4d  0);.    }.    zM
22b00 75 6c 74 69 20 3d 20 77 69 6e 55 6e 69 63 6f 64  ulti = winUnicod
22b10 65 54 6f 55 74 66 38 28 7a 57 69 64 65 50 61 74  eToUtf8(zWidePat
22b20 68 29 3b 0a 20 20 20 20 69 66 28 20 7a 4d 75 6c  h);.    if( zMul
22b30 74 69 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ti ){.      sqli
22b40 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4d 61  te3_snprintf(nMa
22b50 78 2c 20 7a 42 75 66 2c 20 22 25 73 22 2c 20 7a  x, zBuf, "%s", z
22b60 4d 75 6c 74 69 29 3b 0a 20 20 20 20 20 20 73 71  Multi);.      sq
22b70 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 75 6c 74  lite3_free(zMult
22b80 69 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  i);.      sqlite
22b90 33 5f 66 72 65 65 28 7a 57 69 64 65 50 61 74 68  3_free(zWidePath
22ba0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
22bb0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
22bc0 28 7a 57 69 64 65 50 61 74 68 29 3b 0a 20 20 20  (zWidePath);.   
22bd0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
22be0 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 4f 53 54  zBuf);.      OST
22bf0 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45  RACE(("TEMP-FILE
22c00 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 49  NAME rc=SQLITE_I
22c10 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b  OERR_NOMEM\n"));
22c20 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
22c30 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
22c40 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66 64  ;.    }.  }.#ifd
22c50 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ef SQLITE_WIN32_
22c60 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b  HAS_ANSI.  else{
22c70 0a 20 20 20 20 63 68 61 72 20 2a 7a 55 74 66 38  .    char *zUtf8
22c80 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 62 63  ;.    char *zMbc
22c90 73 50 61 74 68 20 3d 20 73 71 6c 69 74 65 33 4d  sPath = sqlite3M
22ca0 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 4d 61 78 20  allocZero( nMax 
22cb0 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 4d 62 63  );.    if( !zMbc
22cc0 73 50 61 74 68 20 29 7b 0a 20 20 20 20 20 20 73  sPath ){.      s
22cd0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66  qlite3_free(zBuf
22ce0 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  );.      OSTRACE
22cf0 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45  (("TEMP-FILENAME
22d00 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52   rc=SQLITE_IOERR
22d10 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20 20  _NOMEM\n"));.   
22d20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
22d30 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20  _IOERR_NOMEM;.  
22d40 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 73 47 65    }.    if( osGe
22d50 74 54 65 6d 70 50 61 74 68 41 28 6e 4d 61 78 2c  tTempPathA(nMax,
22d60 20 7a 4d 62 63 73 50 61 74 68 29 3d 3d 30 20 29   zMbcsPath)==0 )
22d70 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
22d80 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20  free(zBuf);.    
22d90 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50    OSTRACE(("TEMP
22da0 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c  -FILENAME rc=SQL
22db0 49 54 45 5f 49 4f 45 52 52 5f 47 45 54 54 45 4d  ITE_IOERR_GETTEM
22dc0 50 50 41 54 48 5c 6e 22 29 29 3b 0a 20 20 20 20  PPATH\n"));.    
22dd0 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45    return winLogE
22de0 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
22df0 52 5f 47 45 54 54 45 4d 50 50 41 54 48 2c 20 6f  R_GETTEMPPATH, o
22e00 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c  sGetLastError(),
22e10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22e20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 47 65            "winGe
22e30 74 54 65 6d 70 6e 61 6d 65 33 22 2c 20 30 29 3b  tTempname3", 0);
22e40 0a 20 20 20 20 7d 0a 20 20 20 20 7a 55 74 66 38  .    }.    zUtf8
22e50 20 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32   = sqlite3_win32
22e60 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28 7a 4d  _mbcs_to_utf8(zM
22e70 62 63 73 50 61 74 68 29 3b 0a 20 20 20 20 69 66  bcsPath);.    if
22e80 28 20 7a 55 74 66 38 20 29 7b 0a 20 20 20 20 20  ( zUtf8 ){.     
22e90 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
22ea0 66 28 6e 4d 61 78 2c 20 7a 42 75 66 2c 20 22 25  f(nMax, zBuf, "%
22eb0 73 22 2c 20 7a 55 74 66 38 29 3b 0a 20 20 20 20  s", zUtf8);.    
22ec0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
22ed0 55 74 66 38 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Utf8);.    }else
22ee0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
22ef0 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20  free(zBuf);.    
22f00 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50    OSTRACE(("TEMP
22f10 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c  -FILENAME rc=SQL
22f20 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c  ITE_IOERR_NOMEM\
22f30 6e 22 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75  n"));.      retu
22f40 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
22f50 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d  NOMEM;.    }.  }
22f60 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
22f70 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
22f80 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53   */.#endif /* !S
22f90 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 2a  QLITE_OS_WINRT *
22fa0 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43 68 65  /..  /*.  ** Che
22fb0 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ck to make sure 
22fc0 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 64 69  the temporary di
22fd0 72 65 63 74 6f 72 79 20 65 6e 64 73 20 77 69 74  rectory ends wit
22fe0 68 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  h an appropriate
22ff0 0a 20 20 2a 2a 20 73 65 70 61 72 61 74 6f 72 2e  .  ** separator.
23000 20 20 49 66 20 69 74 20 64 6f 65 73 20 6e 6f 74    If it does not
23010 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f   and there is no
23020 74 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20 6c  t enough space l
23030 65 66 74 20 74 6f 20 61 64 64 0a 20 20 2a 2a 20  eft to add.  ** 
23040 6f 6e 65 2c 20 66 61 69 6c 2e 0a 20 20 2a 2f 0a  one, fail..  */.
23050 20 20 69 66 28 20 21 77 69 6e 4d 61 6b 65 45 6e    if( !winMakeEn
23060 64 49 6e 44 69 72 53 65 70 28 6e 44 69 72 2b 31  dInDirSep(nDir+1
23070 2c 20 7a 42 75 66 29 20 29 7b 0a 20 20 20 20 73  , zBuf) ){.    s
23080 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66  qlite3_free(zBuf
23090 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  );.    OSTRACE((
230a0 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72  "TEMP-FILENAME r
230b0 63 3d 53 51 4c 49 54 45 5f 45 52 52 4f 52 5c 6e  c=SQLITE_ERROR\n
230c0 22 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  "));.    return 
230d0 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
230e0 54 45 5f 45 52 52 4f 52 2c 20 30 2c 20 22 77 69  TE_ERROR, 0, "wi
230f0 6e 47 65 74 54 65 6d 70 6e 61 6d 65 34 22 2c 20  nGetTempname4", 
23100 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  0);.  }..  /*.  
23110 2a 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  ** Check that th
23120 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20  e output buffer 
23130 69 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20  is large enough 
23140 66 6f 72 20 74 68 65 20 74 65 6d 70 6f 72 61 72  for the temporar
23150 79 20 66 69 6c 65 0a 20 20 2a 2a 20 6e 61 6d 65  y file.  ** name
23160 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   in the followin
23170 67 20 66 6f 72 6d 61 74 3a 0a 20 20 2a 2a 0a 20  g format:.  **. 
23180 20 2a 2a 20 20 20 22 3c 74 65 6d 70 6f 72 61 72   **   "<temporar
23190 79 5f 64 69 72 65 63 74 6f 72 79 3e 2f 65 74 69  y_directory>/eti
231a0 6c 71 73 5f 58 58 58 58 58 58 58 58 58 58 58 58  lqs_XXXXXXXXXXXX
231b0 58 58 58 5c 30 5c 30 22 0a 20 20 2a 2a 0a 20 20  XXX\0\0".  **.  
231c0 2a 2a 20 49 66 20 6e 6f 74 2c 20 72 65 74 75 72  ** If not, retur
231d0 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 20  n SQLITE_ERROR. 
231e0 20 54 68 65 20 6e 75 6d 62 65 72 20 31 37 20 69   The number 17 i
231f0 73 20 75 73 65 64 20 68 65 72 65 20 69 6e 20 6f  s used here in o
23200 72 64 65 72 20 74 6f 0a 20 20 2a 2a 20 61 63 63  rder to.  ** acc
23210 6f 75 6e 74 20 66 6f 72 20 74 68 65 20 73 70 61  ount for the spa
23220 63 65 20 75 73 65 64 20 62 79 20 74 68 65 20 31  ce used by the 1
23230 35 20 63 68 61 72 61 63 74 65 72 20 72 61 6e 64  5 character rand
23240 6f 6d 20 73 75 66 66 69 78 20 61 6e 64 20 74 68  om suffix and th
23250 65 0a 20 20 2a 2a 20 74 77 6f 20 74 72 61 69 6c  e.  ** two trail
23260 69 6e 67 20 4e 55 4c 20 63 68 61 72 61 63 74 65  ing NUL characte
23270 72 73 2e 20 20 54 68 65 20 66 69 6e 61 6c 20 64  rs.  The final d
23280 69 72 65 63 74 6f 72 79 20 73 65 70 61 72 61 74  irectory separat
23290 6f 72 20 63 68 61 72 61 63 74 65 72 0a 20 20 2a  or character.  *
232a0 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20 61 64  * has already ad
232b0 64 65 64 20 69 66 20 69 74 20 77 61 73 20 6e 6f  ded if it was no
232c0 74 20 61 6c 72 65 61 64 79 20 70 72 65 73 65 6e  t already presen
232d0 74 2e 0a 20 20 2a 2f 0a 20 20 6e 4c 65 6e 20 3d  t..  */.  nLen =
232e0 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
232f0 28 7a 42 75 66 29 3b 0a 20 20 69 66 28 20 28 6e  (zBuf);.  if( (n
23300 4c 65 6e 20 2b 20 6e 50 72 65 20 2b 20 31 37 29  Len + nPre + 17)
23310 20 3e 20 6e 42 75 66 20 29 7b 0a 20 20 20 20 73   > nBuf ){.    s
23320 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66  qlite3_free(zBuf
23330 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  );.    OSTRACE((
23340 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72  "TEMP-FILENAME r
23350 63 3d 53 51 4c 49 54 45 5f 45 52 52 4f 52 5c 6e  c=SQLITE_ERROR\n
23360 22 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  "));.    return 
23370 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
23380 54 45 5f 45 52 52 4f 52 2c 20 30 2c 20 22 77 69  TE_ERROR, 0, "wi
23390 6e 47 65 74 54 65 6d 70 6e 61 6d 65 35 22 2c 20  nGetTempname5", 
233a0 30 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74  0);.  }..  sqlit
233b0 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66  e3_snprintf(nBuf
233c0 2d 31 36 2d 6e 4c 65 6e 2c 20 7a 42 75 66 2b 6e  -16-nLen, zBuf+n
233d0 4c 65 6e 2c 20 53 51 4c 49 54 45 5f 54 45 4d 50  Len, SQLITE_TEMP
233e0 5f 46 49 4c 45 5f 50 52 45 46 49 58 29 3b 0a 0a  _FILE_PREFIX);..
233f0 20 20 6a 20 3d 20 73 71 6c 69 74 65 33 53 74 72    j = sqlite3Str
23400 6c 65 6e 33 30 28 7a 42 75 66 29 3b 0a 20 20 73  len30(zBuf);.  s
23410 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73  qlite3_randomnes
23420 73 28 31 35 2c 20 26 7a 42 75 66 5b 6a 5d 29 3b  s(15, &zBuf[j]);
23430 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31 35  .  for(i=0; i<15
23440 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20  ; i++, j++){.   
23450 20 7a 42 75 66 5b 6a 5d 20 3d 20 28 63 68 61 72   zBuf[j] = (char
23460 29 7a 43 68 61 72 73 5b 20 28 28 75 6e 73 69 67  )zChars[ ((unsig
23470 6e 65 64 20 63 68 61 72 29 7a 42 75 66 5b 6a 5d  ned char)zBuf[j]
23480 29 25 28 73 69 7a 65 6f 66 28 7a 43 68 61 72 73  )%(sizeof(zChars
23490 29 2d 31 29 20 5d 3b 0a 20 20 7d 0a 20 20 7a 42  )-1) ];.  }.  zB
234a0 75 66 5b 6a 5d 20 3d 20 30 3b 0a 20 20 7a 42 75  uf[j] = 0;.  zBu
234b0 66 5b 6a 2b 31 5d 20 3d 20 30 3b 0a 20 20 2a 70  f[j+1] = 0;.  *p
234c0 7a 42 75 66 20 3d 20 7a 42 75 66 3b 0a 0a 20 20  zBuf = zBuf;..  
234d0 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46  OSTRACE(("TEMP-F
234e0 49 4c 45 4e 41 4d 45 20 6e 61 6d 65 3d 25 73 2c  ILENAME name=%s,
234f0 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22   rc=SQLITE_OK\n"
23500 2c 20 7a 42 75 66 29 29 3b 0a 20 20 72 65 74 75  , zBuf));.  retu
23510 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
23520 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
23530 55 45 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20  UE if the named 
23540 66 69 6c 65 20 69 73 20 72 65 61 6c 6c 79 20 61  file is really a
23550 20 64 69 72 65 63 74 6f 72 79 2e 20 20 52 65 74   directory.  Ret
23560 75 72 6e 20 66 61 6c 73 65 20 69 66 0a 2a 2a 20  urn false if.** 
23570 69 74 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20  it is something 
23580 6f 74 68 65 72 20 74 68 61 6e 20 61 20 64 69 72  other than a dir
23590 65 63 74 6f 72 79 2c 20 6f 72 20 69 66 20 74 68  ectory, or if th
235a0 65 72 65 20 69 73 20 61 6e 79 20 6b 69 6e 64 20  ere is any kind 
235b0 6f 66 20 6d 65 6d 6f 72 79 0a 2a 2a 20 61 6c 6c  of memory.** all
235c0 6f 63 61 74 69 6f 6e 20 66 61 69 6c 75 72 65 2e  ocation failure.
235d0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
235e0 69 6e 49 73 44 69 72 28 63 6f 6e 73 74 20 76 6f  inIsDir(const vo
235f0 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 29 7b  id *zConverted){
23600 0a 20 20 44 57 4f 52 44 20 61 74 74 72 3b 0a 20  .  DWORD attr;. 
23610 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 44   int rc = 0;.  D
23620 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a  WORD lastErrno;.
23630 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20  .  if( osIsNT() 
23640 29 7b 0a 20 20 20 20 69 6e 74 20 63 6e 74 20 3d  ){.    int cnt =
23650 20 30 3b 0a 20 20 20 20 57 49 4e 33 32 5f 46 49   0;.    WIN32_FI
23660 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 44 41 54  LE_ATTRIBUTE_DAT
23670 41 20 73 41 74 74 72 44 61 74 61 3b 0a 20 20 20  A sAttrData;.   
23680 20 6d 65 6d 73 65 74 28 26 73 41 74 74 72 44 61   memset(&sAttrDa
23690 74 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 41  ta, 0, sizeof(sA
236a0 74 74 72 44 61 74 61 29 29 3b 0a 20 20 20 20 77  ttrData));.    w
236b0 68 69 6c 65 28 20 21 28 72 63 20 3d 20 6f 73 47  hile( !(rc = osG
236c0 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
236d0 45 78 57 28 28 4c 50 43 57 53 54 52 29 7a 43 6f  ExW((LPCWSTR)zCo
236e0 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20  nverted,.       
236f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23700 20 20 20 20 20 20 47 65 74 46 69 6c 65 45 78 49        GetFileExI
23710 6e 66 6f 53 74 61 6e 64 61 72 64 2c 0a 20 20 20  nfoStandard,.   
23720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23730 20 20 20 20 20 20 20 20 20 20 26 73 41 74 74 72            &sAttr
23740 44 61 74 61 29 29 20 26 26 20 77 69 6e 52 65 74  Data)) && winRet
23750 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c  ryIoerr(&cnt, &l
23760 61 73 74 45 72 72 6e 6f 29 20 29 7b 7d 0a 20 20  astErrno) ){}.  
23770 20 20 69 66 28 20 21 72 63 20 29 7b 0a 20 20 20    if( !rc ){.   
23780 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20     return 0; /* 
23790 49 6e 76 61 6c 69 64 20 6e 61 6d 65 3f 20 2a 2f  Invalid name? */
237a0 0a 20 20 20 20 7d 0a 20 20 20 20 61 74 74 72 20  .    }.    attr 
237b0 3d 20 73 41 74 74 72 44 61 74 61 2e 64 77 46 69  = sAttrData.dwFi
237c0 6c 65 41 74 74 72 69 62 75 74 65 73 3b 0a 23 69  leAttributes;.#i
237d0 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
237e0 45 3d 3d 30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  E==0.  }else{.  
237f0 20 20 61 74 74 72 20 3d 20 6f 73 47 65 74 46 69    attr = osGetFi
23800 6c 65 41 74 74 72 69 62 75 74 65 73 41 28 28 63  leAttributesA((c
23810 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 29  har*)zConverted)
23820 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 72  ;.#endif.  }.  r
23830 65 74 75 72 6e 20 28 61 74 74 72 21 3d 49 4e 56  eturn (attr!=INV
23840 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42  ALID_FILE_ATTRIB
23850 55 54 45 53 29 20 26 26 20 28 61 74 74 72 26 46  UTES) && (attr&F
23860 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 44 49  ILE_ATTRIBUTE_DI
23870 52 45 43 54 4f 52 59 29 3b 0a 7d 0a 0a 2f 2a 0a  RECTORY);.}../*.
23880 2a 2a 20 4f 70 65 6e 20 61 20 66 69 6c 65 2e 0a  ** Open a file..
23890 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
238a0 6e 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33  nOpen(.  sqlite3
238b0 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20  _vfs *pVfs,     
238c0 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 67 65     /* Used to ge
238d0 74 20 6d 61 78 69 6d 75 6d 20 70 61 74 68 20 6e  t maximum path n
238e0 61 6d 65 20 6c 65 6e 67 74 68 20 2a 2f 0a 20 20  ame length */.  
238f0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
23900 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  e,        /* Nam
23910 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 28 55  e of the file (U
23920 54 46 2d 38 29 20 2a 2f 0a 20 20 73 71 6c 69 74  TF-8) */.  sqlit
23930 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 20 20 20  e3_file *id,    
23940 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
23950 65 20 53 51 4c 69 74 65 20 66 69 6c 65 20 68 61  e SQLite file ha
23960 6e 64 6c 65 20 68 65 72 65 20 2a 2f 0a 20 20 69  ndle here */.  i
23970 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20  nt flags,       
23980 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e           /* Open
23990 20 6d 6f 64 65 20 66 6c 61 67 73 20 2a 2f 0a 20   mode flags */. 
239a0 20 69 6e 74 20 2a 70 4f 75 74 46 6c 61 67 73 20   int *pOutFlags 
239b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
239c0 61 74 75 73 20 72 65 74 75 72 6e 20 66 6c 61 67  atus return flag
239d0 73 20 2a 2f 0a 29 7b 0a 20 20 48 41 4e 44 4c 45  s */.){.  HANDLE
239e0 20 68 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74   h;.  DWORD last
239f0 45 72 72 6e 6f 20 3d 20 30 3b 0a 20 20 44 57 4f  Errno = 0;.  DWO
23a00 52 44 20 64 77 44 65 73 69 72 65 64 41 63 63 65  RD dwDesiredAcce
23a10 73 73 3b 0a 20 20 44 57 4f 52 44 20 64 77 53 68  ss;.  DWORD dwSh
23a20 61 72 65 4d 6f 64 65 3b 0a 20 20 44 57 4f 52 44  areMode;.  DWORD
23a30 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f   dwCreationDispo
23a40 73 69 74 69 6f 6e 3b 0a 20 20 44 57 4f 52 44 20  sition;.  DWORD 
23a50 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62  dwFlagsAndAttrib
23a60 75 74 65 73 20 3d 20 30 3b 0a 23 69 66 20 53 51  utes = 0;.#if SQ
23a70 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
23a80 69 6e 74 20 69 73 54 65 6d 70 20 3d 20 30 3b 0a  int isTemp = 0;.
23a90 23 65 6e 64 69 66 0a 20 20 77 69 6e 46 69 6c 65  #endif.  winFile
23aa0 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69   *pFile = (winFi
23ab0 6c 65 2a 29 69 64 3b 0a 20 20 76 6f 69 64 20 2a  le*)id;.  void *
23ac0 7a 43 6f 6e 76 65 72 74 65 64 3b 20 20 20 20 20  zConverted;     
23ad0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
23ae0 6e 61 6d 65 20 69 6e 20 4f 53 20 65 6e 63 6f 64  name in OS encod
23af0 69 6e 67 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ing */.  const c
23b00 68 61 72 20 2a 7a 55 74 66 38 4e 61 6d 65 20 3d  har *zUtf8Name =
23b10 20 7a 4e 61 6d 65 3b 20 2f 2a 20 46 69 6c 65 6e   zName; /* Filen
23b20 61 6d 65 20 69 6e 20 55 54 46 2d 38 20 65 6e 63  ame in UTF-8 enc
23b30 6f 64 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 63  oding */.  int c
23b40 6e 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 66  nt = 0;..  /* If
23b50 20 61 72 67 75 6d 65 6e 74 20 7a 50 61 74 68 20   argument zPath 
23b60 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65  is a NULL pointe
23b70 72 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  r, this function
23b80 20 69 73 20 72 65 71 75 69 72 65 64 20 74 6f 20   is required to 
23b90 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 74 65 6d 70  open.  ** a temp
23ba0 6f 72 61 72 79 20 66 69 6c 65 2e 20 55 73 65 20  orary file. Use 
23bb0 74 68 69 73 20 62 75 66 66 65 72 20 74 6f 20 73  this buffer to s
23bc0 74 6f 72 65 20 74 68 65 20 66 69 6c 65 20 6e 61  tore the file na
23bd0 6d 65 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 63 68  me in..  */.  ch
23be0 61 72 20 2a 7a 54 6d 70 6e 61 6d 65 20 3d 20 30  ar *zTmpname = 0
23bf0 3b 20 2f 2a 20 46 6f 72 20 74 65 6d 70 6f 72 61  ; /* For tempora
23c00 72 79 20 66 69 6c 65 6e 61 6d 65 2c 20 69 66 20  ry filename, if 
23c10 6e 65 63 65 73 73 61 72 79 2e 20 2a 2f 0a 0a 20  necessary. */.. 
23c20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
23c30 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
23c40 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 52 65 74 75  /* Function Retu
23c50 72 6e 20 43 6f 64 65 20 2a 2f 0a 23 69 66 20 21  rn Code */.#if !
23c60 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20  defined(NDEBUG) 
23c70 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  || SQLITE_OS_WIN
23c80 43 45 0a 20 20 69 6e 74 20 65 54 79 70 65 20 3d  CE.  int eType =
23c90 20 66 6c 61 67 73 26 30 78 46 46 46 46 46 46 30   flags&0xFFFFFF0
23ca0 30 3b 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 66  0;  /* Type of f
23cb0 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 23  ile to open */.#
23cc0 65 6e 64 69 66 0a 0a 20 20 69 6e 74 20 69 73 45  endif..  int isE
23cd0 78 63 6c 75 73 69 76 65 20 20 3d 20 28 66 6c 61  xclusive  = (fla
23ce0 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
23cf0 5f 45 58 43 4c 55 53 49 56 45 29 3b 0a 20 20 69  _EXCLUSIVE);.  i
23d00 6e 74 20 69 73 44 65 6c 65 74 65 20 20 20 20 20  nt isDelete     
23d10 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
23d20 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43  E_OPEN_DELETEONC
23d30 4c 4f 53 45 29 3b 0a 20 20 69 6e 74 20 69 73 43  LOSE);.  int isC
23d40 72 65 61 74 65 20 20 20 20 20 3d 20 28 66 6c 61  reate     = (fla
23d50 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
23d60 5f 43 52 45 41 54 45 29 3b 0a 20 20 69 6e 74 20  _CREATE);.  int 
23d70 69 73 52 65 61 64 6f 6e 6c 79 20 20 20 3d 20 28  isReadonly   = (
23d80 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
23d90 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20  PEN_READONLY);. 
23da0 20 69 6e 74 20 69 73 52 65 61 64 57 72 69 74 65   int isReadWrite
23db0 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c    = (flags & SQL
23dc0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
23dd0 54 45 29 3b 0a 0a 23 69 66 6e 64 65 66 20 4e 44  TE);..#ifndef ND
23de0 45 42 55 47 0a 20 20 69 6e 74 20 69 73 4f 70 65  EBUG.  int isOpe
23df0 6e 4a 6f 75 72 6e 61 6c 20 3d 20 28 69 73 43 72  nJournal = (isCr
23e00 65 61 74 65 20 26 26 20 28 0a 20 20 20 20 20 20  eate && (.      
23e10 20 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f    eType==SQLITE_
23e20 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52  OPEN_MASTER_JOUR
23e30 4e 41 4c 0a 20 20 20 20 20 7c 7c 20 65 54 79 70  NAL.     || eTyp
23e40 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e==SQLITE_OPEN_M
23e50 41 49 4e 5f 4a 4f 55 52 4e 41 4c 0a 20 20 20 20  AIN_JOURNAL.    
23e60 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
23e70 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 29 3b  E_OPEN_WAL.  ));
23e80 0a 23 65 6e 64 69 66 0a 0a 20 20 4f 53 54 52 41  .#endif..  OSTRA
23e90 43 45 28 28 22 4f 50 45 4e 20 6e 61 6d 65 3d 25  CE(("OPEN name=%
23ea0 73 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66 6c 61  s, pFile=%p, fla
23eb0 67 73 3d 25 78 2c 20 70 4f 75 74 46 6c 61 67 73  gs=%x, pOutFlags
23ec0 3d 25 70 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%p\n",.        
23ed0 20 20 20 7a 55 74 66 38 4e 61 6d 65 2c 20 69 64     zUtf8Name, id
23ee0 2c 20 66 6c 61 67 73 2c 20 70 4f 75 74 46 6c 61  , flags, pOutFla
23ef0 67 73 29 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  gs));..  /* Chec
23f00 6b 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  k the following 
23f10 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20 74  statements are t
23f20 72 75 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  rue:.  **.  **  
23f30 20 28 61 29 20 45 78 61 63 74 6c 79 20 6f 6e 65   (a) Exactly one
23f40 20 6f 66 20 74 68 65 20 52 45 41 44 57 52 49 54   of the READWRIT
23f50 45 20 61 6e 64 20 52 45 41 44 4f 4e 4c 59 20 66  E and READONLY f
23f60 6c 61 67 73 20 6d 75 73 74 20 62 65 20 73 65 74  lags must be set
23f70 2c 20 61 6e 64 0a 20 20 2a 2a 20 20 20 28 62 29  , and.  **   (b)
23f80 20 69 66 20 43 52 45 41 54 45 20 69 73 20 73 65   if CREATE is se
23f90 74 2c 20 74 68 65 6e 20 52 45 41 44 57 52 49 54  t, then READWRIT
23fa0 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73  E must also be s
23fb0 65 74 2c 20 61 6e 64 0a 20 20 2a 2a 20 20 20 28  et, and.  **   (
23fc0 63 29 20 69 66 20 45 58 43 4c 55 53 49 56 45 20  c) if EXCLUSIVE 
23fd0 69 73 20 73 65 74 2c 20 74 68 65 6e 20 43 52 45  is set, then CRE
23fe0 41 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65  ATE must also be
23ff0 20 73 65 74 2e 0a 20 20 2a 2a 20 20 20 28 64 29   set..  **   (d)
24000 20 69 66 20 44 45 4c 45 54 45 4f 4e 43 4c 4f 53   if DELETEONCLOS
24010 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 43  E is set, then C
24020 52 45 41 54 45 20 6d 75 73 74 20 61 6c 73 6f 20  REATE must also 
24030 62 65 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 61  be set..  */.  a
24040 73 73 65 72 74 28 28 69 73 52 65 61 64 6f 6e 6c  ssert((isReadonl
24050 79 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57 72  y==0 || isReadWr
24060 69 74 65 3d 3d 30 29 20 26 26 20 28 69 73 52 65  ite==0) && (isRe
24070 61 64 57 72 69 74 65 20 7c 7c 20 69 73 52 65 61  adWrite || isRea
24080 64 6f 6e 6c 79 29 29 3b 0a 20 20 61 73 73 65 72  donly));.  asser
24090 74 28 69 73 43 72 65 61 74 65 3d 3d 30 20 7c 7c  t(isCreate==0 ||
240a0 20 69 73 52 65 61 64 57 72 69 74 65 29 3b 0a 20   isReadWrite);. 
240b0 20 61 73 73 65 72 74 28 69 73 45 78 63 6c 75 73   assert(isExclus
240c0 69 76 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61  ive==0 || isCrea
240d0 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73  te);.  assert(is
240e0 44 65 6c 65 74 65 3d 3d 30 20 7c 7c 20 69 73 43  Delete==0 || isC
240f0 72 65 61 74 65 29 3b 0a 0a 20 20 2f 2a 20 54 68  reate);..  /* Th
24100 65 20 6d 61 69 6e 20 44 42 2c 20 6d 61 69 6e 20  e main DB, main 
24110 6a 6f 75 72 6e 61 6c 2c 20 57 41 4c 20 66 69 6c  journal, WAL fil
24120 65 20 61 6e 64 20 6d 61 73 74 65 72 20 6a 6f 75  e and master jou
24130 72 6e 61 6c 20 61 72 65 20 6e 65 76 65 72 0a 20  rnal are never. 
24140 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   ** automaticall
24150 79 20 64 65 6c 65 74 65 64 2e 20 4e 6f 72 20 61  y deleted. Nor a
24160 72 65 20 74 68 65 79 20 65 76 65 72 20 74 65 6d  re they ever tem
24170 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 20 2a  porary files.  *
24180 2f 0a 20 20 61 73 73 65 72 74 28 20 28 21 69 73  /.  assert( (!is
24190 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29  Delete && zName)
241a0 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54   || eType!=SQLIT
241b0 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29  E_OPEN_MAIN_DB )
241c0 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21 69 73  ;.  assert( (!is
241d0 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29  Delete && zName)
241e0 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54   || eType!=SQLIT
241f0 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
24200 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  NAL );.  assert(
24210 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a   (!isDelete && z
24220 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d  Name) || eType!=
24230 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54  SQLITE_OPEN_MAST
24240 45 52 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20  ER_JOURNAL );.  
24250 61 73 73 65 72 74 28 20 28 21 69 73 44 65 6c 65  assert( (!isDele
24260 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20  te && zName) || 
24270 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50  eType!=SQLITE_OP
24280 45 4e 5f 57 41 4c 20 29 3b 0a 0a 20 20 2f 2a 20  EN_WAL );..  /* 
24290 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20  Assert that the 
242a0 75 70 70 65 72 20 6c 61 79 65 72 20 68 61 73 20  upper layer has 
242b0 73 65 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 22  set one of the "
242c0 66 69 6c 65 2d 74 79 70 65 22 20 66 6c 61 67 73  file-type" flags
242d0 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 65  . */.  assert( e
242e0 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
242f0 4e 5f 4d 41 49 4e 5f 44 42 20 20 20 20 20 20 7c  N_MAIN_DB      |
24300 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
24310 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 0a 20 20 20  OPEN_TEMP_DB.   
24320 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51      || eType==SQ
24330 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
24340 4f 55 52 4e 41 4c 20 7c 7c 20 65 54 79 70 65 3d  OURNAL || eType=
24350 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d  =SQLITE_OPEN_TEM
24360 50 5f 4a 4f 55 52 4e 41 4c 0a 20 20 20 20 20 20  P_JOURNAL.      
24370 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
24380 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41  E_OPEN_SUBJOURNA
24390 4c 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51  L   || eType==SQ
243a0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52  LITE_OPEN_MASTER
243b0 5f 4a 4f 55 52 4e 41 4c 0a 20 20 20 20 20 20 20  _JOURNAL.       
243c0 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
243d0 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f  _OPEN_TRANSIENT_
243e0 44 42 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c  DB || eType==SQL
243f0 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 29  ITE_OPEN_WAL.  )
24400 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  ;..  assert( pFi
24410 6c 65 21 3d 30 20 29 3b 0a 20 20 6d 65 6d 73 65  le!=0 );.  memse
24420 74 28 70 46 69 6c 65 2c 20 30 2c 20 73 69 7a 65  t(pFile, 0, size
24430 6f 66 28 77 69 6e 46 69 6c 65 29 29 3b 0a 20 20  of(winFile));.  
24440 70 46 69 6c 65 2d 3e 68 20 3d 20 49 4e 56 41 4c  pFile->h = INVAL
24450 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 3b  ID_HANDLE_VALUE;
24460 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
24470 57 49 4e 52 54 0a 20 20 69 66 28 20 21 7a 55 74  WINRT.  if( !zUt
24480 66 38 4e 61 6d 65 20 26 26 20 21 73 71 6c 69 74  f8Name && !sqlit
24490 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72  e3_temp_director
244a0 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
244b0 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 45 52 52 4f  _log(SQLITE_ERRO
244c0 52 2c 0a 20 20 20 20 20 20 20 20 22 73 71 6c 69  R,.        "sqli
244d0 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f  te3_temp_directo
244e0 72 79 20 76 61 72 69 61 62 6c 65 20 73 68 6f 75  ry variable shou
244f0 6c 64 20 62 65 20 73 65 74 20 66 6f 72 20 57 69  ld be set for Wi
24500 6e 52 54 22 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  nRT");.  }.#endi
24510 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73  f..  /* If the s
24520 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74  econd argument t
24530 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  o this function 
24540 69 73 20 4e 55 4c 4c 2c 20 67 65 6e 65 72 61 74  is NULL, generat
24550 65 20 61 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61  e a.  ** tempora
24560 72 79 20 66 69 6c 65 20 6e 61 6d 65 20 74 6f 20  ry file name to 
24570 75 73 65 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  use.  */.  if( !
24580 7a 55 74 66 38 4e 61 6d 65 20 29 7b 0a 20 20 20  zUtf8Name ){.   
24590 20 61 73 73 65 72 74 28 20 69 73 44 65 6c 65 74   assert( isDelet
245a0 65 20 26 26 20 21 69 73 4f 70 65 6e 4a 6f 75 72  e && !isOpenJour
245b0 6e 61 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  nal );.    rc = 
245c0 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65 28 70  winGetTempname(p
245d0 56 66 73 2c 20 26 7a 54 6d 70 6e 61 6d 65 29 3b  Vfs, &zTmpname);
245e0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
245f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
24600 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 20 6e  OSTRACE(("OPEN n
24610 61 6d 65 3d 25 73 2c 20 72 63 3d 25 73 22 2c 20  ame=%s, rc=%s", 
24620 7a 55 74 66 38 4e 61 6d 65 2c 20 73 71 6c 69 74  zUtf8Name, sqlit
24630 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b  e3ErrName(rc)));
24640 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
24650 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 55 74 66  ;.    }.    zUtf
24660 38 4e 61 6d 65 20 3d 20 7a 54 6d 70 6e 61 6d 65  8Name = zTmpname
24670 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 61 74 61  ;.  }..  /* Data
24680 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 73 20 61  base filenames a
24690 72 65 20 64 6f 75 62 6c 65 2d 7a 65 72 6f 20 74  re double-zero t
246a0 65 72 6d 69 6e 61 74 65 64 20 69 66 20 74 68 65  erminated if the
246b0 79 20 61 72 65 20 6e 6f 74 0a 20 20 2a 2a 20 55  y are not.  ** U
246c0 52 49 73 20 77 69 74 68 20 70 61 72 61 6d 65 74  RIs with paramet
246d0 65 72 73 2e 20 20 48 65 6e 63 65 2c 20 74 68 65  ers.  Hence, the
246e0 79 20 63 61 6e 20 61 6c 77 61 79 73 20 62 65 20  y can always be 
246f0 70 61 73 73 65 64 20 69 6e 74 6f 0a 20 20 2a 2a  passed into.  **
24700 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72   sqlite3_uri_par
24710 61 6d 65 74 65 72 28 29 2e 0a 20 20 2a 2f 0a 20  ameter()..  */. 
24720 20 61 73 73 65 72 74 28 20 28 65 54 79 70 65 21   assert( (eType!
24730 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
24740 4e 5f 44 42 29 20 7c 7c 20 28 66 6c 61 67 73 20  N_DB) || (flags 
24750 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52  & SQLITE_OPEN_UR
24760 49 29 20 7c 7c 0a 20 20 20 20 20 20 20 7a 55 74  I) ||.       zUt
24770 66 38 4e 61 6d 65 5b 73 71 6c 69 74 65 33 53 74  f8Name[sqlite3St
24780 72 6c 65 6e 33 30 28 7a 55 74 66 38 4e 61 6d 65  rlen30(zUtf8Name
24790 29 2b 31 5d 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a  )+1]==0 );..  /*
247a0 20 43 6f 6e 76 65 72 74 20 74 68 65 20 66 69 6c   Convert the fil
247b0 65 6e 61 6d 65 20 74 6f 20 74 68 65 20 73 79 73  ename to the sys
247c0 74 65 6d 20 65 6e 63 6f 64 69 6e 67 2e 20 2a 2f  tem encoding. */
247d0 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20  .  zConverted = 
247e0 77 69 6e 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74  winConvertFromUt
247f0 66 38 46 69 6c 65 6e 61 6d 65 28 7a 55 74 66 38  f8Filename(zUtf8
24800 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f  Name);.  if( zCo
24810 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20  nverted==0 ){.  
24820 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
24830 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20 4f 53  Tmpname);.    OS
24840 54 52 41 43 45 28 28 22 4f 50 45 4e 20 6e 61 6d  TRACE(("OPEN nam
24850 65 3d 25 73 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%s, rc=SQLITE_
24860 49 4f 45 52 52 5f 4e 4f 4d 45 4d 22 2c 20 7a 55  IOERR_NOMEM", zU
24870 74 66 38 4e 61 6d 65 29 29 3b 0a 20 20 20 20 72  tf8Name));.    r
24880 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
24890 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20  RR_NOMEM;.  }.. 
248a0 20 69 66 28 20 77 69 6e 49 73 44 69 72 28 7a 43   if( winIsDir(zC
248b0 6f 6e 76 65 72 74 65 64 29 20 29 7b 0a 20 20 20  onverted) ){.   
248c0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
248d0 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 73  onverted);.    s
248e0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 6d 70  qlite3_free(zTmp
248f0 6e 61 6d 65 29 3b 0a 20 20 20 20 4f 53 54 52 41  name);.    OSTRA
24900 43 45 28 28 22 4f 50 45 4e 20 6e 61 6d 65 3d 25  CE(("OPEN name=%
24910 73 2c 20 72 63 3d 53 51 4c 49 54 45 5f 43 41 4e  s, rc=SQLITE_CAN
24920 54 4f 50 45 4e 5f 49 53 44 49 52 22 2c 20 7a 55  TOPEN_ISDIR", zU
24930 74 66 38 4e 61 6d 65 29 29 3b 0a 20 20 20 20 72  tf8Name));.    r
24940 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e  eturn SQLITE_CAN
24950 54 4f 50 45 4e 5f 49 53 44 49 52 3b 0a 20 20 7d  TOPEN_ISDIR;.  }
24960 0a 0a 20 20 69 66 28 20 69 73 52 65 61 64 57 72  ..  if( isReadWr
24970 69 74 65 20 29 7b 0a 20 20 20 20 64 77 44 65 73  ite ){.    dwDes
24980 69 72 65 64 41 63 63 65 73 73 20 3d 20 47 45 4e  iredAccess = GEN
24990 45 52 49 43 5f 52 45 41 44 20 7c 20 47 45 4e 45  ERIC_READ | GENE
249a0 52 49 43 5f 57 52 49 54 45 3b 0a 20 20 7d 65 6c  RIC_WRITE;.  }el
249b0 73 65 7b 0a 20 20 20 20 64 77 44 65 73 69 72 65  se{.    dwDesire
249c0 64 41 63 63 65 73 73 20 3d 20 47 45 4e 45 52 49  dAccess = GENERI
249d0 43 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a 20 20 2f  C_READ;.  }..  /
249e0 2a 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58  * SQLITE_OPEN_EX
249f0 43 4c 55 53 49 56 45 20 69 73 20 75 73 65 64 20  CLUSIVE is used 
24a00 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  to make sure tha
24a10 74 20 61 20 6e 65 77 20 66 69 6c 65 20 69 73 0a  t a new file is.
24a20 20 20 2a 2a 20 63 72 65 61 74 65 64 2e 20 53 51    ** created. SQ
24a30 4c 69 74 65 20 64 6f 65 73 6e 27 74 20 75 73 65  Lite doesn't use
24a40 20 69 74 20 74 6f 20 69 6e 64 69 63 61 74 65 20   it to indicate 
24a50 22 65 78 63 6c 75 73 69 76 65 20 61 63 63 65 73  "exclusive acces
24a60 73 22 0a 20 20 2a 2a 20 61 73 20 69 74 20 69 73  s".  ** as it is
24a70 20 75 73 75 61 6c 6c 79 20 75 6e 64 65 72 73 74   usually underst
24a80 6f 6f 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ood..  */.  if( 
24a90 69 73 45 78 63 6c 75 73 69 76 65 20 29 7b 0a 20  isExclusive ){. 
24aa0 20 20 20 2f 2a 20 43 72 65 61 74 65 73 20 61 20     /* Creates a 
24ab0 6e 65 77 20 66 69 6c 65 2c 20 6f 6e 6c 79 20 69  new file, only i
24ac0 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 61 6c  f it does not al
24ad0 72 65 61 64 79 20 65 78 69 73 74 2e 20 2a 2f 0a  ready exist. */.
24ae0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69      /* If the fi
24af0 6c 65 20 65 78 69 73 74 73 2c 20 69 74 20 66 61  le exists, it fa
24b00 69 6c 73 2e 20 2a 2f 0a 20 20 20 20 64 77 43 72  ils. */.    dwCr
24b10 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f  eationDispositio
24b20 6e 20 3d 20 43 52 45 41 54 45 5f 4e 45 57 3b 0a  n = CREATE_NEW;.
24b30 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73 43 72    }else if( isCr
24b40 65 61 74 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4f  eate ){.    /* O
24b50 70 65 6e 20 65 78 69 73 74 69 6e 67 20 66 69 6c  pen existing fil
24b60 65 2c 20 6f 72 20 63 72 65 61 74 65 20 69 66 20  e, or create if 
24b70 69 74 20 64 6f 65 73 6e 27 74 20 65 78 69 73 74  it doesn't exist
24b80 20 2a 2f 0a 20 20 20 20 64 77 43 72 65 61 74 69   */.    dwCreati
24b90 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 20 3d 20  onDisposition = 
24ba0 4f 50 45 4e 5f 41 4c 57 41 59 53 3b 0a 20 20 7d  OPEN_ALWAYS;.  }
24bb0 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4f 70 65  else{.    /* Ope
24bc0 6e 73 20 61 20 66 69 6c 65 2c 20 6f 6e 6c 79 20  ns a file, only 
24bd0 69 66 20 69 74 20 65 78 69 73 74 73 2e 20 2a 2f  if it exists. */
24be0 0a 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44  .    dwCreationD
24bf0 69 73 70 6f 73 69 74 69 6f 6e 20 3d 20 4f 50 45  isposition = OPE
24c00 4e 5f 45 58 49 53 54 49 4e 47 3b 0a 20 20 7d 0a  N_EXISTING;.  }.
24c10 0a 20 20 64 77 53 68 61 72 65 4d 6f 64 65 20 3d  .  dwShareMode =
24c20 20 46 49 4c 45 5f 53 48 41 52 45 5f 52 45 41 44   FILE_SHARE_READ
24c30 20 7c 20 46 49 4c 45 5f 53 48 41 52 45 5f 57 52   | FILE_SHARE_WR
24c40 49 54 45 3b 0a 0a 20 20 69 66 28 20 69 73 44 65  ITE;..  if( isDe
24c50 6c 65 74 65 20 29 7b 0a 23 69 66 20 53 51 4c 49  lete ){.#if SQLI
24c60 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20  TE_OS_WINCE.    
24c70 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62  dwFlagsAndAttrib
24c80 75 74 65 73 20 3d 20 46 49 4c 45 5f 41 54 54 52  utes = FILE_ATTR
24c90 49 42 55 54 45 5f 48 49 44 44 45 4e 3b 0a 20 20  IBUTE_HIDDEN;.  
24ca0 20 20 69 73 54 65 6d 70 20 3d 20 31 3b 0a 23 65    isTemp = 1;.#e
24cb0 6c 73 65 0a 20 20 20 20 64 77 46 6c 61 67 73 41  lse.    dwFlagsA
24cc0 6e 64 41 74 74 72 69 62 75 74 65 73 20 3d 20 46  ndAttributes = F
24cd0 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 54 45  ILE_ATTRIBUTE_TE
24ce0 4d 50 4f 52 41 52 59 0a 20 20 20 20 20 20 20 20  MPORARY.        
24cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24d00 20 20 20 20 20 20 20 7c 20 46 49 4c 45 5f 41 54         | FILE_AT
24d10 54 52 49 42 55 54 45 5f 48 49 44 44 45 4e 0a 20  TRIBUTE_HIDDEN. 
24d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
24d40 46 49 4c 45 5f 46 4c 41 47 5f 44 45 4c 45 54 45  FILE_FLAG_DELETE
24d50 5f 4f 4e 5f 43 4c 4f 53 45 3b 0a 23 65 6e 64 69  _ON_CLOSE;.#endi
24d60 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64  f.  }else{.    d
24d70 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75  wFlagsAndAttribu
24d80 74 65 73 20 3d 20 46 49 4c 45 5f 41 54 54 52 49  tes = FILE_ATTRI
24d90 42 55 54 45 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d  BUTE_NORMAL;.  }
24da0 0a 20 20 2f 2a 20 52 65 70 6f 72 74 73 20 66 72  .  /* Reports fr
24db0 6f 6d 20 74 68 65 20 69 6e 74 65 72 6e 65 74 20  om the internet 
24dc0 61 72 65 20 74 68 61 74 20 70 65 72 66 6f 72 6d  are that perform
24dd0 61 6e 63 65 20 69 73 20 61 6c 77 61 79 73 0a 20  ance is always. 
24de0 20 2a 2a 20 62 65 74 74 65 72 20 69 66 20 46 49   ** better if FI
24df0 4c 45 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d 5f 41  LE_FLAG_RANDOM_A
24e00 43 43 45 53 53 20 69 73 20 75 73 65 64 2e 20 20  CCESS is used.  
24e10 54 69 63 6b 65 74 20 23 32 36 39 39 2e 20 2a 2f  Ticket #2699. */
24e20 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
24e30 49 4e 43 45 0a 20 20 64 77 46 6c 61 67 73 41 6e  INCE.  dwFlagsAn
24e40 64 41 74 74 72 69 62 75 74 65 73 20 7c 3d 20 46  dAttributes |= F
24e50 49 4c 45 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d 5f  ILE_FLAG_RANDOM_
24e60 41 43 43 45 53 53 3b 0a 23 65 6e 64 69 66 0a 0a  ACCESS;.#endif..
24e70 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29    if( osIsNT() )
24e80 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  {.#if SQLITE_OS_
24e90 57 49 4e 52 54 0a 20 20 20 20 43 52 45 41 54 45  WINRT.    CREATE
24ea0 46 49 4c 45 32 5f 45 58 54 45 4e 44 45 44 5f 50  FILE2_EXTENDED_P
24eb0 41 52 41 4d 45 54 45 52 53 20 65 78 74 65 6e 64  ARAMETERS extend
24ec0 65 64 50 61 72 61 6d 65 74 65 72 73 3b 0a 20 20  edParameters;.  
24ed0 20 20 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65    extendedParame
24ee0 74 65 72 73 2e 64 77 53 69 7a 65 20 3d 20 73 69  ters.dwSize = si
24ef0 7a 65 6f 66 28 43 52 45 41 54 45 46 49 4c 45 32  zeof(CREATEFILE2
24f00 5f 45 58 54 45 4e 44 45 44 5f 50 41 52 41 4d 45  _EXTENDED_PARAME
24f10 54 45 52 53 29 3b 0a 20 20 20 20 65 78 74 65 6e  TERS);.    exten
24f20 64 65 64 50 61 72 61 6d 65 74 65 72 73 2e 64 77  dedParameters.dw
24f30 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 20 3d  FileAttributes =
24f40 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 77 46  .            dwF
24f50 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65  lagsAndAttribute
24f60 73 20 26 20 46 49 4c 45 5f 41 54 54 52 49 42 55  s & FILE_ATTRIBU
24f70 54 45 5f 4d 41 53 4b 3b 0a 20 20 20 20 65 78 74  TE_MASK;.    ext
24f80 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73 2e  endedParameters.
24f90 64 77 46 69 6c 65 46 6c 61 67 73 20 3d 20 64 77  dwFileFlags = dw
24fa0 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74  FlagsAndAttribut
24fb0 65 73 20 26 20 46 49 4c 45 5f 46 4c 41 47 5f 4d  es & FILE_FLAG_M
24fc0 41 53 4b 3b 0a 20 20 20 20 65 78 74 65 6e 64 65  ASK;.    extende
24fd0 64 50 61 72 61 6d 65 74 65 72 73 2e 64 77 53 65  dParameters.dwSe
24fe0 63 75 72 69 74 79 51 6f 73 46 6c 61 67 73 20 3d  curityQosFlags =
24ff0 20 53 45 43 55 52 49 54 59 5f 41 4e 4f 4e 59 4d   SECURITY_ANONYM
25000 4f 55 53 3b 0a 20 20 20 20 65 78 74 65 6e 64 65  OUS;.    extende
25010 64 50 61 72 61 6d 65 74 65 72 73 2e 6c 70 53 65  dParameters.lpSe
25020 63 75 72 69 74 79 41 74 74 72 69 62 75 74 65 73  curityAttributes
25030 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 65 78 74   = NULL;.    ext
25040 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73 2e  endedParameters.
25050 68 54 65 6d 70 6c 61 74 65 46 69 6c 65 20 3d 20  hTemplateFile = 
25060 4e 55 4c 4c 3b 0a 20 20 20 20 77 68 69 6c 65 28  NULL;.    while(
25070 20 28 68 20 3d 20 6f 73 43 72 65 61 74 65 46 69   (h = osCreateFi
25080 6c 65 32 28 28 4c 50 43 57 53 54 52 29 7a 43 6f  le2((LPCWSTR)zCo
25090 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20  nverted,.       
250a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
250b0 20 20 20 20 20 20 20 64 77 44 65 73 69 72 65 64         dwDesired
250c0 41 63 63 65 73 73 2c 0a 20 20 20 20 20 20 20 20  Access,.        
250d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
250e0 20 20 20 20 20 20 64 77 53 68 61 72 65 4d 6f 64        dwShareMod
250f0 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
25100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25110 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f   dwCreationDispo
25120 73 69 74 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20  sition,.        
25130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25140 20 20 20 20 20 20 26 65 78 74 65 6e 64 65 64 50        &extendedP
25150 61 72 61 6d 65 74 65 72 73 29 29 3d 3d 49 4e 56  arameters))==INV
25160 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
25170 45 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20  E &&.           
25180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25190 20 20 20 77 69 6e 52 65 74 72 79 49 6f 65 72 72     winRetryIoerr
251a0 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e  (&cnt, &lastErrn
251b0 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  o) ){.          
251c0 20 20 20 20 20 2f 2a 20 4e 6f 6f 70 20 2a 2f 0a       /* Noop */.
251d0 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20      }.#else.    
251e0 77 68 69 6c 65 28 20 28 68 20 3d 20 6f 73 43 72  while( (h = osCr
251f0 65 61 74 65 46 69 6c 65 57 28 28 4c 50 43 57 53  eateFileW((LPCWS
25200 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20  TR)zConverted,. 
25210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25220 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77 44               dwD
25230 65 73 69 72 65 64 41 63 63 65 73 73 2c 0a 20 20  esiredAccess,.  
25240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25250 20 20 20 20 20 20 20 20 20 20 20 20 64 77 53 68              dwSh
25260 61 72 65 4d 6f 64 65 2c 20 4e 55 4c 4c 2c 0a 20  areMode, NULL,. 
25270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25280 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77 43               dwC
25290 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69  reationDispositi
252a0 6f 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  on,.            
252b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
252c0 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72    dwFlagsAndAttr
252d0 69 62 75 74 65 73 2c 0a 20 20 20 20 20 20 20 20  ibutes,.        
252e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
252f0 20 20 20 20 20 20 4e 55 4c 4c 29 29 3d 3d 49 4e        NULL))==IN
25300 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c  VALID_HANDLE_VAL
25310 55 45 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  UE &&.          
25320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25330 20 20 20 20 77 69 6e 52 65 74 72 79 49 6f 65 72      winRetryIoer
25340 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72  r(&cnt, &lastErr
25350 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  no) ){.         
25360 20 20 20 20 20 20 2f 2a 20 4e 6f 6f 70 20 2a 2f        /* Noop */
25370 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
25380 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
25390 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20  WIN32_HAS_ANSI. 
253a0 20 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65   else{.    while
253b0 28 20 28 68 20 3d 20 6f 73 43 72 65 61 74 65 46  ( (h = osCreateF
253c0 69 6c 65 41 28 28 4c 50 43 53 54 52 29 7a 43 6f  ileA((LPCSTR)zCo
253d0 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20  nverted,.       
253e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
253f0 20 20 20 20 20 20 20 64 77 44 65 73 69 72 65 64         dwDesired
25400 41 63 63 65 73 73 2c 0a 20 20 20 20 20 20 20 20  Access,.        
25410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25420 20 20 20 20 20 20 64 77 53 68 61 72 65 4d 6f 64        dwShareMod
25430 65 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20  e, NULL,.       
25440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25450 20 20 20 20 20 20 20 64 77 43 72 65 61 74 69 6f         dwCreatio
25460 6e 44 69 73 70 6f 73 69 74 69 6f 6e 2c 0a 20 20  nDisposition,.  
25470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25480 20 20 20 20 20 20 20 20 20 20 20 20 64 77 46 6c              dwFl
25490 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73  agsAndAttributes
254a0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
254b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
254c0 4e 55 4c 4c 29 29 3d 3d 49 4e 56 41 4c 49 44 5f  NULL))==INVALID_
254d0 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 26 26 0a  HANDLE_VALUE &&.
254e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
254f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 69                wi
25500 6e 52 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74  nRetryIoerr(&cnt
25510 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b  , &lastErrno) ){
25520 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
25530 2f 2a 20 4e 6f 6f 70 20 2a 2f 0a 20 20 20 20 7d  /* Noop */.    }
25540 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 77 69  .  }.#endif.  wi
25550 6e 4c 6f 67 49 6f 65 72 72 28 63 6e 74 29 3b 0a  nLogIoerr(cnt);.
25560 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45  .  OSTRACE(("OPE
25570 4e 20 66 69 6c 65 3d 25 70 2c 20 6e 61 6d 65 3d  N file=%p, name=
25580 25 73 2c 20 61 63 63 65 73 73 3d 25 6c 78 2c 20  %s, access=%lx, 
25590 72 63 3d 25 73 5c 6e 22 2c 20 68 2c 20 7a 55 74  rc=%s\n", h, zUt
255a0 66 38 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  f8Name,.        
255b0 20 20 20 64 77 44 65 73 69 72 65 64 41 63 63 65     dwDesiredAcce
255c0 73 73 2c 20 28 68 3d 3d 49 4e 56 41 4c 49 44 5f  ss, (h==INVALID_
255d0 48 41 4e 44 4c 45 5f 56 41 4c 55 45 29 20 3f 20  HANDLE_VALUE) ? 
255e0 22 66 61 69 6c 65 64 22 20 3a 20 22 6f 6b 22 29  "failed" : "ok")
255f0 29 3b 0a 0a 20 20 69 66 28 20 68 3d 3d 49 4e 56  );..  if( h==INV
25600 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
25610 45 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  E ){.    pFile->
25620 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74  lastErrno = last
25630 45 72 72 6e 6f 3b 0a 20 20 20 20 77 69 6e 4c 6f  Errno;.    winLo
25640 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41  gError(SQLITE_CA
25650 4e 54 4f 50 45 4e 2c 20 70 46 69 6c 65 2d 3e 6c  NTOPEN, pFile->l
25660 61 73 74 45 72 72 6e 6f 2c 20 22 77 69 6e 4f 70  astErrno, "winOp
25670 65 6e 22 2c 20 7a 55 74 66 38 4e 61 6d 65 29 3b  en", zUtf8Name);
25680 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
25690 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
256a0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
256b0 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20 69  zTmpname);.    i
256c0 66 28 20 69 73 52 65 61 64 57 72 69 74 65 20 26  f( isReadWrite &
256d0 26 20 21 69 73 45 78 63 6c 75 73 69 76 65 20 29  & !isExclusive )
256e0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 77  {.      return w
256f0 69 6e 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4e 61  inOpen(pVfs, zNa
25700 6d 65 2c 20 69 64 2c 0a 20 20 20 20 20 20 20 20  me, id,.        
25710 20 28 28 66 6c 61 67 73 7c 53 51 4c 49 54 45 5f   ((flags|SQLITE_
25720 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 20 26  OPEN_READONLY) &
25730 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
25740 20 20 20 20 20 20 7e 28 53 51 4c 49 54 45 5f 4f        ~(SQLITE_O
25750 50 45 4e 5f 43 52 45 41 54 45 7c 53 51 4c 49 54  PEN_CREATE|SQLIT
25760 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
25770 29 29 2c 0a 20 20 20 20 20 20 20 20 20 70 4f 75  )),.         pOu
25780 74 46 6c 61 67 73 29 3b 0a 20 20 20 20 7d 65 6c  tFlags);.    }el
25790 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  se{.      return
257a0 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
257b0 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d  _BKPT;.    }.  }
257c0 0a 0a 20 20 69 66 28 20 70 4f 75 74 46 6c 61 67  ..  if( pOutFlag
257d0 73 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73 52  s ){.    if( isR
257e0 65 61 64 57 72 69 74 65 20 29 7b 0a 20 20 20 20  eadWrite ){.    
257f0 20 20 2a 70 4f 75 74 46 6c 61 67 73 20 3d 20 53    *pOutFlags = S
25800 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
25810 52 49 54 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  RITE;.    }else{
25820 0a 20 20 20 20 20 20 2a 70 4f 75 74 46 6c 61 67  .      *pOutFlag
25830 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s = SQLITE_OPEN_
25840 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a  READONLY;.    }.
25850 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28 28    }..  OSTRACE((
25860 22 4f 50 45 4e 20 66 69 6c 65 3d 25 70 2c 20 6e  "OPEN file=%p, n
25870 61 6d 65 3d 25 73 2c 20 61 63 63 65 73 73 3d 25  ame=%s, access=%
25880 6c 78 2c 20 70 4f 75 74 46 6c 61 67 73 3d 25 70  lx, pOutFlags=%p
25890 2c 20 2a 70 4f 75 74 46 6c 61 67 73 3d 25 64 2c  , *pOutFlags=%d,
258a0 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 22 72   ".           "r
258b0 63 3d 25 73 5c 6e 22 2c 20 68 2c 20 7a 55 74 66  c=%s\n", h, zUtf
258c0 38 4e 61 6d 65 2c 20 64 77 44 65 73 69 72 65 64  8Name, dwDesired
258d0 41 63 63 65 73 73 2c 20 70 4f 75 74 46 6c 61 67  Access, pOutFlag
258e0 73 2c 20 70 4f 75 74 46 6c 61 67 73 20 3f 0a 20  s, pOutFlags ?. 
258f0 20 20 20 20 20 20 20 20 20 20 2a 70 4f 75 74 46            *pOutF
25900 6c 61 67 73 20 3a 20 30 2c 20 28 68 3d 3d 49 4e  lags : 0, (h==IN
25910 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c  VALID_HANDLE_VAL
25920 55 45 29 20 3f 20 22 66 61 69 6c 65 64 22 20 3a  UE) ? "failed" :
25930 20 22 6f 6b 22 29 29 3b 0a 0a 23 69 66 20 53 51   "ok"));..#if SQ
25940 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
25950 69 66 28 20 69 73 52 65 61 64 57 72 69 74 65 20  if( isReadWrite 
25960 26 26 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  && eType==SQLITE
25970 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 0a 20 20  _OPEN_MAIN_DB.  
25980 20 20 20 20 20 26 26 20 28 72 63 20 3d 20 77 69       && (rc = wi
25990 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b 28 7a 4e  nceCreateLock(zN
259a0 61 6d 65 2c 20 70 46 69 6c 65 29 29 21 3d 53 51  ame, pFile))!=SQ
259b0 4c 49 54 45 5f 4f 4b 0a 20 20 29 7b 0a 20 20 20  LITE_OK.  ){.   
259c0 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 68   osCloseHandle(h
259d0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
259e0 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
259f0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
25a00 65 28 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20  e(zTmpname);.   
25a10 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 2d   OSTRACE(("OPEN-
25a20 43 45 2d 4c 4f 43 4b 20 6e 61 6d 65 3d 25 73 2c  CE-LOCK name=%s,
25a30 20 72 63 3d 25 73 5c 6e 22 2c 20 7a 4e 61 6d 65   rc=%s\n", zName
25a40 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65  , sqlite3ErrName
25a50 28 72 63 29 29 29 3b 0a 20 20 20 20 72 65 74 75  (rc)));.    retu
25a60 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28  rn rc;.  }.  if(
25a70 20 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 70   isTemp ){.    p
25a80 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43  File->zDeleteOnC
25a90 6c 6f 73 65 20 3d 20 7a 43 6f 6e 76 65 72 74 65  lose = zConverte
25aa0 64 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  d;.  }else.#endi
25ab0 66 0a 20 20 7b 0a 20 20 20 20 73 71 6c 69 74 65  f.  {.    sqlite
25ac0 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
25ad0 64 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74  d);.  }..  sqlit
25ae0 65 33 5f 66 72 65 65 28 7a 54 6d 70 6e 61 6d 65  e3_free(zTmpname
25af0 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 4d 65 74  );.  pFile->pMet
25b00 68 6f 64 20 3d 20 26 77 69 6e 49 6f 4d 65 74 68  hod = &winIoMeth
25b10 6f 64 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 56 66  od;.  pFile->pVf
25b20 73 20 3d 20 70 56 66 73 3b 0a 20 20 70 46 69 6c  s = pVfs;.  pFil
25b30 65 2d 3e 68 20 3d 20 68 3b 0a 20 20 69 66 28 20  e->h = h;.  if( 
25b40 69 73 52 65 61 64 6f 6e 6c 79 20 29 7b 0a 20 20  isReadonly ){.  
25b50 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61    pFile->ctrlFla
25b60 67 73 20 7c 3d 20 57 49 4e 46 49 4c 45 5f 52 44  gs |= WINFILE_RD
25b70 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ONLY;.  }.  if( 
25b80 73 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c  sqlite3_uri_bool
25b90 65 61 6e 28 7a 4e 61 6d 65 2c 20 22 70 73 6f 77  ean(zName, "psow
25ba0 22 2c 20 53 51 4c 49 54 45 5f 50 4f 57 45 52 53  ", SQLITE_POWERS
25bb0 41 46 45 5f 4f 56 45 52 57 52 49 54 45 29 20 29  AFE_OVERWRITE) )
25bc0 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72  {.    pFile->ctr
25bd0 6c 46 6c 61 67 73 20 7c 3d 20 57 49 4e 46 49 4c  lFlags |= WINFIL
25be0 45 5f 50 53 4f 57 3b 0a 20 20 7d 0a 20 20 70 46  E_PSOW;.  }.  pF
25bf0 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
25c00 20 4e 4f 5f 45 52 52 4f 52 3b 0a 20 20 70 46 69   NO_ERROR;.  pFi
25c10 6c 65 2d 3e 7a 50 61 74 68 20 3d 20 7a 4e 61 6d  le->zPath = zNam
25c20 65 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  e;.#if SQLITE_MA
25c30 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
25c40 70 46 69 6c 65 2d 3e 68 4d 61 70 20 3d 20 4e 55  pFile->hMap = NU
25c50 4c 4c 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 4d 61  LL;.  pFile->pMa
25c60 70 52 65 67 69 6f 6e 20 3d 20 30 3b 0a 20 20 70  pRegion = 0;.  p
25c70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d  File->mmapSize =
25c80 20 30 3b 0a 20 20 70 46 69 6c 65 2d 3e 6d 6d 61   0;.  pFile->mma
25c90 70 53 69 7a 65 41 63 74 75 61 6c 20 3d 20 30 3b  pSizeActual = 0;
25ca0 0a 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69  .  pFile->mmapSi
25cb0 7a 65 4d 61 78 20 3d 20 73 71 6c 69 74 65 33 47  zeMax = sqlite3G
25cc0 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4d 6d  lobalConfig.szMm
25cd0 61 70 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 4f 70  ap;.#endif..  Op
25ce0 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29 3b 0a 20  enCounter(+1);. 
25cf0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
25d00 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20  *.** Delete the 
25d10 6e 61 6d 65 64 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  named file..**.*
25d20 2a 20 4e 6f 74 65 20 74 68 61 74 20 57 69 6e 64  * Note that Wind
25d30 6f 77 73 20 64 6f 65 73 20 6e 6f 74 20 61 6c 6c  ows does not all
25d40 6f 77 20 61 20 66 69 6c 65 20 74 6f 20 62 65 20  ow a file to be 
25d50 64 65 6c 65 74 65 64 20 69 66 20 73 6f 6d 65 20  deleted if some 
25d60 6f 74 68 65 72 0a 2a 2a 20 70 72 6f 63 65 73 73  other.** process
25d70 20 68 61 73 20 69 74 20 6f 70 65 6e 2e 20 20 53   has it open.  S
25d80 6f 6d 65 74 69 6d 65 73 20 61 20 76 69 72 75 73  ometimes a virus
25d90 20 73 63 61 6e 6e 65 72 20 6f 72 20 69 6e 64 65   scanner or inde
25da0 78 69 6e 67 20 70 72 6f 67 72 61 6d 0a 2a 2a 20  xing program.** 
25db0 77 69 6c 6c 20 6f 70 65 6e 20 61 20 6a 6f 75 72  will open a jour
25dc0 6e 61 6c 20 66 69 6c 65 20 73 68 6f 72 74 6c 79  nal file shortly
25dd0 20 61 66 74 65 72 20 69 74 20 69 73 20 63 72 65   after it is cre
25de0 61 74 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f  ated in order to
25df0 20 64 6f 0a 2a 2a 20 77 68 61 74 65 76 65 72 20   do.** whatever 
25e00 69 74 20 64 6f 65 73 2e 20 20 57 68 69 6c 65 20  it does.  While 
25e10 74 68 69 73 20 6f 74 68 65 72 20 70 72 6f 63 65  this other proce
25e20 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68  ss is holding th
25e30 65 0a 2a 2a 20 66 69 6c 65 20 6f 70 65 6e 2c 20  e.** file open, 
25e40 77 65 20 77 69 6c 6c 20 62 65 20 75 6e 61 62 6c  we will be unabl
25e50 65 20 74 6f 20 64 65 6c 65 74 65 20 69 74 2e 20  e to delete it. 
25e60 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20   To work around 
25e70 74 68 69 73 0a 2a 2a 20 70 72 6f 62 6c 65 6d 2c  this.** problem,
25e80 20 77 65 20 64 65 6c 61 79 20 31 30 30 20 6d 69   we delay 100 mi
25e90 6c 6c 69 73 65 63 6f 6e 64 73 20 61 6e 64 20 74  lliseconds and t
25ea0 72 79 20 74 6f 20 64 65 6c 65 74 65 20 61 67 61  ry to delete aga
25eb0 69 6e 2e 20 20 55 70 0a 2a 2a 20 74 6f 20 4d 58  in.  Up.** to MX
25ec0 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d 50  _DELETION_ATTEMP
25ed0 54 73 20 64 65 6c 65 74 69 6f 6e 20 61 74 74 65  Ts deletion atte
25ee0 6d 70 74 73 20 61 72 65 20 72 75 6e 20 62 65 66  mpts are run bef
25ef0 6f 72 65 20 67 69 76 69 6e 67 0a 2a 2a 20 75 70  ore giving.** up
25f00 20 61 6e 64 20 72 65 74 75 72 6e 69 6e 67 20 61   and returning a
25f10 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74  n error..*/.stat
25f20 69 63 20 69 6e 74 20 77 69 6e 44 65 6c 65 74 65  ic int winDelete
25f30 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
25f40 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20 20 20  *pVfs,          
25f50 2f 2a 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20 77  /* Not used on w
25f60 69 6e 33 32 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  in32 */.  const 
25f70 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
25f80 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
25f90 20 66 69 6c 65 20 74 6f 20 64 65 6c 65 74 65 20   file to delete 
25fa0 2a 2f 0a 20 20 69 6e 74 20 73 79 6e 63 44 69 72  */.  int syncDir
25fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25fc0 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20   /* Not used on 
25fd0 77 69 6e 33 32 20 2a 2f 0a 29 7b 0a 20 20 69 6e  win32 */.){.  in
25fe0 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74  t cnt = 0;.  int
25ff0 20 72 63 3b 0a 20 20 44 57 4f 52 44 20 61 74 74   rc;.  DWORD att
26000 72 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45  r;.  DWORD lastE
26010 72 72 6e 6f 20 3d 20 30 3b 0a 20 20 76 6f 69 64  rrno = 0;.  void
26020 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20   *zConverted;.  
26030 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
26040 28 70 56 66 73 29 3b 0a 20 20 55 4e 55 53 45 44  (pVfs);.  UNUSED
26050 5f 50 41 52 41 4d 45 54 45 52 28 73 79 6e 63 44  _PARAMETER(syncD
26060 69 72 29 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65  ir);..  Simulate
26070 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53  IOError(return S
26080 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45  QLITE_IOERR_DELE
26090 54 45 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  TE);.  OSTRACE((
260a0 22 44 45 4c 45 54 45 20 6e 61 6d 65 3d 25 73 2c  "DELETE name=%s,
260b0 20 73 79 6e 63 44 69 72 3d 25 64 5c 6e 22 2c 20   syncDir=%d\n", 
260c0 7a 46 69 6c 65 6e 61 6d 65 2c 20 73 79 6e 63 44  zFilename, syncD
260d0 69 72 29 29 3b 0a 0a 20 20 7a 43 6f 6e 76 65 72  ir));..  zConver
260e0 74 65 64 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74  ted = winConvert
260f0 46 72 6f 6d 55 74 66 38 46 69 6c 65 6e 61 6d 65  FromUtf8Filename
26100 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69  (zFilename);.  i
26110 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30  f( zConverted==0
26120 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28   ){.    OSTRACE(
26130 28 22 44 45 4c 45 54 45 20 6e 61 6d 65 3d 25 73  ("DELETE name=%s
26140 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52  , rc=SQLITE_IOER
26150 52 5f 4e 4f 4d 45 4d 5c 6e 22 2c 20 7a 46 69 6c  R_NOMEM\n", zFil
26160 65 6e 61 6d 65 29 29 3b 0a 20 20 20 20 72 65 74  ename));.    ret
26170 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
26180 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66  _NOMEM;.  }.  if
26190 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 20  ( osIsNT() ){.  
261a0 20 20 64 6f 20 7b 0a 23 69 66 20 53 51 4c 49 54    do {.#if SQLIT
261b0 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 20  E_OS_WINRT.     
261c0 20 57 49 4e 33 32 5f 46 49 4c 45 5f 41 54 54 52   WIN32_FILE_ATTR
261d0 49 42 55 54 45 5f 44 41 54 41 20 73 41 74 74 72  IBUTE_DATA sAttr
261e0 44 61 74 61 3b 0a 20 20 20 20 20 20 6d 65 6d 73  Data;.      mems
261f0 65 74 28 26 73 41 74 74 72 44 61 74 61 2c 20 30  et(&sAttrData, 0
26200 2c 20 73 69 7a 65 6f 66 28 73 41 74 74 72 44 61  , sizeof(sAttrDa
26210 74 61 29 29 3b 0a 20 20 20 20 20 20 69 66 20 28  ta));.      if (
26220 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62   osGetFileAttrib
26230 75 74 65 73 45 78 57 28 7a 43 6f 6e 76 65 72 74  utesExW(zConvert
26240 65 64 2c 20 47 65 74 46 69 6c 65 45 78 49 6e 66  ed, GetFileExInf
26250 6f 53 74 61 6e 64 61 72 64 2c 0a 20 20 20 20 20  oStandard,.     
26260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26270 20 20 20 20 20 20 20 20 20 20 20 20 20 26 73 41               &sA
26280 74 74 72 44 61 74 61 29 20 29 7b 0a 20 20 20 20  ttrData) ){.    
26290 20 20 20 20 61 74 74 72 20 3d 20 73 41 74 74 72      attr = sAttr
262a0 44 61 74 61 2e 64 77 46 69 6c 65 41 74 74 72 69  Data.dwFileAttri
262b0 62 75 74 65 73 3b 0a 20 20 20 20 20 20 7d 65 6c  butes;.      }el
262c0 73 65 7b 0a 20 20 20 20 20 20 20 20 6c 61 73 74  se{.        last
262d0 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
262e0 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20  tError();.      
262f0 20 20 69 66 28 20 6c 61 73 74 45 72 72 6e 6f 3d    if( lastErrno=
26300 3d 45 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54 5f  =ERROR_FILE_NOT_
26310 46 4f 55 4e 44 0a 20 20 20 20 20 20 20 20 20 7c  FOUND.         |
26320 7c 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52  | lastErrno==ERR
26330 4f 52 5f 50 41 54 48 5f 4e 4f 54 5f 46 4f 55 4e  OR_PATH_NOT_FOUN
26340 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  D ){.          r
26350 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
26360 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 3b 20 2f  _DELETE_NOENT; /
26370 2a 20 41 6c 72 65 61 64 79 20 67 6f 6e 65 3f 20  * Already gone? 
26380 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  */.        }else
26390 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
263a0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
263b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
263c0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
263d0 23 65 6c 73 65 0a 20 20 20 20 20 20 61 74 74 72  #else.      attr
263e0 20 3d 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72   = osGetFileAttr
263f0 69 62 75 74 65 73 57 28 7a 43 6f 6e 76 65 72 74  ibutesW(zConvert
26400 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  ed);.#endif.    
26410 20 20 69 66 20 28 20 61 74 74 72 3d 3d 49 4e 56    if ( attr==INV
26420 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42  ALID_FILE_ATTRIB
26430 55 54 45 53 20 29 7b 0a 20 20 20 20 20 20 20 20  UTES ){.        
26440 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
26450 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
26460 20 20 20 20 20 20 69 66 28 20 6c 61 73 74 45 72        if( lastEr
26470 72 6e 6f 3d 3d 45 52 52 4f 52 5f 46 49 4c 45 5f  rno==ERROR_FILE_
26480 4e 4f 54 5f 46 4f 55 4e 44 0a 20 20 20 20 20 20  NOT_FOUND.      
26490 20 20 20 7c 7c 20 6c 61 73 74 45 72 72 6e 6f 3d     || lastErrno=
264a0 3d 45 52 52 4f 52 5f 50 41 54 48 5f 4e 4f 54 5f  =ERROR_PATH_NOT_
264b0 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20 20 20 20  FOUND ){.       
264c0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
264d0 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e  OERR_DELETE_NOEN
264e0 54 3b 20 2f 2a 20 41 6c 72 65 61 64 79 20 67 6f  T; /* Already go
264f0 6e 65 3f 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d  ne? */.        }
26500 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
26510 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
26520 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  R;.        }.   
26530 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
26540 20 20 7d 0a 20 20 20 20 20 20 69 66 20 28 20 61    }.      if ( a
26550 74 74 72 26 46 49 4c 45 5f 41 54 54 52 49 42 55  ttr&FILE_ATTRIBU
26560 54 45 5f 44 49 52 45 43 54 4f 52 59 20 29 7b 0a  TE_DIRECTORY ){.
26570 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
26580 49 54 45 5f 45 52 52 4f 52 3b 20 2f 2a 20 46 69  ITE_ERROR; /* Fi
26590 6c 65 73 20 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20  les only. */.   
265a0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
265b0 20 20 7d 0a 20 20 20 20 20 20 69 66 20 28 20 6f    }.      if ( o
265c0 73 44 65 6c 65 74 65 46 69 6c 65 57 28 7a 43 6f  sDeleteFileW(zCo
265d0 6e 76 65 72 74 65 64 29 20 29 7b 0a 20 20 20 20  nverted) ){.    
265e0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
265f0 4f 4b 3b 20 2f 2a 20 44 65 6c 65 74 65 64 20 4f  OK; /* Deleted O
26600 4b 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72  K. */.        br
26610 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
26620 20 20 20 69 66 20 28 20 21 77 69 6e 52 65 74 72     if ( !winRetr
26630 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c 61  yIoerr(&cnt, &la
26640 73 74 45 72 72 6e 6f 29 20 29 7b 0a 20 20 20 20  stErrno) ){.    
26650 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
26660 45 52 52 4f 52 3b 20 2f 2a 20 4e 6f 20 6d 6f 72  ERROR; /* No mor
26670 65 20 72 65 74 72 69 65 73 2e 20 2a 2f 0a 20 20  e retries. */.  
26680 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
26690 20 20 20 7d 0a 20 20 20 20 7d 20 77 68 69 6c 65     }.    } while
266a0 28 31 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20  (1);.  }.#ifdef 
266b0 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
266c0 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20  _ANSI.  else{.  
266d0 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 61 74 74    do {.      att
266e0 72 20 3d 20 6f 73 47 65 74 46 69 6c 65 41 74 74  r = osGetFileAtt
266f0 72 69 62 75 74 65 73 41 28 7a 43 6f 6e 76 65 72  ributesA(zConver
26700 74 65 64 29 3b 0a 20 20 20 20 20 20 69 66 20 28  ted);.      if (
26710 20 61 74 74 72 3d 3d 49 4e 56 41 4c 49 44 5f 46   attr==INVALID_F
26720 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 20 29  ILE_ATTRIBUTES )
26730 7b 0a 20 20 20 20 20 20 20 20 6c 61 73 74 45 72  {.        lastEr
26740 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
26750 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 20 20  rror();.        
26760 69 66 28 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45  if( lastErrno==E
26770 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54 5f 46 4f  RROR_FILE_NOT_FO
26780 55 4e 44 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  UND.         || 
26790 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52  lastErrno==ERROR
267a0 5f 50 41 54 48 5f 4e 4f 54 5f 46 4f 55 4e 44 20  _PATH_NOT_FOUND 
267b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
267c0 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44  = SQLITE_IOERR_D
267d0 45 4c 45 54 45 5f 4e 4f 45 4e 54 3b 20 2f 2a 20  ELETE_NOENT; /* 
267e0 41 6c 72 65 61 64 79 20 67 6f 6e 65 3f 20 2a 2f  Already gone? */
267f0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
26800 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
26810 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
26820 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62       }.        b
26830 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
26840 20 20 20 20 69 66 20 28 20 61 74 74 72 26 46 49      if ( attr&FI
26850 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 44 49 52  LE_ATTRIBUTE_DIR
26860 45 43 54 4f 52 59 20 29 7b 0a 20 20 20 20 20 20  ECTORY ){.      
26870 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
26880 52 4f 52 3b 20 2f 2a 20 46 69 6c 65 73 20 6f 6e  ROR; /* Files on
26890 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 62  ly. */.        b
268a0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
268b0 20 20 20 20 69 66 20 28 20 6f 73 44 65 6c 65 74      if ( osDelet
268c0 65 46 69 6c 65 41 28 7a 43 6f 6e 76 65 72 74 65  eFileA(zConverte
268d0 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  d) ){.        rc
268e0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 2f 2a   = SQLITE_OK; /*
268f0 20 44 65 6c 65 74 65 64 20 4f 4b 2e 20 2a 2f 0a   Deleted OK. */.
26900 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
26910 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 20       }.      if 
26920 28 20 21 77 69 6e 52 65 74 72 79 49 6f 65 72 72  ( !winRetryIoerr
26930 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e  (&cnt, &lastErrn
26940 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  o) ){.        rc
26950 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
26960 20 2f 2a 20 4e 6f 20 6d 6f 72 65 20 72 65 74 72   /* No more retr
26970 69 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ies. */.        
26980 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
26990 20 20 20 7d 20 77 68 69 6c 65 28 31 29 3b 0a 20     } while(1);. 
269a0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
269b0 72 63 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45  rc && rc!=SQLITE
269c0 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f  _IOERR_DELETE_NO
269d0 45 4e 54 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ENT ){.    rc = 
269e0 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
269f0 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 2c  TE_IOERR_DELETE,
26a00 20 6c 61 73 74 45 72 72 6e 6f 2c 20 22 77 69 6e   lastErrno, "win
26a10 44 65 6c 65 74 65 22 2c 20 7a 46 69 6c 65 6e 61  Delete", zFilena
26a20 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  me);.  }else{.  
26a30 20 20 77 69 6e 4c 6f 67 49 6f 65 72 72 28 63 6e    winLogIoerr(cn
26a40 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  t);.  }.  sqlite
26a50 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
26a60 64 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  d);.  OSTRACE(("
26a70 44 45 4c 45 54 45 20 6e 61 6d 65 3d 25 73 2c 20  DELETE name=%s, 
26a80 72 63 3d 25 73 5c 6e 22 2c 20 7a 46 69 6c 65 6e  rc=%s\n", zFilen
26a90 61 6d 65 2c 20 73 71 6c 69 74 65 33 45 72 72 4e  ame, sqlite3ErrN
26aa0 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 72 65 74  ame(rc)));.  ret
26ab0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
26ac0 20 43 68 65 63 6b 20 74 68 65 20 65 78 69 73 74   Check the exist
26ad0 65 6e 63 65 20 61 6e 64 20 73 74 61 74 75 73 20  ence and status 
26ae0 6f 66 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  of a file..*/.st
26af0 61 74 69 63 20 69 6e 74 20 77 69 6e 41 63 63 65  atic int winAcce
26b00 73 73 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  ss(.  sqlite3_vf
26b10 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20  s *pVfs,        
26b20 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20   /* Not used on 
26b30 77 69 6e 33 32 20 2a 2f 0a 20 20 63 6f 6e 73 74  win32 */.  const
26b40 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
26b50 2c 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  ,     /* Name of
26b60 20 66 69 6c 65 20 74 6f 20 63 68 65 63 6b 20 2a   file to check *
26b70 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  /.  int flags,  
26b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26b90 2a 20 54 79 70 65 20 6f 66 20 74 65 73 74 20 74  * Type of test t
26ba0 6f 20 6d 61 6b 65 20 6f 6e 20 74 68 69 73 20 66  o make on this f
26bb0 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52  ile */.  int *pR
26bc0 65 73 4f 75 74 20 20 20 20 20 20 20 20 20 20 20  esOut           
26bd0 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 73 75      /* OUT: Resu
26be0 6c 74 20 2a 2f 0a 29 7b 0a 20 20 44 57 4f 52 44  lt */.){.  DWORD
26bf0 20 61 74 74 72 3b 0a 20 20 69 6e 74 20 72 63 20   attr;.  int rc 
26c00 3d 20 30 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73  = 0;.  DWORD las
26c10 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 20 20 76 6f  tErrno = 0;.  vo
26c20 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 0a  id *zConverted;.
26c30 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
26c40 45 52 28 70 56 66 73 29 3b 0a 0a 20 20 53 69 6d  ER(pVfs);..  Sim
26c50 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
26c60 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
26c70 52 5f 41 43 43 45 53 53 3b 20 29 3b 0a 20 20 4f  R_ACCESS; );.  O
26c80 53 54 52 41 43 45 28 28 22 41 43 43 45 53 53 20  STRACE(("ACCESS 
26c90 6e 61 6d 65 3d 25 73 2c 20 66 6c 61 67 73 3d 25  name=%s, flags=%
26ca0 78 2c 20 70 52 65 73 4f 75 74 3d 25 70 5c 6e 22  x, pResOut=%p\n"
26cb0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 7a 46 69  ,.           zFi
26cc0 6c 65 6e 61 6d 65 2c 20 66 6c 61 67 73 2c 20 70  lename, flags, p
26cd0 52 65 73 4f 75 74 29 29 3b 0a 0a 20 20 7a 43 6f  ResOut));..  zCo
26ce0 6e 76 65 72 74 65 64 20 3d 20 77 69 6e 43 6f 6e  nverted = winCon
26cf0 76 65 72 74 46 72 6f 6d 55 74 66 38 46 69 6c 65  vertFromUtf8File
26d00 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  name(zFilename);
26d10 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65  .  if( zConverte
26d20 64 3d 3d 30 20 29 7b 0a 20 20 20 20 4f 53 54 52  d==0 ){.    OSTR
26d30 41 43 45 28 28 22 41 43 43 45 53 53 20 6e 61 6d  ACE(("ACCESS nam
26d40 65 3d 25 73 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%s, rc=SQLITE_
26d50 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 2c 20  IOERR_NOMEM\n", 
26d60 7a 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 20  zFilename));.   
26d70 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
26d80 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  OERR_NOMEM;.  }.
26d90 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29    if( osIsNT() )
26da0 7b 0a 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20  {.    int cnt = 
26db0 30 3b 0a 20 20 20 20 57 49 4e 33 32 5f 46 49 4c  0;.    WIN32_FIL
26dc0 45 5f 41 54 54 52 49 42 55 54 45 5f 44 41 54 41  E_ATTRIBUTE_DATA
26dd0 20 73 41 74 74 72 44 61 74 61 3b 0a 20 20 20 20   sAttrData;.    
26de0 6d 65 6d 73 65 74 28 26 73 41 74 74 72 44 61 74  memset(&sAttrDat
26df0 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 41 74  a, 0, sizeof(sAt
26e00 74 72 44 61 74 61 29 29 3b 0a 20 20 20 20 77 68  trData));.    wh
26e10 69 6c 65 28 20 21 28 72 63 20 3d 20 6f 73 47 65  ile( !(rc = osGe
26e20 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 45  tFileAttributesE
26e30 78 57 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e  xW((LPCWSTR)zCon
26e40 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20  verted,.        
26e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26e60 20 20 20 20 20 47 65 74 46 69 6c 65 45 78 49 6e       GetFileExIn
26e70 66 6f 53 74 61 6e 64 61 72 64 2c 0a 20 20 20 20  foStandard,.    
26e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26e90 20 20 20 20 20 20 20 20 20 26 73 41 74 74 72 44           &sAttrD
26ea0 61 74 61 29 29 20 26 26 20 77 69 6e 52 65 74 72  ata)) && winRetr
26eb0 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c 61  yIoerr(&cnt, &la
26ec0 73 74 45 72 72 6e 6f 29 20 29 7b 7d 0a 20 20 20  stErrno) ){}.   
26ed0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
26ee0 20 2f 2a 20 46 6f 72 20 61 6e 20 53 51 4c 49 54   /* For an SQLIT
26ef0 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 20  E_ACCESS_EXISTS 
26f00 71 75 65 72 79 2c 20 74 72 65 61 74 20 61 20 7a  query, treat a z
26f10 65 72 6f 2d 6c 65 6e 67 74 68 20 66 69 6c 65 0a  ero-length file.
26f20 20 20 20 20 20 20 2a 2a 20 61 73 20 69 66 20 69        ** as if i
26f30 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  t does not exist
26f40 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
26f50 20 69 66 28 20 20 20 20 66 6c 61 67 73 3d 3d 53   if(    flags==S
26f60 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
26f70 53 54 53 0a 20 20 20 20 20 20 20 20 20 20 26 26  STS.          &&
26f80 20 73 41 74 74 72 44 61 74 61 2e 6e 46 69 6c 65   sAttrData.nFile
26f90 53 69 7a 65 48 69 67 68 3d 3d 30 0a 20 20 20 20  SizeHigh==0.    
26fa0 20 20 20 20 20 20 26 26 20 73 41 74 74 72 44 61        && sAttrDa
26fb0 74 61 2e 6e 46 69 6c 65 53 69 7a 65 4c 6f 77 3d  ta.nFileSizeLow=
26fc0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 74  =0 ){.        at
26fd0 74 72 20 3d 20 49 4e 56 41 4c 49 44 5f 46 49 4c  tr = INVALID_FIL
26fe0 45 5f 41 54 54 52 49 42 55 54 45 53 3b 0a 20 20  E_ATTRIBUTES;.  
26ff0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
27000 20 20 20 61 74 74 72 20 3d 20 73 41 74 74 72 44     attr = sAttrD
27010 61 74 61 2e 64 77 46 69 6c 65 41 74 74 72 69 62  ata.dwFileAttrib
27020 75 74 65 73 3b 0a 20 20 20 20 20 20 7d 0a 20 20  utes;.      }.  
27030 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 77    }else{.      w
27040 69 6e 4c 6f 67 49 6f 65 72 72 28 63 6e 74 29 3b  inLogIoerr(cnt);
27050 0a 20 20 20 20 20 20 69 66 28 20 6c 61 73 74 45  .      if( lastE
27060 72 72 6e 6f 21 3d 45 52 52 4f 52 5f 46 49 4c 45  rrno!=ERROR_FILE
27070 5f 4e 4f 54 5f 46 4f 55 4e 44 20 26 26 20 6c 61  _NOT_FOUND && la
27080 73 74 45 72 72 6e 6f 21 3d 45 52 52 4f 52 5f 50  stErrno!=ERROR_P
27090 41 54 48 5f 4e 4f 54 5f 46 4f 55 4e 44 20 29 7b  ATH_NOT_FOUND ){
270a0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
270b0 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
270c0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
270d0 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  n winLogError(SQ
270e0 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53  LITE_IOERR_ACCES
270f0 53 2c 20 6c 61 73 74 45 72 72 6e 6f 2c 20 22 77  S, lastErrno, "w
27100 69 6e 41 63 63 65 73 73 22 2c 0a 20 20 20 20 20  inAccess",.     
27110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27120 20 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 29        zFilename)
27130 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
27140 20 20 20 20 20 20 20 61 74 74 72 20 3d 20 49 4e         attr = IN
27150 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49  VALID_FILE_ATTRI
27160 42 55 54 45 53 3b 0a 20 20 20 20 20 20 7d 0a 20  BUTES;.      }. 
27170 20 20 20 7d 0a 20 20 7d 0a 23 69 66 64 65 66 20     }.  }.#ifdef 
27180 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
27190 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20  _ANSI.  else{.  
271a0 20 20 61 74 74 72 20 3d 20 6f 73 47 65 74 46 69    attr = osGetFi
271b0 6c 65 41 74 74 72 69 62 75 74 65 73 41 28 28 63  leAttributesA((c
271c0 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 29  har*)zConverted)
271d0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73  ;.  }.#endif.  s
271e0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e  qlite3_free(zCon
271f0 76 65 72 74 65 64 29 3b 0a 20 20 73 77 69 74 63  verted);.  switc
27200 68 28 20 66 6c 61 67 73 20 29 7b 0a 20 20 20 20  h( flags ){.    
27210 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45  case SQLITE_ACCE
27220 53 53 5f 52 45 41 44 3a 0a 20 20 20 20 63 61 73  SS_READ:.    cas
27230 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  e SQLITE_ACCESS_
27240 45 58 49 53 54 53 3a 0a 20 20 20 20 20 20 72 63  EXISTS:.      rc
27250 20 3d 20 61 74 74 72 21 3d 49 4e 56 41 4c 49 44   = attr!=INVALID
27260 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53  _FILE_ATTRIBUTES
27270 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
27280 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
27290 43 43 45 53 53 5f 52 45 41 44 57 52 49 54 45 3a  CCESS_READWRITE:
272a0 0a 20 20 20 20 20 20 72 63 20 3d 20 61 74 74 72  .      rc = attr
272b0 21 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41  !=INVALID_FILE_A
272c0 54 54 52 49 42 55 54 45 53 20 26 26 0a 20 20 20  TTRIBUTES &&.   
272d0 20 20 20 20 20 20 20 20 20 20 28 61 74 74 72 20            (attr 
272e0 26 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  & FILE_ATTRIBUTE
272f0 5f 52 45 41 44 4f 4e 4c 59 29 3d 3d 30 3b 0a 20  _READONLY)==0;. 
27300 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
27310 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 61  default:.      a
27320 73 73 65 72 74 28 21 22 49 6e 76 61 6c 69 64 20  ssert(!"Invalid 
27330 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 22 29  flags argument")
27340 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 4f 75 74  ;.  }.  *pResOut
27350 20 3d 20 72 63 3b 0a 20 20 4f 53 54 52 41 43 45   = rc;.  OSTRACE
27360 28 28 22 41 43 43 45 53 53 20 6e 61 6d 65 3d 25  (("ACCESS name=%
27370 73 2c 20 70 52 65 73 4f 75 74 3d 25 70 2c 20 2a  s, pResOut=%p, *
27380 70 52 65 73 4f 75 74 3d 25 64 2c 20 72 63 3d 53  pResOut=%d, rc=S
27390 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20  QLITE_OK\n",.   
273a0 20 20 20 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d          zFilenam
273b0 65 2c 20 70 52 65 73 4f 75 74 2c 20 2a 70 52 65  e, pResOut, *pRe
273c0 73 4f 75 74 29 29 3b 0a 20 20 72 65 74 75 72 6e  sOut));.  return
273d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
273e0 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20 6e 6f 6e  *.** Returns non
273f0 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 73 70 65  -zero if the spe
27400 63 69 66 69 65 64 20 70 61 74 68 20 6e 61 6d 65  cified path name
27410 20 73 74 61 72 74 73 20 77 69 74 68 20 61 20 64   starts with a d
27420 72 69 76 65 20 6c 65 74 74 65 72 0a 2a 2a 20 66  rive letter.** f
27430 6f 6c 6c 6f 77 65 64 20 62 79 20 61 20 63 6f 6c  ollowed by a col
27440 6f 6e 20 63 68 61 72 61 63 74 65 72 2e 0a 2a 2f  on character..*/
27450 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e  .static BOOL win
27460 49 73 44 72 69 76 65 4c 65 74 74 65 72 41 6e 64  IsDriveLetterAnd
27470 43 6f 6c 6f 6e 28 0a 20 20 63 6f 6e 73 74 20 63  Colon(.  const c
27480 68 61 72 20 2a 7a 50 61 74 68 6e 61 6d 65 0a 29  har *zPathname.)
27490 7b 0a 20 20 72 65 74 75 72 6e 20 28 20 73 71 6c  {.  return ( sql
274a0 69 74 65 33 49 73 61 6c 70 68 61 28 7a 50 61 74  ite3Isalpha(zPat
274b0 68 6e 61 6d 65 5b 30 5d 29 20 26 26 20 7a 50 61  hname[0]) && zPa
274c0 74 68 6e 61 6d 65 5b 31 5d 3d 3d 27 3a 27 20 29  thname[1]==':' )
274d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
274e0 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74  ns non-zero if t
274f0 68 65 20 73 70 65 63 69 66 69 65 64 20 70 61 74  he specified pat
27500 68 20 6e 61 6d 65 20 73 68 6f 75 6c 64 20 62 65  h name should be
27510 20 75 73 65 64 20 76 65 72 62 61 74 69 6d 2e 20   used verbatim. 
27520 20 49 66 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20   If.** non-zero 
27530 69 73 20 72 65 74 75 72 6e 65 64 20 66 72 6f 6d  is returned from
27540 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20   this function, 
27550 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  the calling func
27560 74 69 6f 6e 20 6d 75 73 74 20 73 69 6d 70 6c 79  tion must simply
27570 0a 2a 2a 20 75 73 65 20 74 68 65 20 70 72 6f 76  .** use the prov
27580 69 64 65 64 20 70 61 74 68 20 6e 61 6d 65 20 76  ided path name v
27590 65 72 62 61 74 69 6d 20 2d 4f 52 2d 20 72 65 73  erbatim -OR- res
275a0 6f 6c 76 65 20 69 74 20 69 6e 74 6f 20 61 20 66  olve it into a f
275b0 75 6c 6c 20 70 61 74 68 20 6e 61 6d 65 0a 2a 2a  ull path name.**
275c0 20 75 73 69 6e 67 20 74 68 65 20 47 65 74 46 75   using the GetFu
275d0 6c 6c 50 61 74 68 4e 61 6d 65 20 57 69 6e 33 32  llPathName Win32
275e0 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 20 28 69   API function (i
275f0 66 20 61 76 61 69 6c 61 62 6c 65 29 2e 0a 2a 2f  f available)..*/
27600 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e  .static BOOL win
27610 49 73 56 65 72 62 61 74 69 6d 50 61 74 68 6e 61  IsVerbatimPathna
27620 6d 65 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  me(.  const char
27630 20 2a 7a 50 61 74 68 6e 61 6d 65 0a 29 7b 0a 20   *zPathname.){. 
27640 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20   /*.  ** If the 
27650 70 61 74 68 20 6e 61 6d 65 20 73 74 61 72 74 73  path name starts
27660 20 77 69 74 68 20 61 20 66 6f 72 77 61 72 64 20   with a forward 
27670 73 6c 61 73 68 20 6f 72 20 61 20 62 61 63 6b 73  slash or a backs
27680 6c 61 73 68 2c 20 69 74 20 69 73 20 65 69 74 68  lash, it is eith
27690 65 72 0a 20 20 2a 2a 20 61 20 6c 65 67 61 6c 20  er.  ** a legal 
276a0 55 4e 43 20 6e 61 6d 65 2c 20 61 20 76 6f 6c 75  UNC name, a volu
276b0 6d 65 20 72 65 6c 61 74 69 76 65 20 70 61 74 68  me relative path
276c0 2c 20 6f 72 20 61 6e 20 61 62 73 6f 6c 75 74 65  , or an absolute
276d0 20 70 61 74 68 20 6e 61 6d 65 20 69 6e 20 74 68   path name in th
276e0 65 0a 20 20 2a 2a 20 22 55 6e 69 78 22 20 66 6f  e.  ** "Unix" fo
276f0 72 6d 61 74 20 6f 6e 20 57 69 6e 64 6f 77 73 2e  rmat on Windows.
27700 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 65 61    There is no ea
27710 73 79 20 77 61 79 20 74 6f 20 64 69 66 66 65 72  sy way to differ
27720 65 6e 74 69 61 74 65 20 62 65 74 77 65 65 6e 0a  entiate between.
27730 20 20 2a 2a 20 74 68 65 20 66 69 6e 61 6c 20 74    ** the final t
27740 77 6f 20 63 61 73 65 73 3b 20 74 68 65 72 65 66  wo cases; theref
27750 6f 72 65 2c 20 77 65 20 72 65 74 75 72 6e 20 74  ore, we return t
27760 68 65 20 73 61 66 65 72 20 72 65 74 75 72 6e 20  he safer return 
27770 76 61 6c 75 65 20 6f 66 20 54 52 55 45 0a 20 20  value of TRUE.  
27780 2a 2a 20 73 6f 20 74 68 61 74 20 63 61 6c 6c 65  ** so that calle
27790 72 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  rs of this funct
277a0 69 6f 6e 20 77 69 6c 6c 20 73 69 6d 70 6c 79 20  ion will simply 
277b0 75 73 65 20 69 74 20 76 65 72 62 61 74 69 6d 2e  use it verbatim.
277c0 0a 20 20 2a 2f 0a 20 20 69 66 20 28 20 77 69 6e  .  */.  if ( win
277d0 49 73 44 69 72 53 65 70 28 7a 50 61 74 68 6e 61  IsDirSep(zPathna
277e0 6d 65 5b 30 5d 29 20 29 7b 0a 20 20 20 20 72 65  me[0]) ){.    re
277f0 74 75 72 6e 20 54 52 55 45 3b 0a 20 20 7d 0a 0a  turn TRUE;.  }..
27800 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65    /*.  ** If the
27810 20 70 61 74 68 20 6e 61 6d 65 20 73 74 61 72 74   path name start
27820 73 20 77 69 74 68 20 61 20 6c 65 74 74 65 72 20  s with a letter 
27830 61 6e 64 20 61 20 63 6f 6c 6f 6e 20 69 74 20 69  and a colon it i
27840 73 20 65 69 74 68 65 72 20 61 20 76 6f 6c 75 6d  s either a volum
27850 65 0a 20 20 2a 2a 20 72 65 6c 61 74 69 76 65 20  e.  ** relative 
27860 70 61 74 68 20 6f 72 20 61 6e 20 61 62 73 6f 6c  path or an absol
27870 75 74 65 20 70 61 74 68 2e 20 20 43 61 6c 6c 65  ute path.  Calle
27880 72 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  rs of this funct
27890 69 6f 6e 20 6d 75 73 74 20 6e 6f 74 0a 20 20 2a  ion must not.  *
278a0 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 74 72 65  * attempt to tre
278b0 61 74 20 69 74 20 61 73 20 61 20 72 65 6c 61 74  at it as a relat
278c0 69 76 65 20 70 61 74 68 20 6e 61 6d 65 20 28 69  ive path name (i
278d0 2e 65 2e 20 74 68 65 79 20 73 68 6f 75 6c 64 20  .e. they should 
278e0 73 69 6d 70 6c 79 20 75 73 65 0a 20 20 2a 2a 20  simply use.  ** 
278f0 69 74 20 76 65 72 62 61 74 69 6d 29 2e 0a 20 20  it verbatim)..  
27900 2a 2f 0a 20 20 69 66 20 28 20 77 69 6e 49 73 44  */.  if ( winIsD
27910 72 69 76 65 4c 65 74 74 65 72 41 6e 64 43 6f 6c  riveLetterAndCol
27920 6f 6e 28 7a 50 61 74 68 6e 61 6d 65 29 20 29 7b  on(zPathname) ){
27930 0a 20 20 20 20 72 65 74 75 72 6e 20 54 52 55 45  .    return TRUE
27940 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
27950 20 49 66 20 77 65 20 67 65 74 20 74 6f 20 74 68   If we get to th
27960 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 20 70 61  is point, the pa
27970 74 68 20 6e 61 6d 65 20 73 68 6f 75 6c 64 20 61  th name should a
27980 6c 6d 6f 73 74 20 63 65 72 74 61 69 6e 6c 79 20  lmost certainly 
27990 62 65 20 61 20 70 75 72 65 6c 79 0a 20 20 2a 2a  be a purely.  **
279a0 20 72 65 6c 61 74 69 76 65 20 6f 6e 65 20 28 69   relative one (i
279b0 2e 65 2e 20 6e 6f 74 20 61 20 55 4e 43 20 6e 61  .e. not a UNC na
279c0 6d 65 2c 20 6e 6f 74 20 61 62 73 6f 6c 75 74 65  me, not absolute
279d0 2c 20 61 6e 64 20 6e 6f 74 20 76 6f 6c 75 6d 65  , and not volume
279e0 20 72 65 6c 61 74 69 76 65 29 2e 0a 20 20 2a 2f   relative)..  */
279f0 0a 20 20 72 65 74 75 72 6e 20 46 41 4c 53 45 3b  .  return FALSE;
27a00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 61  .}../*.** Turn a
27a10 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61   relative pathna
27a20 6d 65 20 69 6e 74 6f 20 61 20 66 75 6c 6c 20 70  me into a full p
27a30 61 74 68 6e 61 6d 65 2e 20 20 57 72 69 74 65 20  athname.  Write 
27a40 74 68 65 20 66 75 6c 6c 0a 2a 2a 20 70 61 74 68  the full.** path
27a50 6e 61 6d 65 20 69 6e 74 6f 20 7a 4f 75 74 5b 5d  name into zOut[]
27a60 2e 20 20 7a 4f 75 74 5b 5d 20 77 69 6c 6c 20 62  .  zOut[] will b
27a70 65 20 61 74 20 6c 65 61 73 74 20 70 56 66 73 2d  e at least pVfs-
27a80 3e 6d 78 50 61 74 68 6e 61 6d 65 0a 2a 2a 20 62  >mxPathname.** b
27a90 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2f  ytes in size..*/
27aa0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 46  .static int winF
27ab0 75 6c 6c 50 61 74 68 6e 61 6d 65 28 0a 20 20 73  ullPathname(.  s
27ac0 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
27ad0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
27ae0 50 6f 69 6e 74 65 72 20 74 6f 20 76 66 73 20 6f  Pointer to vfs o
27af0 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74  bject */.  const
27b00 20 63 68 61 72 20 2a 7a 52 65 6c 61 74 69 76 65   char *zRelative
27b10 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 73  ,        /* Poss
27b20 69 62 6c 79 20 72 65 6c 61 74 69 76 65 20 69 6e  ibly relative in
27b30 70 75 74 20 70 61 74 68 20 2a 2f 0a 20 20 69 6e  put path */.  in
27b40 74 20 6e 46 75 6c 6c 2c 20 20 20 20 20 20 20 20  t nFull,        
27b50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
27b60 69 7a 65 20 6f 66 20 6f 75 74 70 75 74 20 62 75  ize of output bu
27b70 66 66 65 72 20 69 6e 20 62 79 74 65 73 20 2a 2f  ffer in bytes */
27b80 0a 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 20 20  .  char *zFull  
27b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27ba0 20 2f 2a 20 4f 75 74 70 75 74 20 62 75 66 66 65   /* Output buffe
27bb0 72 20 2a 2f 0a 29 7b 0a 0a 23 69 66 20 64 65 66  r */.){..#if def
27bc0 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29  ined(__CYGWIN__)
27bd0 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
27be0 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
27bf0 45 5f 45 52 52 4f 52 20 29 3b 0a 20 20 55 4e 55  E_ERROR );.  UNU
27c00 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 46  SED_PARAMETER(nF
27c10 75 6c 6c 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ull);.  assert( 
27c20 6e 46 75 6c 6c 3e 3d 70 56 66 73 2d 3e 6d 78 50  nFull>=pVfs->mxP
27c30 61 74 68 6e 61 6d 65 20 29 3b 0a 20 20 69 66 20  athname );.  if 
27c40 28 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64  ( sqlite3_data_d
27c50 69 72 65 63 74 6f 72 79 20 26 26 20 21 77 69 6e  irectory && !win
27c60 49 73 56 65 72 62 61 74 69 6d 50 61 74 68 6e 61  IsVerbatimPathna
27c70 6d 65 28 7a 52 65 6c 61 74 69 76 65 29 20 29 7b  me(zRelative) ){
27c80 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 4e  .    /*.    ** N
27c90 4f 54 45 3a 20 57 65 20 61 72 65 20 64 65 61 6c  OTE: We are deal
27ca0 69 6e 67 20 77 69 74 68 20 61 20 72 65 6c 61 74  ing with a relat
27cb0 69 76 65 20 70 61 74 68 20 6e 61 6d 65 20 61 6e  ive path name an
27cc0 64 20 74 68 65 20 64 61 74 61 0a 20 20 20 20 2a  d the data.    *
27cd0 2a 20 20 20 20 20 20 20 64 69 72 65 63 74 6f 72  *       director
27ce0 79 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20  y has been set. 
27cf0 20 54 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20   Therefore, use 
27d00 69 74 20 61 73 20 74 68 65 20 62 61 73 69 73 0a  it as the basis.
27d10 20 20 20 20 2a 2a 20 20 20 20 20 20 20 66 6f 72      **       for
27d20 20 63 6f 6e 76 65 72 74 69 6e 67 20 74 68 65 20   converting the 
27d30 72 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61  relative path na
27d40 6d 65 20 74 6f 20 61 6e 20 61 62 73 6f 6c 75 74  me to an absolut
27d50 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 6f  e.    **       o
27d60 6e 65 20 62 79 20 70 72 65 70 65 6e 64 69 6e 67  ne by prepending
27d70 20 74 68 65 20 64 61 74 61 20 64 69 72 65 63 74   the data direct
27d80 6f 72 79 20 61 6e 64 20 61 20 73 6c 61 73 68 2e  ory and a slash.
27d90 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 68 61 72  .    */.    char
27da0 20 2a 7a 4f 75 74 20 3d 20 73 71 6c 69 74 65 33   *zOut = sqlite3
27db0 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 70 56 66 73  MallocZero( pVfs
27dc0 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 20 29  ->mxPathname+1 )
27dd0 3b 0a 20 20 20 20 69 66 28 20 21 7a 4f 75 74 20  ;.    if( !zOut 
27de0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
27df0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
27e00 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  EM;.    }.    if
27e10 28 20 63 79 67 77 69 6e 5f 63 6f 6e 76 5f 70 61  ( cygwin_conv_pa
27e20 74 68 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  th(.            
27e30 28 6f 73 49 73 4e 54 28 29 20 3f 20 43 43 50 5f  (osIsNT() ? CCP_
27e40 50 4f 53 49 58 5f 54 4f 5f 57 49 4e 5f 57 20 3a  POSIX_TO_WIN_W :
27e50 20 43 43 50 5f 50 4f 53 49 58 5f 54 4f 5f 57 49   CCP_POSIX_TO_WI
27e60 4e 5f 41 29 20 7c 0a 20 20 20 20 20 20 20 20 20  N_A) |.         
27e70 20 20 20 43 43 50 5f 52 45 4c 41 54 49 56 45 2c     CCP_RELATIVE,
27e80 20 7a 52 65 6c 61 74 69 76 65 2c 20 7a 4f 75 74   zRelative, zOut
27e90 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  , pVfs->mxPathna
27ea0 6d 65 2b 31 29 3c 30 20 29 7b 0a 20 20 20 20 20  me+1)<0 ){.     
27eb0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f   sqlite3_free(zO
27ec0 75 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ut);.      retur
27ed0 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  n winLogError(SQ
27ee0 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 43 4f  LITE_CANTOPEN_CO
27ef0 4e 56 50 41 54 48 2c 20 28 44 57 4f 52 44 29 65  NVPATH, (DWORD)e
27f00 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
27f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
27f20 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 31  winFullPathname1
27f30 22 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20  ", zRelative);. 
27f40 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
27f50 63 68 61 72 20 2a 7a 55 74 66 38 20 3d 20 77 69  char *zUtf8 = wi
27f60 6e 43 6f 6e 76 65 72 74 54 6f 55 74 66 38 46 69  nConvertToUtf8Fi
27f70 6c 65 6e 61 6d 65 28 7a 4f 75 74 29 3b 0a 20 20  lename(zOut);.  
27f80 20 20 20 20 69 66 28 20 21 7a 55 74 66 38 20 29      if( !zUtf8 )
27f90 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
27fa0 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20  3_free(zOut);.  
27fb0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
27fc0 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b  ITE_IOERR_NOMEM;
27fd0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
27fe0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
27ff0 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d  MIN(nFull, pVfs-
28000 3e 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46  >mxPathname), zF
28010 75 6c 6c 2c 20 22 25 73 25 63 25 73 22 2c 0a 20  ull, "%s%c%s",. 
28020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28030 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64 61        sqlite3_da
28040 74 61 5f 64 69 72 65 63 74 6f 72 79 2c 20 77 69  ta_directory, wi
28050 6e 47 65 74 44 69 72 53 65 70 28 29 2c 20 7a 55  nGetDirSep(), zU
28060 74 66 38 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  tf8);.      sqli
28070 74 65 33 5f 66 72 65 65 28 7a 55 74 66 38 29 3b  te3_free(zUtf8);
28080 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
28090 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20 7d  ree(zOut);.    }
280a0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68  .  }else{.    ch
280b0 61 72 20 2a 7a 4f 75 74 20 3d 20 73 71 6c 69 74  ar *zOut = sqlit
280c0 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 70 56  e3MallocZero( pV
280d0 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
280e0 20 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 4f 75   );.    if( !zOu
280f0 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  t ){.      retur
28100 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  n SQLITE_IOERR_N
28110 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  OMEM;.    }.    
28120 69 66 28 20 63 79 67 77 69 6e 5f 63 6f 6e 76 5f  if( cygwin_conv_
28130 70 61 74 68 28 0a 20 20 20 20 20 20 20 20 20 20  path(.          
28140 20 20 28 6f 73 49 73 4e 54 28 29 20 3f 20 43 43    (osIsNT() ? CC
28150 50 5f 50 4f 53 49 58 5f 54 4f 5f 57 49 4e 5f 57  P_POSIX_TO_WIN_W
28160 20 3a 20 43 43 50 5f 50 4f 53 49 58 5f 54 4f 5f   : CCP_POSIX_TO_
28170 57 49 4e 5f 41 29 2c 0a 20 20 20 20 20 20 20 20  WIN_A),.        
28180 20 20 20 20 7a 52 65 6c 61 74 69 76 65 2c 20 7a      zRelative, z
28190 4f 75 74 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74  Out, pVfs->mxPat
281a0 68 6e 61 6d 65 2b 31 29 3c 30 20 29 7b 0a 20 20  hname+1)<0 ){.  
281b0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
281c0 28 7a 4f 75 74 29 3b 0a 20 20 20 20 20 20 72 65  (zOut);.      re
281d0 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72  turn winLogError
281e0 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  (SQLITE_CANTOPEN
281f0 5f 43 4f 4e 56 50 41 54 48 2c 20 28 44 57 4f 52  _CONVPATH, (DWOR
28200 44 29 65 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  D)errno,.       
28210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28220 20 20 22 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61    "winFullPathna
28230 6d 65 32 22 2c 20 7a 52 65 6c 61 74 69 76 65 29  me2", zRelative)
28240 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
28250 20 20 20 63 68 61 72 20 2a 7a 55 74 66 38 20 3d     char *zUtf8 =
28260 20 77 69 6e 43 6f 6e 76 65 72 74 54 6f 55 74 66   winConvertToUtf
28270 38 46 69 6c 65 6e 61 6d 65 28 7a 4f 75 74 29 3b  8Filename(zOut);
28280 0a 20 20 20 20 20 20 69 66 28 20 21 7a 55 74 66  .      if( !zUtf
28290 38 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  8 ){.        sql
282a0 69 74 65 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b  ite3_free(zOut);
282b0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
282c0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
282d0 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  EM;.      }.    
282e0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
282f0 74 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70 56  tf(MIN(nFull, pV
28300 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 29 2c  fs->mxPathname),
28310 20 7a 46 75 6c 6c 2c 20 22 25 73 22 2c 20 7a 55   zFull, "%s", zU
28320 74 66 38 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  tf8);.      sqli
28330 74 65 33 5f 66 72 65 65 28 7a 55 74 66 38 29 3b  te3_free(zUtf8);
28340 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
28350 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20 7d  ree(zOut);.    }
28360 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
28370 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a  LITE_OK;.#endif.
28380 0a 23 69 66 20 28 53 51 4c 49 54 45 5f 4f 53 5f  .#if (SQLITE_OS_
28390 57 49 4e 43 45 20 7c 7c 20 53 51 4c 49 54 45 5f  WINCE || SQLITE_
283a0 4f 53 5f 57 49 4e 52 54 29 20 26 26 20 21 64 65  OS_WINRT) && !de
283b0 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f  fined(__CYGWIN__
283c0 29 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ).  SimulateIOEr
283d0 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
283e0 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20 20 2f 2a  TE_ERROR );.  /*
283f0 20 57 69 6e 43 45 20 68 61 73 20 6e 6f 20 63 6f   WinCE has no co
28400 6e 63 65 70 74 20 6f 66 20 61 20 72 65 6c 61 74  ncept of a relat
28410 69 76 65 20 70 61 74 68 6e 61 6d 65 2c 20 6f 72  ive pathname, or
28420 20 73 6f 20 49 20 61 6d 20 74 6f 6c 64 2e 20 2a   so I am told. *
28430 2f 0a 20 20 2f 2a 20 57 69 6e 52 54 20 68 61 73  /.  /* WinRT has
28440 20 6e 6f 20 77 61 79 20 74 6f 20 63 6f 6e 76 65   no way to conve
28450 72 74 20 61 20 72 65 6c 61 74 69 76 65 20 70 61  rt a relative pa
28460 74 68 20 74 6f 20 61 6e 20 61 62 73 6f 6c 75 74  th to an absolut
28470 65 20 6f 6e 65 2e 20 2a 2f 0a 20 20 69 66 20 28  e one. */.  if (
28480 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69   sqlite3_data_di
28490 72 65 63 74 6f 72 79 20 26 26 20 21 77 69 6e 49  rectory && !winI
284a0 73 56 65 72 62 61 74 69 6d 50 61 74 68 6e 61 6d  sVerbatimPathnam
284b0 65 28 7a 52 65 6c 61 74 69 76 65 29 20 29 7b 0a  e(zRelative) ){.
284c0 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 4e 4f      /*.    ** NO
284d0 54 45 3a 20 57 65 20 61 72 65 20 64 65 61 6c 69  TE: We are deali
284e0 6e 67 20 77 69 74 68 20 61 20 72 65 6c 61 74 69  ng with a relati
284f0 76 65 20 70 61 74 68 20 6e 61 6d 65 20 61 6e 64  ve path name and
28500 20 74 68 65 20 64 61 74 61 0a 20 20 20 20 2a 2a   the data.    **
28510 20 20 20 20 20 20 20 64 69 72 65 63 74 6f 72 79         directory
28520 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20 20   has been set.  
28530 54 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69  Therefore, use i
28540 74 20 61 73 20 74 68 65 20 62 61 73 69 73 0a 20  t as the basis. 
28550 20 20 20 2a 2a 20 20 20 20 20 20 20 66 6f 72 20     **       for 
28560 63 6f 6e 76 65 72 74 69 6e 67 20 74 68 65 20 72  converting the r
28570 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61 6d  elative path nam
28580 65 20 74 6f 20 61 6e 20 61 62 73 6f 6c 75 74 65  e to an absolute
28590 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 6f 6e  .    **       on
285a0 65 20 62 79 20 70 72 65 70 65 6e 64 69 6e 67 20  e by prepending 
285b0 74 68 65 20 64 61 74 61 20 64 69 72 65 63 74 6f  the data directo
285c0 72 79 20 61 6e 64 20 61 20 62 61 63 6b 73 6c 61  ry and a backsla
285d0 73 68 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  sh..    */.    s
285e0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
285f0 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d  MIN(nFull, pVfs-
28600 3e 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46  >mxPathname), zF
28610 75 6c 6c 2c 20 22 25 73 25 63 25 73 22 2c 0a 20  ull, "%s%c%s",. 
28620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28630 20 20 20 20 73 71 6c 69 74 65 33 5f 64 61 74 61      sqlite3_data
28640 5f 64 69 72 65 63 74 6f 72 79 2c 20 77 69 6e 47  _directory, winG
28650 65 74 44 69 72 53 65 70 28 29 2c 20 7a 52 65 6c  etDirSep(), zRel
28660 61 74 69 76 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  ative);.  }else{
28670 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
28680 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c  rintf(MIN(nFull,
28690 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
286a0 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 22 2c  e), zFull, "%s",
286b0 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 7d   zRelative);.  }
286c0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
286d0 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66  _OK;.#endif..#if
286e0 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43   !SQLITE_OS_WINC
286f0 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f  E && !SQLITE_OS_
28700 57 49 4e 52 54 20 26 26 20 21 64 65 66 69 6e 65  WINRT && !define
28710 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20  d(__CYGWIN__).  
28720 44 57 4f 52 44 20 6e 42 79 74 65 3b 0a 20 20 76  DWORD nByte;.  v
28730 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b  oid *zConverted;
28740 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74 3b 0a 0a  .  char *zOut;..
28750 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70 61 74    /* If this pat
28760 68 20 6e 61 6d 65 20 62 65 67 69 6e 73 20 77 69  h name begins wi
28770 74 68 20 22 2f 58 3a 22 2c 20 77 68 65 72 65 20  th "/X:", where 
28780 22 58 22 20 69 73 20 61 6e 79 20 61 6c 70 68 61  "X" is any alpha
28790 62 65 74 69 63 0a 20 20 2a 2a 20 63 68 61 72 61  betic.  ** chara
287a0 63 74 65 72 2c 20 64 69 73 63 61 72 64 20 74 68  cter, discard th
287b0 65 20 69 6e 69 74 69 61 6c 20 22 2f 22 20 66 72  e initial "/" fr
287c0 6f 6d 20 74 68 65 20 70 61 74 68 6e 61 6d 65 2e  om the pathname.
287d0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 52 65 6c  .  */.  if( zRel
287e0 61 74 69 76 65 5b 30 5d 3d 3d 27 2f 27 20 26 26  ative[0]=='/' &&
287f0 20 77 69 6e 49 73 44 72 69 76 65 4c 65 74 74 65   winIsDriveLette
28800 72 41 6e 64 43 6f 6c 6f 6e 28 7a 52 65 6c 61 74  rAndColon(zRelat
28810 69 76 65 2b 31 29 20 29 7b 0a 20 20 20 20 7a 52  ive+1) ){.    zR
28820 65 6c 61 74 69 76 65 2b 2b 3b 0a 20 20 7d 0a 0a  elative++;.  }..
28830 20 20 2f 2a 20 49 74 27 73 20 6f 64 64 20 74 6f    /* It's odd to
28840 20 73 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d   simulate an io-
28850 65 72 72 6f 72 20 68 65 72 65 2c 20 62 75 74 20  error here, but 
28860 72 65 61 6c 6c 79 20 74 68 69 73 20 69 73 20 6a  really this is j
28870 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74  ust.  ** using t
28880 68 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72  he io-error infr
28890 61 73 74 72 75 63 74 75 72 65 20 74 6f 20 74 65  astructure to te
288a0 73 74 20 74 68 61 74 20 53 51 4c 69 74 65 20 68  st that SQLite h
288b0 61 6e 64 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a  andles this.  **
288c0 20 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e   function failin
288d0 67 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  g. This function
288e0 20 63 6f 75 6c 64 20 66 61 69 6c 20 69 66 2c 20   could fail if, 
288f0 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65  for example, the
28900 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 77 6f  .  ** current wo
28910 72 6b 69 6e 67 20 64 69 72 65 63 74 6f 72 79 20  rking directory 
28920 68 61 73 20 62 65 65 6e 20 75 6e 6c 69 6e 6b 65  has been unlinke
28930 64 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61  d..  */.  Simula
28940 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
28950 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29  n SQLITE_ERROR )
28960 3b 0a 20 20 69 66 20 28 20 73 71 6c 69 74 65 33  ;.  if ( sqlite3
28970 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79 20  _data_directory 
28980 26 26 20 21 77 69 6e 49 73 56 65 72 62 61 74 69  && !winIsVerbati
28990 6d 50 61 74 68 6e 61 6d 65 28 7a 52 65 6c 61 74  mPathname(zRelat
289a0 69 76 65 29 20 29 7b 0a 20 20 20 20 2f 2a 0a 20  ive) ){.    /*. 
289b0 20 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 65 20 61     ** NOTE: We a
289c0 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20  re dealing with 
289d0 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 20  a relative path 
289e0 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 64 61 74  name and the dat
289f0 61 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 64  a.    **       d
28a00 69 72 65 63 74 6f 72 79 20 68 61 73 20 62 65 65  irectory has bee
28a10 6e 20 73 65 74 2e 20 20 54 68 65 72 65 66 6f 72  n set.  Therefor
28a20 65 2c 20 75 73 65 20 69 74 20 61 73 20 74 68 65  e, use it as the
28a30 20 62 61 73 69 73 0a 20 20 20 20 2a 2a 20 20 20   basis.    **   
28a40 20 20 20 20 66 6f 72 20 63 6f 6e 76 65 72 74 69      for converti
28a50 6e 67 20 74 68 65 20 72 65 6c 61 74 69 76 65 20  ng the relative 
28a60 70 61 74 68 20 6e 61 6d 65 20 74 6f 20 61 6e 20  path name to an 
28a70 61 62 73 6f 6c 75 74 65 0a 20 20 20 20 2a 2a 20  absolute.    ** 
28a80 20 20 20 20 20 20 6f 6e 65 20 62 79 20 70 72 65        one by pre
28a90 70 65 6e 64 69 6e 67 20 74 68 65 20 64 61 74 61  pending the data
28aa0 20 64 69 72 65 63 74 6f 72 79 20 61 6e 64 20 61   directory and a
28ab0 20 62 61 63 6b 73 6c 61 73 68 2e 0a 20 20 20 20   backslash..    
28ac0 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  */.    sqlite3_s
28ad0 6e 70 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c  nprintf(MIN(nFul
28ae0 6c 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  l, pVfs->mxPathn
28af0 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73  ame), zFull, "%s
28b00 25 63 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20  %c%s",.         
28b10 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
28b20 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f  te3_data_directo
28b30 72 79 2c 20 77 69 6e 47 65 74 44 69 72 53 65 70  ry, winGetDirSep
28b40 28 29 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a  (), zRelative);.
28b50 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
28b60 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 7a 43 6f 6e  E_OK;.  }.  zCon
28b70 76 65 72 74 65 64 20 3d 20 77 69 6e 43 6f 6e 76  verted = winConv
28b80 65 72 74 46 72 6f 6d 55 74 66 38 46 69 6c 65 6e  ertFromUtf8Filen
28b90 61 6d 65 28 7a 52 65 6c 61 74 69 76 65 29 3b 0a  ame(zRelative);.
28ba0 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64    if( zConverted
28bb0 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
28bc0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  n SQLITE_IOERR_N
28bd0 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20  OMEM;.  }.  if( 
28be0 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 20 20 20  osIsNT() ){.    
28bf0 4c 50 57 53 54 52 20 7a 54 65 6d 70 3b 0a 20 20  LPWSTR zTemp;.  
28c00 20 20 6e 42 79 74 65 20 3d 20 6f 73 47 65 74 46    nByte = osGetF
28c10 75 6c 6c 50 61 74 68 4e 61 6d 65 57 28 28 4c 50  ullPathNameW((LP
28c20 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64  CWSTR)zConverted
28c30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
28c40 69 66 28 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a  if( nByte==0 ){.
28c50 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
28c60 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
28c70 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e        return win
28c80 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
28c90 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54  CANTOPEN_FULLPAT
28ca0 48 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f  H, osGetLastErro
28cb0 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  r(),.           
28cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
28cd0 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 31 22  inFullPathname1"
28ce0 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20  , zRelative);.  
28cf0 20 20 7d 0a 20 20 20 20 6e 42 79 74 65 20 2b 3d    }.    nByte +=
28d00 20 33 3b 0a 20 20 20 20 7a 54 65 6d 70 20 3d 20   3;.    zTemp = 
28d10 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
28d20 6f 28 20 6e 42 79 74 65 2a 73 69 7a 65 6f 66 28  o( nByte*sizeof(
28d30 7a 54 65 6d 70 5b 30 5d 29 20 29 3b 0a 20 20 20  zTemp[0]) );.   
28d40 20 69 66 28 20 7a 54 65 6d 70 3d 3d 30 20 29 7b   if( zTemp==0 ){
28d50 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
28d60 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
28d70 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
28d80 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
28d90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 42 79 74  ;.    }.    nByt
28da0 65 20 3d 20 6f 73 47 65 74 46 75 6c 6c 50 61 74  e = osGetFullPat
28db0 68 4e 61 6d 65 57 28 28 4c 50 43 57 53 54 52 29  hNameW((LPCWSTR)
28dc0 7a 43 6f 6e 76 65 72 74 65 64 2c 20 6e 42 79 74  zConverted, nByt
28dd0 65 2c 20 7a 54 65 6d 70 2c 20 30 29 3b 0a 20 20  e, zTemp, 0);.  
28de0 20 20 69 66 28 20 6e 42 79 74 65 3d 3d 30 20 29    if( nByte==0 )
28df0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
28e00 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
28e10 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
28e20 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20 20  free(zTemp);.   
28e30 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67     return winLog
28e40 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e  Error(SQLITE_CAN
28e50 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48 2c 20  TOPEN_FULLPATH, 
28e60 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
28e70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
28e80 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 46             "winF
28e90 75 6c 6c 50 61 74 68 6e 61 6d 65 32 22 2c 20 7a  ullPathname2", z
28ea0 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 20 20 7d  Relative);.    }
28eb0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
28ec0 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
28ed0 20 20 20 7a 4f 75 74 20 3d 20 77 69 6e 55 6e 69     zOut = winUni
28ee0 63 6f 64 65 54 6f 55 74 66 38 28 7a 54 65 6d 70  codeToUtf8(zTemp
28ef0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
28f00 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20 7d 0a  ree(zTemp);.  }.
28f10 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49  #ifdef SQLITE_WI
28f20 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65  N32_HAS_ANSI.  e
28f30 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  lse{.    char *z
28f40 54 65 6d 70 3b 0a 20 20 20 20 6e 42 79 74 65 20  Temp;.    nByte 
28f50 3d 20 6f 73 47 65 74 46 75 6c 6c 50 61 74 68 4e  = osGetFullPathN
28f60 61 6d 65 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e  ameA((char*)zCon
28f70 76 65 72 74 65 64 2c 20 30 2c 20 30 2c 20 30 29  verted, 0, 0, 0)
28f80 3b 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65 3d  ;.    if( nByte=
28f90 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
28fa0 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
28fb0 74 65 64 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ted);.      retu
28fc0 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53  rn winLogError(S
28fd0 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46  QLITE_CANTOPEN_F
28fe0 55 4c 4c 50 41 54 48 2c 20 6f 73 47 65 74 4c 61  ULLPATH, osGetLa
28ff0 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20  stError(),.     
29000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29010 20 20 20 20 22 77 69 6e 46 75 6c 6c 50 61 74 68      "winFullPath
29020 6e 61 6d 65 33 22 2c 20 7a 52 65 6c 61 74 69 76  name3", zRelativ
29030 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 42  e);.    }.    nB
29040 79 74 65 20 2b 3d 20 33 3b 0a 20 20 20 20 7a 54  yte += 3;.    zT
29050 65 6d 70 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  emp = sqlite3Mal
29060 6c 6f 63 5a 65 72 6f 28 20 6e 42 79 74 65 2a 73  locZero( nByte*s
29070 69 7a 65 6f 66 28 7a 54 65 6d 70 5b 30 5d 29 20  izeof(zTemp[0]) 
29080 29 3b 0a 20 20 20 20 69 66 28 20 7a 54 65 6d 70  );.    if( zTemp
29090 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
290a0 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65  ite3_free(zConve
290b0 72 74 65 64 29 3b 0a 20 20 20 20 20 20 72 65 74  rted);.      ret
290c0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
290d0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
290e0 20 20 6e 42 79 74 65 20 3d 20 6f 73 47 65 74 46    nByte = osGetF
290f0 75 6c 6c 50 61 74 68 4e 61 6d 65 41 28 28 63 68  ullPathNameA((ch
29100 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20  ar*)zConverted, 
29110 6e 42 79 74 65 2c 20 7a 54 65 6d 70 2c 20 30 29  nByte, zTemp, 0)
29120 3b 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65 3d  ;.    if( nByte=
29130 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
29140 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
29150 74 65 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ted);.      sqli
29160 74 65 33 5f 66 72 65 65 28 7a 54 65 6d 70 29 3b  te3_free(zTemp);
29170 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69  .      return wi
29180 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
29190 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 41  _CANTOPEN_FULLPA
291a0 54 48 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72  TH, osGetLastErr
291b0 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20  or(),.          
291c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
291d0 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 34  winFullPathname4
291e0 22 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20  ", zRelative);. 
291f0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
29200 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
29210 29 3b 0a 20 20 20 20 7a 4f 75 74 20 3d 20 73 71  );.    zOut = sq
29220 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73  lite3_win32_mbcs
29230 5f 74 6f 5f 75 74 66 38 28 7a 54 65 6d 70 29 3b  _to_utf8(zTemp);
29240 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
29250 65 28 7a 54 65 6d 70 29 3b 0a 20 20 7d 0a 23 65  e(zTemp);.  }.#e
29260 6e 64 69 66 0a 20 20 69 66 28 20 7a 4f 75 74 20  ndif.  if( zOut 
29270 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ){.    sqlite3_s
29280 6e 70 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c  nprintf(MIN(nFul
29290 6c 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  l, pVfs->mxPathn
292a0 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73  ame), zFull, "%s
292b0 22 2c 20 7a 4f 75 74 29 3b 0a 20 20 20 20 73 71  ", zOut);.    sq
292c0 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 75 74 29  lite3_free(zOut)
292d0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
292e0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b  ITE_OK;.  }else{
292f0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
29300 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a  TE_IOERR_NOMEM;.
29310 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 69    }.#endif.}..#i
29320 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
29330 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  T_LOAD_EXTENSION
29340 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65  ./*.** Interface
29350 73 20 66 6f 72 20 6f 70 65 6e 69 6e 67 20 61 20  s for opening a 
29360 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20  shared library, 
29370 66 69 6e 64 69 6e 67 20 65 6e 74 72 79 20 70 6f  finding entry po
29380 69 6e 74 73 0a 2a 2a 20 77 69 74 68 69 6e 20 74  ints.** within t
29390 68 65 20 73 68 61 72 65 64 20 6c 69 62 72 61 72  he shared librar
293a0 79 2c 20 61 6e 64 20 63 6c 6f 73 69 6e 67 20 74  y, and closing t
293b0 68 65 20 73 68 61 72 65 64 20 6c 69 62 72 61 72  he shared librar
293c0 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  y..*/.static voi
293d0 64 20 2a 77 69 6e 44 6c 4f 70 65 6e 28 73 71 6c  d *winDlOpen(sql
293e0 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
293f0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
29400 65 6e 61 6d 65 29 7b 0a 20 20 48 41 4e 44 4c 45  ename){.  HANDLE
29410 20 68 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28   h;.#if defined(
29420 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20 69 6e  __CYGWIN__).  in
29430 74 20 6e 46 75 6c 6c 20 3d 20 70 56 66 73 2d 3e  t nFull = pVfs->
29440 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20  mxPathname+1;.  
29450 63 68 61 72 20 2a 7a 46 75 6c 6c 20 3d 20 73 71  char *zFull = sq
29460 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
29470 20 6e 46 75 6c 6c 20 29 3b 0a 20 20 76 6f 69 64   nFull );.  void
29480 20 2a 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 30   *zConverted = 0
29490 3b 0a 20 20 69 66 28 20 7a 46 75 6c 6c 3d 3d 30  ;.  if( zFull==0
294a0 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28   ){.    OSTRACE(
294b0 28 22 44 4c 4f 50 45 4e 20 6e 61 6d 65 3d 25 73  ("DLOPEN name=%s
294c0 2c 20 68 61 6e 64 6c 65 3d 25 70 5c 6e 22 2c 20  , handle=%p\n", 
294d0 7a 46 69 6c 65 6e 61 6d 65 2c 20 28 76 6f 69 64  zFilename, (void
294e0 2a 29 30 29 29 3b 0a 20 20 20 20 72 65 74 75 72  *)0));.    retur
294f0 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 77  n 0;.  }.  if( w
29500 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70  inFullPathname(p
29510 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20  Vfs, zFilename, 
29520 6e 46 75 6c 6c 2c 20 7a 46 75 6c 6c 29 21 3d 53  nFull, zFull)!=S
29530 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
29540 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75  sqlite3_free(zFu
29550 6c 6c 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45  ll);.    OSTRACE
29560 28 28 22 44 4c 4f 50 45 4e 20 6e 61 6d 65 3d 25  (("DLOPEN name=%
29570 73 2c 20 68 61 6e 64 6c 65 3d 25 70 5c 6e 22 2c  s, handle=%p\n",
29580 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 28 76 6f 69   zFilename, (voi
29590 64 2a 29 30 29 29 3b 0a 20 20 20 20 72 65 74 75  d*)0));.    retu
295a0 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 43 6f 6e  rn 0;.  }.  zCon
295b0 76 65 72 74 65 64 20 3d 20 77 69 6e 43 6f 6e 76  verted = winConv
295c0 65 72 74 46 72 6f 6d 55 74 66 38 46 69 6c 65 6e  ertFromUtf8Filen
295d0 61 6d 65 28 7a 46 75 6c 6c 29 3b 0a 20 20 73 71  ame(zFull);.  sq
295e0 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c  lite3_free(zFull
295f0 29 3b 0a 23 65 6c 73 65 0a 20 20 76 6f 69 64 20  );.#else.  void 
29600 2a 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77 69  *zConverted = wi
29610 6e 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66 38  nConvertFromUtf8
29620 46 69 6c 65 6e 61 6d 65 28 7a 46 69 6c 65 6e 61  Filename(zFilena
29630 6d 65 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  me);.  UNUSED_PA
29640 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 23  RAMETER(pVfs);.#
29650 65 6e 64 69 66 0a 20 20 69 66 28 20 7a 43 6f 6e  endif.  if( zCon
29660 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20  verted==0 ){.   
29670 20 4f 53 54 52 41 43 45 28 28 22 44 4c 4f 50 45   OSTRACE(("DLOPE
29680 4e 20 6e 61 6d 65 3d 25 73 2c 20 68 61 6e 64 6c  N name=%s, handl
29690 65 3d 25 70 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61  e=%p\n", zFilena
296a0 6d 65 2c 20 28 76 6f 69 64 2a 29 30 29 29 3b 0a  me, (void*)0));.
296b0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
296c0 7d 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29  }.  if( osIsNT()
296d0 20 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f   ){.#if SQLITE_O
296e0 53 5f 57 49 4e 52 54 0a 20 20 20 20 68 20 3d 20  S_WINRT.    h = 
296f0 6f 73 4c 6f 61 64 50 61 63 6b 61 67 65 64 4c 69  osLoadPackagedLi
29700 62 72 61 72 79 28 28 4c 50 43 57 53 54 52 29 7a  brary((LPCWSTR)z
29710 43 6f 6e 76 65 72 74 65 64 2c 20 30 29 3b 0a 23  Converted, 0);.#
29720 65 6c 73 65 0a 20 20 20 20 68 20 3d 20 6f 73 4c  else.    h = osL
29730 6f 61 64 4c 69 62 72 61 72 79 57 28 28 4c 50 43  oadLibraryW((LPC
29740 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 29  WSTR)zConverted)
29750 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 69 66  ;.#endif.  }.#if
29760 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  def SQLITE_WIN32
29770 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65  _HAS_ANSI.  else
29780 7b 0a 20 20 20 20 68 20 3d 20 6f 73 4c 6f 61 64  {.    h = osLoad
29790 4c 69 62 72 61 72 79 41 28 28 63 68 61 72 2a 29  LibraryA((char*)
297a0 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 7d  zConverted);.  }
297b0 0a 23 65 6e 64 69 66 0a 20 20 4f 53 54 52 41 43  .#endif.  OSTRAC
297c0 45 28 28 22 44 4c 4f 50 45 4e 20 6e 61 6d 65 3d  E(("DLOPEN name=
297d0 25 73 2c 20 68 61 6e 64 6c 65 3d 25 70 5c 6e 22  %s, handle=%p\n"
297e0 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 28 76 6f  , zFilename, (vo
297f0 69 64 2a 29 68 29 29 3b 0a 20 20 73 71 6c 69 74  id*)h));.  sqlit
29800 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74  e3_free(zConvert
29810 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 76  ed);.  return (v
29820 6f 69 64 2a 29 68 3b 0a 7d 0a 73 74 61 74 69 63  oid*)h;.}.static
29830 20 76 6f 69 64 20 77 69 6e 44 6c 45 72 72 6f 72   void winDlError
29840 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56  (sqlite3_vfs *pV
29850 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68  fs, int nBuf, ch
29860 61 72 20 2a 7a 42 75 66 4f 75 74 29 7b 0a 20 20  ar *zBufOut){.  
29870 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
29880 28 70 56 66 73 29 3b 0a 20 20 77 69 6e 47 65 74  (pVfs);.  winGet
29890 4c 61 73 74 45 72 72 6f 72 4d 73 67 28 6f 73 47  LastErrorMsg(osG
298a0 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 6e  etLastError(), n
298b0 42 75 66 2c 20 7a 42 75 66 4f 75 74 29 3b 0a 7d  Buf, zBufOut);.}
298c0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 28 2a 77  .static void (*w
298d0 69 6e 44 6c 53 79 6d 28 73 71 6c 69 74 65 33 5f  inDlSym(sqlite3_
298e0 76 66 73 20 2a 70 56 66 73 2c 76 6f 69 64 20 2a  vfs *pVfs,void *
298f0 70 48 2c 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  pH,const char *z
29900 53 79 6d 29 29 28 76 6f 69 64 29 7b 0a 20 20 46  Sym))(void){.  F
29910 41 52 50 52 4f 43 20 70 72 6f 63 3b 0a 20 20 55  ARPROC proc;.  U
29920 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
29930 70 56 66 73 29 3b 0a 20 20 70 72 6f 63 20 3d 20  pVfs);.  proc = 
29940 6f 73 47 65 74 50 72 6f 63 41 64 64 72 65 73 73  osGetProcAddress
29950 41 28 28 48 41 4e 44 4c 45 29 70 48 2c 20 7a 53  A((HANDLE)pH, zS
29960 79 6d 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  ym);.  OSTRACE((
29970 22 44 4c 53 59 4d 20 68 61 6e 64 6c 65 3d 25 70  "DLSYM handle=%p
29980 2c 20 73 79 6d 62 6f 6c 3d 25 73 2c 20 61 64 64  , symbol=%s, add
29990 72 65 73 73 3d 25 70 5c 6e 22 2c 0a 20 20 20 20  ress=%p\n",.    
299a0 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70 48         (void*)pH
299b0 2c 20 7a 53 79 6d 2c 20 28 76 6f 69 64 2a 29 70  , zSym, (void*)p
299c0 72 6f 63 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  roc));.  return 
299d0 28 76 6f 69 64 28 2a 29 28 76 6f 69 64 29 29 70  (void(*)(void))p
299e0 72 6f 63 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  roc;.}.static vo
299f0 69 64 20 77 69 6e 44 6c 43 6c 6f 73 65 28 73 71  id winDlClose(sq
29a00 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
29a10 20 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65 29 7b   void *pHandle){
29a20 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
29a30 54 45 52 28 70 56 66 73 29 3b 0a 20 20 6f 73 46  TER(pVfs);.  osF
29a40 72 65 65 4c 69 62 72 61 72 79 28 28 48 41 4e 44  reeLibrary((HAND
29a50 4c 45 29 70 48 61 6e 64 6c 65 29 3b 0a 20 20 4f  LE)pHandle);.  O
29a60 53 54 52 41 43 45 28 28 22 44 4c 43 4c 4f 53 45  STRACE(("DLCLOSE
29a70 20 68 61 6e 64 6c 65 3d 25 70 5c 6e 22 2c 20 28   handle=%p\n", (
29a80 76 6f 69 64 2a 29 70 48 61 6e 64 6c 65 29 29 3b  void*)pHandle));
29a90 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 53  .}.#else /* if S
29aa0 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f  QLITE_OMIT_LOAD_
29ab0 45 58 54 45 4e 53 49 4f 4e 20 69 73 20 64 65 66  EXTENSION is def
29ac0 69 6e 65 64 3a 20 2a 2f 0a 20 20 23 64 65 66 69  ined: */.  #defi
29ad0 6e 65 20 77 69 6e 44 6c 4f 70 65 6e 20 20 30 0a  ne winDlOpen  0.
29ae0 20 20 23 64 65 66 69 6e 65 20 77 69 6e 44 6c 45    #define winDlE
29af0 72 72 6f 72 20 30 0a 20 20 23 64 65 66 69 6e 65  rror 0.  #define
29b00 20 77 69 6e 44 6c 53 79 6d 20 20 20 30 0a 20 20   winDlSym   0.  
29b10 23 64 65 66 69 6e 65 20 77 69 6e 44 6c 43 6c 6f  #define winDlClo
29b20 73 65 20 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a  se 0.#endif.../*
29b30 0a 2a 2a 20 57 72 69 74 65 20 75 70 20 74 6f 20  .** Write up to 
29b40 6e 42 75 66 20 62 79 74 65 73 20 6f 66 20 72 61  nBuf bytes of ra
29b50 6e 64 6f 6d 6e 65 73 73 20 69 6e 74 6f 20 7a 42  ndomness into zB
29b60 75 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  uf..*/.static in
29b70 74 20 77 69 6e 52 61 6e 64 6f 6d 6e 65 73 73 28  t winRandomness(
29b80 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
29b90 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61  s, int nBuf, cha
29ba0 72 20 2a 7a 42 75 66 29 7b 0a 20 20 69 6e 74 20  r *zBuf){.  int 
29bb0 6e 20 3d 20 30 3b 0a 20 20 55 4e 55 53 45 44 5f  n = 0;.  UNUSED_
29bc0 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b  PARAMETER(pVfs);
29bd0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
29be0 49 54 45 5f 54 45 53 54 29 0a 20 20 6e 20 3d 20  ITE_TEST).  n = 
29bf0 6e 42 75 66 3b 0a 20 20 6d 65 6d 73 65 74 28 7a  nBuf;.  memset(z
29c00 42 75 66 2c 20 30 2c 20 6e 42 75 66 29 3b 0a 23  Buf, 0, nBuf);.#
29c10 65 6c 73 65 0a 20 20 69 66 28 20 73 69 7a 65 6f  else.  if( sizeo
29c20 66 28 53 59 53 54 45 4d 54 49 4d 45 29 3c 3d 6e  f(SYSTEMTIME)<=n
29c30 42 75 66 2d 6e 20 29 7b 0a 20 20 20 20 53 59 53  Buf-n ){.    SYS
29c40 54 45 4d 54 49 4d 45 20 78 3b 0a 20 20 20 20 6f  TEMTIME x;.    o
29c50 73 47 65 74 53 79 73 74 65 6d 54 69 6d 65 28 26  sGetSystemTime(&
29c60 78 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  x);.    memcpy(&
29c70 7a 42 75 66 5b 6e 5d 2c 20 26 78 2c 20 73 69 7a  zBuf[n], &x, siz
29c80 65 6f 66 28 78 29 29 3b 0a 20 20 20 20 6e 20 2b  eof(x));.    n +
29c90 3d 20 73 69 7a 65 6f 66 28 78 29 3b 0a 20 20 7d  = sizeof(x);.  }
29ca0 0a 20 20 69 66 28 20 73 69 7a 65 6f 66 28 44 57  .  if( sizeof(DW
29cb0 4f 52 44 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a  ORD)<=nBuf-n ){.
29cc0 20 20 20 20 44 57 4f 52 44 20 70 69 64 20 3d 20      DWORD pid = 
29cd0 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
29ce0 65 73 73 49 64 28 29 3b 0a 20 20 20 20 6d 65 6d  essId();.    mem
29cf0 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 70  cpy(&zBuf[n], &p
29d00 69 64 2c 20 73 69 7a 65 6f 66 28 70 69 64 29 29  id, sizeof(pid))
29d10 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f  ;.    n += sizeo
29d20 66 28 70 69 64 29 3b 0a 20 20 7d 0a 23 69 66 20  f(pid);.  }.#if 
29d30 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
29d40 20 20 69 66 28 20 73 69 7a 65 6f 66 28 55 4c 4f    if( sizeof(ULO
29d50 4e 47 4c 4f 4e 47 29 3c 3d 6e 42 75 66 2d 6e 20  NGLONG)<=nBuf-n 
29d60 29 7b 0a 20 20 20 20 55 4c 4f 4e 47 4c 4f 4e 47  ){.    ULONGLONG
29d70 20 63 6e 74 20 3d 20 6f 73 47 65 74 54 69 63 6b   cnt = osGetTick
29d80 43 6f 75 6e 74 36 34 28 29 3b 0a 20 20 20 20 6d  Count64();.    m
29d90 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20  emcpy(&zBuf[n], 
29da0 26 63 6e 74 2c 20 73 69 7a 65 6f 66 28 63 6e 74  &cnt, sizeof(cnt
29db0 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a  ));.    n += siz
29dc0 65 6f 66 28 63 6e 74 29 3b 0a 20 20 7d 0a 23 65  eof(cnt);.  }.#e
29dd0 6c 73 65 0a 20 20 69 66 28 20 73 69 7a 65 6f 66  lse.  if( sizeof
29de0 28 44 57 4f 52 44 29 3c 3d 6e 42 75 66 2d 6e 20  (DWORD)<=nBuf-n 
29df0 29 7b 0a 20 20 20 20 44 57 4f 52 44 20 63 6e 74  ){.    DWORD cnt
29e00 20 3d 20 6f 73 47 65 74 54 69 63 6b 43 6f 75 6e   = osGetTickCoun
29e10 74 28 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  t();.    memcpy(
29e20 26 7a 42 75 66 5b 6e 5d 2c 20 26 63 6e 74 2c 20  &zBuf[n], &cnt, 
29e30 73 69 7a 65 6f 66 28 63 6e 74 29 29 3b 0a 20 20  sizeof(cnt));.  
29e40 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 63 6e    n += sizeof(cn
29e50 74 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  t);.  }.#endif. 
29e60 20 69 66 28 20 73 69 7a 65 6f 66 28 4c 41 52 47   if( sizeof(LARG
29e70 45 5f 49 4e 54 45 47 45 52 29 3c 3d 6e 42 75 66  E_INTEGER)<=nBuf
29e80 2d 6e 20 29 7b 0a 20 20 20 20 4c 41 52 47 45 5f  -n ){.    LARGE_
29e90 49 4e 54 45 47 45 52 20 69 3b 0a 20 20 20 20 6f  INTEGER i;.    o
29ea0 73 51 75 65 72 79 50 65 72 66 6f 72 6d 61 6e 63  sQueryPerformanc
29eb0 65 43 6f 75 6e 74 65 72 28 26 69 29 3b 0a 20 20  eCounter(&i);.  
29ec0 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e    memcpy(&zBuf[n
29ed0 5d 2c 20 26 69 2c 20 73 69 7a 65 6f 66 28 69 29  ], &i, sizeof(i)
29ee0 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65  );.    n += size
29ef0 6f 66 28 69 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  of(i);.  }.#endi
29f00 66 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  f.  return n;.}.
29f10 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f  ../*.** Sleep fo
29f20 72 20 61 20 6c 69 74 74 6c 65 20 77 68 69 6c 65  r a little while
29f30 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 61 6d  .  Return the am
29f40 6f 75 6e 74 20 6f 66 20 74 69 6d 65 20 73 6c 65  ount of time sle
29f50 70 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  pt..*/.static in
29f60 74 20 77 69 6e 53 6c 65 65 70 28 73 71 6c 69 74  t winSleep(sqlit
29f70 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e  e3_vfs *pVfs, in
29f80 74 20 6d 69 63 72 6f 73 65 63 29 7b 0a 20 20 73  t microsec){.  s
29f90 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65  qlite3_win32_sle
29fa0 65 70 28 28 6d 69 63 72 6f 73 65 63 2b 39 39 39  ep((microsec+999
29fb0 29 2f 31 30 30 30 29 3b 0a 20 20 55 4e 55 53 45  )/1000);.  UNUSE
29fc0 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73  D_PARAMETER(pVfs
29fd0 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 28 6d 69  );.  return ((mi
29fe0 63 72 6f 73 65 63 2b 39 39 39 29 2f 31 30 30 30  crosec+999)/1000
29ff0 29 2a 31 30 30 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  )*1000;.}../*.**
2a000 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76   The following v
2a010 61 72 69 61 62 6c 65 2c 20 69 66 20 73 65 74 20  ariable, if set 
2a020 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61  to a non-zero va
2a030 6c 75 65 2c 20 69 73 20 69 6e 74 65 72 70 72 65  lue, is interpre
2a040 74 65 64 20 61 73 0a 2a 2a 20 74 68 65 20 6e 75  ted as.** the nu
2a050 6d 62 65 72 20 6f 66 20 73 65 63 6f 6e 64 73 20  mber of seconds 
2a060 73 69 6e 63 65 20 31 39 37 30 20 61 6e 64 20 69  since 1970 and i
2a070 73 20 75 73 65 64 20 74 6f 20 73 65 74 20 74 68  s used to set th
2a080 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 73  e result of.** s
2a090 71 6c 69 74 65 33 4f 73 43 75 72 72 65 6e 74 54  qlite3OsCurrentT
2a0a0 69 6d 65 28 29 20 64 75 72 69 6e 67 20 74 65 73  ime() during tes
2a0b0 74 69 6e 67 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  ting..*/.#ifdef 
2a0c0 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20  SQLITE_TEST.int 
2a0d0 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f  sqlite3_current_
2a0e0 74 69 6d 65 20 3d 20 30 3b 20 20 2f 2a 20 46 61  time = 0;  /* Fa
2a0f0 6b 65 20 73 79 73 74 65 6d 20 74 69 6d 65 20 69  ke system time i
2a100 6e 20 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20  n seconds since 
2a110 31 39 37 30 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a  1970. */.#endif.
2a120 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20  ./*.** Find the 
2a130 63 75 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e  current time (in
2a140 20 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64   Universal Coord
2a150 69 6e 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57  inated Time).  W
2a160 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77  rite into *piNow
2a170 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20  .** the current 
2a180 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73  time and date as
2a190 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75   a Julian Day nu
2a1a0 6d 62 65 72 20 74 69 6d 65 73 20 38 36 5f 34 30  mber times 86_40
2a1b0 30 5f 30 30 30 2e 20 20 49 6e 0a 2a 2a 20 6f 74  0_000.  In.** ot
2a1c0 68 65 72 20 77 6f 72 64 73 2c 20 77 72 69 74 65  her words, write
2a1d0 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 20 74 68 65   into *piNow the
2a1e0 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69   number of milli
2a1f0 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 74 68  seconds since th
2a200 65 20 4a 75 6c 69 61 6e 0a 2a 2a 20 65 70 6f 63  e Julian.** epoc
2a210 68 20 6f 66 20 6e 6f 6f 6e 20 69 6e 20 47 72 65  h of noon in Gre
2a220 65 6e 77 69 63 68 20 6f 6e 20 4e 6f 76 65 6d 62  enwich on Novemb
2a230 65 72 20 32 34 2c 20 34 37 31 34 20 42 2e 43 20  er 24, 4714 B.C 
2a240 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65  according to the
2a250 0a 2a 2a 20 70 72 6f 6c 65 70 74 69 63 20 47 72  .** proleptic Gr
2a260 65 67 6f 72 69 61 6e 20 63 61 6c 65 6e 64 61 72  egorian calendar
2a270 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65  ..**.** On succe
2a280 73 73 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ss, return SQLIT
2a290 45 5f 4f 4b 2e 20 20 52 65 74 75 72 6e 20 53 51  E_OK.  Return SQ
2a2a0 4c 49 54 45 5f 45 52 52 4f 52 20 69 66 20 74 68  LITE_ERROR if th
2a2b0 65 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 0a  e time and date.
2a2c0 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75  ** cannot be fou
2a2d0 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nd..*/.static in
2a2e0 74 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65  t winCurrentTime
2a2f0 49 6e 74 36 34 28 73 71 6c 69 74 65 33 5f 76 66  Int64(sqlite3_vf
2a300 73 20 2a 70 56 66 73 2c 20 73 71 6c 69 74 65 33  s *pVfs, sqlite3
2a310 5f 69 6e 74 36 34 20 2a 70 69 4e 6f 77 29 7b 0a  _int64 *piNow){.
2a320 20 20 2f 2a 20 46 49 4c 45 54 49 4d 45 20 73 74    /* FILETIME st
2a330 72 75 63 74 75 72 65 20 69 73 20 61 20 36 34 2d  ructure is a 64-
2a340 62 69 74 20 76 61 6c 75 65 20 72 65 70 72 65 73  bit value repres
2a350 65 6e 74 69 6e 67 20 74 68 65 20 6e 75 6d 62 65  enting the numbe
2a360 72 20 6f 66 0a 20 20 20 20 20 31 30 30 2d 6e 61  r of.     100-na
2a370 6e 6f 73 65 63 6f 6e 64 20 69 6e 74 65 72 76 61  nosecond interva
2a380 6c 73 20 73 69 6e 63 65 20 4a 61 6e 75 61 72 79  ls since January
2a390 20 31 2c 20 31 36 30 31 20 28 3d 20 4a 44 20 32   1, 1601 (= JD 2
2a3a0 33 30 35 38 31 33 2e 35 29 2e 0a 20 20 2a 2f 0a  305813.5)..  */.
2a3b0 20 20 46 49 4c 45 54 49 4d 45 20 66 74 3b 0a 20    FILETIME ft;. 
2a3c0 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71   static const sq
2a3d0 6c 69 74 65 33 5f 69 6e 74 36 34 20 77 69 6e 46  lite3_int64 winF
2a3e0 69 6c 65 74 69 6d 65 45 70 6f 63 68 20 3d 20 32  iletimeEpoch = 2
2a3f0 33 30 35 38 31 33 35 2a 28 73 71 6c 69 74 65 33  3058135*(sqlite3
2a400 5f 69 6e 74 36 34 29 38 36 34 30 30 30 30 3b 0a  _int64)8640000;.
2a410 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
2a420 53 54 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  ST.  static cons
2a430 74 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  t sqlite3_int64 
2a440 75 6e 69 78 45 70 6f 63 68 20 3d 20 32 34 34 30  unixEpoch = 2440
2a450 35 38 37 35 2a 28 73 71 6c 69 74 65 33 5f 69 6e  5875*(sqlite3_in
2a460 74 36 34 29 38 36 34 30 30 30 30 3b 0a 23 65 6e  t64)8640000;.#en
2a470 64 69 66 0a 20 20 2f 2a 20 32 5e 33 32 20 2d 20  dif.  /* 2^32 - 
2a480 74 6f 20 61 76 6f 69 64 20 75 73 65 20 6f 66 20  to avoid use of 
2a490 4c 4c 20 61 6e 64 20 77 61 72 6e 69 6e 67 73 20  LL and warnings 
2a4a0 69 6e 20 67 63 63 20 2a 2f 0a 20 20 73 74 61 74  in gcc */.  stat
2a4b0 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
2a4c0 5f 69 6e 74 36 34 20 6d 61 78 33 32 42 69 74 56  _int64 max32BitV
2a4d0 61 6c 75 65 20 3d 0a 20 20 20 20 20 20 28 73 71  alue =.      (sq
2a4e0 6c 69 74 65 33 5f 69 6e 74 36 34 29 32 30 30 30  lite3_int64)2000
2a4f0 30 30 30 30 30 30 20 2b 20 28 73 71 6c 69 74 65  000000 + (sqlite
2a500 33 5f 69 6e 74 36 34 29 32 30 30 30 30 30 30 30  3_int64)20000000
2a510 30 30 20 2b 0a 20 20 20 20 20 20 28 73 71 6c 69  00 +.      (sqli
2a520 74 65 33 5f 69 6e 74 36 34 29 32 39 34 39 36 37  te3_int64)294967
2a530 32 39 36 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45  296;..#if SQLITE
2a540 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 53 59 53 54  _OS_WINCE.  SYST
2a550 45 4d 54 49 4d 45 20 74 69 6d 65 3b 0a 20 20 6f  EMTIME time;.  o
2a560 73 47 65 74 53 79 73 74 65 6d 54 69 6d 65 28 26  sGetSystemTime(&
2a570 74 69 6d 65 29 3b 0a 20 20 2f 2a 20 69 66 20 53  time);.  /* if S
2a580 79 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54  ystemTimeToFileT
2a590 69 6d 65 28 29 20 66 61 69 6c 73 2c 20 69 74 20  ime() fails, it 
2a5a0 72 65 74 75 72 6e 73 20 7a 65 72 6f 2e 20 2a 2f  returns zero. */
2a5b0 0a 20 20 69 66 20 28 21 6f 73 53 79 73 74 65 6d  .  if (!osSystem
2a5c0 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65 28 26  TimeToFileTime(&
2a5d0 74 69 6d 65 2c 26 66 74 29 29 7b 0a 20 20 20 20  time,&ft)){.    
2a5e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
2a5f0 52 4f 52 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20  ROR;.  }.#else. 
2a600 20 6f 73 47 65 74 53 79 73 74 65 6d 54 69 6d 65   osGetSystemTime
2a610 41 73 46 69 6c 65 54 69 6d 65 28 20 26 66 74 20  AsFileTime( &ft 
2a620 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2a 70 69  );.#endif..  *pi
2a630 4e 6f 77 20 3d 20 77 69 6e 46 69 6c 65 74 69 6d  Now = winFiletim
2a640 65 45 70 6f 63 68 20 2b 0a 20 20 20 20 20 20 20  eEpoch +.       
2a650 20 20 20 20 20 28 28 28 28 73 71 6c 69 74 65 33       ((((sqlite3
2a660 5f 69 6e 74 36 34 29 66 74 2e 64 77 48 69 67 68  _int64)ft.dwHigh
2a670 44 61 74 65 54 69 6d 65 29 2a 6d 61 78 33 32 42  DateTime)*max32B
2a680 69 74 56 61 6c 75 65 29 20 2b 0a 20 20 20 20 20  itValue) +.     
2a690 20 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74            (sqlit
2a6a0 65 33 5f 69 6e 74 36 34 29 66 74 2e 64 77 4c 6f  e3_int64)ft.dwLo
2a6b0 77 44 61 74 65 54 69 6d 65 29 2f 28 73 71 6c 69  wDateTime)/(sqli
2a6c0 74 65 33 5f 69 6e 74 36 34 29 31 30 30 30 30 3b  te3_int64)10000;
2a6d0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
2a6e0 54 45 53 54 0a 20 20 69 66 28 20 73 71 6c 69 74  TEST.  if( sqlit
2a6f0 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20  e3_current_time 
2a700 29 7b 0a 20 20 20 20 2a 70 69 4e 6f 77 20 3d 20  ){.    *piNow = 
2a710 31 30 30 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e  1000*(sqlite3_in
2a720 74 36 34 29 73 71 6c 69 74 65 33 5f 63 75 72 72  t64)sqlite3_curr
2a730 65 6e 74 5f 74 69 6d 65 20 2b 20 75 6e 69 78 45  ent_time + unixE
2a740 70 6f 63 68 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  poch;.  }.#endif
2a750 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
2a760 54 45 52 28 70 56 66 73 29 3b 0a 20 20 72 65 74  TER(pVfs);.  ret
2a770 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
2a780 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65  ../*.** Find the
2a790 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 28 69   current time (i
2a7a0 6e 20 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72  n Universal Coor
2a7b0 64 69 6e 61 74 65 64 20 54 69 6d 65 29 2e 20 20  dinated Time).  
2a7c0 57 72 69 74 65 20 74 68 65 0a 2a 2a 20 63 75 72  Write the.** cur
2a7d0 72 65 6e 74 20 74 69 6d 65 20 61 6e 64 20 64 61  rent time and da
2a7e0 74 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44  te as a Julian D
2a7f0 61 79 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a  ay number into *
2a800 70 72 4e 6f 77 20 61 6e 64 0a 2a 2a 20 72 65 74  prNow and.** ret
2a810 75 72 6e 20 30 2e 20 20 52 65 74 75 72 6e 20 31  urn 0.  Return 1
2a820 20 69 66 20 74 68 65 20 74 69 6d 65 20 61 6e 64   if the time and
2a830 20 64 61 74 65 20 63 61 6e 6e 6f 74 20 62 65 20   date cannot be 
2a840 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  found..*/.static
2a850 20 69 6e 74 20 77 69 6e 43 75 72 72 65 6e 74 54   int winCurrentT
2a860 69 6d 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ime(sqlite3_vfs 
2a870 2a 70 56 66 73 2c 20 64 6f 75 62 6c 65 20 2a 70  *pVfs, double *p
2a880 72 4e 6f 77 29 7b 0a 20 20 69 6e 74 20 72 63 3b  rNow){.  int rc;
2a890 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
2a8a0 20 69 3b 0a 20 20 72 63 20 3d 20 77 69 6e 43 75   i;.  rc = winCu
2a8b0 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 70  rrentTimeInt64(p
2a8c0 56 66 73 2c 20 26 69 29 3b 0a 20 20 69 66 28 20  Vfs, &i);.  if( 
2a8d0 21 72 63 20 29 7b 0a 20 20 20 20 2a 70 72 4e 6f  !rc ){.    *prNo
2a8e0 77 20 3d 20 69 2f 38 36 34 30 30 30 30 30 2e 30  w = i/86400000.0
2a8f0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
2a900 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  c;.}../*.** The 
2a910 69 64 65 61 20 69 73 20 74 68 61 74 20 74 68 69  idea is that thi
2a920 73 20 66 75 6e 63 74 69 6f 6e 20 77 6f 72 6b 73  s function works
2a930 20 6c 69 6b 65 20 61 20 63 6f 6d 62 69 6e 61 74   like a combinat
2a940 69 6f 6e 20 6f 66 0a 2a 2a 20 47 65 74 4c 61 73  ion of.** GetLas
2a950 74 45 72 72 6f 72 28 29 20 61 6e 64 20 46 6f 72  tError() and For
2a960 6d 61 74 4d 65 73 73 61 67 65 28 29 20 6f 6e 20  matMessage() on 
2a970 57 69 6e 64 6f 77 73 20 28 6f 72 20 65 72 72 6e  Windows (or errn
2a980 6f 20 61 6e 64 0a 2a 2a 20 73 74 72 65 72 72 6f  o and.** strerro
2a990 72 5f 72 28 29 20 6f 6e 20 55 6e 69 78 29 2e 20  r_r() on Unix). 
2a9a0 41 66 74 65 72 20 61 6e 20 65 72 72 6f 72 20 69  After an error i
2a9b0 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 61 6e  s returned by an
2a9c0 20 4f 53 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2c   OS.** function,
2a9d0 20 53 51 4c 69 74 65 20 63 61 6c 6c 73 20 74 68   SQLite calls th
2a9e0 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68  is function with
2a9f0 20 7a 42 75 66 20 70 6f 69 6e 74 69 6e 67 20 74   zBuf pointing t
2aa00 6f 0a 2a 2a 20 61 20 62 75 66 66 65 72 20 6f 66  o.** a buffer of
2aa10 20 6e 42 75 66 20 62 79 74 65 73 2e 20 54 68 65   nBuf bytes. The
2aa20 20 4f 53 20 6c 61 79 65 72 20 73 68 6f 75 6c 64   OS layer should
2aa30 20 70 6f 70 75 6c 61 74 65 20 74 68 65 0a 2a 2a   populate the.**
2aa40 20 62 75 66 66 65 72 20 77 69 74 68 20 61 20 6e   buffer with a n
2aa50 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 55 54  ul-terminated UT
2aa60 46 2d 38 20 65 6e 63 6f 64 65 64 20 65 72 72 6f  F-8 encoded erro
2aa70 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 64 65 73  r message.** des
2aa80 63 72 69 62 69 6e 67 20 74 68 65 20 6c 61 73 74  cribing the last
2aa90 20 49 4f 20 65 72 72 6f 72 20 74 6f 20 68 61 76   IO error to hav
2aaa0 65 20 6f 63 63 75 72 72 65 64 20 77 69 74 68 69  e occurred withi
2aab0 6e 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a  n the calling.**
2aac0 20 74 68 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49   thread..**.** I
2aad0 66 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73  f the error mess
2aae0 61 67 65 20 69 73 20 74 6f 6f 20 6c 61 72 67 65  age is too large
2aaf0 20 66 6f 72 20 74 68 65 20 73 75 70 70 6c 69 65   for the supplie
2ab00 64 20 62 75 66 66 65 72 2c 0a 2a 2a 20 69 74 20  d buffer,.** it 
2ab10 73 68 6f 75 6c 64 20 62 65 20 74 72 75 6e 63 61  should be trunca
2ab20 74 65 64 2e 20 54 68 65 20 72 65 74 75 72 6e 20  ted. The return 
2ab30 76 61 6c 75 65 20 6f 66 20 78 47 65 74 4c 61 73  value of xGetLas
2ab40 74 45 72 72 6f 72 0a 2a 2a 20 69 73 20 7a 65 72  tError.** is zer
2ab50 6f 20 69 66 20 74 68 65 20 65 72 72 6f 72 20 6d  o if the error m
2ab60 65 73 73 61 67 65 20 66 69 74 73 20 69 6e 20 74  essage fits in t
2ab70 68 65 20 62 75 66 66 65 72 2c 20 6f 72 20 6e 6f  he buffer, or no
2ab80 6e 2d 7a 65 72 6f 0a 2a 2a 20 6f 74 68 65 72 77  n-zero.** otherw
2ab90 69 73 65 20 28 69 66 20 74 68 65 20 6d 65 73 73  ise (if the mess
2aba0 61 67 65 20 77 61 73 20 74 72 75 6e 63 61 74 65  age was truncate
2abb0 64 29 2e 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20  d). If non-zero 
2abc0 69 73 20 72 65 74 75 72 6e 65 64 2c 0a 2a 2a 20  is returned,.** 
2abd0 74 68 65 6e 20 69 74 20 69 73 20 6e 6f 74 20 6e  then it is not n
2abe0 65 63 65 73 73 61 72 79 20 74 6f 20 69 6e 63 6c  ecessary to incl
2abf0 75 64 65 20 74 68 65 20 6e 75 6c 2d 74 65 72 6d  ude the nul-term
2ac00 69 6e 61 74 6f 72 20 63 68 61 72 61 63 74 65 72  inator character
2ac10 0a 2a 2a 20 69 6e 20 74 68 65 20 6f 75 74 70 75  .** in the outpu
2ac20 74 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20  t buffer..**.** 
2ac30 4e 6f 74 20 73 75 70 70 6c 79 69 6e 67 20 61 6e  Not supplying an
2ac40 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77   error message w
2ac50 69 6c 6c 20 68 61 76 65 20 6e 6f 20 61 64 76 65  ill have no adve
2ac60 72 73 65 20 65 66 66 65 63 74 0a 2a 2a 20 6f 6e  rse effect.** on
2ac70 20 53 51 4c 69 74 65 2e 20 49 74 20 69 73 20 66   SQLite. It is f
2ac80 69 6e 65 20 74 6f 20 68 61 76 65 20 61 6e 20 69  ine to have an i
2ac90 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 74 68  mplementation th
2aca0 61 74 20 6e 65 76 65 72 0a 2a 2a 20 72 65 74 75  at never.** retu
2acb0 72 6e 73 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  rns an error mes
2acc0 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 6e  sage:.**.**   in
2acd0 74 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72 28  t xGetLastError(
2ace0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
2acf0 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61  s, int nBuf, cha
2ad00 72 20 2a 7a 42 75 66 29 7b 0a 2a 2a 20 20 20 20  r *zBuf){.**    
2ad10 20 61 73 73 65 72 74 28 7a 42 75 66 5b 30 5d 3d   assert(zBuf[0]=
2ad20 3d 27 5c 30 27 29 3b 0a 2a 2a 20 20 20 20 20 72  ='\0');.**     r
2ad30 65 74 75 72 6e 20 30 3b 0a 2a 2a 20 20 20 7d 0a  eturn 0;.**   }.
2ad40 2a 2a 0a 2a 2a 20 48 6f 77 65 76 65 72 20 69 66  **.** However if
2ad50 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
2ad60 65 20 69 73 20 73 75 70 70 6c 69 65 64 2c 20 69  e is supplied, i
2ad70 74 20 77 69 6c 6c 20 62 65 20 69 6e 63 6f 72 70  t will be incorp
2ad80 6f 72 61 74 65 64 0a 2a 2a 20 62 79 20 73 71 6c  orated.** by sql
2ad90 69 74 65 20 69 6e 74 6f 20 74 68 65 20 65 72 72  ite into the err
2ada0 6f 72 20 6d 65 73 73 61 67 65 20 61 76 61 69 6c  or message avail
2adb0 61 62 6c 65 20 74 6f 20 74 68 65 20 75 73 65 72  able to the user
2adc0 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65   using.** sqlite
2add0 33 5f 65 72 72 6d 73 67 28 29 2c 20 70 6f 73 73  3_errmsg(), poss
2ade0 69 62 6c 79 20 6d 61 6b 69 6e 67 20 49 4f 20 65  ibly making IO e
2adf0 72 72 6f 72 73 20 65 61 73 69 65 72 20 74 6f 20  rrors easier to 
2ae00 64 65 62 75 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  debug..*/.static
2ae10 20 69 6e 74 20 77 69 6e 47 65 74 4c 61 73 74 45   int winGetLastE
2ae20 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73  rror(sqlite3_vfs
2ae30 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 75 66   *pVfs, int nBuf
2ae40 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20  , char *zBuf){. 
2ae50 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
2ae60 52 28 70 56 66 73 29 3b 0a 20 20 72 65 74 75 72  R(pVfs);.  retur
2ae70 6e 20 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f  n winGetLastErro
2ae80 72 4d 73 67 28 6f 73 47 65 74 4c 61 73 74 45 72  rMsg(osGetLastEr
2ae90 72 6f 72 28 29 2c 20 6e 42 75 66 2c 20 7a 42 75  ror(), nBuf, zBu
2aea0 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69  f);.}../*.** Ini
2aeb0 74 69 61 6c 69 7a 65 20 61 6e 64 20 64 65 69 6e  tialize and dein
2aec0 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6f 70 65  itialize the ope
2aed0 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69 6e  rating system in
2aee0 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 69 6e 74 20  terface..*/.int 
2aef0 73 71 6c 69 74 65 33 5f 6f 73 5f 69 6e 69 74 28  sqlite3_os_init(
2af00 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20  void){.  static 
2af10 73 71 6c 69 74 65 33 5f 76 66 73 20 77 69 6e 56  sqlite3_vfs winV
2af20 66 73 20 3d 20 7b 0a 20 20 20 20 33 2c 20 20 20  fs = {.    3,   
2af30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2af40 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20  /* iVersion */. 
2af50 20 20 20 73 69 7a 65 6f 66 28 77 69 6e 46 69 6c     sizeof(winFil
2af60 65 29 2c 20 20 20 20 20 2f 2a 20 73 7a 4f 73 46  e),     /* szOsF
2af70 69 6c 65 20 2a 2f 0a 20 20 20 20 53 51 4c 49 54  ile */.    SQLIT
2af80 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 50 41 54 48  E_WIN32_MAX_PATH
2af90 5f 42 59 54 45 53 2c 20 2f 2a 20 6d 78 50 61 74  _BYTES, /* mxPat
2afa0 68 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 30 2c 20  hname */.    0, 
2afb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2afc0 20 20 2f 2a 20 70 4e 65 78 74 20 2a 2f 0a 20 20    /* pNext */.  
2afd0 20 20 22 77 69 6e 33 32 22 2c 20 20 20 20 20 20    "win32",      
2afe0 20 20 20 20 20 20 20 2f 2a 20 7a 4e 61 6d 65 20         /* zName 
2aff0 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20  */.    0,       
2b000 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70              /* p
2b010 41 70 70 44 61 74 61 20 2a 2f 0a 20 20 20 20 77  AppData */.    w
2b020 69 6e 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20  inOpen,         
2b030 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2a 2f 0a      /* xOpen */.
2b040 20 20 20 20 77 69 6e 44 65 6c 65 74 65 2c 20 20      winDelete,  
2b050 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 65 6c           /* xDel
2b060 65 74 65 20 2a 2f 0a 20 20 20 20 77 69 6e 41 63  ete */.    winAc
2b070 63 65 73 73 2c 20 20 20 20 20 20 20 20 20 20 20  cess,           
2b080 2f 2a 20 78 41 63 63 65 73 73 20 2a 2f 0a 20 20  /* xAccess */.  
2b090 20 20 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d    winFullPathnam
2b0a0 65 2c 20 20 20 20 20 2f 2a 20 78 46 75 6c 6c 50  e,     /* xFullP
2b0b0 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 77  athname */.    w
2b0c0 69 6e 44 6c 4f 70 65 6e 2c 20 20 20 20 20 20 20  inDlOpen,       
2b0d0 20 20 20 20 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a      /* xDlOpen *
2b0e0 2f 0a 20 20 20 20 77 69 6e 44 6c 45 72 72 6f 72  /.    winDlError
2b0f0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44  ,          /* xD
2b100 6c 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20 77 69  lError */.    wi
2b110 6e 44 6c 53 79 6d 2c 20 20 20 20 20 20 20 20 20  nDlSym,         
2b120 20 20 20 2f 2a 20 78 44 6c 53 79 6d 20 2a 2f 0a     /* xDlSym */.
2b130 20 20 20 20 77 69 6e 44 6c 43 6c 6f 73 65 2c 20      winDlClose, 
2b140 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 43           /* xDlC
2b150 6c 6f 73 65 20 2a 2f 0a 20 20 20 20 77 69 6e 52  lose */.    winR
2b160 61 6e 64 6f 6d 6e 65 73 73 2c 20 20 20 20 20 20  andomness,      
2b170 20 2f 2a 20 78 52 61 6e 64 6f 6d 6e 65 73 73 20   /* xRandomness 
2b180 2a 2f 0a 20 20 20 20 77 69 6e 53 6c 65 65 70 2c  */.    winSleep,
2b190 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2b1a0 53 6c 65 65 70 20 2a 2f 0a 20 20 20 20 77 69 6e  Sleep */.    win
2b1b0 43 75 72 72 65 6e 74 54 69 6d 65 2c 20 20 20 20  CurrentTime,    
2b1c0 20 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d    /* xCurrentTim
2b1d0 65 20 2a 2f 0a 20 20 20 20 77 69 6e 47 65 74 4c  e */.    winGetL
2b1e0 61 73 74 45 72 72 6f 72 2c 20 20 20 20 20 2f 2a  astError,     /*
2b1f0 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72 20 2a   xGetLastError *
2b200 2f 0a 20 20 20 20 77 69 6e 43 75 72 72 65 6e 74  /.    winCurrent
2b210 54 69 6d 65 49 6e 74 36 34 2c 20 2f 2a 20 78 43  TimeInt64, /* xC
2b220 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 20  urrentTimeInt64 
2b230 2a 2f 0a 20 20 20 20 77 69 6e 53 65 74 53 79 73  */.    winSetSys
2b240 74 65 6d 43 61 6c 6c 2c 20 20 20 20 2f 2a 20 78  temCall,    /* x
2b250 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f  SetSystemCall */
2b260 0a 20 20 20 20 77 69 6e 47 65 74 53 79 73 74 65  .    winGetSyste
2b270 6d 43 61 6c 6c 2c 20 20 20 20 2f 2a 20 78 47 65  mCall,    /* xGe
2b280 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20  tSystemCall */. 
2b290 20 20 20 77 69 6e 4e 65 78 74 53 79 73 74 65 6d     winNextSystem
2b2a0 43 61 6c 6c 2c 20 20 20 2f 2a 20 78 4e 65 78 74  Call,   /* xNext
2b2b0 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20  SystemCall */.  
2b2c0 7d 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  };.#if defined(S
2b2d0 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
2b2e0 57 49 44 45 29 0a 20 20 73 74 61 74 69 63 20 73  WIDE).  static s
2b2f0 71 6c 69 74 65 33 5f 76 66 73 20 77 69 6e 4c 6f  qlite3_vfs winLo
2b300 6e 67 50 61 74 68 56 66 73 20 3d 20 7b 0a 20 20  ngPathVfs = {.  
2b310 20 20 33 2c 20 20 20 20 20 20 20 20 20 20 20 20    3,            
2b320 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69         /* iVersi
2b330 6f 6e 20 2a 2f 0a 20 20 20 20 73 69 7a 65 6f 66  on */.    sizeof
2b340 28 77 69 6e 46 69 6c 65 29 2c 20 20 20 20 20 2f  (winFile),     /
2b350 2a 20 73 7a 4f 73 46 69 6c 65 20 2a 2f 0a 20 20  * szOsFile */.  
2b360 20 20 53 51 4c 49 54 45 5f 57 49 4e 4e 54 5f 4d    SQLITE_WINNT_M
2b370 41 58 5f 50 41 54 48 5f 42 59 54 45 53 2c 20 2f  AX_PATH_BYTES, /
2b380 2a 20 6d 78 50 61 74 68 6e 61 6d 65 20 2a 2f 0a  * mxPathname */.
2b390 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20      0,          
2b3a0 20 20 20 20 20 20 20 20 20 2f 2a 20 70 4e 65 78           /* pNex
2b3b0 74 20 2a 2f 0a 20 20 20 20 22 77 69 6e 33 32 2d  t */.    "win32-
2b3c0 6c 6f 6e 67 70 61 74 68 22 2c 20 20 20 20 2f 2a  longpath",    /*
2b3d0 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 20 20 30 2c   zName */.    0,
2b3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b3f0 20 20 20 2f 2a 20 70 41 70 70 44 61 74 61 20 2a     /* pAppData *
2b400 2f 0a 20 20 20 20 77 69 6e 4f 70 65 6e 2c 20 20  /.    winOpen,  
2b410 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4f             /* xO
2b420 70 65 6e 20 2a 2f 0a 20 20 20 20 77 69 6e 44 65  pen */.    winDe
2b430 6c 65 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  lete,           
2b440 2f 2a 20 78 44 65 6c 65 74 65 20 2a 2f 0a 20 20  /* xDelete */.  
2b450 20 20 77 69 6e 41 63 63 65 73 73 2c 20 20 20 20    winAccess,    
2b460 20 20 20 20 20 20 20 2f 2a 20 78 41 63 63 65 73         /* xAcces
2b470 73 20 2a 2f 0a 20 20 20 20 77 69 6e 46 75 6c 6c  s */.    winFull
2b480 50 61 74 68 6e 61 6d 65 2c 20 20 20 20 20 2f 2a  Pathname,     /*
2b490 20 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 2a   xFullPathname *
2b4a0 2f 0a 20 20 20 20 77 69 6e 44 6c 4f 70 65 6e 2c  /.    winDlOpen,
2b4b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44             /* xD
2b4c0 6c 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 77 69 6e  lOpen */.    win
2b4d0 44 6c 45 72 72 6f 72 2c 20 20 20 20 20 20 20 20  DlError,        
2b4e0 20 20 2f 2a 20 78 44 6c 45 72 72 6f 72 20 2a 2f    /* xDlError */
2b4f0 0a 20 20 20 20 77 69 6e 44 6c 53 79 6d 2c 20 20  .    winDlSym,  
2b500 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c            /* xDl
2b510 53 79 6d 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c  Sym */.    winDl
2b520 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20  Close,          
2b530 2f 2a 20 78 44 6c 43 6c 6f 73 65 20 2a 2f 0a 20  /* xDlClose */. 
2b540 20 20 20 77 69 6e 52 61 6e 64 6f 6d 6e 65 73 73     winRandomness
2b550 2c 20 20 20 20 20 20 20 2f 2a 20 78 52 61 6e 64  ,       /* xRand
2b560 6f 6d 6e 65 73 73 20 2a 2f 0a 20 20 20 20 77 69  omness */.    wi
2b570 6e 53 6c 65 65 70 2c 20 20 20 20 20 20 20 20 20  nSleep,         
2b580 20 20 20 2f 2a 20 78 53 6c 65 65 70 20 2a 2f 0a     /* xSleep */.
2b590 20 20 20 20 77 69 6e 43 75 72 72 65 6e 74 54 69      winCurrentTi
2b5a0 6d 65 2c 20 20 20 20 20 20 2f 2a 20 78 43 75 72  me,      /* xCur
2b5b0 72 65 6e 74 54 69 6d 65 20 2a 2f 0a 20 20 20 20  rentTime */.    
2b5c0 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 2c  winGetLastError,
2b5d0 20 20 20 20 20 2f 2a 20 78 47 65 74 4c 61 73 74       /* xGetLast
2b5e0 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20 77 69 6e  Error */.    win
2b5f0 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34  CurrentTimeInt64
2b600 2c 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d  , /* xCurrentTim
2b610 65 49 6e 74 36 34 20 2a 2f 0a 20 20 20 20 77 69  eInt64 */.    wi
2b620 6e 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20  nSetSystemCall, 
2b630 20 20 20 2f 2a 20 78 53 65 74 53 79 73 74 65 6d     /* xSetSystem
2b640 43 61 6c 6c 20 2a 2f 0a 20 20 20 20 77 69 6e 47  Call */.    winG
2b650 65 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20  etSystemCall,   
2b660 20 2f 2a 20 78 47 65 74 53 79 73 74 65 6d 43 61   /* xGetSystemCa
2b670 6c 6c 20 2a 2f 0a 20 20 20 20 77 69 6e 4e 65 78  ll */.    winNex
2b680 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20 2f  tSystemCall,   /
2b690 2a 20 78 4e 65 78 74 53 79 73 74 65 6d 43 61 6c  * xNextSystemCal
2b6a0 6c 20 2a 2f 0a 20 20 7d 3b 0a 23 65 6e 64 69 66  l */.  };.#endif
2b6b0 0a 0a 20 20 2f 2a 20 44 6f 75 62 6c 65 2d 63 68  ..  /* Double-ch
2b6c0 65 63 6b 20 74 68 61 74 20 74 68 65 20 61 53 79  eck that the aSy
2b6d0 73 63 61 6c 6c 5b 5d 20 61 72 72 61 79 20 68 61  scall[] array ha
2b6e0 73 20 62 65 65 6e 20 63 6f 6e 73 74 72 75 63 74  s been construct
2b6f0 65 64 0a 20 20 2a 2a 20 63 6f 72 72 65 63 74 6c  ed.  ** correctl
2b700 79 2e 20 20 53 65 65 20 74 69 63 6b 65 74 20 5b  y.  See ticket [
2b710 62 62 33 61 38 36 65 38 39 30 63 38 65 39 36 61  bb3a86e890c8e96a
2b720 62 5d 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  b] */.  assert( 
2b730 41 72 72 61 79 53 69 7a 65 28 61 53 79 73 63 61  ArraySize(aSysca
2b740 6c 6c 29 3d 3d 37 37 20 29 3b 0a 0a 20 20 2f 2a  ll)==77 );..  /*
2b750 20 67 65 74 20 6d 65 6d 6f 72 79 20 6d 61 70 20   get memory map 
2b760 61 6c 6c 6f 63 61 74 69 6f 6e 20 67 72 61 6e 75  allocation granu
2b770 6c 61 72 69 74 79 20 2a 2f 0a 20 20 6d 65 6d 73  larity */.  mems
2b780 65 74 28 26 77 69 6e 53 79 73 49 6e 66 6f 2c 20  et(&winSysInfo, 
2b790 30 2c 20 73 69 7a 65 6f 66 28 53 59 53 54 45 4d  0, sizeof(SYSTEM
2b7a0 5f 49 4e 46 4f 29 29 3b 0a 23 69 66 20 53 51 4c  _INFO));.#if SQL
2b7b0 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 6f  ITE_OS_WINRT.  o
2b7c0 73 47 65 74 4e 61 74 69 76 65 53 79 73 74 65 6d  sGetNativeSystem
2b7d0 49 6e 66 6f 28 26 77 69 6e 53 79 73 49 6e 66 6f  Info(&winSysInfo
2b7e0 29 3b 0a 23 65 6c 73 65 0a 20 20 6f 73 47 65 74  );.#else.  osGet
2b7f0 53 79 73 74 65 6d 49 6e 66 6f 28 26 77 69 6e 53  SystemInfo(&winS
2b800 79 73 49 6e 66 6f 29 3b 0a 23 65 6e 64 69 66 0a  ysInfo);.#endif.
2b810 20 20 61 73 73 65 72 74 28 20 77 69 6e 53 79 73    assert( winSys
2b820 49 6e 66 6f 2e 64 77 41 6c 6c 6f 63 61 74 69 6f  Info.dwAllocatio
2b830 6e 47 72 61 6e 75 6c 61 72 69 74 79 3e 30 20 29  nGranularity>0 )
2b840 3b 0a 20 20 61 73 73 65 72 74 28 20 77 69 6e 53  ;.  assert( winS
2b850 79 73 49 6e 66 6f 2e 64 77 50 61 67 65 53 69 7a  ysInfo.dwPageSiz
2b860 65 3e 30 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65  e>0 );..  sqlite
2b870 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28 26  3_vfs_register(&
2b880 77 69 6e 56 66 73 2c 20 31 29 3b 0a 0a 23 69 66  winVfs, 1);..#if
2b890 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
2b8a0 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a  WIN32_HAS_WIDE).
2b8b0 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65    sqlite3_vfs_re
2b8c0 67 69 73 74 65 72 28 26 77 69 6e 4c 6f 6e 67 50  gister(&winLongP
2b8d0 61 74 68 56 66 73 2c 20 30 29 3b 0a 23 65 6e 64  athVfs, 0);.#end
2b8e0 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  if..  return SQL
2b8f0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 69 6e 74 20 73  ITE_OK;.}..int s
2b900 71 6c 69 74 65 33 5f 6f 73 5f 65 6e 64 28 76 6f  qlite3_os_end(vo
2b910 69 64 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f  id){.#if SQLITE_
2b920 4f 53 5f 57 49 4e 52 54 0a 20 20 69 66 28 20 73  OS_WINRT.  if( s
2b930 6c 65 65 70 4f 62 6a 21 3d 4e 55 4c 4c 20 29 7b  leepObj!=NULL ){
2b940 0a 20 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64  .    osCloseHand
2b950 6c 65 28 73 6c 65 65 70 4f 62 6a 29 3b 0a 20 20  le(sleepObj);.  
2b960 20 20 73 6c 65 65 70 4f 62 6a 20 3d 20 4e 55 4c    sleepObj = NUL
2b970 4c 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  L;.  }.#endif.  
2b980 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2b990 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53  ;.}..#endif /* S
2b9a0 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 2a 2f 0a  QLITE_OS_WIN */.