/ Hex Artifact Content
Login

Artifact 3c9f7df710cb6c757b04b78bf3d98f03830e67b9:


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 20 20  3].pCurrent)..  
7900: 7b 20 22 57 61 69 74 46 6f 72 53 69 6e 67 6c 65  { "WaitForSingle
7910: 4f 62 6a 65 63 74 45 78 22 2c 20 20 20 28 53 59  ObjectEx",   (SY
7920: 53 43 41 4c 4c 29 57 61 69 74 46 6f 72 53 69 6e  SCALL)WaitForSin
7930: 67 6c 65 4f 62 6a 65 63 74 45 78 2c 20 20 20 30  gleObjectEx,   0
7940: 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 57   },..#define osW
7950: 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65  aitForSingleObje
7960: 63 74 45 78 20 28 28 44 57 4f 52 44 28 57 49 4e  ctEx ((DWORD(WIN
7970: 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f  API*)(HANDLE,DWO
7980: 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 42 4f  RD, \.        BO
7990: 4f 4c 29 29 61 53 79 73 63 61 6c 6c 5b 36 34 5d  OL))aSyscall[64]
79a0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
79b0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
79c0: 20 20 7b 20 22 53 65 74 46 69 6c 65 50 6f 69 6e    { "SetFilePoin
79d0: 74 65 72 45 78 22 2c 20 20 20 20 20 20 20 20 28  terEx",        (
79e0: 53 59 53 43 41 4c 4c 29 53 65 74 46 69 6c 65 50  SYSCALL)SetFileP
79f0: 6f 69 6e 74 65 72 45 78 2c 20 20 20 20 20 20 20  ointerEx,       
7a00: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
7a10: 22 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 45  "SetFilePointerE
7a20: 78 22 2c 20 20 20 20 20 20 20 20 28 53 59 53 43  x",        (SYSC
7a30: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
7a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
7a50: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
7a60: 65 20 6f 73 53 65 74 46 69 6c 65 50 6f 69 6e 74  e osSetFilePoint
7a70: 65 72 45 78 20 28 28 42 4f 4f 4c 28 57 49 4e 41  erEx ((BOOL(WINA
7a80: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 41 52 47  PI*)(HANDLE,LARG
7a90: 45 5f 49 4e 54 45 47 45 52 2c 20 5c 0a 20 20 20  E_INTEGER, \.   
7aa0: 20 20 20 20 20 50 4c 41 52 47 45 5f 49 4e 54 45       PLARGE_INTE
7ab0: 47 45 52 2c 44 57 4f 52 44 29 29 61 53 79 73 63  GER,DWORD))aSysc
7ac0: 61 6c 6c 5b 36 35 5d 2e 70 43 75 72 72 65 6e 74  all[65].pCurrent
7ad0: 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  )..#if SQLITE_OS
7ae0: 5f 57 49 4e 52 54 0a 20 20 7b 20 22 47 65 74 46  _WINRT.  { "GetF
7af0: 69 6c 65 49 6e 66 6f 72 6d 61 74 69 6f 6e 42 79  ileInformationBy
7b00: 48 61 6e 64 6c 65 45 78 22 2c 20 28 53 59 53 43  HandleEx", (SYSC
7b10: 41 4c 4c 29 47 65 74 46 69 6c 65 49 6e 66 6f 72  ALL)GetFileInfor
7b20: 6d 61 74 69 6f 6e 42 79 48 61 6e 64 6c 65 45 78  mationByHandleEx
7b30: 2c 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b  , 0 },.#else.  {
7b40: 20 22 47 65 74 46 69 6c 65 49 6e 66 6f 72 6d 61   "GetFileInforma
7b50: 74 69 6f 6e 42 79 48 61 6e 64 6c 65 45 78 22 2c  tionByHandleEx",
7b60: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
7b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
7b80: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
7b90: 6e 65 20 6f 73 47 65 74 46 69 6c 65 49 6e 66 6f  ne osGetFileInfo
7ba0: 72 6d 61 74 69 6f 6e 42 79 48 61 6e 64 6c 65 45  rmationByHandleE
7bb0: 78 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  x ((BOOL(WINAPI*
7bc0: 29 28 48 41 4e 44 4c 45 2c 20 5c 0a 20 20 20 20  )(HANDLE, \.    
7bd0: 20 20 20 20 46 49 4c 45 5f 49 4e 46 4f 5f 42 59      FILE_INFO_BY
7be0: 5f 48 41 4e 44 4c 45 5f 43 4c 41 53 53 2c 4c 50  _HANDLE_CLASS,LP
7bf0: 56 4f 49 44 2c 44 57 4f 52 44 29 29 61 53 79 73  VOID,DWORD))aSys
7c00: 63 61 6c 6c 5b 36 36 5d 2e 70 43 75 72 72 65 6e  call[66].pCurren
7c10: 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  t)..#if SQLITE_O
7c20: 53 5f 57 49 4e 52 54 20 26 26 20 21 64 65 66 69  S_WINRT && !defi
7c30: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
7c40: 57 41 4c 29 0a 20 20 7b 20 22 4d 61 70 56 69 65  WAL).  { "MapVie
7c50: 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 22 2c  wOfFileFromApp",
7c60: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4d 61 70      (SYSCALL)Map
7c70: 56 69 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70  ViewOfFileFromAp
7c80: 70 2c 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65  p,    0 },.#else
7c90: 0a 20 20 7b 20 22 4d 61 70 56 69 65 77 4f 66 46  .  { "MapViewOfF
7ca0: 69 6c 65 46 72 6f 6d 41 70 70 22 2c 20 20 20 20  ileFromApp",    
7cb0: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
7cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7cd0: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
7ce0: 64 65 66 69 6e 65 20 6f 73 4d 61 70 56 69 65 77  define osMapView
7cf0: 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 20 28 28  OfFileFromApp ((
7d00: 4c 50 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28  LPVOID(WINAPI*)(
7d10: 48 41 4e 44 4c 45 2c 55 4c 4f 4e 47 2c 55 4c 4f  HANDLE,ULONG,ULO
7d20: 4e 47 36 34 2c 20 5c 0a 20 20 20 20 20 20 20 20  NG64, \.        
7d30: 53 49 5a 45 5f 54 29 29 61 53 79 73 63 61 6c 6c  SIZE_T))aSyscall
7d40: 5b 36 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [67].pCurrent)..
7d50: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
7d60: 4e 52 54 0a 20 20 7b 20 22 43 72 65 61 74 65 46  NRT.  { "CreateF
7d70: 69 6c 65 32 22 2c 20 20 20 20 20 20 20 20 20 20  ile2",          
7d80: 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72 65 61     (SYSCALL)Crea
7d90: 74 65 46 69 6c 65 32 2c 20 20 20 20 20 20 20 20  teFile2,        
7da0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
7db0: 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65 32    { "CreateFile2
7dc0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ",             (
7dd0: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
7de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7df0: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
7e00: 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65 46 69  efine osCreateFi
7e10: 6c 65 32 20 28 28 48 41 4e 44 4c 45 28 57 49 4e  le2 ((HANDLE(WIN
7e20: 41 50 49 2a 29 28 4c 50 43 57 53 54 52 2c 44 57  API*)(LPCWSTR,DW
7e30: 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c  ORD,DWORD,DWORD,
7e40: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 43 52 45   \.        LPCRE
7e50: 41 54 45 46 49 4c 45 32 5f 45 58 54 45 4e 44 45  ATEFILE2_EXTENDE
7e60: 44 5f 50 41 52 41 4d 45 54 45 52 53 29 29 61 53  D_PARAMETERS))aS
7e70: 79 73 63 61 6c 6c 5b 36 38 5d 2e 70 43 75 72 72  yscall[68].pCurr
7e80: 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45  ent)..#if SQLITE
7e90: 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 21 64 65  _OS_WINRT && !de
7ea0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
7eb0: 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  T_LOAD_EXTENSION
7ec0: 29 0a 20 20 7b 20 22 4c 6f 61 64 50 61 63 6b 61  ).  { "LoadPacka
7ed0: 67 65 64 4c 69 62 72 61 72 79 22 2c 20 20 20 20  gedLibrary",    
7ee0: 20 28 53 59 53 43 41 4c 4c 29 4c 6f 61 64 50 61   (SYSCALL)LoadPa
7ef0: 63 6b 61 67 65 64 4c 69 62 72 61 72 79 2c 20 20  ckagedLibrary,  
7f00: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
7f10: 7b 20 22 4c 6f 61 64 50 61 63 6b 61 67 65 64 4c  { "LoadPackagedL
7f20: 69 62 72 61 72 79 22 2c 20 20 20 20 20 28 53 59  ibrary",     (SY
7f30: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
7f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
7f50: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
7f60: 69 6e 65 20 6f 73 4c 6f 61 64 50 61 63 6b 61 67  ine osLoadPackag
7f70: 65 64 4c 69 62 72 61 72 79 20 28 28 48 4d 4f 44  edLibrary ((HMOD
7f80: 55 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 43  ULE(WINAPI*)(LPC
7f90: 57 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20  WSTR, \.        
7fa0: 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b  DWORD))aSyscall[
7fb0: 36 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  69].pCurrent)..#
7fc0: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
7fd0: 52 54 0a 20 20 7b 20 22 47 65 74 54 69 63 6b 43  RT.  { "GetTickC
7fe0: 6f 75 6e 74 36 34 22 2c 20 20 20 20 20 20 20 20  ount64",        
7ff0: 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 54 69    (SYSCALL)GetTi
8000: 63 6b 43 6f 75 6e 74 36 34 2c 20 20 20 20 20 20  ckCount64,      
8010: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
8020: 20 7b 20 22 47 65 74 54 69 63 6b 43 6f 75 6e 74   { "GetTickCount
8030: 36 34 22 2c 20 20 20 20 20 20 20 20 20 20 28 53  64",          (S
8040: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
8050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8060: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
8070: 66 69 6e 65 20 6f 73 47 65 74 54 69 63 6b 43 6f  fine osGetTickCo
8080: 75 6e 74 36 34 20 28 28 55 4c 4f 4e 47 4c 4f 4e  unt64 ((ULONGLON
8090: 47 28 57 49 4e 41 50 49 2a 29 28 56 4f 49 44 29  G(WINAPI*)(VOID)
80a0: 29 61 53 79 73 63 61 6c 6c 5b 37 30 5d 2e 70 43  )aSyscall[70].pC
80b0: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c  urrent)..#if SQL
80c0: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b  ITE_OS_WINRT.  {
80d0: 20 22 47 65 74 4e 61 74 69 76 65 53 79 73 74 65   "GetNativeSyste
80e0: 6d 49 6e 66 6f 22 2c 20 20 20 20 20 28 53 59 53  mInfo",     (SYS
80f0: 43 41 4c 4c 29 47 65 74 4e 61 74 69 76 65 53 79  CALL)GetNativeSy
8100: 73 74 65 6d 49 6e 66 6f 2c 20 20 20 20 20 30 20  stemInfo,     0 
8110: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65  },.#else.  { "Ge
8120: 74 4e 61 74 69 76 65 53 79 73 74 65 6d 49 6e 66  tNativeSystemInf
8130: 6f 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c 4c  o",     (SYSCALL
8140: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
8150: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
8160: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
8170: 73 47 65 74 4e 61 74 69 76 65 53 79 73 74 65 6d  sGetNativeSystem
8180: 49 6e 66 6f 20 28 28 56 4f 49 44 28 57 49 4e 41  Info ((VOID(WINA
8190: 50 49 2a 29 28 20 5c 0a 20 20 20 20 20 20 20 20  PI*)( \.        
81a0: 4c 50 53 59 53 54 45 4d 5f 49 4e 46 4f 29 29 61  LPSYSTEM_INFO))a
81b0: 53 79 73 63 61 6c 6c 5b 37 31 5d 2e 70 43 75 72  Syscall[71].pCur
81c0: 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e  rent)..#if defin
81d0: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
81e0: 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 4f  HAS_ANSI).  { "O
81f0: 75 74 70 75 74 44 65 62 75 67 53 74 72 69 6e 67  utputDebugString
8200: 41 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c  A",      (SYSCAL
8210: 4c 29 4f 75 74 70 75 74 44 65 62 75 67 53 74 72  L)OutputDebugStr
8220: 69 6e 67 41 2c 20 20 20 20 20 20 30 20 7d 2c 0a  ingA,      0 },.
8230: 23 65 6c 73 65 0a 20 20 7b 20 22 4f 75 74 70 75  #else.  { "Outpu
8240: 74 44 65 62 75 67 53 74 72 69 6e 67 41 22 2c 20  tDebugStringA", 
8250: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
8260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8270: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
8280: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4f 75  if..#define osOu
8290: 74 70 75 74 44 65 62 75 67 53 74 72 69 6e 67 41  tputDebugStringA
82a0: 20 28 28 56 4f 49 44 28 57 49 4e 41 50 49 2a 29   ((VOID(WINAPI*)
82b0: 28 4c 50 43 53 54 52 29 29 61 53 79 73 63 61 6c  (LPCSTR))aSyscal
82c0: 6c 5b 37 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[72].pCurrent).
82d0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
82e0: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
82f0: 44 45 29 0a 20 20 7b 20 22 4f 75 74 70 75 74 44  DE).  { "OutputD
8300: 65 62 75 67 53 74 72 69 6e 67 57 22 2c 20 20 20  ebugStringW",   
8310: 20 20 20 28 53 59 53 43 41 4c 4c 29 4f 75 74 70     (SYSCALL)Outp
8320: 75 74 44 65 62 75 67 53 74 72 69 6e 67 57 2c 20  utDebugStringW, 
8330: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
8340: 20 20 7b 20 22 4f 75 74 70 75 74 44 65 62 75 67    { "OutputDebug
8350: 53 74 72 69 6e 67 57 22 2c 20 20 20 20 20 20 28  StringW",      (
8360: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
8370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8380: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
8390: 65 66 69 6e 65 20 6f 73 4f 75 74 70 75 74 44 65  efine osOutputDe
83a0: 62 75 67 53 74 72 69 6e 67 57 20 28 28 56 4f 49  bugStringW ((VOI
83b0: 44 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53  D(WINAPI*)(LPCWS
83c0: 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 37 33 5d  TR))aSyscall[73]
83d0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
83e0: 22 47 65 74 50 72 6f 63 65 73 73 48 65 61 70 22  "GetProcessHeap"
83f0: 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43  ,          (SYSC
8400: 41 4c 4c 29 47 65 74 50 72 6f 63 65 73 73 48 65  ALL)GetProcessHe
8410: 61 70 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d  ap,          0 }
8420: 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  ,..#define osGet
8430: 50 72 6f 63 65 73 73 48 65 61 70 20 28 28 48 41  ProcessHeap ((HA
8440: 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 56 4f  NDLE(WINAPI*)(VO
8450: 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 37 34 5d  ID))aSyscall[74]
8460: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
8470: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20  SQLITE_OS_WINRT 
8480: 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
8490: 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 0a 20 20 7b  TE_OMIT_WAL).  {
84a0: 20 22 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70   "CreateFileMapp
84b0: 69 6e 67 46 72 6f 6d 41 70 70 22 2c 20 28 53 59  ingFromApp", (SY
84c0: 53 43 41 4c 4c 29 43 72 65 61 74 65 46 69 6c 65  SCALL)CreateFile
84d0: 4d 61 70 70 69 6e 67 46 72 6f 6d 41 70 70 2c 20  MappingFromApp, 
84e0: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
84f0: 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e  CreateFileMappin
8500: 67 46 72 6f 6d 41 70 70 22 2c 20 28 53 59 53 43  gFromApp", (SYSC
8510: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
8520: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
8530: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
8540: 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70   osCreateFileMap
8550: 70 69 6e 67 46 72 6f 6d 41 70 70 20 28 28 48 41  pingFromApp ((HA
8560: 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 48 41  NDLE(WINAPI*)(HA
8570: 4e 44 4c 45 2c 20 5c 0a 20 20 20 20 20 20 20 20  NDLE, \.        
8580: 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54 52 49  LPSECURITY_ATTRI
8590: 42 55 54 45 53 2c 55 4c 4f 4e 47 2c 55 4c 4f 4e  BUTES,ULONG,ULON
85a0: 47 36 34 2c 4c 50 43 57 53 54 52 29 29 61 53 79  G64,LPCWSTR))aSy
85b0: 73 63 61 6c 6c 5b 37 35 5d 2e 70 43 75 72 72 65  scall[75].pCurre
85c0: 6e 74 29 0a 0a 2f 2a 0a 2a 2a 20 4e 4f 54 45 3a  nt)../*.** NOTE:
85d0: 20 4f 6e 20 73 6f 6d 65 20 73 75 62 2d 70 6c 61   On some sub-pla
85e0: 74 66 6f 72 6d 73 2c 20 74 68 65 20 49 6e 74 65  tforms, the Inte
85f0: 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72 65 45 78  rlockedCompareEx
8600: 63 68 61 6e 67 65 20 22 66 75 6e 63 74 69 6f 6e  change "function
8610: 22 0a 2a 2a 20 20 20 20 20 20 20 69 73 20 72 65  ".**       is re
8620: 61 6c 6c 79 20 6a 75 73 74 20 61 20 6d 61 63 72  ally just a macr
8630: 6f 20 74 68 61 74 20 75 73 65 73 20 61 20 63 6f  o that uses a co
8640: 6d 70 69 6c 65 72 20 69 6e 74 72 69 6e 73 69 63  mpiler intrinsic
8650: 20 28 65 2e 67 2e 20 78 36 34 29 2e 0a 2a 2a 20   (e.g. x64)..** 
8660: 20 20 20 20 20 20 53 6f 20 64 6f 20 6e 6f 74 20        So do not 
8670: 74 72 79 20 74 6f 20 6d 61 6b 65 20 74 68 69 73  try to make this
8680: 20 69 73 20 69 6e 74 6f 20 61 20 72 65 64 65 66   is into a redef
8690: 69 6e 61 62 6c 65 20 69 6e 74 65 72 66 61 63 65  inable interface
86a0: 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64  ..*/.#if defined
86b0: 28 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70  (InterlockedComp
86c0: 61 72 65 45 78 63 68 61 6e 67 65 29 0a 20 20 7b  areExchange).  {
86d0: 20 22 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d   "InterlockedCom
86e0: 70 61 72 65 45 78 63 68 61 6e 67 65 22 2c 20 28  pareExchange", (
86f0: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
8700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
8710: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 49 6e  },..#define osIn
8720: 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72 65  terlockedCompare
8730: 45 78 63 68 61 6e 67 65 20 49 6e 74 65 72 6c 6f  Exchange Interlo
8740: 63 6b 65 64 43 6f 6d 70 61 72 65 45 78 63 68 61  ckedCompareExcha
8750: 6e 67 65 0a 23 65 6c 73 65 0a 20 20 7b 20 22 49  nge.#else.  { "I
8760: 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72  nterlockedCompar
8770: 65 45 78 63 68 61 6e 67 65 22 2c 20 28 53 59 53  eExchange", (SYS
8780: 43 41 4c 4c 29 49 6e 74 65 72 6c 6f 63 6b 65 64  CALL)Interlocked
8790: 43 6f 6d 70 61 72 65 45 78 63 68 61 6e 67 65 2c  CompareExchange,
87a0: 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f   0 },..#define o
87b0: 73 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70  sInterlockedComp
87c0: 61 72 65 45 78 63 68 61 6e 67 65 20 28 28 4c 4f  areExchange ((LO
87d0: 4e 47 28 57 49 4e 41 50 49 2a 29 28 4c 4f 4e 47  NG(WINAPI*)(LONG
87e0: 20 5c 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54   \.        SQLIT
87f0: 45 5f 57 49 4e 33 32 5f 56 4f 4c 41 54 49 4c 45  E_WIN32_VOLATILE
8800: 2a 2c 20 4c 4f 4e 47 2c 4c 4f 4e 47 29 29 61 53  *, LONG,LONG))aS
8810: 79 73 63 61 6c 6c 5b 37 36 5d 2e 70 43 75 72 72  yscall[76].pCurr
8820: 65 6e 74 29 0a 23 65 6e 64 69 66 20 2f 2a 20 64  ent).#endif /* d
8830: 65 66 69 6e 65 64 28 49 6e 74 65 72 6c 6f 63 6b  efined(Interlock
8840: 65 64 43 6f 6d 70 61 72 65 45 78 63 68 61 6e 67  edCompareExchang
8850: 65 29 20 2a 2f 0a 0a 7d 3b 20 2f 2a 20 45 6e 64  e) */..}; /* End
8860: 20 6f 66 20 74 68 65 20 6f 76 65 72 72 69 64 65   of the override
8870: 61 62 6c 65 20 73 79 73 74 65 6d 20 63 61 6c 6c  able system call
8880: 73 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  s */../*.** This
8890: 20 69 73 20 74 68 65 20 78 53 65 74 53 79 73 74   is the xSetSyst
88a0: 65 6d 43 61 6c 6c 28 29 20 6d 65 74 68 6f 64 20  emCall() method 
88b0: 6f 66 20 73 71 6c 69 74 65 33 5f 76 66 73 20 66  of sqlite3_vfs f
88c0: 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65 0a 2a 2a  or all of the.**
88d0: 20 22 77 69 6e 33 32 22 20 56 46 53 65 73 2e 20   "win32" VFSes. 
88e0: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
88f0: 4b 20 6f 70 6f 6e 20 73 75 63 63 65 73 73 66 75  K opon successfu
8900: 6c 6c 79 20 75 70 64 61 74 69 6e 67 20 74 68 65  lly updating the
8910: 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  .** system call 
8920: 70 6f 69 6e 74 65 72 2c 20 6f 72 20 53 51 4c 49  pointer, or SQLI
8930: 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 69 66 20 74  TE_NOTFOUND if t
8940: 68 65 72 65 20 69 73 20 6e 6f 20 63 6f 6e 66 69  here is no confi
8950: 67 75 72 61 62 6c 65 0a 2a 2a 20 73 79 73 74 65  gurable.** syste
8960: 6d 20 63 61 6c 6c 20 6e 61 6d 65 64 20 7a 4e 61  m call named zNa
8970: 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  me..*/.static in
8980: 74 20 77 69 6e 53 65 74 53 79 73 74 65 6d 43 61  t winSetSystemCa
8990: 6c 6c 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  ll(.  sqlite3_vf
89a0: 73 20 2a 70 4e 6f 74 55 73 65 64 2c 20 20 20 20  s *pNotUsed,    
89b0: 20 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20 70      /* The VFS p
89c0: 6f 69 6e 74 65 72 2e 20 20 4e 6f 74 20 75 73 65  ointer.  Not use
89d0: 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  d */.  const cha
89e0: 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20  r *zName,       
89f0: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
8a00: 73 79 73 74 65 6d 20 63 61 6c 6c 20 74 6f 20 6f  system call to o
8a10: 76 65 72 72 69 64 65 20 2a 2f 0a 20 20 73 71 6c  verride */.  sql
8a20: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
8a30: 20 70 4e 65 77 46 75 6e 63 20 20 2f 2a 20 50 6f   pNewFunc  /* Po
8a40: 69 6e 74 65 72 20 74 6f 20 6e 65 77 20 73 79 73  inter to new sys
8a50: 74 65 6d 20 63 61 6c 6c 20 76 61 6c 75 65 20 2a  tem call value *
8a60: 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  /.){.  unsigned 
8a70: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 20  int i;.  int rc 
8a80: 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  = SQLITE_NOTFOUN
8a90: 44 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  D;..  UNUSED_PAR
8aa0: 41 4d 45 54 45 52 28 70 4e 6f 74 55 73 65 64 29  AMETER(pNotUsed)
8ab0: 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30  ;.  if( zName==0
8ac0: 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f   ){.    /* If no
8ad0: 20 7a 4e 61 6d 65 20 69 73 20 67 69 76 65 6e 2c   zName is given,
8ae0: 20 72 65 73 74 6f 72 65 20 61 6c 6c 20 73 79 73   restore all sys
8af0: 74 65 6d 20 63 61 6c 6c 73 20 74 6f 20 74 68 65  tem calls to the
8b00: 69 72 20 64 65 66 61 75 6c 74 0a 20 20 20 20 2a  ir default.    *
8b10: 2a 20 73 65 74 74 69 6e 67 73 20 61 6e 64 20 72  * settings and r
8b20: 65 74 75 72 6e 20 4e 55 4c 4c 0a 20 20 20 20 2a  eturn NULL.    *
8b30: 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  /.    rc = SQLIT
8b40: 45 5f 4f 4b 3b 0a 20 20 20 20 66 6f 72 28 69 3d  E_OK;.    for(i=
8b50: 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 79 73  0; i<sizeof(aSys
8b60: 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53 79  call)/sizeof(aSy
8b70: 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b  scall[0]); i++){
8b80: 0a 20 20 20 20 20 20 69 66 28 20 61 53 79 73 63  .      if( aSysc
8b90: 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 20  all[i].pDefault 
8ba0: 29 7b 0a 20 20 20 20 20 20 20 20 61 53 79 73 63  ){.        aSysc
8bb0: 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 20  all[i].pCurrent 
8bc0: 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44  = aSyscall[i].pD
8bd0: 65 66 61 75 6c 74 3b 0a 20 20 20 20 20 20 7d 0a  efault;.      }.
8be0: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
8bf0: 20 20 20 2f 2a 20 49 66 20 7a 4e 61 6d 65 20 69     /* If zName i
8c00: 73 20 73 70 65 63 69 66 69 65 64 2c 20 6f 70 65  s specified, ope
8c10: 72 61 74 65 20 6f 6e 20 6f 6e 6c 79 20 74 68 65  rate on only the
8c20: 20 6f 6e 65 20 73 79 73 74 65 6d 20 63 61 6c 6c   one system call
8c30: 0a 20 20 20 20 2a 2a 20 73 70 65 63 69 66 69 65  .    ** specifie
8c40: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  d..    */.    fo
8c50: 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28  r(i=0; i<sizeof(
8c60: 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66  aSyscall)/sizeof
8c70: 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69  (aSyscall[0]); i
8c80: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  ++){.      if( s
8c90: 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79  trcmp(zName, aSy
8ca0: 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d  scall[i].zName)=
8cb0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  =0 ){.        if
8cc0: 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44  ( aSyscall[i].pD
8cd0: 65 66 61 75 6c 74 3d 3d 30 20 29 7b 0a 20 20 20  efault==0 ){.   
8ce0: 20 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b         aSyscall[
8cf0: 69 5d 2e 70 44 65 66 61 75 6c 74 20 3d 20 61 53  i].pDefault = aS
8d00: 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65  yscall[i].pCurre
8d10: 6e 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  nt;.        }.  
8d20: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
8d30: 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 69 66  E_OK;.        if
8d40: 28 20 70 4e 65 77 46 75 6e 63 3d 3d 30 20 29 20  ( pNewFunc==0 ) 
8d50: 70 4e 65 77 46 75 6e 63 20 3d 20 61 53 79 73 63  pNewFunc = aSysc
8d60: 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3b  all[i].pDefault;
8d70: 0a 20 20 20 20 20 20 20 20 61 53 79 73 63 61 6c  .        aSyscal
8d80: 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 20 3d 20  l[i].pCurrent = 
8d90: 70 4e 65 77 46 75 6e 63 3b 0a 20 20 20 20 20 20  pNewFunc;.      
8da0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
8db0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
8dc0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
8dd0: 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75   Return the valu
8de0: 65 20 6f 66 20 61 20 73 79 73 74 65 6d 20 63 61  e of a system ca
8df0: 6c 6c 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c  ll.  Return NULL
8e00: 20 69 66 20 7a 4e 61 6d 65 20 69 73 20 6e 6f 74   if zName is not
8e10: 20 61 0a 2a 2a 20 72 65 63 6f 67 6e 69 7a 65 64   a.** recognized
8e20: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6e 61 6d   system call nam
8e30: 65 2e 20 20 4e 55 4c 4c 20 69 73 20 61 6c 73 6f  e.  NULL is also
8e40: 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65   returned if the
8e50: 20 73 79 73 74 65 6d 20 63 61 6c 6c 0a 2a 2a 20   system call.** 
8e60: 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  is currently und
8e70: 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  efined..*/.stati
8e80: 63 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c  c sqlite3_syscal
8e90: 6c 5f 70 74 72 20 77 69 6e 47 65 74 53 79 73 74  l_ptr winGetSyst
8ea0: 65 6d 43 61 6c 6c 28 0a 20 20 73 71 6c 69 74 65  emCall(.  sqlite
8eb0: 33 5f 76 66 73 20 2a 70 4e 6f 74 55 73 65 64 2c  3_vfs *pNotUsed,
8ec0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
8ed0: 4e 61 6d 65 0a 29 7b 0a 20 20 75 6e 73 69 67 6e  Name.){.  unsign
8ee0: 65 64 20 69 6e 74 20 69 3b 0a 0a 20 20 55 4e 55  ed int i;..  UNU
8ef0: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 4e  SED_PARAMETER(pN
8f00: 6f 74 55 73 65 64 29 3b 0a 20 20 66 6f 72 28 69  otUsed);.  for(i
8f10: 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 79  =0; i<sizeof(aSy
8f20: 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53  scall)/sizeof(aS
8f30: 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29  yscall[0]); i++)
8f40: 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  {.    if( strcmp
8f50: 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c  (zName, aSyscall
8f60: 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20  [i].zName)==0 ) 
8f70: 72 65 74 75 72 6e 20 61 53 79 73 63 61 6c 6c 5b  return aSyscall[
8f80: 69 5d 2e 70 43 75 72 72 65 6e 74 3b 0a 20 20 7d  i].pCurrent;.  }
8f90: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
8fa0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
8fb0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 72   name of the fir
8fc0: 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 61  st system call a
8fd0: 66 74 65 72 20 7a 4e 61 6d 65 2e 20 20 49 66 20  fter zName.  If 
8fe0: 7a 4e 61 6d 65 3d 3d 4e 55 4c 4c 0a 2a 2a 20 74  zName==NULL.** t
8ff0: 68 65 6e 20 72 65 74 75 72 6e 20 74 68 65 20 6e  hen return the n
9000: 61 6d 65 20 6f 66 20 74 68 65 20 66 69 72 73 74  ame of the first
9010: 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 52   system call.  R
9020: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e  eturn NULL if zN
9030: 61 6d 65 0a 2a 2a 20 69 73 20 74 68 65 20 6c 61  ame.** is the la
9040: 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6f  st system call o
9050: 72 20 69 66 20 7a 4e 61 6d 65 20 69 73 20 6e 6f  r if zName is no
9060: 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  t the name of a 
9070: 76 61 6c 69 64 0a 2a 2a 20 73 79 73 74 65 6d 20  valid.** system 
9080: 63 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  call..*/.static 
9090: 63 6f 6e 73 74 20 63 68 61 72 20 2a 77 69 6e 4e  const char *winN
90a0: 65 78 74 53 79 73 74 65 6d 43 61 6c 6c 28 73 71  extSystemCall(sq
90b0: 6c 69 74 65 33 5f 76 66 73 20 2a 70 2c 20 63 6f  lite3_vfs *p, co
90c0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29  nst char *zName)
90d0: 7b 0a 20 20 69 6e 74 20 69 20 3d 20 2d 31 3b 0a  {.  int i = -1;.
90e0: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
90f0: 54 45 52 28 70 29 3b 0a 20 20 69 66 28 20 7a 4e  TER(p);.  if( zN
9100: 61 6d 65 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  ame ){.    for(i
9110: 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28  =0; i<ArraySize(
9120: 61 53 79 73 63 61 6c 6c 29 2d 31 3b 20 69 2b 2b  aSyscall)-1; i++
9130: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72  ){.      if( str
9140: 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63  cmp(zName, aSysc
9150: 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  all[i].zName)==0
9160: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
9170: 20 20 7d 0a 20 20 66 6f 72 28 69 2b 2b 3b 20 69    }.  for(i++; i
9180: 3c 41 72 72 61 79 53 69 7a 65 28 61 53 79 73 63  <ArraySize(aSysc
9190: 61 6c 6c 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  all); i++){.    
91a0: 69 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e  if( aSyscall[i].
91b0: 70 43 75 72 72 65 6e 74 21 3d 30 20 29 20 72 65  pCurrent!=0 ) re
91c0: 74 75 72 6e 20 61 53 79 73 63 61 6c 6c 5b 69 5d  turn aSyscall[i]
91d0: 2e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 72 65  .zName;.  }.  re
91e0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66 64 65  turn 0;.}..#ifde
91f0: 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d  f SQLITE_WIN32_M
9200: 41 4c 4c 4f 43 0a 2f 2a 0a 2a 2a 20 49 66 20 61  ALLOC./*.** If a
9210: 20 57 69 6e 33 32 20 6e 61 74 69 76 65 20 68 65   Win32 native he
9220: 61 70 20 68 61 73 20 62 65 65 6e 20 63 6f 6e 66  ap has been conf
9230: 69 67 75 72 65 64 2c 20 74 68 69 73 20 66 75 6e  igured, this fun
9240: 63 74 69 6f 6e 20 77 69 6c 6c 20 61 74 74 65 6d  ction will attem
9250: 70 74 20 74 6f 0a 2a 2a 20 63 6f 6d 70 61 63 74  pt to.** compact
9260: 20 69 74 2e 20 20 55 70 6f 6e 20 73 75 63 63 65   it.  Upon succe
9270: 73 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 77 69  ss, SQLITE_OK wi
9280: 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20  ll be returned. 
9290: 20 55 70 6f 6e 20 66 61 69 6c 75 72 65 2c 20 6f   Upon failure, o
92a0: 6e 65 0a 2a 2a 20 6f 66 20 53 51 4c 49 54 45 5f  ne.** of SQLITE_
92b0: 4e 4f 4d 45 4d 2c 20 53 51 4c 49 54 45 5f 45 52  NOMEM, SQLITE_ER
92c0: 52 4f 52 2c 20 6f 72 20 53 51 4c 49 54 45 5f 4e  ROR, or SQLITE_N
92d0: 4f 54 46 4f 55 4e 44 20 77 69 6c 6c 20 62 65 20  OTFOUND will be 
92e0: 72 65 74 75 72 6e 65 64 2e 20 20 54 68 65 0a 2a  returned.  The.*
92f0: 2a 20 22 70 6e 4c 61 72 67 65 73 74 22 20 61 72  * "pnLargest" ar
9300: 67 75 6d 65 6e 74 2c 20 69 66 20 6e 6f 6e 2d 7a  gument, if non-z
9310: 65 72 6f 2c 20 77 69 6c 6c 20 62 65 20 75 73 65  ero, will be use
9320: 64 20 74 6f 20 72 65 74 75 72 6e 20 74 68 65 20  d to return the 
9330: 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 6c  size of the.** l
9340: 61 72 67 65 73 74 20 63 6f 6d 6d 69 74 74 65 64  argest committed
9350: 20 66 72 65 65 20 62 6c 6f 63 6b 20 69 6e 20 74   free block in t
9360: 68 65 20 68 65 61 70 2c 20 69 6e 20 62 79 74 65  he heap, in byte
9370: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
9380: 33 5f 77 69 6e 33 32 5f 63 6f 6d 70 61 63 74 5f  3_win32_compact_
9390: 68 65 61 70 28 4c 50 55 49 4e 54 20 70 6e 4c 61  heap(LPUINT pnLa
93a0: 72 67 65 73 74 29 7b 0a 20 20 69 6e 74 20 72 63  rgest){.  int rc
93b0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
93c0: 55 49 4e 54 20 6e 4c 61 72 67 65 73 74 20 3d 20  UINT nLargest = 
93d0: 30 3b 0a 20 20 48 41 4e 44 4c 45 20 68 48 65 61  0;.  HANDLE hHea
93e0: 70 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65  p;..  winMemAsse
93f0: 72 74 4d 61 67 69 63 28 29 3b 0a 20 20 68 48 65  rtMagic();.  hHe
9400: 61 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74 48 65  ap = winMemGetHe
9410: 61 70 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ap();.  assert( 
9420: 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61 73  hHeap!=0 );.  as
9430: 73 65 72 74 28 20 68 48 65 61 70 21 3d 49 4e 56  sert( hHeap!=INV
9440: 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
9450: 45 20 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45  E );.#if !SQLITE
9460: 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66  _OS_WINRT && def
9470: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
9480: 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54  2_MALLOC_VALIDAT
9490: 45 29 0a 20 20 61 73 73 65 72 74 28 20 6f 73 48  E).  assert( osH
94a0: 65 61 70 56 61 6c 69 64 61 74 65 28 68 48 65 61  eapValidate(hHea
94b0: 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  p, SQLITE_WIN32_
94c0: 48 45 41 50 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c  HEAP_FLAGS, NULL
94d0: 29 20 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  ) );.#endif.#if 
94e0: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45  !SQLITE_OS_WINCE
94f0: 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57   && !SQLITE_OS_W
9500: 49 4e 52 54 0a 20 20 69 66 28 20 28 6e 4c 61 72  INRT.  if( (nLar
9510: 67 65 73 74 3d 6f 73 48 65 61 70 43 6f 6d 70 61  gest=osHeapCompa
9520: 63 74 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45  ct(hHeap, SQLITE
9530: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47  _WIN32_HEAP_FLAG
9540: 53 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 44 57  S))==0 ){.    DW
9550: 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20  ORD lastErrno = 
9560: 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
9570: 3b 0a 20 20 20 20 69 66 28 20 6c 61 73 74 45 72  ;.    if( lastEr
9580: 72 6e 6f 3d 3d 4e 4f 5f 45 52 52 4f 52 20 29 7b  rno==NO_ERROR ){
9590: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c  .      sqlite3_l
95a0: 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c  og(SQLITE_NOMEM,
95b0: 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65 61 70   "failed to Heap
95c0: 43 6f 6d 70 61 63 74 20 28 6e 6f 20 73 70 61 63  Compact (no spac
95d0: 65 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20  e), heap=%p",.  
95e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
95f0: 28 76 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a 20  (void*)hHeap);. 
9600: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
9610: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73  _NOMEM;.    }els
9620: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
9630: 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 45 52 52 4f  _log(SQLITE_ERRO
9640: 52 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65  R, "failed to He
9650: 61 70 43 6f 6d 70 61 63 74 20 28 25 6c 75 29 2c  apCompact (%lu),
9660: 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20 20   heap=%p",.     
9670: 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47               osG
9680: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 28  etLastError(), (
9690: 76 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a 20 20  void*)hHeap);.  
96a0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
96b0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d  ERROR;.    }.  }
96c0: 0a 23 65 6c 73 65 0a 20 20 73 71 6c 69 74 65 33  .#else.  sqlite3
96d0: 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 54 46  _log(SQLITE_NOTF
96e0: 4f 55 4e 44 2c 20 22 66 61 69 6c 65 64 20 74 6f  OUND, "failed to
96f0: 20 48 65 61 70 43 6f 6d 70 61 63 74 2c 20 68 65   HeapCompact, he
9700: 61 70 3d 25 70 22 2c 0a 20 20 20 20 20 20 20 20  ap=%p",.        
9710: 20 20 20 20 20 20 28 76 6f 69 64 2a 29 68 48 65        (void*)hHe
9720: 61 70 29 3b 0a 20 20 72 63 20 3d 20 53 51 4c 49  ap);.  rc = SQLI
9730: 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 23 65 6e  TE_NOTFOUND;.#en
9740: 64 69 66 0a 20 20 69 66 28 20 70 6e 4c 61 72 67  dif.  if( pnLarg
9750: 65 73 74 20 29 20 2a 70 6e 4c 61 72 67 65 73 74  est ) *pnLargest
9760: 20 3d 20 6e 4c 61 72 67 65 73 74 3b 0a 20 20 72   = nLargest;.  r
9770: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
9780: 2a 2a 20 49 66 20 61 20 57 69 6e 33 32 20 6e 61  ** If a Win32 na
9790: 74 69 76 65 20 68 65 61 70 20 68 61 73 20 62 65  tive heap has be
97a0: 65 6e 20 63 6f 6e 66 69 67 75 72 65 64 2c 20 74  en configured, t
97b0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c  his function wil
97c0: 6c 20 61 74 74 65 6d 70 74 20 74 6f 0a 2a 2a 20  l attempt to.** 
97d0: 64 65 73 74 72 6f 79 20 61 6e 64 20 72 65 63 72  destroy and recr
97e0: 65 61 74 65 20 69 74 2e 20 20 49 66 20 74 68 65  eate it.  If the
97f0: 20 57 69 6e 33 32 20 6e 61 74 69 76 65 20 68 65   Win32 native he
9800: 61 70 20 69 73 20 6e 6f 74 20 69 73 6f 6c 61 74  ap is not isolat
9810: 65 64 20 61 6e 64 2f 6f 72 0a 2a 2a 20 74 68 65  ed and/or.** the
9820: 20 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f   sqlite3_memory_
9830: 75 73 65 64 28 29 20 66 75 6e 63 74 69 6f 6e 20  used() function 
9840: 64 6f 65 73 20 6e 6f 74 20 72 65 74 75 72 6e 20  does not return 
9850: 7a 65 72 6f 2c 20 53 51 4c 49 54 45 5f 42 55 53  zero, SQLITE_BUS
9860: 59 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 72 65 74  Y will.** be ret
9870: 75 72 6e 65 64 20 61 6e 64 20 6e 6f 20 63 68 61  urned and no cha
9880: 6e 67 65 73 20 77 69 6c 6c 20 62 65 20 6d 61 64  nges will be mad
9890: 65 20 74 6f 20 74 68 65 20 57 69 6e 33 32 20 6e  e to the Win32 n
98a0: 61 74 69 76 65 20 68 65 61 70 2e 0a 2a 2f 0a 69  ative heap..*/.i
98b0: 6e 74 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32  nt sqlite3_win32
98c0: 5f 72 65 73 65 74 5f 68 65 61 70 28 29 7b 0a 20  _reset_heap(){. 
98d0: 20 69 6e 74 20 72 63 3b 0a 20 20 4d 55 54 45 58   int rc;.  MUTEX
98e0: 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f  _LOGIC( sqlite3_
98f0: 6d 75 74 65 78 20 2a 70 4d 61 73 74 65 72 3b 20  mutex *pMaster; 
9900: 29 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 73 74  ) /* The main st
9910: 61 74 69 63 20 6d 75 74 65 78 20 2a 2f 0a 20 20  atic mutex */.  
9920: 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c  MUTEX_LOGIC( sql
9930: 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 4d 65 6d  ite3_mutex *pMem
9940: 3b 20 29 20 20 20 20 2f 2a 20 54 68 65 20 6d 65  ; )    /* The me
9950: 6d 73 79 73 20 73 74 61 74 69 63 20 6d 75 74 65  msys static mute
9960: 78 20 2a 2f 0a 20 20 4d 55 54 45 58 5f 4c 4f 47  x */.  MUTEX_LOG
9970: 49 43 28 20 70 4d 61 73 74 65 72 20 3d 20 73 71  IC( pMaster = sq
9980: 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
9990: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
99a0: 54 49 43 5f 4d 41 53 54 45 52 29 3b 20 29 0a 20  TIC_MASTER); ). 
99b0: 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 70 4d   MUTEX_LOGIC( pM
99c0: 65 6d 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65  em = sqlite3Mute
99d0: 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
99e0: 54 45 58 5f 53 54 41 54 49 43 5f 4d 45 4d 29 3b  TEX_STATIC_MEM);
99f0: 20 29 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   ).  sqlite3_mut
9a00: 65 78 5f 65 6e 74 65 72 28 70 4d 61 73 74 65 72  ex_enter(pMaster
9a10: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  );.  sqlite3_mut
9a20: 65 78 5f 65 6e 74 65 72 28 70 4d 65 6d 29 3b 0a  ex_enter(pMem);.
9a30: 20 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61    winMemAssertMa
9a40: 67 69 63 28 29 3b 0a 20 20 69 66 28 20 77 69 6e  gic();.  if( win
9a50: 4d 65 6d 47 65 74 48 65 61 70 28 29 21 3d 4e 55  MemGetHeap()!=NU
9a60: 4c 4c 20 26 26 20 77 69 6e 4d 65 6d 47 65 74 4f  LL && winMemGetO
9a70: 77 6e 65 64 28 29 20 26 26 20 73 71 6c 69 74 65  wned() && sqlite
9a80: 33 5f 6d 65 6d 6f 72 79 5f 75 73 65 64 28 29 3d  3_memory_used()=
9a90: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20  =0 ){.    /*.   
9aa0: 20 2a 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   ** At this poin
9ab0: 74 2c 20 74 68 65 72 65 20 73 68 6f 75 6c 64 20  t, there should 
9ac0: 62 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e  be no outstandin
9ad0: 67 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  g memory allocat
9ae0: 69 6f 6e 73 20 6f 6e 0a 20 20 20 20 2a 2a 20 74  ions on.    ** t
9af0: 68 65 20 68 65 61 70 2e 20 20 41 6c 73 6f 2c 20  he heap.  Also, 
9b00: 73 69 6e 63 65 20 62 6f 74 68 20 74 68 65 20 6d  since both the m
9b10: 61 73 74 65 72 20 61 6e 64 20 6d 65 6d 73 79 73  aster and memsys
9b20: 20 6c 6f 63 6b 73 20 61 72 65 20 63 75 72 72 65   locks are curre
9b30: 6e 74 6c 79 0a 20 20 20 20 2a 2a 20 62 65 69 6e  ntly.    ** bein
9b40: 67 20 68 65 6c 64 20 62 79 20 75 73 2c 20 6e 6f  g held by us, no
9b50: 20 6f 74 68 65 72 20 66 75 6e 63 74 69 6f 6e 20   other function 
9b60: 28 69 2e 65 2e 20 66 72 6f 6d 20 61 6e 6f 74 68  (i.e. from anoth
9b70: 65 72 20 74 68 72 65 61 64 29 20 73 68 6f 75 6c  er thread) shoul
9b80: 64 0a 20 20 20 20 2a 2a 20 62 65 20 61 62 6c 65  d.    ** be able
9b90: 20 74 6f 20 65 76 65 6e 20 61 63 63 65 73 73 20   to even access 
9ba0: 74 68 65 20 68 65 61 70 2e 20 20 41 74 74 65 6d  the heap.  Attem
9bb0: 70 74 20 74 6f 20 64 65 73 74 72 6f 79 20 61 6e  pt to destroy an
9bc0: 64 20 72 65 63 72 65 61 74 65 20 6f 75 72 0a 20  d recreate our. 
9bd0: 20 20 20 2a 2a 20 69 73 6f 6c 61 74 65 64 20 57     ** isolated W
9be0: 69 6e 33 32 20 6e 61 74 69 76 65 20 68 65 61 70  in32 native heap
9bf0: 20 6e 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   now..    */.   
9c00: 20 61 73 73 65 72 74 28 20 77 69 6e 4d 65 6d 47   assert( winMemG
9c10: 65 74 48 65 61 70 28 29 21 3d 4e 55 4c 4c 20 29  etHeap()!=NULL )
9c20: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 77 69  ;.    assert( wi
9c30: 6e 4d 65 6d 47 65 74 4f 77 6e 65 64 28 29 20 29  nMemGetOwned() )
9c40: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ;.    assert( sq
9c50: 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 75 73 65  lite3_memory_use
9c60: 64 28 29 3d 3d 30 20 29 3b 0a 20 20 20 20 77 69  d()==0 );.    wi
9c70: 6e 4d 65 6d 53 68 75 74 64 6f 77 6e 28 77 69 6e  nMemShutdown(win
9c80: 4d 65 6d 47 65 74 44 61 74 61 50 74 72 28 29 29  MemGetDataPtr())
9c90: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 77 69  ;.    assert( wi
9ca0: 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 3d 3d 4e  nMemGetHeap()==N
9cb0: 55 4c 4c 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ULL );.    asser
9cc0: 74 28 20 21 77 69 6e 4d 65 6d 47 65 74 4f 77 6e  t( !winMemGetOwn
9cd0: 65 64 28 29 20 29 3b 0a 20 20 20 20 61 73 73 65  ed() );.    asse
9ce0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 65 6d 6f  rt( sqlite3_memo
9cf0: 72 79 5f 75 73 65 64 28 29 3d 3d 30 20 29 3b 0a  ry_used()==0 );.
9d00: 20 20 20 20 72 63 20 3d 20 77 69 6e 4d 65 6d 49      rc = winMemI
9d10: 6e 69 74 28 77 69 6e 4d 65 6d 47 65 74 44 61 74  nit(winMemGetDat
9d20: 61 50 74 72 28 29 29 3b 0a 20 20 20 20 61 73 73  aPtr());.    ass
9d30: 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
9d40: 4f 4b 20 7c 7c 20 77 69 6e 4d 65 6d 47 65 74 48  OK || winMemGetH
9d50: 65 61 70 28 29 21 3d 4e 55 4c 4c 20 29 3b 0a 20  eap()!=NULL );. 
9d60: 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
9d70: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 77 69 6e 4d  QLITE_OK || winM
9d80: 65 6d 47 65 74 4f 77 6e 65 64 28 29 20 29 3b 0a  emGetOwned() );.
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 73 71 6c  SQLITE_OK || sql
9db0: 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 75 73 65 64  ite3_memory_used
9dc0: 28 29 3d 3d 30 20 29 3b 0a 20 20 7d 65 6c 73 65  ()==0 );.  }else
9dd0: 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  {.    /*.    ** 
9de0: 54 68 65 20 57 69 6e 33 32 20 6e 61 74 69 76 65  The Win32 native
9df0: 20 68 65 61 70 20 63 61 6e 6e 6f 74 20 62 65 20   heap cannot be 
9e00: 6d 6f 64 69 66 69 65 64 20 62 65 63 61 75 73 65  modified because
9e10: 20 69 74 20 6d 61 79 20 62 65 20 69 6e 20 75 73   it may be in us
9e20: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  e..    */.    rc
9e30: 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
9e40: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
9e50: 74 65 78 5f 6c 65 61 76 65 28 70 4d 65 6d 29 3b  tex_leave(pMem);
9e60: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
9e70: 5f 6c 65 61 76 65 28 70 4d 61 73 74 65 72 29 3b  _leave(pMaster);
9e80: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
9e90: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
9ea0: 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 20 2a 2f  _WIN32_MALLOC */
9eb0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
9ec0: 63 74 69 6f 6e 20 6f 75 74 70 75 74 73 20 74 68  ction outputs th
9ed0: 65 20 73 70 65 63 69 66 69 65 64 20 28 41 4e 53  e specified (ANS
9ee0: 49 29 20 73 74 72 69 6e 67 20 74 6f 20 74 68 65  I) string to the
9ef0: 20 57 69 6e 33 32 20 64 65 62 75 67 67 65 72 0a   Win32 debugger.
9f00: 2a 2a 20 28 69 66 20 61 76 61 69 6c 61 62 6c 65  ** (if available
9f10: 29 2e 0a 2a 2f 0a 0a 76 6f 69 64 20 73 71 6c 69  )..*/..void sqli
9f20: 74 65 33 5f 77 69 6e 33 32 5f 77 72 69 74 65 5f  te3_win32_write_
9f30: 64 65 62 75 67 28 63 6f 6e 73 74 20 63 68 61 72  debug(const char
9f40: 20 2a 7a 42 75 66 2c 20 69 6e 74 20 6e 42 75 66   *zBuf, int nBuf
9f50: 29 7b 0a 20 20 63 68 61 72 20 7a 44 62 67 42 75  ){.  char zDbgBu
9f60: 66 5b 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44  f[SQLITE_WIN32_D
9f70: 42 47 5f 42 55 46 5f 53 49 5a 45 5d 3b 0a 20 20  BG_BUF_SIZE];.  
9f80: 69 6e 74 20 6e 4d 69 6e 20 3d 20 4d 49 4e 28 6e  int nMin = MIN(n
9f90: 42 75 66 2c 20 28 53 51 4c 49 54 45 5f 57 49 4e  Buf, (SQLITE_WIN
9fa0: 33 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 20  32_DBG_BUF_SIZE 
9fb0: 2d 20 31 29 29 3b 20 2f 2a 20 6d 61 79 20 62 65  - 1)); /* may be
9fc0: 20 6e 65 67 61 74 69 76 65 2e 20 2a 2f 0a 20 20   negative. */.  
9fd0: 69 66 28 20 6e 4d 69 6e 3c 2d 31 20 29 20 6e 4d  if( nMin<-1 ) nM
9fe0: 69 6e 20 3d 20 2d 31 3b 20 2f 2a 20 61 6c 6c 20  in = -1; /* all 
9ff0: 6e 65 67 61 74 69 76 65 20 76 61 6c 75 65 73 20  negative values 
a000: 62 65 63 6f 6d 65 20 2d 31 2e 20 2a 2f 0a 20 20  become -1. */.  
a010: 61 73 73 65 72 74 28 20 6e 4d 69 6e 3d 3d 2d 31  assert( nMin==-1
a020: 20 7c 7c 20 6e 4d 69 6e 3d 3d 30 20 7c 7c 20 6e   || nMin==0 || n
a030: 4d 69 6e 3c 53 51 4c 49 54 45 5f 57 49 4e 33 32  Min<SQLITE_WIN32
a040: 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 20 29 3b  _DBG_BUF_SIZE );
a050: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
a060: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
a070: 53 49 29 0a 20 20 69 66 28 20 6e 4d 69 6e 3e 30  SI).  if( nMin>0
a080: 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 7a   ){.    memset(z
a090: 44 62 67 42 75 66 2c 20 30 2c 20 53 51 4c 49 54  DbgBuf, 0, 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 29 3b 0a 20 20 20 20 6d 65 6d 63 70  SIZE);.    memcp
a0c0: 79 28 7a 44 62 67 42 75 66 2c 20 7a 42 75 66 2c  y(zDbgBuf, zBuf,
a0d0: 20 6e 4d 69 6e 29 3b 0a 20 20 20 20 6f 73 4f 75   nMin);.    osOu
a0e0: 74 70 75 74 44 65 62 75 67 53 74 72 69 6e 67 41  tputDebugStringA
a0f0: 28 7a 44 62 67 42 75 66 29 3b 0a 20 20 7d 65 6c  (zDbgBuf);.  }el
a100: 73 65 7b 0a 20 20 20 20 6f 73 4f 75 74 70 75 74  se{.    osOutput
a110: 44 65 62 75 67 53 74 72 69 6e 67 41 28 7a 42 75  DebugStringA(zBu
a120: 66 29 3b 0a 20 20 7d 0a 23 65 6c 69 66 20 64 65  f);.  }.#elif de
a130: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
a140: 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 6d  32_HAS_WIDE).  m
a150: 65 6d 73 65 74 28 7a 44 62 67 42 75 66 2c 20 30  emset(zDbgBuf, 0
a160: 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44  , SQLITE_WIN32_D
a170: 42 47 5f 42 55 46 5f 53 49 5a 45 29 3b 0a 20 20  BG_BUF_SIZE);.  
a180: 69 66 20 28 20 6f 73 4d 75 6c 74 69 42 79 74 65  if ( osMultiByte
a190: 54 6f 57 69 64 65 43 68 61 72 28 0a 20 20 20 20  ToWideChar(.    
a1a0: 20 20 20 20 20 20 6f 73 41 72 65 46 69 6c 65 41        osAreFileA
a1b0: 70 69 73 41 4e 53 49 28 29 20 3f 20 43 50 5f 41  pisANSI() ? CP_A
a1c0: 43 50 20 3a 20 43 50 5f 4f 45 4d 43 50 2c 20 30  CP : CP_OEMCP, 0
a1d0: 2c 20 7a 42 75 66 2c 0a 20 20 20 20 20 20 20 20  , zBuf,.        
a1e0: 20 20 6e 4d 69 6e 2c 20 28 4c 50 57 53 54 52 29    nMin, (LPWSTR)
a1f0: 7a 44 62 67 42 75 66 2c 20 53 51 4c 49 54 45 5f  zDbgBuf, SQLITE_
a200: 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49  WIN32_DBG_BUF_SI
a210: 5a 45 2f 73 69 7a 65 6f 66 28 57 43 48 41 52 29  ZE/sizeof(WCHAR)
a220: 29 3c 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  )<=0 ){.    retu
a230: 72 6e 3b 0a 20 20 7d 0a 20 20 6f 73 4f 75 74 70  rn;.  }.  osOutp
a240: 75 74 44 65 62 75 67 53 74 72 69 6e 67 57 28 28  utDebugStringW((
a250: 4c 50 43 57 53 54 52 29 7a 44 62 67 42 75 66 29  LPCWSTR)zDbgBuf)
a260: 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 6e 4d  ;.#else.  if( nM
a270: 69 6e 3e 30 20 29 7b 0a 20 20 20 20 6d 65 6d 73  in>0 ){.    mems
a280: 65 74 28 7a 44 62 67 42 75 66 2c 20 30 2c 20 53  et(zDbgBuf, 0, S
a290: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f  QLITE_WIN32_DBG_
a2a0: 42 55 46 5f 53 49 5a 45 29 3b 0a 20 20 20 20 6d  BUF_SIZE);.    m
a2b0: 65 6d 63 70 79 28 7a 44 62 67 42 75 66 2c 20 7a  emcpy(zDbgBuf, z
a2c0: 42 75 66 2c 20 6e 4d 69 6e 29 3b 0a 20 20 20 20  Buf, nMin);.    
a2d0: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
a2e0: 22 25 73 22 2c 20 7a 44 62 67 42 75 66 29 3b 0a  "%s", zDbgBuf);.
a2f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 70 72    }else{.    fpr
a300: 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25 73  intf(stderr, "%s
a310: 22 2c 20 7a 42 75 66 29 3b 0a 20 20 7d 0a 23 65  ", zBuf);.  }.#e
a320: 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ndif.}../*.** Th
a330: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74  e following rout
a340: 69 6e 65 20 73 75 73 70 65 6e 64 73 20 74 68 65  ine suspends the
a350: 20 63 75 72 72 65 6e 74 20 74 68 72 65 61 64 20   current thread 
a360: 66 6f 72 20 61 74 20 6c 65 61 73 74 20 6d 73 0a  for at least ms.
a370: 2a 2a 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 2e  ** milliseconds.
a380: 20 20 54 68 69 73 20 69 73 20 65 71 75 69 76 61    This is equiva
a390: 6c 65 6e 74 20 74 6f 20 74 68 65 20 57 69 6e 33  lent to the Win3
a3a0: 32 20 53 6c 65 65 70 28 29 20 69 6e 74 65 72 66  2 Sleep() interf
a3b0: 61 63 65 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49  ace..*/.#if SQLI
a3c0: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 73 74 61 74  TE_OS_WINRT.stat
a3d0: 69 63 20 48 41 4e 44 4c 45 20 73 6c 65 65 70 4f  ic HANDLE sleepO
a3e0: 62 6a 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69  bj = NULL;.#endi
a3f0: 66 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f  f..void sqlite3_
a400: 77 69 6e 33 32 5f 73 6c 65 65 70 28 44 57 4f 52  win32_sleep(DWOR
a410: 44 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 29 7b  D milliseconds){
a420: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
a430: 49 4e 52 54 0a 20 20 69 66 20 28 20 73 6c 65 65  INRT.  if ( slee
a440: 70 4f 62 6a 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20  pObj==NULL ){.  
a450: 20 20 73 6c 65 65 70 4f 62 6a 20 3d 20 6f 73 43    sleepObj = osC
a460: 72 65 61 74 65 45 76 65 6e 74 45 78 57 28 4e 55  reateEventExW(NU
a470: 4c 4c 2c 20 4e 55 4c 4c 2c 20 43 52 45 41 54 45  LL, NULL, CREATE
a480: 5f 45 56 45 4e 54 5f 4d 41 4e 55 41 4c 5f 52 45  _EVENT_MANUAL_RE
a490: 53 45 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20  SET,.           
a4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a4b0: 20 20 20 20 20 53 59 4e 43 48 52 4f 4e 49 5a 45       SYNCHRONIZE
a4c0: 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
a4d0: 20 73 6c 65 65 70 4f 62 6a 21 3d 4e 55 4c 4c 20   sleepObj!=NULL 
a4e0: 29 3b 0a 20 20 6f 73 57 61 69 74 46 6f 72 53 69  );.  osWaitForSi
a4f0: 6e 67 6c 65 4f 62 6a 65 63 74 45 78 28 73 6c 65  ngleObjectEx(sle
a500: 65 70 4f 62 6a 2c 20 6d 69 6c 6c 69 73 65 63 6f  epObj, milliseco
a510: 6e 64 73 2c 20 46 41 4c 53 45 29 3b 0a 23 65 6c  nds, FALSE);.#el
a520: 73 65 0a 20 20 6f 73 53 6c 65 65 70 28 6d 69 6c  se.  osSleep(mil
a530: 6c 69 73 65 63 6f 6e 64 73 29 3b 0a 23 65 6e 64  liseconds);.#end
a540: 69 66 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45  if.}..#if SQLITE
a550: 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52 45  _MAX_WORKER_THRE
a560: 41 44 53 3e 30 20 26 26 20 21 53 51 4c 49 54 45  ADS>0 && !SQLITE
a570: 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 53 51 4c  _OS_WINRT && SQL
a580: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3e 30  ITE_THREADSAFE>0
a590: 0a 44 57 4f 52 44 20 73 71 6c 69 74 65 33 57 69  .DWORD sqlite3Wi
a5a0: 6e 33 32 57 61 69 74 28 48 41 4e 44 4c 45 20 68  n32Wait(HANDLE h
a5b0: 4f 62 6a 65 63 74 29 7b 0a 20 20 44 57 4f 52 44  Object){.  DWORD
a5c0: 20 72 63 3b 0a 20 20 77 68 69 6c 65 28 20 28 72   rc;.  while( (r
a5d0: 63 20 3d 20 6f 73 57 61 69 74 46 6f 72 53 69 6e  c = osWaitForSin
a5e0: 67 6c 65 4f 62 6a 65 63 74 45 78 28 68 4f 62 6a  gleObjectEx(hObj
a5f0: 65 63 74 2c 20 49 4e 46 49 4e 49 54 45 2c 0a 20  ect, INFINITE,. 
a600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a620: 20 20 20 20 20 20 54 52 55 45 29 29 3d 3d 57 41        TRUE))==WA
a630: 49 54 5f 49 4f 5f 43 4f 4d 50 4c 45 54 49 4f 4e  IT_IO_COMPLETION
a640: 20 29 7b 7d 0a 20 20 72 65 74 75 72 6e 20 72 63   ){}.  return rc
a650: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
a660: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 28 6e  * Return true (n
a670: 6f 6e 2d 7a 65 72 6f 29 20 69 66 20 77 65 20 61  on-zero) if we a
a680: 72 65 20 72 75 6e 6e 69 6e 67 20 75 6e 64 65 72  re running under
a690: 20 57 69 6e 4e 54 2c 20 57 69 6e 32 4b 2c 20 57   WinNT, Win2K, W
a6a0: 69 6e 58 50 2c 0a 2a 2a 20 6f 72 20 57 69 6e 43  inXP,.** or WinC
a6b0: 45 2e 20 20 52 65 74 75 72 6e 20 66 61 6c 73 65  E.  Return false
a6c0: 20 28 7a 65 72 6f 29 20 66 6f 72 20 57 69 6e 39   (zero) for Win9
a6d0: 35 2c 20 57 69 6e 39 38 2c 20 6f 72 20 57 69 6e  5, Win98, or Win
a6e0: 4d 45 2e 0a 2a 2a 0a 2a 2a 20 48 65 72 65 20 69  ME..**.** Here i
a6f0: 73 20 61 6e 20 69 6e 74 65 72 65 73 74 69 6e 67  s an interesting
a700: 20 6f 62 73 65 72 76 61 74 69 6f 6e 3a 20 20 57   observation:  W
a710: 69 6e 39 35 2c 20 57 69 6e 39 38 2c 20 61 6e 64  in95, Win98, and
a720: 20 57 69 6e 4d 45 20 6c 61 63 6b 0a 2a 2a 20 74   WinME lack.** t
a730: 68 65 20 4c 6f 63 6b 46 69 6c 65 45 78 28 29 20  he LockFileEx() 
a740: 41 50 49 2e 20 20 42 75 74 20 77 65 20 63 61 6e  API.  But we can
a750: 20 73 74 69 6c 6c 20 73 74 61 74 69 63 61 6c 6c   still staticall
a760: 79 20 6c 69 6e 6b 20 61 67 61 69 6e 73 74 20 74  y link against t
a770: 68 61 74 0a 2a 2a 20 41 50 49 20 61 73 20 6c 6f  hat.** API as lo
a780: 6e 67 20 61 73 20 77 65 20 64 6f 6e 27 74 20 63  ng as we don't c
a790: 61 6c 6c 20 69 74 20 77 68 65 6e 20 72 75 6e 6e  all it when runn
a7a0: 69 6e 67 20 57 69 6e 39 35 2f 39 38 2f 4d 45 2e  ing Win95/98/ME.
a7b0: 20 20 41 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 74    A call to.** t
a7c0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
a7d0: 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  sed to determine
a7e0: 20 69 66 20 74 68 65 20 68 6f 73 74 20 69 73 20   if the host is 
a7f0: 57 69 6e 39 35 2f 39 38 2f 4d 45 20 6f 72 0a 2a  Win95/98/ME or.*
a800: 2a 20 57 69 6e 4e 54 2f 32 4b 2f 58 50 20 73 6f  * WinNT/2K/XP so
a810: 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20 6b 6e   that we will kn
a820: 6f 77 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ow whether or no
a830: 74 20 77 65 20 63 61 6e 20 73 61 66 65 6c 79 20  t we can safely 
a840: 63 61 6c 6c 0a 2a 2a 20 74 68 65 20 4c 6f 63 6b  call.** the Lock
a850: 46 69 6c 65 45 78 28 29 20 41 50 49 2e 0a 2a 2f  FileEx() API..*/
a860: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
a870: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 47 45 54 56  QLITE_WIN32_GETV
a880: 45 52 53 49 4f 4e 45 58 29 20 7c 7c 20 21 53 51  ERSIONEX) || !SQ
a890: 4c 49 54 45 5f 57 49 4e 33 32 5f 47 45 54 56 45  LITE_WIN32_GETVE
a8a0: 52 53 49 4f 4e 45 58 0a 23 20 64 65 66 69 6e 65  RSIONEX.# define
a8b0: 20 6f 73 49 73 4e 54 28 29 20 20 28 31 29 0a 23   osIsNT()  (1).#
a8c0: 65 6c 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  elif SQLITE_OS_W
a8d0: 49 4e 43 45 20 7c 7c 20 53 51 4c 49 54 45 5f 4f  INCE || SQLITE_O
a8e0: 53 5f 57 49 4e 52 54 20 7c 7c 20 21 64 65 66 69  S_WINRT || !defi
a8f0: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
a900: 5f 48 41 53 5f 41 4e 53 49 29 0a 23 20 64 65 66  _HAS_ANSI).# def
a910: 69 6e 65 20 6f 73 49 73 4e 54 28 29 20 20 28 31  ine osIsNT()  (1
a920: 29 0a 23 65 6c 69 66 20 21 64 65 66 69 6e 65 64  ).#elif !defined
a930: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
a940: 53 5f 57 49 44 45 29 0a 23 20 64 65 66 69 6e 65  S_WIDE).# define
a950: 20 6f 73 49 73 4e 54 28 29 20 20 28 30 29 0a 23   osIsNT()  (0).#
a960: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 6f 73  else.# define os
a970: 49 73 4e 54 28 29 20 20 28 28 73 71 6c 69 74 65  IsNT()  ((sqlite
a980: 33 5f 6f 73 5f 74 79 70 65 3d 3d 32 29 20 7c 7c  3_os_type==2) ||
a990: 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 69   sqlite3_win32_i
a9a0: 73 5f 6e 74 28 29 29 0a 23 65 6e 64 69 66 0a 0a  s_nt()).#endif..
a9b0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
a9c0: 69 6f 6e 20 64 65 74 65 72 6d 69 6e 65 73 20 69  ion determines i
a9d0: 66 20 74 68 65 20 6d 61 63 68 69 6e 65 20 69 73  f the machine is
a9e0: 20 72 75 6e 6e 69 6e 67 20 61 20 76 65 72 73 69   running a versi
a9f0: 6f 6e 20 6f 66 20 57 69 6e 64 6f 77 73 0a 2a 2a  on of Windows.**
aa00: 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 4e 54   based on the NT
aa10: 20 6b 65 72 6e 65 6c 2e 0a 2a 2f 0a 69 6e 74 20   kernel..*/.int 
aa20: 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 69 73  sqlite3_win32_is
aa30: 5f 6e 74 28 76 6f 69 64 29 7b 0a 23 69 66 20 53  _nt(void){.#if S
aa40: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
aa50: 20 2f 2a 0a 20 20 2a 2a 20 4e 4f 54 45 3a 20 54   /*.  ** NOTE: T
aa60: 68 65 20 57 69 6e 52 54 20 73 75 62 2d 70 6c 61  he WinRT sub-pla
aa70: 74 66 6f 72 6d 20 69 73 20 61 6c 77 61 79 73 20  tform is always 
aa80: 61 73 73 75 6d 65 64 20 74 6f 20 62 65 20 62 61  assumed to be ba
aa90: 73 65 64 20 6f 6e 20 74 68 65 20 4e 54 0a 20 20  sed on the NT.  
aaa0: 2a 2a 20 20 20 20 20 20 20 6b 65 72 6e 65 6c 2e  **       kernel.
aab0: 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 31  .  */.  return 1
aac0: 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28  ;.#elif defined(
aad0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 47 45 54  SQLITE_WIN32_GET
aae0: 56 45 52 53 49 4f 4e 45 58 29 20 26 26 20 53 51  VERSIONEX) && SQ
aaf0: 4c 49 54 45 5f 57 49 4e 33 32 5f 47 45 54 56 45  LITE_WIN32_GETVE
ab00: 52 53 49 4f 4e 45 58 0a 20 20 69 66 28 20 6f 73  RSIONEX.  if( os
ab10: 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61  InterlockedCompa
ab20: 72 65 45 78 63 68 61 6e 67 65 28 26 73 71 6c 69  reExchange(&sqli
ab30: 74 65 33 5f 6f 73 5f 74 79 70 65 2c 20 30 2c 20  te3_os_type, 0, 
ab40: 30 29 3d 3d 30 20 29 7b 0a 23 69 66 20 64 65 66  0)==0 ){.#if def
ab50: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
ab60: 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 20 20  2_HAS_ANSI).    
ab70: 4f 53 56 45 52 53 49 4f 4e 49 4e 46 4f 41 20 73  OSVERSIONINFOA s
ab80: 49 6e 66 6f 3b 0a 20 20 20 20 73 49 6e 66 6f 2e  Info;.    sInfo.
ab90: 64 77 4f 53 56 65 72 73 69 6f 6e 49 6e 66 6f 53  dwOSVersionInfoS
aba0: 69 7a 65 20 3d 20 73 69 7a 65 6f 66 28 73 49 6e  ize = sizeof(sIn
abb0: 66 6f 29 3b 0a 20 20 20 20 6f 73 47 65 74 56 65  fo);.    osGetVe
abc0: 72 73 69 6f 6e 45 78 41 28 26 73 49 6e 66 6f 29  rsionExA(&sInfo)
abd0: 3b 0a 20 20 20 20 6f 73 49 6e 74 65 72 6c 6f 63  ;.    osInterloc
abe0: 6b 65 64 43 6f 6d 70 61 72 65 45 78 63 68 61 6e  kedCompareExchan
abf0: 67 65 28 26 73 71 6c 69 74 65 33 5f 6f 73 5f 74  ge(&sqlite3_os_t
ac00: 79 70 65 2c 0a 20 20 20 20 20 20 20 20 28 73 49  ype,.        (sI
ac10: 6e 66 6f 2e 64 77 50 6c 61 74 66 6f 72 6d 49 64  nfo.dwPlatformId
ac20: 20 3d 3d 20 56 45 52 5f 50 4c 41 54 46 4f 52 4d   == VER_PLATFORM
ac30: 5f 57 49 4e 33 32 5f 4e 54 29 20 3f 20 32 20 3a  _WIN32_NT) ? 2 :
ac40: 20 31 2c 20 30 29 3b 0a 23 65 6c 69 66 20 64 65   1, 0);.#elif de
ac50: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
ac60: 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 20  32_HAS_WIDE).   
ac70: 20 4f 53 56 45 52 53 49 4f 4e 49 4e 46 4f 57 20   OSVERSIONINFOW 
ac80: 73 49 6e 66 6f 3b 0a 20 20 20 20 73 49 6e 66 6f  sInfo;.    sInfo
ac90: 2e 64 77 4f 53 56 65 72 73 69 6f 6e 49 6e 66 6f  .dwOSVersionInfo
aca0: 53 69 7a 65 20 3d 20 73 69 7a 65 6f 66 28 73 49  Size = sizeof(sI
acb0: 6e 66 6f 29 3b 0a 20 20 20 20 6f 73 47 65 74 56  nfo);.    osGetV
acc0: 65 72 73 69 6f 6e 45 78 57 28 26 73 49 6e 66 6f  ersionExW(&sInfo
acd0: 29 3b 0a 20 20 20 20 6f 73 49 6e 74 65 72 6c 6f  );.    osInterlo
ace0: 63 6b 65 64 43 6f 6d 70 61 72 65 45 78 63 68 61  ckedCompareExcha
acf0: 6e 67 65 28 26 73 71 6c 69 74 65 33 5f 6f 73 5f  nge(&sqlite3_os_
ad00: 74 79 70 65 2c 0a 20 20 20 20 20 20 20 20 28 73  type,.        (s
ad10: 49 6e 66 6f 2e 64 77 50 6c 61 74 66 6f 72 6d 49  Info.dwPlatformI
ad20: 64 20 3d 3d 20 56 45 52 5f 50 4c 41 54 46 4f 52  d == VER_PLATFOR
ad30: 4d 5f 57 49 4e 33 32 5f 4e 54 29 20 3f 20 32 20  M_WIN32_NT) ? 2 
ad40: 3a 20 31 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a  : 1, 0);.#endif.
ad50: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6f 73 49    }.  return osI
ad60: 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72  nterlockedCompar
ad70: 65 45 78 63 68 61 6e 67 65 28 26 73 71 6c 69 74  eExchange(&sqlit
ad80: 65 33 5f 6f 73 5f 74 79 70 65 2c 20 32 2c 20 32  e3_os_type, 2, 2
ad90: 29 3d 3d 32 3b 0a 23 65 6c 69 66 20 53 51 4c 49  )==2;.#elif SQLI
ada0: 54 45 5f 54 45 53 54 0a 20 20 72 65 74 75 72 6e  TE_TEST.  return
adb0: 20 6f 73 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f   osInterlockedCo
adc0: 6d 70 61 72 65 45 78 63 68 61 6e 67 65 28 26 73  mpareExchange(&s
add0: 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 2c 20  qlite3_os_type, 
ade0: 32 2c 20 32 29 3d 3d 32 3b 0a 23 65 6c 73 65 0a  2, 2)==2;.#else.
adf0: 20 20 2f 2a 0a 20 20 2a 2a 20 4e 4f 54 45 3a 20    /*.  ** NOTE: 
ae00: 41 6c 6c 20 73 75 62 2d 70 6c 61 74 66 6f 72 6d  All sub-platform
ae10: 73 20 77 68 65 72 65 20 74 68 65 20 47 65 74 56  s where the GetV
ae20: 65 72 73 69 6f 6e 45 78 5b 41 57 5d 20 66 75 6e  ersionEx[AW] fun
ae30: 63 74 69 6f 6e 73 20 61 72 65 0a 20 20 2a 2a 20  ctions are.  ** 
ae40: 20 20 20 20 20 20 64 65 70 72 65 63 61 74 65 64        deprecated
ae50: 20 61 72 65 20 61 6c 77 61 79 73 20 61 73 73 75   are always assu
ae60: 6d 65 64 20 74 6f 20 62 65 20 62 61 73 65 64 20  med to be based 
ae70: 6f 6e 20 74 68 65 20 4e 54 20 6b 65 72 6e 65 6c  on the NT kernel
ae80: 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ..  */.  return 
ae90: 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 69 66  1;.#endif.}..#if
aea0: 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  def SQLITE_WIN32
aeb0: 5f 4d 41 4c 4c 4f 43 0a 2f 2a 0a 2a 2a 20 41 6c  _MALLOC./*.** Al
aec0: 6c 6f 63 61 74 65 20 6e 42 79 74 65 73 20 6f 66  locate nBytes of
aed0: 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74   memory..*/.stat
aee0: 69 63 20 76 6f 69 64 20 2a 77 69 6e 4d 65 6d 4d  ic void *winMemM
aef0: 61 6c 6c 6f 63 28 69 6e 74 20 6e 42 79 74 65 73  alloc(int nBytes
af00: 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 48 65 61  ){.  HANDLE hHea
af10: 70 3b 0a 20 20 76 6f 69 64 20 2a 70 3b 0a 0a 20  p;.  void *p;.. 
af20: 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67   winMemAssertMag
af30: 69 63 28 29 3b 0a 20 20 68 48 65 61 70 20 3d 20  ic();.  hHeap = 
af40: 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 3b  winMemGetHeap();
af50: 0a 20 20 61 73 73 65 72 74 28 20 68 48 65 61 70  .  assert( hHeap
af60: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
af70: 20 68 48 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f   hHeap!=INVALID_
af80: 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a  HANDLE_VALUE );.
af90: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
afa0: 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28  INRT && defined(
afb0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c  SQLITE_WIN32_MAL
afc0: 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a 20 20  LOC_VALIDATE).  
afd0: 61 73 73 65 72 74 28 20 6f 73 48 65 61 70 56 61  assert( osHeapVa
afe0: 6c 69 64 61 74 65 28 68 48 65 61 70 2c 20 53 51  lidate(hHeap, SQ
aff0: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
b000: 46 4c 41 47 53 2c 20 4e 55 4c 4c 29 20 29 3b 0a  FLAGS, NULL) );.
b010: 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28  #endif.  assert(
b020: 20 6e 42 79 74 65 73 3e 3d 30 20 29 3b 0a 20 20   nBytes>=0 );.  
b030: 70 20 3d 20 6f 73 48 65 61 70 41 6c 6c 6f 63 28  p = osHeapAlloc(
b040: 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49  hHeap, SQLITE_WI
b050: 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20  N32_HEAP_FLAGS, 
b060: 28 53 49 5a 45 5f 54 29 6e 42 79 74 65 73 29 3b  (SIZE_T)nBytes);
b070: 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20  .  if( !p ){.   
b080: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
b090: 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c  ITE_NOMEM, "fail
b0a0: 65 64 20 74 6f 20 48 65 61 70 41 6c 6c 6f 63 20  ed to HeapAlloc 
b0b0: 25 75 20 62 79 74 65 73 20 28 25 6c 75 29 2c 20  %u bytes (%lu), 
b0c0: 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20 20 20  heap=%p",.      
b0d0: 20 20 20 20 20 20 20 20 20 20 6e 42 79 74 65 73            nBytes
b0e0: 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  , osGetLastError
b0f0: 28 29 2c 20 28 76 6f 69 64 2a 29 68 48 65 61 70  (), (void*)hHeap
b100: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
b110: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65  p;.}../*.** Free
b120: 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74   memory..*/.stat
b130: 69 63 20 76 6f 69 64 20 77 69 6e 4d 65 6d 46 72  ic void winMemFr
b140: 65 65 28 76 6f 69 64 20 2a 70 50 72 69 6f 72 29  ee(void *pPrior)
b150: 7b 0a 20 20 48 41 4e 44 4c 45 20 68 48 65 61 70  {.  HANDLE hHeap
b160: 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65 72  ;..  winMemAsser
b170: 74 4d 61 67 69 63 28 29 3b 0a 20 20 68 48 65 61  tMagic();.  hHea
b180: 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74 48 65 61  p = winMemGetHea
b190: 70 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68  p();.  assert( h
b1a0: 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61 73 73  Heap!=0 );.  ass
b1b0: 65 72 74 28 20 68 48 65 61 70 21 3d 49 4e 56 41  ert( hHeap!=INVA
b1c0: 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
b1d0: 20 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f   );.#if !SQLITE_
b1e0: 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69  OS_WINRT && defi
b1f0: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
b200: 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45  _MALLOC_VALIDATE
b210: 29 0a 20 20 61 73 73 65 72 74 28 20 6f 73 48 65  ).  assert( osHe
b220: 61 70 56 61 6c 69 64 61 74 65 28 68 48 65 61 70  apValidate(hHeap
b230: 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  , SQLITE_WIN32_H
b240: 45 41 50 5f 46 4c 41 47 53 2c 20 70 50 72 69 6f  EAP_FLAGS, pPrio
b250: 72 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69  r) );.#endif.  i
b260: 66 28 20 21 70 50 72 69 6f 72 20 29 20 72 65 74  f( !pPrior ) ret
b270: 75 72 6e 3b 20 2f 2a 20 50 61 73 73 69 6e 67 20  urn; /* Passing 
b280: 4e 55 4c 4c 20 74 6f 20 48 65 61 70 46 72 65 65  NULL to HeapFree
b290: 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 20 2a   is undefined. *
b2a0: 2f 0a 20 20 69 66 28 20 21 6f 73 48 65 61 70 46  /.  if( !osHeapF
b2b0: 72 65 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54  ree(hHeap, SQLIT
b2c0: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41  E_WIN32_HEAP_FLA
b2d0: 47 53 2c 20 70 50 72 69 6f 72 29 20 29 7b 0a 20  GS, pPrior) ){. 
b2e0: 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53     sqlite3_log(S
b2f0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61  QLITE_NOMEM, "fa
b300: 69 6c 65 64 20 74 6f 20 48 65 61 70 46 72 65 65  iled to HeapFree
b310: 20 62 6c 6f 63 6b 20 25 70 20 28 25 6c 75 29 2c   block %p (%lu),
b320: 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20 20   heap=%p",.     
b330: 20 20 20 20 20 20 20 20 20 20 20 70 50 72 69 6f             pPrio
b340: 72 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f  r, osGetLastErro
b350: 72 28 29 2c 20 28 76 6f 69 64 2a 29 68 48 65 61  r(), (void*)hHea
b360: 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  p);.  }.}../*.**
b370: 20 43 68 61 6e 67 65 20 74 68 65 20 73 69 7a 65   Change the size
b380: 20 6f 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20   of an existing 
b390: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
b3a0: 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  n.*/.static void
b3b0: 20 2a 77 69 6e 4d 65 6d 52 65 61 6c 6c 6f 63 28   *winMemRealloc(
b3c0: 76 6f 69 64 20 2a 70 50 72 69 6f 72 2c 20 69 6e  void *pPrior, in
b3d0: 74 20 6e 42 79 74 65 73 29 7b 0a 20 20 48 41 4e  t nBytes){.  HAN
b3e0: 44 4c 45 20 68 48 65 61 70 3b 0a 20 20 76 6f 69  DLE hHeap;.  voi
b3f0: 64 20 2a 70 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41  d *p;..  winMemA
b400: 73 73 65 72 74 4d 61 67 69 63 28 29 3b 0a 20 20  ssertMagic();.  
b410: 68 48 65 61 70 20 3d 20 77 69 6e 4d 65 6d 47 65  hHeap = winMemGe
b420: 74 48 65 61 70 28 29 3b 0a 20 20 61 73 73 65 72  tHeap();.  asser
b430: 74 28 20 68 48 65 61 70 21 3d 30 20 29 3b 0a 20  t( hHeap!=0 );. 
b440: 20 61 73 73 65 72 74 28 20 68 48 65 61 70 21 3d   assert( hHeap!=
b450: 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56  INVALID_HANDLE_V
b460: 41 4c 55 45 20 29 3b 0a 23 69 66 20 21 53 51 4c  ALUE );.#if !SQL
b470: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20  ITE_OS_WINRT && 
b480: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
b490: 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49  IN32_MALLOC_VALI
b4a0: 44 41 54 45 29 0a 20 20 61 73 73 65 72 74 28 20  DATE).  assert( 
b4b0: 6f 73 48 65 61 70 56 61 6c 69 64 61 74 65 28 68  osHeapValidate(h
b4c0: 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e  Heap, SQLITE_WIN
b4d0: 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 70  32_HEAP_FLAGS, p
b4e0: 50 72 69 6f 72 29 20 29 3b 0a 23 65 6e 64 69 66  Prior) );.#endif
b4f0: 0a 20 20 61 73 73 65 72 74 28 20 6e 42 79 74 65  .  assert( nByte
b500: 73 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 21 70  s>=0 );.  if( !p
b510: 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 70 20 3d  Prior ){.    p =
b520: 20 6f 73 48 65 61 70 41 6c 6c 6f 63 28 68 48 65   osHeapAlloc(hHe
b530: 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ap, SQLITE_WIN32
b540: 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 28 53 49  _HEAP_FLAGS, (SI
b550: 5a 45 5f 54 29 6e 42 79 74 65 73 29 3b 0a 20 20  ZE_T)nBytes);.  
b560: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20 6f  }else{.    p = o
b570: 73 48 65 61 70 52 65 41 6c 6c 6f 63 28 68 48 65  sHeapReAlloc(hHe
b580: 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ap, SQLITE_WIN32
b590: 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 70 50 72  _HEAP_FLAGS, pPr
b5a0: 69 6f 72 2c 20 28 53 49 5a 45 5f 54 29 6e 42 79  ior, (SIZE_T)nBy
b5b0: 74 65 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  tes);.  }.  if( 
b5c0: 21 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  !p ){.    sqlite
b5d0: 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d  3_log(SQLITE_NOM
b5e0: 45 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 25  EM, "failed to %
b5f0: 73 20 25 75 20 62 79 74 65 73 20 28 25 6c 75 29  s %u bytes (%lu)
b600: 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20  , heap=%p",.    
b610: 20 20 20 20 20 20 20 20 20 20 20 20 70 50 72 69              pPri
b620: 6f 72 20 3f 20 22 48 65 61 70 52 65 41 6c 6c 6f  or ? "HeapReAllo
b630: 63 22 20 3a 20 22 48 65 61 70 41 6c 6c 6f 63 22  c" : "HeapAlloc"
b640: 2c 20 6e 42 79 74 65 73 2c 20 6f 73 47 65 74 4c  , nBytes, osGetL
b650: 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20  astError(),.    
b660: 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69              (voi
b670: 64 2a 29 68 48 65 61 70 29 3b 0a 20 20 7d 0a 20  d*)hHeap);.  }. 
b680: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
b690: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73  .** Return the s
b6a0: 69 7a 65 20 6f 66 20 61 6e 20 6f 75 74 73 74 61  ize of an outsta
b6b0: 6e 64 69 6e 67 20 61 6c 6c 6f 63 61 74 69 6f 6e  nding allocation
b6c0: 2c 20 69 6e 20 62 79 74 65 73 2e 0a 2a 2f 0a 73  , in bytes..*/.s
b6d0: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d  tatic int winMem
b6e0: 53 69 7a 65 28 76 6f 69 64 20 2a 70 29 7b 0a 20  Size(void *p){. 
b6f0: 20 48 41 4e 44 4c 45 20 68 48 65 61 70 3b 0a 20   HANDLE hHeap;. 
b700: 20 53 49 5a 45 5f 54 20 6e 3b 0a 0a 20 20 77 69   SIZE_T n;..  wi
b710: 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63 28  nMemAssertMagic(
b720: 29 3b 0a 20 20 68 48 65 61 70 20 3d 20 77 69 6e  );.  hHeap = win
b730: 4d 65 6d 47 65 74 48 65 61 70 28 29 3b 0a 20 20  MemGetHeap();.  
b740: 61 73 73 65 72 74 28 20 68 48 65 61 70 21 3d 30  assert( hHeap!=0
b750: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48   );.  assert( hH
b760: 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e  eap!=INVALID_HAN
b770: 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66  DLE_VALUE );.#if
b780: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
b790: 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  T && defined(SQL
b7a0: 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43  ITE_WIN32_MALLOC
b7b0: 5f 56 41 4c 49 44 41 54 45 29 0a 20 20 61 73 73  _VALIDATE).  ass
b7c0: 65 72 74 28 20 6f 73 48 65 61 70 56 61 6c 69 64  ert( osHeapValid
b7d0: 61 74 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54  ate(hHeap, SQLIT
b7e0: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41  E_WIN32_HEAP_FLA
b7f0: 47 53 2c 20 70 29 20 29 3b 0a 23 65 6e 64 69 66  GS, p) );.#endif
b800: 0a 20 20 69 66 28 20 21 70 20 29 20 72 65 74 75  .  if( !p ) retu
b810: 72 6e 20 30 3b 0a 20 20 6e 20 3d 20 6f 73 48 65  rn 0;.  n = osHe
b820: 61 70 53 69 7a 65 28 68 48 65 61 70 2c 20 53 51  apSize(hHeap, SQ
b830: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
b840: 46 4c 41 47 53 2c 20 70 29 3b 0a 20 20 69 66 28  FLAGS, p);.  if(
b850: 20 6e 3d 3d 28 53 49 5a 45 5f 54 29 2d 31 20 29   n==(SIZE_T)-1 )
b860: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f  {.    sqlite3_lo
b870: 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20  g(SQLITE_NOMEM, 
b880: 22 66 61 69 6c 65 64 20 74 6f 20 48 65 61 70 53  "failed to HeapS
b890: 69 7a 65 20 62 6c 6f 63 6b 20 25 70 20 28 25 6c  ize block %p (%l
b8a0: 75 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20  u), heap=%p",.  
b8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2c                p,
b8c0: 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
b8d0: 29 2c 20 28 76 6f 69 64 2a 29 68 48 65 61 70 29  ), (void*)hHeap)
b8e0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
b8f0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 69 6e    }.  return (in
b900: 74 29 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f  t)n;.}../*.** Ro
b910: 75 6e 64 20 75 70 20 61 20 72 65 71 75 65 73 74  und up a request
b920: 20 73 69 7a 65 20 74 6f 20 74 68 65 20 6e 65 78   size to the nex
b930: 74 20 76 61 6c 69 64 20 61 6c 6c 6f 63 61 74 69  t valid allocati
b940: 6f 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74  on size..*/.stat
b950: 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d 52 6f 75  ic int winMemRou
b960: 6e 64 75 70 28 69 6e 74 20 6e 29 7b 0a 20 20 72  ndup(int n){.  r
b970: 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn n;.}../*.*
b980: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 69  * Initialize thi
b990: 73 20 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a 73 74 61  s module..*/.sta
b9a0: 74 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d 49 6e  tic int winMemIn
b9b0: 69 74 28 76 6f 69 64 20 2a 70 41 70 70 44 61 74  it(void *pAppDat
b9c0: 61 29 7b 0a 20 20 77 69 6e 4d 65 6d 44 61 74 61  a){.  winMemData
b9d0: 20 2a 70 57 69 6e 4d 65 6d 44 61 74 61 20 3d 20   *pWinMemData = 
b9e0: 28 77 69 6e 4d 65 6d 44 61 74 61 20 2a 29 70 41  (winMemData *)pA
b9f0: 70 70 44 61 74 61 3b 0a 0a 20 20 69 66 28 20 21  ppData;..  if( !
ba00: 70 57 69 6e 4d 65 6d 44 61 74 61 20 29 20 72 65  pWinMemData ) re
ba10: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
ba20: 52 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57 69  R;.  assert( pWi
ba30: 6e 4d 65 6d 44 61 74 61 2d 3e 6d 61 67 69 63 31  nMemData->magic1
ba40: 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 31 20  ==WINMEM_MAGIC1 
ba50: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57 69  );.  assert( pWi
ba60: 6e 4d 65 6d 44 61 74 61 2d 3e 6d 61 67 69 63 32  nMemData->magic2
ba70: 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 32 20  ==WINMEM_MAGIC2 
ba80: 29 3b 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  );..#if !SQLITE_
ba90: 4f 53 5f 57 49 4e 52 54 20 26 26 20 53 51 4c 49  OS_WINRT && SQLI
baa0: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 43 52  TE_WIN32_HEAP_CR
bab0: 45 41 54 45 0a 20 20 69 66 28 20 21 70 57 69 6e  EATE.  if( !pWin
bac0: 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 29  MemData->hHeap )
bad0: 7b 0a 20 20 20 20 44 57 4f 52 44 20 64 77 49 6e  {.    DWORD dwIn
bae0: 69 74 69 61 6c 53 69 7a 65 20 3d 20 53 51 4c 49  itialSize = SQLI
baf0: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 49 4e  TE_WIN32_HEAP_IN
bb00: 49 54 5f 53 49 5a 45 3b 0a 20 20 20 20 44 57 4f  IT_SIZE;.    DWO
bb10: 52 44 20 64 77 4d 61 78 69 6d 75 6d 53 69 7a 65  RD dwMaximumSize
bb20: 20 3d 20 28 44 57 4f 52 44 29 73 71 6c 69 74 65   = (DWORD)sqlite
bb30: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 48  3GlobalConfig.nH
bb40: 65 61 70 3b 0a 20 20 20 20 69 66 28 20 64 77 4d  eap;.    if( dwM
bb50: 61 78 69 6d 75 6d 53 69 7a 65 3d 3d 30 20 29 7b  aximumSize==0 ){
bb60: 0a 20 20 20 20 20 20 64 77 4d 61 78 69 6d 75 6d  .      dwMaximum
bb70: 53 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f 57 49  Size = SQLITE_WI
bb80: 4e 33 32 5f 48 45 41 50 5f 4d 41 58 5f 53 49 5a  N32_HEAP_MAX_SIZ
bb90: 45 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  E;.    }else if(
bba0: 20 64 77 49 6e 69 74 69 61 6c 53 69 7a 65 3e 64   dwInitialSize>d
bbb0: 77 4d 61 78 69 6d 75 6d 53 69 7a 65 20 29 7b 0a  wMaximumSize ){.
bbc0: 20 20 20 20 20 20 64 77 49 6e 69 74 69 61 6c 53        dwInitialS
bbd0: 69 7a 65 20 3d 20 64 77 4d 61 78 69 6d 75 6d 53  ize = dwMaximumS
bbe0: 69 7a 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ize;.    }.    p
bbf0: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61  WinMemData->hHea
bc00: 70 20 3d 20 6f 73 48 65 61 70 43 72 65 61 74 65  p = osHeapCreate
bc10: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45  (SQLITE_WIN32_HE
bc20: 41 50 5f 46 4c 41 47 53 2c 0a 20 20 20 20 20 20  AP_FLAGS,.      
bc30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc50: 64 77 49 6e 69 74 69 61 6c 53 69 7a 65 2c 20 64  dwInitialSize, d
bc60: 77 4d 61 78 69 6d 75 6d 53 69 7a 65 29 3b 0a 20  wMaximumSize);. 
bc70: 20 20 20 69 66 28 20 21 70 57 69 6e 4d 65 6d 44     if( !pWinMemD
bc80: 61 74 61 2d 3e 68 48 65 61 70 20 29 7b 0a 20 20  ata->hHeap ){.  
bc90: 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
bca0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 0a 20 20  SQLITE_NOMEM,.  
bcb0: 20 20 20 20 20 20 20 20 22 66 61 69 6c 65 64 20          "failed 
bcc0: 74 6f 20 48 65 61 70 43 72 65 61 74 65 20 28 25  to HeapCreate (%
bcd0: 6c 75 29 2c 20 66 6c 61 67 73 3d 25 75 2c 20 69  lu), flags=%u, i
bce0: 6e 69 74 53 69 7a 65 3d 25 6c 75 2c 20 6d 61 78  nitSize=%lu, max
bcf0: 53 69 7a 65 3d 25 6c 75 22 2c 0a 20 20 20 20 20  Size=%lu",.     
bd00: 20 20 20 20 20 6f 73 47 65 74 4c 61 73 74 45 72       osGetLastEr
bd10: 72 6f 72 28 29 2c 20 53 51 4c 49 54 45 5f 57 49  ror(), SQLITE_WI
bd20: 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20  N32_HEAP_FLAGS, 
bd30: 64 77 49 6e 69 74 69 61 6c 53 69 7a 65 2c 0a 20  dwInitialSize,. 
bd40: 20 20 20 20 20 20 20 20 20 64 77 4d 61 78 69 6d           dwMaxim
bd50: 75 6d 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 72  umSize);.      r
bd60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
bd70: 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 57  EM;.    }.    pW
bd80: 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65  inMemData->bOwne
bd90: 64 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 61 73  d = TRUE;.    as
bda0: 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61 74  sert( pWinMemDat
bdb0: 61 2d 3e 62 4f 77 6e 65 64 20 29 3b 0a 20 20 7d  a->bOwned );.  }
bdc0: 0a 23 65 6c 73 65 0a 20 20 70 57 69 6e 4d 65 6d  .#else.  pWinMem
bdd0: 44 61 74 61 2d 3e 68 48 65 61 70 20 3d 20 6f 73  Data->hHeap = os
bde0: 47 65 74 50 72 6f 63 65 73 73 48 65 61 70 28 29  GetProcessHeap()
bdf0: 3b 0a 20 20 69 66 28 20 21 70 57 69 6e 4d 65 6d  ;.  if( !pWinMem
be00: 44 61 74 61 2d 3e 68 48 65 61 70 20 29 7b 0a 20  Data->hHeap ){. 
be10: 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53     sqlite3_log(S
be20: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 0a 20 20 20  QLITE_NOMEM,.   
be30: 20 20 20 20 20 22 66 61 69 6c 65 64 20 74 6f 20       "failed to 
be40: 47 65 74 50 72 6f 63 65 73 73 48 65 61 70 20 28  GetProcessHeap (
be50: 25 6c 75 29 22 2c 20 6f 73 47 65 74 4c 61 73 74  %lu)", osGetLast
be60: 45 72 72 6f 72 28 29 29 3b 0a 20 20 20 20 72 65  Error());.    re
be70: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
be80: 4d 3b 0a 20 20 7d 0a 20 20 70 57 69 6e 4d 65 6d  M;.  }.  pWinMem
be90: 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20 3d 20 46  Data->bOwned = F
bea0: 41 4c 53 45 3b 0a 20 20 61 73 73 65 72 74 28 20  ALSE;.  assert( 
beb0: 21 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f  !pWinMemData->bO
bec0: 77 6e 65 64 20 29 3b 0a 23 65 6e 64 69 66 0a 20  wned );.#endif. 
bed0: 20 61 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d   assert( pWinMem
bee0: 44 61 74 61 2d 3e 68 48 65 61 70 21 3d 30 20 29  Data->hHeap!=0 )
bef0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57 69 6e  ;.  assert( pWin
bf00: 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 21 3d  MemData->hHeap!=
bf10: 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56  INVALID_HANDLE_V
bf20: 41 4c 55 45 20 29 3b 0a 23 69 66 20 21 53 51 4c  ALUE );.#if !SQL
bf30: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20  ITE_OS_WINRT && 
bf40: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
bf50: 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49  IN32_MALLOC_VALI
bf60: 44 41 54 45 29 0a 20 20 61 73 73 65 72 74 28 20  DATE).  assert( 
bf70: 6f 73 48 65 61 70 56 61 6c 69 64 61 74 65 28 70  osHeapValidate(p
bf80: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61  WinMemData->hHea
bf90: 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  p, SQLITE_WIN32_
bfa0: 48 45 41 50 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c  HEAP_FLAGS, NULL
bfb0: 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65  ) );.#endif.  re
bfc0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
bfd0: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 69 6e 69 74 69  }../*.** Deiniti
bfe0: 61 6c 69 7a 65 20 74 68 69 73 20 6d 6f 64 75 6c  alize this modul
bff0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
c000: 64 20 77 69 6e 4d 65 6d 53 68 75 74 64 6f 77 6e  d winMemShutdown
c010: 28 76 6f 69 64 20 2a 70 41 70 70 44 61 74 61 29  (void *pAppData)
c020: 7b 0a 20 20 77 69 6e 4d 65 6d 44 61 74 61 20 2a  {.  winMemData *
c030: 70 57 69 6e 4d 65 6d 44 61 74 61 20 3d 20 28 77  pWinMemData = (w
c040: 69 6e 4d 65 6d 44 61 74 61 20 2a 29 70 41 70 70  inMemData *)pApp
c050: 44 61 74 61 3b 0a 0a 20 20 69 66 28 20 21 70 57  Data;..  if( !pW
c060: 69 6e 4d 65 6d 44 61 74 61 20 29 20 72 65 74 75  inMemData ) retu
c070: 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57  rn;.  assert( pW
c080: 69 6e 4d 65 6d 44 61 74 61 2d 3e 6d 61 67 69 63  inMemData->magic
c090: 31 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 31  1==WINMEM_MAGIC1
c0a0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57   );.  assert( pW
c0b0: 69 6e 4d 65 6d 44 61 74 61 2d 3e 6d 61 67 69 63  inMemData->magic
c0c0: 32 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 32  2==WINMEM_MAGIC2
c0d0: 20 29 3b 0a 0a 20 20 69 66 28 20 70 57 69 6e 4d   );..  if( pWinM
c0e0: 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 29 7b  emData->hHeap ){
c0f0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 57 69  .    assert( pWi
c100: 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 21  nMemData->hHeap!
c110: 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f  =INVALID_HANDLE_
c120: 56 41 4c 55 45 20 29 3b 0a 23 69 66 20 21 53 51  VALUE );.#if !SQ
c130: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
c140: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
c150: 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c  WIN32_MALLOC_VAL
c160: 49 44 41 54 45 29 0a 20 20 20 20 61 73 73 65 72  IDATE).    asser
c170: 74 28 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74  t( osHeapValidat
c180: 65 28 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68  e(pWinMemData->h
c190: 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e  Heap, SQLITE_WIN
c1a0: 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 4e  32_HEAP_FLAGS, N
c1b0: 55 4c 4c 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20  ULL) );.#endif. 
c1c0: 20 20 20 69 66 28 20 70 57 69 6e 4d 65 6d 44 61     if( pWinMemDa
c1d0: 74 61 2d 3e 62 4f 77 6e 65 64 20 29 7b 0a 20 20  ta->bOwned ){.  
c1e0: 20 20 20 20 69 66 28 20 21 6f 73 48 65 61 70 44      if( !osHeapD
c1f0: 65 73 74 72 6f 79 28 70 57 69 6e 4d 65 6d 44 61  estroy(pWinMemDa
c200: 74 61 2d 3e 68 48 65 61 70 29 20 29 7b 0a 20 20  ta->hHeap) ){.  
c210: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f        sqlite3_lo
c220: 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20  g(SQLITE_NOMEM, 
c230: 22 66 61 69 6c 65 64 20 74 6f 20 48 65 61 70 44  "failed to HeapD
c240: 65 73 74 72 6f 79 20 28 25 6c 75 29 2c 20 68 65  estroy (%lu), he
c250: 61 70 3d 25 70 22 2c 0a 20 20 20 20 20 20 20 20  ap=%p",.        
c260: 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65              osGe
c270: 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 28 76  tLastError(), (v
c280: 6f 69 64 2a 29 70 57 69 6e 4d 65 6d 44 61 74 61  oid*)pWinMemData
c290: 2d 3e 68 48 65 61 70 29 3b 0a 20 20 20 20 20 20  ->hHeap);.      
c2a0: 7d 0a 20 20 20 20 20 20 70 57 69 6e 4d 65 6d 44  }.      pWinMemD
c2b0: 61 74 61 2d 3e 62 4f 77 6e 65 64 20 3d 20 46 41  ata->bOwned = FA
c2c0: 4c 53 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  LSE;.    }.    p
c2d0: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61  WinMemData->hHea
c2e0: 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 7d 0a  p = NULL;.  }.}.
c2f0: 0a 2f 2a 0a 2a 2a 20 50 6f 70 75 6c 61 74 65 20  ./*.** Populate 
c300: 74 68 65 20 6c 6f 77 2d 6c 65 76 65 6c 20 6d 65  the low-level me
c310: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
c320: 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72  function pointer
c330: 73 20 69 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 47  s in.** sqlite3G
c340: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 20 77 69  lobalConfig.m wi
c350: 74 68 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74  th pointers to t
c360: 68 65 20 72 6f 75 74 69 6e 65 73 20 69 6e 20 74  he routines in t
c370: 68 69 73 20 66 69 6c 65 2e 20 54 68 65 0a 2a 2a  his file. The.**
c380: 20 61 72 67 75 6d 65 6e 74 73 20 73 70 65 63 69   arguments speci
c390: 66 79 20 74 68 65 20 62 6c 6f 63 6b 20 6f 66 20  fy the block of 
c3a0: 6d 65 6d 6f 72 79 20 74 6f 20 6d 61 6e 61 67 65  memory to manage
c3b0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
c3c0: 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c  tine is only cal
c3d0: 6c 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f 63  led by sqlite3_c
c3e0: 6f 6e 66 69 67 28 29 2c 20 61 6e 64 20 74 68 65  onfig(), and the
c3f0: 72 65 66 6f 72 65 0a 2a 2a 20 69 73 20 6e 6f 74  refore.** is not
c400: 20 72 65 71 75 69 72 65 64 20 74 6f 20 62 65 20   required to be 
c410: 74 68 72 65 61 64 73 61 66 65 20 28 69 74 20 69  threadsafe (it i
c420: 73 20 6e 6f 74 29 2e 0a 2a 2f 0a 63 6f 6e 73 74  s not)..*/.const
c430: 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74   sqlite3_mem_met
c440: 68 6f 64 73 20 2a 73 71 6c 69 74 65 33 4d 65 6d  hods *sqlite3Mem
c450: 47 65 74 57 69 6e 33 32 28 76 6f 69 64 29 7b 0a  GetWin32(void){.
c460: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73    static const s
c470: 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f  qlite3_mem_metho
c480: 64 73 20 77 69 6e 4d 65 6d 4d 65 74 68 6f 64 73  ds winMemMethods
c490: 20 3d 20 7b 0a 20 20 20 20 77 69 6e 4d 65 6d 4d   = {.    winMemM
c4a0: 61 6c 6c 6f 63 2c 0a 20 20 20 20 77 69 6e 4d 65  alloc,.    winMe
c4b0: 6d 46 72 65 65 2c 0a 20 20 20 20 77 69 6e 4d 65  mFree,.    winMe
c4c0: 6d 52 65 61 6c 6c 6f 63 2c 0a 20 20 20 20 77 69  mRealloc,.    wi
c4d0: 6e 4d 65 6d 53 69 7a 65 2c 0a 20 20 20 20 77 69  nMemSize,.    wi
c4e0: 6e 4d 65 6d 52 6f 75 6e 64 75 70 2c 0a 20 20 20  nMemRoundup,.   
c4f0: 20 77 69 6e 4d 65 6d 49 6e 69 74 2c 0a 20 20 20   winMemInit,.   
c500: 20 77 69 6e 4d 65 6d 53 68 75 74 64 6f 77 6e 2c   winMemShutdown,
c510: 0a 20 20 20 20 26 77 69 6e 5f 6d 65 6d 5f 64 61  .    &win_mem_da
c520: 74 61 0a 20 20 7d 3b 0a 20 20 72 65 74 75 72 6e  ta.  };.  return
c530: 20 26 77 69 6e 4d 65 6d 4d 65 74 68 6f 64 73 3b   &winMemMethods;
c540: 0a 7d 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .}..void sqlite3
c550: 4d 65 6d 53 65 74 44 65 66 61 75 6c 74 28 76 6f  MemSetDefault(vo
c560: 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 63  id){.  sqlite3_c
c570: 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e  onfig(SQLITE_CON
c580: 46 49 47 5f 4d 41 4c 4c 4f 43 2c 20 73 71 6c 69  FIG_MALLOC, sqli
c590: 74 65 33 4d 65 6d 47 65 74 57 69 6e 33 32 28 29  te3MemGetWin32()
c5a0: 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  );.}.#endif /* S
c5b0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c  QLITE_WIN32_MALL
c5c0: 4f 43 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  OC */../*.** Con
c5d0: 76 65 72 74 20 61 20 55 54 46 2d 38 20 73 74 72  vert a UTF-8 str
c5e0: 69 6e 67 20 74 6f 20 4d 69 63 72 6f 73 6f 66 74  ing to Microsoft
c5f0: 20 55 6e 69 63 6f 64 65 20 28 55 54 46 2d 31 36   Unicode (UTF-16
c600: 3f 29 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20  ?)..**.** Space 
c610: 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75  to hold the retu
c620: 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73 20 6f  rned string is o
c630: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c  btained from mal
c640: 6c 6f 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4c  loc..*/.static L
c650: 50 57 53 54 52 20 77 69 6e 55 74 66 38 54 6f 55  PWSTR winUtf8ToU
c660: 6e 69 63 6f 64 65 28 63 6f 6e 73 74 20 63 68 61  nicode(const cha
c670: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20  r *zFilename){. 
c680: 20 69 6e 74 20 6e 43 68 61 72 3b 0a 20 20 4c 50   int nChar;.  LP
c690: 57 53 54 52 20 7a 57 69 64 65 46 69 6c 65 6e 61  WSTR zWideFilena
c6a0: 6d 65 3b 0a 0a 20 20 6e 43 68 61 72 20 3d 20 6f  me;..  nChar = o
c6b0: 73 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65  sMultiByteToWide
c6c0: 43 68 61 72 28 43 50 5f 55 54 46 38 2c 20 30 2c  Char(CP_UTF8, 0,
c6d0: 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20   zFilename, -1, 
c6e0: 4e 55 4c 4c 2c 20 30 29 3b 0a 20 20 69 66 28 20  NULL, 0);.  if( 
c6f0: 6e 43 68 61 72 3d 3d 30 20 29 7b 0a 20 20 20 20  nChar==0 ){.    
c700: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
c710: 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 20 3d 20  zWideFilename = 
c720: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
c730: 6f 28 20 6e 43 68 61 72 2a 73 69 7a 65 6f 66 28  o( nChar*sizeof(
c740: 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 5b 30 5d  zWideFilename[0]
c750: 29 20 29 3b 0a 20 20 69 66 28 20 7a 57 69 64 65  ) );.  if( zWide
c760: 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20  Filename==0 ){. 
c770: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
c780: 0a 20 20 6e 43 68 61 72 20 3d 20 6f 73 4d 75 6c  .  nChar = osMul
c790: 74 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 72  tiByteToWideChar
c7a0: 28 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a 46 69  (CP_UTF8, 0, zFi
c7b0: 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a 57 69 64  lename, -1, zWid
c7c0: 65 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20  eFilename,.     
c7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c7e0: 20 20 20 20 20 20 20 20 20 20 20 6e 43 68 61 72             nChar
c7f0: 29 3b 0a 20 20 69 66 28 20 6e 43 68 61 72 3d 3d  );.  if( nChar==
c800: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
c810: 5f 66 72 65 65 28 7a 57 69 64 65 46 69 6c 65 6e  _free(zWideFilen
c820: 61 6d 65 29 3b 0a 20 20 20 20 7a 57 69 64 65 46  ame);.    zWideF
c830: 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d  ilename = 0;.  }
c840: 0a 20 20 72 65 74 75 72 6e 20 7a 57 69 64 65 46  .  return zWideF
c850: 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ilename;.}../*.*
c860: 2a 20 43 6f 6e 76 65 72 74 20 4d 69 63 72 6f 73  * Convert Micros
c870: 6f 66 74 20 55 6e 69 63 6f 64 65 20 74 6f 20 55  oft Unicode to U
c880: 54 46 2d 38 2e 20 20 53 70 61 63 65 20 74 6f 20  TF-8.  Space to 
c890: 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65  hold the returne
c8a0: 64 20 73 74 72 69 6e 67 20 69 73 0a 2a 2a 20 6f  d string is.** o
c8b0: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
c8c0: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a  ite3_malloc()..*
c8d0: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 77  /.static char *w
c8e0: 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66 38 28  inUnicodeToUtf8(
c8f0: 4c 50 43 57 53 54 52 20 7a 57 69 64 65 46 69 6c  LPCWSTR zWideFil
c900: 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 6e 42  ename){.  int nB
c910: 79 74 65 3b 0a 20 20 63 68 61 72 20 2a 7a 46 69  yte;.  char *zFi
c920: 6c 65 6e 61 6d 65 3b 0a 0a 20 20 6e 42 79 74 65  lename;..  nByte
c930: 20 3d 20 6f 73 57 69 64 65 43 68 61 72 54 6f 4d   = osWideCharToM
c940: 75 6c 74 69 42 79 74 65 28 43 50 5f 55 54 46 38  ultiByte(CP_UTF8
c950: 2c 20 30 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61  , 0, zWideFilena
c960: 6d 65 2c 20 2d 31 2c 20 30 2c 20 30 2c 20 30 2c  me, -1, 0, 0, 0,
c970: 20 30 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65   0);.  if( nByte
c980: 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20 72 65 74   == 0 ){.    ret
c990: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 46 69  urn 0;.  }.  zFi
c9a0: 6c 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  lename = sqlite3
c9b0: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42 79 74  MallocZero( nByt
c9c0: 65 20 29 3b 0a 20 20 69 66 28 20 7a 46 69 6c 65  e );.  if( zFile
c9d0: 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72  name==0 ){.    r
c9e0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e  eturn 0;.  }.  n
c9f0: 42 79 74 65 20 3d 20 6f 73 57 69 64 65 43 68 61  Byte = osWideCha
ca00: 72 54 6f 4d 75 6c 74 69 42 79 74 65 28 43 50 5f  rToMultiByte(CP_
ca10: 55 54 46 38 2c 20 30 2c 20 7a 57 69 64 65 46 69  UTF8, 0, zWideFi
ca20: 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a 46 69 6c  lename, -1, zFil
ca30: 65 6e 61 6d 65 2c 20 6e 42 79 74 65 2c 0a 20 20  ename, nByte,.  
ca40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
ca60: 20 30 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65   0);.  if( nByte
ca70: 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20 73 71 6c   == 0 ){.    sql
ca80: 69 74 65 33 5f 66 72 65 65 28 7a 46 69 6c 65 6e  ite3_free(zFilen
ca90: 61 6d 65 29 3b 0a 20 20 20 20 7a 46 69 6c 65 6e  ame);.    zFilen
caa0: 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  ame = 0;.  }.  r
cab0: 65 74 75 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 3b  eturn zFilename;
cac0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  .}../*.** Conver
cad0: 74 20 61 6e 20 41 4e 53 49 20 73 74 72 69 6e 67  t an ANSI string
cae0: 20 74 6f 20 4d 69 63 72 6f 73 6f 66 74 20 55 6e   to Microsoft Un
caf0: 69 63 6f 64 65 2c 20 62 61 73 65 64 20 6f 6e 20  icode, based on 
cb00: 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 63  the.** current c
cb10: 6f 64 65 70 61 67 65 20 73 65 74 74 69 6e 67 73  odepage settings
cb20: 20 66 6f 72 20 66 69 6c 65 20 61 70 69 73 2e 0a   for file apis..
cb30: 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68  **.** Space to h
cb40: 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65 64  old the returned
cb50: 20 73 74 72 69 6e 67 20 69 73 20 6f 62 74 61 69   string is obtai
cb60: 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20 73 71 6c 69  ned.** from sqli
cb70: 74 65 33 5f 6d 61 6c 6c 6f 63 2e 0a 2a 2f 0a 73  te3_malloc..*/.s
cb80: 74 61 74 69 63 20 4c 50 57 53 54 52 20 77 69 6e  tatic LPWSTR win
cb90: 4d 62 63 73 54 6f 55 6e 69 63 6f 64 65 28 63 6f  MbcsToUnicode(co
cba0: 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
cbb0: 61 6d 65 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74  ame){.  int nByt
cbc0: 65 3b 0a 20 20 4c 50 57 53 54 52 20 7a 4d 62 63  e;.  LPWSTR zMbc
cbd0: 73 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 69 6e 74  sFilename;.  int
cbe0: 20 63 6f 64 65 70 61 67 65 20 3d 20 6f 73 41 72   codepage = osAr
cbf0: 65 46 69 6c 65 41 70 69 73 41 4e 53 49 28 29 20  eFileApisANSI() 
cc00: 3f 20 43 50 5f 41 43 50 20 3a 20 43 50 5f 4f 45  ? CP_ACP : CP_OE
cc10: 4d 43 50 3b 0a 0a 20 20 6e 42 79 74 65 20 3d 20  MCP;..  nByte = 
cc20: 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64  osMultiByteToWid
cc30: 65 43 68 61 72 28 63 6f 64 65 70 61 67 65 2c 20  eChar(codepage, 
cc40: 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31  0, zFilename, -1
cc50: 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20  , NULL,.        
cc60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc70: 20 20 20 20 20 20 20 20 30 29 2a 73 69 7a 65 6f          0)*sizeo
cc80: 66 28 57 43 48 41 52 29 3b 0a 20 20 69 66 28 20  f(WCHAR);.  if( 
cc90: 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nByte==0 ){.    
cca0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
ccb0: 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 20 3d 20  zMbcsFilename = 
ccc0: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
ccd0: 6f 28 20 6e 42 79 74 65 2a 73 69 7a 65 6f 66 28  o( nByte*sizeof(
cce0: 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 5b 30 5d  zMbcsFilename[0]
ccf0: 29 20 29 3b 0a 20 20 69 66 28 20 7a 4d 62 63 73  ) );.  if( zMbcs
cd00: 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20  Filename==0 ){. 
cd10: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
cd20: 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73 4d 75 6c  .  nByte = osMul
cd30: 74 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 72  tiByteToWideChar
cd40: 28 63 6f 64 65 70 61 67 65 2c 20 30 2c 20 7a 46  (codepage, 0, zF
cd50: 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a 4d 62  ilename, -1, zMb
cd60: 63 73 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20  csFilename,.    
cd70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd80: 20 20 20 20 20 20 20 20 20 20 20 20 6e 42 79 74              nByt
cd90: 65 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 3d  e);.  if( nByte=
cda0: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
cdb0: 33 5f 66 72 65 65 28 7a 4d 62 63 73 46 69 6c 65  3_free(zMbcsFile
cdc0: 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 4d 62 63 73  name);.    zMbcs
cdd0: 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20  Filename = 0;.  
cde0: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4d 62 63 73  }.  return zMbcs
cdf0: 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a  Filename;.}../*.
ce00: 2a 2a 20 43 6f 6e 76 65 72 74 20 4d 69 63 72 6f  ** Convert Micro
ce10: 73 6f 66 74 20 55 6e 69 63 6f 64 65 20 74 6f 20  soft Unicode to 
ce20: 6d 75 6c 74 69 2d 62 79 74 65 20 63 68 61 72 61  multi-byte chara
ce30: 63 74 65 72 20 73 74 72 69 6e 67 2c 20 62 61 73  cter string, bas
ce40: 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 75 73 65  ed on the.** use
ce50: 72 27 73 20 41 4e 53 49 20 63 6f 64 65 70 61 67  r's ANSI codepag
ce60: 65 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74  e..**.** Space t
ce70: 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72  o hold the retur
ce80: 6e 65 64 20 73 74 72 69 6e 67 20 69 73 20 6f 62  ned string is ob
ce90: 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73  tained from.** s
cea0: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e  qlite3_malloc().
ceb0: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
cec0: 2a 77 69 6e 55 6e 69 63 6f 64 65 54 6f 4d 62 63  *winUnicodeToMbc
ced0: 73 28 4c 50 43 57 53 54 52 20 7a 57 69 64 65 46  s(LPCWSTR zWideF
cee0: 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20  ilename){.  int 
cef0: 6e 42 79 74 65 3b 0a 20 20 63 68 61 72 20 2a 7a  nByte;.  char *z
cf00: 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 69 6e 74 20  Filename;.  int 
cf10: 63 6f 64 65 70 61 67 65 20 3d 20 6f 73 41 72 65  codepage = osAre
cf20: 46 69 6c 65 41 70 69 73 41 4e 53 49 28 29 20 3f  FileApisANSI() ?
cf30: 20 43 50 5f 41 43 50 20 3a 20 43 50 5f 4f 45 4d   CP_ACP : CP_OEM
cf40: 43 50 3b 0a 0a 20 20 6e 42 79 74 65 20 3d 20 6f  CP;..  nByte = o
cf50: 73 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69  sWideCharToMulti
cf60: 42 79 74 65 28 63 6f 64 65 70 61 67 65 2c 20 30  Byte(codepage, 0
cf70: 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c  , zWideFilename,
cf80: 20 2d 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29   -1, 0, 0, 0, 0)
cf90: 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 20 3d 3d  ;.  if( nByte ==
cfa0: 20 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e   0 ){.    return
cfb0: 20 30 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c 65 6e   0;.  }.  zFilen
cfc0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  ame = sqlite3Mal
cfd0: 6c 6f 63 5a 65 72 6f 28 20 6e 42 79 74 65 20 29  locZero( nByte )
cfe0: 3b 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d  ;.  if( zFilenam
cff0: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  e==0 ){.    retu
d000: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 42 79 74  rn 0;.  }.  nByt
d010: 65 20 3d 20 6f 73 57 69 64 65 43 68 61 72 54 6f  e = osWideCharTo
d020: 4d 75 6c 74 69 42 79 74 65 28 63 6f 64 65 70 61  MultiByte(codepa
d030: 67 65 2c 20 30 2c 20 7a 57 69 64 65 46 69 6c 65  ge, 0, zWideFile
d040: 6e 61 6d 65 2c 20 2d 31 2c 20 7a 46 69 6c 65 6e  name, -1, zFilen
d050: 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
d060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d070: 20 20 20 20 20 6e 42 79 74 65 2c 20 30 2c 20 30       nByte, 0, 0
d080: 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 20 3d  );.  if( nByte =
d090: 3d 20 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  = 0 ){.    sqlit
d0a0: 65 33 5f 66 72 65 65 28 7a 46 69 6c 65 6e 61 6d  e3_free(zFilenam
d0b0: 65 29 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d  e);.    zFilenam
d0c0: 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  e = 0;.  }.  ret
d0d0: 75 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d  urn zFilename;.}
d0e0: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  ../*.** Convert 
d0f0: 6d 75 6c 74 69 62 79 74 65 20 63 68 61 72 61 63  multibyte charac
d100: 74 65 72 20 73 74 72 69 6e 67 20 74 6f 20 55 54  ter string to UT
d110: 46 2d 38 2e 20 20 53 70 61 63 65 20 74 6f 20 68  F-8.  Space to h
d120: 6f 6c 64 20 74 68 65 0a 2a 2a 20 72 65 74 75 72  old the.** retur
d130: 6e 65 64 20 73 74 72 69 6e 67 20 69 73 20 6f 62  ned string is ob
d140: 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
d150: 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f  te3_malloc()..*/
d160: 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 77  .char *sqlite3_w
d170: 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66  in32_mbcs_to_utf
d180: 38 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  8(const char *zF
d190: 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 63 68 61 72  ilename){.  char
d1a0: 20 2a 7a 46 69 6c 65 6e 61 6d 65 55 74 66 38 3b   *zFilenameUtf8;
d1b0: 0a 20 20 4c 50 57 53 54 52 20 7a 54 6d 70 57 69  .  LPWSTR zTmpWi
d1c0: 64 65 3b 0a 0a 20 20 7a 54 6d 70 57 69 64 65 20  de;..  zTmpWide 
d1d0: 3d 20 77 69 6e 4d 62 63 73 54 6f 55 6e 69 63 6f  = winMbcsToUnico
d1e0: 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  de(zFilename);. 
d1f0: 20 69 66 28 20 7a 54 6d 70 57 69 64 65 3d 3d 30   if( zTmpWide==0
d200: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
d210: 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d  ;.  }.  zFilenam
d220: 65 55 74 66 38 20 3d 20 77 69 6e 55 6e 69 63 6f  eUtf8 = winUnico
d230: 64 65 54 6f 55 74 66 38 28 7a 54 6d 70 57 69 64  deToUtf8(zTmpWid
d240: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  e);.  sqlite3_fr
d250: 65 65 28 7a 54 6d 70 57 69 64 65 29 3b 0a 20 20  ee(zTmpWide);.  
d260: 72 65 74 75 72 6e 20 7a 46 69 6c 65 6e 61 6d 65  return zFilename
d270: 55 74 66 38 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  Utf8;.}../*.** C
d280: 6f 6e 76 65 72 74 20 55 54 46 2d 38 20 74 6f 20  onvert UTF-8 to 
d290: 6d 75 6c 74 69 62 79 74 65 20 63 68 61 72 61 63  multibyte charac
d2a0: 74 65 72 20 73 74 72 69 6e 67 2e 20 20 53 70 61  ter string.  Spa
d2b0: 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 2a  ce to hold the.*
d2c0: 2a 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e  * returned strin
d2d0: 67 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72  g is obtained fr
d2e0: 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  om sqlite3_mallo
d2f0: 63 28 29 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71  c()..*/.char *sq
d300: 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75 74 66 38  lite3_win32_utf8
d310: 5f 74 6f 5f 6d 62 63 73 28 63 6f 6e 73 74 20 63  _to_mbcs(const c
d320: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b  har *zFilename){
d330: 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  .  char *zFilena
d340: 6d 65 4d 62 63 73 3b 0a 20 20 4c 50 57 53 54 52  meMbcs;.  LPWSTR
d350: 20 7a 54 6d 70 57 69 64 65 3b 0a 0a 20 20 7a 54   zTmpWide;..  zT
d360: 6d 70 57 69 64 65 20 3d 20 77 69 6e 55 74 66 38  mpWide = winUtf8
d370: 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e  ToUnicode(zFilen
d380: 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 54 6d 70  ame);.  if( zTmp
d390: 57 69 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72  Wide==0 ){.    r
d3a0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a  eturn 0;.  }.  z
d3b0: 46 69 6c 65 6e 61 6d 65 4d 62 63 73 20 3d 20 77  FilenameMbcs = w
d3c0: 69 6e 55 6e 69 63 6f 64 65 54 6f 4d 62 63 73 28  inUnicodeToMbcs(
d3d0: 7a 54 6d 70 57 69 64 65 29 3b 0a 20 20 73 71 6c  zTmpWide);.  sql
d3e0: 69 74 65 33 5f 66 72 65 65 28 7a 54 6d 70 57 69  ite3_free(zTmpWi
d3f0: 64 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 46  de);.  return zF
d400: 69 6c 65 6e 61 6d 65 4d 62 63 73 3b 0a 7d 0a 0a  ilenameMbcs;.}..
d410: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
d420: 69 6f 6e 20 73 65 74 73 20 74 68 65 20 64 61 74  ion sets the dat
d430: 61 20 64 69 72 65 63 74 6f 72 79 20 6f 72 20 74  a directory or t
d440: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72  he temporary dir
d450: 65 63 74 6f 72 79 20 62 61 73 65 64 20 6f 6e 0a  ectory based on.
d460: 2a 2a 20 74 68 65 20 70 72 6f 76 69 64 65 64 20  ** the provided 
d470: 61 72 67 75 6d 65 6e 74 73 2e 20 20 54 68 65 20  arguments.  The 
d480: 74 79 70 65 20 61 72 67 75 6d 65 6e 74 20 6d 75  type argument mu
d490: 73 74 20 62 65 20 31 20 69 6e 20 6f 72 64 65 72  st be 1 in order
d4a0: 20 74 6f 20 73 65 74 20 74 68 65 0a 2a 2a 20 64   to set the.** d
d4b0: 61 74 61 20 64 69 72 65 63 74 6f 72 79 20 6f 72  ata directory or
d4c0: 20 32 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73   2 in order to s
d4d0: 65 74 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  et the temporary
d4e0: 20 64 69 72 65 63 74 6f 72 79 2e 20 20 54 68 65   directory.  The
d4f0: 20 7a 56 61 6c 75 65 0a 2a 2a 20 61 72 67 75 6d   zValue.** argum
d500: 65 6e 74 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ent is the name 
d510: 6f 66 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  of the directory
d520: 20 74 6f 20 75 73 65 2e 20 20 54 68 65 20 72 65   to use.  The re
d530: 74 75 72 6e 20 76 61 6c 75 65 20 77 69 6c 6c 20  turn value will 
d540: 62 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  be.** SQLITE_OK 
d550: 69 66 20 73 75 63 63 65 73 73 66 75 6c 2e 0a 2a  if successful..*
d560: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 69  /.int sqlite3_wi
d570: 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72  n32_set_director
d580: 79 28 44 57 4f 52 44 20 74 79 70 65 2c 20 4c 50  y(DWORD type, LP
d590: 43 57 53 54 52 20 7a 56 61 6c 75 65 29 7b 0a 20  CWSTR zValue){. 
d5a0: 20 63 68 61 72 20 2a 2a 70 70 44 69 72 65 63 74   char **ppDirect
d5b0: 6f 72 79 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66  ory = 0;.#ifndef
d5c0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
d5d0: 4f 49 4e 49 54 0a 20 20 69 6e 74 20 72 63 20 3d  OINIT.  int rc =
d5e0: 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c   sqlite3_initial
d5f0: 69 7a 65 28 29 3b 0a 20 20 69 66 28 20 72 63 20  ize();.  if( rc 
d600: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e  ) return rc;.#en
d610: 64 69 66 0a 20 20 69 66 28 20 74 79 70 65 3d 3d  dif.  if( type==
d620: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 41 54  SQLITE_WIN32_DAT
d630: 41 5f 44 49 52 45 43 54 4f 52 59 5f 54 59 50 45  A_DIRECTORY_TYPE
d640: 20 29 7b 0a 20 20 20 20 70 70 44 69 72 65 63 74   ){.    ppDirect
d650: 6f 72 79 20 3d 20 26 73 71 6c 69 74 65 33 5f 64  ory = &sqlite3_d
d660: 61 74 61 5f 64 69 72 65 63 74 6f 72 79 3b 0a 20  ata_directory;. 
d670: 20 7d 65 6c 73 65 20 69 66 28 20 74 79 70 65 3d   }else if( type=
d680: 3d 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 54 45  =SQLITE_WIN32_TE
d690: 4d 50 5f 44 49 52 45 43 54 4f 52 59 5f 54 59 50  MP_DIRECTORY_TYP
d6a0: 45 20 29 7b 0a 20 20 20 20 70 70 44 69 72 65 63  E ){.    ppDirec
d6b0: 74 6f 72 79 20 3d 20 26 73 71 6c 69 74 65 33 5f  tory = &sqlite3_
d6c0: 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 3b 0a  temp_directory;.
d6d0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70    }.  assert( !p
d6e0: 70 44 69 72 65 63 74 6f 72 79 20 7c 7c 20 74 79  pDirectory || ty
d6f0: 70 65 3d 3d 53 51 4c 49 54 45 5f 57 49 4e 33 32  pe==SQLITE_WIN32
d700: 5f 44 41 54 41 5f 44 49 52 45 43 54 4f 52 59 5f  _DATA_DIRECTORY_
d710: 54 59 50 45 0a 20 20 20 20 20 20 20 20 20 20 7c  TYPE.          |
d720: 7c 20 74 79 70 65 3d 3d 53 51 4c 49 54 45 5f 57  | type==SQLITE_W
d730: 49 4e 33 32 5f 54 45 4d 50 5f 44 49 52 45 43 54  IN32_TEMP_DIRECT
d740: 4f 52 59 5f 54 59 50 45 0a 20 20 29 3b 0a 20 20  ORY_TYPE.  );.  
d750: 61 73 73 65 72 74 28 20 21 70 70 44 69 72 65 63  assert( !ppDirec
d760: 74 6f 72 79 20 7c 7c 20 73 71 6c 69 74 65 33 4d  tory || sqlite3M
d770: 65 6d 64 65 62 75 67 48 61 73 54 79 70 65 28 2a  emdebugHasType(*
d780: 70 70 44 69 72 65 63 74 6f 72 79 2c 20 4d 45 4d  ppDirectory, MEM
d790: 54 59 50 45 5f 48 45 41 50 29 20 29 3b 0a 20 20  TYPE_HEAP) );.  
d7a0: 69 66 28 20 70 70 44 69 72 65 63 74 6f 72 79 20  if( ppDirectory 
d7b0: 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 56 61  ){.    char *zVa
d7c0: 6c 75 65 55 74 66 38 20 3d 20 30 3b 0a 20 20 20  lueUtf8 = 0;.   
d7d0: 20 69 66 28 20 7a 56 61 6c 75 65 20 26 26 20 7a   if( zValue && z
d7e0: 56 61 6c 75 65 5b 30 5d 20 29 7b 0a 20 20 20 20  Value[0] ){.    
d7f0: 20 20 7a 56 61 6c 75 65 55 74 66 38 20 3d 20 77    zValueUtf8 = w
d800: 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66 38 28  inUnicodeToUtf8(
d810: 7a 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 69  zValue);.      i
d820: 66 20 28 20 7a 56 61 6c 75 65 55 74 66 38 3d 3d  f ( zValueUtf8==
d830: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  0 ){.        ret
d840: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
d850: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
d860: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
d870: 28 2a 70 70 44 69 72 65 63 74 6f 72 79 29 3b 0a  (*ppDirectory);.
d880: 20 20 20 20 2a 70 70 44 69 72 65 63 74 6f 72 79      *ppDirectory
d890: 20 3d 20 7a 56 61 6c 75 65 55 74 66 38 3b 0a 20   = zValueUtf8;. 
d8a0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
d8b0: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  _OK;.  }.  retur
d8c0: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
d8d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 72 65 74  }../*.** The ret
d8e0: 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 77 69 6e  urn value of win
d8f0: 47 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67 0a  GetLastErrorMsg.
d900: 2a 2a 20 69 73 20 7a 65 72 6f 20 69 66 20 74 68  ** is zero if th
d910: 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  e error message 
d920: 66 69 74 73 20 69 6e 20 74 68 65 20 62 75 66 66  fits in the buff
d930: 65 72 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 0a  er, or non-zero.
d940: 2a 2a 20 6f 74 68 65 72 77 69 73 65 20 28 69 66  ** otherwise (if
d950: 20 74 68 65 20 6d 65 73 73 61 67 65 20 77 61 73   the message was
d960: 20 74 72 75 6e 63 61 74 65 64 29 2e 0a 2a 2f 0a   truncated)..*/.
d970: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 47 65  static int winGe
d980: 74 4c 61 73 74 45 72 72 6f 72 4d 73 67 28 44 57  tLastErrorMsg(DW
d990: 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 2c 20 69  ORD lastErrno, i
d9a0: 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a  nt nBuf, char *z
d9b0: 42 75 66 29 7b 0a 20 20 2f 2a 20 46 6f 72 6d 61  Buf){.  /* Forma
d9c0: 74 4d 65 73 73 61 67 65 20 72 65 74 75 72 6e 73  tMessage returns
d9d0: 20 30 20 6f 6e 20 66 61 69 6c 75 72 65 2e 20 20   0 on failure.  
d9e0: 4f 74 68 65 72 77 69 73 65 20 69 74 0a 20 20 2a  Otherwise it.  *
d9f0: 2a 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75  * returns the nu
da00: 6d 62 65 72 20 6f 66 20 54 43 48 41 52 73 20 77  mber of TCHARs w
da10: 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6f 75  ritten to the ou
da20: 74 70 75 74 0a 20 20 2a 2a 20 62 75 66 66 65 72  tput.  ** buffer
da30: 2c 20 65 78 63 6c 75 64 69 6e 67 20 74 68 65 20  , excluding the 
da40: 74 65 72 6d 69 6e 61 74 69 6e 67 20 6e 75 6c 6c  terminating null
da50: 20 63 68 61 72 2e 0a 20 20 2a 2f 0a 20 20 44 57   char..  */.  DW
da60: 4f 52 44 20 64 77 4c 65 6e 20 3d 20 30 3b 0a 20  ORD dwLen = 0;. 
da70: 20 63 68 61 72 20 2a 7a 4f 75 74 20 3d 20 30 3b   char *zOut = 0;
da80: 0a 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29  ..  if( osIsNT()
da90: 20 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f   ){.#if SQLITE_O
daa0: 53 5f 57 49 4e 52 54 0a 20 20 20 20 57 43 48 41  S_WINRT.    WCHA
dab0: 52 20 7a 54 65 6d 70 57 69 64 65 5b 53 51 4c 49  R zTempWide[SQLI
dac0: 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 45 52 52  TE_WIN32_MAX_ERR
dad0: 4d 53 47 5f 43 48 41 52 53 2b 31 5d 3b 0a 20 20  MSG_CHARS+1];.  
dae0: 20 20 64 77 4c 65 6e 20 3d 20 6f 73 46 6f 72 6d    dwLen = osForm
daf0: 61 74 4d 65 73 73 61 67 65 57 28 46 4f 52 4d 41  atMessageW(FORMA
db00: 54 5f 4d 45 53 53 41 47 45 5f 46 52 4f 4d 5f 53  T_MESSAGE_FROM_S
db10: 59 53 54 45 4d 20 7c 0a 20 20 20 20 20 20 20 20  YSTEM |.        
db20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db30: 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d 45 53 53       FORMAT_MESS
db40: 41 47 45 5f 49 47 4e 4f 52 45 5f 49 4e 53 45 52  AGE_IGNORE_INSER
db50: 54 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  TS,.            
db60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db70: 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20   NULL,.         
db80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db90: 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 2c 0a 20      lastErrno,. 
dba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dbb0: 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 0a 20              0,. 
dbc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dbd0: 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 65 6d              zTem
dbe0: 70 57 69 64 65 2c 0a 20 20 20 20 20 20 20 20 20  pWide,.         
dbf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc00: 20 20 20 20 53 51 4c 49 54 45 5f 57 49 4e 33 32      SQLITE_WIN32
dc10: 5f 4d 41 58 5f 45 52 52 4d 53 47 5f 43 48 41 52  _MAX_ERRMSG_CHAR
dc20: 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  S,.             
dc30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc40: 30 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 4c 50  0);.#else.    LP
dc50: 57 53 54 52 20 7a 54 65 6d 70 57 69 64 65 20 3d  WSTR zTempWide =
dc60: 20 4e 55 4c 4c 3b 0a 20 20 20 20 64 77 4c 65 6e   NULL;.    dwLen
dc70: 20 3d 20 6f 73 46 6f 72 6d 61 74 4d 65 73 73 61   = osFormatMessa
dc80: 67 65 57 28 46 4f 52 4d 41 54 5f 4d 45 53 53 41  geW(FORMAT_MESSA
dc90: 47 45 5f 41 4c 4c 4f 43 41 54 45 5f 42 55 46 46  GE_ALLOCATE_BUFF
dca0: 45 52 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  ER |.           
dcb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dcc0: 20 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45    FORMAT_MESSAGE
dcd0: 5f 46 52 4f 4d 5f 53 59 53 54 45 4d 20 7c 0a 20  _FROM_SYSTEM |. 
dce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dcf0: 20 20 20 20 20 20 20 20 20 20 20 20 46 4f 52 4d              FORM
dd00: 41 54 5f 4d 45 53 53 41 47 45 5f 49 47 4e 4f 52  AT_MESSAGE_IGNOR
dd10: 45 5f 49 4e 53 45 52 54 53 2c 0a 20 20 20 20 20  E_INSERTS,.     
dd20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd30: 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 0a 20 20          NULL,.  
dd40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd50: 20 20 20 20 20 20 20 20 20 20 20 6c 61 73 74 45             lastE
dd60: 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
dd70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd80: 20 20 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20     0,.          
dd90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dda0: 20 20 20 28 4c 50 57 53 54 52 29 20 26 7a 54 65     (LPWSTR) &zTe
ddb0: 6d 70 57 69 64 65 2c 0a 20 20 20 20 20 20 20 20  mpWide,.        
ddc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ddd0: 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20 20 20       0,.        
dde0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ddf0: 20 20 20 20 20 30 29 3b 0a 23 65 6e 64 69 66 0a       0);.#endif.
de00: 20 20 20 20 69 66 28 20 64 77 4c 65 6e 20 3e 20      if( dwLen > 
de10: 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 61 6c  0 ){.      /* al
de20: 6c 6f 63 61 74 65 20 61 20 62 75 66 66 65 72 20  locate a buffer 
de30: 61 6e 64 20 63 6f 6e 76 65 72 74 20 74 6f 20 55  and convert to U
de40: 54 46 38 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  TF8 */.      sql
de50: 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d  ite3BeginBenignM
de60: 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 7a  alloc();.      z
de70: 4f 75 74 20 3d 20 77 69 6e 55 6e 69 63 6f 64 65  Out = winUnicode
de80: 54 6f 55 74 66 38 28 7a 54 65 6d 70 57 69 64 65  ToUtf8(zTempWide
de90: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
dea0: 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
deb0: 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  );.#if !SQLITE_O
dec0: 53 5f 57 49 4e 52 54 0a 20 20 20 20 20 20 2f 2a  S_WINRT.      /*
ded0: 20 66 72 65 65 20 74 68 65 20 73 79 73 74 65 6d   free the system
dee0: 20 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74 65   buffer allocate
def0: 64 20 62 79 20 46 6f 72 6d 61 74 4d 65 73 73 61  d by FormatMessa
df00: 67 65 20 2a 2f 0a 20 20 20 20 20 20 6f 73 4c 6f  ge */.      osLo
df10: 63 61 6c 46 72 65 65 28 7a 54 65 6d 70 57 69 64  calFree(zTempWid
df20: 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  e);.#endif.    }
df30: 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49  .  }.#ifdef SQLI
df40: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
df50: 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 63 68  I.  else{.    ch
df60: 61 72 20 2a 7a 54 65 6d 70 20 3d 20 4e 55 4c 4c  ar *zTemp = NULL
df70: 3b 0a 20 20 20 20 64 77 4c 65 6e 20 3d 20 6f 73  ;.    dwLen = os
df80: 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 41 28 46  FormatMessageA(F
df90: 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 41 4c  ORMAT_MESSAGE_AL
dfa0: 4c 4f 43 41 54 45 5f 42 55 46 46 45 52 20 7c 0a  LOCATE_BUFFER |.
dfb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dfc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 46 4f 52               FOR
dfd0: 4d 41 54 5f 4d 45 53 53 41 47 45 5f 46 52 4f 4d  MAT_MESSAGE_FROM
dfe0: 5f 53 59 53 54 45 4d 20 7c 0a 20 20 20 20 20 20  _SYSTEM |.      
dff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e000: 20 20 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d 45         FORMAT_ME
e010: 53 53 41 47 45 5f 49 47 4e 4f 52 45 5f 49 4e 53  SSAGE_IGNORE_INS
e020: 45 52 54 53 2c 0a 20 20 20 20 20 20 20 20 20 20  ERTS,.          
e030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e040: 20 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20     NULL,.       
e050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e060: 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 2c        lastErrno,
e070: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
e090: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 4c                (L
e0b0: 50 53 54 52 29 20 26 7a 54 65 6d 70 2c 0a 20 20  PSTR) &zTemp,.  
e0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e0d0: 20 20 20 20 20 20 20 20 20 20 20 30 2c 0a 20 20             0,.  
e0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e0f0: 20 20 20 20 20 20 20 20 20 20 20 30 29 3b 0a 20             0);. 
e100: 20 20 20 69 66 28 20 64 77 4c 65 6e 20 3e 20 30     if( dwLen > 0
e110: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 61 6c 6c   ){.      /* all
e120: 6f 63 61 74 65 20 61 20 62 75 66 66 65 72 20 61  ocate a buffer a
e130: 6e 64 20 63 6f 6e 76 65 72 74 20 74 6f 20 55 54  nd convert to UT
e140: 46 38 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  F8 */.      sqli
e150: 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
e160: 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 7a 4f  lloc();.      zO
e170: 75 74 20 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e  ut = sqlite3_win
e180: 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28  32_mbcs_to_utf8(
e190: 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 73 71  zTemp);.      sq
e1a0: 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
e1b0: 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 2f 2a  lloc();.      /*
e1c0: 20 66 72 65 65 20 74 68 65 20 73 79 73 74 65 6d   free the system
e1d0: 20 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74 65   buffer allocate
e1e0: 64 20 62 79 20 46 6f 72 6d 61 74 4d 65 73 73 61  d by FormatMessa
e1f0: 67 65 20 2a 2f 0a 20 20 20 20 20 20 6f 73 4c 6f  ge */.      osLo
e200: 63 61 6c 46 72 65 65 28 7a 54 65 6d 70 29 3b 0a  calFree(zTemp);.
e210: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
e220: 0a 20 20 69 66 28 20 30 20 3d 3d 20 64 77 4c 65  .  if( 0 == dwLe
e230: 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  n ){.    sqlite3
e240: 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2c 20  _snprintf(nBuf, 
e250: 7a 42 75 66 2c 20 22 4f 73 45 72 72 6f 72 20 30  zBuf, "OsError 0
e260: 78 25 6c 78 20 28 25 6c 75 29 22 2c 20 6c 61 73  x%lx (%lu)", las
e270: 74 45 72 72 6e 6f 2c 20 6c 61 73 74 45 72 72 6e  tErrno, lastErrn
e280: 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  o);.  }else{.   
e290: 20 2f 2a 20 63 6f 70 79 20 61 20 6d 61 78 69 6d   /* copy a maxim
e2a0: 75 6d 20 6f 66 20 6e 42 75 66 20 63 68 61 72 73  um of nBuf chars
e2b0: 20 74 6f 20 6f 75 74 70 75 74 20 62 75 66 66 65   to output buffe
e2c0: 72 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  r */.    sqlite3
e2d0: 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2c 20  _snprintf(nBuf, 
e2e0: 7a 42 75 66 2c 20 22 25 73 22 2c 20 7a 4f 75 74  zBuf, "%s", zOut
e2f0: 29 3b 0a 20 20 20 20 2f 2a 20 66 72 65 65 20 74  );.    /* free t
e300: 68 65 20 55 54 46 38 20 62 75 66 66 65 72 20 2a  he UTF8 buffer *
e310: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  /.    sqlite3_fr
e320: 65 65 28 7a 4f 75 74 29 3b 0a 20 20 7d 0a 20 20  ee(zOut);.  }.  
e330: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
e340: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
e350: 69 6f 6e 20 2d 20 77 69 6e 4c 6f 67 45 72 72 6f  ion - winLogErro
e360: 72 41 74 4c 69 6e 65 28 29 20 2d 20 69 73 20 6f  rAtLine() - is o
e370: 6e 6c 79 20 65 76 65 72 20 63 61 6c 6c 65 64 20  nly ever called 
e380: 76 69 61 20 74 68 65 20 6d 61 63 72 6f 0a 2a 2a  via the macro.**
e390: 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 29 2e 0a   winLogError()..
e3a0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
e3b0: 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 61 66  ne is invoked af
e3c0: 74 65 72 20 61 6e 20 65 72 72 6f 72 20 6f 63 63  ter an error occ
e3d0: 75 72 73 20 69 6e 20 61 6e 20 4f 53 20 66 75 6e  urs in an OS fun
e3e0: 63 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20 6c 6f 67  ction..** It log
e3f0: 73 20 61 20 6d 65 73 73 61 67 65 20 75 73 69 6e  s a message usin
e400: 67 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20  g sqlite3_log() 
e410: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63  containing the c
e420: 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 0a  urrent value of.
e430: 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e  ** error code an
e440: 64 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 2c 20  d, if possible, 
e450: 74 68 65 20 68 75 6d 61 6e 2d 72 65 61 64 61 62  the human-readab
e460: 6c 65 20 65 71 75 69 76 61 6c 65 6e 74 20 66 72  le equivalent fr
e470: 6f 6d 0a 2a 2a 20 46 6f 72 6d 61 74 4d 65 73 73  om.** FormatMess
e480: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  age..**.** The f
e490: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 70 61  irst argument pa
e4a0: 73 73 65 64 20 74 6f 20 74 68 65 20 6d 61 63 72  ssed to the macr
e4b0: 6f 20 73 68 6f 75 6c 64 20 62 65 20 74 68 65 20  o should be the 
e4c0: 65 72 72 6f 72 20 63 6f 64 65 20 74 68 61 74 0a  error code that.
e4d0: 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72  ** will be retur
e4e0: 6e 65 64 20 74 6f 20 53 51 4c 69 74 65 20 28 65  ned to SQLite (e
e4f0: 2e 67 2e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  .g. SQLITE_IOERR
e500: 5f 44 45 4c 45 54 45 2c 20 53 51 4c 49 54 45 5f  _DELETE, SQLITE_
e510: 43 41 4e 54 4f 50 45 4e 29 2e 0a 2a 2a 20 54 68  CANTOPEN)..** Th
e520: 65 20 74 77 6f 20 73 75 62 73 65 71 75 65 6e 74  e two subsequent
e530: 20 61 72 67 75 6d 65 6e 74 73 20 73 68 6f 75 6c   arguments shoul
e540: 64 20 62 65 20 74 68 65 20 6e 61 6d 65 20 6f 66  d be the name of
e550: 20 74 68 65 20 4f 53 20 66 75 6e 63 74 69 6f 6e   the OS function
e560: 20 74 68 61 74 0a 2a 2a 20 66 61 69 6c 65 64 20   that.** failed 
e570: 61 6e 64 20 74 68 65 20 61 73 73 6f 63 69 61 74  and the associat
e580: 65 64 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 70  ed file-system p
e590: 61 74 68 2c 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a  ath, if any..*/.
e5a0: 23 64 65 66 69 6e 65 20 77 69 6e 4c 6f 67 45 72  #define winLogEr
e5b0: 72 6f 72 28 61 2c 62 2c 63 2c 64 29 20 20 20 77  ror(a,b,c,d)   w
e5c0: 69 6e 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65  inLogErrorAtLine
e5d0: 28 61 2c 62 2c 63 2c 64 2c 5f 5f 4c 49 4e 45 5f  (a,b,c,d,__LINE_
e5e0: 5f 29 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  _).static int wi
e5f0: 6e 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 28  nLogErrorAtLine(
e600: 0a 20 20 69 6e 74 20 65 72 72 63 6f 64 65 2c 20  .  int errcode, 
e610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e620: 20 20 20 2f 2a 20 53 51 4c 69 74 65 20 65 72 72     /* SQLite err
e630: 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 44 57 4f  or code */.  DWO
e640: 52 44 20 6c 61 73 74 45 72 72 6e 6f 2c 20 20 20  RD lastErrno,   
e650: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e660: 57 69 6e 33 32 20 6c 61 73 74 20 65 72 72 6f 72  Win32 last error
e670: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
e680: 20 2a 7a 46 75 6e 63 2c 20 20 20 20 20 20 20 20   *zFunc,        
e690: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
e6a0: 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20 74 68 61   OS function tha
e6b0: 74 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 63 6f  t failed */.  co
e6c0: 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c  nst char *zPath,
e6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e6e0: 20 46 69 6c 65 20 70 61 74 68 20 61 73 73 6f 63   File path assoc
e6f0: 69 61 74 65 64 20 77 69 74 68 20 65 72 72 6f 72  iated with error
e700: 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 69 6e 65 20   */.  int iLine 
e710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e720: 20 20 20 20 20 20 2f 2a 20 53 6f 75 72 63 65 20        /* Source 
e730: 6c 69 6e 65 20 6e 75 6d 62 65 72 20 77 68 65 72  line number wher
e740: 65 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64  e error occurred
e750: 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 7a 4d   */.){.  char zM
e760: 73 67 5b 35 30 30 5d 3b 20 20 20 20 20 20 20 20  sg[500];        
e770: 20 20 20 20 20 20 20 20 20 2f 2a 20 48 75 6d 61           /* Huma
e780: 6e 20 72 65 61 64 61 62 6c 65 20 65 72 72 6f 72  n readable error
e790: 20 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69   text */.  int i
e7a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e7b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
e7c0: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20  op counter */.. 
e7d0: 20 7a 4d 73 67 5b 30 5d 20 3d 20 30 3b 0a 20 20   zMsg[0] = 0;.  
e7e0: 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 4d  winGetLastErrorM
e7f0: 73 67 28 6c 61 73 74 45 72 72 6e 6f 2c 20 73 69  sg(lastErrno, si
e800: 7a 65 6f 66 28 7a 4d 73 67 29 2c 20 7a 4d 73 67  zeof(zMsg), zMsg
e810: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 72 72  );.  assert( err
e820: 63 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  code!=SQLITE_OK 
e830: 29 3b 0a 20 20 69 66 28 20 7a 50 61 74 68 3d 3d  );.  if( zPath==
e840: 30 20 29 20 7a 50 61 74 68 20 3d 20 22 22 3b 0a  0 ) zPath = "";.
e850: 20 20 66 6f 72 28 69 3d 30 3b 20 7a 4d 73 67 5b    for(i=0; zMsg[
e860: 69 5d 20 26 26 20 7a 4d 73 67 5b 69 5d 21 3d 27  i] && zMsg[i]!='
e870: 5c 72 27 20 26 26 20 7a 4d 73 67 5b 69 5d 21 3d  \r' && zMsg[i]!=
e880: 27 5c 6e 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 7a  '\n'; i++){}.  z
e890: 4d 73 67 5b 69 5d 20 3d 20 30 3b 0a 20 20 73 71  Msg[i] = 0;.  sq
e8a0: 6c 69 74 65 33 5f 6c 6f 67 28 65 72 72 63 6f 64  lite3_log(errcod
e8b0: 65 2c 0a 20 20 20 20 20 20 22 6f 73 5f 77 69 6e  e,.      "os_win
e8c0: 2e 63 3a 25 64 3a 20 28 25 6c 75 29 20 25 73 28  .c:%d: (%lu) %s(
e8d0: 25 73 29 20 2d 20 25 73 22 2c 0a 20 20 20 20 20  %s) - %s",.     
e8e0: 20 69 4c 69 6e 65 2c 20 6c 61 73 74 45 72 72 6e   iLine, lastErrn
e8f0: 6f 2c 20 7a 46 75 6e 63 2c 20 7a 50 61 74 68 2c  o, zFunc, zPath,
e900: 20 7a 4d 73 67 0a 20 20 29 3b 0a 0a 20 20 72 65   zMsg.  );..  re
e910: 74 75 72 6e 20 65 72 72 63 6f 64 65 3b 0a 7d 0a  turn errcode;.}.
e920: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65  ./*.** The numbe
e930: 72 20 6f 66 20 74 69 6d 65 73 20 74 68 61 74 20  r of times that 
e940: 61 20 52 65 61 64 46 69 6c 65 28 29 2c 20 57 72  a ReadFile(), Wr
e950: 69 74 65 46 69 6c 65 28 29 2c 20 61 6e 64 20 44  iteFile(), and D
e960: 65 6c 65 74 65 46 69 6c 65 28 29 0a 2a 2a 20 77  eleteFile().** w
e970: 69 6c 6c 20 62 65 20 72 65 74 72 69 65 64 20 66  ill be retried f
e980: 6f 6c 6c 6f 77 69 6e 67 20 61 20 6c 6f 63 6b 69  ollowing a locki
e990: 6e 67 20 65 72 72 6f 72 20 2d 20 70 72 6f 62 61  ng error - proba
e9a0: 62 6c 79 20 63 61 75 73 65 64 20 62 79 0a 2a 2a  bly caused by.**
e9b0: 20 61 6e 74 69 76 69 72 75 73 20 73 6f 66 74 77   antivirus softw
e9c0: 61 72 65 2e 20 20 41 6c 73 6f 20 74 68 65 20 69  are.  Also the i
e9d0: 6e 69 74 69 61 6c 20 64 65 6c 61 79 20 62 65 66  nitial delay bef
e9e0: 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 72 65  ore the first re
e9f0: 74 72 79 2e 0a 2a 2a 20 54 68 65 20 64 65 6c 61  try..** The dela
ea00: 79 20 69 6e 63 72 65 61 73 65 73 20 6c 69 6e 65  y increases line
ea10: 61 72 6c 79 20 77 69 74 68 20 65 61 63 68 20 72  arly with each r
ea20: 65 74 72 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  etry..*/.#ifndef
ea30: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f   SQLITE_WIN32_IO
ea40: 45 52 52 5f 52 45 54 52 59 0a 23 20 64 65 66 69  ERR_RETRY.# defi
ea50: 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ne SQLITE_WIN32_
ea60: 49 4f 45 52 52 5f 52 45 54 52 59 20 31 30 0a 23  IOERR_RETRY 10.#
ea70: 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51  endif.#ifndef SQ
ea80: 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52  LITE_WIN32_IOERR
ea90: 5f 52 45 54 52 59 5f 44 45 4c 41 59 0a 23 20 64  _RETRY_DELAY.# d
eaa0: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e  efine SQLITE_WIN
eab0: 33 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 5f 44  32_IOERR_RETRY_D
eac0: 45 4c 41 59 20 32 35 0a 23 65 6e 64 69 66 0a 73  ELAY 25.#endif.s
ead0: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 49 6f 65  tatic int winIoe
eae0: 72 72 52 65 74 72 79 20 3d 20 53 51 4c 49 54 45  rrRetry = SQLITE
eaf0: 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54  _WIN32_IOERR_RET
eb00: 52 59 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77  RY;.static int w
eb10: 69 6e 49 6f 65 72 72 52 65 74 72 79 44 65 6c 61  inIoerrRetryDela
eb20: 79 20 3d 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  y = SQLITE_WIN32
eb30: 5f 49 4f 45 52 52 5f 52 45 54 52 59 5f 44 45 4c  _IOERR_RETRY_DEL
eb40: 41 59 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 22  AY;../*.** The "
eb50: 77 69 6e 49 6f 65 72 72 43 61 6e 52 65 74 72 79  winIoerrCanRetry
eb60: 31 22 20 6d 61 63 72 6f 20 69 73 20 75 73 65 64  1" macro is used
eb70: 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66   to determine if
eb80: 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 49 2f   a particular I/
eb90: 4f 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20  O.** error code 
eba0: 6f 62 74 61 69 6e 65 64 20 76 69 61 20 47 65 74  obtained via Get
ebb0: 4c 61 73 74 45 72 72 6f 72 28 29 20 69 73 20 65  LastError() is e
ebc0: 6c 69 67 69 62 6c 65 20 74 6f 20 62 65 20 72 65  ligible to be re
ebd0: 74 72 69 65 64 2e 20 20 49 74 0a 2a 2a 20 6d 75  tried.  It.** mu
ebe0: 73 74 20 61 63 63 65 70 74 20 74 68 65 20 65 72  st accept the er
ebf0: 72 6f 72 20 63 6f 64 65 20 44 57 4f 52 44 20 61  ror code DWORD a
ec00: 73 20 69 74 73 20 6f 6e 6c 79 20 61 72 67 75 6d  s its only argum
ec10: 65 6e 74 20 61 6e 64 20 73 68 6f 75 6c 64 20 72  ent and should r
ec20: 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72  eturn.** non-zer
ec30: 6f 20 69 66 20 74 68 65 20 65 72 72 6f 72 20 63  o if the error c
ec40: 6f 64 65 20 69 73 20 74 72 61 6e 73 69 65 6e 74  ode is transient
ec50: 20 69 6e 20 6e 61 74 75 72 65 20 61 6e 64 20 74   in nature and t
ec60: 68 65 20 6f 70 65 72 61 74 69 6f 6e 0a 2a 2a 20  he operation.** 
ec70: 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20  responsible for 
ec80: 67 65 6e 65 72 61 74 69 6e 67 20 74 68 65 20 6f  generating the o
ec90: 72 69 67 69 6e 61 6c 20 65 72 72 6f 72 20 6d 69  riginal error mi
eca0: 67 68 74 20 73 75 63 63 65 65 64 20 75 70 6f 6e  ght succeed upon
ecb0: 20 62 65 69 6e 67 0a 2a 2a 20 72 65 74 72 69 65   being.** retrie
ecc0: 64 2e 20 20 54 68 65 20 61 72 67 75 6d 65 6e 74  d.  The argument
ecd0: 20 74 6f 20 74 68 69 73 20 6d 61 63 72 6f 20 73   to this macro s
ece0: 68 6f 75 6c 64 20 62 65 20 61 20 76 61 72 69 61  hould be a varia
ecf0: 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 64 64 69 74  ble..**.** Addit
ed00: 69 6f 6e 61 6c 6c 79 2c 20 61 20 6d 61 63 72 6f  ionally, a macro
ed10: 20 6e 61 6d 65 64 20 22 77 69 6e 49 6f 65 72 72   named "winIoerr
ed20: 43 61 6e 52 65 74 72 79 32 22 20 6d 61 79 20 62  CanRetry2" may b
ed30: 65 20 64 65 66 69 6e 65 64 2e 20 20 49 66 20 69  e defined.  If i
ed40: 74 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65 64 2c  t.** is defined,
ed50: 20 69 74 20 77 69 6c 6c 20 62 65 20 63 6f 6e 73   it will be cons
ed60: 75 6c 74 65 64 20 6f 6e 6c 79 20 77 68 65 6e 20  ulted only when 
ed70: 74 68 65 20 6d 61 63 72 6f 20 22 77 69 6e 49 6f  the macro "winIo
ed80: 65 72 72 43 61 6e 52 65 74 72 79 31 22 0a 2a 2a  errCanRetry1".**
ed90: 20 72 65 74 75 72 6e 73 20 7a 65 72 6f 2e 20 20   returns zero.  
eda0: 54 68 65 20 22 77 69 6e 49 6f 65 72 72 43 61 6e  The "winIoerrCan
edb0: 52 65 74 72 79 32 22 20 6d 61 63 72 6f 20 69 73  Retry2" macro is
edc0: 20 63 6f 6d 70 6c 65 74 65 6c 79 20 6f 70 74 69   completely opti
edd0: 6f 6e 61 6c 20 61 6e 64 0a 2a 2a 20 6d 61 79 20  onal and.** may 
ede0: 62 65 20 75 73 65 64 20 74 6f 20 69 6e 63 6c 75  be used to inclu
edf0: 64 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 65 72  de additional er
ee00: 72 6f 72 20 63 6f 64 65 73 20 69 6e 20 74 68 65  ror codes in the
ee10: 20 73 65 74 20 74 68 61 74 20 73 68 6f 75 6c 64   set that should
ee20: 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20 74 68  .** result in th
ee30: 65 20 66 61 69 6c 69 6e 67 20 49 2f 4f 20 6f 70  e failing I/O op
ee40: 65 72 61 74 69 6f 6e 20 62 65 69 6e 67 20 72 65  eration being re
ee50: 74 72 69 65 64 20 62 79 20 74 68 65 20 63 61 6c  tried by the cal
ee60: 6c 65 72 2e 20 20 49 66 0a 2a 2a 20 64 65 66 69  ler.  If.** defi
ee70: 6e 65 64 2c 20 74 68 65 20 22 77 69 6e 49 6f 65  ned, the "winIoe
ee80: 72 72 43 61 6e 52 65 74 72 79 32 22 20 6d 61 63  rrCanRetry2" mac
ee90: 72 6f 20 6d 75 73 74 20 65 78 68 69 62 69 74 20  ro must exhibit 
eea0: 65 78 74 65 72 6e 61 6c 20 73 65 6d 61 6e 74 69  external semanti
eeb0: 63 73 0a 2a 2a 20 69 64 65 6e 74 69 63 61 6c 20  cs.** identical 
eec0: 74 6f 20 74 68 6f 73 65 20 6f 66 20 74 68 65 20  to those of the 
eed0: 22 77 69 6e 49 6f 65 72 72 43 61 6e 52 65 74 72  "winIoerrCanRetr
eee0: 79 31 22 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 69  y1" macro..*/.#i
eef0: 66 20 21 64 65 66 69 6e 65 64 28 77 69 6e 49 6f  f !defined(winIo
ef00: 65 72 72 43 61 6e 52 65 74 72 79 31 29 0a 23 64  errCanRetry1).#d
ef10: 65 66 69 6e 65 20 77 69 6e 49 6f 65 72 72 43 61  efine winIoerrCa
ef20: 6e 52 65 74 72 79 31 28 61 29 20 28 28 28 61 29  nRetry1(a) (((a)
ef30: 3d 3d 45 52 52 4f 52 5f 41 43 43 45 53 53 5f 44  ==ERROR_ACCESS_D
ef40: 45 4e 49 45 44 29 20 20 20 20 20 20 20 20 7c 7c  ENIED)        ||
ef50: 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   \.             
ef60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef70: 20 28 28 61 29 3d 3d 45 52 52 4f 52 5f 53 48 41   ((a)==ERROR_SHA
ef80: 52 49 4e 47 5f 56 49 4f 4c 41 54 49 4f 4e 29 20  RING_VIOLATION) 
ef90: 20 20 20 7c 7c 20 5c 0a 20 20 20 20 20 20 20 20     || \.        
efa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
efb0: 20 20 20 20 20 20 28 28 61 29 3d 3d 45 52 52 4f        ((a)==ERRO
efc0: 52 5f 4c 4f 43 4b 5f 56 49 4f 4c 41 54 49 4f 4e  R_LOCK_VIOLATION
efd0: 29 20 20 20 20 20 20 20 7c 7c 20 5c 0a 20 20 20  )       || \.   
efe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eff0: 20 20 20 20 20 20 20 20 20 20 20 28 28 61 29 3d             ((a)=
f000: 3d 45 52 52 4f 52 5f 44 45 56 5f 4e 4f 54 5f 45  =ERROR_DEV_NOT_E
f010: 58 49 53 54 29 20 20 20 20 20 20 20 20 7c 7c 20  XIST)        || 
f020: 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  \.              
f030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f040: 28 28 61 29 3d 3d 45 52 52 4f 52 5f 4e 45 54 4e  ((a)==ERROR_NETN
f050: 41 4d 45 5f 44 45 4c 45 54 45 44 29 20 20 20 20  AME_DELETED)    
f060: 20 20 7c 7c 20 5c 0a 20 20 20 20 20 20 20 20 20    || \.         
f070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f080: 20 20 20 20 20 28 28 61 29 3d 3d 45 52 52 4f 52       ((a)==ERROR
f090: 5f 53 45 4d 5f 54 49 4d 45 4f 55 54 29 20 20 20  _SEM_TIMEOUT)   
f0a0: 20 20 20 20 20 20 20 7c 7c 20 5c 0a 20 20 20 20         || \.    
f0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f0c0: 20 20 20 20 20 20 20 20 20 20 28 28 61 29 3d 3d            ((a)==
f0d0: 45 52 52 4f 52 5f 4e 45 54 57 4f 52 4b 5f 55 4e  ERROR_NETWORK_UN
f0e0: 52 45 41 43 48 41 42 4c 45 29 29 0a 23 65 6e 64  REACHABLE)).#end
f0f0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 20 52  if../*.** If a R
f100: 65 61 64 46 69 6c 65 28 29 20 6f 72 20 57 72 69  eadFile() or Wri
f110: 74 65 46 69 6c 65 28 29 20 65 72 72 6f 72 20 6f  teFile() error o
f120: 63 63 75 72 73 2c 20 69 6e 76 6f 6b 65 20 74 68  ccurs, invoke th
f130: 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 74 6f  is routine.** to
f140: 20 73 65 65 20 69 66 20 69 74 20 73 68 6f 75 6c   see if it shoul
f150: 64 20 62 65 20 72 65 74 72 69 65 64 2e 20 20 52  d be retried.  R
f160: 65 74 75 72 6e 20 54 52 55 45 20 74 6f 20 72 65  eturn TRUE to re
f170: 74 72 79 2e 20 20 52 65 74 75 72 6e 20 46 41 4c  try.  Return FAL
f180: 53 45 0a 2a 2a 20 74 6f 20 67 69 76 65 20 75 70  SE.** to give up
f190: 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72 2e 0a   with an error..
f1a0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
f1b0: 6e 52 65 74 72 79 49 6f 65 72 72 28 69 6e 74 20  nRetryIoerr(int 
f1c0: 2a 70 6e 52 65 74 72 79 2c 20 44 57 4f 52 44 20  *pnRetry, DWORD 
f1d0: 2a 70 45 72 72 6f 72 29 7b 0a 20 20 44 57 4f 52  *pError){.  DWOR
f1e0: 44 20 65 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  D e = osGetLastE
f1f0: 72 72 6f 72 28 29 3b 0a 20 20 69 66 28 20 2a 70  rror();.  if( *p
f200: 6e 52 65 74 72 79 3e 3d 77 69 6e 49 6f 65 72 72  nRetry>=winIoerr
f210: 52 65 74 72 79 20 29 7b 0a 20 20 20 20 69 66 28  Retry ){.    if(
f220: 20 70 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20   pError ){.     
f230: 20 2a 70 45 72 72 6f 72 20 3d 20 65 3b 0a 20 20   *pError = e;.  
f240: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 30    }.    return 0
f250: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 77 69 6e 49  ;.  }.  if( winI
f260: 6f 65 72 72 43 61 6e 52 65 74 72 79 31 28 65 29  oerrCanRetry1(e)
f270: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
f280: 77 69 6e 33 32 5f 73 6c 65 65 70 28 77 69 6e 49  win32_sleep(winI
f290: 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79 2a 28  oerrRetryDelay*(
f2a0: 31 2b 2a 70 6e 52 65 74 72 79 29 29 3b 0a 20 20  1+*pnRetry));.  
f2b0: 20 20 2b 2b 2a 70 6e 52 65 74 72 79 3b 0a 20 20    ++*pnRetry;.  
f2c0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
f2d0: 23 69 66 20 64 65 66 69 6e 65 64 28 77 69 6e 49  #if defined(winI
f2e0: 6f 65 72 72 43 61 6e 52 65 74 72 79 32 29 0a 20  oerrCanRetry2). 
f2f0: 20 65 6c 73 65 20 69 66 28 20 77 69 6e 49 6f 65   else if( winIoe
f300: 72 72 43 61 6e 52 65 74 72 79 32 28 65 29 20 29  rrCanRetry2(e) )
f310: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 77 69  {.    sqlite3_wi
f320: 6e 33 32 5f 73 6c 65 65 70 28 77 69 6e 49 6f 65  n32_sleep(winIoe
f330: 72 72 52 65 74 72 79 44 65 6c 61 79 2a 28 31 2b  rrRetryDelay*(1+
f340: 2a 70 6e 52 65 74 72 79 29 29 3b 0a 20 20 20 20  *pnRetry));.    
f350: 2b 2b 2a 70 6e 52 65 74 72 79 3b 0a 20 20 20 20  ++*pnRetry;.    
f360: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 23 65  return 1;.  }.#e
f370: 6e 64 69 66 0a 20 20 69 66 28 20 70 45 72 72 6f  ndif.  if( pErro
f380: 72 20 29 7b 0a 20 20 20 20 2a 70 45 72 72 6f 72  r ){.    *pError
f390: 20 3d 20 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = e;.  }.  retu
f3a0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  rn 0;.}../*.** L
f3b0: 6f 67 20 61 20 49 2f 4f 20 65 72 72 6f 72 20 72  og a I/O error r
f3c0: 65 74 72 79 20 65 70 69 73 6f 64 65 2e 0a 2a 2f  etry episode..*/
f3d0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e  .static void win
f3e0: 4c 6f 67 49 6f 65 72 72 28 69 6e 74 20 6e 52 65  LogIoerr(int nRe
f3f0: 74 72 79 29 7b 0a 20 20 69 66 28 20 6e 52 65 74  try){.  if( nRet
f400: 72 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ry ){.    sqlite
f410: 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 49 4f 45  3_log(SQLITE_IOE
f420: 52 52 2c 0a 20 20 20 20 20 20 22 64 65 6c 61 79  RR,.      "delay
f430: 65 64 20 25 64 6d 73 20 66 6f 72 20 6c 6f 63 6b  ed %dms for lock
f440: 2f 73 68 61 72 69 6e 67 20 63 6f 6e 66 6c 69 63  /sharing conflic
f450: 74 22 2c 0a 20 20 20 20 20 20 77 69 6e 49 6f 65  t",.      winIoe
f460: 72 72 52 65 74 72 79 44 65 6c 61 79 2a 6e 52 65  rrRetryDelay*nRe
f470: 74 72 79 2a 28 6e 52 65 74 72 79 2b 31 29 2f 32  try*(nRetry+1)/2
f480: 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 23  .    );.  }.}..#
f490: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
f4a0: 43 45 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  CE./************
f4b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f4c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f4d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f4e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
f4f0: 20 54 68 69 73 20 73 65 63 74 69 6f 6e 20 63 6f   This section co
f500: 6e 74 61 69 6e 73 20 63 6f 64 65 20 66 6f 72 20  ntains code for 
f510: 57 69 6e 43 45 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23  WinCE only..*/.#
f520: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
f530: 54 45 5f 4d 53 56 43 5f 4c 4f 43 41 4c 54 49 4d  TE_MSVC_LOCALTIM
f540: 45 5f 41 50 49 29 20 7c 7c 20 21 53 51 4c 49 54  E_API) || !SQLIT
f550: 45 5f 4d 53 56 43 5f 4c 4f 43 41 4c 54 49 4d 45  E_MSVC_LOCALTIME
f560: 5f 41 50 49 0a 2f 2a 0a 2a 2a 20 54 68 65 20 4d  _API./*.** The M
f570: 53 56 43 20 43 52 54 20 6f 6e 20 57 69 6e 64 6f  SVC CRT on Windo
f580: 77 73 20 43 45 20 6d 61 79 20 6e 6f 74 20 68 61  ws CE may not ha
f590: 76 65 20 61 20 6c 6f 63 61 6c 74 69 6d 65 28 29  ve a localtime()
f5a0: 20 66 75 6e 63 74 69 6f 6e 2e 20 20 53 6f 0a 2a   function.  So.*
f5b0: 2a 20 63 72 65 61 74 65 20 61 20 73 75 62 73 74  * create a subst
f5c0: 69 74 75 74 65 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  itute..*/.#inclu
f5d0: 64 65 20 3c 74 69 6d 65 2e 68 3e 0a 73 74 72 75  de <time.h>.stru
f5e0: 63 74 20 74 6d 20 2a 5f 5f 63 64 65 63 6c 20 6c  ct tm *__cdecl l
f5f0: 6f 63 61 6c 74 69 6d 65 28 63 6f 6e 73 74 20 74  ocaltime(const t
f600: 69 6d 65 5f 74 20 2a 74 29 0a 7b 0a 20 20 73 74  ime_t *t).{.  st
f610: 61 74 69 63 20 73 74 72 75 63 74 20 74 6d 20 79  atic struct tm y
f620: 3b 0a 20 20 46 49 4c 45 54 49 4d 45 20 75 54 6d  ;.  FILETIME uTm
f630: 2c 20 6c 54 6d 3b 0a 20 20 53 59 53 54 45 4d 54  , lTm;.  SYSTEMT
f640: 49 4d 45 20 70 54 6d 3b 0a 20 20 73 71 6c 69 74  IME pTm;.  sqlit
f650: 65 33 5f 69 6e 74 36 34 20 74 36 34 3b 0a 20 20  e3_int64 t64;.  
f660: 74 36 34 20 3d 20 2a 74 3b 0a 20 20 74 36 34 20  t64 = *t;.  t64 
f670: 3d 20 28 74 36 34 20 2b 20 31 31 36 34 34 34 37  = (t64 + 1164447
f680: 33 36 30 30 29 2a 31 30 30 30 30 30 30 30 3b 0a  3600)*10000000;.
f690: 20 20 75 54 6d 2e 64 77 4c 6f 77 44 61 74 65 54    uTm.dwLowDateT
f6a0: 69 6d 65 20 3d 20 28 44 57 4f 52 44 29 28 74 36  ime = (DWORD)(t6
f6b0: 34 20 26 20 30 78 46 46 46 46 46 46 46 46 29 3b  4 & 0xFFFFFFFF);
f6c0: 0a 20 20 75 54 6d 2e 64 77 48 69 67 68 44 61 74  .  uTm.dwHighDat
f6d0: 65 54 69 6d 65 3d 20 28 44 57 4f 52 44 29 28 74  eTime= (DWORD)(t
f6e0: 36 34 20 3e 3e 20 33 32 29 3b 0a 20 20 6f 73 46  64 >> 32);.  osF
f6f0: 69 6c 65 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69  ileTimeToLocalFi
f700: 6c 65 54 69 6d 65 28 26 75 54 6d 2c 26 6c 54 6d  leTime(&uTm,&lTm
f710: 29 3b 0a 20 20 6f 73 46 69 6c 65 54 69 6d 65 54  );.  osFileTimeT
f720: 6f 53 79 73 74 65 6d 54 69 6d 65 28 26 6c 54 6d  oSystemTime(&lTm
f730: 2c 26 70 54 6d 29 3b 0a 20 20 79 2e 74 6d 5f 79  ,&pTm);.  y.tm_y
f740: 65 61 72 20 3d 20 70 54 6d 2e 77 59 65 61 72 20  ear = pTm.wYear 
f750: 2d 20 31 39 30 30 3b 0a 20 20 79 2e 74 6d 5f 6d  - 1900;.  y.tm_m
f760: 6f 6e 20 3d 20 70 54 6d 2e 77 4d 6f 6e 74 68 20  on = pTm.wMonth 
f770: 2d 20 31 3b 0a 20 20 79 2e 74 6d 5f 77 64 61 79  - 1;.  y.tm_wday
f780: 20 3d 20 70 54 6d 2e 77 44 61 79 4f 66 57 65 65   = pTm.wDayOfWee
f790: 6b 3b 0a 20 20 79 2e 74 6d 5f 6d 64 61 79 20 3d  k;.  y.tm_mday =
f7a0: 20 70 54 6d 2e 77 44 61 79 3b 0a 20 20 79 2e 74   pTm.wDay;.  y.t
f7b0: 6d 5f 68 6f 75 72 20 3d 20 70 54 6d 2e 77 48 6f  m_hour = pTm.wHo
f7c0: 75 72 3b 0a 20 20 79 2e 74 6d 5f 6d 69 6e 20 3d  ur;.  y.tm_min =
f7d0: 20 70 54 6d 2e 77 4d 69 6e 75 74 65 3b 0a 20 20   pTm.wMinute;.  
f7e0: 79 2e 74 6d 5f 73 65 63 20 3d 20 70 54 6d 2e 77  y.tm_sec = pTm.w
f7f0: 53 65 63 6f 6e 64 3b 0a 20 20 72 65 74 75 72 6e  Second;.  return
f800: 20 26 79 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23   &y;.}.#endif..#
f810: 64 65 66 69 6e 65 20 48 41 4e 44 4c 45 5f 54 4f  define HANDLE_TO
f820: 5f 57 49 4e 46 49 4c 45 28 61 29 20 28 77 69 6e  _WINFILE(a) (win
f830: 46 69 6c 65 2a 29 26 28 28 63 68 61 72 2a 29 61  File*)&((char*)a
f840: 29 5b 2d 28 69 6e 74 29 6f 66 66 73 65 74 6f 66  )[-(int)offsetof
f850: 28 77 69 6e 46 69 6c 65 2c 68 29 5d 0a 0a 2f 2a  (winFile,h)]../*
f860: 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 6c 6f  .** Acquire a lo
f870: 63 6b 20 6f 6e 20 74 68 65 20 68 61 6e 64 6c 65  ck on the handle
f880: 20 68 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69   h.*/.static voi
f890: 64 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71 75  d winceMutexAcqu
f8a0: 69 72 65 28 48 41 4e 44 4c 45 20 68 29 7b 0a 20  ire(HANDLE h){. 
f8b0: 20 20 44 57 4f 52 44 20 64 77 45 72 72 3b 0a 20    DWORD dwErr;. 
f8c0: 20 20 64 6f 20 7b 0a 20 20 20 20 20 64 77 45 72    do {.     dwEr
f8d0: 72 20 3d 20 6f 73 57 61 69 74 46 6f 72 53 69 6e  r = osWaitForSin
f8e0: 67 6c 65 4f 62 6a 65 63 74 28 68 2c 20 49 4e 46  gleObject(h, INF
f8f0: 49 4e 49 54 45 29 3b 0a 20 20 20 7d 20 77 68 69  INITE);.   } whi
f900: 6c 65 20 28 64 77 45 72 72 20 21 3d 20 57 41 49  le (dwErr != WAI
f910: 54 5f 4f 42 4a 45 43 54 5f 30 20 26 26 20 64 77  T_OBJECT_0 && dw
f920: 45 72 72 20 21 3d 20 57 41 49 54 5f 41 42 41 4e  Err != WAIT_ABAN
f930: 44 4f 4e 45 44 29 3b 0a 7d 0a 2f 2a 0a 2a 2a 20  DONED);.}./*.** 
f940: 52 65 6c 65 61 73 65 20 61 20 6c 6f 63 6b 20 61  Release a lock a
f950: 63 71 75 69 72 65 64 20 62 79 20 77 69 6e 63 65  cquired by wince
f960: 4d 75 74 65 78 41 63 71 75 69 72 65 28 29 0a 2a  MutexAcquire().*
f970: 2f 0a 23 64 65 66 69 6e 65 20 77 69 6e 63 65 4d  /.#define winceM
f980: 75 74 65 78 52 65 6c 65 61 73 65 28 68 29 20 52  utexRelease(h) R
f990: 65 6c 65 61 73 65 4d 75 74 65 78 28 68 29 0a 0a  eleaseMutex(h)..
f9a0: 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74 68 65  /*.** Create the
f9b0: 20 6d 75 74 65 78 20 61 6e 64 20 73 68 61 72 65   mutex and share
f9c0: 64 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 66 6f  d memory used fo
f9d0: 72 20 6c 6f 63 6b 69 6e 67 20 69 6e 20 74 68 65  r locking in the
f9e0: 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70   file.** descrip
f9f0: 74 6f 72 20 70 46 69 6c 65 0a 2a 2f 0a 73 74 61  tor pFile.*/.sta
fa00: 74 69 63 20 69 6e 74 20 77 69 6e 63 65 43 72 65  tic int winceCre
fa10: 61 74 65 4c 6f 63 6b 28 63 6f 6e 73 74 20 63 68  ateLock(const ch
fa20: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 77  ar *zFilename, w
fa30: 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a  inFile *pFile){.
fa40: 20 20 4c 50 57 53 54 52 20 7a 54 6f 6b 3b 0a 20    LPWSTR zTok;. 
fa50: 20 4c 50 57 53 54 52 20 7a 4e 61 6d 65 3b 0a 20   LPWSTR zName;. 
fa60: 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f   DWORD lastErrno
fa70: 3b 0a 20 20 42 4f 4f 4c 20 62 4c 6f 67 67 65 64  ;.  BOOL bLogged
fa80: 20 3d 20 46 41 4c 53 45 3b 0a 20 20 42 4f 4f 4c   = FALSE;.  BOOL
fa90: 20 62 49 6e 69 74 20 3d 20 54 52 55 45 3b 0a 0a   bInit = TRUE;..
faa0: 20 20 7a 4e 61 6d 65 20 3d 20 77 69 6e 55 74 66    zName = winUtf
fab0: 38 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65  8ToUnicode(zFile
fac0: 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61  name);.  if( zNa
fad0: 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  me==0 ){.    /* 
fae0: 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 20 2a 2f  out of memory */
faf0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
fb00: 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a  TE_IOERR_NOMEM;.
fb10: 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61    }..  /* Initia
fb20: 6c 69 7a 65 20 74 68 65 20 6c 6f 63 61 6c 20 6c  lize the local l
fb30: 6f 63 6b 64 61 74 61 20 2a 2f 0a 20 20 6d 65 6d  ockdata */.  mem
fb40: 73 65 74 28 26 70 46 69 6c 65 2d 3e 6c 6f 63 61  set(&pFile->loca
fb50: 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 46 69  l, 0, sizeof(pFi
fb60: 6c 65 2d 3e 6c 6f 63 61 6c 29 29 3b 0a 0a 20 20  le->local));..  
fb70: 2f 2a 20 52 65 70 6c 61 63 65 20 74 68 65 20 62  /* Replace the b
fb80: 61 63 6b 73 6c 61 73 68 65 73 20 66 72 6f 6d 20  ackslashes from 
fb90: 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 61 6e 64  the filename and
fba0: 20 6c 6f 77 65 72 63 61 73 65 20 69 74 0a 20 20   lowercase it.  
fbb0: 2a 2a 20 74 6f 20 64 65 72 69 76 65 20 61 20 6d  ** to derive a m
fbc0: 75 74 65 78 20 6e 61 6d 65 2e 20 2a 2f 0a 20 20  utex name. */.  
fbd0: 7a 54 6f 6b 20 3d 20 6f 73 43 68 61 72 4c 6f 77  zTok = osCharLow
fbe0: 65 72 57 28 7a 4e 61 6d 65 29 3b 0a 20 20 66 6f  erW(zName);.  fo
fbf0: 72 20 28 3b 2a 7a 54 6f 6b 3b 7a 54 6f 6b 2b 2b  r (;*zTok;zTok++
fc00: 29 7b 0a 20 20 20 20 69 66 20 28 2a 7a 54 6f 6b  ){.    if (*zTok
fc10: 20 3d 3d 20 27 5c 5c 27 29 20 2a 7a 54 6f 6b 20   == '\\') *zTok 
fc20: 3d 20 27 5f 27 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  = '_';.  }..  /*
fc30: 20 43 72 65 61 74 65 2f 6f 70 65 6e 20 74 68 65   Create/open the
fc40: 20 6e 61 6d 65 64 20 6d 75 74 65 78 20 2a 2f 0a   named mutex */.
fc50: 20 20 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 20    pFile->hMutex 
fc60: 3d 20 6f 73 43 72 65 61 74 65 4d 75 74 65 78 57  = osCreateMutexW
fc70: 28 4e 55 4c 4c 2c 20 46 41 4c 53 45 2c 20 7a 4e  (NULL, FALSE, zN
fc80: 61 6d 65 29 3b 0a 20 20 69 66 20 28 21 70 46 69  ame);.  if (!pFi
fc90: 6c 65 2d 3e 68 4d 75 74 65 78 29 7b 0a 20 20 20  le->hMutex){.   
fca0: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
fcb0: 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
fcc0: 6f 72 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  or();.    sqlite
fcd0: 33 5f 66 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20  3_free(zName);. 
fce0: 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67     return winLog
fcf0: 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
fd00: 52 52 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  RR, pFile->lastE
fd10: 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
fd20: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
fd30: 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b 31 22 2c  nceCreateLock1",
fd40: 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d   zFilename);.  }
fd50: 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20 74  ..  /* Acquire t
fd60: 68 65 20 6d 75 74 65 78 20 62 65 66 6f 72 65 20  he mutex before 
fd70: 63 6f 6e 74 69 6e 75 69 6e 67 20 2a 2f 0a 20 20  continuing */.  
fd80: 77 69 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72  winceMutexAcquir
fd90: 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29  e(pFile->hMutex)
fda0: 3b 0a 0a 20 20 2f 2a 20 53 69 6e 63 65 20 74 68  ;..  /* Since th
fdb0: 65 20 6e 61 6d 65 73 20 6f 66 20 6e 61 6d 65 64  e names of named
fdc0: 20 6d 75 74 65 78 65 73 2c 20 73 65 6d 61 70 68   mutexes, semaph
fdd0: 6f 72 65 73 2c 20 66 69 6c 65 20 6d 61 70 70 69  ores, file mappi
fde0: 6e 67 73 20 65 74 63 20 61 72 65 0a 20 20 2a 2a  ngs etc are.  **
fdf0: 20 63 61 73 65 2d 73 65 6e 73 69 74 69 76 65 2c   case-sensitive,
fe00: 20 74 61 6b 65 20 61 64 76 61 6e 74 61 67 65 20   take advantage 
fe10: 6f 66 20 74 68 61 74 20 62 79 20 75 70 70 65 72  of that by upper
fe20: 63 61 73 69 6e 67 20 74 68 65 20 6d 75 74 65 78  casing the mutex
fe30: 20 6e 61 6d 65 0a 20 20 2a 2a 20 61 6e 64 20 75   name.  ** and u
fe40: 73 69 6e 67 20 74 68 61 74 20 61 73 20 74 68 65  sing that as the
fe50: 20 73 68 61 72 65 64 20 66 69 6c 65 6d 61 70 70   shared filemapp
fe60: 69 6e 67 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20  ing name..  */. 
fe70: 20 6f 73 43 68 61 72 55 70 70 65 72 57 28 7a 4e   osCharUpperW(zN
fe80: 61 6d 65 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 68  ame);.  pFile->h
fe90: 53 68 61 72 65 64 20 3d 20 6f 73 43 72 65 61 74  Shared = osCreat
fea0: 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 28 49 4e  eFileMappingW(IN
feb0: 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c  VALID_HANDLE_VAL
fec0: 55 45 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20  UE, NULL,.      
fed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fef0: 20 20 50 41 47 45 5f 52 45 41 44 57 52 49 54 45    PAGE_READWRITE
ff00: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 69 6e 63  , 0, sizeof(winc
ff10: 65 4c 6f 63 6b 29 2c 0a 20 20 20 20 20 20 20 20  eLock),.        
ff20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff40: 7a 4e 61 6d 65 29 3b 0a 0a 20 20 2f 2a 20 53 65  zName);..  /* Se
ff50: 74 20 61 20 66 6c 61 67 20 74 68 61 74 20 69 6e  t a flag that in
ff60: 64 69 63 61 74 65 73 20 77 65 27 72 65 20 74 68  dicates we're th
ff70: 65 20 66 69 72 73 74 20 74 6f 20 63 72 65 61 74  e first to creat
ff80: 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 73 6f 20  e the memory so 
ff90: 69 74 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65 20  it.  ** must be 
ffa0: 7a 65 72 6f 2d 69 6e 69 74 69 61 6c 69 7a 65 64  zero-initialized
ffb0: 20 2a 2f 0a 20 20 6c 61 73 74 45 72 72 6e 6f 20   */.  lastErrno 
ffc0: 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
ffd0: 28 29 3b 0a 20 20 69 66 20 28 6c 61 73 74 45 72  ();.  if (lastEr
ffe0: 72 6e 6f 20 3d 3d 20 45 52 52 4f 52 5f 41 4c 52  rno == ERROR_ALR
fff0: 45 41 44 59 5f 45 58 49 53 54 53 29 7b 0a 20 20  EADY_EXISTS){.  
10000 20 20 62 49 6e 69 74 20 3d 20 46 41 4c 53 45 3b    bInit = FALSE;
10010 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f  .  }..  sqlite3_
10020 66 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 0a 20 20  free(zName);..  
10030 2f 2a 20 49 66 20 77 65 20 73 75 63 63 65 65 64  /* If we succeed
10040 65 64 20 69 6e 20 6d 61 6b 69 6e 67 20 74 68 65  ed in making the
10050 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 68   shared memory h
10060 61 6e 64 6c 65 2c 20 6d 61 70 20 69 74 2e 20 2a  andle, map it. *
10070 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 68  /.  if( pFile->h
10080 53 68 61 72 65 64 20 29 7b 0a 20 20 20 20 70 46  Shared ){.    pF
10090 69 6c 65 2d 3e 73 68 61 72 65 64 20 3d 20 28 77  ile->shared = (w
100a0 69 6e 63 65 4c 6f 63 6b 2a 29 6f 73 4d 61 70 56  inceLock*)osMapV
100b0 69 65 77 4f 66 46 69 6c 65 28 70 46 69 6c 65 2d  iewOfFile(pFile-
100c0 3e 68 53 68 61 72 65 64 2c 0a 20 20 20 20 20 20  >hShared,.      
100d0 20 20 20 20 20 20 20 46 49 4c 45 5f 4d 41 50 5f         FILE_MAP_
100e0 52 45 41 44 7c 46 49 4c 45 5f 4d 41 50 5f 57 52  READ|FILE_MAP_WR
100f0 49 54 45 2c 20 30 2c 20 30 2c 20 73 69 7a 65 6f  ITE, 0, 0, sizeo
10100 66 28 77 69 6e 63 65 4c 6f 63 6b 29 29 3b 0a 20  f(winceLock));. 
10110 20 20 20 2f 2a 20 49 66 20 6d 61 70 70 69 6e 67     /* If mapping
10120 20 66 61 69 6c 65 64 2c 20 63 6c 6f 73 65 20 74   failed, close t
10130 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  he shared memory
10140 20 68 61 6e 64 6c 65 20 61 6e 64 20 65 72 61 73   handle and eras
10150 65 20 69 74 20 2a 2f 0a 20 20 20 20 69 66 28 20  e it */.    if( 
10160 21 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 20 29  !pFile->shared )
10170 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
10180 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
10190 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
101a0 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53     winLogError(S
101b0 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 70 46 69  QLITE_IOERR, pFi
101c0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20  le->lastErrno,. 
101d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
101e0 20 22 77 69 6e 63 65 43 72 65 61 74 65 4c 6f 63   "winceCreateLoc
101f0 6b 32 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b  k2", zFilename);
10200 0a 20 20 20 20 20 20 62 4c 6f 67 67 65 64 20 3d  .      bLogged =
10210 20 54 52 55 45 3b 0a 20 20 20 20 20 20 6f 73 43   TRUE;.      osC
10220 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65  loseHandle(pFile
10230 2d 3e 68 53 68 61 72 65 64 29 3b 0a 20 20 20 20  ->hShared);.    
10240 20 20 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64    pFile->hShared
10250 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20   = NULL;.    }. 
10260 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 73 68 61 72   }..  /* If shar
10270 65 64 20 6d 65 6d 6f 72 79 20 63 6f 75 6c 64 20  ed memory could 
10280 6e 6f 74 20 62 65 20 63 72 65 61 74 65 64 2c 20  not be created, 
10290 74 68 65 6e 20 63 6c 6f 73 65 20 74 68 65 20 6d  then close the m
102a0 75 74 65 78 20 61 6e 64 20 66 61 69 6c 20 2a 2f  utex and fail */
102b0 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 68 53  .  if( pFile->hS
102c0 68 61 72 65 64 3d 3d 4e 55 4c 4c 20 29 7b 0a 20  hared==NULL ){. 
102d0 20 20 20 69 66 28 20 21 62 4c 6f 67 67 65 64 20     if( !bLogged 
102e0 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
102f0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74  lastErrno = last
10300 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 77 69 6e  Errno;.      win
10310 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
10320 49 4f 45 52 52 2c 20 70 46 69 6c 65 2d 3e 6c 61  IOERR, pFile->la
10330 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
10340 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 63             "winc
10350 65 43 72 65 61 74 65 4c 6f 63 6b 33 22 2c 20 7a  eCreateLock3", z
10360 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Filename);.     
10370 20 62 4c 6f 67 67 65 64 20 3d 20 54 52 55 45 3b   bLogged = TRUE;
10380 0a 20 20 20 20 7d 0a 20 20 20 20 77 69 6e 63 65  .    }.    wince
10390 4d 75 74 65 78 52 65 6c 65 61 73 65 28 70 46 69  MutexRelease(pFi
103a0 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 20  le->hMutex);.   
103b0 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70   osCloseHandle(p
103c0 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20  File->hMutex);. 
103d0 20 20 20 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78     pFile->hMutex
103e0 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 72 65 74   = NULL;.    ret
103f0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
10400 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74  ;.  }..  /* Init
10410 69 61 6c 69 7a 65 20 74 68 65 20 73 68 61 72 65  ialize the share
10420 64 20 6d 65 6d 6f 72 79 20 69 66 20 77 65 27 72  d memory if we'r
10430 65 20 73 75 70 70 6f 73 65 64 20 74 6f 20 2a 2f  e supposed to */
10440 0a 20 20 69 66 28 20 62 49 6e 69 74 20 29 7b 0a  .  if( bInit ){.
10450 20 20 20 20 6d 65 6d 73 65 74 28 70 46 69 6c 65      memset(pFile
10460 2d 3e 73 68 61 72 65 64 2c 20 30 2c 20 73 69 7a  ->shared, 0, siz
10470 65 6f 66 28 77 69 6e 63 65 4c 6f 63 6b 29 29 3b  eof(winceLock));
10480 0a 20 20 7d 0a 0a 20 20 77 69 6e 63 65 4d 75 74  .  }..  winceMut
10490 65 78 52 65 6c 65 61 73 65 28 70 46 69 6c 65 2d  exRelease(pFile-
104a0 3e 68 4d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  >hMutex);.  retu
104b0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
104c0 0a 2f 2a 0a 2a 2a 20 44 65 73 74 72 6f 79 20 74  ./*.** Destroy t
104d0 68 65 20 70 61 72 74 20 6f 66 20 77 69 6e 46 69  he part of winFi
104e0 6c 65 20 74 68 61 74 20 64 65 61 6c 73 20 77 69  le that deals wi
104f0 74 68 20 77 69 6e 63 65 20 6c 6f 63 6b 73 0a 2a  th wince locks.*
10500 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69  /.static void wi
10510 6e 63 65 44 65 73 74 72 6f 79 4c 6f 63 6b 28 77  nceDestroyLock(w
10520 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a  inFile *pFile){.
10530 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 68 4d 75    if (pFile->hMu
10540 74 65 78 29 7b 0a 20 20 20 20 2f 2a 20 41 63 71  tex){.    /* Acq
10550 75 69 72 65 20 74 68 65 20 6d 75 74 65 78 20 2a  uire the mutex *
10560 2f 0a 20 20 20 20 77 69 6e 63 65 4d 75 74 65 78  /.    winceMutex
10570 41 63 71 75 69 72 65 28 70 46 69 6c 65 2d 3e 68  Acquire(pFile->h
10580 4d 75 74 65 78 29 3b 0a 0a 20 20 20 20 2f 2a 20  Mutex);..    /* 
10590 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c  The following bl
105a0 6f 63 6b 73 20 73 68 6f 75 6c 64 20 70 72 6f 62  ocks should prob
105b0 61 62 6c 79 20 61 73 73 65 72 74 20 69 6e 20 64  ably assert in d
105c0 65 62 75 67 20 6d 6f 64 65 2c 20 62 75 74 20 74  ebug mode, but t
105d0 68 65 79 0a 20 20 20 20 20 20 20 61 72 65 20 74  hey.       are t
105e0 6f 20 63 6c 65 61 6e 75 70 20 69 6e 20 63 61 73  o cleanup in cas
105f0 65 20 61 6e 79 20 6c 6f 63 6b 73 20 72 65 6d 61  e any locks rema
10600 69 6e 65 64 20 6f 70 65 6e 20 2a 2f 0a 20 20 20  ined open */.   
10610 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61   if (pFile->loca
10620 6c 2e 6e 52 65 61 64 65 72 73 29 7b 0a 20 20 20  l.nReaders){.   
10630 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64     pFile->shared
10640 2d 3e 6e 52 65 61 64 65 72 73 20 2d 2d 3b 0a 20  ->nReaders --;. 
10650 20 20 20 7d 0a 20 20 20 20 69 66 20 28 70 46 69     }.    if (pFi
10660 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72  le->local.bReser
10670 76 65 64 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  ved){.      pFil
10680 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52 65 73 65  e->shared->bRese
10690 72 76 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20  rved = FALSE;.  
106a0 20 20 7d 0a 20 20 20 20 69 66 20 28 70 46 69 6c    }.    if (pFil
106b0 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e  e->local.bPendin
106c0 67 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  g){.      pFile-
106d0 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e  >shared->bPendin
106e0 67 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d  g = FALSE;.    }
106f0 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  .    if (pFile->
10700 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69 76 65  local.bExclusive
10710 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
10720 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75 73 69  shared->bExclusi
10730 76 65 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20  ve = FALSE;.    
10740 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 2d 72 65 66  }..    /* De-ref
10750 65 72 65 6e 63 65 20 61 6e 64 20 63 6c 6f 73 65  erence and close
10760 20 6f 75 72 20 63 6f 70 79 20 6f 66 20 74 68 65   our copy of the
10770 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 68   shared memory h
10780 61 6e 64 6c 65 20 2a 2f 0a 20 20 20 20 6f 73 55  andle */.    osU
10790 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 28 70  nmapViewOfFile(p
107a0 46 69 6c 65 2d 3e 73 68 61 72 65 64 29 3b 0a 20  File->shared);. 
107b0 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65     osCloseHandle
107c0 28 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 29  (pFile->hShared)
107d0 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 6e 65 20 77  ;..    /* Done w
107e0 69 74 68 20 74 68 65 20 6d 75 74 65 78 20 2a 2f  ith the mutex */
107f0 0a 20 20 20 20 77 69 6e 63 65 4d 75 74 65 78 52  .    winceMutexR
10800 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d  elease(pFile->hM
10810 75 74 65 78 29 3b 0a 20 20 20 20 6f 73 43 6c 6f  utex);.    osClo
10820 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e  seHandle(pFile->
10830 68 4d 75 74 65 78 29 3b 0a 20 20 20 20 70 46 69  hMutex);.    pFi
10840 6c 65 2d 3e 68 4d 75 74 65 78 20 3d 20 4e 55 4c  le->hMutex = NUL
10850 4c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  L;.  }.}../*.** 
10860 41 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  An implementatio
10870 6e 20 6f 66 20 74 68 65 20 4c 6f 63 6b 46 69 6c  n of the LockFil
10880 65 28 29 20 41 50 49 20 6f 66 20 57 69 6e 64 6f  e() API of Windo
10890 77 73 20 66 6f 72 20 43 45 0a 2a 2f 0a 73 74 61  ws for CE.*/.sta
108a0 74 69 63 20 42 4f 4f 4c 20 77 69 6e 63 65 4c 6f  tic BOOL winceLo
108b0 63 6b 46 69 6c 65 28 0a 20 20 4c 50 48 41 4e 44  ckFile(.  LPHAND
108c0 4c 45 20 70 68 46 69 6c 65 2c 0a 20 20 44 57 4f  LE phFile,.  DWO
108d0 52 44 20 64 77 46 69 6c 65 4f 66 66 73 65 74 4c  RD dwFileOffsetL
108e0 6f 77 2c 0a 20 20 44 57 4f 52 44 20 64 77 46 69  ow,.  DWORD dwFi
108f0 6c 65 4f 66 66 73 65 74 48 69 67 68 2c 0a 20 20  leOffsetHigh,.  
10900 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42  DWORD nNumberOfB
10910 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 2c 0a 20  ytesToLockLow,. 
10920 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66   DWORD nNumberOf
10930 42 79 74 65 73 54 6f 4c 6f 63 6b 48 69 67 68 0a  BytesToLockHigh.
10940 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46  ){.  winFile *pF
10950 69 6c 65 20 3d 20 48 41 4e 44 4c 45 5f 54 4f 5f  ile = HANDLE_TO_
10960 57 49 4e 46 49 4c 45 28 70 68 46 69 6c 65 29 3b  WINFILE(phFile);
10970 0a 20 20 42 4f 4f 4c 20 62 52 65 74 75 72 6e 20  .  BOOL bReturn 
10980 3d 20 46 41 4c 53 45 3b 0a 0a 20 20 55 4e 55 53  = FALSE;..  UNUS
10990 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 77 46  ED_PARAMETER(dwF
109a0 69 6c 65 4f 66 66 73 65 74 48 69 67 68 29 3b 0a  ileOffsetHigh);.
109b0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
109c0 45 52 28 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65  ER(nNumberOfByte
109d0 73 54 6f 4c 6f 63 6b 48 69 67 68 29 3b 0a 0a 20  sToLockHigh);.. 
109e0 20 69 66 20 28 21 70 46 69 6c 65 2d 3e 68 4d 75   if (!pFile->hMu
109f0 74 65 78 29 20 72 65 74 75 72 6e 20 54 52 55 45  tex) return TRUE
10a00 3b 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 41 63  ;.  winceMutexAc
10a10 71 75 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75  quire(pFile->hMu
10a20 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 57 61 6e 74  tex);..  /* Want
10a30 69 6e 67 20 61 6e 20 65 78 63 6c 75 73 69 76 65  ing an exclusive
10a40 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 69 66 20 28   lock? */.  if (
10a50 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20  dwFileOffsetLow 
10a60 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45 44  == (DWORD)SHARED
10a70 5f 46 49 52 53 54 0a 20 20 20 20 20 20 20 26 26  _FIRST.       &&
10a80 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54   nNumberOfBytesT
10a90 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 28 44 57 4f  oLockLow == (DWO
10aa0 52 44 29 53 48 41 52 45 44 5f 53 49 5a 45 29 7b  RD)SHARED_SIZE){
10ab0 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  .    if (pFile->
10ac0 73 68 61 72 65 64 2d 3e 6e 52 65 61 64 65 72 73  shared->nReaders
10ad0 20 3d 3d 20 30 20 26 26 20 70 46 69 6c 65 2d 3e   == 0 && pFile->
10ae0 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75 73 69  shared->bExclusi
10af0 76 65 20 3d 3d 20 30 29 7b 0a 20 20 20 20 20 20  ve == 0){.      
10b00 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e   pFile->shared->
10b10 62 45 78 63 6c 75 73 69 76 65 20 3d 20 54 52 55  bExclusive = TRU
10b20 45 3b 0a 20 20 20 20 20 20 20 70 46 69 6c 65 2d  E;.       pFile-
10b30 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69 76  >local.bExclusiv
10b40 65 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20  e = TRUE;.      
10b50 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b   bReturn = TRUE;
10b60 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
10b70 20 57 61 6e 74 20 61 20 72 65 61 64 2d 6f 6e 6c   Want a read-onl
10b80 79 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 65 6c 73  y lock? */.  els
10b90 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73  e if (dwFileOffs
10ba0 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29  etLow == (DWORD)
10bb0 53 48 41 52 45 44 5f 46 49 52 53 54 20 26 26 0a  SHARED_FIRST &&.
10bc0 20 20 20 20 20 20 20 20 20 20 20 6e 4e 75 6d 62             nNumb
10bd0 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c  erOfBytesToLockL
10be0 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20 69 66  ow == 1){.    if
10bf0 20 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d   (pFile->shared-
10c00 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 3d 20 30  >bExclusive == 0
10c10 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
10c20 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 20 2b  local.nReaders +
10c30 2b 3b 0a 20 20 20 20 20 20 69 66 20 28 70 46 69  +;.      if (pFi
10c40 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65  le->local.nReade
10c50 72 73 20 3d 3d 20 31 29 7b 0a 20 20 20 20 20 20  rs == 1){.      
10c60 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d    pFile->shared-
10c70 3e 6e 52 65 61 64 65 72 73 20 2b 2b 3b 0a 20 20  >nReaders ++;.  
10c80 20 20 20 20 7d 0a 20 20 20 20 20 20 62 52 65 74      }.      bRet
10c90 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20  urn = TRUE;.    
10ca0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 61 6e 74  }.  }..  /* Want
10cb0 20 61 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 3f   a pending lock?
10cc0 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20 28 64   */.  else if (d
10cd0 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d  wFileOffsetLow =
10ce0 3d 20 28 44 57 4f 52 44 29 50 45 4e 44 49 4e 47  = (DWORD)PENDING
10cf0 5f 42 59 54 45 0a 20 20 20 20 20 20 20 20 20 20  _BYTE.          
10d00 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74   && nNumberOfByt
10d10 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 31  esToLockLow == 1
10d20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f 20  ){.    /* If no 
10d30 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 20 68 61 73  pending lock has
10d40 20 62 65 65 6e 20 61 63 71 75 69 72 65 64 2c 20   been acquired, 
10d50 74 68 65 6e 20 61 63 71 75 69 72 65 20 69 74 20  then acquire it 
10d60 2a 2f 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65  */.    if (pFile
10d70 2d 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e 64 69  ->shared->bPendi
10d80 6e 67 20 3d 3d 20 30 29 20 7b 0a 20 20 20 20 20  ng == 0) {.     
10d90 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e   pFile->shared->
10da0 62 50 65 6e 64 69 6e 67 20 3d 20 54 52 55 45 3b  bPending = TRUE;
10db0 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f  .      pFile->lo
10dc0 63 61 6c 2e 62 50 65 6e 64 69 6e 67 20 3d 20 54  cal.bPending = T
10dd0 52 55 45 3b 0a 20 20 20 20 20 20 62 52 65 74 75  RUE;.      bRetu
10de0 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d  rn = TRUE;.    }
10df0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 61 6e 74 20  .  }..  /* Want 
10e00 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 3f  a reserved lock?
10e10 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20 28 64   */.  else if (d
10e20 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d  wFileOffsetLow =
10e30 3d 20 28 44 57 4f 52 44 29 52 45 53 45 52 56 45  = (DWORD)RESERVE
10e40 44 5f 42 59 54 45 0a 20 20 20 20 20 20 20 20 20  D_BYTE.         
10e50 20 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79    && nNumberOfBy
10e60 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20  tesToLockLow == 
10e70 31 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c  1){.    if (pFil
10e80 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52 65 73 65  e->shared->bRese
10e90 72 76 65 64 20 3d 3d 20 30 29 20 7b 0a 20 20 20  rved == 0) {.   
10ea0 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64     pFile->shared
10eb0 2d 3e 62 52 65 73 65 72 76 65 64 20 3d 20 54 52  ->bReserved = TR
10ec0 55 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  UE;.      pFile-
10ed0 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76 65 64  >local.bReserved
10ee0 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20 62   = TRUE;.      b
10ef0 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20  Return = TRUE;. 
10f00 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 77 69 6e 63     }.  }..  winc
10f10 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28 70 46  eMutexRelease(pF
10f20 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20  ile->hMutex);.  
10f30 72 65 74 75 72 6e 20 62 52 65 74 75 72 6e 3b 0a  return bReturn;.
10f40 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6d 70 6c  }../*.** An impl
10f50 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
10f60 65 20 55 6e 6c 6f 63 6b 46 69 6c 65 20 41 50 49  e UnlockFile API
10f70 20 6f 66 20 57 69 6e 64 6f 77 73 20 66 6f 72 20   of Windows for 
10f80 43 45 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f  CE.*/.static BOO
10f90 4c 20 77 69 6e 63 65 55 6e 6c 6f 63 6b 46 69 6c  L winceUnlockFil
10fa0 65 28 0a 20 20 4c 50 48 41 4e 44 4c 45 20 70 68  e(.  LPHANDLE ph
10fb0 46 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20 64 77  File,.  DWORD dw
10fc0 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 2c 0a 20  FileOffsetLow,. 
10fd0 20 44 57 4f 52 44 20 64 77 46 69 6c 65 4f 66 66   DWORD dwFileOff
10fe0 73 65 74 48 69 67 68 2c 0a 20 20 44 57 4f 52 44  setHigh,.  DWORD
10ff0 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54   nNumberOfBytesT
11000 6f 55 6e 6c 6f 63 6b 4c 6f 77 2c 0a 20 20 44 57  oUnlockLow,.  DW
11010 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74  ORD nNumberOfByt
11020 65 73 54 6f 55 6e 6c 6f 63 6b 48 69 67 68 0a 29  esToUnlockHigh.)
11030 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69  {.  winFile *pFi
11040 6c 65 20 3d 20 48 41 4e 44 4c 45 5f 54 4f 5f 57  le = HANDLE_TO_W
11050 49 4e 46 49 4c 45 28 70 68 46 69 6c 65 29 3b 0a  INFILE(phFile);.
11060 20 20 42 4f 4f 4c 20 62 52 65 74 75 72 6e 20 3d    BOOL bReturn =
11070 20 46 41 4c 53 45 3b 0a 0a 20 20 55 4e 55 53 45   FALSE;..  UNUSE
11080 44 5f 50 41 52 41 4d 45 54 45 52 28 64 77 46 69  D_PARAMETER(dwFi
11090 6c 65 4f 66 66 73 65 74 48 69 67 68 29 3b 0a 20  leOffsetHigh);. 
110a0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
110b0 52 28 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  R(nNumberOfBytes
110c0 54 6f 55 6e 6c 6f 63 6b 48 69 67 68 29 3b 0a 0a  ToUnlockHigh);..
110d0 20 20 69 66 20 28 21 70 46 69 6c 65 2d 3e 68 4d    if (!pFile->hM
110e0 75 74 65 78 29 20 72 65 74 75 72 6e 20 54 52 55  utex) return TRU
110f0 45 3b 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 41  E;.  winceMutexA
11100 63 71 75 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d  cquire(pFile->hM
11110 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 52 65 6c  utex);..  /* Rel
11120 65 61 73 69 6e 67 20 61 20 72 65 61 64 65 72 20  easing a reader 
11130 6c 6f 63 6b 20 6f 72 20 61 6e 20 65 78 63 6c 75  lock or an exclu
11140 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69  sive lock */.  i
11150 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c  f (dwFileOffsetL
11160 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41  ow == (DWORD)SHA
11170 52 45 44 5f 46 49 52 53 54 29 7b 0a 20 20 20 20  RED_FIRST){.    
11180 2f 2a 20 44 69 64 20 77 65 20 68 61 76 65 20 61  /* Did we have a
11190 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
111a0 3f 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 46 69  ? */.    if (pFi
111b0 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75  le->local.bExclu
111c0 73 69 76 65 29 7b 0a 20 20 20 20 20 20 61 73 73  sive){.      ass
111d0 65 72 74 28 6e 4e 75 6d 62 65 72 4f 66 42 79 74  ert(nNumberOfByt
111e0 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d  esToUnlockLow ==
111f0 20 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f 53   (DWORD)SHARED_S
11200 49 5a 45 29 3b 0a 20 20 20 20 20 20 70 46 69 6c  IZE);.      pFil
11210 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73  e->local.bExclus
11220 69 76 65 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20  ive = FALSE;.   
11230 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64     pFile->shared
11240 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 20 46  ->bExclusive = F
11250 41 4c 53 45 3b 0a 20 20 20 20 20 20 62 52 65 74  ALSE;.      bRet
11260 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20  urn = TRUE;.    
11270 7d 0a 0a 20 20 20 20 2f 2a 20 44 69 64 20 77 65  }..    /* Did we
11280 20 6a 75 73 74 20 68 61 76 65 20 61 20 72 65 61   just have a rea
11290 64 65 72 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 20  der lock? */.   
112a0 20 65 6c 73 65 20 69 66 20 28 70 46 69 6c 65 2d   else if (pFile-
112b0 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 29  >local.nReaders)
112c0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 6e  {.      assert(n
112d0 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55  NumberOfBytesToU
112e0 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 28 44 57 4f  nlockLow == (DWO
112f0 52 44 29 53 48 41 52 45 44 5f 53 49 5a 45 0a 20  RD)SHARED_SIZE. 
11300 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 6e              || n
11310 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55  NumberOfBytesToU
11320 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 3b 0a  nlockLow == 1);.
11330 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63        pFile->loc
11340 61 6c 2e 6e 52 65 61 64 65 72 73 20 2d 2d 3b 0a  al.nReaders --;.
11350 20 20 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d        if (pFile-
11360 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 20  >local.nReaders 
11370 3d 3d 20 30 29 0a 20 20 20 20 20 20 7b 0a 20 20  == 0).      {.  
11380 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61        pFile->sha
11390 72 65 64 2d 3e 6e 52 65 61 64 65 72 73 20 2d 2d  red->nReaders --
113a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
113b0 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a  bReturn = TRUE;.
113c0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
113d0 52 65 6c 65 61 73 69 6e 67 20 61 20 70 65 6e 64  Releasing a pend
113e0 69 6e 67 20 6c 6f 63 6b 20 2a 2f 0a 20 20 65 6c  ing lock */.  el
113f0 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66  se if (dwFileOff
11400 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44  setLow == (DWORD
11410 29 50 45 4e 44 49 4e 47 5f 42 59 54 45 0a 20 20  )PENDING_BYTE.  
11420 20 20 20 20 20 20 20 20 20 26 26 20 6e 4e 75 6d           && nNum
11430 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f  berOfBytesToUnlo
11440 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20  ckLow == 1){.   
11450 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61   if (pFile->loca
11460 6c 2e 62 50 65 6e 64 69 6e 67 29 7b 0a 20 20 20  l.bPending){.   
11470 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e     pFile->local.
11480 62 50 65 6e 64 69 6e 67 20 3d 20 46 41 4c 53 45  bPending = FALSE
11490 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73  ;.      pFile->s
114a0 68 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e 67 20  hared->bPending 
114b0 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 62  = FALSE;.      b
114c0 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20  Return = TRUE;. 
114d0 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 52 65     }.  }.  /* Re
114e0 6c 65 61 73 69 6e 67 20 61 20 72 65 73 65 72 76  leasing a reserv
114f0 65 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 65 6c 73  ed lock */.  els
11500 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73  e if (dwFileOffs
11510 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29  etLow == (DWORD)
11520 52 45 53 45 52 56 45 44 5f 42 59 54 45 0a 20 20  RESERVED_BYTE.  
11530 20 20 20 20 20 20 20 20 20 26 26 20 6e 4e 75 6d           && nNum
11540 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f  berOfBytesToUnlo
11550 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20  ckLow == 1){.   
11560 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61   if (pFile->loca
11570 6c 2e 62 52 65 73 65 72 76 65 64 29 20 7b 0a 20  l.bReserved) {. 
11580 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61       pFile->loca
11590 6c 2e 62 52 65 73 65 72 76 65 64 20 3d 20 46 41  l.bReserved = FA
115a0 4c 53 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65  LSE;.      pFile
115b0 2d 3e 73 68 61 72 65 64 2d 3e 62 52 65 73 65 72  ->shared->bReser
115c0 76 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20  ved = FALSE;.   
115d0 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55     bReturn = TRU
115e0 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  E;.    }.  }..  
115f0 77 69 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73  winceMutexReleas
11600 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29  e(pFile->hMutex)
11610 3b 0a 20 20 72 65 74 75 72 6e 20 62 52 65 74 75  ;.  return bRetu
11620 72 6e 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 45 6e 64 20  rn;.}./*.** End 
11630 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c 20 63  of the special c
11640 6f 64 65 20 66 6f 72 20 77 69 6e 63 65 0a 2a 2a  ode for wince.**
11650 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11660 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11670 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11680 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11690 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 65 6e  ***********/.#en
116a0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 53  dif /* SQLITE_OS
116b0 5f 57 49 4e 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _WINCE */../*.**
116c0 20 4c 6f 63 6b 20 61 20 66 69 6c 65 20 72 65 67   Lock a file reg
116d0 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42  ion..*/.static B
116e0 4f 4f 4c 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28  OOL winLockFile(
116f0 0a 20 20 4c 50 48 41 4e 44 4c 45 20 70 68 46 69  .  LPHANDLE phFi
11700 6c 65 2c 0a 20 20 44 57 4f 52 44 20 66 6c 61 67  le,.  DWORD flag
11710 73 2c 0a 20 20 44 57 4f 52 44 20 6f 66 66 73 65  s,.  DWORD offse
11720 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6f 66  tLow,.  DWORD of
11730 66 73 65 74 48 69 67 68 2c 0a 20 20 44 57 4f 52  fsetHigh,.  DWOR
11740 44 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 0a 20  D numBytesLow,. 
11750 20 44 57 4f 52 44 20 6e 75 6d 42 79 74 65 73 48   DWORD numBytesH
11760 69 67 68 0a 29 7b 0a 23 69 66 20 53 51 4c 49 54  igh.){.#if SQLIT
11770 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 2f 2a 0a  E_OS_WINCE.  /*.
11780 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 69 6e 64 6f    ** NOTE: Windo
11790 77 73 20 43 45 20 69 73 20 68 61 6e 64 6c 65 64  ws CE is handled
117a0 20 64 69 66 66 65 72 65 6e 74 6c 79 20 68 65 72   differently her
117b0 65 20 64 75 65 20 69 74 73 20 6c 61 63 6b 20 6f  e due its lack o
117c0 66 20 74 68 65 20 57 69 6e 33 32 0a 20 20 2a 2a  f the Win32.  **
117d0 20 20 20 20 20 20 20 41 50 49 20 4c 6f 63 6b 46         API LockF
117e0 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75  ile..  */.  retu
117f0 72 6e 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65  rn winceLockFile
11800 28 70 68 46 69 6c 65 2c 20 6f 66 66 73 65 74 4c  (phFile, offsetL
11810 6f 77 2c 20 6f 66 66 73 65 74 48 69 67 68 2c 0a  ow, offsetHigh,.
11820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11830 20 20 20 20 20 20 20 6e 75 6d 42 79 74 65 73 4c         numBytesL
11840 6f 77 2c 20 6e 75 6d 42 79 74 65 73 48 69 67 68  ow, numBytesHigh
11850 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 6f  );.#else.  if( o
11860 73 49 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 4f  sIsNT() ){.    O
11870 56 45 52 4c 41 50 50 45 44 20 6f 76 6c 70 3b 0a  VERLAPPED ovlp;.
11880 20 20 20 20 6d 65 6d 73 65 74 28 26 6f 76 6c 70      memset(&ovlp
11890 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4f 56 45 52  , 0, sizeof(OVER
118a0 4c 41 50 50 45 44 29 29 3b 0a 20 20 20 20 6f 76  LAPPED));.    ov
118b0 6c 70 2e 4f 66 66 73 65 74 20 3d 20 6f 66 66 73  lp.Offset = offs
118c0 65 74 4c 6f 77 3b 0a 20 20 20 20 6f 76 6c 70 2e  etLow;.    ovlp.
118d0 4f 66 66 73 65 74 48 69 67 68 20 3d 20 6f 66 66  OffsetHigh = off
118e0 73 65 74 48 69 67 68 3b 0a 20 20 20 20 72 65 74  setHigh;.    ret
118f0 75 72 6e 20 6f 73 4c 6f 63 6b 46 69 6c 65 45 78  urn osLockFileEx
11900 28 2a 70 68 46 69 6c 65 2c 20 66 6c 61 67 73 2c  (*phFile, flags,
11910 20 30 2c 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c   0, numBytesLow,
11920 20 6e 75 6d 42 79 74 65 73 48 69 67 68 2c 20 26   numBytesHigh, &
11930 6f 76 6c 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ovlp);.  }else{.
11940 20 20 20 20 72 65 74 75 72 6e 20 6f 73 4c 6f 63      return osLoc
11950 6b 46 69 6c 65 28 2a 70 68 46 69 6c 65 2c 20 6f  kFile(*phFile, o
11960 66 66 73 65 74 4c 6f 77 2c 20 6f 66 66 73 65 74  ffsetLow, offset
11970 48 69 67 68 2c 20 6e 75 6d 42 79 74 65 73 4c 6f  High, numBytesLo
11980 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  w,.             
11990 20 20 20 20 20 20 20 20 20 6e 75 6d 42 79 74 65           numByte
119a0 73 48 69 67 68 29 3b 0a 20 20 7d 0a 23 65 6e 64  sHigh);.  }.#end
119b0 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f  if.}../*.** Unlo
119c0 63 6b 20 61 20 66 69 6c 65 20 72 65 67 69 6f 6e  ck a file region
119d0 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f  .. */.static BOO
119e0 4c 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28  L winUnlockFile(
119f0 0a 20 20 4c 50 48 41 4e 44 4c 45 20 70 68 46 69  .  LPHANDLE phFi
11a00 6c 65 2c 0a 20 20 44 57 4f 52 44 20 6f 66 66 73  le,.  DWORD offs
11a10 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6f  etLow,.  DWORD o
11a20 66 66 73 65 74 48 69 67 68 2c 0a 20 20 44 57 4f  ffsetHigh,.  DWO
11a30 52 44 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 0a  RD numBytesLow,.
11a40 20 20 44 57 4f 52 44 20 6e 75 6d 42 79 74 65 73    DWORD numBytes
11a50 48 69 67 68 0a 29 7b 0a 23 69 66 20 53 51 4c 49  High.){.#if SQLI
11a60 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 2f 2a  TE_OS_WINCE.  /*
11a70 0a 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 69 6e 64  .  ** NOTE: Wind
11a80 6f 77 73 20 43 45 20 69 73 20 68 61 6e 64 6c 65  ows CE is handle
11a90 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20 68 65  d differently he
11aa0 72 65 20 64 75 65 20 69 74 73 20 6c 61 63 6b 20  re due its lack 
11ab0 6f 66 20 74 68 65 20 57 69 6e 33 32 0a 20 20 2a  of the Win32.  *
11ac0 2a 20 20 20 20 20 20 20 41 50 49 20 55 6e 6c 6f  *       API Unlo
11ad0 63 6b 46 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 72  ckFile..  */.  r
11ae0 65 74 75 72 6e 20 77 69 6e 63 65 55 6e 6c 6f 63  eturn winceUnloc
11af0 6b 46 69 6c 65 28 70 68 46 69 6c 65 2c 20 6f 66  kFile(phFile, of
11b00 66 73 65 74 4c 6f 77 2c 20 6f 66 66 73 65 74 48  fsetLow, offsetH
11b10 69 67 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20  igh,.           
11b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 75                nu
11b30 6d 42 79 74 65 73 4c 6f 77 2c 20 6e 75 6d 42 79  mBytesLow, numBy
11b40 74 65 73 48 69 67 68 29 3b 0a 23 65 6c 73 65 0a  tesHigh);.#else.
11b50 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29    if( osIsNT() )
11b60 7b 0a 20 20 20 20 4f 56 45 52 4c 41 50 50 45 44  {.    OVERLAPPED
11b70 20 6f 76 6c 70 3b 0a 20 20 20 20 6d 65 6d 73 65   ovlp;.    memse
11b80 74 28 26 6f 76 6c 70 2c 20 30 2c 20 73 69 7a 65  t(&ovlp, 0, size
11b90 6f 66 28 4f 56 45 52 4c 41 50 50 45 44 29 29 3b  of(OVERLAPPED));
11ba0 0a 20 20 20 20 6f 76 6c 70 2e 4f 66 66 73 65 74  .    ovlp.Offset
11bb0 20 3d 20 6f 66 66 73 65 74 4c 6f 77 3b 0a 20 20   = offsetLow;.  
11bc0 20 20 6f 76 6c 70 2e 4f 66 66 73 65 74 48 69 67    ovlp.OffsetHig
11bd0 68 20 3d 20 6f 66 66 73 65 74 48 69 67 68 3b 0a  h = offsetHigh;.
11be0 20 20 20 20 72 65 74 75 72 6e 20 6f 73 55 6e 6c      return osUnl
11bf0 6f 63 6b 46 69 6c 65 45 78 28 2a 70 68 46 69 6c  ockFileEx(*phFil
11c00 65 2c 20 30 2c 20 6e 75 6d 42 79 74 65 73 4c 6f  e, 0, numBytesLo
11c10 77 2c 20 6e 75 6d 42 79 74 65 73 48 69 67 68 2c  w, numBytesHigh,
11c20 20 26 6f 76 6c 70 29 3b 0a 20 20 7d 65 6c 73 65   &ovlp);.  }else
11c30 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6f 73 55  {.    return osU
11c40 6e 6c 6f 63 6b 46 69 6c 65 28 2a 70 68 46 69 6c  nlockFile(*phFil
11c50 65 2c 20 6f 66 66 73 65 74 4c 6f 77 2c 20 6f 66  e, offsetLow, of
11c60 66 73 65 74 48 69 67 68 2c 20 6e 75 6d 42 79 74  fsetHigh, numByt
11c70 65 73 4c 6f 77 2c 0a 20 20 20 20 20 20 20 20 20  esLow,.         
11c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
11c90 75 6d 42 79 74 65 73 48 69 67 68 29 3b 0a 20 20  umBytesHigh);.  
11ca0 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 2a 2a  }.#endif.}../***
11cb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
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 0a 2a 2a 20 54 68  **********.** Th
11d00 65 20 6e 65 78 74 20 67 72 6f 75 70 20 6f 66 20  e next group of 
11d10 72 6f 75 74 69 6e 65 73 20 69 6d 70 6c 65 6d 65  routines impleme
11d20 6e 74 20 74 68 65 20 49 2f 4f 20 6d 65 74 68 6f  nt the I/O metho
11d30 64 73 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20  ds specified.** 
11d40 62 79 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  by the sqlite3_i
11d50 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
11d60 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ..**************
11d70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11d80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11d90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11da0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11db0 2f 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 20 4d 69  /../*.** Some Mi
11dc0 63 72 6f 73 6f 66 74 20 63 6f 6d 70 69 6c 65 72  crosoft compiler
11dd0 73 20 6c 61 63 6b 20 74 68 69 73 20 64 65 66 69  s lack this defi
11de0 6e 69 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64  nition..*/.#ifnd
11df0 65 66 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46  ef INVALID_SET_F
11e00 49 4c 45 5f 50 4f 49 4e 54 45 52 0a 23 20 64 65  ILE_POINTER.# de
11e10 66 69 6e 65 20 49 4e 56 41 4c 49 44 5f 53 45 54  fine INVALID_SET
11e20 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 20 28 28  _FILE_POINTER ((
11e30 44 57 4f 52 44 29 2d 31 29 0a 23 65 6e 64 69 66  DWORD)-1).#endif
11e40 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
11e50 20 63 75 72 72 65 6e 74 20 70 6f 73 69 74 69 6f   current positio
11e60 6e 20 6f 66 20 74 68 65 20 66 69 6c 65 20 68 61  n of the file ha
11e70 6e 64 6c 65 20 70 61 73 73 65 64 20 61 73 20 74  ndle passed as t
11e80 68 65 20 66 69 72 73 74 0a 2a 2a 20 61 72 67 75  he first.** argu
11e90 6d 65 6e 74 20 74 6f 20 6f 66 66 73 65 74 20 69  ment to offset i
11ea0 4f 66 66 73 65 74 20 77 69 74 68 69 6e 20 74 68  Offset within th
11eb0 65 20 66 69 6c 65 2e 20 49 66 20 73 75 63 63 65  e file. If succe
11ec0 73 73 66 75 6c 2c 20 72 65 74 75 72 6e 20 30 2e  ssful, return 0.
11ed0 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 73  .** Otherwise, s
11ee0 65 74 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  et pFile->lastEr
11ef0 72 6e 6f 20 61 6e 64 20 72 65 74 75 72 6e 20 6e  rno and return n
11f00 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74  on-zero..*/.stat
11f10 69 63 20 69 6e 74 20 77 69 6e 53 65 65 6b 46 69  ic int winSeekFi
11f20 6c 65 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  le(winFile *pFil
11f30 65 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  e, sqlite3_int64
11f40 20 69 4f 66 66 73 65 74 29 7b 0a 23 69 66 20 21   iOffset){.#if !
11f50 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
11f60 20 20 4c 4f 4e 47 20 75 70 70 65 72 42 69 74 73    LONG upperBits
11f70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11f80 20 20 2f 2a 20 4d 6f 73 74 20 73 69 67 2e 20 33    /* Most sig. 3
11f90 32 20 62 69 74 73 20 6f 66 20 6e 65 77 20 6f 66  2 bits of new of
11fa0 66 73 65 74 20 2a 2f 0a 20 20 4c 4f 4e 47 20 6c  fset */.  LONG l
11fb0 6f 77 65 72 42 69 74 73 3b 20 20 20 20 20 20 20  owerBits;       
11fc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 61            /* Lea
11fd0 73 74 20 73 69 67 2e 20 33 32 20 62 69 74 73 20  st sig. 32 bits 
11fe0 6f 66 20 6e 65 77 20 6f 66 66 73 65 74 20 2a 2f  of new offset */
11ff0 0a 20 20 44 57 4f 52 44 20 64 77 52 65 74 3b 20  .  DWORD dwRet; 
12000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12010 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75     /* Value retu
12020 72 6e 65 64 20 62 79 20 53 65 74 46 69 6c 65 50  rned by SetFileP
12030 6f 69 6e 74 65 72 28 29 20 2a 2f 0a 20 20 44 57  ointer() */.  DW
12040 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 20 20  ORD lastErrno;  
12050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12060 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   Value returned 
12070 62 79 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28  by GetLastError(
12080 29 20 2a 2f 0a 0a 20 20 4f 53 54 52 41 43 45 28  ) */..  OSTRACE(
12090 28 22 53 45 45 4b 20 66 69 6c 65 3d 25 70 2c 20  ("SEEK file=%p, 
120a0 6f 66 66 73 65 74 3d 25 6c 6c 64 5c 6e 22 2c 20  offset=%lld\n", 
120b0 70 46 69 6c 65 2d 3e 68 2c 20 69 4f 66 66 73 65  pFile->h, iOffse
120c0 74 29 29 3b 0a 0a 20 20 75 70 70 65 72 42 69 74  t));..  upperBit
120d0 73 20 3d 20 28 4c 4f 4e 47 29 28 28 69 4f 66 66  s = (LONG)((iOff
120e0 73 65 74 3e 3e 33 32 29 20 26 20 30 78 37 66 66  set>>32) & 0x7ff
120f0 66 66 66 66 66 29 3b 0a 20 20 6c 6f 77 65 72 42  fffff);.  lowerB
12100 69 74 73 20 3d 20 28 4c 4f 4e 47 29 28 69 4f 66  its = (LONG)(iOf
12110 66 73 65 74 20 26 20 30 78 66 66 66 66 66 66 66  fset & 0xfffffff
12120 66 29 3b 0a 0a 20 20 2f 2a 20 41 50 49 20 6f 64  f);..  /* API od
12130 64 69 74 79 3a 20 49 66 20 73 75 63 63 65 73 73  dity: If success
12140 66 75 6c 2c 20 53 65 74 46 69 6c 65 50 6f 69 6e  ful, SetFilePoin
12150 74 65 72 28 29 20 72 65 74 75 72 6e 73 20 61 20  ter() returns a 
12160 64 77 6f 72 64 0a 20 20 2a 2a 20 63 6f 6e 74 61  dword.  ** conta
12170 69 6e 69 6e 67 20 74 68 65 20 6c 6f 77 65 72 20  ining the lower 
12180 33 32 2d 62 69 74 73 20 6f 66 20 74 68 65 20 6e  32-bits of the n
12190 65 77 20 66 69 6c 65 2d 6f 66 66 73 65 74 2e 20  ew file-offset. 
121a0 4f 72 2c 20 69 66 20 69 74 20 66 61 69 6c 73 2c  Or, if it fails,
121b0 0a 20 20 2a 2a 20 69 74 20 72 65 74 75 72 6e 73  .  ** it returns
121c0 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c   INVALID_SET_FIL
121d0 45 5f 50 4f 49 4e 54 45 52 2e 20 48 6f 77 65 76  E_POINTER. Howev
121e0 65 72 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  er according to 
121f0 4d 53 44 4e 2c 0a 20 20 2a 2a 20 49 4e 56 41 4c  MSDN,.  ** INVAL
12200 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e  ID_SET_FILE_POIN
12210 54 45 52 20 6d 61 79 20 61 6c 73 6f 20 62 65 20  TER may also be 
12220 61 20 76 61 6c 69 64 20 6e 65 77 20 6f 66 66 73  a valid new offs
12230 65 74 2e 20 53 6f 20 74 6f 20 64 65 74 65 72 6d  et. So to determ
12240 69 6e 65 0a 20 20 2a 2a 20 77 68 65 74 68 65 72  ine.  ** whether
12250 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 61 63   an error has ac
12260 74 75 61 6c 6c 79 20 6f 63 63 75 72 72 65 64 2c  tually occurred,
12270 20 69 74 20 69 73 20 61 6c 73 6f 20 6e 65 63 65   it is also nece
12280 73 73 61 72 79 20 74 6f 20 63 61 6c 6c 0a 20 20  ssary to call.  
12290 2a 2a 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28  ** GetLastError(
122a0 29 2e 0a 20 20 2a 2f 0a 20 20 64 77 52 65 74 20  )..  */.  dwRet 
122b0 3d 20 6f 73 53 65 74 46 69 6c 65 50 6f 69 6e 74  = osSetFilePoint
122c0 65 72 28 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 77  er(pFile->h, low
122d0 65 72 42 69 74 73 2c 20 26 75 70 70 65 72 42 69  erBits, &upperBi
122e0 74 73 2c 20 46 49 4c 45 5f 42 45 47 49 4e 29 3b  ts, FILE_BEGIN);
122f0 0a 0a 20 20 69 66 28 20 28 64 77 52 65 74 3d 3d  ..  if( (dwRet==
12300 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45  INVALID_SET_FILE
12310 5f 50 4f 49 4e 54 45 52 0a 20 20 20 20 20 20 26  _POINTER.      &
12320 26 20 28 28 6c 61 73 74 45 72 72 6e 6f 20 3d 20  & ((lastErrno = 
12330 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
12340 29 21 3d 4e 4f 5f 45 52 52 4f 52 29 29 20 29 7b  )!=NO_ERROR)) ){
12350 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74  .    pFile->last
12360 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e  Errno = lastErrn
12370 6f 3b 0a 20 20 20 20 77 69 6e 4c 6f 67 45 72 72  o;.    winLogErr
12380 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
12390 53 45 45 4b 2c 20 70 46 69 6c 65 2d 3e 6c 61 73  SEEK, pFile->las
123a0 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
123b0 20 20 20 20 20 20 20 20 22 77 69 6e 53 65 65 6b          "winSeek
123c0 46 69 6c 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  File", pFile->zP
123d0 61 74 68 29 3b 0a 20 20 20 20 4f 53 54 52 41 43  ath);.    OSTRAC
123e0 45 28 28 22 53 45 45 4b 20 66 69 6c 65 3d 25 70  E(("SEEK file=%p
123f0 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52  , rc=SQLITE_IOER
12400 52 5f 53 45 45 4b 5c 6e 22 2c 20 70 46 69 6c 65  R_SEEK\n", pFile
12410 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75 72  ->h));.    retur
12420 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54 52  n 1;.  }..  OSTR
12430 41 43 45 28 28 22 53 45 45 4b 20 66 69 6c 65 3d  ACE(("SEEK file=
12440 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b  %p, rc=SQLITE_OK
12450 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  \n", pFile->h));
12460 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6c  .  return 0;.#el
12470 73 65 0a 20 20 2f 2a 0a 20 20 2a 2a 20 53 61 6d  se.  /*.  ** Sam
12480 65 20 61 73 20 61 62 6f 76 65 2c 20 65 78 63 65  e as above, exce
12490 70 74 20 74 68 61 74 20 74 68 69 73 20 69 6d 70  pt that this imp
124a0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 77 6f 72 6b  lementation work
124b0 73 20 66 6f 72 20 57 69 6e 52 54 2e 0a 20 20 2a  s for WinRT..  *
124c0 2f 0a 0a 20 20 4c 41 52 47 45 5f 49 4e 54 45 47  /..  LARGE_INTEG
124d0 45 52 20 78 3b 20 20 20 20 20 20 20 20 20 20 20  ER x;           
124e0 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20       /* The new 
124f0 6f 66 66 73 65 74 20 2a 2f 0a 20 20 42 4f 4f 4c  offset */.  BOOL
12500 20 62 52 65 74 3b 20 20 20 20 20 20 20 20 20 20   bRet;          
12510 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
12520 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
12530 20 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 45   SetFilePointerE
12540 78 28 29 20 2a 2f 0a 0a 20 20 78 2e 51 75 61 64  x() */..  x.Quad
12550 50 61 72 74 20 3d 20 69 4f 66 66 73 65 74 3b 0a  Part = iOffset;.
12560 20 20 62 52 65 74 20 3d 20 6f 73 53 65 74 46 69    bRet = osSetFi
12570 6c 65 50 6f 69 6e 74 65 72 45 78 28 70 46 69 6c  lePointerEx(pFil
12580 65 2d 3e 68 2c 20 78 2c 20 30 2c 20 46 49 4c 45  e->h, x, 0, FILE
12590 5f 42 45 47 49 4e 29 3b 0a 0a 20 20 69 66 28 21  _BEGIN);..  if(!
125a0 62 52 65 74 29 7b 0a 20 20 20 20 70 46 69 6c 65  bRet){.    pFile
125b0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73  ->lastErrno = os
125c0 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
125d0 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28      winLogError(
125e0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 45 45  SQLITE_IOERR_SEE
125f0 4b 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  K, pFile->lastEr
12600 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
12610 20 20 20 20 20 22 77 69 6e 53 65 65 6b 46 69 6c       "winSeekFil
12620 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  e", pFile->zPath
12630 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  );.    OSTRACE((
12640 22 53 45 45 4b 20 66 69 6c 65 3d 25 70 2c 20 72  "SEEK file=%p, r
12650 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  c=SQLITE_IOERR_S
12660 45 45 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  EEK\n", pFile->h
12670 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  ));.    return 1
12680 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45  ;.  }..  OSTRACE
12690 28 28 22 53 45 45 4b 20 66 69 6c 65 3d 25 70 2c  (("SEEK file=%p,
126a0 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22   rc=SQLITE_OK\n"
126b0 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
126c0 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66  return 0;.#endif
126d0 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  .}..#if SQLITE_M
126e0 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 2f  AX_MMAP_SIZE>0./
126f0 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65  * Forward refere
12700 6e 63 65 73 20 74 6f 20 56 46 53 20 68 65 6c 70  nces to VFS help
12710 65 72 20 6d 65 74 68 6f 64 73 20 75 73 65 64 20  er methods used 
12720 66 6f 72 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65  for memory mappe
12730 64 20 66 69 6c 65 73 20 2a 2f 0a 73 74 61 74 69  d files */.stati
12740 63 20 69 6e 74 20 77 69 6e 4d 61 70 66 69 6c 65  c int winMapfile
12750 28 77 69 6e 46 69 6c 65 2a 2c 20 73 71 6c 69 74  (winFile*, sqlit
12760 65 33 5f 69 6e 74 36 34 29 3b 0a 73 74 61 74 69  e3_int64);.stati
12770 63 20 69 6e 74 20 77 69 6e 55 6e 6d 61 70 66 69  c int winUnmapfi
12780 6c 65 28 77 69 6e 46 69 6c 65 2a 29 3b 0a 23 65  le(winFile*);.#e
12790 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  ndif../*.** Clos
127a0 65 20 61 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  e a file..**.** 
127b0 49 74 20 69 73 20 72 65 70 6f 72 74 65 64 20 74  It is reported t
127c0 68 61 74 20 61 6e 20 61 74 74 65 6d 70 74 20 74  hat an attempt t
127d0 6f 20 63 6c 6f 73 65 20 61 20 68 61 6e 64 6c 65  o close a handle
127e0 20 6d 69 67 68 74 20 73 6f 6d 65 74 69 6d 65 73   might sometimes
127f0 0a 2a 2a 20 66 61 69 6c 2e 20 20 54 68 69 73 20  .** fail.  This 
12800 69 73 20 61 20 76 65 72 79 20 75 6e 72 65 61 73  is a very unreas
12810 6f 6e 61 62 6c 65 20 72 65 73 75 6c 74 2c 20 62  onable result, b
12820 75 74 20 57 69 6e 64 6f 77 73 20 69 73 20 6e 6f  ut Windows is no
12830 74 6f 72 69 6f 75 73 0a 2a 2a 20 66 6f 72 20 62  torious.** for b
12840 65 69 6e 67 20 75 6e 72 65 61 73 6f 6e 61 62 6c  eing unreasonabl
12850 65 20 73 6f 20 49 20 64 6f 20 6e 6f 74 20 64 6f  e so I do not do
12860 75 62 74 20 74 68 61 74 20 69 74 20 6d 69 67 68  ubt that it migh
12870 74 20 68 61 70 70 65 6e 2e 20 20 49 66 0a 2a 2a  t happen.  If.**
12880 20 74 68 65 20 63 6c 6f 73 65 20 66 61 69 6c 73   the close fails
12890 2c 20 77 65 20 70 61 75 73 65 20 66 6f 72 20 31  , we pause for 1
128a0 30 30 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20  00 milliseconds 
128b0 61 6e 64 20 74 72 79 20 61 67 61 69 6e 2e 20 20  and try again.  
128c0 41 73 0a 2a 2a 20 6d 61 6e 79 20 61 73 20 4d 58  As.** many as MX
128d0 5f 43 4c 4f 53 45 5f 41 54 54 45 4d 50 54 20 61  _CLOSE_ATTEMPT a
128e0 74 74 65 6d 70 74 73 20 74 6f 20 63 6c 6f 73 65  ttempts to close
128f0 20 74 68 65 20 68 61 6e 64 6c 65 20 61 72 65 20   the handle are 
12900 6d 61 64 65 20 62 65 66 6f 72 65 0a 2a 2a 20 67  made before.** g
12910 69 76 69 6e 67 20 75 70 20 61 6e 64 20 72 65 74  iving up and ret
12920 75 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 2e  urning an error.
12930 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 58 5f 43  .*/.#define MX_C
12940 4c 4f 53 45 5f 41 54 54 45 4d 50 54 20 33 0a 73  LOSE_ATTEMPT 3.s
12950 74 61 74 69 63 20 69 6e 74 20 77 69 6e 43 6c 6f  tatic int winClo
12960 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  se(sqlite3_file 
12970 2a 69 64 29 7b 0a 20 20 69 6e 74 20 72 63 2c 20  *id){.  int rc, 
12980 63 6e 74 20 3d 20 30 3b 0a 20 20 77 69 6e 46 69  cnt = 0;.  winFi
12990 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e  le *pFile = (win
129a0 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 61 73 73  File*)id;..  ass
129b0 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 23 69  ert( id!=0 );.#i
129c0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
129d0 54 5f 57 41 4c 0a 20 20 61 73 73 65 72 74 28 20  T_WAL.  assert( 
129e0 70 46 69 6c 65 2d 3e 70 53 68 6d 3d 3d 30 20 29  pFile->pShm==0 )
129f0 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72  ;.#endif.  asser
12a00 74 28 20 70 46 69 6c 65 2d 3e 68 21 3d 4e 55 4c  t( pFile->h!=NUL
12a10 4c 20 26 26 20 70 46 69 6c 65 2d 3e 68 21 3d 49  L && pFile->h!=I
12a20 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
12a30 4c 55 45 20 29 3b 0a 20 20 4f 53 54 52 41 43 45  LUE );.  OSTRACE
12a40 28 28 22 43 4c 4f 53 45 20 66 69 6c 65 3d 25 70  (("CLOSE file=%p
12a50 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  \n", pFile->h));
12a60 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  ..#if SQLITE_MAX
12a70 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 77  _MMAP_SIZE>0.  w
12a80 69 6e 55 6e 6d 61 70 66 69 6c 65 28 70 46 69 6c  inUnmapfile(pFil
12a90 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 64 6f  e);.#endif..  do
12aa0 7b 0a 20 20 20 20 72 63 20 3d 20 6f 73 43 6c 6f  {.    rc = osClo
12ab0 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e  seHandle(pFile->
12ac0 68 29 3b 0a 20 20 20 20 2f 2a 20 53 69 6d 75 6c  h);.    /* Simul
12ad0 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d 30  ateIOError( rc=0
12ae0 3b 20 63 6e 74 3d 4d 58 5f 43 4c 4f 53 45 5f 41  ; cnt=MX_CLOSE_A
12af0 54 54 45 4d 50 54 3b 20 29 3b 20 2a 2f 0a 20 20  TTEMPT; ); */.  
12b00 7d 77 68 69 6c 65 28 20 72 63 3d 3d 30 20 26 26  }while( rc==0 &&
12b10 20 2b 2b 63 6e 74 20 3c 20 4d 58 5f 43 4c 4f 53   ++cnt < MX_CLOS
12b20 45 5f 41 54 54 45 4d 50 54 20 26 26 20 28 73 71  E_ATTEMPT && (sq
12b30 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65  lite3_win32_slee
12b40 70 28 31 30 30 29 2c 20 31 29 20 29 3b 0a 23 69  p(100), 1) );.#i
12b50 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
12b60 45 0a 23 64 65 66 69 6e 65 20 57 49 4e 43 45 5f  E.#define WINCE_
12b70 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d 50 54  DELETION_ATTEMPT
12b80 53 20 33 0a 20 20 77 69 6e 63 65 44 65 73 74 72  S 3.  winceDestr
12b90 6f 79 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20  oyLock(pFile);. 
12ba0 20 69 66 28 20 70 46 69 6c 65 2d 3e 7a 44 65 6c   if( pFile->zDel
12bb0 65 74 65 4f 6e 43 6c 6f 73 65 20 29 7b 0a 20 20  eteOnClose ){.  
12bc0 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20    int cnt = 0;. 
12bd0 20 20 20 77 68 69 6c 65 28 0a 20 20 20 20 20 20     while(.      
12be0 20 20 20 20 20 6f 73 44 65 6c 65 74 65 46 69 6c       osDeleteFil
12bf0 65 57 28 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74  eW(pFile->zDelet
12c00 65 4f 6e 43 6c 6f 73 65 29 3d 3d 30 0a 20 20 20  eOnClose)==0.   
12c10 20 20 20 20 20 26 26 20 6f 73 47 65 74 46 69 6c       && osGetFil
12c20 65 41 74 74 72 69 62 75 74 65 73 57 28 70 46 69  eAttributesW(pFi
12c30 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f  le->zDeleteOnClo
12c40 73 65 29 21 3d 30 78 66 66 66 66 66 66 66 66 0a  se)!=0xffffffff.
12c50 20 20 20 20 20 20 20 20 26 26 20 63 6e 74 2b 2b          && cnt++
12c60 20 3c 20 57 49 4e 43 45 5f 44 45 4c 45 54 49 4f   < WINCE_DELETIO
12c70 4e 5f 41 54 54 45 4d 50 54 53 0a 20 20 20 20 29  N_ATTEMPTS.    )
12c80 7b 0a 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  {.       sqlite3
12c90 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28 31 30 30  _win32_sleep(100
12ca0 29 3b 20 20 2f 2a 20 57 61 69 74 20 61 20 6c 69  );  /* Wait a li
12cb0 74 74 6c 65 20 62 65 66 6f 72 65 20 74 72 79 69  ttle before tryi
12cc0 6e 67 20 61 67 61 69 6e 20 2a 2f 0a 20 20 20 20  ng again */.    
12cd0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  }.    sqlite3_fr
12ce0 65 65 28 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74  ee(pFile->zDelet
12cf0 65 4f 6e 43 6c 6f 73 65 29 3b 0a 20 20 7d 0a 23  eOnClose);.  }.#
12d00 65 6e 64 69 66 0a 20 20 69 66 28 20 72 63 20 29  endif.  if( rc )
12d10 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68 20 3d  {.    pFile->h =
12d20 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 20 20 4f 70 65   NULL;.  }.  Ope
12d30 6e 43 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20 20  nCounter(-1);.  
12d40 4f 53 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20  OSTRACE(("CLOSE 
12d50 66 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e  file=%p, rc=%s\n
12d60 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 20  ", pFile->h, rc 
12d70 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64  ? "ok" : "failed
12d80 22 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  "));.  return rc
12d90 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20   ? SQLITE_OK.   
12da0 20 20 20 20 20 20 20 20 20 3a 20 77 69 6e 4c 6f           : winLo
12db0 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
12dc0 45 52 52 5f 43 4c 4f 53 45 2c 20 6f 73 47 65 74  ERR_CLOSE, osGet
12dd0 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20  LastError(),.   
12de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12df0 20 20 20 20 20 20 20 22 77 69 6e 43 6c 6f 73 65         "winClose
12e00 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
12e10 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
12e20 64 61 74 61 20 66 72 6f 6d 20 61 20 66 69 6c 65  data from a file
12e30 20 69 6e 74 6f 20 61 20 62 75 66 66 65 72 2e 20   into a buffer. 
12e40 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
12e50 4b 20 69 66 20 61 6c 6c 0a 2a 2a 20 62 79 74 65  K if all.** byte
12e60 73 20 77 65 72 65 20 72 65 61 64 20 73 75 63 63  s were read succ
12e70 65 73 73 66 75 6c 6c 79 20 61 6e 64 20 53 51 4c  essfully and SQL
12e80 49 54 45 5f 49 4f 45 52 52 20 69 66 20 61 6e 79  ITE_IOERR if any
12e90 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72  thing goes.** wr
12ea0 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ong..*/.static i
12eb0 6e 74 20 77 69 6e 52 65 61 64 28 0a 20 20 73 71  nt winRead(.  sq
12ec0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
12ed0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
12ee0 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f   to read from */
12ef0 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20  .  void *pBuf,  
12f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12f10 20 57 72 69 74 65 20 63 6f 6e 74 65 6e 74 20 69   Write content i
12f20 6e 74 6f 20 74 68 69 73 20 62 75 66 66 65 72 20  nto this buffer 
12f30 2a 2f 0a 20 20 69 6e 74 20 61 6d 74 2c 20 20 20  */.  int amt,   
12f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12f50 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
12f60 65 73 20 74 6f 20 72 65 61 64 20 2a 2f 0a 20 20  es to read */.  
12f70 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66  sqlite3_int64 of
12f80 66 73 65 74 20 20 20 20 20 20 20 2f 2a 20 42 65  fset       /* Be
12f90 67 69 6e 20 72 65 61 64 69 6e 67 20 61 74 20 74  gin reading at t
12fa0 68 69 73 20 6f 66 66 73 65 74 20 2a 2f 0a 29 7b  his offset */.){
12fb0 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
12fc0 57 49 4e 43 45 0a 20 20 4f 56 45 52 4c 41 50 50  WINCE.  OVERLAPP
12fd0 45 44 20 6f 76 65 72 6c 61 70 70 65 64 3b 20 20  ED overlapped;  
12fe0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f          /* The o
12ff0 66 66 73 65 74 20 66 6f 72 20 52 65 61 64 46 69  ffset for ReadFi
13000 6c 65 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  le. */.#endif.  
13010 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  winFile *pFile =
13020 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 20 20   (winFile*)id;  
13030 2f 2a 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 2a  /* file handle *
13040 2f 0a 20 20 44 57 4f 52 44 20 6e 52 65 61 64 3b  /.  DWORD nRead;
13050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13060 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
13070 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20   bytes actually 
13080 72 65 61 64 20 66 72 6f 6d 20 66 69 6c 65 20 2a  read from file *
13090 2f 0a 20 20 69 6e 74 20 6e 52 65 74 72 79 20 3d  /.  int nRetry =
130a0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
130b0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
130c0 20 72 65 74 72 79 73 20 2a 2f 0a 0a 20 20 61 73   retrys */..  as
130d0 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20  sert( id!=0 );. 
130e0 20 61 73 73 65 72 74 28 20 61 6d 74 3e 30 20 29   assert( amt>0 )
130f0 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  ;.  assert( offs
13100 65 74 3e 3d 30 20 29 3b 0a 20 20 53 69 6d 75 6c  et>=0 );.  Simul
13110 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72  ateIOError(retur
13120 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52  n SQLITE_IOERR_R
13130 45 41 44 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  EAD);.  OSTRACE(
13140 28 22 52 45 41 44 20 66 69 6c 65 3d 25 70 2c 20  ("READ file=%p, 
13150 62 75 66 66 65 72 3d 25 70 2c 20 61 6d 6f 75 6e  buffer=%p, amoun
13160 74 3d 25 64 2c 20 6f 66 66 73 65 74 3d 25 6c 6c  t=%d, offset=%ll
13170 64 2c 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 0a 20  d, lock=%d\n",. 
13180 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
13190 3e 68 2c 20 70 42 75 66 2c 20 61 6d 74 2c 20 6f  >h, pBuf, amt, o
131a0 66 66 73 65 74 2c 20 70 46 69 6c 65 2d 3e 6c 6f  ffset, pFile->lo
131b0 63 6b 74 79 70 65 29 29 3b 0a 0a 23 69 66 20 53  cktype));..#if S
131c0 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
131d0 49 5a 45 3e 30 0a 20 20 2f 2a 20 44 65 61 6c 20  IZE>0.  /* Deal 
131e0 77 69 74 68 20 61 73 20 6d 75 63 68 20 6f 66 20  with as much of 
131f0 74 68 69 73 20 72 65 61 64 20 72 65 71 75 65 73  this read reques
13200 74 20 61 73 20 70 6f 73 73 69 62 6c 65 20 62 79  t as possible by
13210 20 74 72 61 6e 73 66 65 72 69 6e 67 0a 20 20 2a   transfering.  *
13220 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20  * data from the 
13230 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20 75  memory mapping u
13240 73 69 6e 67 20 6d 65 6d 63 70 79 28 29 2e 20 20  sing memcpy().  
13250 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c  */.  if( offset<
13260 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20  pFile->mmapSize 
13270 29 7b 0a 20 20 20 20 69 66 28 20 6f 66 66 73 65  ){.    if( offse
13280 74 2b 61 6d 74 20 3c 3d 20 70 46 69 6c 65 2d 3e  t+amt <= pFile->
13290 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20  mmapSize ){.    
132a0 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20 26    memcpy(pBuf, &
132b0 28 28 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70  ((u8 *)(pFile->p
132c0 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73  MapRegion))[offs
132d0 65 74 5d 2c 20 61 6d 74 29 3b 0a 20 20 20 20 20  et], amt);.     
132e0 20 4f 53 54 52 41 43 45 28 28 22 52 45 41 44 2d   OSTRACE(("READ-
132f0 4d 4d 41 50 20 66 69 6c 65 3d 25 70 2c 20 72 63  MMAP file=%p, rc
13300 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70  =SQLITE_OK\n", p
13310 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20  File->h));.     
13320 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
13330 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  K;.    }else{.  
13340 20 20 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20      int nCopy = 
13350 28 69 6e 74 29 28 70 46 69 6c 65 2d 3e 6d 6d 61  (int)(pFile->mma
13360 70 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 29 3b  pSize - offset);
13370 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 42  .      memcpy(pB
13380 75 66 2c 20 26 28 28 75 38 20 2a 29 28 70 46 69  uf, &((u8 *)(pFi
13390 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29  le->pMapRegion))
133a0 5b 6f 66 66 73 65 74 5d 2c 20 6e 43 6f 70 79 29  [offset], nCopy)
133b0 3b 0a 20 20 20 20 20 20 70 42 75 66 20 3d 20 26  ;.      pBuf = &
133c0 28 28 75 38 20 2a 29 70 42 75 66 29 5b 6e 43 6f  ((u8 *)pBuf)[nCo
133d0 70 79 5d 3b 0a 20 20 20 20 20 20 61 6d 74 20 2d  py];.      amt -
133e0 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 20 20 6f  = nCopy;.      o
133f0 66 66 73 65 74 20 2b 3d 20 6e 43 6f 70 79 3b 0a  ffset += nCopy;.
13400 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
13410 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
13420 57 49 4e 43 45 0a 20 20 69 66 28 20 77 69 6e 53  WINCE.  if( winS
13430 65 65 6b 46 69 6c 65 28 70 46 69 6c 65 2c 20 6f  eekFile(pFile, o
13440 66 66 73 65 74 29 20 29 7b 0a 20 20 20 20 4f 53  ffset) ){.    OS
13450 54 52 41 43 45 28 28 22 52 45 41 44 20 66 69 6c  TRACE(("READ fil
13460 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%p, rc=SQLITE_
13470 46 55 4c 4c 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  FULL\n", pFile->
13480 68 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  h));.    return 
13490 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 7d  SQLITE_FULL;.  }
134a0 0a 20 20 77 68 69 6c 65 28 20 21 6f 73 52 65 61  .  while( !osRea
134b0 64 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20  dFile(pFile->h, 
134c0 70 42 75 66 2c 20 61 6d 74 2c 20 26 6e 52 65 61  pBuf, amt, &nRea
134d0 64 2c 20 30 29 20 29 7b 0a 23 65 6c 73 65 0a 20  d, 0) ){.#else. 
134e0 20 6d 65 6d 73 65 74 28 26 6f 76 65 72 6c 61 70   memset(&overlap
134f0 70 65 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4f  ped, 0, sizeof(O
13500 56 45 52 4c 41 50 50 45 44 29 29 3b 0a 20 20 6f  VERLAPPED));.  o
13510 76 65 72 6c 61 70 70 65 64 2e 4f 66 66 73 65 74  verlapped.Offset
13520 20 3d 20 28 4c 4f 4e 47 29 28 6f 66 66 73 65 74   = (LONG)(offset
13530 20 26 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a   & 0xffffffff);.
13540 20 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66 66    overlapped.Off
13550 73 65 74 48 69 67 68 20 3d 20 28 4c 4f 4e 47 29  setHigh = (LONG)
13560 28 28 6f 66 66 73 65 74 3e 3e 33 32 29 20 26 20  ((offset>>32) & 
13570 30 78 37 66 66 66 66 66 66 66 29 3b 0a 20 20 77  0x7fffffff);.  w
13580 68 69 6c 65 28 20 21 6f 73 52 65 61 64 46 69 6c  hile( !osReadFil
13590 65 28 70 46 69 6c 65 2d 3e 68 2c 20 70 42 75 66  e(pFile->h, pBuf
135a0 2c 20 61 6d 74 2c 20 26 6e 52 65 61 64 2c 20 26  , amt, &nRead, &
135b0 6f 76 65 72 6c 61 70 70 65 64 29 20 26 26 0a 20  overlapped) &&. 
135c0 20 20 20 20 20 20 20 20 6f 73 47 65 74 4c 61 73          osGetLas
135d0 74 45 72 72 6f 72 28 29 21 3d 45 52 52 4f 52 5f  tError()!=ERROR_
135e0 48 41 4e 44 4c 45 5f 45 4f 46 20 29 7b 0a 23 65  HANDLE_EOF ){.#e
135f0 6e 64 69 66 0a 20 20 20 20 44 57 4f 52 44 20 6c  ndif.    DWORD l
13600 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 69 66  astErrno;.    if
13610 28 20 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28  ( winRetryIoerr(
13620 26 6e 52 65 74 72 79 2c 20 26 6c 61 73 74 45 72  &nRetry, &lastEr
13630 72 6e 6f 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  rno) ) continue;
13640 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74  .    pFile->last
13650 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e  Errno = lastErrn
13660 6f 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  o;.    OSTRACE((
13670 22 52 45 41 44 20 66 69 6c 65 3d 25 70 2c 20 72  "READ file=%p, r
13680 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52  c=SQLITE_IOERR_R
13690 45 41 44 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  EAD\n", pFile->h
136a0 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 77  ));.    return w
136b0 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
136c0 45 5f 49 4f 45 52 52 5f 52 45 41 44 2c 20 70 46  E_IOERR_READ, pF
136d0 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a  ile->lastErrno,.
136e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
136f0 20 20 20 20 20 20 20 22 77 69 6e 52 65 61 64 22         "winRead"
13700 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  , pFile->zPath);
13710 0a 20 20 7d 0a 20 20 77 69 6e 4c 6f 67 49 6f 65  .  }.  winLogIoe
13720 72 72 28 6e 52 65 74 72 79 29 3b 0a 20 20 69 66  rr(nRetry);.  if
13730 28 20 6e 52 65 61 64 3c 28 44 57 4f 52 44 29 61  ( nRead<(DWORD)a
13740 6d 74 20 29 7b 0a 20 20 20 20 2f 2a 20 55 6e 72  mt ){.    /* Unr
13750 65 61 64 20 70 61 72 74 73 20 6f 66 20 74 68 65  ead parts of the
13760 20 62 75 66 66 65 72 20 6d 75 73 74 20 62 65 20   buffer must be 
13770 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 2a 2f 0a 20  zero-filled */. 
13780 20 20 20 6d 65 6d 73 65 74 28 26 28 28 63 68 61     memset(&((cha
13790 72 2a 29 70 42 75 66 29 5b 6e 52 65 61 64 5d 2c  r*)pBuf)[nRead],
137a0 20 30 2c 20 61 6d 74 2d 6e 52 65 61 64 29 3b 0a   0, amt-nRead);.
137b0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 52 45      OSTRACE(("RE
137c0 41 44 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53  AD file=%p, rc=S
137d0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
137e0 54 5f 52 45 41 44 5c 6e 22 2c 20 70 46 69 6c 65  T_READ\n", pFile
137f0 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75 72  ->h));.    retur
13800 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  n SQLITE_IOERR_S
13810 48 4f 52 54 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a  HORT_READ;.  }..
13820 20 20 4f 53 54 52 41 43 45 28 28 22 52 45 41 44    OSTRACE(("READ
13830 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c   file=%p, rc=SQL
13840 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65  ITE_OK\n", pFile
13850 2d 3e 68 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  ->h));.  return 
13860 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
13870 0a 2a 2a 20 57 72 69 74 65 20 64 61 74 61 20 66  .** Write data f
13880 72 6f 6d 20 61 20 62 75 66 66 65 72 20 69 6e 74  rom a buffer int
13890 6f 20 61 20 66 69 6c 65 2e 20 20 52 65 74 75 72  o a file.  Retur
138a0 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
138b0 75 63 63 65 73 73 0a 2a 2a 20 6f 72 20 73 6f 6d  uccess.** or som
138c0 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f  e other error co
138d0 64 65 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a  de on failure..*
138e0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
138f0 57 72 69 74 65 28 0a 20 20 73 71 6c 69 74 65 33  Write(.  sqlite3
13900 5f 66 69 6c 65 20 2a 69 64 2c 20 20 20 20 20 20  _file *id,      
13910 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
13920 20 74 6f 20 77 72 69 74 65 20 69 6e 74 6f 20 2a   to write into *
13930 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  /.  const void *
13940 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 20  pBuf,           
13950 20 20 20 20 2f 2a 20 54 68 65 20 62 79 74 65 73      /* The bytes
13960 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 2a   to be written *
13970 2f 0a 20 20 69 6e 74 20 61 6d 74 2c 20 20 20 20  /.  int amt,    
13980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13990 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
139a0 20 62 79 74 65 73 20 74 6f 20 77 72 69 74 65 20   bytes to write 
139b0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  */.  sqlite3_int
139c0 36 34 20 6f 66 66 73 65 74 20 20 20 20 20 20 20  64 offset       
139d0 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69       /* Offset i
139e0 6e 74 6f 20 74 68 65 20 66 69 6c 65 20 74 6f 20  nto the file to 
139f0 62 65 67 69 6e 20 77 72 69 74 69 6e 67 20 61 74  begin writing at
13a00 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
13a10 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
13a20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
13a30 20 69 66 20 65 72 72 6f 72 20 68 61 73 20 6f 63   if error has oc
13a40 63 75 72 72 65 64 2c 20 65 6c 73 65 20 66 61 6c  curred, else fal
13a50 73 65 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 20  se */.  winFile 
13a60 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c  *pFile = (winFil
13a70 65 2a 29 69 64 3b 20 20 2f 2a 20 46 69 6c 65 20  e*)id;  /* File 
13a80 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  handle */.  int 
13a90 6e 52 65 74 72 79 20 3d 20 30 3b 20 20 20 20 20  nRetry = 0;     
13aa0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
13ab0 75 6d 62 65 72 20 6f 66 20 72 65 74 72 69 65 73  umber of retries
13ac0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 61   */..  assert( a
13ad0 6d 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  mt>0 );.  assert
13ae0 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 53 69 6d  ( pFile );.  Sim
13af0 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74  ulateIOError(ret
13b00 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
13b10 5f 57 52 49 54 45 29 3b 0a 20 20 53 69 6d 75 6c  _WRITE);.  Simul
13b20 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72  ateDiskfullError
13b30 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46  (return SQLITE_F
13b40 55 4c 4c 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45  ULL);..  OSTRACE
13b50 28 28 22 57 52 49 54 45 20 66 69 6c 65 3d 25 70  (("WRITE file=%p
13b60 2c 20 62 75 66 66 65 72 3d 25 70 2c 20 61 6d 6f  , buffer=%p, amo
13b70 75 6e 74 3d 25 64 2c 20 6f 66 66 73 65 74 3d 25  unt=%d, offset=%
13b80 6c 6c 64 2c 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c  lld, lock=%d\n",
13b90 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c  .           pFil
13ba0 65 2d 3e 68 2c 20 70 42 75 66 2c 20 61 6d 74 2c  e->h, pBuf, amt,
13bb0 20 6f 66 66 73 65 74 2c 20 70 46 69 6c 65 2d 3e   offset, pFile->
13bc0 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 0a 23 69 66  locktype));..#if
13bd0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
13be0 5f 53 49 5a 45 3e 30 0a 20 20 2f 2a 20 44 65 61  _SIZE>0.  /* Dea
13bf0 6c 20 77 69 74 68 20 61 73 20 6d 75 63 68 20 6f  l with as much o
13c00 66 20 74 68 69 73 20 77 72 69 74 65 20 72 65 71  f this write req
13c10 75 65 73 74 20 61 73 20 70 6f 73 73 69 62 6c 65  uest as possible
13c20 20 62 79 20 74 72 61 6e 73 66 65 72 69 6e 67 0a   by transfering.
13c30 20 20 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74    ** data from t
13c40 68 65 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e  he memory mappin
13c50 67 20 75 73 69 6e 67 20 6d 65 6d 63 70 79 28 29  g using memcpy()
13c60 2e 20 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73  .  */.  if( offs
13c70 65 74 3c 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69  et<pFile->mmapSi
13c80 7a 65 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 66  ze ){.    if( of
13c90 66 73 65 74 2b 61 6d 74 20 3c 3d 20 70 46 69 6c  fset+amt <= pFil
13ca0 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20  e->mmapSize ){. 
13cb0 20 20 20 20 20 6d 65 6d 63 70 79 28 26 28 28 75       memcpy(&((u
13cc0 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70  8 *)(pFile->pMap
13cd0 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d  Region))[offset]
13ce0 2c 20 70 42 75 66 2c 20 61 6d 74 29 3b 0a 20 20  , pBuf, amt);.  
13cf0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 57 52      OSTRACE(("WR
13d00 49 54 45 2d 4d 4d 41 50 20 66 69 6c 65 3d 25 70  ITE-MMAP file=%p
13d10 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e  , rc=SQLITE_OK\n
13d20 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20  ", pFile->h));. 
13d30 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
13d40 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65  TE_OK;.    }else
13d50 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 70  {.      int nCop
13d60 79 20 3d 20 28 69 6e 74 29 28 70 46 69 6c 65 2d  y = (int)(pFile-
13d70 3e 6d 6d 61 70 53 69 7a 65 20 2d 20 6f 66 66 73  >mmapSize - offs
13d80 65 74 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  et);.      memcp
13d90 79 28 26 28 28 75 38 20 2a 29 28 70 46 69 6c 65  y(&((u8 *)(pFile
13da0 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f  ->pMapRegion))[o
13db0 66 66 73 65 74 5d 2c 20 70 42 75 66 2c 20 6e 43  ffset], pBuf, nC
13dc0 6f 70 79 29 3b 0a 20 20 20 20 20 20 70 42 75 66  opy);.      pBuf
13dd0 20 3d 20 26 28 28 75 38 20 2a 29 70 42 75 66 29   = &((u8 *)pBuf)
13de0 5b 6e 43 6f 70 79 5d 3b 0a 20 20 20 20 20 20 61  [nCopy];.      a
13df0 6d 74 20 2d 3d 20 6e 43 6f 70 79 3b 0a 20 20 20  mt -= nCopy;.   
13e00 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 6e 43 6f     offset += nCo
13e10 70 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  py;.    }.  }.#e
13e20 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45  ndif..#if SQLITE
13e30 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 72 63 20 3d  _OS_WINCE.  rc =
13e40 20 77 69 6e 53 65 65 6b 46 69 6c 65 28 70 46 69   winSeekFile(pFi
13e50 6c 65 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 69  le, offset);.  i
13e60 66 28 20 72 63 3d 3d 30 20 29 7b 0a 23 65 6c 73  f( rc==0 ){.#els
13e70 65 0a 20 20 7b 0a 23 65 6e 64 69 66 0a 23 69 66  e.  {.#endif.#if
13e80 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43   !SQLITE_OS_WINC
13e90 45 0a 20 20 20 20 4f 56 45 52 4c 41 50 50 45 44  E.    OVERLAPPED
13ea0 20 6f 76 65 72 6c 61 70 70 65 64 3b 20 20 20 20   overlapped;    
13eb0 20 20 20 20 2f 2a 20 54 68 65 20 6f 66 66 73 65      /* The offse
13ec0 74 20 66 6f 72 20 57 72 69 74 65 46 69 6c 65 2e  t for WriteFile.
13ed0 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 20 20 75   */.#endif.    u
13ee0 38 20 2a 61 52 65 6d 20 3d 20 28 75 38 20 2a 29  8 *aRem = (u8 *)
13ef0 70 42 75 66 3b 20 20 20 20 20 20 20 20 2f 2a 20  pBuf;        /* 
13f00 44 61 74 61 20 79 65 74 20 74 6f 20 62 65 20 77  Data yet to be w
13f10 72 69 74 74 65 6e 20 2a 2f 0a 20 20 20 20 69 6e  ritten */.    in
13f20 74 20 6e 52 65 6d 20 3d 20 61 6d 74 3b 20 20 20  t nRem = amt;   
13f30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
13f40 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 79  umber of bytes y
13f50 65 74 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  et to be written
13f60 20 2a 2f 0a 20 20 20 20 44 57 4f 52 44 20 6e 57   */.    DWORD nW
13f70 72 69 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  rite;           
13f80 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 77        /* Bytes w
13f90 72 69 74 74 65 6e 20 62 79 20 65 61 63 68 20 57  ritten by each W
13fa0 72 69 74 65 46 69 6c 65 28 29 20 63 61 6c 6c 20  riteFile() call 
13fb0 2a 2f 0a 20 20 20 20 44 57 4f 52 44 20 6c 61 73  */.    DWORD las
13fc0 74 45 72 72 6e 6f 20 3d 20 4e 4f 5f 45 52 52 4f  tErrno = NO_ERRO
13fd0 52 3b 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65  R;   /* Value re
13fe0 74 75 72 6e 65 64 20 62 79 20 47 65 74 4c 61 73  turned by GetLas
13ff0 74 45 72 72 6f 72 28 29 20 2a 2f 0a 0a 23 69 66  tError() */..#if
14000 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43   !SQLITE_OS_WINC
14010 45 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 6f 76  E.    memset(&ov
14020 65 72 6c 61 70 70 65 64 2c 20 30 2c 20 73 69 7a  erlapped, 0, siz
14030 65 6f 66 28 4f 56 45 52 4c 41 50 50 45 44 29 29  eof(OVERLAPPED))
14040 3b 0a 20 20 20 20 6f 76 65 72 6c 61 70 70 65 64  ;.    overlapped
14050 2e 4f 66 66 73 65 74 20 3d 20 28 4c 4f 4e 47 29  .Offset = (LONG)
14060 28 6f 66 66 73 65 74 20 26 20 30 78 66 66 66 66  (offset & 0xffff
14070 66 66 66 66 29 3b 0a 20 20 20 20 6f 76 65 72 6c  ffff);.    overl
14080 61 70 70 65 64 2e 4f 66 66 73 65 74 48 69 67 68  apped.OffsetHigh
14090 20 3d 20 28 4c 4f 4e 47 29 28 28 6f 66 66 73 65   = (LONG)((offse
140a0 74 3e 3e 33 32 29 20 26 20 30 78 37 66 66 66 66  t>>32) & 0x7ffff
140b0 66 66 66 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  fff);.#endif..  
140c0 20 20 77 68 69 6c 65 28 20 6e 52 65 6d 3e 30 20    while( nRem>0 
140d0 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  ){.#if SQLITE_OS
140e0 5f 57 49 4e 43 45 0a 20 20 20 20 20 20 69 66 28  _WINCE.      if(
140f0 20 21 6f 73 57 72 69 74 65 46 69 6c 65 28 70 46   !osWriteFile(pF
14100 69 6c 65 2d 3e 68 2c 20 61 52 65 6d 2c 20 6e 52  ile->h, aRem, nR
14110 65 6d 2c 20 26 6e 57 72 69 74 65 2c 20 30 29 20  em, &nWrite, 0) 
14120 29 7b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 69  ){.#else.      i
14130 66 28 20 21 6f 73 57 72 69 74 65 46 69 6c 65 28  f( !osWriteFile(
14140 70 46 69 6c 65 2d 3e 68 2c 20 61 52 65 6d 2c 20  pFile->h, aRem, 
14150 6e 52 65 6d 2c 20 26 6e 57 72 69 74 65 2c 20 26  nRem, &nWrite, &
14160 6f 76 65 72 6c 61 70 70 65 64 29 20 29 7b 0a 23  overlapped) ){.#
14170 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 69 66  endif.        if
14180 28 20 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28  ( winRetryIoerr(
14190 26 6e 52 65 74 72 79 2c 20 26 6c 61 73 74 45 72  &nRetry, &lastEr
141a0 72 6e 6f 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  rno) ) continue;
141b0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
141c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
141d0 73 65 72 74 28 20 6e 57 72 69 74 65 3d 3d 30 20  sert( nWrite==0 
141e0 7c 7c 20 6e 57 72 69 74 65 3c 3d 28 44 57 4f 52  || nWrite<=(DWOR
141f0 44 29 6e 52 65 6d 20 29 3b 0a 20 20 20 20 20 20  D)nRem );.      
14200 69 66 28 20 6e 57 72 69 74 65 3d 3d 30 20 7c 7c  if( nWrite==0 ||
14210 20 6e 57 72 69 74 65 3e 28 44 57 4f 52 44 29 6e   nWrite>(DWORD)n
14220 52 65 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 6c  Rem ){.        l
14230 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
14240 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
14250 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
14260 20 20 7d 0a 23 69 66 20 21 53 51 4c 49 54 45 5f    }.#if !SQLITE_
14270 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20 20 20 6f  OS_WINCE.      o
14280 66 66 73 65 74 20 2b 3d 20 6e 57 72 69 74 65 3b  ffset += nWrite;
14290 0a 20 20 20 20 20 20 6f 76 65 72 6c 61 70 70 65  .      overlappe
142a0 64 2e 4f 66 66 73 65 74 20 3d 20 28 4c 4f 4e 47  d.Offset = (LONG
142b0 29 28 6f 66 66 73 65 74 20 26 20 30 78 66 66 66  )(offset & 0xfff
142c0 66 66 66 66 66 29 3b 0a 20 20 20 20 20 20 6f 76  fffff);.      ov
142d0 65 72 6c 61 70 70 65 64 2e 4f 66 66 73 65 74 48  erlapped.OffsetH
142e0 69 67 68 20 3d 20 28 4c 4f 4e 47 29 28 28 6f 66  igh = (LONG)((of
142f0 66 73 65 74 3e 3e 33 32 29 20 26 20 30 78 37 66  fset>>32) & 0x7f
14300 66 66 66 66 66 66 29 3b 0a 23 65 6e 64 69 66 0a  ffffff);.#endif.
14310 20 20 20 20 20 20 61 52 65 6d 20 2b 3d 20 6e 57        aRem += nW
14320 72 69 74 65 3b 0a 20 20 20 20 20 20 6e 52 65 6d  rite;.      nRem
14330 20 2d 3d 20 6e 57 72 69 74 65 3b 0a 20 20 20 20   -= nWrite;.    
14340 7d 0a 20 20 20 20 69 66 28 20 6e 52 65 6d 3e 30  }.    if( nRem>0
14350 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   ){.      pFile-
14360 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73  >lastErrno = las
14370 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63  tErrno;.      rc
14380 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 1;.    }.  }.
14390 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
143a0 20 69 66 28 20 20 20 28 20 70 46 69 6c 65 2d 3e   if(   ( pFile->
143b0 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52  lastErrno==ERROR
143c0 5f 48 41 4e 44 4c 45 5f 44 49 53 4b 5f 46 55 4c  _HANDLE_DISK_FUL
143d0 4c 20 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 20  L ).       || ( 
143e0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
143f0 3d 3d 45 52 52 4f 52 5f 44 49 53 4b 5f 46 55 4c  ==ERROR_DISK_FUL
14400 4c 20 29 29 7b 0a 20 20 20 20 20 20 4f 53 54 52  L )){.      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 46  =%p, rc=SQLITE_F
14430 55 4c 4c 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  ULL\n", pFile->h
14440 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
14450 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
14460 49 54 45 5f 46 55 4c 4c 2c 20 70 46 69 6c 65 2d  ITE_FULL, pFile-
14470 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20  >lastErrno,.    
14480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14490 20 20 20 20 20 22 77 69 6e 57 72 69 74 65 31 22       "winWrite1"
144a0 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  , pFile->zPath);
144b0 0a 20 20 20 20 7d 0a 20 20 20 20 4f 53 54 52 41  .    }.    OSTRA
144c0 43 45 28 28 22 57 52 49 54 45 20 66 69 6c 65 3d  CE(("WRITE file=
144d0 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f  %p, rc=SQLITE_IO
144e0 45 52 52 5f 57 52 49 54 45 5c 6e 22 2c 20 70 46  ERR_WRITE\n", pF
144f0 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65  ile->h));.    re
14500 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72  turn winLogError
14510 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52  (SQLITE_IOERR_WR
14520 49 54 45 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74  ITE, pFile->last
14530 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  Errno,.         
14540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
14550 69 6e 57 72 69 74 65 32 22 2c 20 70 46 69 6c 65  inWrite2", pFile
14560 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 65 6c 73  ->zPath);.  }els
14570 65 7b 0a 20 20 20 20 77 69 6e 4c 6f 67 49 6f 65  e{.    winLogIoe
14580 72 72 28 6e 52 65 74 72 79 29 3b 0a 20 20 7d 0a  rr(nRetry);.  }.
14590 20 20 4f 53 54 52 41 43 45 28 28 22 57 52 49 54    OSTRACE(("WRIT
145a0 45 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51  E file=%p, rc=SQ
145b0 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c  LITE_OK\n", pFil
145c0 65 2d 3e 68 29 29 3b 0a 20 20 72 65 74 75 72 6e  e->h));.  return
145d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
145e0 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 61 6e  *.** Truncate an
145f0 20 6f 70 65 6e 20 66 69 6c 65 20 74 6f 20 61 20   open file to a 
14600 73 70 65 63 69 66 69 65 64 20 73 69 7a 65 0a 2a  specified size.*
14610 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
14620 54 72 75 6e 63 61 74 65 28 73 71 6c 69 74 65 33  Truncate(sqlite3
14630 5f 66 69 6c 65 20 2a 69 64 2c 20 73 71 6c 69 74  _file *id, sqlit
14640 65 33 5f 69 6e 74 36 34 20 6e 42 79 74 65 29 7b  e3_int64 nByte){
14650 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  .  winFile *pFil
14660 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64  e = (winFile*)id
14670 3b 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c  ;  /* File handl
14680 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e  e object */.  in
14690 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
146a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
146b0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66 6f 72   Return code for
146c0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a   this function *
146d0 2f 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72  /.  DWORD lastEr
146e0 72 6e 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  rno;..  assert( 
146f0 70 46 69 6c 65 20 29 3b 0a 20 20 53 69 6d 75 6c  pFile );.  Simul
14700 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72  ateIOError(retur
14710 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54  n SQLITE_IOERR_T
14720 52 55 4e 43 41 54 45 29 3b 0a 20 20 4f 53 54 52  RUNCATE);.  OSTR
14730 41 43 45 28 28 22 54 52 55 4e 43 41 54 45 20 66  ACE(("TRUNCATE f
14740 69 6c 65 3d 25 70 2c 20 73 69 7a 65 3d 25 6c 6c  ile=%p, size=%ll
14750 64 2c 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 0a 20  d, lock=%d\n",. 
14760 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
14770 3e 68 2c 20 6e 42 79 74 65 2c 20 70 46 69 6c 65  >h, nByte, pFile
14780 2d 3e 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 0a 20  ->locktype));.. 
14790 20 2f 2a 20 49 66 20 74 68 65 20 75 73 65 72 20   /* If the user 
147a0 68 61 73 20 63 6f 6e 66 69 67 75 72 65 64 20 61  has configured a
147b0 20 63 68 75 6e 6b 2d 73 69 7a 65 20 66 6f 72 20   chunk-size for 
147c0 74 68 69 73 20 66 69 6c 65 2c 20 74 72 75 6e 63  this file, trunc
147d0 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 66 69 6c  ate the.  ** fil
147e0 65 20 73 6f 20 74 68 61 74 20 69 74 20 63 6f 6e  e so that it con
147f0 73 69 73 74 73 20 6f 66 20 61 6e 20 69 6e 74 65  sists of an inte
14800 67 65 72 20 6e 75 6d 62 65 72 20 6f 66 20 63 68  ger number of ch
14810 75 6e 6b 73 20 28 69 2e 65 2e 20 74 68 65 0a 20  unks (i.e. the. 
14820 20 2a 2a 20 61 63 74 75 61 6c 20 66 69 6c 65 20   ** actual file 
14830 73 69 7a 65 20 61 66 74 65 72 20 74 68 65 20 6f  size after the o
14840 70 65 72 61 74 69 6f 6e 20 6d 61 79 20 62 65 20  peration may be 
14850 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20  larger than the 
14860 72 65 71 75 65 73 74 65 64 0a 20 20 2a 2a 20 73  requested.  ** s
14870 69 7a 65 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ize)..  */.  if(
14880 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3e   pFile->szChunk>
14890 30 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d  0 ){.    nByte =
148a0 20 28 28 6e 42 79 74 65 20 2b 20 70 46 69 6c 65   ((nByte + pFile
148b0 2d 3e 73 7a 43 68 75 6e 6b 20 2d 20 31 29 2f 70  ->szChunk - 1)/p
148c0 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 29 20 2a  File->szChunk) *
148d0 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3b   pFile->szChunk;
148e0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 45 6e  .  }..  /* SetEn
148f0 64 4f 66 46 69 6c 65 28 29 20 72 65 74 75 72 6e  dOfFile() return
14900 73 20 6e 6f 6e 2d 7a 65 72 6f 20 77 68 65 6e 20  s non-zero when 
14910 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 7a  successful, or z
14920 65 72 6f 20 77 68 65 6e 20 69 74 20 66 61 69 6c  ero when it fail
14930 73 2e 20 2a 2f 0a 20 20 69 66 28 20 77 69 6e 53  s. */.  if( winS
14940 65 65 6b 46 69 6c 65 28 70 46 69 6c 65 2c 20 6e  eekFile(pFile, n
14950 42 79 74 65 29 20 29 7b 0a 20 20 20 20 72 63 20  Byte) ){.    rc 
14960 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  = winLogError(SQ
14970 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43  LITE_IOERR_TRUNC
14980 41 54 45 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74  ATE, pFile->last
14990 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  Errno,.         
149a0 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
149b0 54 72 75 6e 63 61 74 65 31 22 2c 20 70 46 69 6c  Truncate1", pFil
149c0 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 65 6c  e->zPath);.  }el
149d0 73 65 20 69 66 28 20 30 3d 3d 6f 73 53 65 74 45  se if( 0==osSetE
149e0 6e 64 4f 66 46 69 6c 65 28 70 46 69 6c 65 2d 3e  ndOfFile(pFile->
149f0 68 29 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  h) &&.          
14a00 20 20 28 28 6c 61 73 74 45 72 72 6e 6f 20 3d 20    ((lastErrno = 
14a10 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
14a20 29 21 3d 45 52 52 4f 52 5f 55 53 45 52 5f 4d 41  )!=ERROR_USER_MA
14a30 50 50 45 44 5f 46 49 4c 45 29 20 29 7b 0a 20 20  PPED_FILE) ){.  
14a40 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
14a50 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a  no = lastErrno;.
14a60 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45      rc = winLogE
14a70 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
14a80 52 5f 54 52 55 4e 43 41 54 45 2c 20 70 46 69 6c  R_TRUNCATE, pFil
14a90 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20  e->lastErrno,.  
14aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ab0 20 20 20 22 77 69 6e 54 72 75 6e 63 61 74 65 32     "winTruncate2
14ac0 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
14ad0 3b 0a 20 20 7d 0a 0a 23 69 66 20 53 51 4c 49 54  ;.  }..#if SQLIT
14ae0 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
14af0 30 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69  0.  /* If the fi
14b00 6c 65 20 77 61 73 20 74 72 75 6e 63 61 74 65 64  le was truncated
14b10 20 74 6f 20 61 20 73 69 7a 65 20 73 6d 61 6c 6c   to a size small
14b20 65 72 20 74 68 61 6e 20 74 68 65 20 63 75 72 72  er than the curr
14b30 65 6e 74 6c 79 0a 20 20 2a 2a 20 6d 61 70 70 65  ently.  ** mappe
14b40 64 20 72 65 67 69 6f 6e 2c 20 72 65 64 75 63 65  d region, reduce
14b50 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20 6d   the effective m
14b60 61 70 70 69 6e 67 20 73 69 7a 65 20 61 73 20 77  apping size as w
14b70 65 6c 6c 2e 20 53 51 4c 69 74 65 20 77 69 6c 6c  ell. SQLite will
14b80 0a 20 20 2a 2a 20 75 73 65 20 72 65 61 64 28 29  .  ** use read()
14b90 20 61 6e 64 20 77 72 69 74 65 28 29 20 74 6f 20   and write() to 
14ba0 61 63 63 65 73 73 20 64 61 74 61 20 62 65 79 6f  access data beyo
14bb0 6e 64 20 74 68 69 73 20 70 6f 69 6e 74 20 66 72  nd this point fr
14bc0 6f 6d 20 6e 6f 77 20 6f 6e 2e 0a 20 20 2a 2f 0a  om now on..  */.
14bd0 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 4d 61    if( pFile->pMa
14be0 70 52 65 67 69 6f 6e 20 26 26 20 6e 42 79 74 65  pRegion && nByte
14bf0 3c 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65  <pFile->mmapSize
14c00 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6d   ){.    pFile->m
14c10 6d 61 70 53 69 7a 65 20 3d 20 6e 42 79 74 65 3b  mapSize = nByte;
14c20 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 4f  .  }.#endif..  O
14c30 53 54 52 41 43 45 28 28 22 54 52 55 4e 43 41 54  STRACE(("TRUNCAT
14c40 45 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73  E file=%p, rc=%s
14c50 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 73  \n", pFile->h, s
14c60 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63  qlite3ErrName(rc
14c70 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  )));.  return rc
14c80 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
14c90 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 43 6f  TE_TEST./*.** Co
14ca0 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  unt the number o
14cb0 66 20 66 75 6c 6c 73 79 6e 63 73 20 61 6e 64 20  f fullsyncs and 
14cc0 6e 6f 72 6d 61 6c 20 73 79 6e 63 73 2e 20 20 54  normal syncs.  T
14cd0 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 74  his is used to t
14ce0 65 73 74 0a 2a 2a 20 74 68 61 74 20 73 79 6e 63  est.** that sync
14cf0 73 20 61 6e 64 20 66 75 6c 6c 73 79 6e 63 73 20  s and fullsyncs 
14d00 61 72 65 20 6f 63 63 75 72 69 6e 67 20 61 74 20  are occuring at 
14d10 74 68 65 20 72 69 67 68 74 20 74 69 6d 65 73 2e  the right times.
14d20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
14d30 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a  sync_count = 0;.
14d40 69 6e 74 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c  int sqlite3_full
14d50 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a  sync_count = 0;.
14d60 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61  #endif../*.** Ma
14d70 6b 65 20 73 75 72 65 20 61 6c 6c 20 77 72 69 74  ke sure all writ
14d80 65 73 20 74 6f 20 61 20 70 61 72 74 69 63 75 6c  es to a particul
14d90 61 72 20 66 69 6c 65 20 61 72 65 20 63 6f 6d 6d  ar file are comm
14da0 69 74 74 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a  itted to disk..*
14db0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
14dc0 53 79 6e 63 28 73 71 6c 69 74 65 33 5f 66 69 6c  Sync(sqlite3_fil
14dd0 65 20 2a 69 64 2c 20 69 6e 74 20 66 6c 61 67 73  e *id, int flags
14de0 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
14df0 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 2f 2a 0a 20  E_NO_SYNC.  /*. 
14e00 20 2a 2a 20 55 73 65 64 20 6f 6e 6c 79 20 77 68   ** Used only wh
14e10 65 6e 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  en SQLITE_NO_SYN
14e20 43 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64  C is not defined
14e30 2e 0a 20 20 20 2a 2f 0a 20 20 42 4f 4f 4c 20 72  ..   */.  BOOL r
14e40 63 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64  c;.#endif.#if !d
14e50 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 7c  efined(NDEBUG) |
14e60 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
14e70 45 5f 4e 4f 5f 53 59 4e 43 29 20 7c 7c 20 5c 0a  E_NO_SYNC) || \.
14e80 20 20 20 20 28 64 65 66 69 6e 65 64 28 53 51 4c      (defined(SQL
14e90 49 54 45 5f 54 45 53 54 29 20 26 26 20 64 65 66  ITE_TEST) && def
14ea0 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
14eb0 47 29 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 55 73  G)).  /*.  ** Us
14ec0 65 64 20 77 68 65 6e 20 53 51 4c 49 54 45 5f 4e  ed when SQLITE_N
14ed0 4f 5f 53 59 4e 43 20 69 73 20 6e 6f 74 20 64 65  O_SYNC is not de
14ee0 66 69 6e 65 64 20 61 6e 64 20 62 79 20 74 68 65  fined and by the
14ef0 20 61 73 73 65 72 74 28 29 20 61 6e 64 2f 6f 72   assert() and/or
14f00 0a 20 20 2a 2a 20 4f 53 54 52 41 43 45 28 29 20  .  ** OSTRACE() 
14f10 6d 61 63 72 6f 73 2e 0a 20 20 20 2a 2f 0a 20 20  macros..   */.  
14f20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  winFile *pFile =
14f30 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 23   (winFile*)id;.#
14f40 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41  else.  UNUSED_PA
14f50 52 41 4d 45 54 45 52 28 69 64 29 3b 0a 23 65 6e  RAMETER(id);.#en
14f60 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70  dif..  assert( p
14f70 46 69 6c 65 20 29 3b 0a 20 20 2f 2a 20 43 68 65  File );.  /* Che
14f80 63 6b 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 53  ck that one of S
14f90 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
14fa0 4c 20 6f 72 20 46 55 4c 4c 20 77 61 73 20 70 61  L or FULL was pa
14fb0 73 73 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74  ssed */.  assert
14fc0 28 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53  ((flags&0x0F)==S
14fd0 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
14fe0 4c 0a 20 20 20 20 20 20 7c 7c 20 28 66 6c 61 67  L.      || (flag
14ff0 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f  s&0x0F)==SQLITE_
15000 53 59 4e 43 5f 46 55 4c 4c 0a 20 20 29 3b 0a 0a  SYNC_FULL.  );..
15010 20 20 2f 2a 20 55 6e 69 78 20 63 61 6e 6e 6f 74    /* Unix cannot
15020 2c 20 62 75 74 20 73 6f 6d 65 20 73 79 73 74 65  , but some syste
15030 6d 73 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51  ms may return SQ
15040 4c 49 54 45 5f 46 55 4c 4c 20 66 72 6f 6d 20 68  LITE_FULL from h
15050 65 72 65 2e 20 54 68 69 73 0a 20 20 2a 2a 20 6c  ere. This.  ** l
15060 69 6e 65 20 69 73 20 74 6f 20 74 65 73 74 20 74  ine is to test t
15070 68 61 74 20 64 6f 69 6e 67 20 73 6f 20 64 6f 65  hat doing so doe
15080 73 20 6e 6f 74 20 63 61 75 73 65 20 61 6e 79 20  s not cause any 
15090 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 2a 2f 0a 20  problems..  */. 
150a0 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c   SimulateDiskful
150b0 6c 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  lError( return S
150c0 51 4c 49 54 45 5f 46 55 4c 4c 20 29 3b 0a 0a 20  QLITE_FULL );.. 
150d0 20 4f 53 54 52 41 43 45 28 28 22 53 59 4e 43 20   OSTRACE(("SYNC 
150e0 66 69 6c 65 3d 25 70 2c 20 66 6c 61 67 73 3d 25  file=%p, flags=%
150f0 78 2c 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 0a 20  x, lock=%d\n",. 
15100 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
15110 3e 68 2c 20 66 6c 61 67 73 2c 20 70 46 69 6c 65  >h, flags, pFile
15120 2d 3e 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 0a 23  ->locktype));..#
15130 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 54 45  ifndef SQLITE_TE
15140 53 54 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ST.  UNUSED_PARA
15150 4d 45 54 45 52 28 66 6c 61 67 73 29 3b 0a 23 65  METER(flags);.#e
15160 6c 73 65 0a 20 20 69 66 28 20 28 66 6c 61 67 73  lse.  if( (flags
15170 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53  &0x0F)==SQLITE_S
15180 59 4e 43 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20  YNC_FULL ){.    
15190 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63  sqlite3_fullsync
151a0 5f 63 6f 75 6e 74 2b 2b 3b 0a 20 20 7d 0a 20 20  _count++;.  }.  
151b0 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75  sqlite3_sync_cou
151c0 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  nt++;.#endif..  
151d0 2f 2a 20 49 66 20 77 65 20 63 6f 6d 70 69 6c 65  /* If we compile
151e0 64 20 77 69 74 68 20 74 68 65 20 53 51 4c 49 54  d with the SQLIT
151f0 45 5f 4e 4f 5f 53 59 4e 43 20 66 6c 61 67 2c 20  E_NO_SYNC flag, 
15200 74 68 65 6e 20 73 79 6e 63 69 6e 67 20 69 73 20  then syncing is 
15210 61 0a 20 20 2a 2a 20 6e 6f 2d 6f 70 0a 20 20 2a  a.  ** no-op.  *
15220 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
15230 4e 4f 5f 53 59 4e 43 0a 20 20 4f 53 54 52 41 43  NO_SYNC.  OSTRAC
15240 45 28 28 22 53 59 4e 43 2d 4e 4f 50 20 66 69 6c  E(("SYNC-NOP fil
15250 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%p, rc=SQLITE_
15260 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29  OK\n", pFile->h)
15270 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
15280 54 45 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 20 20 72  TE_OK;.#else.  r
15290 63 20 3d 20 6f 73 46 6c 75 73 68 46 69 6c 65 42  c = osFlushFileB
152a0 75 66 66 65 72 73 28 70 46 69 6c 65 2d 3e 68 29  uffers(pFile->h)
152b0 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
152c0 72 6f 72 28 20 72 63 3d 46 41 4c 53 45 20 29 3b  ror( rc=FALSE );
152d0 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
152e0 20 4f 53 54 52 41 43 45 28 28 22 53 59 4e 43 20   OSTRACE(("SYNC 
152f0 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49  file=%p, rc=SQLI
15300 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d  TE_OK\n", pFile-
15310 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  >h));.    return
15320 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
15330 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  lse{.    pFile->
15340 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
15350 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
15360 20 20 4f 53 54 52 41 43 45 28 28 22 53 59 4e 43    OSTRACE(("SYNC
15370 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c   file=%p, rc=SQL
15380 49 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43 5c  ITE_IOERR_FSYNC\
15390 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  n", pFile->h));.
153a0 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f      return winLo
153b0 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
153c0 45 52 52 5f 46 53 59 4e 43 2c 20 70 46 69 6c 65  ERR_FSYNC, pFile
153d0 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20  ->lastErrno,.   
153e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
153f0 20 20 20 20 22 77 69 6e 53 79 6e 63 22 2c 20 70      "winSync", p
15400 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
15410 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  }.#endif.}../*.*
15420 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20  * Determine the 
15430 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20  current size of 
15440 61 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 0a  a file in bytes.
15450 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
15460 6e 46 69 6c 65 53 69 7a 65 28 73 71 6c 69 74 65  nFileSize(sqlite
15470 33 5f 66 69 6c 65 20 2a 69 64 2c 20 73 71 6c 69  3_file *id, sqli
15480 74 65 33 5f 69 6e 74 36 34 20 2a 70 53 69 7a 65  te3_int64 *pSize
15490 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46  ){.  winFile *pF
154a0 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29  ile = (winFile*)
154b0 69 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  id;.  int rc = S
154c0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73  QLITE_OK;..  ass
154d0 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20  ert( id!=0 );.  
154e0 61 73 73 65 72 74 28 20 70 53 69 7a 65 21 3d 30  assert( pSize!=0
154f0 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f   );.  SimulateIO
15500 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c  Error(return SQL
15510 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 29  ITE_IOERR_FSTAT)
15520 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 49  ;.  OSTRACE(("SI
15530 5a 45 20 66 69 6c 65 3d 25 70 2c 20 70 53 69 7a  ZE file=%p, pSiz
15540 65 3d 25 70 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  e=%p\n", pFile->
15550 68 2c 20 70 53 69 7a 65 29 29 3b 0a 0a 23 69 66  h, pSize));..#if
15560 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
15570 0a 20 20 7b 0a 20 20 20 20 46 49 4c 45 5f 53 54  .  {.    FILE_ST
15580 41 4e 44 41 52 44 5f 49 4e 46 4f 20 69 6e 66 6f  ANDARD_INFO info
15590 3b 0a 20 20 20 20 69 66 28 20 6f 73 47 65 74 46  ;.    if( osGetF
155a0 69 6c 65 49 6e 66 6f 72 6d 61 74 69 6f 6e 42 79  ileInformationBy
155b0 48 61 6e 64 6c 65 45 78 28 70 46 69 6c 65 2d 3e  HandleEx(pFile->
155c0 68 2c 20 46 69 6c 65 53 74 61 6e 64 61 72 64 49  h, FileStandardI
155d0 6e 66 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  nfo,.           
155e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
155f0 20 20 20 20 20 20 20 20 20 20 26 69 6e 66 6f 2c            &info,
15600 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 20 29   sizeof(info)) )
15610 7b 0a 20 20 20 20 20 20 2a 70 53 69 7a 65 20 3d  {.      *pSize =
15620 20 69 6e 66 6f 2e 45 6e 64 4f 66 46 69 6c 65 2e   info.EndOfFile.
15630 51 75 61 64 50 61 72 74 3b 0a 20 20 20 20 7d 65  QuadPart;.    }e
15640 6c 73 65 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  lse{.      pFile
15650 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73  ->lastErrno = os
15660 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
15670 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f        rc = winLo
15680 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
15690 45 52 52 5f 46 53 54 41 54 2c 20 70 46 69 6c 65  ERR_FSTAT, pFile
156a0 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20  ->lastErrno,.   
156b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
156c0 20 20 20 20 22 77 69 6e 46 69 6c 65 53 69 7a 65      "winFileSize
156d0 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
156e0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73  ;.    }.  }.#els
156f0 65 0a 20 20 7b 0a 20 20 20 20 44 57 4f 52 44 20  e.  {.    DWORD 
15700 75 70 70 65 72 42 69 74 73 3b 0a 20 20 20 20 44  upperBits;.    D
15710 57 4f 52 44 20 6c 6f 77 65 72 42 69 74 73 3b 0a  WORD lowerBits;.
15720 20 20 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72      DWORD lastEr
15730 72 6e 6f 3b 0a 0a 20 20 20 20 6c 6f 77 65 72 42  rno;..    lowerB
15740 69 74 73 20 3d 20 6f 73 47 65 74 46 69 6c 65 53  its = osGetFileS
15750 69 7a 65 28 70 46 69 6c 65 2d 3e 68 2c 20 26 75  ize(pFile->h, &u
15760 70 70 65 72 42 69 74 73 29 3b 0a 20 20 20 20 2a  pperBits);.    *
15770 70 53 69 7a 65 20 3d 20 28 28 28 73 71 6c 69 74  pSize = (((sqlit
15780 65 33 5f 69 6e 74 36 34 29 75 70 70 65 72 42 69  e3_int64)upperBi
15790 74 73 29 3c 3c 33 32 29 20 2b 20 6c 6f 77 65 72  ts)<<32) + lower
157a0 42 69 74 73 3b 0a 20 20 20 20 69 66 28 20 20 20  Bits;.    if(   
157b0 28 6c 6f 77 65 72 42 69 74 73 20 3d 3d 20 49 4e  (lowerBits == IN
157c0 56 41 4c 49 44 5f 46 49 4c 45 5f 53 49 5a 45 29  VALID_FILE_SIZE)
157d0 0a 20 20 20 20 20 20 20 26 26 20 28 28 6c 61 73  .       && ((las
157e0 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
157f0 73 74 45 72 72 6f 72 28 29 29 21 3d 4e 4f 5f 45  stError())!=NO_E
15800 52 52 4f 52 29 20 29 7b 0a 20 20 20 20 20 20 70  RROR) ){.      p
15810 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
15820 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20  = lastErrno;.   
15830 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72     rc = winLogEr
15840 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
15850 5f 46 53 54 41 54 2c 20 70 46 69 6c 65 2d 3e 6c  _FSTAT, pFile->l
15860 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
15870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15880 20 22 77 69 6e 46 69 6c 65 53 69 7a 65 22 2c 20   "winFileSize", 
15890 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
158a0 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
158b0 20 20 4f 53 54 52 41 43 45 28 28 22 53 49 5a 45    OSTRACE(("SIZE
158c0 20 66 69 6c 65 3d 25 70 2c 20 70 53 69 7a 65 3d   file=%p, pSize=
158d0 25 70 2c 20 2a 70 53 69 7a 65 3d 25 6c 6c 64 2c  %p, *pSize=%lld,
158e0 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20   rc=%s\n",.     
158f0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20        pFile->h, 
15900 70 53 69 7a 65 2c 20 2a 70 53 69 7a 65 2c 20 73  pSize, *pSize, s
15910 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63  qlite3ErrName(rc
15920 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  )));.  return rc
15930 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 4f 43 4b 46  ;.}../*.** LOCKF
15940 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41  ILE_FAIL_IMMEDIA
15950 54 45 4c 59 20 69 73 20 75 6e 64 65 66 69 6e 65  TELY is undefine
15960 64 20 6f 6e 20 73 6f 6d 65 20 57 69 6e 64 6f 77  d on some Window
15970 73 20 73 79 73 74 65 6d 73 2e 0a 2a 2f 0a 23 69  s systems..*/.#i
15980 66 6e 64 65 66 20 4c 4f 43 4b 46 49 4c 45 5f 46  fndef LOCKFILE_F
15990 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 0a  AIL_IMMEDIATELY.
159a0 23 20 64 65 66 69 6e 65 20 4c 4f 43 4b 46 49 4c  # define LOCKFIL
159b0 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45  E_FAIL_IMMEDIATE
159c0 4c 59 20 31 0a 23 65 6e 64 69 66 0a 0a 23 69 66  LY 1.#endif..#if
159d0 6e 64 65 66 20 4c 4f 43 4b 46 49 4c 45 5f 45 58  ndef LOCKFILE_EX
159e0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 23 20 64  CLUSIVE_LOCK.# d
159f0 65 66 69 6e 65 20 4c 4f 43 4b 46 49 4c 45 5f 45  efine LOCKFILE_E
15a00 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 32 0a  XCLUSIVE_LOCK 2.
15a10 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 48 69  #endif../*.** Hi
15a20 73 74 6f 72 69 63 61 6c 6c 79 2c 20 53 51 4c 69  storically, SQLi
15a30 74 65 20 68 61 73 20 75 73 65 64 20 62 6f 74 68  te has used both
15a40 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 20 61 6e   the LockFile an
15a50 64 20 4c 6f 63 6b 46 69 6c 65 45 78 20 66 75 6e  d LockFileEx fun
15a60 63 74 69 6f 6e 73 2e 0a 2a 2a 20 57 68 65 6e 20  ctions..** When 
15a70 74 68 65 20 4c 6f 63 6b 46 69 6c 65 20 66 75 6e  the LockFile fun
15a80 63 74 69 6f 6e 20 77 61 73 20 75 73 65 64 2c 20  ction was used, 
15a90 69 74 20 77 61 73 20 61 6c 77 61 79 73 20 65 78  it was always ex
15aa0 70 65 63 74 65 64 20 74 6f 20 66 61 69 6c 0a 2a  pected to fail.*
15ab0 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 69 66  * immediately if
15ac0 20 74 68 65 20 6c 6f 63 6b 20 63 6f 75 6c 64 20   the lock could 
15ad0 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2e  not be obtained.
15ae0 20 20 41 6c 73 6f 2c 20 69 74 20 61 6c 77 61 79    Also, it alway
15af0 73 20 65 78 70 65 63 74 65 64 20 74 6f 0a 2a 2a  s expected to.**
15b00 20 6f 62 74 61 69 6e 20 61 6e 20 65 78 63 6c 75   obtain an exclu
15b10 73 69 76 65 20 6c 6f 63 6b 2e 20 20 54 68 65 73  sive lock.  Thes
15b20 65 20 66 6c 61 67 73 20 61 72 65 20 75 73 65 64  e flags are used
15b30 20 77 69 74 68 20 74 68 65 20 4c 6f 63 6b 46 69   with the LockFi
15b40 6c 65 45 78 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  leEx function.**
15b50 20 61 6e 64 20 72 65 66 6c 65 63 74 20 74 68 6f   and reflect tho
15b60 73 65 20 65 78 70 65 63 74 61 74 69 6f 6e 73 3b  se expectations;
15b70 20 74 68 65 72 65 66 6f 72 65 2c 20 74 68 65 79   therefore, they
15b80 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63   should not be c
15b90 68 61 6e 67 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64  hanged..*/.#ifnd
15ba0 65 66 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49  ef SQLITE_LOCKFI
15bb0 4c 45 5f 46 4c 41 47 53 0a 23 20 64 65 66 69 6e  LE_FLAGS.# defin
15bc0 65 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c  e SQLITE_LOCKFIL
15bd0 45 5f 46 4c 41 47 53 20 20 20 28 4c 4f 43 4b 46  E_FLAGS   (LOCKF
15be0 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41  ILE_FAIL_IMMEDIA
15bf0 54 45 4c 59 20 7c 20 5c 0a 20 20 20 20 20 20 20  TELY | \.       
15c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c10 20 20 20 20 20 20 20 20 20 20 20 4c 4f 43 4b 46             LOCKF
15c20 49 4c 45 5f 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ILE_EXCLUSIVE_LO
15c30 43 4b 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  CK).#endif../*.*
15c40 2a 20 43 75 72 72 65 6e 74 6c 79 2c 20 53 51 4c  * Currently, SQL
15c50 69 74 65 20 6e 65 76 65 72 20 63 61 6c 6c 73 20  ite never calls 
15c60 74 68 65 20 4c 6f 63 6b 46 69 6c 65 45 78 20 66  the LockFileEx f
15c70 75 6e 63 74 69 6f 6e 20 77 69 74 68 6f 75 74 20  unction without 
15c80 77 61 6e 74 69 6e 67 20 74 68 65 0a 2a 2a 20 63  wanting the.** c
15c90 61 6c 6c 20 74 6f 20 66 61 69 6c 20 69 6d 6d 65  all to fail imme
15ca0 64 69 61 74 65 6c 79 20 69 66 20 74 68 65 20 6c  diately if the l
15cb0 6f 63 6b 20 63 61 6e 6e 6f 74 20 62 65 20 6f 62  ock cannot be ob
15cc0 74 61 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64  tained..*/.#ifnd
15cd0 65 66 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49  ef SQLITE_LOCKFI
15ce0 4c 45 45 58 5f 46 4c 41 47 53 0a 23 20 64 65 66  LEEX_FLAGS.# def
15cf0 69 6e 65 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46  ine SQLITE_LOCKF
15d00 49 4c 45 45 58 5f 46 4c 41 47 53 20 28 4c 4f 43  ILEEX_FLAGS (LOC
15d10 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44  KFILE_FAIL_IMMED
15d20 49 41 54 45 4c 59 29 0a 23 65 6e 64 69 66 0a 0a  IATELY).#endif..
15d30 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20  /*.** Acquire a 
15d40 72 65 61 64 65 72 20 6c 6f 63 6b 2e 0a 2a 2a 20  reader lock..** 
15d50 44 69 66 66 65 72 65 6e 74 20 41 50 49 20 72 6f  Different API ro
15d60 75 74 69 6e 65 73 20 61 72 65 20 63 61 6c 6c 65  utines are calle
15d70 64 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77  d depending on w
15d80 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
15d90 69 73 0a 2a 2a 20 69 73 20 57 69 6e 39 78 20 6f  is.** is Win9x o
15da0 72 20 57 69 6e 4e 54 2e 0a 2a 2f 0a 73 74 61 74  r WinNT..*/.stat
15db0 69 63 20 69 6e 74 20 77 69 6e 47 65 74 52 65 61  ic int winGetRea
15dc0 64 4c 6f 63 6b 28 77 69 6e 46 69 6c 65 20 2a 70  dLock(winFile *p
15dd0 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20 72 65 73  File){.  int res
15de0 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52 45  ;.  OSTRACE(("RE
15df0 41 44 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c  AD-LOCK file=%p,
15e00 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20 70 46 69   lock=%d\n", pFi
15e10 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f  le->h, pFile->lo
15e20 63 6b 74 79 70 65 29 29 3b 0a 20 20 69 66 28 20  cktype));.  if( 
15e30 6f 73 49 73 4e 54 28 29 20 29 7b 0a 23 69 66 20  osIsNT() ){.#if 
15e40 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
15e50 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 4e 4f      /*.    ** NO
15e60 54 45 3a 20 57 69 6e 64 6f 77 73 20 43 45 20 69  TE: Windows CE i
15e70 73 20 68 61 6e 64 6c 65 64 20 64 69 66 66 65 72  s handled differ
15e80 65 6e 74 6c 79 20 68 65 72 65 20 64 75 65 20 69  ently here due i
15e90 74 73 20 6c 61 63 6b 20 6f 66 20 74 68 65 20 57  ts lack of the W
15ea0 69 6e 33 32 0a 20 20 20 20 2a 2a 20 20 20 20 20  in32.    **     
15eb0 20 20 41 50 49 20 4c 6f 63 6b 46 69 6c 65 45 78    API LockFileEx
15ec0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 73  ..    */.    res
15ed0 20 3d 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65   = winceLockFile
15ee0 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52  (&pFile->h, SHAR
15ef0 45 44 5f 46 49 52 53 54 2c 20 30 2c 20 31 2c 20  ED_FIRST, 0, 1, 
15f00 30 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 72 65  0);.#else.    re
15f10 73 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28  s = winLockFile(
15f20 26 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54  &pFile->h, SQLIT
15f30 45 5f 4c 4f 43 4b 46 49 4c 45 45 58 5f 46 4c 41  E_LOCKFILEEX_FLA
15f40 47 53 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54  GS, SHARED_FIRST
15f50 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
15f60 20 20 20 20 20 20 20 20 20 20 20 53 48 41 52 45             SHARE
15f70 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 23 65 6e 64  D_SIZE, 0);.#end
15f80 69 66 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51  if.  }.#ifdef SQ
15f90 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
15fa0 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20  NSI.  else{.    
15fb0 69 6e 74 20 6c 6b 3b 0a 20 20 20 20 73 71 6c 69  int lk;.    sqli
15fc0 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73  te3_randomness(s
15fd0 69 7a 65 6f 66 28 6c 6b 29 2c 20 26 6c 6b 29 3b  izeof(lk), &lk);
15fe0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72  .    pFile->shar
15ff0 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20 28 73 68  edLockByte = (sh
16000 6f 72 74 29 28 28 6c 6b 20 26 20 30 78 37 66 66  ort)((lk & 0x7ff
16010 66 66 66 66 66 29 25 28 53 48 41 52 45 44 5f 53  fffff)%(SHARED_S
16020 49 5a 45 20 2d 20 31 29 29 3b 0a 20 20 20 20 72  IZE - 1));.    r
16030 65 73 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65  es = winLockFile
16040 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49  (&pFile->h, SQLI
16050 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47  TE_LOCKFILE_FLAG
16060 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  S,.             
16070 20 20 20 20 20 20 20 20 20 53 48 41 52 45 44 5f           SHARED_
16080 46 49 52 53 54 2b 70 46 69 6c 65 2d 3e 73 68 61  FIRST+pFile->sha
16090 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 30 2c 20  redLockByte, 0, 
160a0 31 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  1, 0);.  }.#endi
160b0 66 0a 20 20 69 66 28 20 72 65 73 20 3d 3d 20 30  f.  if( res == 0
160c0 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c   ){.    pFile->l
160d0 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
160e0 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
160f0 20 2f 2a 20 4e 6f 20 6e 65 65 64 20 74 6f 20 6c   /* No need to l
16100 6f 67 20 61 20 66 61 69 6c 75 72 65 20 74 6f 20  og a failure to 
16110 6c 6f 63 6b 20 2a 2f 0a 20 20 7d 0a 20 20 4f 53  lock */.  }.  OS
16120 54 52 41 43 45 28 28 22 52 45 41 44 2d 4c 4f 43  TRACE(("READ-LOC
16130 4b 20 66 69 6c 65 3d 25 70 2c 20 72 65 73 75 6c  K file=%p, resul
16140 74 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  t=%d\n", pFile->
16150 68 2c 20 72 65 73 29 29 3b 0a 20 20 72 65 74 75  h, res));.  retu
16160 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn res;.}../*.**
16170 20 55 6e 64 6f 20 61 20 72 65 61 64 6c 6f 63 6b   Undo a readlock
16180 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
16190 69 6e 55 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b  inUnlockReadLock
161a0 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29  (winFile *pFile)
161b0 7b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 44  {.  int res;.  D
161c0 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a  WORD lastErrno;.
161d0 20 20 4f 53 54 52 41 43 45 28 28 22 52 45 41 44    OSTRACE(("READ
161e0 2d 55 4e 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c  -UNLOCK file=%p,
161f0 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20 70 46 69   lock=%d\n", pFi
16200 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f  le->h, pFile->lo
16210 63 6b 74 79 70 65 29 29 3b 0a 20 20 69 66 28 20  cktype));.  if( 
16220 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 20 20 20  osIsNT() ){.    
16230 72 65 73 20 3d 20 77 69 6e 55 6e 6c 6f 63 6b 46  res = winUnlockF
16240 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53  ile(&pFile->h, S
16250 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c 20  HARED_FIRST, 0, 
16260 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b  SHARED_SIZE, 0);
16270 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49  .  }.#ifdef SQLI
16280 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
16290 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 72 65  I.  else{.    re
162a0 73 20 3d 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c  s = winUnlockFil
162b0 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41  e(&pFile->h, SHA
162c0 52 45 44 5f 46 49 52 53 54 2b 70 46 69 6c 65 2d  RED_FIRST+pFile-
162d0 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c  >sharedLockByte,
162e0 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 23   0, 1, 0);.  }.#
162f0 65 6e 64 69 66 0a 20 20 69 66 28 20 72 65 73 3d  endif.  if( res=
16300 3d 30 20 26 26 20 28 28 6c 61 73 74 45 72 72 6e  =0 && ((lastErrn
16310 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
16320 6f 72 28 29 29 21 3d 45 52 52 4f 52 5f 4e 4f 54  or())!=ERROR_NOT
16330 5f 4c 4f 43 4b 45 44 29 20 29 7b 0a 20 20 20 20  _LOCKED) ){.    
16340 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
16350 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20   = lastErrno;.  
16360 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51    winLogError(SQ
16370 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
16380 4b 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  K, pFile->lastEr
16390 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
163a0 20 20 20 20 20 22 77 69 6e 55 6e 6c 6f 63 6b 52       "winUnlockR
163b0 65 61 64 4c 6f 63 6b 22 2c 20 70 46 69 6c 65 2d  eadLock", pFile-
163c0 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 20 20 4f  >zPath);.  }.  O
163d0 53 54 52 41 43 45 28 28 22 52 45 41 44 2d 55 4e  STRACE(("READ-UN
163e0 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 72 65  LOCK file=%p, re
163f0 73 75 6c 74 3d 25 64 5c 6e 22 2c 20 70 46 69 6c  sult=%d\n", pFil
16400 65 2d 3e 68 2c 20 72 65 73 29 29 3b 0a 20 20 72  e->h, res));.  r
16410 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a  eturn res;.}../*
16420 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c  .** Lock the fil
16430 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20  e with the lock 
16440 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72  specified by par
16450 61 6d 65 74 65 72 20 6c 6f 63 6b 74 79 70 65 20  ameter locktype 
16460 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20  - one.** of the 
16470 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
16480 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44 5f       (1) SHARED_
16490 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20  LOCK.**     (2) 
164a0 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a  RESERVED_LOCK.**
164b0 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47       (3) PENDING
164c0 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29  _LOCK.**     (4)
164d0 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a   EXCLUSIVE_LOCK.
164e0 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20  **.** Sometimes 
164f0 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20  when requesting 
16500 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20  one lock state, 
16510 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20  additional lock 
16520 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e  states.** are in
16530 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65 65  serted in betwee
16540 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20  n.  The locking 
16550 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e  might fail on on
16560 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a  e of the later.*
16570 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65  * transitions le
16580 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73  aving the lock s
16590 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20 66  tate different f
165a0 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61 72  rom what it star
165b0 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c  ted but.** still
165c0 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f   short of its go
165d0 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  al.  The followi
165e0 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20 74  ng chart shows t
165f0 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72  he allowed.** tr
16600 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68  ansitions and th
16610 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72  e inserted inter
16620 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a  mediate states:.
16630 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45  **.**    UNLOCKE
16640 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20  D -> SHARED.**  
16650 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45    SHARED -> RESE
16660 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  RVED.**    SHARE
16670 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
16680 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
16690 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50    RESERVED -> (P
166a0 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
166b0 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49  SIVE.**    PENDI
166c0 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  NG -> EXCLUSIVE.
166d0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
166e0 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63  ne will only inc
166f0 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 54  rease a lock.  T
16700 68 65 20 77 69 6e 55 6e 6c 6f 63 6b 28 29 20 72  he winUnlock() r
16710 6f 75 74 69 6e 65 0a 2a 2a 20 65 72 61 73 65 73  outine.** erases
16720 20 61 6c 6c 20 6c 6f 63 6b 73 20 61 74 20 6f 6e   all locks at on
16730 63 65 20 61 6e 64 20 72 65 74 75 72 6e 73 20 75  ce and returns u
16740 73 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f  s immediately to
16750 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 30   locking level 0
16760 2e 0a 2a 2a 20 49 74 20 69 73 20 6e 6f 74 20 70  ..** It is not p
16770 6f 73 73 69 62 6c 65 20 74 6f 20 6c 6f 77 65 72  ossible to lower
16780 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
16790 65 6c 20 6f 6e 65 20 73 74 65 70 20 61 74 20 61  el one step at a
167a0 20 74 69 6d 65 2e 20 20 59 6f 75 0a 2a 2a 20 6d   time.  You.** m
167b0 75 73 74 20 67 6f 20 73 74 72 61 69 67 68 74 20  ust go straight 
167c0 74 6f 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  to locking level
167d0 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e   0..*/.static in
167e0 74 20 77 69 6e 4c 6f 63 6b 28 73 71 6c 69 74 65  t winLock(sqlite
167f0 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
16800 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74  locktype){.  int
16810 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
16820 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
16830 64 65 20 66 72 6f 6d 20 73 75 62 72 6f 75 74 69  de from subrouti
16840 6e 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73  nes */.  int res
16850 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20   = 1;           
16860 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20 61 20 57  /* Result of a W
16870 69 6e 64 6f 77 73 20 6c 6f 63 6b 20 63 61 6c 6c  indows lock call
16880 20 2a 2f 0a 20 20 69 6e 74 20 6e 65 77 4c 6f 63   */.  int newLoc
16890 6b 74 79 70 65 3b 20 20 20 20 20 20 20 2f 2a 20  ktype;       /* 
168a0 53 65 74 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  Set pFile->lockt
168b0 79 70 65 20 74 6f 20 74 68 69 73 20 76 61 6c 75  ype to this valu
168c0 65 20 62 65 66 6f 72 65 20 65 78 69 74 69 6e 67  e before exiting
168d0 20 2a 2f 0a 20 20 69 6e 74 20 67 6f 74 50 65 6e   */.  int gotPen
168e0 64 69 6e 67 4c 6f 63 6b 20 3d 20 30 3b 2f 2a 20  dingLock = 0;/* 
168f0 54 72 75 65 20 69 66 20 77 65 20 61 63 71 75 69  True if we acqui
16900 72 65 64 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f  red a PENDING lo
16910 63 6b 20 74 68 69 73 20 74 69 6d 65 20 2a 2f 0a  ck this time */.
16920 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65    winFile *pFile
16930 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b   = (winFile*)id;
16940 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72  .  DWORD lastErr
16950 6e 6f 20 3d 20 4e 4f 5f 45 52 52 4f 52 3b 0a 0a  no = NO_ERROR;..
16960 20 20 61 73 73 65 72 74 28 20 69 64 21 3d 30 20    assert( id!=0 
16970 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c  );.  OSTRACE(("L
16980 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6f 6c 64  OCK file=%p, old
16990 4c 6f 63 6b 3d 25 64 28 25 64 29 2c 20 6e 65 77  Lock=%d(%d), new
169a0 4c 6f 63 6b 3d 25 64 5c 6e 22 2c 0a 20 20 20 20  Lock=%d\n",.    
169b0 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c         pFile->h,
169c0 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
169d0 2c 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c  , pFile->sharedL
169e0 6f 63 6b 42 79 74 65 2c 20 6c 6f 63 6b 74 79 70  ockByte, locktyp
169f0 65 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  e));..  /* If th
16a00 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61  ere is already a
16a10 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20 74 79   lock of this ty
16a20 70 65 20 6f 72 20 6d 6f 72 65 20 72 65 73 74 72  pe or more restr
16a30 69 63 74 69 76 65 20 6f 6e 20 74 68 65 0a 20 20  ictive on the.  
16a40 2a 2a 20 4f 73 46 69 6c 65 2c 20 64 6f 20 6e 6f  ** OsFile, do no
16a50 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65  thing. Don't use
16a60 20 74 68 65 20 65 6e 64 5f 6c 6f 63 6b 3a 20 65   the end_lock: e
16a70 78 69 74 20 70 61 74 68 2c 20 61 73 0a 20 20 2a  xit path, as.  *
16a80 2a 20 73 71 6c 69 74 65 33 4f 73 45 6e 74 65 72  * sqlite3OsEnter
16a90 4d 75 74 65 78 28 29 20 68 61 73 6e 27 74 20 62  Mutex() hasn't b
16aa0 65 65 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a  een called yet..
16ab0 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65    */.  if( pFile
16ac0 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 6c 6f 63 6b  ->locktype>=lock
16ad0 74 79 70 65 20 29 7b 0a 20 20 20 20 4f 53 54 52  type ){.    OSTR
16ae0 41 43 45 28 28 22 4c 4f 43 4b 2d 48 45 4c 44 20  ACE(("LOCK-HELD 
16af0 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49  file=%p, rc=SQLI
16b00 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d  TE_OK\n", pFile-
16b10 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  >h));.    return
16b20 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
16b30 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
16b40 74 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75  the locking sequ
16b50 65 6e 63 65 20 69 73 20 63 6f 72 72 65 63 74 0a  ence is correct.
16b60 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
16b70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d  File->locktype!=
16b80 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 6c 6f 63 6b 74  NO_LOCK || lockt
16b90 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype==SHARED_LOCK
16ba0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f   );.  assert( lo
16bb0 63 6b 74 79 70 65 21 3d 50 45 4e 44 49 4e 47 5f  cktype!=PENDING_
16bc0 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
16bd0 28 20 6c 6f 63 6b 74 79 70 65 21 3d 52 45 53 45  ( locktype!=RESE
16be0 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69  RVED_LOCK || pFi
16bf0 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53 48  le->locktype==SH
16c00 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20  ARED_LOCK );..  
16c10 2f 2a 20 4c 6f 63 6b 20 74 68 65 20 50 45 4e 44  /* Lock the PEND
16c20 49 4e 47 5f 4c 4f 43 4b 20 62 79 74 65 20 69 66  ING_LOCK byte if
16c30 20 77 65 20 6e 65 65 64 20 74 6f 20 61 63 71 75   we need to acqu
16c40 69 72 65 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f  ire a PENDING lo
16c50 63 6b 20 6f 72 0a 20 20 2a 2a 20 61 20 53 48 41  ck or.  ** a SHA
16c60 52 45 44 20 6c 6f 63 6b 2e 20 20 49 66 20 77 65  RED lock.  If we
16c70 20 61 72 65 20 61 63 71 75 69 72 69 6e 67 20 61   are acquiring a
16c80 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68   SHARED lock, th
16c90 65 20 61 63 71 75 69 73 69 74 69 6f 6e 20 6f 66  e acquisition of
16ca0 0a 20 20 2a 2a 20 74 68 65 20 50 45 4e 44 49 4e  .  ** the PENDIN
16cb0 47 5f 4c 4f 43 4b 20 62 79 74 65 20 69 73 20 74  G_LOCK byte is t
16cc0 65 6d 70 6f 72 61 72 79 2e 0a 20 20 2a 2f 0a 20  emporary..  */. 
16cd0 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 70   newLocktype = p
16ce0 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a  File->locktype;.
16cf0 20 20 69 66 28 20 20 20 28 70 46 69 6c 65 2d 3e    if(   (pFile->
16d00 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43  locktype==NO_LOC
16d10 4b 29 0a 20 20 20 20 20 7c 7c 20 28 20 20 20 28  K).     || (   (
16d20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53  locktype==EXCLUS
16d30 49 56 45 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20  IVE_LOCK).      
16d40 20 20 20 26 26 20 28 70 46 69 6c 65 2d 3e 6c 6f     && (pFile->lo
16d50 63 6b 74 79 70 65 3d 3d 52 45 53 45 52 56 45 44  cktype==RESERVED
16d60 5f 4c 4f 43 4b 29 29 0a 20 20 29 7b 0a 20 20 20  _LOCK)).  ){.   
16d70 20 69 6e 74 20 63 6e 74 20 3d 20 33 3b 0a 20 20   int cnt = 3;.  
16d80 20 20 77 68 69 6c 65 28 20 63 6e 74 2d 2d 3e 30    while( cnt-->0
16d90 20 26 26 20 28 72 65 73 20 3d 20 77 69 6e 4c 6f   && (res = winLo
16da0 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68  ckFile(&pFile->h
16db0 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c  , SQLITE_LOCKFIL
16dc0 45 5f 46 4c 41 47 53 2c 0a 20 20 20 20 20 20 20  E_FLAGS,.       
16dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16df0 20 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20    PENDING_BYTE, 
16e00 30 2c 20 31 2c 20 30 29 29 3d 3d 30 20 29 7b 0a  0, 1, 0))==0 ){.
16e10 20 20 20 20 20 20 2f 2a 20 54 72 79 20 33 20 74        /* Try 3 t
16e20 69 6d 65 73 20 74 6f 20 67 65 74 20 74 68 65 20  imes to get the 
16e30 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 2e 20 20 54  pending lock.  T
16e40 68 69 73 20 69 73 20 6e 65 65 64 65 64 20 74 6f  his is needed to
16e50 20 77 6f 72 6b 0a 20 20 20 20 20 20 2a 2a 20 61   work.      ** a
16e60 72 6f 75 6e 64 20 70 72 6f 62 6c 65 6d 73 20 63  round problems c
16e70 61 75 73 65 64 20 62 79 20 69 6e 64 65 78 69 6e  aused by indexin
16e80 67 20 61 6e 64 2f 6f 72 20 61 6e 74 69 2d 76 69  g and/or anti-vi
16e90 72 75 73 20 73 6f 66 74 77 61 72 65 20 6f 6e 0a  rus software on.
16ea0 20 20 20 20 20 20 2a 2a 20 57 69 6e 64 6f 77 73        ** Windows
16eb0 20 73 79 73 74 65 6d 73 2e 0a 20 20 20 20 20 20   systems..      
16ec0 2a 2a 20 49 66 20 79 6f 75 20 61 72 65 20 75 73  ** If you are us
16ed0 69 6e 67 20 74 68 69 73 20 63 6f 64 65 20 61 73  ing this code as
16ee0 20 61 20 6d 6f 64 65 6c 20 66 6f 72 20 61 6c 74   a model for alt
16ef0 65 72 6e 61 74 69 76 65 20 56 46 53 65 73 2c 20  ernative VFSes, 
16f00 64 6f 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20  do not.      ** 
16f10 63 6f 70 79 20 74 68 69 73 20 72 65 74 72 79 20  copy this retry 
16f20 6c 6f 67 69 63 2e 20 20 49 74 20 69 73 20 61 20  logic.  It is a 
16f30 68 61 63 6b 20 69 6e 74 65 6e 64 65 64 20 66 6f  hack intended fo
16f40 72 20 57 69 6e 64 6f 77 73 20 6f 6e 6c 79 2e 0a  r Windows only..
16f50 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 6c        */.      l
16f60 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
16f70 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
16f80 20 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43     OSTRACE(("LOC
16f90 4b 2d 50 45 4e 44 49 4e 47 2d 46 41 49 4c 20 66  K-PENDING-FAIL f
16fa0 69 6c 65 3d 25 70 2c 20 63 6f 75 6e 74 3d 25 64  ile=%p, count=%d
16fb0 2c 20 72 65 73 75 6c 74 3d 25 64 5c 6e 22 2c 0a  , result=%d\n",.
16fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
16fd0 46 69 6c 65 2d 3e 68 2c 20 63 6e 74 2c 20 72 65  File->h, cnt, re
16fe0 73 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6c  s));.      if( l
16ff0 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f  astErrno==ERROR_
17000 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 20 29  INVALID_HANDLE )
17010 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  {.        pFile-
17020 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73  >lastErrno = las
17030 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20  tErrno;.        
17040 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
17050 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20  R_LOCK;.        
17060 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 2d 46  OSTRACE(("LOCK-F
17070 41 49 4c 20 66 69 6c 65 3d 25 70 2c 20 63 6f 75  AIL file=%p, cou
17080 6e 74 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22 2c  nt=%d, rc=%s\n",
17090 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
170a0 20 20 70 46 69 6c 65 2d 3e 68 2c 20 63 6e 74 2c    pFile->h, cnt,
170b0 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28   sqlite3ErrName(
170c0 72 63 29 29 29 3b 0a 20 20 20 20 20 20 20 20 72  rc)));.        r
170d0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
170e0 7d 0a 20 20 20 20 20 20 69 66 28 20 63 6e 74 20  }.      if( cnt 
170f0 29 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  ) sqlite3_win32_
17100 73 6c 65 65 70 28 31 29 3b 0a 20 20 20 20 7d 0a  sleep(1);.    }.
17110 20 20 20 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f      gotPendingLo
17120 63 6b 20 3d 20 72 65 73 3b 0a 20 20 20 20 69 66  ck = res;.    if
17130 28 20 21 72 65 73 20 29 7b 0a 20 20 20 20 20 20  ( !res ){.      
17140 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
17150 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
17160 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63    }.  }..  /* Ac
17170 71 75 69 72 65 20 61 20 73 68 61 72 65 64 20 6c  quire a shared l
17180 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c  ock.  */.  if( l
17190 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f  ocktype==SHARED_
171a0 4c 4f 43 4b 20 26 26 20 72 65 73 20 29 7b 0a 20  LOCK && res ){. 
171b0 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65     assert( pFile
171c0 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c  ->locktype==NO_L
171d0 4f 43 4b 20 29 3b 0a 20 20 20 20 72 65 73 20 3d  OCK );.    res =
171e0 20 77 69 6e 47 65 74 52 65 61 64 4c 6f 63 6b 28   winGetReadLock(
171f0 70 46 69 6c 65 29 3b 0a 20 20 20 20 69 66 28 20  pFile);.    if( 
17200 72 65 73 20 29 7b 0a 20 20 20 20 20 20 6e 65 77  res ){.      new
17210 4c 6f 63 6b 74 79 70 65 20 3d 20 53 48 41 52 45  Locktype = SHARE
17220 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73  D_LOCK;.    }els
17230 65 7b 0a 20 20 20 20 20 20 6c 61 73 74 45 72 72  e{.      lastErr
17240 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
17250 72 6f 72 28 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ror();.    }.  }
17260 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61  ..  /* Acquire a
17270 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 0a 20   RESERVED lock. 
17280 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79   */.  if( lockty
17290 70 65 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  pe==RESERVED_LOC
172a0 4b 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20  K && res ){.    
172b0 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c  assert( pFile->l
172c0 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f  ocktype==SHARED_
172d0 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 65 73 20  LOCK );.    res 
172e0 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70  = winLockFile(&p
172f0 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f  File->h, SQLITE_
17300 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53 2c 20  LOCKFILE_FLAGS, 
17310 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 30  RESERVED_BYTE, 0
17320 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 1, 0);.    if(
17330 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20 6e 65   res ){.      ne
17340 77 4c 6f 63 6b 74 79 70 65 20 3d 20 52 45 53 45  wLocktype = RESE
17350 52 56 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d  RVED_LOCK;.    }
17360 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c 61 73 74  else{.      last
17370 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
17380 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 7d 0a  tError();.    }.
17390 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72    }..  /* Acquir
173a0 65 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  e a PENDING lock
173b0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b  .  */.  if( lock
173c0 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f  type==EXCLUSIVE_
173d0 4c 4f 43 4b 20 26 26 20 72 65 73 20 29 7b 0a 20  LOCK && res ){. 
173e0 20 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d     newLocktype =
173f0 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20   PENDING_LOCK;. 
17400 20 20 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63     gotPendingLoc
17410 6b 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  k = 0;.  }..  /*
17420 20 41 63 71 75 69 72 65 20 61 6e 20 45 58 43 4c   Acquire an EXCL
17430 55 53 49 56 45 20 6c 6f 63 6b 0a 20 20 2a 2f 0a  USIVE lock.  */.
17440 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d    if( locktype==
17450 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26  EXCLUSIVE_LOCK &
17460 26 20 72 65 73 20 29 7b 0a 20 20 20 20 61 73 73  & res ){.    ass
17470 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ert( pFile->lock
17480 74 79 70 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43  type>=SHARED_LOC
17490 4b 20 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 77  K );.    res = w
174a0 69 6e 55 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b  inUnlockReadLock
174b0 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 72 65 73  (pFile);.    res
174c0 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26   = winLockFile(&
174d0 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45  pFile->h, SQLITE
174e0 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53 2c  _LOCKFILE_FLAGS,
174f0 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30   SHARED_FIRST, 0
17500 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
17510 20 20 20 20 20 20 20 20 53 48 41 52 45 44 5f 53          SHARED_S
17520 49 5a 45 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  IZE, 0);.    if(
17530 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20 6e 65   res ){.      ne
17540 77 4c 6f 63 6b 74 79 70 65 20 3d 20 45 58 43 4c  wLocktype = EXCL
17550 55 53 49 56 45 5f 4c 4f 43 4b 3b 0a 20 20 20 20  USIVE_LOCK;.    
17560 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c 61 73  }else{.      las
17570 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
17580 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20  stError();.     
17590 20 77 69 6e 47 65 74 52 65 61 64 4c 6f 63 6b 28   winGetReadLock(
175a0 70 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pFile);.    }.  
175b0 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 61 72  }..  /* If we ar
175c0 65 20 68 6f 6c 64 69 6e 67 20 61 20 50 45 4e 44  e holding a PEND
175d0 49 4e 47 20 6c 6f 63 6b 20 74 68 61 74 20 6f 75  ING lock that ou
175e0 67 68 74 20 74 6f 20 62 65 20 72 65 6c 65 61 73  ght to be releas
175f0 65 64 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 72 65  ed, then.  ** re
17600 6c 65 61 73 65 20 69 74 20 6e 6f 77 2e 0a 20 20  lease it now..  
17610 2a 2f 0a 20 20 69 66 28 20 67 6f 74 50 65 6e 64  */.  if( gotPend
17620 69 6e 67 4c 6f 63 6b 20 26 26 20 6c 6f 63 6b 74  ingLock && lockt
17630 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype==SHARED_LOCK
17640 20 29 7b 0a 20 20 20 20 77 69 6e 55 6e 6c 6f 63   ){.    winUnloc
17650 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c  kFile(&pFile->h,
17660 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 30   PENDING_BYTE, 0
17670 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20  , 1, 0);.  }..  
17680 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 73 74  /* Update the st
17690 61 74 65 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20  ate of the lock 
176a0 68 61 73 20 68 65 6c 64 20 69 6e 20 74 68 65 20  has held in the 
176b0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
176c0 74 68 65 6e 0a 20 20 2a 2a 20 72 65 74 75 72 6e  then.  ** return
176d0 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
176e0 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 0a 20 20   result code..  
176f0 2a 2f 0a 20 20 69 66 28 20 72 65 73 20 29 7b 0a  */.  if( res ){.
17700 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
17710 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OK;.  }else{.   
17720 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
17730 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20  o = lastErrno;. 
17740 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
17750 55 53 59 3b 0a 20 20 20 20 4f 53 54 52 41 43 45  USY;.    OSTRACE
17760 28 28 22 4c 4f 43 4b 2d 46 41 49 4c 20 66 69 6c  (("LOCK-FAIL fil
17770 65 3d 25 70 2c 20 77 61 6e 74 65 64 3d 25 64 2c  e=%p, wanted=%d,
17780 20 67 6f 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20   got=%d\n",.    
17790 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
177a0 68 2c 20 6c 6f 63 6b 74 79 70 65 2c 20 6e 65 77  h, locktype, new
177b0 4c 6f 63 6b 74 79 70 65 29 29 3b 0a 20 20 7d 0a  Locktype));.  }.
177c0 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70    pFile->locktyp
177d0 65 20 3d 20 28 75 38 29 6e 65 77 4c 6f 63 6b 74  e = (u8)newLockt
177e0 79 70 65 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  ype;.  OSTRACE((
177f0 22 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6c  "LOCK file=%p, l
17800 6f 63 6b 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22  ock=%d, rc=%s\n"
17810 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69  ,.           pFi
17820 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f  le->h, pFile->lo
17830 63 6b 74 79 70 65 2c 20 73 71 6c 69 74 65 33 45  cktype, sqlite3E
17840 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20  rrName(rc)));.  
17850 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
17860 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
17870 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65   checks if there
17880 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c   is a RESERVED l
17890 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20  ock held on the 
178a0 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c  specified.** fil
178b0 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79  e by this or any
178c0 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20   other process. 
178d0 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69  If such a lock i
178e0 73 20 68 65 6c 64 2c 20 72 65 74 75 72 6e 0a 2a  s held, return.*
178f0 2a 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 6f 74 68 65  * non-zero, othe
17900 72 77 69 73 65 20 7a 65 72 6f 2e 0a 2a 2f 0a 73  rwise zero..*/.s
17910 74 61 74 69 63 20 69 6e 74 20 77 69 6e 43 68 65  tatic int winChe
17920 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73  ckReservedLock(s
17930 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
17940 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a   int *pResOut){.
17950 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 77 69 6e    int res;.  win
17960 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77  File *pFile = (w
17970 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53  inFile*)id;..  S
17980 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
17990 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
179a0 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45  ERR_CHECKRESERVE
179b0 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 4f 53 54 52  DLOCK; );.  OSTR
179c0 41 43 45 28 28 22 54 45 53 54 2d 57 52 2d 4c 4f  ACE(("TEST-WR-LO
179d0 43 4b 20 66 69 6c 65 3d 25 70 2c 20 70 52 65 73  CK file=%p, pRes
179e0 4f 75 74 3d 25 70 5c 6e 22 2c 20 70 46 69 6c 65  Out=%p\n", pFile
179f0 2d 3e 68 2c 20 70 52 65 73 4f 75 74 29 29 3b 0a  ->h, pResOut));.
17a00 0a 20 20 61 73 73 65 72 74 28 20 69 64 21 3d 30  .  assert( id!=0
17a10 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   );.  if( pFile-
17a20 3e 6c 6f 63 6b 74 79 70 65 3e 3d 52 45 53 45 52  >locktype>=RESER
17a30 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  VED_LOCK ){.    
17a40 72 65 73 20 3d 20 31 3b 0a 20 20 20 20 4f 53 54  res = 1;.    OST
17a50 52 41 43 45 28 28 22 54 45 53 54 2d 57 52 2d 4c  RACE(("TEST-WR-L
17a60 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 72 65 73  OCK file=%p, res
17a70 75 6c 74 3d 25 64 20 28 6c 6f 63 61 6c 29 5c 6e  ult=%d (local)\n
17a80 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 65 73  ", pFile->h, res
17a90 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ));.  }else{.   
17aa0 20 72 65 73 20 3d 20 77 69 6e 4c 6f 63 6b 46 69   res = winLockFi
17ab0 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 51  le(&pFile->h, SQ
17ac0 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 45 58 5f  LITE_LOCKFILEEX_
17ad0 46 4c 41 47 53 2c 52 45 53 45 52 56 45 44 5f 42  FLAGS,RESERVED_B
17ae0 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20  YTE, 0, 1, 0);. 
17af0 20 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20     if( res ){.  
17b00 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c      winUnlockFil
17b10 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 52 45 53  e(&pFile->h, RES
17b20 45 52 56 45 44 5f 42 59 54 45 2c 20 30 2c 20 31  ERVED_BYTE, 0, 1
17b30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
17b40 72 65 73 20 3d 20 21 72 65 73 3b 0a 20 20 20 20  res = !res;.    
17b50 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 2d 57  OSTRACE(("TEST-W
17b60 52 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20  R-LOCK file=%p, 
17b70 72 65 73 75 6c 74 3d 25 64 20 28 72 65 6d 6f 74  result=%d (remot
17b80 65 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  e)\n", pFile->h,
17b90 20 72 65 73 29 29 3b 0a 20 20 7d 0a 20 20 2a 70   res));.  }.  *p
17ba0 52 65 73 4f 75 74 20 3d 20 72 65 73 3b 0a 20 20  ResOut = res;.  
17bb0 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 2d 57  OSTRACE(("TEST-W
17bc0 52 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20  R-LOCK file=%p, 
17bd0 70 52 65 73 4f 75 74 3d 25 70 2c 20 2a 70 52 65  pResOut=%p, *pRe
17be0 73 4f 75 74 3d 25 64 2c 20 72 63 3d 53 51 4c 49  sOut=%d, rc=SQLI
17bf0 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20  TE_OK\n",.      
17c00 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70       pFile->h, p
17c10 52 65 73 4f 75 74 2c 20 2a 70 52 65 73 4f 75 74  ResOut, *pResOut
17c20 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ));.  return SQL
17c30 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
17c40 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69   Lower the locki
17c50 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65  ng level on file
17c60 20 64 65 73 63 72 69 70 74 6f 72 20 69 64 20 74   descriptor id t
17c70 6f 20 6c 6f 63 6b 74 79 70 65 2e 20 20 6c 6f 63  o locktype.  loc
17c80 6b 74 79 70 65 0a 2a 2a 20 6d 75 73 74 20 62 65  ktype.** must be
17c90 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20   either NO_LOCK 
17ca0 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a  or SHARED_LOCK..
17cb0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63  **.** If the loc
17cc0 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68  king level of th
17cd0 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
17ce0 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20  r is already at 
17cf0 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20  or below.** the 
17d00 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e  requested lockin
17d10 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f  g level, this ro
17d20 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
17d30 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 6e 6f  ..**.** It is no
17d40 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74  t possible for t
17d50 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 20 66  his routine to f
17d60 61 69 6c 20 69 66 20 74 68 65 20 73 65 63 6f 6e  ail if the secon
17d70 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73  d argument.** is
17d80 20 4e 4f 5f 4c 4f 43 4b 2e 20 20 49 66 20 74 68   NO_LOCK.  If th
17d90 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
17da0 74 20 69 73 20 53 48 41 52 45 44 5f 4c 4f 43 4b  t is SHARED_LOCK
17db0 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
17dc0 6e 65 0a 2a 2a 20 6d 69 67 68 74 20 72 65 74 75  ne.** might retu
17dd0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b  rn SQLITE_IOERR;
17de0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
17df0 69 6e 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33  inUnlock(sqlite3
17e00 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c  _file *id, int l
17e10 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74 20  ocktype){.  int 
17e20 74 79 70 65 3b 0a 20 20 77 69 6e 46 69 6c 65 20  type;.  winFile 
17e30 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c  *pFile = (winFil
17e40 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72 63 20  e*)id;.  int rc 
17e50 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61  = SQLITE_OK;.  a
17e60 73 73 65 72 74 28 20 70 46 69 6c 65 21 3d 30 20  ssert( pFile!=0 
17e70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63  );.  assert( loc
17e80 6b 74 79 70 65 3c 3d 53 48 41 52 45 44 5f 4c 4f  ktype<=SHARED_LO
17e90 43 4b 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  CK );.  OSTRACE(
17ea0 28 22 55 4e 4c 4f 43 4b 20 66 69 6c 65 3d 25 70  ("UNLOCK file=%p
17eb0 2c 20 6f 6c 64 4c 6f 63 6b 3d 25 64 28 25 64 29  , oldLock=%d(%d)
17ec0 2c 20 6e 65 77 4c 6f 63 6b 3d 25 64 5c 6e 22 2c  , newLock=%d\n",
17ed0 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c  .           pFil
17ee0 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63  e->h, pFile->loc
17ef0 6b 74 79 70 65 2c 20 70 46 69 6c 65 2d 3e 73 68  ktype, pFile->sh
17f00 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 6c 6f  aredLockByte, lo
17f10 63 6b 74 79 70 65 29 29 3b 0a 20 20 74 79 70 65  cktype));.  type
17f20 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79   = pFile->lockty
17f30 70 65 3b 0a 20 20 69 66 28 20 74 79 70 65 3e 3d  pe;.  if( type>=
17f40 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
17f50 7b 0a 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 46  {.    winUnlockF
17f60 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53  ile(&pFile->h, S
17f70 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c 20  HARED_FIRST, 0, 
17f80 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b  SHARED_SIZE, 0);
17f90 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 74 79 70  .    if( locktyp
17fa0 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26  e==SHARED_LOCK &
17fb0 26 20 21 77 69 6e 47 65 74 52 65 61 64 4c 6f 63  & !winGetReadLoc
17fc0 6b 28 70 46 69 6c 65 29 20 29 7b 0a 20 20 20 20  k(pFile) ){.    
17fd0 20 20 2f 2a 20 54 68 69 73 20 73 68 6f 75 6c 64    /* This should
17fe0 20 6e 65 76 65 72 20 68 61 70 70 65 6e 2e 20 20   never happen.  
17ff0 57 65 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73  We should always
18000 20 62 65 20 61 62 6c 65 20 74 6f 0a 20 20 20 20   be able to.    
18010 20 20 2a 2a 20 72 65 61 63 71 75 69 72 65 20 74    ** reacquire t
18020 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a  he read lock */.
18030 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f        rc = winLo
18040 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
18050 45 52 52 5f 55 4e 4c 4f 43 4b 2c 20 6f 73 47 65  ERR_UNLOCK, osGe
18060 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20  tLastError(),.  
18070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18080 20 20 20 20 20 22 77 69 6e 55 6e 6c 6f 63 6b 22       "winUnlock"
18090 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  , pFile->zPath);
180a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
180b0 20 74 79 70 65 3e 3d 52 45 53 45 52 56 45 44 5f   type>=RESERVED_
180c0 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 77 69 6e 55  LOCK ){.    winU
180d0 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65  nlockFile(&pFile
180e0 2d 3e 68 2c 20 52 45 53 45 52 56 45 44 5f 42 59  ->h, RESERVED_BY
180f0 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20  TE, 0, 1, 0);.  
18100 7d 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65  }.  if( locktype
18110 3d 3d 4e 4f 5f 4c 4f 43 4b 20 26 26 20 74 79 70  ==NO_LOCK && typ
18120 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e>=SHARED_LOCK )
18130 7b 0a 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 52  {.    winUnlockR
18140 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a  eadLock(pFile);.
18150 20 20 7d 0a 20 20 69 66 28 20 74 79 70 65 3e 3d    }.  if( type>=
18160 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 7b 0a  PENDING_LOCK ){.
18170 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c      winUnlockFil
18180 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 50 45 4e  e(&pFile->h, PEN
18190 44 49 4e 47 5f 42 59 54 45 2c 20 30 2c 20 31 2c  DING_BYTE, 0, 1,
181a0 20 30 29 3b 0a 20 20 7d 0a 20 20 70 46 69 6c 65   0);.  }.  pFile
181b0 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 28 75 38  ->locktype = (u8
181c0 29 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 4f 53 54  )locktype;.  OST
181d0 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 66 69  RACE(("UNLOCK fi
181e0 6c 65 3d 25 70 2c 20 6c 6f 63 6b 3d 25 64 2c 20  le=%p, lock=%d, 
181f0 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  rc=%s\n",.      
18200 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70       pFile->h, p
18210 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20  File->locktype, 
18220 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72  sqlite3ErrName(r
18230 63 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  c)));.  return r
18240 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 2a  c;.}../*.** If *
18250 70 41 72 67 20 69 73 20 69 6e 69 74 69 74 69 61  pArg is inititia
18260 6c 6c 79 20 6e 65 67 61 74 69 76 65 20 74 68 65  lly negative the
18270 6e 20 74 68 69 73 20 69 73 20 61 20 71 75 65 72  n this is a quer
18280 79 2e 20 20 53 65 74 20 2a 70 41 72 67 20 74 6f  y.  Set *pArg to
18290 0a 2a 2a 20 31 20 6f 72 20 30 20 64 65 70 65 6e  .** 1 or 0 depen
182a0 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20  ding on whether 
182b0 6f 72 20 6e 6f 74 20 62 69 74 20 6d 61 73 6b 20  or not bit mask 
182c0 6f 66 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c  of pFile->ctrlFl
182d0 61 67 73 20 69 73 20 73 65 74 2e 0a 2a 2a 0a 2a  ags is set..**.*
182e0 2a 20 49 66 20 2a 70 41 72 67 20 69 73 20 30 20  * If *pArg is 0 
182f0 6f 72 20 31 2c 20 74 68 65 6e 20 63 6c 65 61 72  or 1, then clear
18300 20 6f 72 20 73 65 74 20 74 68 65 20 6d 61 73 6b   or set the mask
18310 20 62 69 74 20 6f 66 20 70 46 69 6c 65 2d 3e 63   bit of pFile->c
18320 74 72 6c 46 6c 61 67 73 2e 0a 2a 2f 0a 73 74 61  trlFlags..*/.sta
18330 74 69 63 20 76 6f 69 64 20 77 69 6e 4d 6f 64 65  tic void winMode
18340 42 69 74 28 77 69 6e 46 69 6c 65 20 2a 70 46 69  Bit(winFile *pFi
18350 6c 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  le, unsigned cha
18360 72 20 6d 61 73 6b 2c 20 69 6e 74 20 2a 70 41 72  r mask, int *pAr
18370 67 29 7b 0a 20 20 69 66 28 20 2a 70 41 72 67 3c  g){.  if( *pArg<
18380 30 20 29 7b 0a 20 20 20 20 2a 70 41 72 67 20 3d  0 ){.    *pArg =
18390 20 28 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61   (pFile->ctrlFla
183a0 67 73 20 26 20 6d 61 73 6b 29 21 3d 30 3b 0a 20  gs & mask)!=0;. 
183b0 20 7d 65 6c 73 65 20 69 66 28 20 28 2a 70 41 72   }else if( (*pAr
183c0 67 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 46 69  g)==0 ){.    pFi
183d0 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 3d  le->ctrlFlags &=
183e0 20 7e 6d 61 73 6b 3b 0a 20 20 7d 65 6c 73 65 7b   ~mask;.  }else{
183f0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c  .    pFile->ctrl
18400 46 6c 61 67 73 20 7c 3d 20 6d 61 73 6b 3b 0a 20  Flags |= mask;. 
18410 20 7d 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64   }.}../* Forward
18420 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 56   references to V
18430 46 53 20 68 65 6c 70 65 72 20 6d 65 74 68 6f 64  FS helper method
18440 73 20 75 73 65 64 20 66 6f 72 20 74 65 6d 70 6f  s used for tempo
18450 72 61 72 79 20 66 69 6c 65 73 20 2a 2f 0a 73 74  rary files */.st
18460 61 74 69 63 20 69 6e 74 20 77 69 6e 47 65 74 54  atic int winGetT
18470 65 6d 70 6e 61 6d 65 28 73 71 6c 69 74 65 33 5f  empname(sqlite3_
18480 76 66 73 20 2a 2c 20 63 68 61 72 20 2a 2a 29 3b  vfs *, char **);
18490 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 49  .static int winI
184a0 73 44 69 72 28 63 6f 6e 73 74 20 76 6f 69 64 20  sDir(const void 
184b0 2a 29 3b 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20  *);.static BOOL 
184c0 77 69 6e 49 73 44 72 69 76 65 4c 65 74 74 65 72  winIsDriveLetter
184d0 41 6e 64 43 6f 6c 6f 6e 28 63 6f 6e 73 74 20 63  AndColon(const c
184e0 68 61 72 20 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43  har *);../*.** C
184f0 6f 6e 74 72 6f 6c 20 61 6e 64 20 71 75 65 72 79  ontrol and query
18500 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 66 69 6c   of the open fil
18510 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61  e handle..*/.sta
18520 74 69 63 20 69 6e 74 20 77 69 6e 46 69 6c 65 43  tic int winFileC
18530 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66  ontrol(sqlite3_f
18540 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6f 70 2c  ile *id, int op,
18550 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20   void *pArg){.  
18560 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  winFile *pFile =
18570 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20   (winFile*)id;. 
18580 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c   OSTRACE(("FCNTL
18590 20 66 69 6c 65 3d 25 70 2c 20 6f 70 3d 25 64 2c   file=%p, op=%d,
185a0 20 70 41 72 67 3d 25 70 5c 6e 22 2c 20 70 46 69   pArg=%p\n", pFi
185b0 6c 65 2d 3e 68 2c 20 6f 70 2c 20 70 41 72 67 29  le->h, op, pArg)
185c0 29 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20  );.  switch( op 
185d0 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  ){.    case SQLI
185e0 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41  TE_FCNTL_LOCKSTA
185f0 54 45 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e  TE: {.      *(in
18600 74 2a 29 70 41 72 67 20 3d 20 70 46 69 6c 65 2d  t*)pArg = pFile-
18610 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20 20  >locktype;.     
18620 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c   OSTRACE(("FCNTL
18630 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c   file=%p, rc=SQL
18640 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65  ITE_OK\n", pFile
18650 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74  ->h));.      ret
18660 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
18670 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
18680 4c 49 54 45 5f 4c 41 53 54 5f 45 52 52 4e 4f 3a  LITE_LAST_ERRNO:
18690 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a 29   {.      *(int*)
186a0 70 41 72 67 20 3d 20 28 69 6e 74 29 70 46 69 6c  pArg = (int)pFil
186b0 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20  e->lastErrno;.  
186c0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46 43      OSTRACE(("FC
186d0 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  NTL file=%p, rc=
186e0 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46  SQLITE_OK\n", pF
186f0 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20  ile->h));.      
18700 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
18710 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
18720 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 43 48   SQLITE_FCNTL_CH
18730 55 4e 4b 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20  UNK_SIZE: {.    
18740 20 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b    pFile->szChunk
18750 20 3d 20 2a 28 69 6e 74 20 2a 29 70 41 72 67 3b   = *(int *)pArg;
18760 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
18770 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20  "FCNTL file=%p, 
18780 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c  rc=SQLITE_OK\n",
18790 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20   pFile->h));.   
187a0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
187b0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  _OK;.    }.    c
187c0 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
187d0 5f 53 49 5a 45 5f 48 49 4e 54 3a 20 7b 0a 20 20  _SIZE_HINT: {.  
187e0 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73      if( pFile->s
187f0 7a 43 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20 20  zChunk>0 ){.    
18800 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
18810 34 20 6f 6c 64 53 7a 3b 0a 20 20 20 20 20 20 20  4 oldSz;.       
18820 20 69 6e 74 20 72 63 20 3d 20 77 69 6e 46 69 6c   int rc = winFil
18830 65 53 69 7a 65 28 69 64 2c 20 26 6f 6c 64 53 7a  eSize(id, &oldSz
18840 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
18850 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
18860 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
18870 33 5f 69 6e 74 36 34 20 6e 65 77 53 7a 20 3d 20  3_int64 newSz = 
18880 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 2a  *(sqlite3_int64*
18890 29 70 41 72 67 3b 0a 20 20 20 20 20 20 20 20 20  )pArg;.         
188a0 20 69 66 28 20 6e 65 77 53 7a 3e 6f 6c 64 53 7a   if( newSz>oldSz
188b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
188c0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
188d0 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20  enign(1);.      
188e0 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 54 72        rc = winTr
188f0 75 6e 63 61 74 65 28 69 64 2c 20 6e 65 77 53 7a  uncate(id, newSz
18900 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 53  );.            S
18910 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
18920 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 20  nign(0);.       
18930 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
18940 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28         OSTRACE((
18950 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20  "FCNTL file=%p, 
18960 72 63 3d 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d  rc=%s\n", pFile-
18970 3e 68 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61  >h, sqlite3ErrNa
18980 6d 65 28 72 63 29 29 29 3b 0a 20 20 20 20 20 20  me(rc)));.      
18990 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
189a0 20 20 20 7d 0a 20 20 20 20 20 20 4f 53 54 52 41     }.      OSTRA
189b0 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d  CE(("FCNTL file=
189c0 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b  %p, rc=SQLITE_OK
189d0 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  \n", pFile->h));
189e0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
189f0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
18a00 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
18a10 43 4e 54 4c 5f 50 45 52 53 49 53 54 5f 57 41 4c  CNTL_PERSIST_WAL
18a20 3a 20 7b 0a 20 20 20 20 20 20 77 69 6e 4d 6f 64  : {.      winMod
18a30 65 42 69 74 28 70 46 69 6c 65 2c 20 57 49 4e 46  eBit(pFile, WINF
18a40 49 4c 45 5f 50 45 52 53 49 53 54 5f 57 41 4c 2c  ILE_PERSIST_WAL,
18a50 20 28 69 6e 74 2a 29 70 41 72 67 29 3b 0a 20 20   (int*)pArg);.  
18a60 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46 43      OSTRACE(("FC
18a70 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  NTL file=%p, rc=
18a80 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46  SQLITE_OK\n", pF
18a90 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20  ile->h));.      
18aa0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
18ab0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
18ac0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 4f   SQLITE_FCNTL_PO
18ad0 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54  WERSAFE_OVERWRIT
18ae0 45 3a 20 7b 0a 20 20 20 20 20 20 77 69 6e 4d 6f  E: {.      winMo
18af0 64 65 42 69 74 28 70 46 69 6c 65 2c 20 57 49 4e  deBit(pFile, WIN
18b00 46 49 4c 45 5f 50 53 4f 57 2c 20 28 69 6e 74 2a  FILE_PSOW, (int*
18b10 29 70 41 72 67 29 3b 0a 20 20 20 20 20 20 4f 53  )pArg);.      OS
18b20 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69  TRACE(("FCNTL fi
18b30 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
18b40 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  _OK\n", pFile->h
18b50 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
18b60 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
18b70 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
18b80 45 5f 46 43 4e 54 4c 5f 56 46 53 4e 41 4d 45 3a  E_FCNTL_VFSNAME:
18b90 20 7b 0a 20 20 20 20 20 20 2a 28 63 68 61 72 2a   {.      *(char*
18ba0 2a 29 70 41 72 67 20 3d 20 73 71 6c 69 74 65 33  *)pArg = sqlite3
18bb0 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 70  _mprintf("%s", p
18bc0 46 69 6c 65 2d 3e 70 56 66 73 2d 3e 7a 4e 61 6d  File->pVfs->zNam
18bd0 65 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43  e);.      OSTRAC
18be0 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25  E(("FCNTL file=%
18bf0 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c  p, rc=SQLITE_OK\
18c00 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  n", pFile->h));.
18c10 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
18c20 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
18c30 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
18c40 4e 54 4c 5f 57 49 4e 33 32 5f 41 56 5f 52 45 54  NTL_WIN32_AV_RET
18c50 52 59 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  RY: {.      int 
18c60 2a 61 20 3d 20 28 69 6e 74 2a 29 70 41 72 67 3b  *a = (int*)pArg;
18c70 0a 20 20 20 20 20 20 69 66 28 20 61 5b 30 5d 3e  .      if( a[0]>
18c80 30 20 29 7b 0a 20 20 20 20 20 20 20 20 77 69 6e  0 ){.        win
18c90 49 6f 65 72 72 52 65 74 72 79 20 3d 20 61 5b 30  IoerrRetry = a[0
18ca0 5d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  ];.      }else{.
18cb0 20 20 20 20 20 20 20 20 61 5b 30 5d 20 3d 20 77          a[0] = w
18cc0 69 6e 49 6f 65 72 72 52 65 74 72 79 3b 0a 20 20  inIoerrRetry;.  
18cd0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
18ce0 61 5b 31 5d 3e 30 20 29 7b 0a 20 20 20 20 20 20  a[1]>0 ){.      
18cf0 20 20 77 69 6e 49 6f 65 72 72 52 65 74 72 79 44    winIoerrRetryD
18d00 65 6c 61 79 20 3d 20 61 5b 31 5d 3b 0a 20 20 20  elay = a[1];.   
18d10 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
18d20 20 20 61 5b 31 5d 20 3d 20 77 69 6e 49 6f 65 72    a[1] = winIoer
18d30 72 52 65 74 72 79 44 65 6c 61 79 3b 0a 20 20 20  rRetryDelay;.   
18d40 20 20 20 7d 0a 20 20 20 20 20 20 4f 53 54 52 41     }.      OSTRA
18d50 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d  CE(("FCNTL file=
18d60 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b  %p, rc=SQLITE_OK
18d70 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  \n", pFile->h));
18d80 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
18d90 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23  LITE_OK;.    }.#
18da0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
18db0 54 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  T.    case SQLIT
18dc0 45 5f 46 43 4e 54 4c 5f 57 49 4e 33 32 5f 53 45  E_FCNTL_WIN32_SE
18dd0 54 5f 48 41 4e 44 4c 45 3a 20 7b 0a 20 20 20 20  T_HANDLE: {.    
18de0 20 20 4c 50 48 41 4e 44 4c 45 20 70 68 46 69 6c    LPHANDLE phFil
18df0 65 20 3d 20 28 4c 50 48 41 4e 44 4c 45 29 70 41  e = (LPHANDLE)pA
18e00 72 67 3b 0a 20 20 20 20 20 20 48 41 4e 44 4c 45  rg;.      HANDLE
18e10 20 68 4f 6c 64 46 69 6c 65 20 3d 20 70 46 69 6c   hOldFile = pFil
18e20 65 2d 3e 68 3b 0a 20 20 20 20 20 20 70 46 69 6c  e->h;.      pFil
18e30 65 2d 3e 68 20 3d 20 2a 70 68 46 69 6c 65 3b 0a  e->h = *phFile;.
18e40 20 20 20 20 20 20 2a 70 68 46 69 6c 65 20 3d 20        *phFile = 
18e50 68 4f 6c 64 46 69 6c 65 3b 0a 20 20 20 20 20 20  hOldFile;.      
18e60 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20  OSTRACE(("FCNTL 
18e70 6f 6c 64 46 69 6c 65 3d 25 70 2c 20 6e 65 77 46  oldFile=%p, newF
18e80 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  ile=%p, rc=SQLIT
18e90 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20  E_OK\n",.       
18ea0 20 20 20 20 20 20 20 20 68 4f 6c 64 46 69 6c 65          hOldFile
18eb0 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
18ec0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
18ed0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  E_OK;.    }.#end
18ee0 69 66 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  if.    case SQLI
18ef0 54 45 5f 46 43 4e 54 4c 5f 54 45 4d 50 46 49 4c  TE_FCNTL_TEMPFIL
18f00 45 4e 41 4d 45 3a 20 7b 0a 20 20 20 20 20 20 63  ENAME: {.      c
18f10 68 61 72 20 2a 7a 54 46 69 6c 65 20 3d 20 30 3b  har *zTFile = 0;
18f20 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20  .      int rc = 
18f30 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65 28 70  winGetTempname(p
18f40 46 69 6c 65 2d 3e 70 56 66 73 2c 20 26 7a 54 46  File->pVfs, &zTF
18f50 69 6c 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ile);.      if( 
18f60 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
18f70 0a 20 20 20 20 20 20 20 20 2a 28 63 68 61 72 2a  .        *(char*
18f80 2a 29 70 41 72 67 20 3d 20 7a 54 46 69 6c 65 3b  *)pArg = zTFile;
18f90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 4f  .      }.      O
18fa0 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66  STRACE(("FCNTL f
18fb0 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22  ile=%p, rc=%s\n"
18fc0 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 73 71 6c 69  , pFile->h, sqli
18fd0 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29  te3ErrName(rc)))
18fe0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
18ff0 63 3b 0a 20 20 20 20 7d 0a 23 69 66 20 53 51 4c  c;.    }.#if SQL
19000 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
19010 45 3e 30 0a 20 20 20 20 63 61 73 65 20 53 51 4c  E>0.    case SQL
19020 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53  ITE_FCNTL_MMAP_S
19030 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20 69 36 34  IZE: {.      i64
19040 20 6e 65 77 4c 69 6d 69 74 20 3d 20 2a 28 69 36   newLimit = *(i6
19050 34 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20 69  4*)pArg;.      i
19060 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
19070 4b 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 77  K;.      if( new
19080 4c 69 6d 69 74 3e 73 71 6c 69 74 65 33 47 6c 6f  Limit>sqlite3Glo
19090 62 61 6c 43 6f 6e 66 69 67 2e 6d 78 4d 6d 61 70  balConfig.mxMmap
190a0 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 65 77 4c   ){.        newL
190b0 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 47 6c  imit = sqlite3Gl
190c0 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 78 4d 6d 61  obalConfig.mxMma
190d0 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  p;.      }.     
190e0 20 2a 28 69 36 34 2a 29 70 41 72 67 20 3d 20 70   *(i64*)pArg = p
190f0 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61  File->mmapSizeMa
19100 78 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 77  x;.      if( new
19110 4c 69 6d 69 74 3e 3d 30 20 26 26 20 6e 65 77 4c  Limit>=0 && newL
19120 69 6d 69 74 21 3d 70 46 69 6c 65 2d 3e 6d 6d 61  imit!=pFile->mma
19130 70 53 69 7a 65 4d 61 78 20 26 26 20 70 46 69 6c  pSizeMax && pFil
19140 65 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30 20  e->nFetchOut==0 
19150 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65  ){.        pFile
19160 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 3d 20  ->mmapSizeMax = 
19170 6e 65 77 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  newLimit;.      
19180 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6d 6d 61    if( pFile->mma
19190 70 53 69 7a 65 3e 30 20 29 7b 0a 20 20 20 20 20  pSize>0 ){.     
191a0 20 20 20 20 20 77 69 6e 55 6e 6d 61 70 66 69 6c       winUnmapfil
191b0 65 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  e(pFile);.      
191c0 20 20 20 20 72 63 20 3d 20 77 69 6e 4d 61 70 66      rc = winMapf
191d0 69 6c 65 28 70 46 69 6c 65 2c 20 2d 31 29 3b 0a  ile(pFile, -1);.
191e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
191f0 7d 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  }.      OSTRACE(
19200 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c  ("FCNTL file=%p,
19210 20 72 63 3d 25 73 5c 6e 22 2c 20 70 46 69 6c 65   rc=%s\n", pFile
19220 2d 3e 68 2c 20 73 71 6c 69 74 65 33 45 72 72 4e  ->h, sqlite3ErrN
19230 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 20 20 20  ame(rc)));.     
19240 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
19250 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 4f  }.#endif.  }.  O
19260 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66  STRACE(("FCNTL f
19270 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  ile=%p, rc=SQLIT
19280 45 5f 4e 4f 54 46 4f 55 4e 44 5c 6e 22 2c 20 70  E_NOTFOUND\n", p
19290 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 72 65 74  File->h));.  ret
192a0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f  urn SQLITE_NOTFO
192b0 55 4e 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  UND;.}../*.** Re
192c0 74 75 72 6e 20 74 68 65 20 73 65 63 74 6f 72 20  turn the sector 
192d0 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 66  size in bytes of
192e0 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
192f0 62 6c 6f 63 6b 20 64 65 76 69 63 65 20 66 6f 72  block device for
19300 0a 2a 2a 20 74 68 65 20 73 70 65 63 69 66 69 65  .** the specifie
19310 64 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20  d file. This is 
19320 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 35 31  almost always 51
19330 32 20 62 79 74 65 73 2c 20 62 75 74 20 6d 61 79  2 bytes, but may
19340 20 62 65 0a 2a 2a 20 6c 61 72 67 65 72 20 66 6f   be.** larger fo
19350 72 20 73 6f 6d 65 20 64 65 76 69 63 65 73 2e 0a  r some devices..
19360 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 63 6f 64  **.** SQLite cod
19370 65 20 61 73 73 75 6d 65 73 20 74 68 69 73 20 66  e assumes this f
19380 75 6e 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 66  unction cannot f
19390 61 69 6c 2e 20 49 74 20 61 6c 73 6f 20 61 73 73  ail. It also ass
193a0 75 6d 65 73 20 74 68 61 74 0a 2a 2a 20 69 66 20  umes that.** if 
193b0 74 77 6f 20 66 69 6c 65 73 20 61 72 65 20 63 72  two files are cr
193c0 65 61 74 65 64 20 69 6e 20 74 68 65 20 73 61 6d  eated in the sam
193d0 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 64 69  e file-system di
193e0 72 65 63 74 6f 72 79 20 28 69 2e 65 2e 0a 2a 2a  rectory (i.e..**
193f0 20 61 20 64 61 74 61 62 61 73 65 20 61 6e 64 20   a database and 
19400 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  its journal file
19410 29 20 74 68 61 74 20 74 68 65 20 73 65 63 74 6f  ) that the secto
19420 72 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 20 74  r size will be t
19430 68 65 0a 2a 2a 20 73 61 6d 65 20 66 6f 72 20 62  he.** same for b
19440 6f 74 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  oth..*/.static i
19450 6e 74 20 77 69 6e 53 65 63 74 6f 72 53 69 7a 65  nt winSectorSize
19460 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
19470 64 29 7b 0a 20 20 28 76 6f 69 64 29 69 64 3b 0a  d){.  (void)id;.
19480 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
19490 44 45 46 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53  DEFAULT_SECTOR_S
194a0 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  IZE;.}../*.** Re
194b0 74 75 72 6e 20 61 20 76 65 63 74 6f 72 20 6f 66  turn a vector of
194c0 20 64 65 76 69 63 65 20 63 68 61 72 61 63 74 65   device characte
194d0 72 69 73 74 69 63 73 2e 0a 2a 2f 0a 73 74 61 74  ristics..*/.stat
194e0 69 63 20 69 6e 74 20 77 69 6e 44 65 76 69 63 65  ic int winDevice
194f0 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
19500 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
19510 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 20  ){.  winFile *p 
19520 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a  = (winFile*)id;.
19530 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
19540 49 4f 43 41 50 5f 55 4e 44 45 4c 45 54 41 42 4c  IOCAP_UNDELETABL
19550 45 5f 57 48 45 4e 5f 4f 50 45 4e 20 7c 0a 20 20  E_WHEN_OPEN |.  
19560 20 20 20 20 20 20 20 28 28 70 2d 3e 63 74 72 6c         ((p->ctrl
19570 46 6c 61 67 73 20 26 20 57 49 4e 46 49 4c 45 5f  Flags & WINFILE_
19580 50 53 4f 57 29 3f 53 51 4c 49 54 45 5f 49 4f 43  PSOW)?SQLITE_IOC
19590 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45  AP_POWERSAFE_OVE
195a0 52 57 52 49 54 45 3a 30 29 3b 0a 7d 0a 0a 2f 2a  RWRITE:0);.}../*
195b0 0a 2a 2a 20 57 69 6e 64 6f 77 73 20 77 69 6c 6c  .** Windows will
195c0 20 6f 6e 6c 79 20 6c 65 74 20 79 6f 75 20 63 72   only let you cr
195d0 65 61 74 65 20 66 69 6c 65 20 76 69 65 77 20 6d  eate file view m
195e0 61 70 70 69 6e 67 73 0a 2a 2a 20 6f 6e 20 61 6c  appings.** on al
195f0 6c 6f 63 61 74 69 6f 6e 20 73 69 7a 65 20 67 72  location size gr
19600 61 6e 75 6c 61 72 69 74 79 20 62 6f 75 6e 64 61  anularity bounda
19610 72 69 65 73 2e 0a 2a 2a 20 44 75 72 69 6e 67 20  ries..** During 
19620 73 71 6c 69 74 65 33 5f 6f 73 5f 69 6e 69 74 28  sqlite3_os_init(
19630 29 20 77 65 20 64 6f 20 61 20 47 65 74 53 79 73  ) we do a GetSys
19640 74 65 6d 49 6e 66 6f 28 29 0a 2a 2a 20 74 6f 20  temInfo().** to 
19650 67 65 74 20 74 68 65 20 67 72 61 6e 75 6c 61 72  get the granular
19660 69 74 79 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61  ity size..*/.sta
19670 74 69 63 20 53 59 53 54 45 4d 5f 49 4e 46 4f 20  tic SYSTEM_INFO 
19680 77 69 6e 53 79 73 49 6e 66 6f 3b 0a 0a 23 69 66  winSysInfo;..#if
19690 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
196a0 5f 57 41 4c 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c 70  _WAL../*.** Help
196b0 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20  er functions to 
196c0 6f 62 74 61 69 6e 20 61 6e 64 20 72 65 6c 69 6e  obtain and relin
196d0 71 75 69 73 68 20 74 68 65 20 67 6c 6f 62 61 6c  quish the global
196e0 20 6d 75 74 65 78 2e 20 54 68 65 0a 2a 2a 20 67   mutex. The.** g
196f0 6c 6f 62 61 6c 20 6d 75 74 65 78 20 69 73 20 75  lobal mutex is u
19700 73 65 64 20 74 6f 20 70 72 6f 74 65 63 74 20 74  sed to protect t
19710 68 65 20 77 69 6e 4c 6f 63 6b 49 6e 66 6f 20 6f  he winLockInfo o
19720 62 6a 65 63 74 73 20 75 73 65 64 20 62 79 0a 2a  bjects used by.*
19730 2a 20 74 68 69 73 20 66 69 6c 65 2c 20 61 6c 6c  * this file, all
19740 20 6f 66 20 77 68 69 63 68 20 6d 61 79 20 62 65   of which may be
19750 20 73 68 61 72 65 64 20 62 79 20 6d 75 6c 74 69   shared by multi
19760 70 6c 65 20 74 68 72 65 61 64 73 2e 0a 2a 2a 0a  ple threads..**.
19770 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 77 69 6e 53  ** Function winS
19780 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 69 73  hmMutexHeld() is
19790 20 75 73 65 64 20 74 6f 20 61 73 73 65 72 74 28   used to assert(
197a0 29 20 74 68 61 74 20 74 68 65 20 67 6c 6f 62 61  ) that the globa
197b0 6c 20 6d 75 74 65 78 0a 2a 2a 20 69 73 20 68 65  l mutex.** is he
197c0 6c 64 20 77 68 65 6e 20 72 65 71 75 69 72 65 64  ld when required
197d0 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
197e0 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 61 73 20  is only used as 
197f0 70 61 72 74 20 6f 66 20 61 73 73 65 72 74 28 29  part of assert()
19800 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 2e 20  .** statements. 
19810 65 2e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 77 69 6e  e.g..**.**   win
19820 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 29 0a  ShmEnterMutex().
19830 2a 2a 20 20 20 20 20 61 73 73 65 72 74 28 20 77  **     assert( w
19840 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29  inShmMutexHeld()
19850 20 29 3b 0a 2a 2a 20 20 20 77 69 6e 53 68 6d 4c   );.**   winShmL
19860 65 61 76 65 4d 75 74 65 78 28 29 0a 2a 2f 0a 73  eaveMutex().*/.s
19870 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 53 68  tatic void winSh
19880 6d 45 6e 74 65 72 4d 75 74 65 78 28 76 6f 69 64  mEnterMutex(void
19890 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  ){.  sqlite3_mut
198a0 65 78 5f 65 6e 74 65 72 28 73 71 6c 69 74 65 33  ex_enter(sqlite3
198b0 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
198c0 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d  E_MUTEX_STATIC_M
198d0 41 53 54 45 52 29 29 3b 0a 7d 0a 73 74 61 74 69  ASTER));.}.stati
198e0 63 20 76 6f 69 64 20 77 69 6e 53 68 6d 4c 65 61  c void winShmLea
198f0 76 65 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a 20  veMutex(void){. 
19900 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
19910 65 61 76 65 28 73 71 6c 69 74 65 33 4d 75 74 65  eave(sqlite3Mute
19920 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
19930 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45  TEX_STATIC_MASTE
19940 52 29 29 3b 0a 7d 0a 23 69 66 6e 64 65 66 20 4e  R));.}.#ifndef N
19950 44 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e 74  DEBUG.static int
19960 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64   winShmMutexHeld
19970 28 76 6f 69 64 29 20 7b 0a 20 20 72 65 74 75 72  (void) {.  retur
19980 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  n sqlite3_mutex_
19990 68 65 6c 64 28 73 71 6c 69 74 65 33 4d 75 74 65  held(sqlite3Mute
199a0 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
199b0 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45  TEX_STATIC_MASTE
199c0 52 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  R));.}.#endif../
199d0 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20 75 73 65 64  *.** Object used
199e0 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20 61 20   to represent a 
199f0 73 69 6e 67 6c 65 20 66 69 6c 65 20 6f 70 65 6e  single file open
19a00 65 64 20 61 6e 64 20 6d 6d 61 70 70 65 64 20 74  ed and mmapped t
19a10 6f 20 70 72 6f 76 69 64 65 0a 2a 2a 20 73 68 61  o provide.** sha
19a20 72 65 64 20 6d 65 6d 6f 72 79 2e 20 20 57 68 65  red memory.  Whe
19a30 6e 20 6d 75 6c 74 69 70 6c 65 20 74 68 72 65 61  n multiple threa
19a40 64 73 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65  ds all reference
19a50 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 6c 6f 67   the same.** log
19a60 2d 73 75 6d 6d 61 72 79 2c 20 65 61 63 68 20 74  -summary, each t
19a70 68 72 65 61 64 20 68 61 73 20 69 74 73 20 6f 77  hread has its ow
19a80 6e 20 77 69 6e 46 69 6c 65 20 6f 62 6a 65 63 74  n winFile object
19a90 2c 20 62 75 74 20 74 68 65 79 20 61 6c 6c 0a 2a  , but they all.*
19aa0 2a 20 70 6f 69 6e 74 20 74 6f 20 61 20 73 69 6e  * point to a sin
19ab0 67 6c 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  gle instance of 
19ac0 74 68 69 73 20 6f 62 6a 65 63 74 2e 20 20 49 6e  this object.  In
19ad0 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 65 61   other words, ea
19ae0 63 68 0a 2a 2a 20 6c 6f 67 2d 73 75 6d 6d 61 72  ch.** log-summar
19af0 79 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 6c 79  y is opened only
19b00 20 6f 6e 63 65 20 70 65 72 20 70 72 6f 63 65 73   once per proces
19b10 73 2e 0a 2a 2a 0a 2a 2a 20 77 69 6e 53 68 6d 4d  s..**.** winShmM
19b20 75 74 65 78 48 65 6c 64 28 29 20 6d 75 73 74 20  utexHeld() must 
19b30 62 65 20 74 72 75 65 20 77 68 65 6e 20 63 72 65  be true when cre
19b40 61 74 69 6e 67 20 6f 72 20 64 65 73 74 72 6f 79  ating or destroy
19b50 69 6e 67 0a 2a 2a 20 74 68 69 73 20 6f 62 6a 65  ing.** this obje
19b60 63 74 20 6f 72 20 77 68 69 6c 65 20 72 65 61 64  ct or while read
19b70 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74  ing or writing t
19b80 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65  he following fie
19b90 6c 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  lds:.**.**      
19ba0 6e 52 65 66 0a 2a 2a 20 20 20 20 20 20 70 4e 65  nRef.**      pNe
19bb0 78 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  xt.**.** The fol
19bc0 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 20 61 72  lowing fields ar
19bd0 65 20 72 65 61 64 2d 6f 6e 6c 79 20 61 66 74 65  e read-only afte
19be0 72 20 74 68 65 20 6f 62 6a 65 63 74 20 69 73 20  r the object is 
19bf0 63 72 65 61 74 65 64 3a 0a 2a 2a 0a 2a 2a 20 20  created:.**.**  
19c00 20 20 20 20 66 69 64 0a 2a 2a 20 20 20 20 20 20      fid.**      
19c10 7a 46 69 6c 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20  zFilename.**.** 
19c20 45 69 74 68 65 72 20 77 69 6e 53 68 6d 4e 6f 64  Either winShmNod
19c30 65 2e 6d 75 74 65 78 20 6d 75 73 74 20 62 65 20  e.mutex must be 
19c40 68 65 6c 64 20 6f 72 20 77 69 6e 53 68 6d 4e 6f  held or winShmNo
19c50 64 65 2e 6e 52 65 66 3d 3d 30 20 61 6e 64 0a 2a  de.nRef==0 and.*
19c60 2a 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c  * winShmMutexHel
19c70 64 28 29 20 69 73 20 74 72 75 65 20 77 68 65 6e  d() is true when
19c80 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74   reading or writ
19c90 69 6e 67 20 61 6e 79 20 6f 74 68 65 72 20 66 69  ing any other fi
19ca0 65 6c 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20 73  eld.** in this s
19cb0 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2f 0a  tructure..**.*/.
19cc0 73 74 72 75 63 74 20 77 69 6e 53 68 6d 4e 6f 64  struct winShmNod
19cd0 65 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  e {.  sqlite3_mu
19ce0 74 65 78 20 2a 6d 75 74 65 78 3b 20 20 20 20 20  tex *mutex;     
19cf0 20 2f 2a 20 4d 75 74 65 78 20 74 6f 20 61 63 63   /* Mutex to acc
19d00 65 73 73 20 74 68 69 73 20 6f 62 6a 65 63 74 20  ess this object 
19d10 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65  */.  char *zFile
19d20 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  name;           
19d30 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66  /* Name of the f
19d40 69 6c 65 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65  ile */.  winFile
19d50 20 68 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20   hFile;         
19d60 20 20 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64      /* File hand
19d70 6c 65 20 66 72 6f 6d 20 77 69 6e 4f 70 65 6e 20  le from winOpen 
19d80 2a 2f 0a 0a 20 20 69 6e 74 20 73 7a 52 65 67 69  */..  int szRegi
19d90 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  on;             
19da0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 68 61 72   /* Size of shar
19db0 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed-memory region
19dc0 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 67 69  s */.  int nRegi
19dd0 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  on;             
19de0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 72 72    /* Size of arr
19df0 61 79 20 61 70 52 65 67 69 6f 6e 20 2a 2f 0a 20  ay apRegion */. 
19e00 20 73 74 72 75 63 74 20 53 68 6d 52 65 67 69 6f   struct ShmRegio
19e10 6e 20 7b 0a 20 20 20 20 48 41 4e 44 4c 45 20 68  n {.    HANDLE h
19e20 4d 61 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  Map;            
19e30 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65 20   /* File handle 
19e40 66 72 6f 6d 20 43 72 65 61 74 65 46 69 6c 65 4d  from CreateFileM
19e50 61 70 70 69 6e 67 20 2a 2f 0a 20 20 20 20 76 6f  apping */.    vo
19e60 69 64 20 2a 70 4d 61 70 3b 0a 20 20 7d 20 2a 61  id *pMap;.  } *a
19e70 52 65 67 69 6f 6e 3b 0a 20 20 44 57 4f 52 44 20  Region;.  DWORD 
19e80 6c 61 73 74 45 72 72 6e 6f 3b 20 20 20 20 20 20  lastErrno;      
19e90 20 20 20 20 20 2f 2a 20 54 68 65 20 57 69 6e 64       /* The Wind
19ea0 6f 77 73 20 65 72 72 6e 6f 20 66 72 6f 6d 20 74  ows errno from t
19eb0 68 65 20 6c 61 73 74 20 49 2f 4f 20 65 72 72 6f  he last I/O erro
19ec0 72 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e 52 65 66  r */..  int nRef
19ed0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
19ee0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
19ef0 77 69 6e 53 68 6d 20 6f 62 6a 65 63 74 73 20 70  winShm objects p
19f00 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 69 73 20  ointing to this 
19f10 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70 46 69  */.  winShm *pFi
19f20 72 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  rst;            
19f30 2f 2a 20 41 6c 6c 20 77 69 6e 53 68 6d 20 6f 62  /* All winShm ob
19f40 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e 67 20 74  jects pointing t
19f50 6f 20 74 68 69 73 20 2a 2f 0a 20 20 77 69 6e 53  o this */.  winS
19f60 68 6d 4e 6f 64 65 20 2a 70 4e 65 78 74 3b 20 20  hmNode *pNext;  
19f70 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 69         /* Next i
19f80 6e 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 77 69  n list of all wi
19f90 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 73  nShmNode objects
19fa0 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
19fb0 45 5f 44 45 42 55 47 0a 20 20 75 38 20 6e 65 78  E_DEBUG.  u8 nex
19fc0 74 53 68 6d 49 64 3b 20 20 20 20 20 20 20 20 20  tShmId;         
19fd0 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 61 76 61       /* Next ava
19fe0 69 6c 61 62 6c 65 20 77 69 6e 53 68 6d 2e 69 64  ilable winShm.id
19ff0 20 76 61 6c 75 65 20 2a 2f 0a 23 65 6e 64 69 66   value */.#endif
1a000 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 67 6c 6f  .};../*.** A glo
1a010 62 61 6c 20 61 72 72 61 79 20 6f 66 20 61 6c 6c  bal array of all
1a020 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65   winShmNode obje
1a030 63 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 77  cts..**.** The w
1a040 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29  inShmMutexHeld()
1a050 20 6d 75 73 74 20 62 65 20 74 72 75 65 20 77 68   must be true wh
1a060 69 6c 65 20 72 65 61 64 69 6e 67 20 6f 72 20 77  ile reading or w
1a070 72 69 74 69 6e 67 20 74 68 69 73 20 6c 69 73 74  riting this list
1a080 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 77 69 6e 53  ..*/.static winS
1a090 68 6d 4e 6f 64 65 20 2a 77 69 6e 53 68 6d 4e 6f  hmNode *winShmNo
1a0a0 64 65 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a  deList = 0;../*.
1a0b0 2a 2a 20 53 74 72 75 63 74 75 72 65 20 75 73 65  ** Structure use
1a0c0 64 20 69 6e 74 65 72 6e 61 6c 6c 79 20 62 79 20  d internally by 
1a0d0 74 68 69 73 20 56 46 53 20 74 6f 20 72 65 63 6f  this VFS to reco
1a0e0 72 64 20 74 68 65 20 73 74 61 74 65 20 6f 66 20  rd the state of 
1a0f0 61 6e 0a 2a 2a 20 6f 70 65 6e 20 73 68 61 72 65  an.** open share
1a100 64 20 6d 65 6d 6f 72 79 20 63 6f 6e 6e 65 63 74  d memory connect
1a110 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  ion..**.** The f
1a120 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 20  ollowing fields 
1a130 61 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  are initialized 
1a140 77 68 65 6e 20 74 68 69 73 20 6f 62 6a 65 63 74  when this object
1a150 20 69 73 20 63 72 65 61 74 65 64 20 61 6e 64 0a   is created and.
1a160 2a 2a 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c 79  ** are read-only
1a170 20 74 68 65 72 65 61 66 74 65 72 3a 0a 2a 2a 0a   thereafter:.**.
1a180 2a 2a 20 20 20 20 77 69 6e 53 68 6d 2e 70 53 68  **    winShm.pSh
1a190 6d 4e 6f 64 65 0a 2a 2a 20 20 20 20 77 69 6e 53  mNode.**    winS
1a1a0 68 6d 2e 69 64 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20  hm.id.**.** All 
1a1b0 6f 74 68 65 72 20 66 69 65 6c 64 73 20 61 72 65  other fields are
1a1c0 20 72 65 61 64 2f 77 72 69 74 65 2e 20 20 54 68   read/write.  Th
1a1d0 65 20 77 69 6e 53 68 6d 2e 70 53 68 6d 4e 6f 64  e winShm.pShmNod
1a1e0 65 2d 3e 6d 75 74 65 78 20 6d 75 73 74 20 62 65  e->mutex must be
1a1f0 20 68 65 6c 64 0a 2a 2a 20 77 68 69 6c 65 20 61   held.** while a
1a200 63 63 65 73 73 69 6e 67 20 61 6e 79 20 72 65 61  ccessing any rea
1a210 64 2f 77 72 69 74 65 20 66 69 65 6c 64 73 2e 0a  d/write fields..
1a220 2a 2f 0a 73 74 72 75 63 74 20 77 69 6e 53 68 6d  */.struct winShm
1a230 20 7b 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20   {.  winShmNode 
1a240 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20  *pShmNode;      
1a250 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e  /* The underlyin
1a260 67 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a  g winShmNode obj
1a270 65 63 74 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20  ect */.  winShm 
1a280 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20  *pNext;         
1a290 20 20 20 20 2f 2a 20 4e 65 78 74 20 77 69 6e 53      /* Next winS
1a2a0 68 6d 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  hm with the same
1a2b0 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20   winShmNode */. 
1a2c0 20 75 38 20 68 61 73 4d 75 74 65 78 3b 20 20 20   u8 hasMutex;   
1a2d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1a2e0 72 75 65 20 69 66 20 68 6f 6c 64 69 6e 67 20 74  rue if holding t
1a2f0 68 65 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6d 75  he winShmNode mu
1a300 74 65 78 20 2a 2f 0a 20 20 75 31 36 20 73 68 61  tex */.  u16 sha
1a310 72 65 64 4d 61 73 6b 3b 20 20 20 20 20 20 20 20  redMask;        
1a320 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73      /* Mask of s
1a330 68 61 72 65 64 20 6c 6f 63 6b 73 20 68 65 6c 64  hared locks held
1a340 20 2a 2f 0a 20 20 75 31 36 20 65 78 63 6c 4d 61   */.  u16 exclMa
1a350 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  sk;             
1a360 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 65 78 63 6c   /* Mask of excl
1a370 75 73 69 76 65 20 6c 6f 63 6b 73 20 68 65 6c 64  usive locks held
1a380 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
1a390 45 5f 44 45 42 55 47 0a 20 20 75 38 20 69 64 3b  E_DEBUG.  u8 id;
1a3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a3b0 20 20 20 20 20 2f 2a 20 49 64 20 6f 66 20 74 68       /* Id of th
1a3c0 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69  is connection wi
1a3d0 74 68 20 69 74 73 20 77 69 6e 53 68 6d 4e 6f 64  th its winShmNod
1a3e0 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a  e */.#endif.};..
1a3f0 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 61 6e 74 73 20  /*.** Constants 
1a400 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67  used for locking
1a410 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e 5f  .*/.#define WIN_
1a420 53 48 4d 5f 42 41 53 45 20 20 20 28 28 32 32 2b  SHM_BASE   ((22+
1a430 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b  SQLITE_SHM_NLOCK
1a440 29 2a 34 29 20 20 20 20 20 20 20 20 2f 2a 20 66  )*4)        /* f
1a450 69 72 73 74 20 6c 6f 63 6b 20 62 79 74 65 20 2a  irst lock byte *
1a460 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e 5f 53 48  /.#define WIN_SH
1a470 4d 5f 44 4d 53 20 20 20 20 28 57 49 4e 5f 53 48  M_DMS    (WIN_SH
1a480 4d 5f 42 41 53 45 2b 53 51 4c 49 54 45 5f 53 48  M_BASE+SQLITE_SH
1a490 4d 5f 4e 4c 4f 43 4b 29 20 20 2f 2a 20 64 65 61  M_NLOCK)  /* dea
1a4a0 64 6d 61 6e 20 73 77 69 74 63 68 20 2a 2f 0a 0a  dman switch */..
1a4b0 2f 2a 0a 2a 2a 20 41 70 70 6c 79 20 61 64 76 69  /*.** Apply advi
1a4c0 73 6f 72 79 20 6c 6f 63 6b 73 20 66 6f 72 20 61  sory locks for a
1a4d0 6c 6c 20 6e 20 62 79 74 65 73 20 62 65 67 69 6e  ll n bytes begin
1a4e0 6e 69 6e 67 20 61 74 20 6f 66 73 74 2e 0a 2a 2f  ning at ofst..*/
1a4f0 0a 23 64 65 66 69 6e 65 20 5f 53 48 4d 5f 55 4e  .#define _SHM_UN
1a500 4c 43 4b 20 20 31 0a 23 64 65 66 69 6e 65 20 5f  LCK  1.#define _
1a510 53 48 4d 5f 52 44 4c 43 4b 20 20 32 0a 23 64 65  SHM_RDLCK  2.#de
1a520 66 69 6e 65 20 5f 53 48 4d 5f 57 52 4c 43 4b 20  fine _SHM_WRLCK 
1a530 20 33 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69   3.static int wi
1a540 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 0a  nShmSystemLock(.
1a550 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 46    winShmNode *pF
1a560 69 6c 65 2c 20 20 20 20 2f 2a 20 41 70 70 6c 79  ile,    /* Apply
1a570 20 6c 6f 63 6b 73 20 74 6f 20 74 68 69 73 20 6f   locks to this o
1a580 70 65 6e 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  pen shared-memor
1a590 79 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 69  y segment */.  i
1a5a0 6e 74 20 6c 6f 63 6b 54 79 70 65 2c 20 20 20 20  nt lockType,    
1a5b0 20 20 20 20 20 2f 2a 20 5f 53 48 4d 5f 55 4e 4c       /* _SHM_UNL
1a5c0 43 4b 2c 20 5f 53 48 4d 5f 52 44 4c 43 4b 2c 20  CK, _SHM_RDLCK, 
1a5d0 6f 72 20 5f 53 48 4d 5f 57 52 4c 43 4b 20 2a 2f  or _SHM_WRLCK */
1a5e0 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20 20 20 20  .  int ofst,    
1a5f0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
1a600 65 74 20 74 6f 20 66 69 72 73 74 20 62 79 74 65  et to first byte
1a610 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 2f 75 6e   to be locked/un
1a620 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20  locked */.  int 
1a630 6e 42 79 74 65 20 20 20 20 20 20 20 20 20 20 20  nByte           
1a640 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
1a650 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 6f 72 20  ytes to lock or 
1a660 75 6e 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 69  unlock */.){.  i
1a670 6e 74 20 72 63 20 3d 20 30 3b 20 20 20 20 20 20  nt rc = 0;      
1a680 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
1a690 6f 64 65 20 66 6f 72 6d 20 4c 6f 63 6b 2f 55 6e  ode form Lock/Un
1a6a0 6c 6f 63 6b 46 69 6c 65 45 78 28 29 20 2a 2f 0a  lockFileEx() */.
1a6b0 0a 20 20 2f 2a 20 41 63 63 65 73 73 20 74 6f 20  .  /* Access to 
1a6c0 74 68 65 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6f  the winShmNode o
1a6d0 62 6a 65 63 74 20 69 73 20 73 65 72 69 61 6c 69  bject is seriali
1a6e0 7a 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  zed by the calle
1a6f0 72 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73  r */.  assert( s
1a700 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
1a710 64 28 70 46 69 6c 65 2d 3e 6d 75 74 65 78 29 20  d(pFile->mutex) 
1a720 7c 7c 20 70 46 69 6c 65 2d 3e 6e 52 65 66 3d 3d  || pFile->nRef==
1a730 30 20 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28  0 );..  OSTRACE(
1a740 28 22 53 48 4d 2d 4c 4f 43 4b 20 66 69 6c 65 3d  ("SHM-LOCK file=
1a750 25 70 2c 20 6c 6f 63 6b 3d 25 64 2c 20 6f 66 66  %p, lock=%d, off
1a760 73 65 74 3d 25 64 2c 20 73 69 7a 65 3d 25 64 5c  set=%d, size=%d\
1a770 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  n",.           p
1a780 46 69 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c 20 6c  File->hFile.h, l
1a790 6f 63 6b 54 79 70 65 2c 20 6f 66 73 74 2c 20 6e  ockType, ofst, n
1a7a0 42 79 74 65 29 29 3b 0a 0a 20 20 2f 2a 20 52 65  Byte));..  /* Re
1a7b0 6c 65 61 73 65 2f 41 63 71 75 69 72 65 20 74 68  lease/Acquire th
1a7c0 65 20 73 79 73 74 65 6d 2d 6c 65 76 65 6c 20 6c  e system-level l
1a7d0 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63  ock */.  if( loc
1a7e0 6b 54 79 70 65 3d 3d 5f 53 48 4d 5f 55 4e 4c 43  kType==_SHM_UNLC
1a7f0 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 77 69  K ){.    rc = wi
1a800 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69  nUnlockFile(&pFi
1a810 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c 20 6f 66 73  le->hFile.h, ofs
1a820 74 2c 20 30 2c 20 6e 42 79 74 65 2c 20 30 29 3b  t, 0, nByte, 0);
1a830 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
1a840 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
1a850 6c 6f 63 6b 69 6e 67 20 70 61 72 61 6d 65 74 65  locking paramete
1a860 72 73 20 2a 2f 0a 20 20 20 20 44 57 4f 52 44 20  rs */.    DWORD 
1a870 64 77 46 6c 61 67 73 20 3d 20 4c 4f 43 4b 46 49  dwFlags = LOCKFI
1a880 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54  LE_FAIL_IMMEDIAT
1a890 45 4c 59 3b 0a 20 20 20 20 69 66 28 20 6c 6f 63  ELY;.    if( loc
1a8a0 6b 54 79 70 65 20 3d 3d 20 5f 53 48 4d 5f 57 52  kType == _SHM_WR
1a8b0 4c 43 4b 20 29 20 64 77 46 6c 61 67 73 20 7c 3d  LCK ) dwFlags |=
1a8c0 20 4c 4f 43 4b 46 49 4c 45 5f 45 58 43 4c 55 53   LOCKFILE_EXCLUS
1a8d0 49 56 45 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72 63  IVE_LOCK;.    rc
1a8e0 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26   = winLockFile(&
1a8f0 70 46 69 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c 20  pFile->hFile.h, 
1a900 64 77 46 6c 61 67 73 2c 20 6f 66 73 74 2c 20 30  dwFlags, ofst, 0
1a910 2c 20 6e 42 79 74 65 2c 20 30 29 3b 0a 20 20 7d  , nByte, 0);.  }
1a920 0a 0a 20 20 69 66 28 20 72 63 21 3d 20 30 20 29  ..  if( rc!= 0 )
1a930 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
1a940 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  E_OK;.  }else{. 
1a950 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
1a960 72 6e 6f 20 3d 20 20 6f 73 47 65 74 4c 61 73 74  rno =  osGetLast
1a970 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 72 63 20  Error();.    rc 
1a980 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
1a990 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22   }..  OSTRACE(("
1a9a0 53 48 4d 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70  SHM-LOCK file=%p
1a9b0 2c 20 66 75 6e 63 3d 25 73 2c 20 65 72 72 6e 6f  , func=%s, errno
1a9c0 3d 25 6c 75 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a  =%lu, rc=%s\n",.
1a9d0 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
1a9e0 2d 3e 68 46 69 6c 65 2e 68 2c 20 28 6c 6f 63 6b  ->hFile.h, (lock
1a9f0 54 79 70 65 20 3d 3d 20 5f 53 48 4d 5f 55 4e 4c  Type == _SHM_UNL
1aa00 43 4b 29 20 3f 20 22 77 69 6e 55 6e 6c 6f 63 6b  CK) ? "winUnlock
1aa10 46 69 6c 65 22 20 3a 0a 20 20 20 20 20 20 20 20  File" :.        
1aa20 20 20 20 22 77 69 6e 4c 6f 63 6b 46 69 6c 65 22     "winLockFile"
1aa30 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  , pFile->lastErr
1aa40 6e 6f 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61  no, sqlite3ErrNa
1aa50 6d 65 28 72 63 29 29 29 3b 0a 0a 20 20 72 65 74  me(rc)));..  ret
1aa60 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f  urn rc;.}../* Fo
1aa70 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 73  rward references
1aa80 20 74 6f 20 56 46 53 20 6d 65 74 68 6f 64 73 20   to VFS methods 
1aa90 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
1aaa0 6e 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 66  nOpen(sqlite3_vf
1aab0 73 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 73  s*,const char*,s
1aac0 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 69 6e 74  qlite3_file*,int
1aad0 2c 69 6e 74 2a 29 3b 0a 73 74 61 74 69 63 20 69  ,int*);.static i
1aae0 6e 74 20 77 69 6e 44 65 6c 65 74 65 28 73 71 6c  nt winDelete(sql
1aaf0 69 74 65 33 5f 76 66 73 20 2a 2c 63 6f 6e 73 74  ite3_vfs *,const
1ab00 20 63 68 61 72 2a 2c 69 6e 74 29 3b 0a 0a 2f 2a   char*,int);../*
1ab10 0a 2a 2a 20 50 75 72 67 65 20 74 68 65 20 77 69  .** Purge the wi
1ab20 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 20 6c 69 73  nShmNodeList lis
1ab30 74 20 6f 66 20 61 6c 6c 20 65 6e 74 72 69 65 73  t of all entries
1ab40 20 77 69 74 68 20 77 69 6e 53 68 6d 4e 6f 64 65   with winShmNode
1ab50 2e 6e 52 65 66 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20  .nRef==0..**.** 
1ab60 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 56 46  This is not a VF
1ab70 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  S shared-memory 
1ab80 6d 65 74 68 6f 64 3b 20 69 74 20 69 73 20 61 20  method; it is a 
1ab90 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69 6f 6e  utility function
1aba0 20 63 61 6c 6c 65 64 0a 2a 2a 20 62 79 20 56 46   called.** by VF
1abb0 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  S shared-memory 
1abc0 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 73 74 61 74  methods..*/.stat
1abd0 69 63 20 76 6f 69 64 20 77 69 6e 53 68 6d 50 75  ic void winShmPu
1abe0 72 67 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20  rge(sqlite3_vfs 
1abf0 2a 70 56 66 73 2c 20 69 6e 74 20 64 65 6c 65 74  *pVfs, int delet
1ac00 65 46 6c 61 67 29 7b 0a 20 20 77 69 6e 53 68 6d  eFlag){.  winShm
1ac10 4e 6f 64 65 20 2a 2a 70 70 3b 0a 20 20 77 69 6e  Node **pp;.  win
1ac20 53 68 6d 4e 6f 64 65 20 2a 70 3b 0a 20 20 61 73  ShmNode *p;.  as
1ac30 73 65 72 74 28 20 77 69 6e 53 68 6d 4d 75 74 65  sert( winShmMute
1ac40 78 48 65 6c 64 28 29 20 29 3b 0a 20 20 4f 53 54  xHeld() );.  OST
1ac50 52 41 43 45 28 28 22 53 48 4d 2d 50 55 52 47 45  RACE(("SHM-PURGE
1ac60 20 70 69 64 3d 25 6c 75 2c 20 64 65 6c 65 74 65   pid=%lu, delete
1ac70 46 6c 61 67 3d 25 64 5c 6e 22 2c 0a 20 20 20 20  Flag=%d\n",.    
1ac80 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72         osGetCurr
1ac90 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
1aca0 64 65 6c 65 74 65 46 6c 61 67 29 29 3b 0a 20 20  deleteFlag));.  
1acb0 70 70 20 3d 20 26 77 69 6e 53 68 6d 4e 6f 64 65  pp = &winShmNode
1acc0 4c 69 73 74 3b 0a 20 20 77 68 69 6c 65 28 20 28  List;.  while( (
1acd0 70 20 3d 20 2a 70 70 29 21 3d 30 20 29 7b 0a 20  p = *pp)!=0 ){. 
1ace0 20 20 20 69 66 28 20 70 2d 3e 6e 52 65 66 3d 3d     if( p->nRef==
1acf0 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  0 ){.      int i
1ad00 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6d  ;.      if( p->m
1ad10 75 74 65 78 20 29 7b 20 73 71 6c 69 74 65 33 5f  utex ){ sqlite3_
1ad20 6d 75 74 65 78 5f 66 72 65 65 28 70 2d 3e 6d 75  mutex_free(p->mu
1ad30 74 65 78 29 3b 20 7d 0a 20 20 20 20 20 20 66 6f  tex); }.      fo
1ad40 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 52 65 67  r(i=0; i<p->nReg
1ad50 69 6f 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ion; i++){.     
1ad60 20 20 20 42 4f 4f 4c 20 62 52 63 20 3d 20 6f 73     BOOL bRc = os
1ad70 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 28  UnmapViewOfFile(
1ad80 70 2d 3e 61 52 65 67 69 6f 6e 5b 69 5d 2e 70 4d  p->aRegion[i].pM
1ad90 61 70 29 3b 0a 20 20 20 20 20 20 20 20 4f 53 54  ap);.        OST
1ada0 52 41 43 45 28 28 22 53 48 4d 2d 50 55 52 47 45  RACE(("SHM-PURGE
1adb0 2d 55 4e 4d 41 50 20 70 69 64 3d 25 6c 75 2c 20  -UNMAP pid=%lu, 
1adc0 72 65 67 69 6f 6e 3d 25 64 2c 20 72 63 3d 25 73  region=%d, rc=%s
1add0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
1ade0 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65        osGetCurre
1adf0 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 69  ntProcessId(), i
1ae00 2c 20 62 52 63 20 3f 20 22 6f 6b 22 20 3a 20 22  , bRc ? "ok" : "
1ae10 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20 20 20  failed"));.     
1ae20 20 20 20 55 4e 55 53 45 44 5f 56 41 52 49 41 42     UNUSED_VARIAB
1ae30 4c 45 5f 56 41 4c 55 45 28 62 52 63 29 3b 0a 20  LE_VALUE(bRc);. 
1ae40 20 20 20 20 20 20 20 62 52 63 20 3d 20 6f 73 43         bRc = osC
1ae50 6c 6f 73 65 48 61 6e 64 6c 65 28 70 2d 3e 61 52  loseHandle(p->aR
1ae60 65 67 69 6f 6e 5b 69 5d 2e 68 4d 61 70 29 3b 0a  egion[i].hMap);.
1ae70 20 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28          OSTRACE(
1ae80 28 22 53 48 4d 2d 50 55 52 47 45 2d 43 4c 4f 53  ("SHM-PURGE-CLOS
1ae90 45 20 70 69 64 3d 25 6c 75 2c 20 72 65 67 69 6f  E pid=%lu, regio
1aea0 6e 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a  n=%d, rc=%s\n",.
1aeb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aec0 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
1aed0 63 65 73 73 49 64 28 29 2c 20 69 2c 20 62 52 63  cessId(), i, bRc
1aee0 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65   ? "ok" : "faile
1aef0 64 22 29 29 3b 0a 20 20 20 20 20 20 20 20 55 4e  d"));.        UN
1af00 55 53 45 44 5f 56 41 52 49 41 42 4c 45 5f 56 41  USED_VARIABLE_VA
1af10 4c 55 45 28 62 52 63 29 3b 0a 20 20 20 20 20 20  LUE(bRc);.      
1af20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 68  }.      if( p->h
1af30 46 69 6c 65 2e 68 21 3d 4e 55 4c 4c 20 26 26 20  File.h!=NULL && 
1af40 70 2d 3e 68 46 69 6c 65 2e 68 21 3d 49 4e 56 41  p->hFile.h!=INVA
1af50 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
1af60 20 29 7b 0a 20 20 20 20 20 20 20 20 53 69 6d 75   ){.        Simu
1af70 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
1af80 6e 28 31 29 3b 0a 20 20 20 20 20 20 20 20 77 69  n(1);.        wi
1af90 6e 43 6c 6f 73 65 28 28 73 71 6c 69 74 65 33 5f  nClose((sqlite3_
1afa0 66 69 6c 65 20 2a 29 26 70 2d 3e 68 46 69 6c 65  file *)&p->hFile
1afb0 29 3b 0a 20 20 20 20 20 20 20 20 53 69 6d 75 6c  );.        Simul
1afc0 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
1afd0 28 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  (0);.      }.   
1afe0 20 20 20 69 66 28 20 64 65 6c 65 74 65 46 6c 61     if( deleteFla
1aff0 67 20 29 7b 0a 20 20 20 20 20 20 20 20 53 69 6d  g ){.        Sim
1b000 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
1b010 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 20 20 73  gn(1);.        s
1b020 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
1b030 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20  nMalloc();.     
1b040 20 20 20 77 69 6e 44 65 6c 65 74 65 28 70 56 66     winDelete(pVf
1b050 73 2c 20 70 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  s, p->zFilename,
1b060 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
1b070 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
1b080 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20 53  loc();.        S
1b090 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
1b0a0 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 7d  nign(0);.      }
1b0b0 0a 20 20 20 20 20 20 2a 70 70 20 3d 20 70 2d 3e  .      *pp = p->
1b0c0 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 73 71 6c  pNext;.      sql
1b0d0 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 52 65  ite3_free(p->aRe
1b0e0 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c  gion);.      sql
1b0f0 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
1b100 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
1b110 70 20 3d 20 26 70 2d 3e 70 4e 65 78 74 3b 0a 20  p = &p->pNext;. 
1b120 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
1b130 2a 20 4f 70 65 6e 20 74 68 65 20 73 68 61 72 65  * Open the share
1b140 64 2d 6d 65 6d 6f 72 79 20 61 72 65 61 20 61 73  d-memory area as
1b150 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 64 61  sociated with da
1b160 74 61 62 61 73 65 20 66 69 6c 65 20 70 44 62 46  tabase file pDbF
1b170 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6f 70  d..**.** When op
1b180 65 6e 69 6e 67 20 61 20 6e 65 77 20 73 68 61 72  ening a new shar
1b190 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20  ed-memory file, 
1b1a0 69 66 20 6e 6f 20 6f 74 68 65 72 20 69 6e 73 74  if no other inst
1b1b0 61 6e 63 65 73 20 6f 66 20 74 68 61 74 0a 2a 2a  ances of that.**
1b1c0 20 66 69 6c 65 20 61 72 65 20 63 75 72 72 65 6e   file are curren
1b1d0 74 6c 79 20 6f 70 65 6e 2c 20 69 6e 20 74 68 69  tly open, in thi
1b1e0 73 20 70 72 6f 63 65 73 73 20 6f 72 20 69 6e 20  s process or in 
1b1f0 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 2c  other processes,
1b200 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 66 69 6c   then.** the fil
1b210 65 20 6d 75 73 74 20 62 65 20 74 72 75 6e 63 61  e must be trunca
1b220 74 65 64 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67  ted to zero leng
1b230 74 68 20 6f 72 20 68 61 76 65 20 69 74 73 20 68  th or have its h
1b240 65 61 64 65 72 20 63 6c 65 61 72 65 64 2e 0a 2a  eader cleared..*
1b250 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
1b260 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79  OpenSharedMemory
1b270 28 77 69 6e 46 69 6c 65 20 2a 70 44 62 46 64 29  (winFile *pDbFd)
1b280 7b 0a 20 20 73 74 72 75 63 74 20 77 69 6e 53 68  {.  struct winSh
1b290 6d 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  m *p;           
1b2a0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
1b2b0 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65 20 6f  nnection to be o
1b2c0 70 65 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75 63  pened */.  struc
1b2d0 74 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53  t winShmNode *pS
1b2e0 68 6d 4e 6f 64 65 20 3d 20 30 3b 20 20 20 2f 2a  hmNode = 0;   /*
1b2f0 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   The underlying 
1b300 6d 6d 61 70 70 65 64 20 66 69 6c 65 20 2a 2f 0a  mmapped file */.
1b310 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
1b320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b330 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
1b340 6f 64 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ode */.  struct 
1b350 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 4e 65 77  winShmNode *pNew
1b360 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
1b370 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 77  ewly allocated w
1b380 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 69  inShmNode */.  i
1b390 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20  nt nName;       
1b3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b3b0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 7a 4e 61    /* Size of zNa
1b3c0 6d 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 0a  me in bytes */..
1b3d0 20 20 61 73 73 65 72 74 28 20 70 44 62 46 64 2d    assert( pDbFd-
1b3e0 3e 70 53 68 6d 3d 3d 30 20 29 3b 20 20 20 20 2f  >pShm==0 );    /
1b3f0 2a 20 4e 6f 74 20 70 72 65 76 69 6f 75 73 6c 79  * Not previously
1b400 20 6f 70 65 6e 65 64 20 2a 2f 0a 0a 20 20 2f 2a   opened */..  /*
1b410 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   Allocate space 
1b420 66 6f 72 20 74 68 65 20 6e 65 77 20 73 71 6c 69  for the new sqli
1b430 74 65 33 5f 73 68 6d 20 6f 62 6a 65 63 74 2e 20  te3_shm object. 
1b440 20 41 6c 73 6f 20 73 70 65 63 75 6c 61 74 69 76   Also speculativ
1b450 65 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74  ely.  ** allocat
1b460 65 20 73 70 61 63 65 20 66 6f 72 20 61 20 6e 65  e space for a ne
1b470 77 20 77 69 6e 53 68 6d 4e 6f 64 65 20 61 6e 64  w winShmNode and
1b480 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 2a 2f 0a   filename..  */.
1b490 20 20 70 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c    p = sqlite3Mal
1b4a0 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28  locZero( sizeof(
1b4b0 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d  *p) );.  if( p==
1b4c0 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
1b4d0 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20  E_IOERR_NOMEM;. 
1b4e0 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   nName = sqlite3
1b4f0 53 74 72 6c 65 6e 33 30 28 70 44 62 46 64 2d 3e  Strlen30(pDbFd->
1b500 7a 50 61 74 68 29 3b 0a 20 20 70 4e 65 77 20 3d  zPath);.  pNew =
1b510 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
1b520 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70 53 68 6d  ro( sizeof(*pShm
1b530 4e 6f 64 65 29 20 2b 20 6e 4e 61 6d 65 20 2b 20  Node) + nName + 
1b540 31 37 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  17 );.  if( pNew
1b550 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
1b560 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20  e3_free(p);.    
1b570 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
1b580 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ERR_NOMEM;.  }. 
1b590 20 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65   pNew->zFilename
1b5a0 20 3d 20 28 63 68 61 72 2a 29 26 70 4e 65 77 5b   = (char*)&pNew[
1b5b0 31 5d 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e  1];.  sqlite3_sn
1b5c0 70 72 69 6e 74 66 28 6e 4e 61 6d 65 2b 31 35 2c  printf(nName+15,
1b5d0 20 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65   pNew->zFilename
1b5e0 2c 20 22 25 73 2d 73 68 6d 22 2c 20 70 44 62 46  , "%s-shm", pDbF
1b5f0 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 73 71 6c  d->zPath);.  sql
1b600 69 74 65 33 46 69 6c 65 53 75 66 66 69 78 33 28  ite3FileSuffix3(
1b610 70 44 62 46 64 2d 3e 7a 50 61 74 68 2c 20 70 4e  pDbFd->zPath, pN
1b620 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  ew->zFilename);.
1b630 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 74 6f 20 73 65  .  /* Look to se
1b640 65 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e  e if there is an
1b650 20 65 78 69 73 74 69 6e 67 20 77 69 6e 53 68 6d   existing winShm
1b660 4e 6f 64 65 20 74 68 61 74 20 63 61 6e 20 62 65  Node that can be
1b670 20 75 73 65 64 2e 0a 20 20 2a 2a 20 49 66 20 6e   used..  ** If n
1b680 6f 20 6d 61 74 63 68 69 6e 67 20 77 69 6e 53 68  o matching winSh
1b690 6d 4e 6f 64 65 20 63 75 72 72 65 6e 74 6c 79 20  mNode currently 
1b6a0 65 78 69 73 74 73 2c 20 63 72 65 61 74 65 20 61  exists, create a
1b6b0 20 6e 65 77 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20   new one..  */. 
1b6c0 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65   winShmEnterMute
1b6d0 78 28 29 3b 0a 20 20 66 6f 72 28 70 53 68 6d 4e  x();.  for(pShmN
1b6e0 6f 64 65 20 3d 20 77 69 6e 53 68 6d 4e 6f 64 65  ode = winShmNode
1b6f0 4c 69 73 74 3b 20 70 53 68 6d 4e 6f 64 65 3b 20  List; pShmNode; 
1b700 70 53 68 6d 4e 6f 64 65 3d 70 53 68 6d 4e 6f 64  pShmNode=pShmNod
1b710 65 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 2f  e->pNext){.    /
1b720 2a 20 54 42 44 20 6e 65 65 64 20 74 6f 20 63 6f  * TBD need to co
1b730 6d 65 20 75 70 20 77 69 74 68 20 62 65 74 74 65  me up with bette
1b740 72 20 6d 61 74 63 68 20 68 65 72 65 2e 20 20 50  r match here.  P
1b750 65 72 68 61 70 73 0a 20 20 20 20 2a 2a 20 75 73  erhaps.    ** us
1b760 65 20 46 49 4c 45 5f 49 44 5f 42 4f 54 48 5f 44  e FILE_ID_BOTH_D
1b770 49 52 5f 49 4e 46 4f 20 53 74 72 75 63 74 75 72  IR_INFO Structur
1b780 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
1b790 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
1b7a0 28 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65  (pShmNode->zFile
1b7b0 6e 61 6d 65 2c 20 70 4e 65 77 2d 3e 7a 46 69 6c  name, pNew->zFil
1b7c0 65 6e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61  ename)==0 ) brea
1b7d0 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 68  k;.  }.  if( pSh
1b7e0 6d 4e 6f 64 65 20 29 7b 0a 20 20 20 20 73 71 6c  mNode ){.    sql
1b7f0 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77 29 3b  ite3_free(pNew);
1b800 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 53  .  }else{.    pS
1b810 68 6d 4e 6f 64 65 20 3d 20 70 4e 65 77 3b 0a 20  hmNode = pNew;. 
1b820 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20     pNew = 0;.   
1b830 20 28 28 77 69 6e 46 69 6c 65 2a 29 28 26 70 53   ((winFile*)(&pS
1b840 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 29 29 2d  hmNode->hFile))-
1b850 3e 68 20 3d 20 49 4e 56 41 4c 49 44 5f 48 41 4e  >h = INVALID_HAN
1b860 44 4c 45 5f 56 41 4c 55 45 3b 0a 20 20 20 20 70  DLE_VALUE;.    p
1b870 53 68 6d 4e 6f 64 65 2d 3e 70 4e 65 78 74 20 3d  ShmNode->pNext =
1b880 20 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 3b   winShmNodeList;
1b890 0a 20 20 20 20 77 69 6e 53 68 6d 4e 6f 64 65 4c  .    winShmNodeL
1b8a0 69 73 74 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a  ist = pShmNode;.
1b8b0 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d  .    pShmNode->m
1b8c0 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d  utex = sqlite3_m
1b8d0 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54  utex_alloc(SQLIT
1b8e0 45 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a 20  E_MUTEX_FAST);. 
1b8f0 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d     if( pShmNode-
1b900 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20  >mutex==0 ){.   
1b910 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
1b920 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  OERR_NOMEM;.    
1b930 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f    goto shm_open_
1b940 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  err;.    }..    
1b950 72 63 20 3d 20 77 69 6e 4f 70 65 6e 28 70 44 62  rc = winOpen(pDb
1b960 46 64 2d 3e 70 56 66 73 2c 0a 20 20 20 20 20 20  Fd->pVfs,.      
1b970 20 20 20 20 20 20 20 20 20 20 20 70 53 68 6d 4e             pShmN
1b980 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20  ode->zFilename, 
1b990 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1b9a0 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ame of the file 
1b9b0 28 55 54 46 2d 38 29 20 2a 2f 0a 20 20 20 20 20  (UTF-8) */.     
1b9c0 20 20 20 20 20 20 20 20 20 20 20 20 28 73 71 6c              (sql
1b9d0 69 74 65 33 5f 66 69 6c 65 2a 29 26 70 53 68 6d  ite3_file*)&pShm
1b9e0 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c 20 20 2f 2a  Node->hFile,  /*
1b9f0 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 68 65 72   File handle her
1ba00 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  e */.           
1ba10 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
1ba20 4e 5f 57 41 4c 20 7c 20 53 51 4c 49 54 45 5f 4f  N_WAL | SQLITE_O
1ba30 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20  PEN_READWRITE | 
1ba40 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
1ba50 54 45 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  TE,.            
1ba60 20 20 20 20 20 30 29 3b 0a 20 20 20 20 69 66 28       0);.    if(
1ba70 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29   SQLITE_OK!=rc )
1ba80 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d  {.      goto shm
1ba90 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d  _open_err;.    }
1baa0 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74  ..    /* Check t
1bab0 6f 20 73 65 65 20 69 66 20 61 6e 6f 74 68 65 72  o see if another
1bac0 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64   process is hold
1bad0 69 6e 67 20 74 68 65 20 64 65 61 64 2d 6d 61 6e  ing the dead-man
1bae0 20 73 77 69 74 63 68 2e 0a 20 20 20 20 2a 2a 20   switch..    ** 
1baf0 49 66 20 6e 6f 74 2c 20 74 72 75 6e 63 61 74 65  If not, truncate
1bb00 20 74 68 65 20 66 69 6c 65 20 74 6f 20 7a 65 72   the file to zer
1bb10 6f 20 6c 65 6e 67 74 68 2e 0a 20 20 20 20 2a 2f  o length..    */
1bb20 0a 20 20 20 20 69 66 28 20 77 69 6e 53 68 6d 53  .    if( winShmS
1bb30 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f  ystemLock(pShmNo
1bb40 64 65 2c 20 5f 53 48 4d 5f 57 52 4c 43 4b 2c 20  de, _SHM_WRLCK, 
1bb50 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3d  WIN_SHM_DMS, 1)=
1bb60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1bb70 20 20 20 20 72 63 20 3d 20 77 69 6e 54 72 75 6e      rc = winTrun
1bb80 63 61 74 65 28 28 73 71 6c 69 74 65 33 5f 66 69  cate((sqlite3_fi
1bb90 6c 65 20 2a 29 26 70 53 68 6d 4e 6f 64 65 2d 3e  le *)&pShmNode->
1bba0 68 46 69 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20  hFile, 0);.     
1bbb0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1bbc0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
1bbd0 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53   = winLogError(S
1bbe0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4f  QLITE_IOERR_SHMO
1bbf0 50 45 4e 2c 20 6f 73 47 65 74 4c 61 73 74 45 72  PEN, osGetLastEr
1bc00 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20  ror(),.         
1bc10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc20 22 77 69 6e 4f 70 65 6e 53 68 6d 22 2c 20 70 44  "winOpenShm", pD
1bc30 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  bFd->zPath);.   
1bc40 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
1bc50 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1bc60 20 29 7b 0a 20 20 20 20 20 20 77 69 6e 53 68 6d   ){.      winShm
1bc70 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e  SystemLock(pShmN
1bc80 6f 64 65 2c 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c  ode, _SHM_UNLCK,
1bc90 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31 29   WIN_SHM_DMS, 1)
1bca0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e  ;.      rc = win
1bcb0 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53  ShmSystemLock(pS
1bcc0 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 52 44 4c  hmNode, _SHM_RDL
1bcd0 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c  CK, WIN_SHM_DMS,
1bce0 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   1);.    }.    i
1bcf0 66 28 20 72 63 20 29 20 67 6f 74 6f 20 73 68 6d  f( rc ) goto shm
1bd00 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 7d 0a 0a  _open_err;.  }..
1bd10 20 20 2f 2a 20 4d 61 6b 65 20 74 68 65 20 6e 65    /* Make the ne
1bd20 77 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 20 63  w connection a c
1bd30 68 69 6c 64 20 6f 66 20 74 68 65 20 77 69 6e 53  hild of the winS
1bd40 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 70 2d 3e 70  hmNode */.  p->p
1bd50 53 68 6d 4e 6f 64 65 20 3d 20 70 53 68 6d 4e 6f  ShmNode = pShmNo
1bd60 64 65 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  de;.#ifdef SQLIT
1bd70 45 5f 44 45 42 55 47 0a 20 20 70 2d 3e 69 64 20  E_DEBUG.  p->id 
1bd80 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 65 78 74  = pShmNode->next
1bd90 53 68 6d 49 64 2b 2b 3b 0a 23 65 6e 64 69 66 0a  ShmId++;.#endif.
1bda0 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66    pShmNode->nRef
1bdb0 2b 2b 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53 68  ++;.  pDbFd->pSh
1bdc0 6d 20 3d 20 70 3b 0a 20 20 77 69 6e 53 68 6d 4c  m = p;.  winShmL
1bdd0 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 0a 20 20  eaveMutex();..  
1bde0 2f 2a 20 54 68 65 20 72 65 66 65 72 65 6e 63 65  /* The reference
1bdf0 20 63 6f 75 6e 74 20 6f 6e 20 70 53 68 6d 4e 6f   count on pShmNo
1be00 64 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  de has already b
1be10 65 65 6e 20 69 6e 63 72 65 6d 65 6e 74 65 64 20  een incremented 
1be20 75 6e 64 65 72 0a 20 20 2a 2a 20 74 68 65 20 63  under.  ** the c
1be30 6f 76 65 72 20 6f 66 20 74 68 65 20 77 69 6e 53  over of the winS
1be40 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 29 20 6d  hmEnterMutex() m
1be50 75 74 65 78 20 61 6e 64 20 74 68 65 20 70 6f 69  utex and the poi
1be60 6e 74 65 72 20 66 72 6f 6d 20 74 68 65 0a 20 20  nter from the.  
1be70 2a 2a 20 6e 65 77 20 28 73 74 72 75 63 74 20 77  ** new (struct w
1be80 69 6e 53 68 6d 29 20 6f 62 6a 65 63 74 20 74 6f  inShm) object to
1be90 20 74 68 65 20 70 53 68 6d 4e 6f 64 65 20 68 61   the pShmNode ha
1bea0 73 20 62 65 65 6e 20 73 65 74 2e 20 41 6c 6c 20  s been set. All 
1beb0 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 6c 65 66  that is.  ** lef
1bec0 74 20 74 6f 20 64 6f 20 69 73 20 74 6f 20 6c 69  t to do is to li
1bed0 6e 6b 20 74 68 65 20 6e 65 77 20 6f 62 6a 65 63  nk the new objec
1bee0 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65  t into the linke
1bef0 64 20 6c 69 73 74 20 73 74 61 72 74 69 6e 67 0a  d list starting.
1bf00 20 20 2a 2a 20 61 74 20 70 53 68 6d 4e 6f 64 65    ** at pShmNode
1bf10 2d 3e 70 46 69 72 73 74 2e 20 54 68 69 73 20 6d  ->pFirst. This m
1bf20 75 73 74 20 62 65 20 64 6f 6e 65 20 77 68 69 6c  ust be done whil
1bf30 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 70 53  e holding the pS
1bf40 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 0a 20 20  hmNode->mutex.  
1bf50 2a 2a 20 6d 75 74 65 78 2e 0a 20 20 2a 2f 0a 20  ** mutex..  */. 
1bf60 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
1bf70 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  nter(pShmNode->m
1bf80 75 74 65 78 29 3b 0a 20 20 70 2d 3e 70 4e 65 78  utex);.  p->pNex
1bf90 74 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46  t = pShmNode->pF
1bfa0 69 72 73 74 3b 0a 20 20 70 53 68 6d 4e 6f 64 65  irst;.  pShmNode
1bfb0 2d 3e 70 46 69 72 73 74 20 3d 20 70 3b 0a 20 20  ->pFirst = p;.  
1bfc0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
1bfd0 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  ave(pShmNode->mu
1bfe0 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  tex);.  return S
1bff0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20  QLITE_OK;..  /* 
1c000 4a 75 6d 70 20 68 65 72 65 20 6f 6e 20 61 6e 79  Jump here on any
1c010 20 65 72 72 6f 72 20 2a 2f 0a 73 68 6d 5f 6f 70   error */.shm_op
1c020 65 6e 5f 65 72 72 3a 0a 20 20 77 69 6e 53 68 6d  en_err:.  winShm
1c030 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e  SystemLock(pShmN
1c040 6f 64 65 2c 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c  ode, _SHM_UNLCK,
1c050 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31 29   WIN_SHM_DMS, 1)
1c060 3b 0a 20 20 77 69 6e 53 68 6d 50 75 72 67 65 28  ;.  winShmPurge(
1c070 70 44 62 46 64 2d 3e 70 56 66 73 2c 20 30 29 3b  pDbFd->pVfs, 0);
1c080 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61        /* This ca
1c090 6c 6c 20 66 72 65 65 73 20 70 53 68 6d 4e 6f 64  ll frees pShmNod
1c0a0 65 20 69 66 20 72 65 71 75 69 72 65 64 20 2a 2f  e if required */
1c0b0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
1c0c0 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  p);.  sqlite3_fr
1c0d0 65 65 28 70 4e 65 77 29 3b 0a 20 20 77 69 6e 53  ee(pNew);.  winS
1c0e0 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  hmLeaveMutex();.
1c0f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1c100 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63 6f  /*.** Close a co
1c110 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 73 68 61 72  nnection to shar
1c120 65 64 2d 6d 65 6d 6f 72 79 2e 20 20 44 65 6c 65  ed-memory.  Dele
1c130 74 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  te the underlyin
1c140 67 0a 2a 2a 20 73 74 6f 72 61 67 65 20 69 66 20  g.** storage if 
1c150 64 65 6c 65 74 65 46 6c 61 67 20 69 73 20 74 72  deleteFlag is tr
1c160 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ue..*/.static in
1c170 74 20 77 69 6e 53 68 6d 55 6e 6d 61 70 28 0a 20  t winShmUnmap(. 
1c180 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66   sqlite3_file *f
1c190 64 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  d,          /* D
1c1a0 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 20  atabase holding 
1c1b0 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f  shared memory */
1c1c0 0a 20 20 69 6e 74 20 64 65 6c 65 74 65 46 6c 61  .  int deleteFla
1c1d0 67 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  g             /*
1c1e0 20 44 65 6c 65 74 65 20 61 66 74 65 72 20 63 6c   Delete after cl
1c1f0 6f 73 69 6e 67 20 69 66 20 74 72 75 65 20 2a 2f  osing if true */
1c200 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70  .){.  winFile *p
1c210 44 62 46 64 3b 20 20 20 20 20 20 20 2f 2a 20 44  DbFd;       /* D
1c220 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 20  atabase holding 
1c230 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 2a 2f  shared-memory */
1c240 0a 20 20 77 69 6e 53 68 6d 20 2a 70 3b 20 20 20  .  winShm *p;   
1c250 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1c260 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65  connection to be
1c270 20 63 6c 6f 73 65 64 20 2a 2f 0a 20 20 77 69 6e   closed */.  win
1c280 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64  ShmNode *pShmNod
1c290 65 3b 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c  e; /* The underl
1c2a0 79 69 6e 67 20 73 68 61 72 65 64 2d 6d 65 6d 6f  ying shared-memo
1c2b0 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 77 69 6e  ry file */.  win
1c2c0 53 68 6d 20 2a 2a 70 70 3b 20 20 20 20 20 20 20  Shm **pp;       
1c2d0 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e     /* For loopin
1c2e0 67 20 6f 76 65 72 20 73 69 62 6c 69 6e 67 20 63  g over sibling c
1c2f0 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20  onnections */.. 
1c300 20 70 44 62 46 64 20 3d 20 28 77 69 6e 46 69 6c   pDbFd = (winFil
1c310 65 2a 29 66 64 3b 0a 20 20 70 20 3d 20 70 44 62  e*)fd;.  p = pDb
1c320 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 69 66 28 20  Fd->pShm;.  if( 
1c330 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  p==0 ) return SQ
1c340 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 53 68 6d 4e  LITE_OK;.  pShmN
1c350 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64  ode = p->pShmNod
1c360 65 3b 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20  e;..  /* Remove 
1c370 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 66 72 6f  connection p fro
1c380 6d 20 74 68 65 20 73 65 74 20 6f 66 20 63 6f 6e  m the set of con
1c390 6e 65 63 74 69 6f 6e 73 20 61 73 73 6f 63 69 61  nections associa
1c3a0 74 65 64 0a 20 20 2a 2a 20 77 69 74 68 20 70 53  ted.  ** with pS
1c3b0 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69  hmNode */.  sqli
1c3c0 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
1c3d0 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
1c3e0 3b 0a 20 20 66 6f 72 28 70 70 3d 26 70 53 68 6d  ;.  for(pp=&pShm
1c3f0 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 28 2a  Node->pFirst; (*
1c400 70 70 29 21 3d 70 3b 20 70 70 20 3d 20 26 28 2a  pp)!=p; pp = &(*
1c410 70 70 29 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20  pp)->pNext){}.  
1c420 2a 70 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  *pp = p->pNext;.
1c430 0a 20 20 2f 2a 20 46 72 65 65 20 74 68 65 20 63  .  /* Free the c
1c440 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 2a 2f 0a 20  onnection p */. 
1c450 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
1c460 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53 68 6d 20  ;.  pDbFd->pShm 
1c470 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  = 0;.  sqlite3_m
1c480 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e  utex_leave(pShmN
1c490 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 0a 20 20  ode->mutex);..  
1c4a0 2f 2a 20 49 66 20 70 53 68 6d 4e 6f 64 65 2d 3e  /* If pShmNode->
1c4b0 6e 52 65 66 20 68 61 73 20 72 65 61 63 68 65 64  nRef has reached
1c4c0 20 30 2c 20 74 68 65 6e 20 63 6c 6f 73 65 20 74   0, then close t
1c4d0 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a 20 20  he underlying.  
1c4e0 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ** shared-memory
1c4f0 20 66 69 6c 65 2c 20 74 6f 6f 20 2a 2f 0a 20 20   file, too */.  
1c500 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78  winShmEnterMutex
1c510 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53  ();.  assert( pS
1c520 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3e 30 20 29  hmNode->nRef>0 )
1c530 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  ;.  pShmNode->nR
1c540 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 53 68 6d  ef--;.  if( pShm
1c550 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b  Node->nRef==0 ){
1c560 0a 20 20 20 20 77 69 6e 53 68 6d 50 75 72 67 65  .    winShmPurge
1c570 28 70 44 62 46 64 2d 3e 70 56 66 73 2c 20 64 65  (pDbFd->pVfs, de
1c580 6c 65 74 65 46 6c 61 67 29 3b 0a 20 20 7d 0a 20  leteFlag);.  }. 
1c590 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65   winShmLeaveMute
1c5a0 78 28 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53  x();..  return S
1c5b0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
1c5c0 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6c 6f  ** Change the lo
1c5d0 63 6b 20 73 74 61 74 65 20 66 6f 72 20 61 20 73  ck state for a s
1c5e0 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73 65 67  hared-memory seg
1c5f0 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
1c600 69 6e 74 20 77 69 6e 53 68 6d 4c 6f 63 6b 28 0a  int winShmLock(.
1c610 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
1c620 66 64 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  fd,          /* 
1c630 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 6f  Database file ho
1c640 6c 64 69 6e 67 20 74 68 65 20 73 68 61 72 65 64  lding the shared
1c650 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74   memory */.  int
1c660 20 6f 66 73 74 2c 20 20 20 20 20 20 20 20 20 20   ofst,          
1c670 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
1c680 20 6c 6f 63 6b 20 74 6f 20 61 63 71 75 69 72 65   lock to acquire
1c690 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20   or release */. 
1c6a0 20 69 6e 74 20 6e 2c 20 20 20 20 20 20 20 20 20   int n,         
1c6b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1c6c0 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20 74  umber of locks t
1c6d0 6f 20 61 63 71 75 69 72 65 20 6f 72 20 72 65 6c  o acquire or rel
1c6e0 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  ease */.  int fl
1c6f0 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20 20  ags             
1c700 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20       /* What to 
1c710 64 6f 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b  do with the lock
1c720 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65   */.){.  winFile
1c730 20 2a 70 44 62 46 64 20 3d 20 28 77 69 6e 46 69   *pDbFd = (winFi
1c740 6c 65 2a 29 66 64 3b 20 20 20 20 20 20 20 20 2f  le*)fd;        /
1c750 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 68 6f 6c  * Connection hol
1c760 64 69 6e 67 20 73 68 61 72 65 64 20 6d 65 6d 6f  ding shared memo
1c770 72 79 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a  ry */.  winShm *
1c780 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b  p = pDbFd->pShm;
1c790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c7a0 20 54 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f   The shared memo
1c7b0 72 79 20 62 65 69 6e 67 20 6c 6f 63 6b 65 64 20  ry being locked 
1c7c0 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70 58 3b  */.  winShm *pX;
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 20 20 20 2f 2a 20 46 6f             /* Fo
1c7f0 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 61  r looping over a
1c800 6c 6c 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 20  ll siblings */. 
1c810 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68   winShmNode *pSh
1c820 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e  mNode = p->pShmN
1c830 6f 64 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ode;.  int rc = 
1c840 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
1c850 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c860 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20  Result code */. 
1c870 20 75 31 36 20 6d 61 73 6b 3b 20 20 20 20 20 20   u16 mask;      
1c880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c890 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
1c8a0 66 20 6c 6f 63 6b 73 20 74 6f 20 74 61 6b 65 20  f locks to take 
1c8b0 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 0a 20  or release */.. 
1c8c0 20 61 73 73 65 72 74 28 20 6f 66 73 74 3e 3d 30   assert( ofst>=0
1c8d0 20 26 26 20 6f 66 73 74 2b 6e 3c 3d 53 51 4c 49   && ofst+n<=SQLI
1c8e0 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a  TE_SHM_NLOCK );.
1c8f0 20 20 61 73 73 65 72 74 28 20 6e 3e 3d 31 20 29    assert( n>=1 )
1c900 3b 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61 67  ;.  assert( flag
1c910 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 4c  s==(SQLITE_SHM_L
1c920 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d  OCK | SQLITE_SHM
1c930 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20 20 20  _SHARED).       
1c940 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54  || flags==(SQLIT
1c950 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c  E_SHM_LOCK | SQL
1c960 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56  ITE_SHM_EXCLUSIV
1c970 45 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61  E).       || fla
1c980 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f  gs==(SQLITE_SHM_
1c990 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f  UNLOCK | SQLITE_
1c9a0 53 48 4d 5f 53 48 41 52 45 44 29 0a 20 20 20 20  SHM_SHARED).    
1c9b0 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51     || flags==(SQ
1c9c0 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20  LITE_SHM_UNLOCK 
1c9d0 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43  | SQLITE_SHM_EXC
1c9e0 4c 55 53 49 56 45 29 20 29 3b 0a 20 20 61 73 73  LUSIVE) );.  ass
1c9f0 65 72 74 28 20 6e 3d 3d 31 20 7c 7c 20 28 66 6c  ert( n==1 || (fl
1ca00 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d  ags & SQLITE_SHM
1ca10 5f 45 58 43 4c 55 53 49 56 45 29 21 3d 30 20 29  _EXCLUSIVE)!=0 )
1ca20 3b 0a 0a 20 20 6d 61 73 6b 20 3d 20 28 75 31 36  ;..  mask = (u16
1ca30 29 28 28 31 55 3c 3c 28 6f 66 73 74 2b 6e 29 29  )((1U<<(ofst+n))
1ca40 20 2d 20 28 31 55 3c 3c 6f 66 73 74 29 29 3b 0a   - (1U<<ofst));.
1ca50 20 20 61 73 73 65 72 74 28 20 6e 3e 31 20 7c 7c    assert( n>1 ||
1ca60 20 6d 61 73 6b 3d 3d 28 31 3c 3c 6f 66 73 74 29   mask==(1<<ofst)
1ca70 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   );.  sqlite3_mu
1ca80 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f  tex_enter(pShmNo
1ca90 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66  de->mutex);.  if
1caa0 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ( flags & SQLITE
1cab0 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20  _SHM_UNLOCK ){. 
1cac0 20 20 20 75 31 36 20 61 6c 6c 4d 61 73 6b 20 3d     u16 allMask =
1cad0 20 30 3b 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c   0; /* Mask of l
1cae0 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 73 69 62  ocks held by sib
1caf0 6c 69 6e 67 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a  lings */..    /*
1cb00 20 53 65 65 20 69 66 20 61 6e 79 20 73 69 62 6c   See if any sibl
1cb10 69 6e 67 73 20 68 6f 6c 64 20 74 68 69 73 20 73  ings hold this s
1cb20 61 6d 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  ame lock */.    
1cb30 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d  for(pX=pShmNode-
1cb40 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d  >pFirst; pX; pX=
1cb50 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  pX->pNext){.    
1cb60 20 20 69 66 28 20 70 58 3d 3d 70 20 29 20 63 6f    if( pX==p ) co
1cb70 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 61 73  ntinue;.      as
1cb80 73 65 72 74 28 20 28 70 58 2d 3e 65 78 63 6c 4d  sert( (pX->exclM
1cb90 61 73 6b 20 26 20 28 70 2d 3e 65 78 63 6c 4d 61  ask & (p->exclMa
1cba0 73 6b 7c 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b  sk|p->sharedMask
1cbb0 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  ))==0 );.      a
1cbc0 6c 6c 4d 61 73 6b 20 7c 3d 20 70 58 2d 3e 73 68  llMask |= pX->sh
1cbd0 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a  aredMask;.    }.
1cbe0 0a 20 20 20 20 2f 2a 20 55 6e 6c 6f 63 6b 20 74  .    /* Unlock t
1cbf0 68 65 20 73 79 73 74 65 6d 2d 6c 65 76 65 6c 20  he system-level 
1cc00 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28  locks */.    if(
1cc10 20 28 6d 61 73 6b 20 26 20 61 6c 6c 4d 61 73 6b   (mask & allMask
1cc20 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  )==0 ){.      rc
1cc30 20 3d 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c   = winShmSystemL
1cc40 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53  ock(pShmNode, _S
1cc50 48 4d 5f 55 4e 4c 43 4b 2c 20 6f 66 73 74 2b 57  HM_UNLCK, ofst+W
1cc60 49 4e 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b  IN_SHM_BASE, n);
1cc70 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1cc80 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
1cc90 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1cca0 55 6e 64 6f 20 74 68 65 20 6c 6f 63 61 6c 20 6c  Undo the local l
1ccb0 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28 20  ocks */.    if( 
1ccc0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1ccd0 0a 20 20 20 20 20 20 70 2d 3e 65 78 63 6c 4d 61  .      p->exclMa
1cce0 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20  sk &= ~mask;.   
1ccf0 20 20 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b     p->sharedMask
1cd00 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d   &= ~mask;.    }
1cd10 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61  .  }else if( fla
1cd20 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f  gs & SQLITE_SHM_
1cd30 53 48 41 52 45 44 20 29 7b 0a 20 20 20 20 75 31  SHARED ){.    u1
1cd40 36 20 61 6c 6c 53 68 61 72 65 64 20 3d 20 30 3b  6 allShared = 0;
1cd50 20 20 2f 2a 20 55 6e 69 6f 6e 20 6f 66 20 6c 6f    /* Union of lo
1cd60 63 6b 73 20 68 65 6c 64 20 62 79 20 63 6f 6e 6e  cks held by conn
1cd70 65 63 74 69 6f 6e 73 20 6f 74 68 65 72 20 74 68  ections other th
1cd80 61 6e 20 22 70 22 20 2a 2f 0a 0a 20 20 20 20 2f  an "p" */..    /
1cd90 2a 20 46 69 6e 64 20 6f 75 74 20 77 68 69 63 68  * Find out which
1cda0 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 61 72   shared locks ar
1cdb0 65 20 61 6c 72 65 61 64 79 20 68 65 6c 64 20 62  e already held b
1cdc0 79 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63  y sibling connec
1cdd0 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20 49 66  tions..    ** If
1cde0 20 61 6e 79 20 73 69 62 6c 69 6e 67 20 61 6c 72   any sibling alr
1cdf0 65 61 64 79 20 68 6f 6c 64 73 20 61 6e 20 65 78  eady holds an ex
1ce00 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20 67 6f  clusive lock, go
1ce10 20 61 68 65 61 64 20 61 6e 64 20 72 65 74 75 72   ahead and retur
1ce20 6e 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f  n.    ** SQLITE_
1ce30 42 55 53 59 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  BUSY..    */.   
1ce40 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65   for(pX=pShmNode
1ce50 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58  ->pFirst; pX; pX
1ce60 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  =pX->pNext){.   
1ce70 20 20 20 69 66 28 20 28 70 58 2d 3e 65 78 63 6c     if( (pX->excl
1ce80 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20  Mask & mask)!=0 
1ce90 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1cea0 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
1ceb0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1cec0 20 20 7d 0a 20 20 20 20 20 20 61 6c 6c 53 68 61    }.      allSha
1ced0 72 65 64 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65  red |= pX->share
1cee0 64 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  dMask;.    }..  
1cef0 20 20 2f 2a 20 47 65 74 20 73 68 61 72 65 64 20    /* Get shared 
1cf00 6c 6f 63 6b 73 20 61 74 20 74 68 65 20 73 79 73  locks at the sys
1cf10 74 65 6d 20 6c 65 76 65 6c 2c 20 69 66 20 6e 65  tem level, if ne
1cf20 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 20 20 69  cessary */.    i
1cf30 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1cf40 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 61   ){.      if( (a
1cf50 6c 6c 53 68 61 72 65 64 20 26 20 6d 61 73 6b 29  llShared & mask)
1cf60 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
1cf70 63 20 3d 20 77 69 6e 53 68 6d 53 79 73 74 65 6d  c = winShmSystem
1cf80 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f  Lock(pShmNode, _
1cf90 53 48 4d 5f 52 44 4c 43 4b 2c 20 6f 66 73 74 2b  SHM_RDLCK, ofst+
1cfa0 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29  WIN_SHM_BASE, n)
1cfb0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1cfc0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
1cfd0 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
1cfe0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74     }..    /* Get
1cff0 20 74 68 65 20 6c 6f 63 61 6c 20 73 68 61 72 65   the local share
1d000 64 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69  d locks */.    i
1d010 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1d020 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 73 68 61   ){.      p->sha
1d030 72 65 64 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b  redMask |= mask;
1d040 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
1d050 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65      /* Make sure
1d060 20 6e 6f 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e   no sibling conn
1d070 65 63 74 69 6f 6e 73 20 68 6f 6c 64 20 6c 6f 63  ections hold loc
1d080 6b 73 20 74 68 61 74 20 77 69 6c 6c 20 62 6c 6f  ks that will blo
1d090 63 6b 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 6c  ck this.    ** l
1d0a0 6f 63 6b 2e 20 20 49 66 20 61 6e 79 20 64 6f 2c  ock.  If any do,
1d0b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
1d0c0 55 53 59 20 72 69 67 68 74 20 61 77 61 79 2e 0a  USY right away..
1d0d0 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70      */.    for(p
1d0e0 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72  X=pShmNode->pFir
1d0f0 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70  st; pX; pX=pX->p
1d100 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28  Next){.      if(
1d110 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26   (pX->exclMask &
1d120 20 6d 61 73 6b 29 21 3d 30 20 7c 7c 20 28 70 58   mask)!=0 || (pX
1d130 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 20 6d  ->sharedMask & m
1d140 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ask)!=0 ){.     
1d150 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
1d160 55 53 59 3b 0a 20 20 20 20 20 20 20 20 62 72 65  USY;.        bre
1d170 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
1d180 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 74 68  }..    /* Get th
1d190 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  e exclusive lock
1d1a0 73 20 61 74 20 74 68 65 20 73 79 73 74 65 6d 20  s at the system 
1d1b0 6c 65 76 65 6c 2e 20 20 54 68 65 6e 20 69 66 20  level.  Then if 
1d1c0 73 75 63 63 65 73 73 66 75 6c 0a 20 20 20 20 2a  successful.    *
1d1d0 2a 20 61 6c 73 6f 20 6d 61 72 6b 20 74 68 65 20  * also mark the 
1d1e0 6c 6f 63 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e  local connection
1d1f0 20 61 73 20 62 65 69 6e 67 20 6c 6f 63 6b 65 64   as being locked
1d200 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1d210 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1d220 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e  {.      rc = win
1d230 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53  ShmSystemLock(pS
1d240 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 57 52 4c  hmNode, _SHM_WRL
1d250 43 4b 2c 20 6f 66 73 74 2b 57 49 4e 5f 53 48 4d  CK, ofst+WIN_SHM
1d260 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20  _BASE, n);.     
1d270 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1d280 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  OK ){.        as
1d290 73 65 72 74 28 20 28 70 2d 3e 73 68 61 72 65 64  sert( (p->shared
1d2a0 4d 61 73 6b 20 26 20 6d 61 73 6b 29 3d 3d 30 20  Mask & mask)==0 
1d2b0 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 78  );.        p->ex
1d2c0 63 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a  clMask |= mask;.
1d2d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1d2e0 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
1d2f0 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65  x_leave(pShmNode
1d300 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 4f 53 54 52  ->mutex);.  OSTR
1d310 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 70  ACE(("SHM-LOCK p
1d320 69 64 3d 25 6c 75 2c 20 69 64 3d 25 64 2c 20 73  id=%lu, id=%d, s
1d330 68 61 72 65 64 4d 61 73 6b 3d 25 30 33 78 2c 20  haredMask=%03x, 
1d340 65 78 63 6c 4d 61 73 6b 3d 25 30 33 78 2c 20 72  exclMask=%03x, r
1d350 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  c=%s\n",.       
1d360 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74      osGetCurrent
1d370 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 2d 3e  ProcessId(), p->
1d380 69 64 2c 20 70 2d 3e 73 68 61 72 65 64 4d 61 73  id, p->sharedMas
1d390 6b 2c 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 2c 0a  k, p->exclMask,.
1d3a0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
1d3b0 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b  e3ErrName(rc)));
1d3c0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1d3d0 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
1d3e0 20 61 20 6d 65 6d 6f 72 79 20 62 61 72 72 69 65   a memory barrie
1d3f0 72 20 6f 72 20 6d 65 6d 6f 72 79 20 66 65 6e 63  r or memory fenc
1d400 65 20 6f 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f  e on shared memo
1d410 72 79 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6c 6f  ry..**.** All lo
1d420 61 64 73 20 61 6e 64 20 73 74 6f 72 65 73 20 62  ads and stores b
1d430 65 67 75 6e 20 62 65 66 6f 72 65 20 74 68 65 20  egun before the 
1d440 62 61 72 72 69 65 72 20 6d 75 73 74 20 63 6f 6d  barrier must com
1d450 70 6c 65 74 65 20 62 65 66 6f 72 65 0a 2a 2a 20  plete before.** 
1d460 61 6e 79 20 6c 6f 61 64 20 6f 72 20 73 74 6f 72  any load or stor
1d470 65 20 62 65 67 75 6e 20 61 66 74 65 72 20 74 68  e begun after th
1d480 65 20 62 61 72 72 69 65 72 2e 0a 2a 2f 0a 73 74  e barrier..*/.st
1d490 61 74 69 63 20 76 6f 69 64 20 77 69 6e 53 68 6d  atic void winShm
1d4a0 42 61 72 72 69 65 72 28 0a 20 20 73 71 6c 69 74  Barrier(.  sqlit
1d4b0 65 33 5f 66 69 6c 65 20 2a 66 64 20 20 20 20 20  e3_file *fd     
1d4c0 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
1d4d0 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 68 61   holding the sha
1d4e0 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b  red memory */.){
1d4f0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
1d500 54 45 52 28 66 64 29 3b 0a 20 20 2f 2a 20 4d 65  TER(fd);.  /* Me
1d510 6d 6f 72 79 42 61 72 72 69 65 72 28 29 3b 20 2f  moryBarrier(); /
1d520 2f 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20  / does not work 
1d530 2d 2d 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 20 77  -- do not know w
1d540 68 79 20 6e 6f 74 20 2a 2f 0a 20 20 77 69 6e 53  hy not */.  winS
1d550 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  hmEnterMutex();.
1d560 20 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74    winShmLeaveMut
1d570 65 78 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ex();.}../*.** T
1d580 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1d590 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e  called to obtain
1d5a0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 72 65   a pointer to re
1d5b0 67 69 6f 6e 20 69 52 65 67 69 6f 6e 20 6f 66 20  gion iRegion of 
1d5c0 74 68 65 0a 2a 2a 20 73 68 61 72 65 64 2d 6d 65  the.** shared-me
1d5d0 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20  mory associated 
1d5e0 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73  with the databas
1d5f0 65 20 66 69 6c 65 20 66 64 2e 20 53 68 61 72 65  e file fd. Share
1d600 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73  d-memory regions
1d610 0a 2a 2a 20 61 72 65 20 6e 75 6d 62 65 72 65 64  .** are numbered
1d620 20 73 74 61 72 74 69 6e 67 20 66 72 6f 6d 20 7a   starting from z
1d630 65 72 6f 2e 20 45 61 63 68 20 73 68 61 72 65 64  ero. Each shared
1d640 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 69  -memory region i
1d650 73 20 73 7a 52 65 67 69 6f 6e 0a 2a 2a 20 62 79  s szRegion.** by
1d660 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a  tes in size..**.
1d670 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
1d680 63 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20  ccurs, an error 
1d690 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
1d6a0 20 61 6e 64 20 2a 70 70 20 69 73 20 73 65 74 20   and *pp is set 
1d6b0 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 4f  to NULL..**.** O
1d6c0 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65  therwise, if the
1d6d0 20 69 73 57 72 69 74 65 20 70 61 72 61 6d 65 74   isWrite paramet
1d6e0 65 72 20 69 73 20 30 20 61 6e 64 20 74 68 65 20  er is 0 and the 
1d6f0 72 65 71 75 65 73 74 65 64 20 73 68 61 72 65 64  requested shared
1d700 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 72 65 67 69 6f  -memory.** regio
1d710 6e 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61  n has not been a
1d720 6c 6c 6f 63 61 74 65 64 20 28 62 79 20 61 6e 79  llocated (by any
1d730 20 63 6c 69 65 6e 74 2c 20 69 6e 63 6c 75 64 69   client, includi
1d740 6e 67 20 6f 6e 65 20 72 75 6e 6e 69 6e 67 20 69  ng one running i
1d750 6e 20 61 0a 2a 2a 20 73 65 70 61 72 61 74 65 20  n a.** separate 
1d760 70 72 6f 63 65 73 73 29 2c 20 74 68 65 6e 20 2a  process), then *
1d770 70 70 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c  pp is set to NUL
1d780 4c 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  L and SQLITE_OK 
1d790 72 65 74 75 72 6e 65 64 2e 20 49 66 0a 2a 2a 20  returned. If.** 
1d7a0 69 73 57 72 69 74 65 20 69 73 20 6e 6f 6e 2d 7a  isWrite is non-z
1d7b0 65 72 6f 20 61 6e 64 20 74 68 65 20 72 65 71 75  ero and the requ
1d7c0 65 73 74 65 64 20 73 68 61 72 65 64 2d 6d 65 6d  ested shared-mem
1d7d0 6f 72 79 20 72 65 67 69 6f 6e 20 68 61 73 20 6e  ory region has n
1d7e0 6f 74 20 79 65 74 0a 2a 2a 20 62 65 65 6e 20 61  ot yet.** been a
1d7f0 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20 69 73 20  llocated, it is 
1d800 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69  allocated by thi
1d810 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  s function..**.*
1d820 2a 20 49 66 20 74 68 65 20 73 68 61 72 65 64 2d  * If the shared-
1d830 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 68 61  memory region ha
1d840 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61  s already been a
1d850 6c 6c 6f 63 61 74 65 64 20 6f 72 20 69 73 20 61  llocated or is a
1d860 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20 74  llocated by.** t
1d870 68 69 73 20 63 61 6c 6c 20 61 73 20 64 65 73 63  his call as desc
1d880 72 69 62 65 64 20 61 62 6f 76 65 2c 20 74 68 65  ribed above, the
1d890 6e 20 69 74 20 69 73 20 6d 61 70 70 65 64 20 69  n it is mapped i
1d8a0 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73  nto this process
1d8b0 65 73 0a 2a 2a 20 61 64 64 72 65 73 73 20 73 70  es.** address sp
1d8c0 61 63 65 20 28 69 66 20 69 74 20 69 73 20 6e 6f  ace (if it is no
1d8d0 74 20 61 6c 72 65 61 64 79 29 2c 20 2a 70 70 20  t already), *pp 
1d8e0 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  is set to point 
1d8f0 74 6f 20 74 68 65 20 6d 61 70 70 65 64 0a 2a 2a  to the mapped.**
1d900 20 6d 65 6d 6f 72 79 20 61 6e 64 20 53 51 4c 49   memory and SQLI
1d910 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a  TE_OK returned..
1d920 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
1d930 6e 53 68 6d 4d 61 70 28 0a 20 20 73 71 6c 69 74  nShmMap(.  sqlit
1d940 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20  e3_file *fd,    
1d950 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
1d960 6e 64 6c 65 20 6f 70 65 6e 20 6f 6e 20 64 61 74  ndle open on dat
1d970 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
1d980 69 6e 74 20 69 52 65 67 69 6f 6e 2c 20 20 20 20  int iRegion,    
1d990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d9a0 2f 2a 20 52 65 67 69 6f 6e 20 74 6f 20 72 65 74  /* Region to ret
1d9b0 72 69 65 76 65 20 2a 2f 0a 20 20 69 6e 74 20 73  rieve */.  int s
1d9c0 7a 52 65 67 69 6f 6e 2c 20 20 20 20 20 20 20 20  zRegion,        
1d9d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
1d9e0 7a 65 20 6f 66 20 72 65 67 69 6f 6e 73 20 2a 2f  ze of regions */
1d9f0 0a 20 20 69 6e 74 20 69 73 57 72 69 74 65 2c 20  .  int isWrite, 
1da00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1da10 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 78     /* True to ex
1da20 74 65 6e 64 20 66 69 6c 65 20 69 66 20 6e 65 63  tend file if nec
1da30 65 73 73 61 72 79 20 2a 2f 0a 20 20 76 6f 69 64  essary */.  void
1da40 20 76 6f 6c 61 74 69 6c 65 20 2a 2a 70 70 20 20   volatile **pp  
1da50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
1da60 55 54 3a 20 4d 61 70 70 65 64 20 6d 65 6d 6f 72  UT: Mapped memor
1da70 79 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46 69 6c  y */.){.  winFil
1da80 65 20 2a 70 44 62 46 64 20 3d 20 28 77 69 6e 46  e *pDbFd = (winF
1da90 69 6c 65 2a 29 66 64 3b 0a 20 20 77 69 6e 53 68  ile*)fd;.  winSh
1daa0 6d 20 2a 70 20 3d 20 70 44 62 46 64 2d 3e 70 53  m *p = pDbFd->pS
1dab0 68 6d 3b 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65  hm;.  winShmNode
1dac0 20 2a 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 6e   *pShmNode;.  in
1dad0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1dae0 3b 0a 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20  ;..  if( !p ){. 
1daf0 20 20 20 72 63 20 3d 20 77 69 6e 4f 70 65 6e 53     rc = winOpenS
1db00 68 61 72 65 64 4d 65 6d 6f 72 79 28 70 44 62 46  haredMemory(pDbF
1db10 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  d);.    if( rc!=
1db20 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
1db30 72 6e 20 72 63 3b 0a 20 20 20 20 70 20 3d 20 70  rn rc;.    p = p
1db40 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 7d 0a  DbFd->pShm;.  }.
1db50 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e    pShmNode = p->
1db60 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20 73 71 6c  pShmNode;..  sql
1db70 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
1db80 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
1db90 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a 52  );.  assert( szR
1dba0 65 67 69 6f 6e 3d 3d 70 53 68 6d 4e 6f 64 65 2d  egion==pShmNode-
1dbb0 3e 73 7a 52 65 67 69 6f 6e 20 7c 7c 20 70 53 68  >szRegion || pSh
1dbc0 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3d 3d  mNode->nRegion==
1dbd0 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 53 68 6d  0 );..  if( pShm
1dbe0 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d 69  Node->nRegion<=i
1dbf0 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 73 74  Region ){.    st
1dc00 72 75 63 74 20 53 68 6d 52 65 67 69 6f 6e 20 2a  ruct ShmRegion *
1dc10 61 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20  apNew;          
1dc20 20 2f 2a 20 4e 65 77 20 61 52 65 67 69 6f 6e 5b   /* New aRegion[
1dc30 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 69  ] array */.    i
1dc40 6e 74 20 6e 42 79 74 65 20 3d 20 28 69 52 65 67  nt nByte = (iReg
1dc50 69 6f 6e 2b 31 29 2a 73 7a 52 65 67 69 6f 6e 3b  ion+1)*szRegion;
1dc60 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 72 65 71    /* Minimum req
1dc70 75 69 72 65 64 20 66 69 6c 65 20 73 69 7a 65 20  uired file size 
1dc80 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69  */.    sqlite3_i
1dc90 6e 74 36 34 20 73 7a 3b 20 20 20 20 20 20 20 20  nt64 sz;        
1dca0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
1dcb0 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 77 61 6c  rent size of wal
1dcc0 2d 69 6e 64 65 78 20 66 69 6c 65 20 2a 2f 0a 0a  -index file */..
1dcd0 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a      pShmNode->sz
1dce0 52 65 67 69 6f 6e 20 3d 20 73 7a 52 65 67 69 6f  Region = szRegio
1dcf0 6e 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72  n;..    /* The r
1dd00 65 71 75 65 73 74 65 64 20 72 65 67 69 6f 6e 20  equested region 
1dd10 69 73 20 6e 6f 74 20 6d 61 70 70 65 64 20 69 6e  is not mapped in
1dd20 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73 65  to this processe
1dd30 73 20 61 64 64 72 65 73 73 20 73 70 61 63 65 2e  s address space.
1dd40 0a 20 20 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f  .    ** Check to
1dd50 20 73 65 65 20 69 66 20 69 74 20 68 61 73 20 62   see if it has b
1dd60 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 28 69  een allocated (i
1dd70 2e 65 2e 20 69 66 20 74 68 65 20 77 61 6c 2d 69  .e. if the wal-i
1dd80 6e 64 65 78 20 66 69 6c 65 20 69 73 0a 20 20 20  ndex file is.   
1dd90 20 2a 2a 20 6c 61 72 67 65 20 65 6e 6f 75 67 68   ** large enough
1dda0 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20   to contain the 
1ddb0 72 65 71 75 65 73 74 65 64 20 72 65 67 69 6f 6e  requested region
1ddc0 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  )..    */.    rc
1ddd0 20 3d 20 77 69 6e 46 69 6c 65 53 69 7a 65 28 28   = winFileSize((
1dde0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 26  sqlite3_file *)&
1ddf0 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c  pShmNode->hFile,
1de00 20 26 73 7a 29 3b 0a 20 20 20 20 69 66 28 20 72   &sz);.    if( r
1de10 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1de20 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f        rc = winLo
1de30 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
1de40 45 52 52 5f 53 48 4d 53 49 5a 45 2c 20 6f 73 47  ERR_SHMSIZE, osG
1de50 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20  etLastError(),. 
1de60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de70 20 20 20 20 20 20 22 77 69 6e 53 68 6d 4d 61 70        "winShmMap
1de80 31 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 68  1", pDbFd->zPath
1de90 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68  );.      goto sh
1dea0 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d  mpage_out;.    }
1deb0 0a 0a 20 20 20 20 69 66 28 20 73 7a 3c 6e 42 79  ..    if( sz<nBy
1dec0 74 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  te ){.      /* T
1ded0 68 65 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d  he requested mem
1dee0 6f 72 79 20 72 65 67 69 6f 6e 20 64 6f 65 73 20  ory region does 
1def0 6e 6f 74 20 65 78 69 73 74 2e 20 49 66 20 69 73  not exist. If is
1df00 57 72 69 74 65 20 69 73 20 73 65 74 20 74 6f 0a  Write is set to.
1df10 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 2c 20 65        ** zero, e
1df20 78 69 74 20 65 61 72 6c 79 2e 20 2a 70 70 20 77  xit early. *pp w
1df30 69 6c 6c 20 62 65 20 73 65 74 20 74 6f 20 4e 55  ill be set to NU
1df40 4c 4c 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b  LL and SQLITE_OK
1df50 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 20 20 20   returned..     
1df60 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 41 6c 74   **.      ** Alt
1df70 65 72 6e 61 74 69 76 65 6c 79 2c 20 69 66 20 69  ernatively, if i
1df80 73 57 72 69 74 65 20 69 73 20 6e 6f 6e 2d 7a 65  sWrite is non-ze
1df90 72 6f 2c 20 75 73 65 20 66 74 72 75 6e 63 61 74  ro, use ftruncat
1dfa0 65 28 29 20 74 6f 20 61 6c 6c 6f 63 61 74 65 0a  e() to allocate.
1dfb0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 72 65 71        ** the req
1dfc0 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72 65  uested memory re
1dfd0 67 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  gion..      */. 
1dfe0 20 20 20 20 20 69 66 28 20 21 69 73 57 72 69 74       if( !isWrit
1dff0 65 20 29 20 67 6f 74 6f 20 73 68 6d 70 61 67 65  e ) goto shmpage
1e000 5f 6f 75 74 3b 0a 20 20 20 20 20 20 72 63 20 3d  _out;.      rc =
1e010 20 77 69 6e 54 72 75 6e 63 61 74 65 28 28 73 71   winTruncate((sq
1e020 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 26 70 53  lite3_file *)&pS
1e030 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c 20 6e  hmNode->hFile, n
1e040 42 79 74 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Byte);.      if(
1e050 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1e060 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77  {.        rc = w
1e070 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
1e080 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 2c  E_IOERR_SHMSIZE,
1e090 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
1e0a0 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
1e0b0 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
1e0c0 53 68 6d 4d 61 70 32 22 2c 20 70 44 62 46 64 2d  ShmMap2", pDbFd-
1e0d0 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20 20  >zPath);.       
1e0e0 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75   goto shmpage_ou
1e0f0 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
1e100 0a 0a 20 20 20 20 2f 2a 20 4d 61 70 20 74 68 65  ..    /* Map the
1e110 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72   requested memor
1e120 79 20 72 65 67 69 6f 6e 20 69 6e 74 6f 20 74 68  y region into th
1e130 69 73 20 70 72 6f 63 65 73 73 65 73 20 61 64 64  is processes add
1e140 72 65 73 73 20 73 70 61 63 65 2e 20 2a 2f 0a 20  ress space. */. 
1e150 20 20 20 61 70 4e 65 77 20 3d 20 28 73 74 72 75     apNew = (stru
1e160 63 74 20 53 68 6d 52 65 67 69 6f 6e 20 2a 29 73  ct ShmRegion *)s
1e170 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 0a  qlite3_realloc(.
1e180 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65          pShmNode
1e190 2d 3e 61 52 65 67 69 6f 6e 2c 20 28 69 52 65 67  ->aRegion, (iReg
1e1a0 69 6f 6e 2b 31 29 2a 73 69 7a 65 6f 66 28 61 70  ion+1)*sizeof(ap
1e1b0 4e 65 77 5b 30 5d 29 0a 20 20 20 20 29 3b 0a 20  New[0]).    );. 
1e1c0 20 20 20 69 66 28 20 21 61 70 4e 65 77 20 29 7b     if( !apNew ){
1e1d0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
1e1e0 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a  TE_IOERR_NOMEM;.
1e1f0 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61        goto shmpa
1e200 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  ge_out;.    }.  
1e210 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67    pShmNode->aReg
1e220 69 6f 6e 20 3d 20 61 70 4e 65 77 3b 0a 0a 20 20  ion = apNew;..  
1e230 20 20 77 68 69 6c 65 28 20 70 53 68 6d 4e 6f 64    while( pShmNod
1e240 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d 69 52 65 67  e->nRegion<=iReg
1e250 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 48 41 4e  ion ){.      HAN
1e260 44 4c 45 20 68 4d 61 70 20 3d 20 4e 55 4c 4c 3b  DLE hMap = NULL;
1e270 20 20 20 20 20 20 20 20 20 2f 2a 20 66 69 6c 65           /* file
1e280 2d 6d 61 70 70 69 6e 67 20 68 61 6e 64 6c 65 20  -mapping handle 
1e290 2a 2f 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70  */.      void *p
1e2a0 4d 61 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Map = 0;        
1e2b0 20 20 20 20 20 2f 2a 20 4d 61 70 70 65 64 20 6d       /* Mapped m
1e2c0 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 2a 2f 0a  emory region */.
1e2d0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
1e2e0 49 4e 52 54 0a 20 20 20 20 20 20 68 4d 61 70 20  INRT.      hMap 
1e2f0 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61  = osCreateFileMa
1e300 70 70 69 6e 67 46 72 6f 6d 41 70 70 28 70 53 68  ppingFromApp(pSh
1e310 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2e 68 2c 0a  mNode->hFile.h,.
1e320 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 20            NULL, 
1e330 50 41 47 45 5f 52 45 41 44 57 52 49 54 45 2c 20  PAGE_READWRITE, 
1e340 6e 42 79 74 65 2c 20 4e 55 4c 4c 0a 20 20 20 20  nByte, NULL.    
1e350 20 20 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e    );.#elif defin
1e360 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
1e370 48 41 53 5f 57 49 44 45 29 0a 20 20 20 20 20 20  HAS_WIDE).      
1e380 68 4d 61 70 20 3d 20 6f 73 43 72 65 61 74 65 46  hMap = osCreateF
1e390 69 6c 65 4d 61 70 70 69 6e 67 57 28 70 53 68 6d  ileMappingW(pShm
1e3a0 4e 6f 64 65 2d 3e 68 46 69 6c 65 2e 68 2c 0a 20  Node->hFile.h,. 
1e3b0 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 20 50           NULL, P
1e3c0 41 47 45 5f 52 45 41 44 57 52 49 54 45 2c 20 30  AGE_READWRITE, 0
1e3d0 2c 20 6e 42 79 74 65 2c 20 4e 55 4c 4c 0a 20 20  , nByte, NULL.  
1e3e0 20 20 20 20 29 3b 0a 23 65 6c 69 66 20 64 65 66      );.#elif def
1e3f0 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
1e400 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 20 20  2_HAS_ANSI).    
1e410 20 20 68 4d 61 70 20 3d 20 6f 73 43 72 65 61 74    hMap = osCreat
1e420 65 46 69 6c 65 4d 61 70 70 69 6e 67 41 28 70 53  eFileMappingA(pS
1e430 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2e 68 2c  hmNode->hFile.h,
1e440 0a 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c  .          NULL,
1e450 20 50 41 47 45 5f 52 45 41 44 57 52 49 54 45 2c   PAGE_READWRITE,
1e460 20 30 2c 20 6e 42 79 74 65 2c 20 4e 55 4c 4c 0a   0, nByte, NULL.
1e470 20 20 20 20 20 20 29 3b 0a 23 65 6e 64 69 66 0a        );.#endif.
1e480 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
1e490 53 48 4d 2d 4d 41 50 2d 43 52 45 41 54 45 20 70  SHM-MAP-CREATE p
1e4a0 69 64 3d 25 6c 75 2c 20 72 65 67 69 6f 6e 3d 25  id=%lu, region=%
1e4b0 64 2c 20 73 69 7a 65 3d 25 64 2c 20 72 63 3d 25  d, size=%d, rc=%
1e4c0 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
1e4d0 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e       osGetCurren
1e4e0 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 53  tProcessId(), pS
1e4f0 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2c  hmNode->nRegion,
1e500 20 6e 42 79 74 65 2c 0a 20 20 20 20 20 20 20 20   nByte,.        
1e510 20 20 20 20 20 20 20 68 4d 61 70 20 3f 20 22 6f         hMap ? "o
1e520 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b  k" : "failed"));
1e530 0a 20 20 20 20 20 20 69 66 28 20 68 4d 61 70 20  .      if( hMap 
1e540 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
1e550 4f 66 66 73 65 74 20 3d 20 70 53 68 6d 4e 6f 64  Offset = pShmNod
1e560 65 2d 3e 6e 52 65 67 69 6f 6e 2a 73 7a 52 65 67  e->nRegion*szReg
1e570 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  ion;.        int
1e580 20 69 4f 66 66 73 65 74 53 68 69 66 74 20 3d 20   iOffsetShift = 
1e590 69 4f 66 66 73 65 74 20 25 20 77 69 6e 53 79 73  iOffset % winSys
1e5a0 49 6e 66 6f 2e 64 77 41 6c 6c 6f 63 61 74 69 6f  Info.dwAllocatio
1e5b0 6e 47 72 61 6e 75 6c 61 72 69 74 79 3b 0a 23 69  nGranularity;.#i
1e5c0 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
1e5d0 54 0a 20 20 20 20 20 20 20 20 70 4d 61 70 20 3d  T.        pMap =
1e5e0 20 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 6c 65   osMapViewOfFile
1e5f0 46 72 6f 6d 41 70 70 28 68 4d 61 70 2c 20 46 49  FromApp(hMap, FI
1e600 4c 45 5f 4d 41 50 5f 57 52 49 54 45 20 7c 20 46  LE_MAP_WRITE | F
1e610 49 4c 45 5f 4d 41 50 5f 52 45 41 44 2c 0a 20 20  ILE_MAP_READ,.  
1e620 20 20 20 20 20 20 20 20 20 20 69 4f 66 66 73 65            iOffse
1e630 74 20 2d 20 69 4f 66 66 73 65 74 53 68 69 66 74  t - iOffsetShift
1e640 2c 20 73 7a 52 65 67 69 6f 6e 20 2b 20 69 4f 66  , szRegion + iOf
1e650 66 73 65 74 53 68 69 66 74 0a 20 20 20 20 20 20  fsetShift.      
1e660 20 20 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20    );.#else.     
1e670 20 20 20 70 4d 61 70 20 3d 20 6f 73 4d 61 70 56     pMap = osMapV
1e680 69 65 77 4f 66 46 69 6c 65 28 68 4d 61 70 2c 20  iewOfFile(hMap, 
1e690 46 49 4c 45 5f 4d 41 50 5f 57 52 49 54 45 20 7c  FILE_MAP_WRITE |
1e6a0 20 46 49 4c 45 5f 4d 41 50 5f 52 45 41 44 2c 0a   FILE_MAP_READ,.
1e6b0 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 69              0, i
1e6c0 4f 66 66 73 65 74 20 2d 20 69 4f 66 66 73 65 74  Offset - iOffset
1e6d0 53 68 69 66 74 2c 20 73 7a 52 65 67 69 6f 6e 20  Shift, szRegion 
1e6e0 2b 20 69 4f 66 66 73 65 74 53 68 69 66 74 0a 20  + iOffsetShift. 
1e6f0 20 20 20 20 20 20 20 29 3b 0a 23 65 6e 64 69 66         );.#endif
1e700 0a 20 20 20 20 20 20 20 20 4f 53 54 52 41 43 45  .        OSTRACE
1e710 28 28 22 53 48 4d 2d 4d 41 50 2d 4d 41 50 20 70  (("SHM-MAP-MAP p
1e720 69 64 3d 25 6c 75 2c 20 72 65 67 69 6f 6e 3d 25  id=%lu, region=%
1e730 64 2c 20 6f 66 66 73 65 74 3d 25 64 2c 20 73 69  d, offset=%d, si
1e740 7a 65 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22 2c  ze=%d, rc=%s\n",
1e750 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1e760 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72    osGetCurrentPr
1e770 6f 63 65 73 73 49 64 28 29 2c 20 70 53 68 6d 4e  ocessId(), pShmN
1e780 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2c 20 69 4f  ode->nRegion, iO
1e790 66 66 73 65 74 2c 0a 20 20 20 20 20 20 20 20 20  ffset,.         
1e7a0 20 20 20 20 20 20 20 20 73 7a 52 65 67 69 6f 6e          szRegion
1e7b0 2c 20 70 4d 61 70 20 3f 20 22 6f 6b 22 20 3a 20  , pMap ? "ok" : 
1e7c0 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20 20  "failed"));.    
1e7d0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70    }.      if( !p
1e7e0 4d 61 70 20 29 7b 0a 20 20 20 20 20 20 20 20 70  Map ){.        p
1e7f0 53 68 6d 4e 6f 64 65 2d 3e 6c 61 73 74 45 72 72  ShmNode->lastErr
1e800 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
1e810 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 20 20 72  ror();.        r
1e820 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  c = winLogError(
1e830 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d  SQLITE_IOERR_SHM
1e840 4d 41 50 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6c  MAP, pShmNode->l
1e850 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
1e860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e870 20 20 20 22 77 69 6e 53 68 6d 4d 61 70 33 22 2c     "winShmMap3",
1e880 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a   pDbFd->zPath);.
1e890 20 20 20 20 20 20 20 20 69 66 28 20 68 4d 61 70          if( hMap
1e8a0 20 29 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65   ) osCloseHandle
1e8b0 28 68 4d 61 70 29 3b 0a 20 20 20 20 20 20 20 20  (hMap);.        
1e8c0 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74  goto shmpage_out
1e8d0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
1e8e0 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69   pShmNode->aRegi
1e8f0 6f 6e 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  on[pShmNode->nRe
1e900 67 69 6f 6e 5d 2e 70 4d 61 70 20 3d 20 70 4d 61  gion].pMap = pMa
1e910 70 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64  p;.      pShmNod
1e920 65 2d 3e 61 52 65 67 69 6f 6e 5b 70 53 68 6d 4e  e->aRegion[pShmN
1e930 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 5d 2e 68 4d  ode->nRegion].hM
1e940 61 70 20 3d 20 68 4d 61 70 3b 0a 20 20 20 20 20  ap = hMap;.     
1e950 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69   pShmNode->nRegi
1e960 6f 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  on++;.    }.  }.
1e970 0a 73 68 6d 70 61 67 65 5f 6f 75 74 3a 0a 20 20  .shmpage_out:.  
1e980 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  if( pShmNode->nR
1e990 65 67 69 6f 6e 3e 69 52 65 67 69 6f 6e 20 29 7b  egion>iRegion ){
1e9a0 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 73 65 74  .    int iOffset
1e9b0 20 3d 20 69 52 65 67 69 6f 6e 2a 73 7a 52 65 67   = iRegion*szReg
1e9c0 69 6f 6e 3b 0a 20 20 20 20 69 6e 74 20 69 4f 66  ion;.    int iOf
1e9d0 66 73 65 74 53 68 69 66 74 20 3d 20 69 4f 66 66  fsetShift = iOff
1e9e0 73 65 74 20 25 20 77 69 6e 53 79 73 49 6e 66 6f  set % winSysInfo
1e9f0 2e 64 77 41 6c 6c 6f 63 61 74 69 6f 6e 47 72 61  .dwAllocationGra
1ea00 6e 75 6c 61 72 69 74 79 3b 0a 20 20 20 20 63 68  nularity;.    ch
1ea10 61 72 20 2a 70 20 3d 20 28 63 68 61 72 20 2a 29  ar *p = (char *)
1ea20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f  pShmNode->aRegio
1ea30 6e 5b 69 52 65 67 69 6f 6e 5d 2e 70 4d 61 70 3b  n[iRegion].pMap;
1ea40 0a 20 20 20 20 2a 70 70 20 3d 20 28 76 6f 69 64  .    *pp = (void
1ea50 20 2a 29 26 70 5b 69 4f 66 66 73 65 74 53 68 69   *)&p[iOffsetShi
1ea60 66 74 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ft];.  }else{.  
1ea70 20 20 2a 70 70 20 3d 20 30 3b 0a 20 20 7d 0a 20    *pp = 0;.  }. 
1ea80 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
1ea90 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  eave(pShmNode->m
1eaa0 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
1eab0 72 63 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 20 64  rc;.}..#else.# d
1eac0 65 66 69 6e 65 20 77 69 6e 53 68 6d 4d 61 70 20  efine winShmMap 
1ead0 20 20 20 20 30 0a 23 20 64 65 66 69 6e 65 20 77      0.# define w
1eae0 69 6e 53 68 6d 4c 6f 63 6b 20 20 20 20 30 0a 23  inShmLock    0.#
1eaf0 20 64 65 66 69 6e 65 20 77 69 6e 53 68 6d 42 61   define winShmBa
1eb00 72 72 69 65 72 20 30 0a 23 20 64 65 66 69 6e 65  rrier 0.# define
1eb10 20 77 69 6e 53 68 6d 55 6e 6d 61 70 20 20 20 30   winShmUnmap   0
1eb20 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64  .#endif /* #ifnd
1eb30 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
1eb40 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65  AL */../*.** Cle
1eb50 61 6e 73 20 75 70 20 74 68 65 20 6d 61 70 70 65  ans up the mappe
1eb60 64 20 72 65 67 69 6f 6e 20 6f 66 20 74 68 65 20  d region of the 
1eb70 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 2c 20  specified file, 
1eb80 69 66 20 61 6e 79 2e 0a 2a 2f 0a 23 69 66 20 53  if any..*/.#if S
1eb90 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
1eba0 49 5a 45 3e 30 0a 73 74 61 74 69 63 20 69 6e 74  IZE>0.static int
1ebb0 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28 77 69   winUnmapfile(wi
1ebc0 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20  nFile *pFile){. 
1ebd0 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 21 3d   assert( pFile!=
1ebe0 30 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  0 );.  OSTRACE((
1ebf0 22 55 4e 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d  "UNMAP-FILE pid=
1ec00 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 68  %lu, pFile=%p, h
1ec10 4d 61 70 3d 25 70 2c 20 70 4d 61 70 52 65 67 69  Map=%p, pMapRegi
1ec20 6f 6e 3d 25 70 2c 20 22 0a 20 20 20 20 20 20 20  on=%p, ".       
1ec30 20 20 20 20 22 6d 6d 61 70 53 69 7a 65 3d 25 6c      "mmapSize=%l
1ec40 6c 64 2c 20 6d 6d 61 70 53 69 7a 65 41 63 74 75  ld, mmapSizeActu
1ec50 61 6c 3d 25 6c 6c 64 2c 20 6d 6d 61 70 53 69 7a  al=%lld, mmapSiz
1ec60 65 4d 61 78 3d 25 6c 6c 64 5c 6e 22 2c 0a 20 20  eMax=%lld\n",.  
1ec70 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
1ec80 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
1ec90 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e  , pFile, pFile->
1eca0 68 4d 61 70 2c 20 70 46 69 6c 65 2d 3e 70 4d 61  hMap, pFile->pMa
1ecb0 70 52 65 67 69 6f 6e 2c 0a 20 20 20 20 20 20 20  pRegion,.       
1ecc0 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53      pFile->mmapS
1ecd0 69 7a 65 2c 20 70 46 69 6c 65 2d 3e 6d 6d 61 70  ize, pFile->mmap
1ece0 53 69 7a 65 41 63 74 75 61 6c 2c 20 70 46 69 6c  SizeActual, pFil
1ecf0 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 29 29  e->mmapSizeMax))
1ed00 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70  ;.  if( pFile->p
1ed10 4d 61 70 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20  MapRegion ){.   
1ed20 20 69 66 28 20 21 6f 73 55 6e 6d 61 70 56 69 65   if( !osUnmapVie
1ed30 77 4f 66 46 69 6c 65 28 70 46 69 6c 65 2d 3e 70  wOfFile(pFile->p
1ed40 4d 61 70 52 65 67 69 6f 6e 29 20 29 7b 0a 20 20  MapRegion) ){.  
1ed50 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
1ed60 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
1ed70 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 4f  Error();.      O
1ed80 53 54 52 41 43 45 28 28 22 55 4e 4d 41 50 2d 46  STRACE(("UNMAP-F
1ed90 49 4c 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69  ILE pid=%lu, pFi
1eda0 6c 65 3d 25 70 2c 20 70 4d 61 70 52 65 67 69 6f  le=%p, pMapRegio
1edb0 6e 3d 25 70 2c 20 22 0a 20 20 20 20 20 20 20 20  n=%p, ".        
1edc0 20 20 20 20 20 20 20 22 72 63 3d 53 51 4c 49 54         "rc=SQLIT
1edd0 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 5c 6e 22 2c  E_IOERR_MMAP\n",
1ede0 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
1edf0 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c  cessId(), pFile,
1ee00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1ee10 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f  pFile->pMapRegio
1ee20 6e 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  n));.      retur
1ee30 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  n winLogError(SQ
1ee40 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 2c  LITE_IOERR_MMAP,
1ee50 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
1ee60 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
1ee70 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
1ee80 55 6e 6d 61 70 66 69 6c 65 31 22 2c 20 70 46 69  Unmapfile1", pFi
1ee90 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20  le->zPath);.    
1eea0 7d 0a 20 20 20 20 70 46 69 6c 65 2d 3e 70 4d 61  }.    pFile->pMa
1eeb0 70 52 65 67 69 6f 6e 20 3d 20 30 3b 0a 20 20 20  pRegion = 0;.   
1eec0 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65   pFile->mmapSize
1eed0 20 3d 20 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d   = 0;.    pFile-
1eee0 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 20  >mmapSizeActual 
1eef0 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  = 0;.  }.  if( p
1ef00 46 69 6c 65 2d 3e 68 4d 61 70 21 3d 4e 55 4c 4c  File->hMap!=NULL
1ef10 20 29 7b 0a 20 20 20 20 69 66 28 20 21 6f 73 43   ){.    if( !osC
1ef20 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65  loseHandle(pFile
1ef30 2d 3e 68 4d 61 70 29 20 29 7b 0a 20 20 20 20 20  ->hMap) ){.     
1ef40 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
1ef50 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
1ef60 6f 72 28 29 3b 0a 20 20 20 20 20 20 4f 53 54 52  or();.      OSTR
1ef70 41 43 45 28 28 22 55 4e 4d 41 50 2d 46 49 4c 45  ACE(("UNMAP-FILE
1ef80 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d   pid=%lu, pFile=
1ef90 25 70 2c 20 68 4d 61 70 3d 25 70 2c 20 72 63 3d  %p, hMap=%p, rc=
1efa0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41  SQLITE_IOERR_MMA
1efb0 50 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  P\n",.          
1efc0 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e       osGetCurren
1efd0 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46  tProcessId(), pF
1efe0 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 4d 61 70  ile, pFile->hMap
1eff0 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
1f000 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
1f010 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 2c 20  ITE_IOERR_MMAP, 
1f020 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
1f030 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1f040 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 55             "winU
1f050 6e 6d 61 70 66 69 6c 65 32 22 2c 20 70 46 69 6c  nmapfile2", pFil
1f060 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d  e->zPath);.    }
1f070 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68 4d 61 70  .    pFile->hMap
1f080 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 20 20 4f   = NULL;.  }.  O
1f090 53 54 52 41 43 45 28 28 22 55 4e 4d 41 50 2d 46  STRACE(("UNMAP-F
1f0a0 49 4c 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69  ILE pid=%lu, pFi
1f0b0 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
1f0c0 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  _OK\n",.        
1f0d0 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50     osGetCurrentP
1f0e0 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c  rocessId(), pFil
1f0f0 65 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  e));.  return SQ
1f100 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
1f110 2a 20 4d 65 6d 6f 72 79 20 6d 61 70 20 6f 72 20  * Memory map or 
1f120 72 65 6d 61 70 20 74 68 65 20 66 69 6c 65 20 6f  remap the file o
1f130 70 65 6e 65 64 20 62 79 20 66 69 6c 65 2d 64 65  pened by file-de
1f140 73 63 72 69 70 74 6f 72 20 70 46 64 20 28 69 66  scriptor pFd (if
1f150 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 69 73 20   the file.** is 
1f160 61 6c 72 65 61 64 79 20 6d 61 70 70 65 64 2c 20  already mapped, 
1f170 74 68 65 20 65 78 69 73 74 69 6e 67 20 6d 61 70  the existing map
1f180 70 69 6e 67 20 69 73 20 72 65 70 6c 61 63 65 64  ping is replaced
1f190 20 62 79 20 74 68 65 20 6e 65 77 29 2e 20 4f 72   by the new). Or
1f1a0 2c 20 69 66 0a 2a 2a 20 74 68 65 72 65 20 61 6c  , if.** there al
1f1b0 72 65 61 64 79 20 65 78 69 73 74 73 20 61 20 6d  ready exists a m
1f1c0 61 70 70 69 6e 67 20 66 6f 72 20 74 68 69 73 20  apping for this 
1f1d0 66 69 6c 65 2c 20 61 6e 64 20 74 68 65 72 65 20  file, and there 
1f1e0 61 72 65 20 73 74 69 6c 6c 0a 2a 2a 20 6f 75 74  are still.** out
1f1f0 73 74 61 6e 64 69 6e 67 20 78 46 65 74 63 68 28  standing xFetch(
1f200 29 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  ) references to 
1f210 69 74 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  it, this functio
1f220 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  n is a no-op..**
1f230 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72  .** If parameter
1f240 20 6e 42 79 74 65 20 69 73 20 6e 6f 6e 2d 6e 65   nByte is non-ne
1f250 67 61 74 69 76 65 2c 20 74 68 65 6e 20 69 74 20  gative, then it 
1f260 69 73 20 74 68 65 20 72 65 71 75 65 73 74 65 64  is the requested
1f270 20 73 69 7a 65 20 6f 66 0a 2a 2a 20 74 68 65 20   size of.** the 
1f280 6d 61 70 70 69 6e 67 20 74 6f 20 63 72 65 61 74  mapping to creat
1f290 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  e. Otherwise, if
1f2a0 20 6e 42 79 74 65 20 69 73 20 6c 65 73 73 20 74   nByte is less t
1f2b0 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74  han zero, then t
1f2c0 68 65 0a 2a 2a 20 72 65 71 75 65 73 74 65 64 20  he.** requested 
1f2d0 73 69 7a 65 20 69 73 20 74 68 65 20 73 69 7a 65  size is the size
1f2e0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 6f 6e 20   of the file on 
1f2f0 64 69 73 6b 2e 20 54 68 65 20 61 63 74 75 61 6c  disk. The actual
1f300 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20   size of the.** 
1f310 63 72 65 61 74 65 64 20 6d 61 70 70 69 6e 67 20  created mapping 
1f320 69 73 20 65 69 74 68 65 72 20 74 68 65 20 72 65  is either the re
1f330 71 75 65 73 74 65 64 20 73 69 7a 65 20 6f 72 20  quested size or 
1f340 74 68 65 20 76 61 6c 75 65 20 63 6f 6e 66 69 67  the value config
1f350 75 72 65 64 0a 2a 2a 20 75 73 69 6e 67 20 53 51  ured.** using SQ
1f360 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f  LITE_FCNTL_MMAP_
1f370 53 49 5a 45 2c 20 77 68 69 63 68 65 76 65 72 20  SIZE, whichever 
1f380 69 73 20 73 6d 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a  is smaller..**.*
1f390 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
1f3a0 65 74 75 72 6e 65 64 20 69 66 20 6e 6f 20 65 72  eturned if no er
1f3b0 72 6f 72 20 6f 63 63 75 72 73 20 28 65 76 65 6e  ror occurs (even
1f3c0 20 69 66 20 74 68 65 20 6d 61 70 70 69 6e 67 20   if the mapping 
1f3d0 69 73 20 6e 6f 74 0a 2a 2a 20 72 65 63 72 65 61  is not.** recrea
1f3e0 74 65 64 20 61 73 20 61 20 72 65 73 75 6c 74 20  ted as a result 
1f3f0 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72  of outstanding r
1f400 65 66 65 72 65 6e 63 65 73 29 20 6f 72 20 61 6e  eferences) or an
1f410 20 53 51 4c 69 74 65 20 65 72 72 6f 72 0a 2a 2a   SQLite error.**
1f420 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e   code otherwise.
1f430 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
1f440 69 6e 4d 61 70 66 69 6c 65 28 77 69 6e 46 69 6c  inMapfile(winFil
1f450 65 20 2a 70 46 64 2c 20 73 71 6c 69 74 65 33 5f  e *pFd, sqlite3_
1f460 69 6e 74 36 34 20 6e 42 79 74 65 29 7b 0a 20 20  int64 nByte){.  
1f470 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 4d  sqlite3_int64 nM
1f480 61 70 20 3d 20 6e 42 79 74 65 3b 0a 20 20 69 6e  ap = nByte;.  in
1f490 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
1f4a0 20 6e 4d 61 70 3e 3d 30 20 7c 7c 20 70 46 64 2d   nMap>=0 || pFd-
1f4b0 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30 20 29 3b  >nFetchOut==0 );
1f4c0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4d 41 50  .  OSTRACE(("MAP
1f4d0 2d 46 49 4c 45 20 70 69 64 3d 25 6c 75 2c 20 70  -FILE pid=%lu, p
1f4e0 46 69 6c 65 3d 25 70 2c 20 73 69 7a 65 3d 25 6c  File=%p, size=%l
1f4f0 6c 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  ld\n",.         
1f500 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72    osGetCurrentPr
1f510 6f 63 65 73 73 49 64 28 29 2c 20 70 46 64 2c 20  ocessId(), pFd, 
1f520 6e 42 79 74 65 29 29 3b 0a 0a 20 20 69 66 28 20  nByte));..  if( 
1f530 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3e 30  pFd->nFetchOut>0
1f540 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
1f550 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 6e 4d 61 70  _OK;..  if( nMap
1f560 3c 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 77  <0 ){.    rc = w
1f570 69 6e 46 69 6c 65 53 69 7a 65 28 28 73 71 6c 69  inFileSize((sqli
1f580 74 65 33 5f 66 69 6c 65 2a 29 70 46 64 2c 20 26  te3_file*)pFd, &
1f590 6e 4d 61 70 29 3b 0a 20 20 20 20 69 66 28 20 72  nMap);.    if( r
1f5a0 63 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41  c ){.      OSTRA
1f5b0 43 45 28 28 22 4d 41 50 2d 46 49 4c 45 20 70 69  CE(("MAP-FILE pi
1f5c0 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c  d=%lu, pFile=%p,
1f5d0 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52   rc=SQLITE_IOERR
1f5e0 5f 46 53 54 41 54 5c 6e 22 2c 0a 20 20 20 20 20  _FSTAT\n",.     
1f5f0 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43            osGetC
1f600 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28  urrentProcessId(
1f610 29 2c 20 70 46 64 29 29 3b 0a 20 20 20 20 20 20  ), pFd));.      
1f620 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
1f630 45 52 52 5f 46 53 54 41 54 3b 0a 20 20 20 20 7d  ERR_FSTAT;.    }
1f640 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4d 61 70 3e  .  }.  if( nMap>
1f650 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78  pFd->mmapSizeMax
1f660 20 29 7b 0a 20 20 20 20 6e 4d 61 70 20 3d 20 70   ){.    nMap = p
1f670 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 3b  Fd->mmapSizeMax;
1f680 0a 20 20 7d 0a 20 20 6e 4d 61 70 20 26 3d 20 7e  .  }.  nMap &= ~
1f690 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 28  (sqlite3_int64)(
1f6a0 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77 50 61 67  winSysInfo.dwPag
1f6b0 65 53 69 7a 65 20 2d 20 31 29 3b 0a 0a 20 20 69  eSize - 1);..  i
1f6c0 66 28 20 6e 4d 61 70 3d 3d 30 20 26 26 20 70 46  f( nMap==0 && pF
1f6d0 64 2d 3e 6d 6d 61 70 53 69 7a 65 3e 30 20 29 7b  d->mmapSize>0 ){
1f6e0 0a 20 20 20 20 77 69 6e 55 6e 6d 61 70 66 69 6c  .    winUnmapfil
1f6f0 65 28 70 46 64 29 3b 0a 20 20 7d 0a 20 20 69 66  e(pFd);.  }.  if
1f700 28 20 6e 4d 61 70 21 3d 70 46 64 2d 3e 6d 6d 61  ( nMap!=pFd->mma
1f710 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 76 6f 69  pSize ){.    voi
1f720 64 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20  d *pNew = 0;.   
1f730 20 44 57 4f 52 44 20 70 72 6f 74 65 63 74 20 3d   DWORD protect =
1f740 20 50 41 47 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a   PAGE_READONLY;.
1f750 20 20 20 20 44 57 4f 52 44 20 66 6c 61 67 73 20      DWORD flags 
1f760 3d 20 46 49 4c 45 5f 4d 41 50 5f 52 45 41 44 3b  = FILE_MAP_READ;
1f770 0a 0a 20 20 20 20 77 69 6e 55 6e 6d 61 70 66 69  ..    winUnmapfi
1f780 6c 65 28 70 46 64 29 3b 0a 20 20 20 20 69 66 28  le(pFd);.    if(
1f790 20 28 70 46 64 2d 3e 63 74 72 6c 46 6c 61 67 73   (pFd->ctrlFlags
1f7a0 20 26 20 57 49 4e 46 49 4c 45 5f 52 44 4f 4e 4c   & WINFILE_RDONL
1f7b0 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  Y)==0 ){.      p
1f7c0 72 6f 74 65 63 74 20 3d 20 50 41 47 45 5f 52 45  rotect = PAGE_RE
1f7d0 41 44 57 52 49 54 45 3b 0a 20 20 20 20 20 20 66  ADWRITE;.      f
1f7e0 6c 61 67 73 20 7c 3d 20 46 49 4c 45 5f 4d 41 50  lags |= FILE_MAP
1f7f0 5f 57 52 49 54 45 3b 0a 20 20 20 20 7d 0a 23 69  _WRITE;.    }.#i
1f800 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
1f810 54 0a 20 20 20 20 70 46 64 2d 3e 68 4d 61 70 20  T.    pFd->hMap 
1f820 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61  = osCreateFileMa
1f830 70 70 69 6e 67 46 72 6f 6d 41 70 70 28 70 46 64  ppingFromApp(pFd
1f840 2d 3e 68 2c 20 4e 55 4c 4c 2c 20 70 72 6f 74 65  ->h, NULL, prote
1f850 63 74 2c 20 6e 4d 61 70 2c 20 4e 55 4c 4c 29 3b  ct, nMap, NULL);
1f860 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 53  .#elif defined(S
1f870 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
1f880 57 49 44 45 29 0a 20 20 20 20 70 46 64 2d 3e 68  WIDE).    pFd->h
1f890 4d 61 70 20 3d 20 6f 73 43 72 65 61 74 65 46 69  Map = osCreateFi
1f8a0 6c 65 4d 61 70 70 69 6e 67 57 28 70 46 64 2d 3e  leMappingW(pFd->
1f8b0 68 2c 20 4e 55 4c 4c 2c 20 70 72 6f 74 65 63 74  h, NULL, protect
1f8c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1f8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f8e0 20 20 28 44 57 4f 52 44 29 28 28 6e 4d 61 70 3e    (DWORD)((nMap>
1f8f0 3e 33 32 29 20 26 20 30 78 66 66 66 66 66 66 66  >32) & 0xfffffff
1f900 66 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  f),.            
1f910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f920 20 20 20 20 28 44 57 4f 52 44 29 28 6e 4d 61 70      (DWORD)(nMap
1f930 20 26 20 30 78 66 66 66 66 66 66 66 66 29 2c 20   & 0xffffffff), 
1f940 4e 55 4c 4c 29 3b 0a 23 65 6c 69 66 20 64 65 66  NULL);.#elif def
1f950 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
1f960 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 20 20  2_HAS_ANSI).    
1f970 70 46 64 2d 3e 68 4d 61 70 20 3d 20 6f 73 43 72  pFd->hMap = osCr
1f980 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 41  eateFileMappingA
1f990 28 70 46 64 2d 3e 68 2c 20 4e 55 4c 4c 2c 20 70  (pFd->h, NULL, p
1f9a0 72 6f 74 65 63 74 2c 0a 20 20 20 20 20 20 20 20  rotect,.        
1f9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f9c0 20 20 20 20 20 20 20 20 28 44 57 4f 52 44 29 28          (DWORD)(
1f9d0 28 6e 4d 61 70 3e 3e 33 32 29 20 26 20 30 78 66  (nMap>>32) & 0xf
1f9e0 66 66 66 66 66 66 66 29 2c 0a 20 20 20 20 20 20  fffffff),.      
1f9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa00 20 20 20 20 20 20 20 20 20 20 28 44 57 4f 52 44            (DWORD
1fa10 29 28 6e 4d 61 70 20 26 20 30 78 66 66 66 66 66  )(nMap & 0xfffff
1fa20 66 66 66 29 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6e  fff), NULL);.#en
1fa30 64 69 66 0a 20 20 20 20 69 66 28 20 70 46 64 2d  dif.    if( pFd-
1fa40 3e 68 4d 61 70 3d 3d 4e 55 4c 4c 20 29 7b 0a 20  >hMap==NULL ){. 
1fa50 20 20 20 20 20 70 46 64 2d 3e 6c 61 73 74 45 72       pFd->lastEr
1fa60 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
1fa70 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 72 63  rror();.      rc
1fa80 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53   = winLogError(S
1fa90 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50  QLITE_IOERR_MMAP
1faa0 2c 20 70 46 64 2d 3e 6c 61 73 74 45 72 72 6e 6f  , pFd->lastErrno
1fab0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1fac0 20 20 20 20 20 20 20 20 20 22 77 69 6e 4d 61 70           "winMap
1fad0 66 69 6c 65 31 22 2c 20 70 46 64 2d 3e 7a 50 61  file1", pFd->zPa
1fae0 74 68 29 3b 0a 20 20 20 20 20 20 2f 2a 20 4c 6f  th);.      /* Lo
1faf0 67 20 74 68 65 20 65 72 72 6f 72 2c 20 62 75 74  g the error, but
1fb00 20 63 6f 6e 74 69 6e 75 65 20 6e 6f 72 6d 61 6c   continue normal
1fb10 20 6f 70 65 72 61 74 69 6f 6e 20 75 73 69 6e 67   operation using
1fb20 20 78 52 65 61 64 2f 78 57 72 69 74 65 20 2a 2f   xRead/xWrite */
1fb30 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
1fb40 22 4d 41 50 2d 46 49 4c 45 2d 43 52 45 41 54 45  "MAP-FILE-CREATE
1fb50 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d   pid=%lu, pFile=
1fb60 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20  %p, rc=%s\n",.  
1fb70 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47               osG
1fb80 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
1fb90 49 64 28 29 2c 20 70 46 64 2c 20 73 71 6c 69 74  Id(), pFd, sqlit
1fba0 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b  e3ErrName(rc)));
1fbb0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1fbc0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
1fbd0 20 20 20 61 73 73 65 72 74 28 20 28 6e 4d 61 70     assert( (nMap
1fbe0 20 25 20 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77   % winSysInfo.dw
1fbf0 50 61 67 65 53 69 7a 65 29 3d 3d 30 20 29 3b 0a  PageSize)==0 );.
1fc00 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
1fc10 6f 66 28 53 49 5a 45 5f 54 29 3d 3d 73 69 7a 65  of(SIZE_T)==size
1fc20 6f 66 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  of(sqlite3_int64
1fc30 29 20 7c 7c 20 6e 4d 61 70 3c 3d 30 78 66 66 66  ) || nMap<=0xfff
1fc40 66 66 66 66 66 20 29 3b 0a 23 69 66 20 53 51 4c  fffff );.#if SQL
1fc50 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20  ITE_OS_WINRT.   
1fc60 20 70 4e 65 77 20 3d 20 6f 73 4d 61 70 56 69 65   pNew = osMapVie
1fc70 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 28 70  wOfFileFromApp(p
1fc80 46 64 2d 3e 68 4d 61 70 2c 20 66 6c 61 67 73 2c  Fd->hMap, flags,
1fc90 20 30 2c 20 28 53 49 5a 45 5f 54 29 6e 4d 61 70   0, (SIZE_T)nMap
1fca0 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 70 4e 65  );.#else.    pNe
1fcb0 77 20 3d 20 6f 73 4d 61 70 56 69 65 77 4f 66 46  w = osMapViewOfF
1fcc0 69 6c 65 28 70 46 64 2d 3e 68 4d 61 70 2c 20 66  ile(pFd->hMap, f
1fcd0 6c 61 67 73 2c 20 30 2c 20 30 2c 20 28 53 49 5a  lags, 0, 0, (SIZ
1fce0 45 5f 54 29 6e 4d 61 70 29 3b 0a 23 65 6e 64 69  E_T)nMap);.#endi
1fcf0 66 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d  f.    if( pNew==
1fd00 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 6f 73  NULL ){.      os
1fd10 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 64 2d  CloseHandle(pFd-
1fd20 3e 68 4d 61 70 29 3b 0a 20 20 20 20 20 20 70 46  >hMap);.      pF
1fd30 64 2d 3e 68 4d 61 70 20 3d 20 4e 55 4c 4c 3b 0a  d->hMap = NULL;.
1fd40 20 20 20 20 20 20 70 46 64 2d 3e 6c 61 73 74 45        pFd->lastE
1fd50 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
1fd60 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 72  Error();.      r
1fd70 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  c = winLogError(
1fd80 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41  SQLITE_IOERR_MMA
1fd90 50 2c 20 70 46 64 2d 3e 6c 61 73 74 45 72 72 6e  P, pFd->lastErrn
1fda0 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
1fdb0 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 4d 61            "winMa
1fdc0 70 66 69 6c 65 32 22 2c 20 70 46 64 2d 3e 7a 50  pfile2", pFd->zP
1fdd0 61 74 68 29 3b 0a 20 20 20 20 20 20 2f 2a 20 4c  ath);.      /* L
1fde0 6f 67 20 74 68 65 20 65 72 72 6f 72 2c 20 62 75  og the error, bu
1fdf0 74 20 63 6f 6e 74 69 6e 75 65 20 6e 6f 72 6d 61  t continue norma
1fe00 6c 20 6f 70 65 72 61 74 69 6f 6e 20 75 73 69 6e  l operation usin
1fe10 67 20 78 52 65 61 64 2f 78 57 72 69 74 65 20 2a  g xRead/xWrite *
1fe20 2f 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  /.      OSTRACE(
1fe30 28 22 4d 41 50 2d 46 49 4c 45 2d 4d 41 50 20 70  ("MAP-FILE-MAP p
1fe40 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70  id=%lu, pFile=%p
1fe50 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20  , rc=%s\n",.    
1fe60 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74             osGet
1fe70 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
1fe80 28 29 2c 20 70 46 64 2c 20 73 71 6c 69 74 65 33  (), pFd, sqlite3
1fe90 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20  ErrName(rc)));. 
1fea0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1feb0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
1fec0 20 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e   pFd->pMapRegion
1fed0 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 70 46 64   = pNew;.    pFd
1fee0 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d 20 6e 4d 61  ->mmapSize = nMa
1fef0 70 3b 0a 20 20 20 20 70 46 64 2d 3e 6d 6d 61 70  p;.    pFd->mmap
1ff00 53 69 7a 65 41 63 74 75 61 6c 20 3d 20 6e 4d 61  SizeActual = nMa
1ff10 70 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43  p;.  }..  OSTRAC
1ff20 45 28 28 22 4d 41 50 2d 46 49 4c 45 20 70 69 64  E(("MAP-FILE pid
1ff30 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20  =%lu, pFile=%p, 
1ff40 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c  rc=SQLITE_OK\n",
1ff50 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65  .           osGe
1ff60 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
1ff70 64 28 29 2c 20 70 46 64 29 29 3b 0a 20 20 72 65  d(), pFd));.  re
1ff80 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1ff90 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
1ffa0 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
1ffb0 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  >0 */../*.** If 
1ffc0 70 6f 73 73 69 62 6c 65 2c 20 72 65 74 75 72 6e  possible, return
1ffd0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
1ffe0 6d 61 70 70 69 6e 67 20 6f 66 20 66 69 6c 65 20  mapping of file 
1fff0 66 64 20 73 74 61 72 74 69 6e 67 20 61 74 20 6f  fd starting at o
20000 66 66 73 65 74 0a 2a 2a 20 69 4f 66 66 2e 20 54  ffset.** iOff. T
20010 68 65 20 6d 61 70 70 69 6e 67 20 6d 75 73 74 20  he mapping must 
20020 62 65 20 76 61 6c 69 64 20 66 6f 72 20 61 74 20  be valid for at 
20030 6c 65 61 73 74 20 6e 41 6d 74 20 62 79 74 65 73  least nAmt bytes
20040 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 68 20  ..**.** If such 
20050 61 20 70 6f 69 6e 74 65 72 20 63 61 6e 20 62 65  a pointer can be
20060 20 6f 62 74 61 69 6e 65 64 2c 20 73 74 6f 72 65   obtained, store
20070 20 69 74 20 69 6e 20 2a 70 70 20 61 6e 64 20 72   it in *pp and r
20080 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
20090 0a 2a 2a 20 4f 72 2c 20 69 66 20 6f 6e 65 20 63  .** Or, if one c
200a0 61 6e 6e 6f 74 20 62 75 74 20 6e 6f 20 65 72 72  annot but no err
200b0 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20 2a  or occurs, set *
200c0 70 70 20 74 6f 20 30 20 61 6e 64 20 72 65 74 75  pp to 0 and retu
200d0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a  rn SQLITE_OK..**
200e0 20 46 69 6e 61 6c 6c 79 2c 20 69 66 20 61 6e 20   Finally, if an 
200f0 65 72 72 6f 72 20 64 6f 65 73 20 6f 63 63 75 72  error does occur
20100 2c 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69  , return an SQLi
20110 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 54  te error code. T
20120 68 65 20 66 69 6e 61 6c 0a 2a 2a 20 76 61 6c 75  he final.** valu
20130 65 20 6f 66 20 2a 70 70 20 69 73 20 75 6e 64 65  e of *pp is unde
20140 66 69 6e 65 64 20 69 6e 20 74 68 69 73 20 63 61  fined in this ca
20150 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69  se..**.** If thi
20160 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20  s function does 
20170 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
20180 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 6d 75 73  , the caller mus
20190 74 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20  t eventually.** 
201a0 72 65 6c 65 61 73 65 20 74 68 65 20 72 65 66 65  release the refe
201b0 72 65 6e 63 65 20 62 79 20 63 61 6c 6c 69 6e 67  rence by calling
201c0 20 77 69 6e 55 6e 66 65 74 63 68 28 29 2e 0a 2a   winUnfetch()..*
201d0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
201e0 46 65 74 63 68 28 73 71 6c 69 74 65 33 5f 66 69  Fetch(sqlite3_fi
201f0 6c 65 20 2a 66 64 2c 20 69 36 34 20 69 4f 66 66  le *fd, i64 iOff
20200 2c 20 69 6e 74 20 6e 41 6d 74 2c 20 76 6f 69 64  , int nAmt, void
20210 20 2a 2a 70 70 29 7b 0a 23 69 66 20 53 51 4c 49   **pp){.#if SQLI
20220 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
20230 3e 30 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46  >0.  winFile *pF
20240 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66 64  d = (winFile*)fd
20250 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72  ;   /* The under
20260 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65 20 66  lying database f
20270 69 6c 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  ile */.#endif.  
20280 2a 70 70 20 3d 20 30 3b 0a 0a 20 20 4f 53 54 52  *pp = 0;..  OSTR
20290 41 43 45 28 28 22 46 45 54 43 48 20 70 69 64 3d  ACE(("FETCH pid=
202a0 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 6f  %lu, pFile=%p, o
202b0 66 66 73 65 74 3d 25 6c 6c 64 2c 20 61 6d 6f 75  ffset=%lld, amou
202c0 6e 74 3d 25 64 2c 20 70 70 3d 25 70 5c 6e 22 2c  nt=%d, pp=%p\n",
202d0 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65  .           osGe
202e0 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
202f0 64 28 29 2c 20 66 64 2c 20 69 4f 66 66 2c 20 6e  d(), fd, iOff, n
20300 41 6d 74 2c 20 70 70 29 29 3b 0a 0a 23 69 66 20  Amt, pp));..#if 
20310 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
20320 53 49 5a 45 3e 30 0a 20 20 69 66 28 20 70 46 64  SIZE>0.  if( pFd
20330 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 3e 30 20  ->mmapSizeMax>0 
20340 29 7b 0a 20 20 20 20 69 66 28 20 70 46 64 2d 3e  ){.    if( pFd->
20350 70 4d 61 70 52 65 67 69 6f 6e 3d 3d 30 20 29 7b  pMapRegion==0 ){
20360 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20  .      int rc = 
20370 77 69 6e 4d 61 70 66 69 6c 65 28 70 46 64 2c 20  winMapfile(pFd, 
20380 2d 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  -1);.      if( r
20390 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
203a0 20 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28          OSTRACE(
203b0 28 22 46 45 54 43 48 20 70 69 64 3d 25 6c 75 2c  ("FETCH pid=%lu,
203c0 20 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73   pFile=%p, rc=%s
203d0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
203e0 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65        osGetCurre
203f0 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70  ntProcessId(), p
20400 46 64 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61  Fd, sqlite3ErrNa
20410 6d 65 28 72 63 29 29 29 3b 0a 20 20 20 20 20 20  me(rc)));.      
20420 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
20430 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
20440 66 28 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65  f( pFd->mmapSize
20450 20 3e 3d 20 69 4f 66 66 2b 6e 41 6d 74 20 29 7b   >= iOff+nAmt ){
20460 0a 20 20 20 20 20 20 2a 70 70 20 3d 20 26 28 28  .      *pp = &((
20470 75 38 20 2a 29 70 46 64 2d 3e 70 4d 61 70 52 65  u8 *)pFd->pMapRe
20480 67 69 6f 6e 29 5b 69 4f 66 66 5d 3b 0a 20 20 20  gion)[iOff];.   
20490 20 20 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75     pFd->nFetchOu
204a0 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  t++;.    }.  }.#
204b0 65 6e 64 69 66 0a 0a 20 20 4f 53 54 52 41 43 45  endif..  OSTRACE
204c0 28 28 22 46 45 54 43 48 20 70 69 64 3d 25 6c 75  (("FETCH pid=%lu
204d0 2c 20 70 46 69 6c 65 3d 25 70 2c 20 70 70 3d 25  , pFile=%p, pp=%
204e0 70 2c 20 2a 70 70 3d 25 70 2c 20 72 63 3d 53 51  p, *pp=%p, rc=SQ
204f0 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20  LITE_OK\n",.    
20500 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72         osGetCurr
20510 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
20520 66 64 2c 20 70 70 2c 20 2a 70 70 29 29 3b 0a 20  fd, pp, *pp));. 
20530 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
20540 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  K;.}../*.** If t
20550 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e  he third argumen
20560 74 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74  t is non-NULL, t
20570 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
20580 6e 20 72 65 6c 65 61 73 65 73 20 61 0a 2a 2a 20  n releases a.** 
20590 72 65 66 65 72 65 6e 63 65 20 6f 62 74 61 69 6e  reference obtain
205a0 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72  ed by an earlier
205b0 20 63 61 6c 6c 20 74 6f 20 77 69 6e 46 65 74 63   call to winFetc
205c0 68 28 29 2e 20 54 68 65 20 73 65 63 6f 6e 64 0a  h(). The second.
205d0 2a 2a 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73  ** argument pass
205e0 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  ed to this funct
205f0 69 6f 6e 20 6d 75 73 74 20 62 65 20 74 68 65 20  ion must be the 
20600 73 61 6d 65 20 61 73 20 74 68 65 20 63 6f 72 72  same as the corr
20610 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 61 72 67  esponding.** arg
20620 75 6d 65 6e 74 20 74 68 61 74 20 77 61 73 20 70  ument that was p
20630 61 73 73 65 64 20 74 6f 20 74 68 65 20 77 69 6e  assed to the win
20640 46 65 74 63 68 28 29 20 69 6e 76 6f 63 61 74 69  Fetch() invocati
20650 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66  on..**.** Or, if
20660 20 74 68 65 20 74 68 69 72 64 20 61 72 67 75 6d   the third argum
20670 65 6e 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65  ent is NULL, the
20680 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
20690 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 0a  is being called.
206a0 2a 2a 20 74 6f 20 69 6e 66 6f 72 6d 20 74 68 65  ** to inform the
206b0 20 56 46 53 20 6c 61 79 65 72 20 74 68 61 74 2c   VFS layer that,
206c0 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 50 4f   according to PO
206d0 53 49 58 2c 20 61 6e 79 20 65 78 69 73 74 69 6e  SIX, any existin
206e0 67 20 6d 61 70 70 69 6e 67 0a 2a 2a 20 6d 61 79  g mapping.** may
206f0 20 6e 6f 77 20 62 65 20 69 6e 76 61 6c 69 64 20   now be invalid 
20700 61 6e 64 20 73 68 6f 75 6c 64 20 62 65 20 75 6e  and should be un
20710 6d 61 70 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  mapped..*/.stati
20720 63 20 69 6e 74 20 77 69 6e 55 6e 66 65 74 63 68  c int winUnfetch
20730 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66  (sqlite3_file *f
20740 64 2c 20 69 36 34 20 69 4f 66 66 2c 20 76 6f 69  d, i64 iOff, voi
20750 64 20 2a 70 29 7b 0a 23 69 66 20 53 51 4c 49 54  d *p){.#if SQLIT
20760 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
20770 30 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 64  0.  winFile *pFd
20780 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66 64 3b   = (winFile*)fd;
20790 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c     /* The underl
207a0 79 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69  ying database fi
207b0 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 70  le */..  /* If p
207c0 3d 3d 30 20 28 75 6e 6d 61 70 20 74 68 65 20 65  ==0 (unmap the e
207d0 6e 74 69 72 65 20 66 69 6c 65 29 20 74 68 65 6e  ntire file) then
207e0 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20 6e   there must be n
207f0 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 0a 20 20  o outstanding.  
20800 2a 2a 20 78 46 65 74 63 68 20 72 65 66 65 72 65  ** xFetch refere
20810 6e 63 65 73 2e 20 4f 72 2c 20 69 66 20 70 21 3d  nces. Or, if p!=
20820 30 20 28 6d 65 61 6e 69 6e 67 20 69 74 20 69 73  0 (meaning it is
20830 20 61 6e 20 78 46 65 74 63 68 20 72 65 66 65 72   an xFetch refer
20840 65 6e 63 65 29 2c 0a 20 20 2a 2a 20 74 68 65 6e  ence),.  ** then
20850 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20 61   there must be a
20860 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 75 74 73  t least one outs
20870 74 61 6e 64 69 6e 67 2e 20 20 2a 2f 0a 20 20 61  tanding.  */.  a
20880 73 73 65 72 74 28 20 28 70 3d 3d 30 29 3d 3d 28  ssert( (p==0)==(
20890 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d  pFd->nFetchOut==
208a0 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70  0) );..  /* If p
208b0 21 3d 30 2c 20 69 74 20 6d 75 73 74 20 6d 61 74  !=0, it must mat
208c0 63 68 20 74 68 65 20 69 4f 66 66 20 76 61 6c 75  ch the iOff valu
208d0 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  e. */.  assert( 
208e0 70 3d 3d 30 20 7c 7c 20 70 3d 3d 26 28 28 75 38  p==0 || p==&((u8
208f0 20 2a 29 70 46 64 2d 3e 70 4d 61 70 52 65 67 69   *)pFd->pMapRegi
20900 6f 6e 29 5b 69 4f 66 66 5d 20 29 3b 0a 0a 20 20  on)[iOff] );..  
20910 4f 53 54 52 41 43 45 28 28 22 55 4e 46 45 54 43  OSTRACE(("UNFETC
20920 48 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65  H pid=%lu, pFile
20930 3d 25 70 2c 20 6f 66 66 73 65 74 3d 25 6c 6c 64  =%p, offset=%lld
20940 2c 20 70 3d 25 70 5c 6e 22 2c 0a 20 20 20 20 20  , p=%p\n",.     
20950 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65        osGetCurre
20960 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70  ntProcessId(), p
20970 46 64 2c 20 69 4f 66 66 2c 20 70 29 29 3b 0a 0a  Fd, iOff, p));..
20980 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 70    if( p ){.    p
20990 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 2d 2d 3b  Fd->nFetchOut--;
209a0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
209b0 20 46 49 58 4d 45 3a 20 20 49 66 20 57 69 6e 64   FIXME:  If Wind
209c0 6f 77 73 20 74 72 75 6c 79 20 61 6c 77 61 79 73  ows truly always
209d0 20 70 72 65 76 65 6e 74 73 20 74 72 75 6e 63 61   prevents trunca
209e0 74 69 6e 67 20 6f 72 20 64 65 6c 65 74 69 6e 67  ting or deleting
209f0 20 61 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 77   a.    ** file w
20a00 68 69 6c 65 20 61 20 6d 61 70 70 69 6e 67 20 69  hile a mapping i
20a10 73 20 68 65 6c 64 2c 20 74 68 65 6e 20 74 68 65  s held, then the
20a20 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 69 6e 55 6e   following winUn
20a30 6d 61 70 66 69 6c 65 28 29 20 63 61 6c 6c 0a 20  mapfile() call. 
20a40 20 20 20 2a 2a 20 69 73 20 75 6e 6e 65 63 65 73     ** is unneces
20a50 73 61 72 79 20 63 61 6e 20 63 61 6e 20 62 65 20  sary can can be 
20a60 6f 6d 69 74 74 65 64 20 2d 20 70 6f 74 65 6e 74  omitted - potent
20a70 69 61 6c 6c 79 20 69 6d 70 72 6f 76 69 6e 67 0a  ially improving.
20a80 20 20 20 20 2a 2a 20 70 65 72 66 6f 72 6d 61 6e      ** performan
20a90 63 65 2e 20 20 2a 2f 0a 20 20 20 20 77 69 6e 55  ce.  */.    winU
20aa0 6e 6d 61 70 66 69 6c 65 28 70 46 64 29 3b 0a 20  nmapfile(pFd);. 
20ab0 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46   }..  assert( pF
20ac0 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3e 3d 30 20  d->nFetchOut>=0 
20ad0 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 4f 53 54  );.#endif..  OST
20ae0 52 41 43 45 28 28 22 55 4e 46 45 54 43 48 20 70  RACE(("UNFETCH p
20af0 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70  id=%lu, pFile=%p
20b00 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e  , rc=SQLITE_OK\n
20b10 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73  ",.           os
20b20 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
20b30 73 49 64 28 29 2c 20 66 64 29 29 3b 0a 20 20 72  sId(), fd));.  r
20b40 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
20b50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20 65  .}../*.** Here e
20b60 6e 64 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e  nds the implemen
20b70 74 61 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 73 71  tation of all sq
20b80 6c 69 74 65 33 5f 66 69 6c 65 20 6d 65 74 68 6f  lite3_file metho
20b90 64 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ds..**.*********
20ba0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e  ************* En
20bb0 64 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 4d  d sqlite3_file M
20bc0 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ethods *********
20bd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20be0 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
20bf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20c00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20c10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20c20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20c30 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  *****/../*.** Th
20c40 69 73 20 76 65 63 74 6f 72 20 64 65 66 69 6e 65  is vector define
20c50 73 20 61 6c 6c 20 74 68 65 20 6d 65 74 68 6f 64  s all the method
20c60 73 20 74 68 61 74 20 63 61 6e 20 6f 70 65 72 61  s that can opera
20c70 74 65 20 6f 6e 20 61 6e 0a 2a 2a 20 73 71 6c 69  te on an.** sqli
20c80 74 65 33 5f 66 69 6c 65 20 66 6f 72 20 77 69 6e  te3_file for win
20c90 33 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  32..*/.static co
20ca0 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  nst sqlite3_io_m
20cb0 65 74 68 6f 64 73 20 77 69 6e 49 6f 4d 65 74 68  ethods winIoMeth
20cc0 6f 64 20 3d 20 7b 0a 20 20 33 2c 20 20 20 20 20  od = {.  3,     
20cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ce0 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72           /* iVer
20cf0 73 69 6f 6e 20 2a 2f 0a 20 20 77 69 6e 43 6c 6f  sion */.  winClo
20d00 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
20d10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c            /* xCl
20d20 6f 73 65 20 2a 2f 0a 20 20 77 69 6e 52 65 61 64  ose */.  winRead
20d30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
20d40 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65 61           /* xRea
20d50 64 20 2a 2f 0a 20 20 77 69 6e 57 72 69 74 65 2c  d */.  winWrite,
20d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d70 20 20 20 20 20 20 20 2f 2a 20 78 57 72 69 74 65         /* xWrite
20d80 20 2a 2f 0a 20 20 77 69 6e 54 72 75 6e 63 61 74   */.  winTruncat
20d90 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
20da0 20 20 20 20 20 20 2f 2a 20 78 54 72 75 6e 63 61        /* xTrunca
20db0 74 65 20 2a 2f 0a 20 20 77 69 6e 53 79 6e 63 2c  te */.  winSync,
20dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20dd0 20 20 20 20 20 20 20 20 2f 2a 20 78 53 79 6e 63          /* xSync
20de0 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 53 69 7a   */.  winFileSiz
20df0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
20e00 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 53 69        /* xFileSi
20e10 7a 65 20 2a 2f 0a 20 20 77 69 6e 4c 6f 63 6b 2c  ze */.  winLock,
20e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20e30 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b          /* xLock
20e40 20 2a 2f 0a 20 20 77 69 6e 55 6e 6c 6f 63 6b 2c   */.  winUnlock,
20e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20e60 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b        /* xUnlock
20e70 20 2a 2f 0a 20 20 77 69 6e 43 68 65 63 6b 52 65   */.  winCheckRe
20e80 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20 20 20  servedLock,     
20e90 20 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52        /* xCheckR
20ea0 65 73 65 72 76 65 64 4c 6f 63 6b 20 2a 2f 0a 20  eservedLock */. 
20eb0 20 77 69 6e 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c   winFileControl,
20ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ed0 20 2f 2a 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c   /* xFileControl
20ee0 20 2a 2f 0a 20 20 77 69 6e 53 65 63 74 6f 72 53   */.  winSectorS
20ef0 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ize,            
20f00 20 20 20 20 20 20 2f 2a 20 78 53 65 63 74 6f 72        /* xSector
20f10 53 69 7a 65 20 2a 2f 0a 20 20 77 69 6e 44 65 76  Size */.  winDev
20f20 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
20f30 63 73 2c 20 20 20 20 20 20 20 2f 2a 20 78 44 65  cs,       /* xDe
20f40 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
20f50 69 63 73 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4d  ics */.  winShmM
20f60 61 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ap,             
20f70 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d           /* xShm
20f80 4d 61 70 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4c  Map */.  winShmL
20f90 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
20fa0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d           /* xShm
20fb0 4c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e 53 68 6d  Lock */.  winShm
20fc0 42 61 72 72 69 65 72 2c 20 20 20 20 20 20 20 20  Barrier,        
20fd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68            /* xSh
20fe0 6d 42 61 72 72 69 65 72 20 2a 2f 0a 20 20 77 69  mBarrier */.  wi
20ff0 6e 53 68 6d 55 6e 6d 61 70 2c 20 20 20 20 20 20  nShmUnmap,      
21000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21010 20 78 53 68 6d 55 6e 6d 61 70 20 2a 2f 0a 20 20   xShmUnmap */.  
21020 77 69 6e 46 65 74 63 68 2c 20 20 20 20 20 20 20  winFetch,       
21030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21040 2f 2a 20 78 46 65 74 63 68 20 2a 2f 0a 20 20 77  /* xFetch */.  w
21050 69 6e 55 6e 66 65 74 63 68 20 20 20 20 20 20 20  inUnfetch       
21060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21070 2a 20 78 55 6e 66 65 74 63 68 20 2a 2f 0a 7d 3b  * xUnfetch */.};
21080 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
21090 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
210a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
210b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
210c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
210d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
210e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 73 71 6c  ************ sql
210f0 69 74 65 33 5f 76 66 73 20 6d 65 74 68 6f 64 73  ite3_vfs methods
21100 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
21110 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
21120 0a 2a 2a 20 54 68 69 73 20 64 69 76 69 73 69 6f  .** This divisio
21130 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 69  n contains the i
21140 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
21150 20 6d 65 74 68 6f 64 73 20 6f 6e 20 74 68 65 0a   methods on the.
21160 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6f  ** sqlite3_vfs o
21170 62 6a 65 63 74 2e 0a 2a 2f 0a 0a 23 69 66 20 64  bject..*/..#if d
21180 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f  efined(__CYGWIN_
21190 5f 29 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  _)./*.** Convert
211a0 20 61 20 66 69 6c 65 6e 61 6d 65 20 66 72 6f 6d   a filename from
211b0 20 77 68 61 74 65 76 65 72 20 74 68 65 20 75 6e   whatever the un
211c0 64 65 72 6c 79 69 6e 67 20 6f 70 65 72 61 74 69  derlying operati
211d0 6e 67 20 73 79 73 74 65 6d 0a 2a 2a 20 73 75 70  ng system.** sup
211e0 70 6f 72 74 73 20 66 6f 72 20 66 69 6c 65 6e 61  ports for filena
211f0 6d 65 73 20 69 6e 74 6f 20 55 54 46 2d 38 2e 20  mes into UTF-8. 
21200 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74   Space to hold t
21210 68 65 20 72 65 73 75 6c 74 20 69 73 0a 2a 2a 20  he result is.** 
21220 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61  obtained from ma
21230 6c 6c 6f 63 20 61 6e 64 20 6d 75 73 74 20 62 65  lloc and must be
21240 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61   freed by the ca
21250 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a  lling function..
21260 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
21270 77 69 6e 43 6f 6e 76 65 72 74 54 6f 55 74 66 38  winConvertToUtf8
21280 46 69 6c 65 6e 61 6d 65 28 63 6f 6e 73 74 20 76  Filename(const v
21290 6f 69 64 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b  oid *zFilename){
212a0 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6e 76 65 72  .  char *zConver
212b0 74 65 64 20 3d 20 30 3b 0a 20 20 69 66 28 20 6f  ted = 0;.  if( o
212c0 73 49 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 7a  sIsNT() ){.    z
212d0 43 6f 6e 76 65 72 74 65 64 20 3d 20 77 69 6e 55  Converted = winU
212e0 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 46 69  nicodeToUtf8(zFi
212f0 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 23 69 66  lename);.  }.#if
21300 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  def SQLITE_WIN32
21310 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65  _HAS_ANSI.  else
21320 7b 0a 20 20 20 20 7a 43 6f 6e 76 65 72 74 65 64  {.    zConverted
21330 20 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32   = sqlite3_win32
21340 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28 7a 46  _mbcs_to_utf8(zF
21350 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 23 65  ilename);.  }.#e
21360 6e 64 69 66 0a 20 20 2f 2a 20 63 61 6c 6c 65 72  ndif.  /* caller
21370 20 77 69 6c 6c 20 68 61 6e 64 6c 65 20 6f 75 74   will handle out
21380 20 6f 66 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20   of memory */.  
21390 72 65 74 75 72 6e 20 7a 43 6f 6e 76 65 72 74 65  return zConverte
213a0 64 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  d;.}.#endif../*.
213b0 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 55 54 46  ** Convert a UTF
213c0 2d 38 20 66 69 6c 65 6e 61 6d 65 20 69 6e 74 6f  -8 filename into
213d0 20 77 68 61 74 65 76 65 72 20 66 6f 72 6d 20 74   whatever form t
213e0 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a 2a 2a  he underlying.**
213f0 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
21400 6d 20 77 61 6e 74 73 20 66 69 6c 65 6e 61 6d 65  m wants filename
21410 73 20 69 6e 2e 20 20 53 70 61 63 65 20 74 6f 20  s in.  Space to 
21420 68 6f 6c 64 20 74 68 65 20 72 65 73 75 6c 74 0a  hold the result.
21430 2a 2a 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66  ** is obtained f
21440 72 6f 6d 20 6d 61 6c 6c 6f 63 20 61 6e 64 20 6d  rom malloc and m
21450 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20  ust be freed by 
21460 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66  the calling.** f
21470 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  unction..*/.stat
21480 69 63 20 76 6f 69 64 20 2a 77 69 6e 43 6f 6e 76  ic void *winConv
21490 65 72 74 46 72 6f 6d 55 74 66 38 46 69 6c 65 6e  ertFromUtf8Filen
214a0 61 6d 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ame(const char *
214b0 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 76 6f  zFilename){.  vo
214c0 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 20 3d  id *zConverted =
214d0 20 30 3b 0a 20 20 69 66 28 20 6f 73 49 73 4e 54   0;.  if( osIsNT
214e0 28 29 20 29 7b 0a 20 20 20 20 7a 43 6f 6e 76 65  () ){.    zConve
214f0 72 74 65 64 20 3d 20 77 69 6e 55 74 66 38 54 6f  rted = winUtf8To
21500 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61 6d  Unicode(zFilenam
21510 65 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53  e);.  }.#ifdef S
21520 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
21530 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20  ANSI.  else{.   
21540 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 73 71   zConverted = sq
21550 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75 74 66 38  lite3_win32_utf8
21560 5f 74 6f 5f 6d 62 63 73 28 7a 46 69 6c 65 6e 61  _to_mbcs(zFilena
21570 6d 65 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  me);.  }.#endif.
21580 20 20 2f 2a 20 63 61 6c 6c 65 72 20 77 69 6c 6c    /* caller will
21590 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20 6d   handle out of m
215a0 65 6d 6f 72 79 20 2a 2f 0a 20 20 72 65 74 75 72  emory */.  retur
215b0 6e 20 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 7d 0a  n zConverted;.}.
215c0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
215d0 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 6e 6f 6e  tion returns non
215e0 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 73 70 65  -zero if the spe
215f0 63 69 66 69 65 64 20 55 54 46 2d 38 20 73 74 72  cified UTF-8 str
21600 69 6e 67 20 62 75 66 66 65 72 0a 2a 2a 20 65 6e  ing buffer.** en
21610 64 73 20 77 69 74 68 20 61 20 64 69 72 65 63 74  ds with a direct
21620 6f 72 79 20 73 65 70 61 72 61 74 6f 72 20 63 68  ory separator ch
21630 61 72 61 63 74 65 72 20 6f 72 20 6f 6e 65 20 77  aracter or one w
21640 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 0a  as successfully.
21650 2a 2a 20 61 64 64 65 64 20 74 6f 20 69 74 2e 0a  ** added to it..
21660 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
21670 6e 4d 61 6b 65 45 6e 64 49 6e 44 69 72 53 65 70  nMakeEndInDirSep
21680 28 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20  (int nBuf, char 
21690 2a 7a 42 75 66 29 7b 0a 20 20 69 66 28 20 7a 42  *zBuf){.  if( zB
216a0 75 66 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 4c  uf ){.    int nL
216b0 65 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  en = sqlite3Strl
216c0 65 6e 33 30 28 7a 42 75 66 29 3b 0a 20 20 20 20  en30(zBuf);.    
216d0 69 66 28 20 6e 4c 65 6e 3e 30 20 29 7b 0a 20 20  if( nLen>0 ){.  
216e0 20 20 20 20 69 66 28 20 77 69 6e 49 73 44 69 72      if( winIsDir
216f0 53 65 70 28 7a 42 75 66 5b 6e 4c 65 6e 2d 31 5d  Sep(zBuf[nLen-1]
21700 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
21710 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c  urn 1;.      }el
21720 73 65 20 69 66 28 20 6e 4c 65 6e 2b 31 3c 6e 42  se if( nLen+1<nB
21730 75 66 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 42  uf ){.        zB
21740 75 66 5b 6e 4c 65 6e 5d 20 3d 20 77 69 6e 47 65  uf[nLen] = winGe
21750 74 44 69 72 53 65 70 28 29 3b 0a 20 20 20 20 20  tDirSep();.     
21760 20 20 20 7a 42 75 66 5b 6e 4c 65 6e 2b 31 5d 20     zBuf[nLen+1] 
21770 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 20 20  = '\0';.        
21780 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
21790 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
217a0 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
217b0 20 43 72 65 61 74 65 20 61 20 74 65 6d 70 6f 72   Create a tempor
217c0 61 72 79 20 66 69 6c 65 20 6e 61 6d 65 20 61 6e  ary file name an
217d0 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  d store the resu
217e0 6c 74 69 6e 67 20 70 6f 69 6e 74 65 72 20 69 6e  lting pointer in
217f0 74 6f 20 70 7a 42 75 66 2e 0a 2a 2a 20 54 68 65  to pzBuf..** The
21800 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65   pointer returne
21810 64 20 69 6e 20 70 7a 42 75 66 20 6d 75 73 74 20  d in pzBuf must 
21820 62 65 20 66 72 65 65 64 20 76 69 61 20 73 71 6c  be freed via sql
21830 69 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a  ite3_free()..*/.
21840 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 47 65  static int winGe
21850 74 54 65 6d 70 6e 61 6d 65 28 73 71 6c 69 74 65  tTempname(sqlite
21860 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 63 68 61  3_vfs *pVfs, cha
21870 72 20 2a 2a 70 7a 42 75 66 29 7b 0a 20 20 73 74  r **pzBuf){.  st
21880 61 74 69 63 20 63 68 61 72 20 7a 43 68 61 72 73  atic char zChars
21890 5b 5d 20 3d 0a 20 20 20 20 22 61 62 63 64 65 66  [] =.    "abcdef
218a0 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76  ghijklmnopqrstuv
218b0 77 78 79 7a 22 0a 20 20 20 20 22 41 42 43 44 45  wxyz".    "ABCDE
218c0 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55  FGHIJKLMNOPQRSTU
218d0 56 57 58 59 5a 22 0a 20 20 20 20 22 30 31 32 33  VWXYZ".    "0123
218e0 34 35 36 37 38 39 22 3b 0a 20 20 73 69 7a 65 5f  456789";.  size_
218f0 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e 50  t i, j;.  int nP
21900 72 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  re = sqlite3Strl
21910 65 6e 33 30 28 53 51 4c 49 54 45 5f 54 45 4d 50  en30(SQLITE_TEMP
21920 5f 46 49 4c 45 5f 50 52 45 46 49 58 29 3b 0a 20  _FILE_PREFIX);. 
21930 20 69 6e 74 20 6e 4d 61 78 2c 20 6e 42 75 66 2c   int nMax, nBuf,
21940 20 6e 44 69 72 2c 20 6e 4c 65 6e 3b 0a 20 20 63   nDir, nLen;.  c
21950 68 61 72 20 2a 7a 42 75 66 3b 0a 0a 20 20 2f 2a  har *zBuf;..  /*
21960 20 49 74 27 73 20 6f 64 64 20 74 6f 20 73 69 6d   It's odd to sim
21970 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f  ulate an io-erro
21980 72 20 68 65 72 65 2c 20 62 75 74 20 72 65 61 6c  r here, but real
21990 6c 79 20 74 68 69 73 20 69 73 20 6a 75 73 74 0a  ly this is just.
219a0 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 69    ** using the i
219b0 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61 73 74 72  o-error infrastr
219c0 75 63 74 75 72 65 20 74 6f 20 74 65 73 74 20 74  ucture to test t
219d0 68 61 74 20 53 51 4c 69 74 65 20 68 61 6e 64 6c  hat SQLite handl
219e0 65 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e  es this.  ** fun
219f0 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 0a 20  ction failing.. 
21a00 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f   */.  SimulateIO
21a10 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
21a20 4c 49 54 45 5f 49 4f 45 52 52 20 29 3b 0a 0a 20  LITE_IOERR );.. 
21a30 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 74   /* Allocate a t
21a40 65 6d 70 6f 72 61 72 79 20 62 75 66 66 65 72 20  emporary buffer 
21a50 74 6f 20 73 74 6f 72 65 20 74 68 65 20 66 75 6c  to store the ful
21a60 6c 79 20 71 75 61 6c 69 66 69 65 64 20 66 69 6c  ly qualified fil
21a70 65 0a 20 20 2a 2a 20 6e 61 6d 65 20 66 6f 72 20  e.  ** name for 
21a80 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69  the temporary fi
21a90 6c 65 2e 20 20 49 66 20 74 68 69 73 20 66 61 69  le.  If this fai
21aa0 6c 73 2c 20 77 65 20 63 61 6e 6e 6f 74 20 63 6f  ls, we cannot co
21ab0 6e 74 69 6e 75 65 2e 0a 20 20 2a 2f 0a 20 20 6e  ntinue..  */.  n
21ac0 4d 61 78 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61  Max = pVfs->mxPa
21ad0 74 68 6e 61 6d 65 3b 20 6e 42 75 66 20 3d 20 6e  thname; nBuf = n
21ae0 4d 61 78 20 2b 20 32 3b 0a 20 20 7a 42 75 66 20  Max + 2;.  zBuf 
21af0 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  = sqlite3MallocZ
21b00 65 72 6f 28 20 6e 42 75 66 20 29 3b 0a 20 20 69  ero( nBuf );.  i
21b10 66 28 20 21 7a 42 75 66 20 29 7b 0a 20 20 20 20  f( !zBuf ){.    
21b20 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46  OSTRACE(("TEMP-F
21b30 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54  ILENAME rc=SQLIT
21b40 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22  E_IOERR_NOMEM\n"
21b50 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ));.    return S
21b60 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
21b70 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 67  M;.  }..  /* Fig
21b80 75 72 65 20 6f 75 74 20 74 68 65 20 65 66 66 65  ure out the effe
21b90 63 74 69 76 65 20 74 65 6d 70 6f 72 61 72 79 20  ctive temporary 
21ba0 64 69 72 65 63 74 6f 72 79 2e 20 20 46 69 72 73  directory.  Firs
21bb0 74 2c 20 63 68 65 63 6b 20 69 66 20 6f 6e 65 0a  t, check if one.
21bc0 20 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 65 78    ** has been ex
21bd0 70 6c 69 63 69 74 6c 79 20 73 65 74 20 62 79 20  plicitly set by 
21be0 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 3b  the application;
21bf0 20 6f 74 68 65 72 77 69 73 65 2c 20 75 73 65 20   otherwise, use 
21c00 74 68 65 20 6f 6e 65 0a 20 20 2a 2a 20 63 6f 6e  the one.  ** con
21c10 66 69 67 75 72 65 64 20 62 79 20 74 68 65 20 6f  figured by the o
21c20 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 2e  perating system.
21c30 0a 20 20 2a 2f 0a 20 20 6e 44 69 72 20 3d 20 6e  .  */.  nDir = n
21c40 4d 61 78 20 2d 20 28 6e 50 72 65 20 2b 20 31 35  Max - (nPre + 15
21c50 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 44 69  );.  assert( nDi
21c60 72 3e 30 20 29 3b 0a 20 20 69 66 28 20 73 71 6c  r>0 );.  if( sql
21c70 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74  ite3_temp_direct
21c80 6f 72 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  ory ){.    int n
21c90 44 69 72 4c 65 6e 20 3d 20 73 71 6c 69 74 65 33  DirLen = sqlite3
21ca0 53 74 72 6c 65 6e 33 30 28 73 71 6c 69 74 65 33  Strlen30(sqlite3
21cb0 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 29  _temp_directory)
21cc0 3b 0a 20 20 20 20 69 66 28 20 6e 44 69 72 4c 65  ;.    if( nDirLe
21cd0 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  n>0 ){.      if(
21ce0 20 21 77 69 6e 49 73 44 69 72 53 65 70 28 73 71   !winIsDirSep(sq
21cf0 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63  lite3_temp_direc
21d00 74 6f 72 79 5b 6e 44 69 72 4c 65 6e 2d 31 5d 29  tory[nDirLen-1])
21d10 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 44 69 72   ){.        nDir
21d20 4c 65 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20  Len++;.      }. 
21d30 20 20 20 20 20 69 66 28 20 6e 44 69 72 4c 65 6e       if( nDirLen
21d40 3e 6e 44 69 72 20 29 7b 0a 20 20 20 20 20 20 20  >nDir ){.       
21d50 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42   sqlite3_free(zB
21d60 75 66 29 3b 0a 20 20 20 20 20 20 20 20 4f 53 54  uf);.        OST
21d70 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45  RACE(("TEMP-FILE
21d80 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 45  NAME rc=SQLITE_E
21d90 52 52 4f 52 5c 6e 22 29 29 3b 0a 20 20 20 20 20  RROR\n"));.     
21da0 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67     return winLog
21db0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 45 52 52  Error(SQLITE_ERR
21dc0 4f 52 2c 20 30 2c 20 22 77 69 6e 47 65 74 54 65  OR, 0, "winGetTe
21dd0 6d 70 6e 61 6d 65 31 22 2c 20 30 29 3b 0a 20 20  mpname1", 0);.  
21de0 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
21df0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4d 61  te3_snprintf(nMa
21e00 78 2c 20 7a 42 75 66 2c 20 22 25 73 22 2c 20 73  x, zBuf, "%s", s
21e10 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65  qlite3_temp_dire
21e20 63 74 6f 72 79 29 3b 0a 20 20 20 20 7d 0a 20 20  ctory);.    }.  
21e30 7d 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  }.#if defined(__
21e40 43 59 47 57 49 4e 5f 5f 29 0a 20 20 65 6c 73 65  CYGWIN__).  else
21e50 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  {.    static con
21e60 73 74 20 63 68 61 72 20 2a 61 7a 44 69 72 73 5b  st char *azDirs[
21e70 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 30 2c 20  ] = {.       0, 
21e80 2f 2a 20 67 65 74 65 6e 76 28 22 53 51 4c 49 54  /* getenv("SQLIT
21e90 45 5f 54 4d 50 44 49 52 22 29 20 2a 2f 0a 20 20  E_TMPDIR") */.  
21ea0 20 20 20 20 20 30 2c 20 2f 2a 20 67 65 74 65 6e       0, /* geten
21eb0 76 28 22 54 4d 50 44 49 52 22 29 20 2a 2f 0a 20  v("TMPDIR") */. 
21ec0 20 20 20 20 20 20 30 2c 20 2f 2a 20 67 65 74 65        0, /* gete
21ed0 6e 76 28 22 54 4d 50 22 29 20 2a 2f 0a 20 20 20  nv("TMP") */.   
21ee0 20 20 20 20 30 2c 20 2f 2a 20 67 65 74 65 6e 76      0, /* getenv
21ef0 28 22 54 45 4d 50 22 29 20 2a 2f 0a 20 20 20 20  ("TEMP") */.    
21f00 20 20 20 30 2c 20 2f 2a 20 67 65 74 65 6e 76 28     0, /* getenv(
21f10 22 55 53 45 52 50 52 4f 46 49 4c 45 22 29 20 2a  "USERPROFILE") *
21f20 2f 0a 20 20 20 20 20 20 20 22 2f 76 61 72 2f 74  /.       "/var/t
21f30 6d 70 22 2c 0a 20 20 20 20 20 20 20 22 2f 75 73  mp",.       "/us
21f40 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20 20 20 22  r/tmp",.       "
21f50 2f 74 6d 70 22 2c 0a 20 20 20 20 20 20 20 22 2e  /tmp",.       ".
21f60 22 2c 0a 20 20 20 20 20 20 20 30 20 20 20 20 20  ",.       0     
21f70 20 20 20 2f 2a 20 4c 69 73 74 20 74 65 72 6d 69     /* List termi
21f80 6e 61 74 6f 72 20 2a 2f 0a 20 20 20 20 7d 3b 0a  nator */.    };.
21f90 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74      unsigned int
21fa0 20 69 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   i;.    const ch
21fb0 61 72 20 2a 7a 44 69 72 20 3d 20 30 3b 0a 0a 20  ar *zDir = 0;.. 
21fc0 20 20 20 69 66 28 20 21 61 7a 44 69 72 73 5b 30     if( !azDirs[0
21fd0 5d 20 29 20 61 7a 44 69 72 73 5b 30 5d 20 3d 20  ] ) azDirs[0] = 
21fe0 67 65 74 65 6e 76 28 22 53 51 4c 49 54 45 5f 54  getenv("SQLITE_T
21ff0 4d 50 44 49 52 22 29 3b 0a 20 20 20 20 69 66 28  MPDIR");.    if(
22000 20 21 61 7a 44 69 72 73 5b 31 5d 20 29 20 61 7a   !azDirs[1] ) az
22010 44 69 72 73 5b 31 5d 20 3d 20 67 65 74 65 6e 76  Dirs[1] = getenv
22020 28 22 54 4d 50 44 49 52 22 29 3b 0a 20 20 20 20  ("TMPDIR");.    
22030 69 66 28 20 21 61 7a 44 69 72 73 5b 32 5d 20 29  if( !azDirs[2] )
22040 20 61 7a 44 69 72 73 5b 32 5d 20 3d 20 67 65 74   azDirs[2] = get
22050 65 6e 76 28 22 54 4d 50 22 29 3b 0a 20 20 20 20  env("TMP");.    
22060 69 66 28 20 21 61 7a 44 69 72 73 5b 33 5d 20 29  if( !azDirs[3] )
22070 20 61 7a 44 69 72 73 5b 33 5d 20 3d 20 67 65 74   azDirs[3] = get
22080 65 6e 76 28 22 54 45 4d 50 22 29 3b 0a 20 20 20  env("TEMP");.   
22090 20 69 66 28 20 21 61 7a 44 69 72 73 5b 34 5d 20   if( !azDirs[4] 
220a0 29 20 61 7a 44 69 72 73 5b 34 5d 20 3d 20 67 65  ) azDirs[4] = ge
220b0 74 65 6e 76 28 22 55 53 45 52 50 52 4f 46 49 4c  tenv("USERPROFIL
220c0 45 22 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  E");.    for(i=0
220d0 3b 20 69 3c 73 69 7a 65 6f 66 28 61 7a 44 69 72  ; i<sizeof(azDir
220e0 73 29 2f 73 69 7a 65 6f 66 28 61 7a 44 69 72 73  s)/sizeof(azDirs
220f0 5b 30 5d 29 3b 20 7a 44 69 72 3d 61 7a 44 69 72  [0]); zDir=azDir
22100 73 5b 69 2b 2b 5d 29 7b 0a 20 20 20 20 20 20 76  s[i++]){.      v
22110 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b  oid *zConverted;
22120 0a 20 20 20 20 20 20 69 66 28 20 7a 44 69 72 3d  .      if( zDir=
22130 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
22140 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70       /* If the p
22150 61 74 68 20 73 74 61 72 74 73 20 77 69 74 68 20  ath starts with 
22160 61 20 64 72 69 76 65 20 6c 65 74 74 65 72 20 66  a drive letter f
22170 6f 6c 6c 6f 77 65 64 20 62 79 20 74 68 65 20 63  ollowed by the c
22180 6f 6c 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 63 68  olon.      ** ch
22190 61 72 61 63 74 65 72 2c 20 61 73 73 75 6d 65 20  aracter, assume 
221a0 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 61 20  it is already a 
221b0 6e 61 74 69 76 65 20 57 69 6e 33 32 20 70 61 74  native Win32 pat
221c0 68 3b 20 6f 74 68 65 72 77 69 73 65 2c 0a 20 20  h; otherwise,.  
221d0 20 20 20 20 2a 2a 20 69 74 20 6d 75 73 74 20 62      ** it must b
221e0 65 20 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 61  e converted to a
221f0 20 6e 61 74 69 76 65 20 57 69 6e 33 32 20 70 61   native Win32 pa
22200 74 68 20 76 69 61 20 74 68 65 20 43 79 67 77 69  th via the Cygwi
22210 6e 20 41 50 49 0a 20 20 20 20 20 20 2a 2a 20 70  n API.      ** p
22220 72 69 6f 72 20 74 6f 20 75 73 69 6e 67 20 69 74  rior to using it
22230 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
22240 20 69 66 28 20 77 69 6e 49 73 44 72 69 76 65 4c   if( winIsDriveL
22250 65 74 74 65 72 41 6e 64 43 6f 6c 6f 6e 28 7a 44  etterAndColon(zD
22260 69 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  ir) ){.        z
22270 43 6f 6e 76 65 72 74 65 64 20 3d 20 77 69 6e 43  Converted = winC
22280 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66 38 46 69  onvertFromUtf8Fi
22290 6c 65 6e 61 6d 65 28 7a 44 69 72 29 3b 0a 20 20  lename(zDir);.  
222a0 20 20 20 20 20 20 69 66 28 20 21 7a 43 6f 6e 76        if( !zConv
222b0 65 72 74 65 64 20 29 7b 0a 20 20 20 20 20 20 20  erted ){.       
222c0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
222d0 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 20 20 20  zBuf);.         
222e0 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d   OSTRACE(("TEMP-
222f0 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49  FILENAME rc=SQLI
22300 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e  TE_IOERR_NOMEM\n
22310 22 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  "));.          r
22320 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
22330 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  RR_NOMEM;.      
22340 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
22350 77 69 6e 49 73 44 69 72 28 7a 43 6f 6e 76 65 72  winIsDir(zConver
22360 74 65 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ted) ){.        
22370 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
22380 74 66 28 6e 4d 61 78 2c 20 7a 42 75 66 2c 20 22  tf(nMax, zBuf, "
22390 25 73 22 2c 20 7a 44 69 72 29 3b 0a 20 20 20 20  %s", zDir);.    
223a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
223b0 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
223c0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
223d0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
223e0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
223f0 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20  zConverted);.   
22400 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
22410 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 73    zConverted = s
22420 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
22430 28 20 6e 4d 61 78 2b 31 20 29 3b 0a 20 20 20 20  ( nMax+1 );.    
22440 20 20 20 20 69 66 28 20 21 7a 43 6f 6e 76 65 72      if( !zConver
22450 74 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ted ){.         
22460 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42   sqlite3_free(zB
22470 75 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 4f  uf);.          O
22480 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49  STRACE(("TEMP-FI
22490 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45  LENAME rc=SQLITE
224a0 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29  _IOERR_NOMEM\n")
224b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
224c0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
224d0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
224e0 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 79  }.        if( cy
224f0 67 77 69 6e 5f 63 6f 6e 76 5f 70 61 74 68 28 0a  gwin_conv_path(.
22500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22510 6f 73 49 73 4e 54 28 29 20 3f 20 43 43 50 5f 50  osIsNT() ? CCP_P
22520 4f 53 49 58 5f 54 4f 5f 57 49 4e 5f 57 20 3a 20  OSIX_TO_WIN_W : 
22530 43 43 50 5f 50 4f 53 49 58 5f 54 4f 5f 57 49 4e  CCP_POSIX_TO_WIN
22540 5f 41 2c 20 7a 44 69 72 2c 0a 20 20 20 20 20 20  _A, zDir,.      
22550 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6e 76 65            zConve
22560 72 74 65 64 2c 20 6e 4d 61 78 2b 31 29 3c 30 20  rted, nMax+1)<0 
22570 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
22580 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65  ite3_free(zConve
22590 72 74 65 64 29 3b 0a 20 20 20 20 20 20 20 20 20  rted);.         
225a0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42   sqlite3_free(zB
225b0 75 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 4f  uf);.          O
225c0 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49  STRACE(("TEMP-FI
225d0 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45  LENAME rc=SQLITE
225e0 5f 49 4f 45 52 52 5f 43 4f 4e 56 50 41 54 48 5c  _IOERR_CONVPATH\
225f0 6e 22 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  n"));.          
22600 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72  return winLogErr
22610 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
22620 43 4f 4e 56 50 41 54 48 2c 20 28 44 57 4f 52 44  CONVPATH, (DWORD
22630 29 65 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  )errno,.        
22640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22650 20 20 20 20 20 22 77 69 6e 47 65 74 54 65 6d 70       "winGetTemp
22660 6e 61 6d 65 32 22 2c 20 7a 44 69 72 29 3b 0a 20  name2", zDir);. 
22670 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
22680 20 69 66 28 20 77 69 6e 49 73 44 69 72 28 7a 43   if( winIsDir(zC
22690 6f 6e 76 65 72 74 65 64 29 20 29 7b 0a 20 20 20  onverted) ){.   
226a0 20 20 20 20 20 20 20 2f 2a 20 41 74 20 74 68 69         /* At thi
226b0 73 20 70 6f 69 6e 74 2c 20 77 65 20 6b 6e 6f 77  s point, we know
226c0 20 74 68 65 20 63 61 6e 64 69 64 61 74 65 20 64   the candidate d
226d0 69 72 65 63 74 6f 72 79 20 65 78 69 73 74 73 20  irectory exists 
226e0 61 6e 64 20 73 68 6f 75 6c 64 0a 20 20 20 20 20  and should.     
226f0 20 20 20 20 20 2a 2a 20 62 65 20 75 73 65 64 2e       ** be used.
22700 20 20 48 6f 77 65 76 65 72 2c 20 77 65 20 6d 61    However, we ma
22710 79 20 6e 65 65 64 20 74 6f 20 63 6f 6e 76 65 72  y need to conver
22720 74 20 74 68 65 20 73 74 72 69 6e 67 20 63 6f 6e  t the string con
22730 74 61 69 6e 69 6e 67 0a 20 20 20 20 20 20 20 20  taining.        
22740 20 20 2a 2a 20 69 74 73 20 6e 61 6d 65 20 69 6e    ** its name in
22750 74 6f 20 55 54 46 2d 38 20 28 69 2e 65 2e 20 69  to UTF-8 (i.e. i
22760 66 20 69 74 20 69 73 20 55 54 46 2d 31 36 20 72  f it is UTF-16 r
22770 69 67 68 74 20 6e 6f 77 29 2e 0a 20 20 20 20 20  ight now)..     
22780 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
22790 20 20 63 68 61 72 20 2a 7a 55 74 66 38 20 3d 20    char *zUtf8 = 
227a0 77 69 6e 43 6f 6e 76 65 72 74 54 6f 55 74 66 38  winConvertToUtf8
227b0 46 69 6c 65 6e 61 6d 65 28 7a 43 6f 6e 76 65 72  Filename(zConver
227c0 74 65 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ted);.          
227d0 69 66 28 20 21 7a 55 74 66 38 20 29 7b 0a 20 20  if( !zUtf8 ){.  
227e0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
227f0 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
22800 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  d);.            
22810 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75  sqlite3_free(zBu
22820 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  f);.            
22830 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46  OSTRACE(("TEMP-F
22840 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54  ILENAME rc=SQLIT
22850 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22  E_IOERR_NOMEM\n"
22860 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ));.            
22870 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
22880 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ERR_NOMEM;.     
22890 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
228a0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
228b0 66 28 6e 4d 61 78 2c 20 7a 42 75 66 2c 20 22 25  f(nMax, zBuf, "%
228c0 73 22 2c 20 7a 55 74 66 38 29 3b 0a 20 20 20 20  s", zUtf8);.    
228d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
228e0 65 65 28 7a 55 74 66 38 29 3b 0a 20 20 20 20 20  ee(zUtf8);.     
228f0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
22900 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
22910 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
22920 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
22930 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
22940 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
22950 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65    }.    }.  }.#e
22960 6c 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  lif !SQLITE_OS_W
22970 49 4e 52 54 20 26 26 20 21 64 65 66 69 6e 65 64  INRT && !defined
22980 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20 65  (__CYGWIN__).  e
22990 6c 73 65 20 69 66 28 20 6f 73 49 73 4e 54 28 29  lse if( osIsNT()
229a0 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d   ){.    char *zM
229b0 75 6c 74 69 3b 0a 20 20 20 20 4c 50 57 53 54 52  ulti;.    LPWSTR
229c0 20 7a 57 69 64 65 50 61 74 68 20 3d 20 73 71 6c   zWidePath = sql
229d0 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20  ite3MallocZero( 
229e0 6e 4d 61 78 2a 73 69 7a 65 6f 66 28 57 43 48 41  nMax*sizeof(WCHA
229f0 52 29 20 29 3b 0a 20 20 20 20 69 66 28 20 21 7a  R) );.    if( !z
22a00 57 69 64 65 50 61 74 68 20 29 7b 0a 20 20 20 20  WidePath ){.    
22a10 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
22a20 42 75 66 29 3b 0a 20 20 20 20 20 20 4f 53 54 52  Buf);.      OSTR
22a30 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e  ACE(("TEMP-FILEN
22a40 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f  AME rc=SQLITE_IO
22a50 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a  ERR_NOMEM\n"));.
22a60 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
22a70 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b  ITE_IOERR_NOMEM;
22a80 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f  .    }.    if( o
22a90 73 47 65 74 54 65 6d 70 50 61 74 68 57 28 6e 4d  sGetTempPathW(nM
22aa0 61 78 2c 20 7a 57 69 64 65 50 61 74 68 29 3d 3d  ax, zWidePath)==
22ab0 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
22ac0 65 33 5f 66 72 65 65 28 7a 57 69 64 65 50 61 74  e3_free(zWidePat
22ad0 68 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  h);.      sqlite
22ae0 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20  3_free(zBuf);.  
22af0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45      OSTRACE(("TE
22b00 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53  MP-FILENAME rc=S
22b10 51 4c 49 54 45 5f 49 4f 45 52 52 5f 47 45 54 54  QLITE_IOERR_GETT
22b20 45 4d 50 50 41 54 48 5c 6e 22 29 29 3b 0a 20 20  EMPPATH\n"));.  
22b30 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f      return winLo
22b40 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
22b50 45 52 52 5f 47 45 54 54 45 4d 50 50 41 54 48 2c  ERR_GETTEMPPATH,
22b60 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
22b70 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
22b80 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
22b90 47 65 74 54 65 6d 70 6e 61 6d 65 32 22 2c 20 30  GetTempname2", 0
22ba0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4d 75  );.    }.    zMu
22bb0 6c 74 69 20 3d 20 77 69 6e 55 6e 69 63 6f 64 65  lti = winUnicode
22bc0 54 6f 55 74 66 38 28 7a 57 69 64 65 50 61 74 68  ToUtf8(zWidePath
22bd0 29 3b 0a 20 20 20 20 69 66 28 20 7a 4d 75 6c 74  );.    if( zMult
22be0 69 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  i ){.      sqlit
22bf0 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4d 61 78  e3_snprintf(nMax
22c00 2c 20 7a 42 75 66 2c 20 22 25 73 22 2c 20 7a 4d  , zBuf, "%s", zM
22c10 75 6c 74 69 29 3b 0a 20 20 20 20 20 20 73 71 6c  ulti);.      sql
22c20 69 74 65 33 5f 66 72 65 65 28 7a 4d 75 6c 74 69  ite3_free(zMulti
22c30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
22c40 5f 66 72 65 65 28 7a 57 69 64 65 50 61 74 68 29  _free(zWidePath)
22c50 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
22c60 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
22c70 7a 57 69 64 65 50 61 74 68 29 3b 0a 20 20 20 20  zWidePath);.    
22c80 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
22c90 42 75 66 29 3b 0a 20 20 20 20 20 20 4f 53 54 52  Buf);.      OSTR
22ca0 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e  ACE(("TEMP-FILEN
22cb0 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f  AME rc=SQLITE_IO
22cc0 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a  ERR_NOMEM\n"));.
22cd0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
22ce0 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b  ITE_IOERR_NOMEM;
22cf0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66 64 65  .    }.  }.#ifde
22d00 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  f SQLITE_WIN32_H
22d10 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a  AS_ANSI.  else{.
22d20 20 20 20 20 63 68 61 72 20 2a 7a 55 74 66 38 3b      char *zUtf8;
22d30 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 62 63 73  .    char *zMbcs
22d40 50 61 74 68 20 3d 20 73 71 6c 69 74 65 33 4d 61  Path = sqlite3Ma
22d50 6c 6c 6f 63 5a 65 72 6f 28 20 6e 4d 61 78 20 29  llocZero( nMax )
22d60 3b 0a 20 20 20 20 69 66 28 20 21 7a 4d 62 63 73  ;.    if( !zMbcs
22d70 50 61 74 68 20 29 7b 0a 20 20 20 20 20 20 73 71  Path ){.      sq
22d80 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29  lite3_free(zBuf)
22d90 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  ;.      OSTRACE(
22da0 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20  ("TEMP-FILENAME 
22db0 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rc=SQLITE_IOERR_
22dc0 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20  NOMEM\n"));.    
22dd0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
22de0 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  IOERR_NOMEM;.   
22df0 20 7d 0a 20 20 20 20 69 66 28 20 6f 73 47 65 74   }.    if( osGet
22e00 54 65 6d 70 50 61 74 68 41 28 6e 4d 61 78 2c 20  TempPathA(nMax, 
22e10 7a 4d 62 63 73 50 61 74 68 29 3d 3d 30 20 29 7b  zMbcsPath)==0 ){
22e20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
22e30 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20  ree(zBuf);.     
22e40 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d   OSTRACE(("TEMP-
22e50 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49  FILENAME rc=SQLI
22e60 54 45 5f 49 4f 45 52 52 5f 47 45 54 54 45 4d 50  TE_IOERR_GETTEMP
22e70 50 41 54 48 5c 6e 22 29 29 3b 0a 20 20 20 20 20  PATH\n"));.     
22e80 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72   return winLogEr
22e90 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
22ea0 5f 47 45 54 54 45 4d 50 50 41 54 48 2c 20 6f 73  _GETTEMPPATH, os
22eb0 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a  GetLastError(),.
22ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ed0 20 20 20 20 20 20 20 20 20 22 77 69 6e 47 65 74           "winGet
22ee0 54 65 6d 70 6e 61 6d 65 33 22 2c 20 30 29 3b 0a  Tempname3", 0);.
22ef0 20 20 20 20 7d 0a 20 20 20 20 7a 55 74 66 38 20      }.    zUtf8 
22f00 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  = sqlite3_win32_
22f10 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28 7a 4d 62  mbcs_to_utf8(zMb
22f20 63 73 50 61 74 68 29 3b 0a 20 20 20 20 69 66 28  csPath);.    if(
22f30 20 7a 55 74 66 38 20 29 7b 0a 20 20 20 20 20 20   zUtf8 ){.      
22f40 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
22f50 28 6e 4d 61 78 2c 20 7a 42 75 66 2c 20 22 25 73  (nMax, zBuf, "%s
22f60 22 2c 20 7a 55 74 66 38 29 3b 0a 20 20 20 20 20  ", zUtf8);.     
22f70 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 55   sqlite3_free(zU
22f80 74 66 38 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  tf8);.    }else{
22f90 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
22fa0 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20  ree(zBuf);.     
22fb0 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d   OSTRACE(("TEMP-
22fc0 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49  FILENAME rc=SQLI
22fd0 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e  TE_IOERR_NOMEM\n
22fe0 22 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  "));.      retur
22ff0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  n SQLITE_IOERR_N
23000 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  OMEM;.    }.  }.
23010 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
23020 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 20  _WIN32_HAS_ANSI 
23030 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51  */.#endif /* !SQ
23040 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 2a 2f  LITE_OS_WINRT */
23050 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43 68 65 63  ..  /*.  ** Chec
23060 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  k to make sure t
23070 68 65 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72  he temporary dir
23080 65 63 74 6f 72 79 20 65 6e 64 73 20 77 69 74 68  ectory ends with
23090 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 0a   an appropriate.
230a0 20 20 2a 2a 20 73 65 70 61 72 61 74 6f 72 2e 20    ** separator. 
230b0 20 49 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20   If it does not 
230c0 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f 74  and there is not
230d0 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20 6c 65   enough space le
230e0 66 74 20 74 6f 20 61 64 64 0a 20 20 2a 2a 20 6f  ft to add.  ** o
230f0 6e 65 2c 20 66 61 69 6c 2e 0a 20 20 2a 2f 0a 20  ne, fail..  */. 
23100 20 69 66 28 20 21 77 69 6e 4d 61 6b 65 45 6e 64   if( !winMakeEnd
23110 49 6e 44 69 72 53 65 70 28 6e 44 69 72 2b 31 2c  InDirSep(nDir+1,
23120 20 7a 42 75 66 29 20 29 7b 0a 20 20 20 20 73 71   zBuf) ){.    sq
23130 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29  lite3_free(zBuf)
23140 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  ;.    OSTRACE(("
23150 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63  TEMP-FILENAME rc
23160 3d 53 51 4c 49 54 45 5f 45 52 52 4f 52 5c 6e 22  =SQLITE_ERROR\n"
23170 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 77  ));.    return w
23180 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
23190 45 5f 45 52 52 4f 52 2c 20 30 2c 20 22 77 69 6e  E_ERROR, 0, "win
231a0 47 65 74 54 65 6d 70 6e 61 6d 65 34 22 2c 20 30  GetTempname4", 0
231b0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  );.  }..  /*.  *
231c0 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65  * Check that the
231d0 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 69   output buffer i
231e0 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 66  s large enough f
231f0 6f 72 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  or the temporary
23200 20 66 69 6c 65 0a 20 20 2a 2a 20 6e 61 6d 65 20   file.  ** name 
23210 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  in the following
23220 20 66 6f 72 6d 61 74 3a 0a 20 20 2a 2a 0a 20 20   format:.  **.  
23230 2a 2a 20 20 20 22 3c 74 65 6d 70 6f 72 61 72 79  **   "<temporary
23240 5f 64 69 72 65 63 74 6f 72 79 3e 2f 65 74 69 6c  _directory>/etil
23250 71 73 5f 58 58 58 58 58 58 58 58 58 58 58 58 58  qs_XXXXXXXXXXXXX
23260 58 58 5c 30 5c 30 22 0a 20 20 2a 2a 0a 20 20 2a  XX\0\0".  **.  *
23270 2a 20 49 66 20 6e 6f 74 2c 20 72 65 74 75 72 6e  * If not, return
23280 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 20 20   SQLITE_ERROR.  
23290 54 68 65 20 6e 75 6d 62 65 72 20 31 37 20 69 73  The number 17 is
232a0 20 75 73 65 64 20 68 65 72 65 20 69 6e 20 6f 72   used here in or
232b0 64 65 72 20 74 6f 0a 20 20 2a 2a 20 61 63 63 6f  der to.  ** acco
232c0 75 6e 74 20 66 6f 72 20 74 68 65 20 73 70 61 63  unt for the spac
232d0 65 20 75 73 65 64 20 62 79 20 74 68 65 20 31 35  e used by the 15
232e0 20 63 68 61 72 61 63 74 65 72 20 72 61 6e 64 6f   character rando
232f0 6d 20 73 75 66 66 69 78 20 61 6e 64 20 74 68 65  m suffix and the
23300 0a 20 20 2a 2a 20 74 77 6f 20 74 72 61 69 6c 69  .  ** two traili
23310 6e 67 20 4e 55 4c 20 63 68 61 72 61 63 74 65 72  ng NUL character
23320 73 2e 20 20 54 68 65 20 66 69 6e 61 6c 20 64 69  s.  The final di
23330 72 65 63 74 6f 72 79 20 73 65 70 61 72 61 74 6f  rectory separato
23340 72 20 63 68 61 72 61 63 74 65 72 0a 20 20 2a 2a  r character.  **
23350 20 68 61 73 20 61 6c 72 65 61 64 79 20 61 64 64   has already add
23360 65 64 20 69 66 20 69 74 20 77 61 73 20 6e 6f 74  ed if it was not
23370 20 61 6c 72 65 61 64 79 20 70 72 65 73 65 6e 74   already present
23380 2e 0a 20 20 2a 2f 0a 20 20 6e 4c 65 6e 20 3d 20  ..  */.  nLen = 
23390 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
233a0 7a 42 75 66 29 3b 0a 20 20 69 66 28 20 28 6e 4c  zBuf);.  if( (nL
233b0 65 6e 20 2b 20 6e 50 72 65 20 2b 20 31 37 29 20  en + nPre + 17) 
233c0 3e 20 6e 42 75 66 20 29 7b 0a 20 20 20 20 73 71  > nBuf ){.    sq
233d0 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29  lite3_free(zBuf)
233e0 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  ;.    OSTRACE(("
233f0 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63  TEMP-FILENAME rc
23400 3d 53 51 4c 49 54 45 5f 45 52 52 4f 52 5c 6e 22  =SQLITE_ERROR\n"
23410 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 77  ));.    return w
23420 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
23430 45 5f 45 52 52 4f 52 2c 20 30 2c 20 22 77 69 6e  E_ERROR, 0, "win
23440 47 65 74 54 65 6d 70 6e 61 6d 65 35 22 2c 20 30  GetTempname5", 0
23450 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65  );.  }..  sqlite
23460 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2d  3_snprintf(nBuf-
23470 31 36 2d 6e 4c 65 6e 2c 20 7a 42 75 66 2b 6e 4c  16-nLen, zBuf+nL
23480 65 6e 2c 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f  en, SQLITE_TEMP_
23490 46 49 4c 45 5f 50 52 45 46 49 58 29 3b 0a 0a 20  FILE_PREFIX);.. 
234a0 20 6a 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c   j = sqlite3Strl
234b0 65 6e 33 30 28 7a 42 75 66 29 3b 0a 20 20 73 71  en30(zBuf);.  sq
234c0 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73  lite3_randomness
234d0 28 31 35 2c 20 26 7a 42 75 66 5b 6a 5d 29 3b 0a  (15, &zBuf[j]);.
234e0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31 35 3b    for(i=0; i<15;
234f0 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20   i++, j++){.    
23500 7a 42 75 66 5b 6a 5d 20 3d 20 28 63 68 61 72 29  zBuf[j] = (char)
23510 7a 43 68 61 72 73 5b 20 28 28 75 6e 73 69 67 6e  zChars[ ((unsign
23520 65 64 20 63 68 61 72 29 7a 42 75 66 5b 6a 5d 29  ed char)zBuf[j])
23530 25 28 73 69 7a 65 6f 66 28 7a 43 68 61 72 73 29  %(sizeof(zChars)
23540 2d 31 29 20 5d 3b 0a 20 20 7d 0a 20 20 7a 42 75  -1) ];.  }.  zBu
23550 66 5b 6a 5d 20 3d 20 30 3b 0a 20 20 7a 42 75 66  f[j] = 0;.  zBuf
23560 5b 6a 2b 31 5d 20 3d 20 30 3b 0a 20 20 2a 70 7a  [j+1] = 0;.  *pz
23570 42 75 66 20 3d 20 7a 42 75 66 3b 0a 0a 20 20 4f  Buf = zBuf;..  O
23580 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49  STRACE(("TEMP-FI
23590 4c 45 4e 41 4d 45 20 6e 61 6d 65 3d 25 73 2c 20  LENAME name=%s, 
235a0 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c  rc=SQLITE_OK\n",
235b0 20 7a 42 75 66 29 29 3b 0a 20 20 72 65 74 75 72   zBuf));.  retur
235c0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
235d0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
235e0 45 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 66  E if the named f
235f0 69 6c 65 20 69 73 20 72 65 61 6c 6c 79 20 61 20  ile is really a 
23600 64 69 72 65 63 74 6f 72 79 2e 20 20 52 65 74 75  directory.  Retu
23610 72 6e 20 66 61 6c 73 65 20 69 66 0a 2a 2a 20 69  rn false if.** i
23620 74 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 6f  t is something o
23630 74 68 65 72 20 74 68 61 6e 20 61 20 64 69 72 65  ther than a dire
23640 63 74 6f 72 79 2c 20 6f 72 20 69 66 20 74 68 65  ctory, or if the
23650 72 65 20 69 73 20 61 6e 79 20 6b 69 6e 64 20 6f  re is any kind o
23660 66 20 6d 65 6d 6f 72 79 0a 2a 2a 20 61 6c 6c 6f  f memory.** allo
23670 63 61 74 69 6f 6e 20 66 61 69 6c 75 72 65 2e 0a  cation failure..
23680 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
23690 6e 49 73 44 69 72 28 63 6f 6e 73 74 20 76 6f 69  nIsDir(const voi
236a0 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 29 7b 0a  d *zConverted){.
236b0 20 20 44 57 4f 52 44 20 61 74 74 72 3b 0a 20 20    DWORD attr;.  
236c0 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 44 57  int rc = 0;.  DW
236d0 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 0a  ORD lastErrno;..
236e0 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29    if( osIsNT() )
236f0 7b 0a 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20  {.    int cnt = 
23700 30 3b 0a 20 20 20 20 57 49 4e 33 32 5f 46 49 4c  0;.    WIN32_FIL
23710 45 5f 41 54 54 52 49 42 55 54 45 5f 44 41 54 41  E_ATTRIBUTE_DATA
23720 20 73 41 74 74 72 44 61 74 61 3b 0a 20 20 20 20   sAttrData;.    
23730 6d 65 6d 73 65 74 28 26 73 41 74 74 72 44 61 74  memset(&sAttrDat
23740 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 41 74  a, 0, sizeof(sAt
23750 74 72 44 61 74 61 29 29 3b 0a 20 20 20 20 77 68  trData));.    wh
23760 69 6c 65 28 20 21 28 72 63 20 3d 20 6f 73 47 65  ile( !(rc = osGe
23770 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 45  tFileAttributesE
23780 78 57 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e  xW((LPCWSTR)zCon
23790 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20  verted,.        
237a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
237b0 20 20 20 20 20 47 65 74 46 69 6c 65 45 78 49 6e       GetFileExIn
237c0 66 6f 53 74 61 6e 64 61 72 64 2c 0a 20 20 20 20  foStandard,.    
237d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
237e0 20 20 20 20 20 20 20 20 20 26 73 41 74 74 72 44           &sAttrD
237f0 61 74 61 29 29 20 26 26 20 77 69 6e 52 65 74 72  ata)) && winRetr
23800 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c 61  yIoerr(&cnt, &la
23810 73 74 45 72 72 6e 6f 29 20 29 7b 7d 0a 20 20 20  stErrno) ){}.   
23820 20 69 66 28 20 21 72 63 20 29 7b 0a 20 20 20 20   if( !rc ){.    
23830 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 49    return 0; /* I
23840 6e 76 61 6c 69 64 20 6e 61 6d 65 3f 20 2a 2f 0a  nvalid name? */.
23850 20 20 20 20 7d 0a 20 20 20 20 61 74 74 72 20 3d      }.    attr =
23860 20 73 41 74 74 72 44 61 74 61 2e 64 77 46 69 6c   sAttrData.dwFil
23870 65 41 74 74 72 69 62 75 74 65 73 3b 0a 23 69 66  eAttributes;.#if
23880 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
23890 3d 3d 30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ==0.  }else{.   
238a0 20 61 74 74 72 20 3d 20 6f 73 47 65 74 46 69 6c   attr = osGetFil
238b0 65 41 74 74 72 69 62 75 74 65 73 41 28 28 63 68  eAttributesA((ch
238c0 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ar*)zConverted);
238d0 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 72 65  .#endif.  }.  re
238e0 74 75 72 6e 20 28 61 74 74 72 21 3d 49 4e 56 41  turn (attr!=INVA
238f0 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55  LID_FILE_ATTRIBU
23900 54 45 53 29 20 26 26 20 28 61 74 74 72 26 46 49  TES) && (attr&FI
23910 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 44 49 52  LE_ATTRIBUTE_DIR
23920 45 43 54 4f 52 59 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ECTORY);.}../*.*
23930 2a 20 4f 70 65 6e 20 61 20 66 69 6c 65 2e 0a 2a  * Open a file..*
23940 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
23950 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f  Open(.  sqlite3_
23960 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20  vfs *pVfs,      
23970 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 67 65 74    /* Used to get
23980 20 6d 61 78 69 6d 75 6d 20 70 61 74 68 20 6e 61   maximum path na
23990 6d 65 20 6c 65 6e 67 74 68 20 2a 2f 0a 20 20 63  me length */.  c
239a0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
239b0 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  ,        /* Name
239c0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 28 55 54   of the file (UT
239d0 46 2d 38 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65  F-8) */.  sqlite
239e0 33 5f 66 69 6c 65 20 2a 69 64 2c 20 20 20 20 20  3_file *id,     
239f0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
23a00 20 53 51 4c 69 74 65 20 66 69 6c 65 20 68 61 6e   SQLite file han
23a10 64 6c 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  dle here */.  in
23a20 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20  t flags,        
23a30 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20          /* Open 
23a40 6d 6f 64 65 20 66 6c 61 67 73 20 2a 2f 0a 20 20  mode flags */.  
23a50 69 6e 74 20 2a 70 4f 75 74 46 6c 61 67 73 20 20  int *pOutFlags  
23a60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61            /* Sta
23a70 74 75 73 20 72 65 74 75 72 6e 20 66 6c 61 67 73  tus return flags
23a80 20 2a 2f 0a 29 7b 0a 20 20 48 41 4e 44 4c 45 20   */.){.  HANDLE 
23a90 68 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45  h;.  DWORD lastE
23aa0 72 72 6e 6f 20 3d 20 30 3b 0a 20 20 44 57 4f 52  rrno = 0;.  DWOR
23ab0 44 20 64 77 44 65 73 69 72 65 64 41 63 63 65 73  D dwDesiredAcces
23ac0 73 3b 0a 20 20 44 57 4f 52 44 20 64 77 53 68 61  s;.  DWORD dwSha
23ad0 72 65 4d 6f 64 65 3b 0a 20 20 44 57 4f 52 44 20  reMode;.  DWORD 
23ae0 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73  dwCreationDispos
23af0 69 74 69 6f 6e 3b 0a 20 20 44 57 4f 52 44 20 64  ition;.  DWORD d
23b00 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75  wFlagsAndAttribu
23b10 74 65 73 20 3d 20 30 3b 0a 23 69 66 20 53 51 4c  tes = 0;.#if SQL
23b20 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 69  ITE_OS_WINCE.  i
23b30 6e 74 20 69 73 54 65 6d 70 20 3d 20 30 3b 0a 23  nt isTemp = 0;.#
23b40 65 6e 64 69 66 0a 20 20 77 69 6e 46 69 6c 65 20  endif.  winFile 
23b50 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c  *pFile = (winFil
23b60 65 2a 29 69 64 3b 0a 20 20 76 6f 69 64 20 2a 7a  e*)id;.  void *z
23b70 43 6f 6e 76 65 72 74 65 64 3b 20 20 20 20 20 20  Converted;      
23b80 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 6e          /* Filen
23b90 61 6d 65 20 69 6e 20 4f 53 20 65 6e 63 6f 64 69  ame in OS encodi
23ba0 6e 67 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ng */.  const ch
23bb0 61 72 20 2a 7a 55 74 66 38 4e 61 6d 65 20 3d 20  ar *zUtf8Name = 
23bc0 7a 4e 61 6d 65 3b 20 2f 2a 20 46 69 6c 65 6e 61  zName; /* Filena
23bd0 6d 65 20 69 6e 20 55 54 46 2d 38 20 65 6e 63 6f  me in UTF-8 enco
23be0 64 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 63 6e  ding */.  int cn
23bf0 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20  t = 0;..  /* If 
23c00 61 72 67 75 6d 65 6e 74 20 7a 50 61 74 68 20 69  argument zPath i
23c10 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  s a NULL pointer
23c20 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
23c30 69 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 6f  is required to o
23c40 70 65 6e 0a 20 20 2a 2a 20 61 20 74 65 6d 70 6f  pen.  ** a tempo
23c50 72 61 72 79 20 66 69 6c 65 2e 20 55 73 65 20 74  rary file. Use t
23c60 68 69 73 20 62 75 66 66 65 72 20 74 6f 20 73 74  his buffer to st
23c70 6f 72 65 20 74 68 65 20 66 69 6c 65 20 6e 61 6d  ore the file nam
23c80 65 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 63 68 61  e in..  */.  cha
23c90 72 20 2a 7a 54 6d 70 6e 61 6d 65 20 3d 20 30 3b  r *zTmpname = 0;
23ca0 20 2f 2a 20 46 6f 72 20 74 65 6d 70 6f 72 61 72   /* For temporar
23cb0 79 20 66 69 6c 65 6e 61 6d 65 2c 20 69 66 20 6e  y filename, if n
23cc0 65 63 65 73 73 61 72 79 2e 20 2a 2f 0a 0a 20 20  ecessary. */..  
23cd0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
23ce0 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  OK;            /
23cf0 2a 20 46 75 6e 63 74 69 6f 6e 20 52 65 74 75 72  * Function Retur
23d00 6e 20 43 6f 64 65 20 2a 2f 0a 23 69 66 20 21 64  n Code */.#if !d
23d10 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 7c  efined(NDEBUG) |
23d20 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  | SQLITE_OS_WINC
23d30 45 0a 20 20 69 6e 74 20 65 54 79 70 65 20 3d 20  E.  int eType = 
23d40 66 6c 61 67 73 26 30 78 46 46 46 46 46 46 30 30  flags&0xFFFFFF00
23d50 3b 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 66 69  ;  /* Type of fi
23d60 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 23 65  le to open */.#e
23d70 6e 64 69 66 0a 0a 20 20 69 6e 74 20 69 73 45 78  ndif..  int isEx
23d80 63 6c 75 73 69 76 65 20 20 3d 20 28 66 6c 61 67  clusive  = (flag
23d90 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
23da0 45 58 43 4c 55 53 49 56 45 29 3b 0a 20 20 69 6e  EXCLUSIVE);.  in
23db0 74 20 69 73 44 65 6c 65 74 65 20 20 20 20 20 3d  t isDelete     =
23dc0 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
23dd0 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c  _OPEN_DELETEONCL
23de0 4f 53 45 29 3b 0a 20 20 69 6e 74 20 69 73 43 72  OSE);.  int isCr
23df0 65 61 74 65 20 20 20 20 20 3d 20 28 66 6c 61 67  eate     = (flag
23e00 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
23e10 43 52 45 41 54 45 29 3b 0a 20 20 69 6e 74 20 69  CREATE);.  int i
23e20 73 52 65 61 64 6f 6e 6c 79 20 20 20 3d 20 28 66  sReadonly   = (f
23e30 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
23e40 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20  EN_READONLY);.  
23e50 69 6e 74 20 69 73 52 65 61 64 57 72 69 74 65 20  int isReadWrite 
23e60 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49   = (flags & SQLI
23e70 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
23e80 45 29 3b 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45  E);..#ifndef NDE
23e90 42 55 47 0a 20 20 69 6e 74 20 69 73 4f 70 65 6e  BUG.  int isOpen
23ea0 4a 6f 75 72 6e 61 6c 20 3d 20 28 69 73 43 72 65  Journal = (isCre
23eb0 61 74 65 20 26 26 20 28 0a 20 20 20 20 20 20 20  ate && (.       
23ec0 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
23ed0 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e  PEN_MASTER_JOURN
23ee0 41 4c 0a 20 20 20 20 20 7c 7c 20 65 54 79 70 65  AL.     || eType
23ef0 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  ==SQLITE_OPEN_MA
23f00 49 4e 5f 4a 4f 55 52 4e 41 4c 0a 20 20 20 20 20  IN_JOURNAL.     
23f10 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
23f20 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 29 3b 0a  _OPEN_WAL.  ));.
23f30 23 65 6e 64 69 66 0a 0a 20 20 4f 53 54 52 41 43  #endif..  OSTRAC
23f40 45 28 28 22 4f 50 45 4e 20 6e 61 6d 65 3d 25 73  E(("OPEN name=%s
23f50 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66 6c 61 67  , pFile=%p, flag
23f60 73 3d 25 78 2c 20 70 4f 75 74 46 6c 61 67 73 3d  s=%x, pOutFlags=
23f70 25 70 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %p\n",.         
23f80 20 20 7a 55 74 66 38 4e 61 6d 65 2c 20 69 64 2c    zUtf8Name, id,
23f90 20 66 6c 61 67 73 2c 20 70 4f 75 74 46 6c 61 67   flags, pOutFlag
23fa0 73 29 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  s));..  /* Check
23fb0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
23fc0 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20 74 72  tatements are tr
23fd0 75 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ue:.  **.  **   
23fe0 28 61 29 20 45 78 61 63 74 6c 79 20 6f 6e 65 20  (a) Exactly one 
23ff0 6f 66 20 74 68 65 20 52 45 41 44 57 52 49 54 45  of the READWRITE
24000 20 61 6e 64 20 52 45 41 44 4f 4e 4c 59 20 66 6c   and READONLY fl
24010 61 67 73 20 6d 75 73 74 20 62 65 20 73 65 74 2c  ags must be set,
24020 20 61 6e 64 0a 20 20 2a 2a 20 20 20 28 62 29 20   and.  **   (b) 
24030 69 66 20 43 52 45 41 54 45 20 69 73 20 73 65 74  if CREATE is set
24040 2c 20 74 68 65 6e 20 52 45 41 44 57 52 49 54 45  , then READWRITE
24050 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65   must also be se
24060 74 2c 20 61 6e 64 0a 20 20 2a 2a 20 20 20 28 63  t, and.  **   (c
24070 29 20 69 66 20 45 58 43 4c 55 53 49 56 45 20 69  ) if EXCLUSIVE i
24080 73 20 73 65 74 2c 20 74 68 65 6e 20 43 52 45 41  s set, then CREA
24090 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20  TE must also be 
240a0 73 65 74 2e 0a 20 20 2a 2a 20 20 20 28 64 29 20  set..  **   (d) 
240b0 69 66 20 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  if DELETEONCLOSE
240c0 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 43 52   is set, then CR
240d0 45 41 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62  EATE must also b
240e0 65 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73  e set..  */.  as
240f0 73 65 72 74 28 28 69 73 52 65 61 64 6f 6e 6c 79  sert((isReadonly
24100 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57 72 69  ==0 || isReadWri
24110 74 65 3d 3d 30 29 20 26 26 20 28 69 73 52 65 61  te==0) && (isRea
24120 64 57 72 69 74 65 20 7c 7c 20 69 73 52 65 61 64  dWrite || isRead
24130 6f 6e 6c 79 29 29 3b 0a 20 20 61 73 73 65 72 74  only));.  assert
24140 28 69 73 43 72 65 61 74 65 3d 3d 30 20 7c 7c 20  (isCreate==0 || 
24150 69 73 52 65 61 64 57 72 69 74 65 29 3b 0a 20 20  isReadWrite);.  
24160 61 73 73 65 72 74 28 69 73 45 78 63 6c 75 73 69  assert(isExclusi
24170 76 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61 74  ve==0 || isCreat
24180 65 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73 44  e);.  assert(isD
24190 65 6c 65 74 65 3d 3d 30 20 7c 7c 20 69 73 43 72  elete==0 || isCr
241a0 65 61 74 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  eate);..  /* The
241b0 20 6d 61 69 6e 20 44 42 2c 20 6d 61 69 6e 20 6a   main DB, main j
241c0 6f 75 72 6e 61 6c 2c 20 57 41 4c 20 66 69 6c 65  ournal, WAL file
241d0 20 61 6e 64 20 6d 61 73 74 65 72 20 6a 6f 75 72   and master jour
241e0 6e 61 6c 20 61 72 65 20 6e 65 76 65 72 0a 20 20  nal are never.  
241f0 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ** automatically
24200 20 64 65 6c 65 74 65 64 2e 20 4e 6f 72 20 61 72   deleted. Nor ar
24210 65 20 74 68 65 79 20 65 76 65 72 20 74 65 6d 70  e they ever temp
24220 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 20 2a 2f  orary files.  */
24230 0a 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44  .  assert( (!isD
24240 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20  elete && zName) 
24250 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45  || eType!=SQLITE
24260 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 3b  _OPEN_MAIN_DB );
24270 0a 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44  .  assert( (!isD
24280 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20  elete && zName) 
24290 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45  || eType!=SQLITE
242a0 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
242b0 41 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  AL );.  assert( 
242c0 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e  (!isDelete && zN
242d0 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53  ame) || eType!=S
242e0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45  QLITE_OPEN_MASTE
242f0 52 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 61  R_JOURNAL );.  a
24300 73 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74  ssert( (!isDelet
24310 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65  e && zName) || e
24320 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45  Type!=SQLITE_OPE
24330 4e 5f 57 41 4c 20 29 3b 0a 0a 20 20 2f 2a 20 41  N_WAL );..  /* A
24340 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20 75  ssert that the u
24350 70 70 65 72 20 6c 61 79 65 72 20 68 61 73 20 73  pper layer has s
24360 65 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 22 66  et one of the "f
24370 69 6c 65 2d 74 79 70 65 22 20 66 6c 61 67 73 2e  ile-type" flags.
24380 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 65 54   */.  assert( eT
24390 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
243a0 5f 4d 41 49 4e 5f 44 42 20 20 20 20 20 20 7c 7c  _MAIN_DB      ||
243b0 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
243c0 50 45 4e 5f 54 45 4d 50 5f 44 42 0a 20 20 20 20  PEN_TEMP_DB.    
243d0 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c     || eType==SQL
243e0 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
243f0 55 52 4e 41 4c 20 7c 7c 20 65 54 79 70 65 3d 3d  URNAL || eType==
24400 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
24410 5f 4a 4f 55 52 4e 41 4c 0a 20 20 20 20 20 20 20  _JOURNAL.       
24420 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
24430 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c  _OPEN_SUBJOURNAL
24440 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c     || eType==SQL
24450 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f  ITE_OPEN_MASTER_
24460 4a 4f 55 52 4e 41 4c 0a 20 20 20 20 20 20 20 7c  JOURNAL.       |
24470 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
24480 4f 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44  OPEN_TRANSIENT_D
24490 42 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49  B || eType==SQLI
244a0 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 3b  TE_OPEN_WAL.  );
244b0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ..  assert( pFil
244c0 65 21 3d 30 20 29 3b 0a 20 20 6d 65 6d 73 65 74  e!=0 );.  memset
244d0 28 70 46 69 6c 65 2c 20 30 2c 20 73 69 7a 65 6f  (pFile, 0, sizeo
244e0 66 28 77 69 6e 46 69 6c 65 29 29 3b 0a 20 20 70  f(winFile));.  p
244f0 46 69 6c 65 2d 3e 68 20 3d 20 49 4e 56 41 4c 49  File->h = INVALI
24500 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 3b 0a  D_HANDLE_VALUE;.
24510 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
24520 49 4e 52 54 0a 20 20 69 66 28 20 21 7a 55 74 66  INRT.  if( !zUtf
24530 38 4e 61 6d 65 20 26 26 20 21 73 71 6c 69 74 65  8Name && !sqlite
24540 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79  3_temp_directory
24550 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
24560 6c 6f 67 28 53 51 4c 49 54 45 5f 45 52 52 4f 52  log(SQLITE_ERROR
24570 2c 0a 20 20 20 20 20 20 20 20 22 73 71 6c 69 74  ,.        "sqlit
24580 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72  e3_temp_director
24590 79 20 76 61 72 69 61 62 6c 65 20 73 68 6f 75 6c  y variable shoul
245a0 64 20 62 65 20 73 65 74 20 66 6f 72 20 57 69 6e  d be set for Win
245b0 52 54 22 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  RT");.  }.#endif
245c0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73 65  ..  /* If the se
245d0 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f  cond argument to
245e0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
245f0 73 20 4e 55 4c 4c 2c 20 67 65 6e 65 72 61 74 65  s NULL, generate
24600 20 61 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72   a.  ** temporar
24610 79 20 66 69 6c 65 20 6e 61 6d 65 20 74 6f 20 75  y file name to u
24620 73 65 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 7a  se.  */.  if( !z
24630 55 74 66 38 4e 61 6d 65 20 29 7b 0a 20 20 20 20  Utf8Name ){.    
24640 61 73 73 65 72 74 28 20 69 73 44 65 6c 65 74 65  assert( isDelete
24650 20 26 26 20 21 69 73 4f 70 65 6e 4a 6f 75 72 6e   && !isOpenJourn
24660 61 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 77  al );.    rc = w
24670 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65 28 70 56  inGetTempname(pV
24680 66 73 2c 20 26 7a 54 6d 70 6e 61 6d 65 29 3b 0a  fs, &zTmpname);.
24690 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
246a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 4f  TE_OK ){.      O
246b0 53 54 52 41 43 45 28 28 22 4f 50 45 4e 20 6e 61  STRACE(("OPEN na
246c0 6d 65 3d 25 73 2c 20 72 63 3d 25 73 22 2c 20 7a  me=%s, rc=%s", z
246d0 55 74 66 38 4e 61 6d 65 2c 20 73 71 6c 69 74 65  Utf8Name, sqlite
246e0 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a  3ErrName(rc)));.
246f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
24700 0a 20 20 20 20 7d 0a 20 20 20 20 7a 55 74 66 38  .    }.    zUtf8
24710 4e 61 6d 65 20 3d 20 7a 54 6d 70 6e 61 6d 65 3b  Name = zTmpname;
24720 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 61 74 61 62  .  }..  /* Datab
24730 61 73 65 20 66 69 6c 65 6e 61 6d 65 73 20 61 72  ase filenames ar
24740 65 20 64 6f 75 62 6c 65 2d 7a 65 72 6f 20 74 65  e double-zero te
24750 72 6d 69 6e 61 74 65 64 20 69 66 20 74 68 65 79  rminated if they
24760 20 61 72 65 20 6e 6f 74 0a 20 20 2a 2a 20 55 52   are not.  ** UR
24770 49 73 20 77 69 74 68 20 70 61 72 61 6d 65 74 65  Is with paramete
24780 72 73 2e 20 20 48 65 6e 63 65 2c 20 74 68 65 79  rs.  Hence, they
24790 20 63 61 6e 20 61 6c 77 61 79 73 20 62 65 20 70   can always be p
247a0 61 73 73 65 64 20 69 6e 74 6f 0a 20 20 2a 2a 20  assed into.  ** 
247b0 73 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61  sqlite3_uri_para
247c0 6d 65 74 65 72 28 29 2e 0a 20 20 2a 2f 0a 20 20  meter()..  */.  
247d0 61 73 73 65 72 74 28 20 28 65 54 79 70 65 21 3d  assert( (eType!=
247e0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
247f0 5f 44 42 29 20 7c 7c 20 28 66 6c 61 67 73 20 26  _DB) || (flags &
24800 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49   SQLITE_OPEN_URI
24810 29 20 7c 7c 0a 20 20 20 20 20 20 20 7a 55 74 66  ) ||.       zUtf
24820 38 4e 61 6d 65 5b 73 71 6c 69 74 65 33 53 74 72  8Name[sqlite3Str
24830 6c 65 6e 33 30 28 7a 55 74 66 38 4e 61 6d 65 29  len30(zUtf8Name)
24840 2b 31 5d 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  +1]==0 );..  /* 
24850 43 6f 6e 76 65 72 74 20 74 68 65 20 66 69 6c 65  Convert the file
24860 6e 61 6d 65 20 74 6f 20 74 68 65 20 73 79 73 74  name to the syst
24870 65 6d 20 65 6e 63 6f 64 69 6e 67 2e 20 2a 2f 0a  em encoding. */.
24880 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77    zConverted = w
24890 69 6e 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66  inConvertFromUtf
248a0 38 46 69 6c 65 6e 61 6d 65 28 7a 55 74 66 38 4e  8Filename(zUtf8N
248b0 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e  ame);.  if( zCon
248c0 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20  verted==0 ){.   
248d0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54   sqlite3_free(zT
248e0 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20 4f 53 54  mpname);.    OST
248f0 52 41 43 45 28 28 22 4f 50 45 4e 20 6e 61 6d 65  RACE(("OPEN name
24900 3d 25 73 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49  =%s, rc=SQLITE_I
24910 4f 45 52 52 5f 4e 4f 4d 45 4d 22 2c 20 7a 55 74  OERR_NOMEM", zUt
24920 66 38 4e 61 6d 65 29 29 3b 0a 20 20 20 20 72 65  f8Name));.    re
24930 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
24940 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20  R_NOMEM;.  }..  
24950 69 66 28 20 77 69 6e 49 73 44 69 72 28 7a 43 6f  if( winIsDir(zCo
24960 6e 76 65 72 74 65 64 29 20 29 7b 0a 20 20 20 20  nverted) ){.    
24970 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
24980 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 73 71  nverted);.    sq
24990 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 6d 70 6e  lite3_free(zTmpn
249a0 61 6d 65 29 3b 0a 20 20 20 20 4f 53 54 52 41 43  ame);.    OSTRAC
249b0 45 28 28 22 4f 50 45 4e 20 6e 61 6d 65 3d 25 73  E(("OPEN name=%s
249c0 2c 20 72 63 3d 53 51 4c 49 54 45 5f 43 41 4e 54  , rc=SQLITE_CANT
249d0 4f 50 45 4e 5f 49 53 44 49 52 22 2c 20 7a 55 74  OPEN_ISDIR", zUt
249e0 66 38 4e 61 6d 65 29 29 3b 0a 20 20 20 20 72 65  f8Name));.    re
249f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54  turn SQLITE_CANT
24a00 4f 50 45 4e 5f 49 53 44 49 52 3b 0a 20 20 7d 0a  OPEN_ISDIR;.  }.
24a10 0a 20 20 69 66 28 20 69 73 52 65 61 64 57 72 69  .  if( isReadWri
24a20 74 65 20 29 7b 0a 20 20 20 20 64 77 44 65 73 69  te ){.    dwDesi
24a30 72 65 64 41 63 63 65 73 73 20 3d 20 47 45 4e 45  redAccess = GENE
24a40 52 49 43 5f 52 45 41 44 20 7c 20 47 45 4e 45 52  RIC_READ | GENER
24a50 49 43 5f 57 52 49 54 45 3b 0a 20 20 7d 65 6c 73  IC_WRITE;.  }els
24a60 65 7b 0a 20 20 20 20 64 77 44 65 73 69 72 65 64  e{.    dwDesired
24a70 41 63 63 65 73 73 20 3d 20 47 45 4e 45 52 49 43  Access = GENERIC
24a80 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _READ;.  }..  /*
24a90 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43   SQLITE_OPEN_EXC
24aa0 4c 55 53 49 56 45 20 69 73 20 75 73 65 64 20 74  LUSIVE is used t
24ab0 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  o make sure that
24ac0 20 61 20 6e 65 77 20 66 69 6c 65 20 69 73 0a 20   a new file is. 
24ad0 20 2a 2a 20 63 72 65 61 74 65 64 2e 20 53 51 4c   ** created. SQL
24ae0 69 74 65 20 64 6f 65 73 6e 27 74 20 75 73 65 20  ite doesn't use 
24af0 69 74 20 74 6f 20 69 6e 64 69 63 61 74 65 20 22  it to indicate "
24b00 65 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 73  exclusive access
24b10 22 0a 20 20 2a 2a 20 61 73 20 69 74 20 69 73 20  ".  ** as it is 
24b20 75 73 75 61 6c 6c 79 20 75 6e 64 65 72 73 74 6f  usually understo
24b30 6f 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69  od..  */.  if( i
24b40 73 45 78 63 6c 75 73 69 76 65 20 29 7b 0a 20 20  sExclusive ){.  
24b50 20 20 2f 2a 20 43 72 65 61 74 65 73 20 61 20 6e    /* Creates a n
24b60 65 77 20 66 69 6c 65 2c 20 6f 6e 6c 79 20 69 66  ew file, only if
24b70 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72   it does not alr
24b80 65 61 64 79 20 65 78 69 73 74 2e 20 2a 2f 0a 20  eady exist. */. 
24b90 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c     /* If the fil
24ba0 65 20 65 78 69 73 74 73 2c 20 69 74 20 66 61 69  e exists, it fai
24bb0 6c 73 2e 20 2a 2f 0a 20 20 20 20 64 77 43 72 65  ls. */.    dwCre
24bc0 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e  ationDisposition
24bd0 20 3d 20 43 52 45 41 54 45 5f 4e 45 57 3b 0a 20   = CREATE_NEW;. 
24be0 20 7d 65 6c 73 65 20 69 66 28 20 69 73 43 72 65   }else if( isCre
24bf0 61 74 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 70  ate ){.    /* Op
24c00 65 6e 20 65 78 69 73 74 69 6e 67 20 66 69 6c 65  en existing file
24c10 2c 20 6f 72 20 63 72 65 61 74 65 20 69 66 20 69  , or create if i
24c20 74 20 64 6f 65 73 6e 27 74 20 65 78 69 73 74 20  t doesn't exist 
24c30 2a 2f 0a 20 20 20 20 64 77 43 72 65 61 74 69 6f  */.    dwCreatio
24c40 6e 44 69 73 70 6f 73 69 74 69 6f 6e 20 3d 20 4f  nDisposition = O
24c50 50 45 4e 5f 41 4c 57 41 59 53 3b 0a 20 20 7d 65  PEN_ALWAYS;.  }e
24c60 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4f 70 65 6e  lse{.    /* Open
24c70 73 20 61 20 66 69 6c 65 2c 20 6f 6e 6c 79 20 69  s a file, only i
24c80 66 20 69 74 20 65 78 69 73 74 73 2e 20 2a 2f 0a  f it exists. */.
24c90 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44 69      dwCreationDi
24ca0 73 70 6f 73 69 74 69 6f 6e 20 3d 20 4f 50 45 4e  sposition = OPEN
24cb0 5f 45 58 49 53 54 49 4e 47 3b 0a 20 20 7d 0a 0a  _EXISTING;.  }..
24cc0 20 20 64 77 53 68 61 72 65 4d 6f 64 65 20 3d 20    dwShareMode = 
24cd0 46 49 4c 45 5f 53 48 41 52 45 5f 52 45 41 44 20  FILE_SHARE_READ 
24ce0 7c 20 46 49 4c 45 5f 53 48 41 52 45 5f 57 52 49  | FILE_SHARE_WRI
24cf0 54 45 3b 0a 0a 20 20 69 66 28 20 69 73 44 65 6c  TE;..  if( isDel
24d00 65 74 65 20 29 7b 0a 23 69 66 20 53 51 4c 49 54  ete ){.#if SQLIT
24d10 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20 64  E_OS_WINCE.    d
24d20 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75  wFlagsAndAttribu
24d30 74 65 73 20 3d 20 46 49 4c 45 5f 41 54 54 52 49  tes = FILE_ATTRI
24d40 42 55 54 45 5f 48 49 44 44 45 4e 3b 0a 20 20 20  BUTE_HIDDEN;.   
24d50 20 69 73 54 65 6d 70 20 3d 20 31 3b 0a 23 65 6c   isTemp = 1;.#el
24d60 73 65 0a 20 20 20 20 64 77 46 6c 61 67 73 41 6e  se.    dwFlagsAn
24d70 64 41 74 74 72 69 62 75 74 65 73 20 3d 20 46 49  dAttributes = FI
24d80 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 54 45 4d  LE_ATTRIBUTE_TEM
24d90 50 4f 52 41 52 59 0a 20 20 20 20 20 20 20 20 20  PORARY.         
24da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24db0 20 20 20 20 20 20 7c 20 46 49 4c 45 5f 41 54 54        | FILE_ATT
24dc0 52 49 42 55 54 45 5f 48 49 44 44 45 4e 0a 20 20  RIBUTE_HIDDEN.  
24dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24de0 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 46               | F
24df0 49 4c 45 5f 46 4c 41 47 5f 44 45 4c 45 54 45 5f  ILE_FLAG_DELETE_
24e00 4f 4e 5f 43 4c 4f 53 45 3b 0a 23 65 6e 64 69 66  ON_CLOSE;.#endif
24e10 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 77  .  }else{.    dw
24e20 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74  FlagsAndAttribut
24e30 65 73 20 3d 20 46 49 4c 45 5f 41 54 54 52 49 42  es = FILE_ATTRIB
24e40 55 54 45 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 0a  UTE_NORMAL;.  }.
24e50 20 20 2f 2a 20 52 65 70 6f 72 74 73 20 66 72 6f    /* Reports fro
24e60 6d 20 74 68 65 20 69 6e 74 65 72 6e 65 74 20 61  m the internet a
24e70 72 65 20 74 68 61 74 20 70 65 72 66 6f 72 6d 61  re that performa
24e80 6e 63 65 20 69 73 20 61 6c 77 61 79 73 0a 20 20  nce is always.  
24e90 2a 2a 20 62 65 74 74 65 72 20 69 66 20 46 49 4c  ** better if FIL
24ea0 45 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d 5f 41 43  E_FLAG_RANDOM_AC
24eb0 43 45 53 53 20 69 73 20 75 73 65 64 2e 20 20 54  CESS is used.  T
24ec0 69 63 6b 65 74 20 23 32 36 39 39 2e 20 2a 2f 0a  icket #2699. */.
24ed0 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
24ee0 4e 43 45 0a 20 20 64 77 46 6c 61 67 73 41 6e 64  NCE.  dwFlagsAnd
24ef0 41 74 74 72 69 62 75 74 65 73 20 7c 3d 20 46 49  Attributes |= FI
24f00 4c 45 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d 5f 41  LE_FLAG_RANDOM_A
24f10 43 43 45 53 53 3b 0a 23 65 6e 64 69 66 0a 0a 20  CCESS;.#endif.. 
24f20 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b   if( osIsNT() ){
24f30 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
24f40 49 4e 52 54 0a 20 20 20 20 43 52 45 41 54 45 46  INRT.    CREATEF
24f50 49 4c 45 32 5f 45 58 54 45 4e 44 45 44 5f 50 41  ILE2_EXTENDED_PA
24f60 52 41 4d 45 54 45 52 53 20 65 78 74 65 6e 64 65  RAMETERS extende
24f70 64 50 61 72 61 6d 65 74 65 72 73 3b 0a 20 20 20  dParameters;.   
24f80 20 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74   extendedParamet
24f90 65 72 73 2e 64 77 53 69 7a 65 20 3d 20 73 69 7a  ers.dwSize = siz
24fa0 65 6f 66 28 43 52 45 41 54 45 46 49 4c 45 32 5f  eof(CREATEFILE2_
24fb0 45 58 54 45 4e 44 45 44 5f 50 41 52 41 4d 45 54  EXTENDED_PARAMET
24fc0 45 52 53 29 3b 0a 20 20 20 20 65 78 74 65 6e 64  ERS);.    extend
24fd0 65 64 50 61 72 61 6d 65 74 65 72 73 2e 64 77 46  edParameters.dwF
24fe0 69 6c 65 41 74 74 72 69 62 75 74 65 73 20 3d 0a  ileAttributes =.
24ff0 20 20 20 20 20 20 20 20 20 20 20 20 64 77 46 6c              dwFl
25000 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73  agsAndAttributes
25010 20 26 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54   & FILE_ATTRIBUT
25020 45 5f 4d 41 53 4b 3b 0a 20 20 20 20 65 78 74 65  E_MASK;.    exte
25030 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73 2e 64  ndedParameters.d
25040 77 46 69 6c 65 46 6c 61 67 73 20 3d 20 64 77 46  wFileFlags = dwF
25050 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65  lagsAndAttribute
25060 73 20 26 20 46 49 4c 45 5f 46 4c 41 47 5f 4d 41  s & FILE_FLAG_MA
25070 53 4b 3b 0a 20 20 20 20 65 78 74 65 6e 64 65 64  SK;.    extended
25080 50 61 72 61 6d 65 74 65 72 73 2e 64 77 53 65 63  Parameters.dwSec
25090 75 72 69 74 79 51 6f 73 46 6c 61 67 73 20 3d 20  urityQosFlags = 
250a0 53 45 43 55 52 49 54 59 5f 41 4e 4f 4e 59 4d 4f  SECURITY_ANONYMO
250b0 55 53 3b 0a 20 20 20 20 65 78 74 65 6e 64 65 64  US;.    extended
250c0 50 61 72 61 6d 65 74 65 72 73 2e 6c 70 53 65 63  Parameters.lpSec
250d0 75 72 69 74 79 41 74 74 72 69 62 75 74 65 73 20  urityAttributes 
250e0 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 65 78 74 65  = NULL;.    exte
250f0 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73 2e 68  ndedParameters.h
25100 54 65 6d 70 6c 61 74 65 46 69 6c 65 20 3d 20 4e  TemplateFile = N
25110 55 4c 4c 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  ULL;.    while( 
25120 28 68 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c  (h = osCreateFil
25130 65 32 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e  e2((LPCWSTR)zCon
25140 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20  verted,.        
25150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25160 20 20 20 20 20 20 64 77 44 65 73 69 72 65 64 41        dwDesiredA
25170 63 63 65 73 73 2c 0a 20 20 20 20 20 20 20 20 20  ccess,.         
25180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25190 20 20 20 20 20 64 77 53 68 61 72 65 4d 6f 64 65       dwShareMode
251a0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
251b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
251c0 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73  dwCreationDispos
251d0 69 74 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20 20  ition,.         
251e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
251f0 20 20 20 20 20 26 65 78 74 65 6e 64 65 64 50 61       &extendedPa
25200 72 61 6d 65 74 65 72 73 29 29 3d 3d 49 4e 56 41  rameters))==INVA
25210 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
25220 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20   &&.            
25230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25240 20 20 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28    winRetryIoerr(
25250 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f  &cnt, &lastErrno
25260 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
25270 20 20 20 20 2f 2a 20 4e 6f 6f 70 20 2a 2f 0a 20      /* Noop */. 
25280 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 77     }.#else.    w
25290 68 69 6c 65 28 20 28 68 20 3d 20 6f 73 43 72 65  hile( (h = osCre
252a0 61 74 65 46 69 6c 65 57 28 28 4c 50 43 57 53 54  ateFileW((LPCWST
252b0 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20  R)zConverted,.  
252c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
252d0 20 20 20 20 20 20 20 20 20 20 20 20 64 77 44 65              dwDe
252e0 73 69 72 65 64 41 63 63 65 73 73 2c 0a 20 20 20  siredAccess,.   
252f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25300 20 20 20 20 20 20 20 20 20 20 20 64 77 53 68 61             dwSha
25310 72 65 4d 6f 64 65 2c 20 4e 55 4c 4c 2c 0a 20 20  reMode, NULL,.  
25320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25330 20 20 20 20 20 20 20 20 20 20 20 20 64 77 43 72              dwCr
25340 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f  eationDispositio
25350 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n,.             
25360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25370 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69   dwFlagsAndAttri
25380 62 75 74 65 73 2c 0a 20 20 20 20 20 20 20 20 20  butes,.         
25390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
253a0 20 20 20 20 20 4e 55 4c 4c 29 29 3d 3d 49 4e 56       NULL))==INV
253b0 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
253c0 45 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20  E &&.           
253d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
253e0 20 20 20 77 69 6e 52 65 74 72 79 49 6f 65 72 72     winRetryIoerr
253f0 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e  (&cnt, &lastErrn
25400 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  o) ){.          
25410 20 20 20 20 20 2f 2a 20 4e 6f 6f 70 20 2a 2f 0a       /* Noop */.
25420 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
25430 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57  .#ifdef SQLITE_W
25440 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20  IN32_HAS_ANSI.  
25450 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28  else{.    while(
25460 20 28 68 20 3d 20 6f 73 43 72 65 61 74 65 46 69   (h = osCreateFi
25470 6c 65 41 28 28 4c 50 43 53 54 52 29 7a 43 6f 6e  leA((LPCSTR)zCon
25480 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20  verted,.        
25490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
254a0 20 20 20 20 20 20 64 77 44 65 73 69 72 65 64 41        dwDesiredA
254b0 63 63 65 73 73 2c 0a 20 20 20 20 20 20 20 20 20  ccess,.         
254c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
254d0 20 20 20 20 20 64 77 53 68 61 72 65 4d 6f 64 65       dwShareMode
254e0 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20  , NULL,.        
254f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25500 20 20 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e        dwCreation
25510 44 69 73 70 6f 73 69 74 69 6f 6e 2c 0a 20 20 20  Disposition,.   
25520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25530 20 20 20 20 20 20 20 20 20 20 20 64 77 46 6c 61             dwFla
25540 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 2c  gsAndAttributes,
25550 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
25560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4e                 N
25570 55 4c 4c 29 29 3d 3d 49 4e 56 41 4c 49 44 5f 48  ULL))==INVALID_H
25580 41 4e 44 4c 45 5f 56 41 4c 55 45 20 26 26 0a 20  ANDLE_VALUE &&. 
25590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
255a0 20 20 20 20 20 20 20 20 20 20 20 20 20 77 69 6e               win
255b0 52 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c  RetryIoerr(&cnt,
255c0 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 0a   &lastErrno) ){.
255d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
255e0 2a 20 4e 6f 6f 70 20 2a 2f 0a 20 20 20 20 7d 0a  * Noop */.    }.
255f0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 77 69 6e    }.#endif.  win
25600 4c 6f 67 49 6f 65 72 72 28 63 6e 74 29 3b 0a 0a  LogIoerr(cnt);..
25610 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e    OSTRACE(("OPEN
25620 20 66 69 6c 65 3d 25 70 2c 20 6e 61 6d 65 3d 25   file=%p, name=%
25630 73 2c 20 61 63 63 65 73 73 3d 25 6c 78 2c 20 72  s, access=%lx, r
25640 63 3d 25 73 5c 6e 22 2c 20 68 2c 20 7a 55 74 66  c=%s\n", h, zUtf
25650 38 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20  8Name,.         
25660 20 20 64 77 44 65 73 69 72 65 64 41 63 63 65 73    dwDesiredAcces
25670 73 2c 20 28 68 3d 3d 49 4e 56 41 4c 49 44 5f 48  s, (h==INVALID_H
25680 41 4e 44 4c 45 5f 56 41 4c 55 45 29 20 3f 20 22  ANDLE_VALUE) ? "
25690 66 61 69 6c 65 64 22 20 3a 20 22 6f 6b 22 29 29  failed" : "ok"))
256a0 3b 0a 0a 20 20 69 66 28 20 68 3d 3d 49 4e 56 41  ;..  if( h==INVA
256b0 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
256c0 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c   ){.    pFile->l
256d0 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45  astErrno = lastE
256e0 72 72 6e 6f 3b 0a 20 20 20 20 77 69 6e 4c 6f 67  rrno;.    winLog
256f0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e  Error(SQLITE_CAN
25700 54 4f 50 45 4e 2c 20 70 46 69 6c 65 2d 3e 6c 61  TOPEN, pFile->la
25710 73 74 45 72 72 6e 6f 2c 20 22 77 69 6e 4f 70 65  stErrno, "winOpe
25720 6e 22 2c 20 7a 55 74 66 38 4e 61 6d 65 29 3b 0a  n", zUtf8Name);.
25730 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
25740 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
25750 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
25760 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66  Tmpname);.    if
25770 28 20 69 73 52 65 61 64 57 72 69 74 65 20 26 26  ( isReadWrite &&
25780 20 21 69 73 45 78 63 6c 75 73 69 76 65 20 29 7b   !isExclusive ){
25790 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69  .      return wi
257a0 6e 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4e 61 6d  nOpen(pVfs, zNam
257b0 65 2c 20 69 64 2c 0a 20 20 20 20 20 20 20 20 20  e, id,.         
257c0 28 28 66 6c 61 67 73 7c 53 51 4c 49 54 45 5f 4f  ((flags|SQLITE_O
257d0 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 20 26 0a  PEN_READONLY) &.
257e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
257f0 20 20 20 20 20 7e 28 53 51 4c 49 54 45 5f 4f 50       ~(SQLITE_OP
25800 45 4e 5f 43 52 45 41 54 45 7c 53 51 4c 49 54 45  EN_CREATE|SQLITE
25810 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 29  _OPEN_READWRITE)
25820 29 2c 0a 20 20 20 20 20 20 20 20 20 70 4f 75 74  ),.         pOut
25830 46 6c 61 67 73 29 3b 0a 20 20 20 20 7d 65 6c 73  Flags);.    }els
25840 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  e{.      return 
25850 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
25860 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  BKPT;.    }.  }.
25870 0a 20 20 69 66 28 20 70 4f 75 74 46 6c 61 67 73  .  if( pOutFlags
25880 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73 52 65   ){.    if( isRe
25890 61 64 57 72 69 74 65 20 29 7b 0a 20 20 20 20 20  adWrite ){.     
258a0 20 2a 70 4f 75 74 46 6c 61 67 73 20 3d 20 53 51   *pOutFlags = SQ
258b0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
258c0 49 54 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ITE;.    }else{.
258d0 20 20 20 20 20 20 2a 70 4f 75 74 46 6c 61 67 73        *pOutFlags
258e0 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   = SQLITE_OPEN_R
258f0 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20  EADONLY;.    }. 
25900 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22   }..  OSTRACE(("
25910 4f 50 45 4e 20 66 69 6c 65 3d 25 70 2c 20 6e 61  OPEN file=%p, na
25920 6d 65 3d 25 73 2c 20 61 63 63 65 73 73 3d 25 6c  me=%s, access=%l
25930 78 2c 20 70 4f 75 74 46 6c 61 67 73 3d 25 70 2c  x, pOutFlags=%p,
25940 20 2a 70 4f 75 74 46 6c 61 67 73 3d 25 64 2c 20   *pOutFlags=%d, 
25950 22 0a 20 20 20 20 20 20 20 20 20 20 20 22 72 63  ".           "rc
25960 3d 25 73 5c 6e 22 2c 20 68 2c 20 7a 55 74 66 38  =%s\n", h, zUtf8
25970 4e 61 6d 65 2c 20 64 77 44 65 73 69 72 65 64 41  Name, dwDesiredA
25980 63 63 65 73 73 2c 20 70 4f 75 74 46 6c 61 67 73  ccess, pOutFlags
25990 2c 20 70 4f 75 74 46 6c 61 67 73 20 3f 0a 20 20  , pOutFlags ?.  
259a0 20 20 20 20 20 20 20 20 20 2a 70 4f 75 74 46 6c           *pOutFl
259b0 61 67 73 20 3a 20 30 2c 20 28 68 3d 3d 49 4e 56  ags : 0, (h==INV
259c0 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
259d0 45 29 20 3f 20 22 66 61 69 6c 65 64 22 20 3a 20  E) ? "failed" : 
259e0 22 6f 6b 22 29 29 3b 0a 0a 23 69 66 20 53 51 4c  "ok"));..#if SQL
259f0 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 69  ITE_OS_WINCE.  i
25a00 66 28 20 69 73 52 65 61 64 57 72 69 74 65 20 26  f( isReadWrite &
25a10 26 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  & eType==SQLITE_
25a20 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 0a 20 20 20  OPEN_MAIN_DB.   
25a30 20 20 20 20 26 26 20 28 72 63 20 3d 20 77 69 6e      && (rc = win
25a40 63 65 43 72 65 61 74 65 4c 6f 63 6b 28 7a 4e 61  ceCreateLock(zNa
25a50 6d 65 2c 20 70 46 69 6c 65 29 29 21 3d 53 51 4c  me, pFile))!=SQL
25a60 49 54 45 5f 4f 4b 0a 20 20 29 7b 0a 20 20 20 20  ITE_OK.  ){.    
25a70 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 68 29  osCloseHandle(h)
25a80 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
25a90 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
25aa0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
25ab0 28 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20  (zTmpname);.    
25ac0 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 2d 43  OSTRACE(("OPEN-C
25ad0 45 2d 4c 4f 43 4b 20 6e 61 6d 65 3d 25 73 2c 20  E-LOCK name=%s, 
25ae0 72 63 3d 25 73 5c 6e 22 2c 20 7a 4e 61 6d 65 2c  rc=%s\n", zName,
25af0 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28   sqlite3ErrName(
25b00 72 63 29 29 29 3b 0a 20 20 20 20 72 65 74 75 72  rc)));.    retur
25b10 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20  n rc;.  }.  if( 
25b20 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 70 46  isTemp ){.    pF
25b30 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c  ile->zDeleteOnCl
25b40 6f 73 65 20 3d 20 7a 43 6f 6e 76 65 72 74 65 64  ose = zConverted
25b50 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66  ;.  }else.#endif
25b60 0a 20 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  .  {.    sqlite3
25b70 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
25b80 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65  );.  }..  sqlite
25b90 33 5f 66 72 65 65 28 7a 54 6d 70 6e 61 6d 65 29  3_free(zTmpname)
25ba0 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68  ;.  pFile->pMeth
25bb0 6f 64 20 3d 20 26 77 69 6e 49 6f 4d 65 74 68 6f  od = &winIoMetho
25bc0 64 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 56 66 73  d;.  pFile->pVfs
25bd0 20 3d 20 70 56 66 73 3b 0a 20 20 70 46 69 6c 65   = pVfs;.  pFile
25be0 2d 3e 68 20 3d 20 68 3b 0a 20 20 69 66 28 20 69  ->h = h;.  if( i
25bf0 73 52 65 61 64 6f 6e 6c 79 20 29 7b 0a 20 20 20  sReadonly ){.   
25c00 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67   pFile->ctrlFlag
25c10 73 20 7c 3d 20 57 49 4e 46 49 4c 45 5f 52 44 4f  s |= WINFILE_RDO
25c20 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  NLY;.  }.  if( s
25c30 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65  qlite3_uri_boole
25c40 61 6e 28 7a 4e 61 6d 65 2c 20 22 70 73 6f 77 22  an(zName, "psow"
25c50 2c 20 53 51 4c 49 54 45 5f 50 4f 57 45 52 53 41  , SQLITE_POWERSA
25c60 46 45 5f 4f 56 45 52 57 52 49 54 45 29 20 29 7b  FE_OVERWRITE) ){
25c70 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c  .    pFile->ctrl
25c80 46 6c 61 67 73 20 7c 3d 20 57 49 4e 46 49 4c 45  Flags |= WINFILE
25c90 5f 50 53 4f 57 3b 0a 20 20 7d 0a 20 20 70 46 69  _PSOW;.  }.  pFi
25ca0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
25cb0 4e 4f 5f 45 52 52 4f 52 3b 0a 20 20 70 46 69 6c  NO_ERROR;.  pFil
25cc0 65 2d 3e 7a 50 61 74 68 20 3d 20 7a 4e 61 6d 65  e->zPath = zName
25cd0 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  ;.#if SQLITE_MAX
25ce0 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 70  _MMAP_SIZE>0.  p
25cf0 46 69 6c 65 2d 3e 68 4d 61 70 20 3d 20 4e 55 4c  File->hMap = NUL
25d00 4c 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 4d 61 70  L;.  pFile->pMap
25d10 52 65 67 69 6f 6e 20 3d 20 30 3b 0a 20 20 70 46  Region = 0;.  pF
25d20 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d 20  ile->mmapSize = 
25d30 30 3b 0a 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70  0;.  pFile->mmap
25d40 53 69 7a 65 41 63 74 75 61 6c 20 3d 20 30 3b 0a  SizeActual = 0;.
25d50 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a    pFile->mmapSiz
25d60 65 4d 61 78 20 3d 20 73 71 6c 69 74 65 33 47 6c  eMax = sqlite3Gl
25d70 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4d 6d 61  obalConfig.szMma
25d80 70 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 4f 70 65  p;.#endif..  Ope
25d90 6e 43 6f 75 6e 74 65 72 28 2b 31 29 3b 0a 20 20  nCounter(+1);.  
25da0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
25db0 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20 6e  .** Delete the n
25dc0 61 6d 65 64 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  amed file..**.**
25dd0 20 4e 6f 74 65 20 74 68 61 74 20 57 69 6e 64 6f   Note that Windo
25de0 77 73 20 64 6f 65 73 20 6e 6f 74 20 61 6c 6c 6f  ws does not allo
25df0 77 20 61 20 66 69 6c 65 20 74 6f 20 62 65 20 64  w a file to be d
25e00 65 6c 65 74 65 64 20 69 66 20 73 6f 6d 65 20 6f  eleted if some o
25e10 74 68 65 72 0a 2a 2a 20 70 72 6f 63 65 73 73 20  ther.** process 
25e20 68 61 73 20 69 74 20 6f 70 65 6e 2e 20 20 53 6f  has it open.  So
25e30 6d 65 74 69 6d 65 73 20 61 20 76 69 72 75 73 20  metimes a virus 
25e40 73 63 61 6e 6e 65 72 20 6f 72 20 69 6e 64 65 78  scanner or index
25e50 69 6e 67 20 70 72 6f 67 72 61 6d 0a 2a 2a 20 77  ing program.** w
25e60 69 6c 6c 20 6f 70 65 6e 20 61 20 6a 6f 75 72 6e  ill open a journ
25e70 61 6c 20 66 69 6c 65 20 73 68 6f 72 74 6c 79 20  al file shortly 
25e80 61 66 74 65 72 20 69 74 20 69 73 20 63 72 65 61  after it is crea
25e90 74 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ted in order to 
25ea0 64 6f 0a 2a 2a 20 77 68 61 74 65 76 65 72 20 69  do.** whatever i
25eb0 74 20 64 6f 65 73 2e 20 20 57 68 69 6c 65 20 74  t does.  While t
25ec0 68 69 73 20 6f 74 68 65 72 20 70 72 6f 63 65 73  his other proces
25ed0 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65  s is holding the
25ee0 0a 2a 2a 20 66 69 6c 65 20 6f 70 65 6e 2c 20 77  .** file open, w
25ef0 65 20 77 69 6c 6c 20 62 65 20 75 6e 61 62 6c 65  e will be unable
25f00 20 74 6f 20 64 65 6c 65 74 65 20 69 74 2e 20 20   to delete it.  
25f10 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74  To work around t
25f20 68 69 73 0a 2a 2a 20 70 72 6f 62 6c 65 6d 2c 20  his.** problem, 
25f30 77 65 20 64 65 6c 61 79 20 31 30 30 20 6d 69 6c  we delay 100 mil
25f40 6c 69 73 65 63 6f 6e 64 73 20 61 6e 64 20 74 72  liseconds and tr
25f50 79 20 74 6f 20 64 65 6c 65 74 65 20 61 67 61 69  y to delete agai
25f60 6e 2e 20 20 55 70 0a 2a 2a 20 74 6f 20 4d 58 5f  n.  Up.** to MX_
25f70 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d 50 54  DELETION_ATTEMPT
25f80 73 20 64 65 6c 65 74 69 6f 6e 20 61 74 74 65 6d  s deletion attem
25f90 70 74 73 20 61 72 65 20 72 75 6e 20 62 65 66 6f  pts are run befo
25fa0 72 65 20 67 69 76 69 6e 67 0a 2a 2a 20 75 70 20  re giving.** up 
25fb0 61 6e 64 20 72 65 74 75 72 6e 69 6e 67 20 61 6e  and returning an
25fc0 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69   error..*/.stati
25fd0 63 20 69 6e 74 20 77 69 6e 44 65 6c 65 74 65 28  c int winDelete(
25fe0 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
25ff0 70 56 66 73 2c 20 20 20 20 20 20 20 20 20 20 2f  pVfs,          /
26000 2a 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20 77 69  * Not used on wi
26010 6e 33 32 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  n32 */.  const c
26020 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
26030 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
26040 66 69 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 2a  file to delete *
26050 2f 0a 20 20 69 6e 74 20 73 79 6e 63 44 69 72 20  /.  int syncDir 
26060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26070 2f 2a 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20 77  /* Not used on w
26080 69 6e 33 32 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  in32 */.){.  int
26090 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20   cnt = 0;.  int 
260a0 72 63 3b 0a 20 20 44 57 4f 52 44 20 61 74 74 72  rc;.  DWORD attr
260b0 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72  ;.  DWORD lastEr
260c0 72 6e 6f 20 3d 20 30 3b 0a 20 20 76 6f 69 64 20  rno = 0;.  void 
260d0 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 55  *zConverted;.  U
260e0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
260f0 70 56 66 73 29 3b 0a 20 20 55 4e 55 53 45 44 5f  pVfs);.  UNUSED_
26100 50 41 52 41 4d 45 54 45 52 28 73 79 6e 63 44 69  PARAMETER(syncDi
26110 72 29 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49  r);..  SimulateI
26120 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51  OError(return SQ
26130 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54  LITE_IOERR_DELET
26140 45 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  E);.  OSTRACE(("
26150 44 45 4c 45 54 45 20 6e 61 6d 65 3d 25 73 2c 20  DELETE name=%s, 
26160 73 79 6e 63 44 69 72 3d 25 64 5c 6e 22 2c 20 7a  syncDir=%d\n", z
26170 46 69 6c 65 6e 61 6d 65 2c 20 73 79 6e 63 44 69  Filename, syncDi
26180 72 29 29 3b 0a 0a 20 20 7a 43 6f 6e 76 65 72 74  r));..  zConvert
26190 65 64 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74 46  ed = winConvertF
261a0 72 6f 6d 55 74 66 38 46 69 6c 65 6e 61 6d 65 28  romUtf8Filename(
261b0 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66  zFilename);.  if
261c0 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20  ( zConverted==0 
261d0 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  ){.    OSTRACE((
261e0 22 44 45 4c 45 54 45 20 6e 61 6d 65 3d 25 73 2c  "DELETE name=%s,
261f0 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52   rc=SQLITE_IOERR
26200 5f 4e 4f 4d 45 4d 5c 6e 22 2c 20 7a 46 69 6c 65  _NOMEM\n", zFile
26210 6e 61 6d 65 29 29 3b 0a 20 20 20 20 72 65 74 75  name));.    retu
26220 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
26230 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28  NOMEM;.  }.  if(
26240 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 20 20   osIsNT() ){.   
26250 20 64 6f 20 7b 0a 23 69 66 20 53 51 4c 49 54 45   do {.#if SQLITE
26260 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 20 20  _OS_WINRT.      
26270 57 49 4e 33 32 5f 46 49 4c 45 5f 41 54 54 52 49  WIN32_FILE_ATTRI
26280 42 55 54 45 5f 44 41 54 41 20 73 41 74 74 72 44  BUTE_DATA sAttrD
26290 61 74 61 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65  ata;.      memse
262a0 74 28 26 73 41 74 74 72 44 61 74 61 2c 20 30 2c  t(&sAttrData, 0,
262b0 20 73 69 7a 65 6f 66 28 73 41 74 74 72 44 61 74   sizeof(sAttrDat
262c0 61 29 29 3b 0a 20 20 20 20 20 20 69 66 20 28 20  a));.      if ( 
262d0 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75  osGetFileAttribu
262e0 74 65 73 45 78 57 28 7a 43 6f 6e 76 65 72 74 65  tesExW(zConverte
262f0 64 2c 20 47 65 74 46 69 6c 65 45 78 49 6e 66 6f  d, GetFileExInfo
26300 53 74 61 6e 64 61 72 64 2c 0a 20 20 20 20 20 20  Standard,.      
26310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26320 20 20 20 20 20 20 20 20 20 20 20 20 26 73 41 74              &sAt
26330 74 72 44 61 74 61 29 20 29 7b 0a 20 20 20 20 20  trData) ){.     
26340 20 20 20 61 74 74 72 20 3d 20 73 41 74 74 72 44     attr = sAttrD
26350 61 74 61 2e 64 77 46 69 6c 65 41 74 74 72 69 62  ata.dwFileAttrib
26360 75 74 65 73 3b 0a 20 20 20 20 20 20 7d 65 6c 73  utes;.      }els
26370 65 7b 0a 20 20 20 20 20 20 20 20 6c 61 73 74 45  e{.        lastE
26380 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
26390 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 20  Error();.       
263a0 20 69 66 28 20 6c 61 73 74 45 72 72 6e 6f 3d 3d   if( lastErrno==
263b0 45 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54 5f 46  ERROR_FILE_NOT_F
263c0 4f 55 4e 44 0a 20 20 20 20 20 20 20 20 20 7c 7c  OUND.         ||
263d0 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f   lastErrno==ERRO
263e0 52 5f 50 41 54 48 5f 4e 4f 54 5f 46 4f 55 4e 44  R_PATH_NOT_FOUND
263f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
26400 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
26410 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 3b 20 2f 2a  DELETE_NOENT; /*
26420 20 41 6c 72 65 61 64 79 20 67 6f 6e 65 3f 20 2a   Already gone? *
26430 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  /.        }else{
26440 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
26450 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
26460 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
26470 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 23  break;.      }.#
26480 65 6c 73 65 0a 20 20 20 20 20 20 61 74 74 72 20  else.      attr 
26490 3d 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69  = osGetFileAttri
264a0 62 75 74 65 73 57 28 7a 43 6f 6e 76 65 72 74 65  butesW(zConverte
264b0 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  d);.#endif.     
264c0 20 69 66 20 28 20 61 74 74 72 3d 3d 49 4e 56 41   if ( attr==INVA
264d0 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55  LID_FILE_ATTRIBU
264e0 54 45 53 20 29 7b 0a 20 20 20 20 20 20 20 20 6c  TES ){.        l
264f0 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
26500 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
26510 20 20 20 20 20 69 66 28 20 6c 61 73 74 45 72 72       if( lastErr
26520 6e 6f 3d 3d 45 52 52 4f 52 5f 46 49 4c 45 5f 4e  no==ERROR_FILE_N
26530 4f 54 5f 46 4f 55 4e 44 0a 20 20 20 20 20 20 20  OT_FOUND.       
26540 20 20 7c 7c 20 6c 61 73 74 45 72 72 6e 6f 3d 3d    || lastErrno==
26550 45 52 52 4f 52 5f 50 41 54 48 5f 4e 4f 54 5f 46  ERROR_PATH_NOT_F
26560 4f 55 4e 44 20 29 7b 0a 20 20 20 20 20 20 20 20  OUND ){.        
26570 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
26580 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54  ERR_DELETE_NOENT
26590 3b 20 2f 2a 20 41 6c 72 65 61 64 79 20 67 6f 6e  ; /* Already gon
265a0 65 3f 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65  e? */.        }e
265b0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72  lse{.          r
265c0 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
265d0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
265e0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
265f0 20 7d 0a 20 20 20 20 20 20 69 66 20 28 20 61 74   }.      if ( at
26600 74 72 26 46 49 4c 45 5f 41 54 54 52 49 42 55 54  tr&FILE_ATTRIBUT
26610 45 5f 44 49 52 45 43 54 4f 52 59 20 29 7b 0a 20  E_DIRECTORY ){. 
26620 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
26630 54 45 5f 45 52 52 4f 52 3b 20 2f 2a 20 46 69 6c  TE_ERROR; /* Fil
26640 65 73 20 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20  es only. */.    
26650 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
26660 20 7d 0a 20 20 20 20 20 20 69 66 20 28 20 6f 73   }.      if ( os
26670 44 65 6c 65 74 65 46 69 6c 65 57 28 7a 43 6f 6e  DeleteFileW(zCon
26680 76 65 72 74 65 64 29 20 29 7b 0a 20 20 20 20 20  verted) ){.     
26690 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
266a0 4b 3b 20 2f 2a 20 44 65 6c 65 74 65 64 20 4f 4b  K; /* Deleted OK
266b0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65  . */.        bre
266c0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
266d0 20 20 69 66 20 28 20 21 77 69 6e 52 65 74 72 79    if ( !winRetry
266e0 49 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c 61 73  Ioerr(&cnt, &las
266f0 74 45 72 72 6e 6f 29 20 29 7b 0a 20 20 20 20 20  tErrno) ){.     
26700 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
26710 52 52 4f 52 3b 20 2f 2a 20 4e 6f 20 6d 6f 72 65  RROR; /* No more
26720 20 72 65 74 72 69 65 73 2e 20 2a 2f 0a 20 20 20   retries. */.   
26730 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
26740 20 20 7d 0a 20 20 20 20 7d 20 77 68 69 6c 65 28    }.    } while(
26750 31 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53  1);.  }.#ifdef S
26760 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
26770 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20  ANSI.  else{.   
26780 20 64 6f 20 7b 0a 20 20 20 20 20 20 61 74 74 72   do {.      attr
26790 20 3d 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72   = osGetFileAttr
267a0 69 62 75 74 65 73 41 28 7a 43 6f 6e 76 65 72 74  ibutesA(zConvert
267b0 65 64 29 3b 0a 20 20 20 20 20 20 69 66 20 28 20  ed);.      if ( 
267c0 61 74 74 72 3d 3d 49 4e 56 41 4c 49 44 5f 46 49  attr==INVALID_FI
267d0 4c 45 5f 41 54 54 52 49 42 55 54 45 53 20 29 7b  LE_ATTRIBUTES ){
267e0 0a 20 20 20 20 20 20 20 20 6c 61 73 74 45 72 72  .        lastErr
267f0 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
26800 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 20 20 69  ror();.        i
26810 66 28 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52  f( lastErrno==ER
26820 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54 5f 46 4f 55  ROR_FILE_NOT_FOU
26830 4e 44 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 6c  ND.         || l
26840 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f  astErrno==ERROR_
26850 50 41 54 48 5f 4e 4f 54 5f 46 4f 55 4e 44 20 29  PATH_NOT_FOUND )
26860 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
26870 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45   SQLITE_IOERR_DE
26880 4c 45 54 45 5f 4e 4f 45 4e 54 3b 20 2f 2a 20 41  LETE_NOENT; /* A
26890 6c 72 65 61 64 79 20 67 6f 6e 65 3f 20 2a 2f 0a  lready gone? */.
268a0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
268b0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
268c0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
268d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72      }.        br
268e0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
268f0 20 20 20 69 66 20 28 20 61 74 74 72 26 46 49 4c     if ( attr&FIL
26900 45 5f 41 54 54 52 49 42 55 54 45 5f 44 49 52 45  E_ATTRIBUTE_DIRE
26910 43 54 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 20  CTORY ){.       
26920 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
26930 4f 52 3b 20 2f 2a 20 46 69 6c 65 73 20 6f 6e 6c  OR; /* Files onl
26940 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72  y. */.        br
26950 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
26960 20 20 20 69 66 20 28 20 6f 73 44 65 6c 65 74 65     if ( osDelete
26970 46 69 6c 65 41 28 7a 43 6f 6e 76 65 72 74 65 64  FileA(zConverted
26980 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
26990 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 2f 2a 20  = SQLITE_OK; /* 
269a0 44 65 6c 65 74 65 64 20 4f 4b 2e 20 2a 2f 0a 20  Deleted OK. */. 
269b0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
269c0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 20 28      }.      if (
269d0 20 21 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28   !winRetryIoerr(
269e0 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f  &cnt, &lastErrno
269f0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
26a00 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20  = SQLITE_ERROR; 
26a10 2f 2a 20 4e 6f 20 6d 6f 72 65 20 72 65 74 72 69  /* No more retri
26a20 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 62  es. */.        b
26a30 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
26a40 20 20 7d 20 77 68 69 6c 65 28 31 29 3b 0a 20 20    } while(1);.  
26a50 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 72  }.#endif.  if( r
26a60 63 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f  c && rc!=SQLITE_
26a70 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45  IOERR_DELETE_NOE
26a80 4e 54 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 77  NT ){.    rc = w
26a90 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
26aa0 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 2c 20  E_IOERR_DELETE, 
26ab0 6c 61 73 74 45 72 72 6e 6f 2c 20 22 77 69 6e 44  lastErrno, "winD
26ac0 65 6c 65 74 65 22 2c 20 7a 46 69 6c 65 6e 61 6d  elete", zFilenam
26ad0 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
26ae0 20 77 69 6e 4c 6f 67 49 6f 65 72 72 28 63 6e 74   winLogIoerr(cnt
26af0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
26b00 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
26b10 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 44  );.  OSTRACE(("D
26b20 45 4c 45 54 45 20 6e 61 6d 65 3d 25 73 2c 20 72  ELETE name=%s, r
26b30 63 3d 25 73 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61  c=%s\n", zFilena
26b40 6d 65 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61  me, sqlite3ErrNa
26b50 6d 65 28 72 63 29 29 29 3b 0a 20 20 72 65 74 75  me(rc)));.  retu
26b60 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
26b70 43 68 65 63 6b 20 74 68 65 20 65 78 69 73 74 65  Check the existe
26b80 6e 63 65 20 61 6e 64 20 73 74 61 74 75 73 20 6f  nce and status o
26b90 66 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  f a file..*/.sta
26ba0 74 69 63 20 69 6e 74 20 77 69 6e 41 63 63 65 73  tic int winAcces
26bb0 73 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  s(.  sqlite3_vfs
26bc0 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20 20   *pVfs,         
26bd0 2f 2a 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20 77  /* Not used on w
26be0 69 6e 33 32 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  in32 */.  const 
26bf0 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
26c00 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
26c10 66 69 6c 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f  file to check */
26c20 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20  .  int flags,   
26c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26c40 20 54 79 70 65 20 6f 66 20 74 65 73 74 20 74 6f   Type of test to
26c50 20 6d 61 6b 65 20 6f 6e 20 74 68 69 73 20 66 69   make on this fi
26c60 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65  le */.  int *pRe
26c70 73 4f 75 74 20 20 20 20 20 20 20 20 20 20 20 20  sOut            
26c80 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 73 75 6c     /* OUT: Resul
26c90 74 20 2a 2f 0a 29 7b 0a 20 20 44 57 4f 52 44 20  t */.){.  DWORD 
26ca0 61 74 74 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d  attr;.  int rc =
26cb0 20 30 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74   0;.  DWORD last
26cc0 45 72 72 6e 6f 20 3d 20 30 3b 0a 20 20 76 6f 69  Errno = 0;.  voi
26cd0 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20  d *zConverted;. 
26ce0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
26cf0 52 28 70 56 66 73 29 3b 0a 0a 20 20 53 69 6d 75  R(pVfs);..  Simu
26d00 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
26d10 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
26d20 5f 41 43 43 45 53 53 3b 20 29 3b 0a 20 20 4f 53  _ACCESS; );.  OS
26d30 54 52 41 43 45 28 28 22 41 43 43 45 53 53 20 6e  TRACE(("ACCESS n
26d40 61 6d 65 3d 25 73 2c 20 66 6c 61 67 73 3d 25 78  ame=%s, flags=%x
26d50 2c 20 70 52 65 73 4f 75 74 3d 25 70 5c 6e 22 2c  , pResOut=%p\n",
26d60 0a 20 20 20 20 20 20 20 20 20 20 20 7a 46 69 6c  .           zFil
26d70 65 6e 61 6d 65 2c 20 66 6c 61 67 73 2c 20 70 52  ename, flags, pR
26d80 65 73 4f 75 74 29 29 3b 0a 0a 20 20 7a 43 6f 6e  esOut));..  zCon
26d90 76 65 72 74 65 64 20 3d 20 77 69 6e 43 6f 6e 76  verted = winConv
26da0 65 72 74 46 72 6f 6d 55 74 66 38 46 69 6c 65 6e  ertFromUtf8Filen
26db0 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  ame(zFilename);.
26dc0 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64    if( zConverted
26dd0 3d 3d 30 20 29 7b 0a 20 20 20 20 4f 53 54 52 41  ==0 ){.    OSTRA
26de0 43 45 28 28 22 41 43 43 45 53 53 20 6e 61 6d 65  CE(("ACCESS name
26df0 3d 25 73 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49  =%s, rc=SQLITE_I
26e00 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 2c 20 7a  OERR_NOMEM\n", z
26e10 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 20 20  Filename));.    
26e20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
26e30 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ERR_NOMEM;.  }. 
26e40 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b   if( osIsNT() ){
26e50 0a 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 30  .    int cnt = 0
26e60 3b 0a 20 20 20 20 57 49 4e 33 32 5f 46 49 4c 45  ;.    WIN32_FILE
26e70 5f 41 54 54 52 49 42 55 54 45 5f 44 41 54 41 20  _ATTRIBUTE_DATA 
26e80 73 41 74 74 72 44 61 74 61 3b 0a 20 20 20 20 6d  sAttrData;.    m
26e90 65 6d 73 65 74 28 26 73 41 74 74 72 44 61 74 61  emset(&sAttrData
26ea0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 41 74 74  , 0, sizeof(sAtt
26eb0 72 44 61 74 61 29 29 3b 0a 20 20 20 20 77 68 69  rData));.    whi
26ec0 6c 65 28 20 21 28 72 63 20 3d 20 6f 73 47 65 74  le( !(rc = osGet
26ed0 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 45 78  FileAttributesEx
26ee0 57 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76  W((LPCWSTR)zConv
26ef0 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20 20  erted,.         
26f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26f10 20 20 20 20 47 65 74 46 69 6c 65 45 78 49 6e 66      GetFileExInf
26f20 6f 53 74 61 6e 64 61 72 64 2c 0a 20 20 20 20 20  oStandard,.     
26f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26f40 20 20 20 20 20 20 20 20 26 73 41 74 74 72 44 61          &sAttrDa
26f50 74 61 29 29 20 26 26 20 77 69 6e 52 65 74 72 79  ta)) && winRetry
26f60 49 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c 61 73  Ioerr(&cnt, &las
26f70 74 45 72 72 6e 6f 29 20 29 7b 7d 0a 20 20 20 20  tErrno) ){}.    
26f80 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
26f90 2f 2a 20 46 6f 72 20 61 6e 20 53 51 4c 49 54 45  /* For an SQLITE
26fa0 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 20 71  _ACCESS_EXISTS q
26fb0 75 65 72 79 2c 20 74 72 65 61 74 20 61 20 7a 65  uery, treat a ze
26fc0 72 6f 2d 6c 65 6e 67 74 68 20 66 69 6c 65 0a 20  ro-length file. 
26fd0 20 20 20 20 20 2a 2a 20 61 73 20 69 66 20 69 74       ** as if it
26fe0 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e   does not exist.
26ff0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
27000 69 66 28 20 20 20 20 66 6c 61 67 73 3d 3d 53 51  if(    flags==SQ
27010 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
27020 54 53 0a 20 20 20 20 20 20 20 20 20 20 26 26 20  TS.          && 
27030 73 41 74 74 72 44 61 74 61 2e 6e 46 69 6c 65 53  sAttrData.nFileS
27040 69 7a 65 48 69 67 68 3d 3d 30 0a 20 20 20 20 20  izeHigh==0.     
27050 20 20 20 20 20 26 26 20 73 41 74 74 72 44 61 74       && sAttrDat
27060 61 2e 6e 46 69 6c 65 53 69 7a 65 4c 6f 77 3d 3d  a.nFileSizeLow==
27070 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 74 74  0 ){.        att
27080 72 20 3d 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45  r = INVALID_FILE
27090 5f 41 54 54 52 49 42 55 54 45 53 3b 0a 20 20 20  _ATTRIBUTES;.   
270a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
270b0 20 20 61 74 74 72 20 3d 20 73 41 74 74 72 44 61    attr = sAttrDa
270c0 74 61 2e 64 77 46 69 6c 65 41 74 74 72 69 62 75  ta.dwFileAttribu
270d0 74 65 73 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  tes;.      }.   
270e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 77 69   }else{.      wi
270f0 6e 4c 6f 67 49 6f 65 72 72 28 63 6e 74 29 3b 0a  nLogIoerr(cnt);.
27100 20 20 20 20 20 20 69 66 28 20 6c 61 73 74 45 72        if( lastEr
27110 72 6e 6f 21 3d 45 52 52 4f 52 5f 46 49 4c 45 5f  rno!=ERROR_FILE_
27120 4e 4f 54 5f 46 4f 55 4e 44 20 26 26 20 6c 61 73  NOT_FOUND && las
27130 74 45 72 72 6e 6f 21 3d 45 52 52 4f 52 5f 50 41  tErrno!=ERROR_PA
27140 54 48 5f 4e 4f 54 5f 46 4f 55 4e 44 20 29 7b 0a  TH_NOT_FOUND ){.
27150 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
27160 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
27170 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
27180 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
27190 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53  ITE_IOERR_ACCESS
271a0 2c 20 6c 61 73 74 45 72 72 6e 6f 2c 20 22 77 69  , lastErrno, "wi
271b0 6e 41 63 63 65 73 73 22 2c 0a 20 20 20 20 20 20  nAccess",.      
271c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
271d0 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 29 3b       zFilename);
271e0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
271f0 20 20 20 20 20 20 61 74 74 72 20 3d 20 49 4e 56        attr = INV
27200 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42  ALID_FILE_ATTRIB
27210 55 54 45 53 3b 0a 20 20 20 20 20 20 7d 0a 20 20  UTES;.      }.  
27220 20 20 7d 0a 20 20 7d 0a 23 69 66 64 65 66 20 53    }.  }.#ifdef S
27230 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
27240 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20  ANSI.  else{.   
27250 20 61 74 74 72 20 3d 20 6f 73 47 65 74 46 69 6c   attr = osGetFil
27260 65 41 74 74 72 69 62 75 74 65 73 41 28 28 63 68  eAttributesA((ch
27270 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ar*)zConverted);
27280 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71  .  }.#endif.  sq
27290 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76  lite3_free(zConv
272a0 65 72 74 65 64 29 3b 0a 20 20 73 77 69 74 63 68  erted);.  switch
272b0 28 20 66 6c 61 67 73 20 29 7b 0a 20 20 20 20 63  ( flags ){.    c
272c0 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53  ase SQLITE_ACCES
272d0 53 5f 52 45 41 44 3a 0a 20 20 20 20 63 61 73 65  S_READ:.    case
272e0 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
272f0 58 49 53 54 53 3a 0a 20 20 20 20 20 20 72 63 20  XISTS:.      rc 
27300 3d 20 61 74 74 72 21 3d 49 4e 56 41 4c 49 44 5f  = attr!=INVALID_
27310 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 3b  FILE_ATTRIBUTES;
27320 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
27330 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43    case SQLITE_AC
27340 43 45 53 53 5f 52 45 41 44 57 52 49 54 45 3a 0a  CESS_READWRITE:.
27350 20 20 20 20 20 20 72 63 20 3d 20 61 74 74 72 21        rc = attr!
27360 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54  =INVALID_FILE_AT
27370 54 52 49 42 55 54 45 53 20 26 26 0a 20 20 20 20  TRIBUTES &&.    
27380 20 20 20 20 20 20 20 20 20 28 61 74 74 72 20 26           (attr &
27390 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f   FILE_ATTRIBUTE_
273a0 52 45 41 44 4f 4e 4c 59 29 3d 3d 30 3b 0a 20 20  READONLY)==0;.  
273b0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64      break;.    d
273c0 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 61 73  efault:.      as
273d0 73 65 72 74 28 21 22 49 6e 76 61 6c 69 64 20 66  sert(!"Invalid f
273e0 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 22 29 3b  lags argument");
273f0 0a 20 20 7d 0a 20 20 2a 70 52 65 73 4f 75 74 20  .  }.  *pResOut 
27400 3d 20 72 63 3b 0a 20 20 4f 53 54 52 41 43 45 28  = rc;.  OSTRACE(
27410 28 22 41 43 43 45 53 53 20 6e 61 6d 65 3d 25 73  ("ACCESS name=%s
27420 2c 20 70 52 65 73 4f 75 74 3d 25 70 2c 20 2a 70  , pResOut=%p, *p
27430 52 65 73 4f 75 74 3d 25 64 2c 20 72 63 3d 53 51  ResOut=%d, rc=SQ
27440 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20  LITE_OK\n",.    
27450 20 20 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65         zFilename
27460 2c 20 70 52 65 73 4f 75 74 2c 20 2a 70 52 65 73  , pResOut, *pRes
27470 4f 75 74 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  Out));.  return 
27480 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
27490 0a 2a 2a 20 52 65 74 75 72 6e 73 20 6e 6f 6e 2d  .** Returns non-
274a0 7a 65 72 6f 20 69 66 20 74 68 65 20 73 70 65 63  zero if the spec
274b0 69 66 69 65 64 20 70 61 74 68 20 6e 61 6d 65 20  ified path name 
274c0 73 74 61 72 74 73 20 77 69 74 68 20 61 20 64 72  starts with a dr
274d0 69 76 65 20 6c 65 74 74 65 72 0a 2a 2a 20 66 6f  ive letter.** fo
274e0 6c 6c 6f 77 65 64 20 62 79 20 61 20 63 6f 6c 6f  llowed by a colo
274f0 6e 20 63 68 61 72 61 63 74 65 72 2e 0a 2a 2f 0a  n character..*/.
27500 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 49  static BOOL winI
27510 73 44 72 69 76 65 4c 65 74 74 65 72 41 6e 64 43  sDriveLetterAndC
27520 6f 6c 6f 6e 28 0a 20 20 63 6f 6e 73 74 20 63 68  olon(.  const ch
27530 61 72 20 2a 7a 50 61 74 68 6e 61 6d 65 0a 29 7b  ar *zPathname.){
27540 0a 20 20 72 65 74 75 72 6e 20 28 20 73 71 6c 69  .  return ( sqli
27550 74 65 33 49 73 61 6c 70 68 61 28 7a 50 61 74 68  te3Isalpha(zPath
27560 6e 61 6d 65 5b 30 5d 29 20 26 26 20 7a 50 61 74  name[0]) && zPat
27570 68 6e 61 6d 65 5b 31 5d 3d 3d 27 3a 27 20 29 3b  hname[1]==':' );
27580 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
27590 73 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68  s non-zero if th
275a0 65 20 73 70 65 63 69 66 69 65 64 20 70 61 74 68  e specified path
275b0 20 6e 61 6d 65 20 73 68 6f 75 6c 64 20 62 65 20   name should be 
275c0 75 73 65 64 20 76 65 72 62 61 74 69 6d 2e 20 20  used verbatim.  
275d0 49 66 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 69  If.** non-zero i
275e0 73 20 72 65 74 75 72 6e 65 64 20 66 72 6f 6d 20  s returned from 
275f0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 74  this function, t
27600 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
27610 69 6f 6e 20 6d 75 73 74 20 73 69 6d 70 6c 79 0a  ion must simply.
27620 2a 2a 20 75 73 65 20 74 68 65 20 70 72 6f 76 69  ** use the provi
27630 64 65 64 20 70 61 74 68 20 6e 61 6d 65 20 76 65  ded path name ve
27640 72 62 61 74 69 6d 20 2d 4f 52 2d 20 72 65 73 6f  rbatim -OR- reso
27650 6c 76 65 20 69 74 20 69 6e 74 6f 20 61 20 66 75  lve it into a fu
27660 6c 6c 20 70 61 74 68 20 6e 61 6d 65 0a 2a 2a 20  ll path name.** 
27670 75 73 69 6e 67 20 74 68 65 20 47 65 74 46 75 6c  using the GetFul
27680 6c 50 61 74 68 4e 61 6d 65 20 57 69 6e 33 32 20  lPathName Win32 
27690 41 50 49 20 66 75 6e 63 74 69 6f 6e 20 28 69 66  API function (if
276a0 20 61 76 61 69 6c 61 62 6c 65 29 2e 0a 2a 2f 0a   available)..*/.
276b0 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 49  static BOOL winI
276c0 73 56 65 72 62 61 74 69 6d 50 61 74 68 6e 61 6d  sVerbatimPathnam
276d0 65 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  e(.  const char 
276e0 2a 7a 50 61 74 68 6e 61 6d 65 0a 29 7b 0a 20 20  *zPathname.){.  
276f0 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 70  /*.  ** If the p
27700 61 74 68 20 6e 61 6d 65 20 73 74 61 72 74 73 20  ath name starts 
27710 77 69 74 68 20 61 20 66 6f 72 77 61 72 64 20 73  with a forward s
27720 6c 61 73 68 20 6f 72 20 61 20 62 61 63 6b 73 6c  lash or a backsl
27730 61 73 68 2c 20 69 74 20 69 73 20 65 69 74 68 65  ash, it is eithe
27740 72 0a 20 20 2a 2a 20 61 20 6c 65 67 61 6c 20 55  r.  ** a legal U
27750 4e 43 20 6e 61 6d 65 2c 20 61 20 76 6f 6c 75 6d  NC name, a volum
27760 65 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 2c  e relative path,
27770 20 6f 72 20 61 6e 20 61 62 73 6f 6c 75 74 65 20   or an absolute 
27780 70 61 74 68 20 6e 61 6d 65 20 69 6e 20 74 68 65  path name in the
27790 0a 20 20 2a 2a 20 22 55 6e 69 78 22 20 66 6f 72  .  ** "Unix" for
277a0 6d 61 74 20 6f 6e 20 57 69 6e 64 6f 77 73 2e 20  mat on Windows. 
277b0 20 54 68 65 72 65 20 69 73 20 6e 6f 20 65 61 73   There is no eas
277c0 79 20 77 61 79 20 74 6f 20 64 69 66 66 65 72 65  y way to differe
277d0 6e 74 69 61 74 65 20 62 65 74 77 65 65 6e 0a 20  ntiate between. 
277e0 20 2a 2a 20 74 68 65 20 66 69 6e 61 6c 20 74 77   ** the final tw
277f0 6f 20 63 61 73 65 73 3b 20 74 68 65 72 65 66 6f  o cases; therefo
27800 72 65 2c 20 77 65 20 72 65 74 75 72 6e 20 74 68  re, we return th
27810 65 20 73 61 66 65 72 20 72 65 74 75 72 6e 20 76  e safer return v
27820 61 6c 75 65 20 6f 66 20 54 52 55 45 0a 20 20 2a  alue of TRUE.  *
27830 2a 20 73 6f 20 74 68 61 74 20 63 61 6c 6c 65 72  * so that caller
27840 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  s of this functi
27850 6f 6e 20 77 69 6c 6c 20 73 69 6d 70 6c 79 20 75  on will simply u
27860 73 65 20 69 74 20 76 65 72 62 61 74 69 6d 2e 0a  se it verbatim..
27870 20 20 2a 2f 0a 20 20 69 66 20 28 20 77 69 6e 49    */.  if ( winI
27880 73 44 69 72 53 65 70 28 7a 50 61 74 68 6e 61 6d  sDirSep(zPathnam
27890 65 5b 30 5d 29 20 29 7b 0a 20 20 20 20 72 65 74  e[0]) ){.    ret
278a0 75 72 6e 20 54 52 55 45 3b 0a 20 20 7d 0a 0a 20  urn TRUE;.  }.. 
278b0 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20   /*.  ** If the 
278c0 70 61 74 68 20 6e 61 6d 65 20 73 74 61 72 74 73  path name starts
278d0 20 77 69 74 68 20 61 20 6c 65 74 74 65 72 20 61   with a letter a
278e0 6e 64 20 61 20 63 6f 6c 6f 6e 20 69 74 20 69 73  nd a colon it is
278f0 20 65 69 74 68 65 72 20 61 20 76 6f 6c 75 6d 65   either a volume
27900 0a 20 20 2a 2a 20 72 65 6c 61 74 69 76 65 20 70  .  ** relative p
27910 61 74 68 20 6f 72 20 61 6e 20 61 62 73 6f 6c 75  ath or an absolu
27920 74 65 20 70 61 74 68 2e 20 20 43 61 6c 6c 65 72  te path.  Caller
27930 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  s of this functi
27940 6f 6e 20 6d 75 73 74 20 6e 6f 74 0a 20 20 2a 2a  on must not.  **
27950 20 61 74 74 65 6d 70 74 20 74 6f 20 74 72 65 61   attempt to trea
27960 74 20 69 74 20 61 73 20 61 20 72 65 6c 61 74 69  t it as a relati
27970 76 65 20 70 61 74 68 20 6e 61 6d 65 20 28 69 2e  ve path name (i.
27980 65 2e 20 74 68 65 79 20 73 68 6f 75 6c 64 20 73  e. they should s
27990 69 6d 70 6c 79 20 75 73 65 0a 20 20 2a 2a 20 69  imply use.  ** i
279a0 74 20 76 65 72 62 61 74 69 6d 29 2e 0a 20 20 2a  t verbatim)..  *
279b0 2f 0a 20 20 69 66 20 28 20 77 69 6e 49 73 44 72  /.  if ( winIsDr
279c0 69 76 65 4c 65 74 74 65 72 41 6e 64 43 6f 6c 6f  iveLetterAndColo
279d0 6e 28 7a 50 61 74 68 6e 61 6d 65 29 20 29 7b 0a  n(zPathname) ){.
279e0 20 20 20 20 72 65 74 75 72 6e 20 54 52 55 45 3b      return TRUE;
279f0 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
27a00 49 66 20 77 65 20 67 65 74 20 74 6f 20 74 68 69  If we get to thi
27a10 73 20 70 6f 69 6e 74 2c 20 74 68 65 20 70 61 74  s point, the pat
27a20 68 20 6e 61 6d 65 20 73 68 6f 75 6c 64 20 61 6c  h name should al
27a30 6d 6f 73 74 20 63 65 72 74 61 69 6e 6c 79 20 62  most certainly b
27a40 65 20 61 20 70 75 72 65 6c 79 0a 20 20 2a 2a 20  e a purely.  ** 
27a50 72 65 6c 61 74 69 76 65 20 6f 6e 65 20 28 69 2e  relative one (i.
27a60 65 2e 20 6e 6f 74 20 61 20 55 4e 43 20 6e 61 6d  e. not a UNC nam
27a70 65 2c 20 6e 6f 74 20 61 62 73 6f 6c 75 74 65 2c  e, not absolute,
27a80 20 61 6e 64 20 6e 6f 74 20 76 6f 6c 75 6d 65 20   and not volume 
27a90 72 65 6c 61 74 69 76 65 29 2e 0a 20 20 2a 2f 0a  relative)..  */.
27aa0 20 20 72 65 74 75 72 6e 20 46 41 4c 53 45 3b 0a    return FALSE;.
27ab0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 61 20  }../*.** Turn a 
27ac0 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d  relative pathnam
27ad0 65 20 69 6e 74 6f 20 61 20 66 75 6c 6c 20 70 61  e into a full pa
27ae0 74 68 6e 61 6d 65 2e 20 20 57 72 69 74 65 20 74  thname.  Write t
27af0 68 65 20 66 75 6c 6c 0a 2a 2a 20 70 61 74 68 6e  he full.** pathn
27b00 61 6d 65 20 69 6e 74 6f 20 7a 4f 75 74 5b 5d 2e  ame into zOut[].
27b10 20 20 7a 4f 75 74 5b 5d 20 77 69 6c 6c 20 62 65    zOut[] will be
27b20 20 61 74 20 6c 65 61 73 74 20 70 56 66 73 2d 3e   at least pVfs->
27b30 6d 78 50 61 74 68 6e 61 6d 65 0a 2a 2a 20 62 79  mxPathname.** by
27b40 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a  tes in size..*/.
27b50 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 46 75  static int winFu
27b60 6c 6c 50 61 74 68 6e 61 6d 65 28 0a 20 20 73 71  llPathname(.  sq
27b70 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
27b80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
27b90 6f 69 6e 74 65 72 20 74 6f 20 76 66 73 20 6f 62  ointer to vfs ob
27ba0 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ject */.  const 
27bb0 63 68 61 72 20 2a 7a 52 65 6c 61 74 69 76 65 2c  char *zRelative,
27bc0 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 73 69          /* Possi
27bd0 62 6c 79 20 72 65 6c 61 74 69 76 65 20 69 6e 70  bly relative inp
27be0 75 74 20 70 61 74 68 20 2a 2f 0a 20 20 69 6e 74  ut path */.  int
27bf0 20 6e 46 75 6c 6c 2c 20 20 20 20 20 20 20 20 20   nFull,         
27c00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
27c10 7a 65 20 6f 66 20 6f 75 74 70 75 74 20 62 75 66  ze of output buf
27c20 66 65 72 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  fer in bytes */.
27c30 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 20 20 20    char *zFull   
27c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27c50 2f 2a 20 4f 75 74 70 75 74 20 62 75 66 66 65 72  /* Output buffer
27c60 20 2a 2f 0a 29 7b 0a 0a 23 69 66 20 64 65 66 69   */.){..#if defi
27c70 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a  ned(__CYGWIN__).
27c80 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
27c90 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
27ca0 5f 45 52 52 4f 52 20 29 3b 0a 20 20 55 4e 55 53  _ERROR );.  UNUS
27cb0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 46 75  ED_PARAMETER(nFu
27cc0 6c 6c 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  ll);.  assert( n
27cd0 46 75 6c 6c 3e 3d 70 56 66 73 2d 3e 6d 78 50 61  Full>=pVfs->mxPa
27ce0 74 68 6e 61 6d 65 20 29 3b 0a 20 20 69 66 20 28  thname );.  if (
27cf0 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69   sqlite3_data_di
27d00 72 65 63 74 6f 72 79 20 26 26 20 21 77 69 6e 49  rectory && !winI
27d10 73 56 65 72 62 61 74 69 6d 50 61 74 68 6e 61 6d  sVerbatimPathnam
27d20 65 28 7a 52 65 6c 61 74 69 76 65 29 20 29 7b 0a  e(zRelative) ){.
27d30 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 4e 4f      /*.    ** NO
27d40 54 45 3a 20 57 65 20 61 72 65 20 64 65 61 6c 69  TE: We are deali
27d50 6e 67 20 77 69 74 68 20 61 20 72 65 6c 61 74 69  ng with a relati
27d60 76 65 20 70 61 74 68 20 6e 61 6d 65 20 61 6e 64  ve path name and
27d70 20 74 68 65 20 64 61 74 61 0a 20 20 20 20 2a 2a   the data.    **
27d80 20 20 20 20 20 20 20 64 69 72 65 63 74 6f 72 79         directory
27d90 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20 20   has been set.  
27da0 54 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69  Therefore, use i
27db0 74 20 61 73 20 74 68 65 20 62 61 73 69 73 0a 20  t as the basis. 
27dc0 20 20 20 2a 2a 20 20 20 20 20 20 20 66 6f 72 20     **       for 
27dd0 63 6f 6e 76 65 72 74 69 6e 67 20 74 68 65 20 72  converting the r
27de0 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61 6d  elative path nam
27df0 65 20 74 6f 20 61 6e 20 61 62 73 6f 6c 75 74 65  e to an absolute
27e00 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 6f 6e  .    **       on
27e10 65 20 62 79 20 70 72 65 70 65 6e 64 69 6e 67 20  e by prepending 
27e20 74 68 65 20 64 61 74 61 20 64 69 72 65 63 74 6f  the data directo
27e30 72 79 20 61 6e 64 20 61 20 73 6c 61 73 68 2e 0a  ry and a slash..
27e40 20 20 20 20 2a 2f 0a 20 20 20 20 63 68 61 72 20      */.    char 
27e50 2a 7a 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 4d  *zOut = sqlite3M
27e60 61 6c 6c 6f 63 5a 65 72 6f 28 20 70 56 66 73 2d  allocZero( pVfs-
27e70 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 20 29 3b  >mxPathname+1 );
27e80 0a 20 20 20 20 69 66 28 20 21 7a 4f 75 74 20 29  .    if( !zOut )
27e90 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
27ea0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
27eb0 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  M;.    }.    if(
27ec0 20 63 79 67 77 69 6e 5f 63 6f 6e 76 5f 70 61 74   cygwin_conv_pat
27ed0 68 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 28  h(.            (
27ee0 6f 73 49 73 4e 54 28 29 20 3f 20 43 43 50 5f 50  osIsNT() ? CCP_P
27ef0 4f 53 49 58 5f 54 4f 5f 57 49 4e 5f 57 20 3a 20  OSIX_TO_WIN_W : 
27f00 43 43 50 5f 50 4f 53 49 58 5f 54 4f 5f 57 49 4e  CCP_POSIX_TO_WIN
27f10 5f 41 29 20 7c 0a 20 20 20 20 20 20 20 20 20 20  _A) |.          
27f20 20 20 43 43 50 5f 52 45 4c 41 54 49 56 45 2c 20    CCP_RELATIVE, 
27f30 7a 52 65 6c 61 74 69 76 65 2c 20 7a 4f 75 74 2c  zRelative, zOut,
27f40 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
27f50 65 2b 31 29 3c 30 20 29 7b 0a 20 20 20 20 20 20  e+1)<0 ){.      
27f60 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 75  sqlite3_free(zOu
27f70 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  t);.      return
27f80 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
27f90 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 43 4f 4e  ITE_CANTOPEN_CON
27fa0 56 50 41 54 48 2c 20 28 44 57 4f 52 44 29 65 72  VPATH, (DWORD)er
27fb0 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
27fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
27fd0 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 31 22  inFullPathname1"
27fe0 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20  , zRelative);.  
27ff0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
28000 68 61 72 20 2a 7a 55 74 66 38 20 3d 20 77 69 6e  har *zUtf8 = win
28010 43 6f 6e 76 65 72 74 54 6f 55 74 66 38 46 69 6c  ConvertToUtf8Fil
28020 65 6e 61 6d 65 28 7a 4f 75 74 29 3b 0a 20 20 20  ename(zOut);.   
28030 20 20 20 69 66 28 20 21 7a 55 74 66 38 20 29 7b     if( !zUtf8 ){
28040 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
28050 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20  _free(zOut);.   
28060 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
28070 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a  TE_IOERR_NOMEM;.
28080 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
28090 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d  lite3_snprintf(M
280a0 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e  IN(nFull, pVfs->
280b0 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75  mxPathname), zFu
280c0 6c 6c 2c 20 22 25 73 25 63 25 73 22 2c 0a 20 20  ll, "%s%c%s",.  
280d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
280e0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64 61 74       sqlite3_dat
280f0 61 5f 64 69 72 65 63 74 6f 72 79 2c 20 77 69 6e  a_directory, win
28100 47 65 74 44 69 72 53 65 70 28 29 2c 20 7a 55 74  GetDirSep(), zUt
28110 66 38 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  f8);.      sqlit
28120 65 33 5f 66 72 65 65 28 7a 55 74 66 38 29 3b 0a  e3_free(zUtf8);.
28130 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
28140 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20 7d 0a  ee(zOut);.    }.
28150 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61    }else{.    cha
28160 72 20 2a 7a 4f 75 74 20 3d 20 73 71 6c 69 74 65  r *zOut = sqlite
28170 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 70 56 66  3MallocZero( pVf
28180 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 20  s->mxPathname+1 
28190 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 4f 75 74  );.    if( !zOut
281a0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
281b0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
281c0 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  MEM;.    }.    i
281d0 66 28 20 63 79 67 77 69 6e 5f 63 6f 6e 76 5f 70  f( cygwin_conv_p
281e0 61 74 68 28 0a 20 20 20 20 20 20 20 20 20 20 20  ath(.           
281f0 20 28 6f 73 49 73 4e 54 28 29 20 3f 20 43 43 50   (osIsNT() ? CCP
28200 5f 50 4f 53 49 58 5f 54 4f 5f 57 49 4e 5f 57 20  _POSIX_TO_WIN_W 
28210 3a 20 43 43 50 5f 50 4f 53 49 58 5f 54 4f 5f 57  : CCP_POSIX_TO_W
28220 49 4e 5f 41 29 2c 0a 20 20 20 20 20 20 20 20 20  IN_A),.         
28230 20 20 20 7a 52 65 6c 61 74 69 76 65 2c 20 7a 4f     zRelative, zO
28240 75 74 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  ut, pVfs->mxPath
28250 6e 61 6d 65 2b 31 29 3c 30 20 29 7b 0a 20 20 20  name+1)<0 ){.   
28260 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
28270 7a 4f 75 74 29 3b 0a 20 20 20 20 20 20 72 65 74  zOut);.      ret
28280 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  urn winLogError(
28290 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
282a0 43 4f 4e 56 50 41 54 48 2c 20 28 44 57 4f 52 44  CONVPATH, (DWORD
282b0 29 65 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  )errno,.        
282c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
282d0 20 22 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d   "winFullPathnam
282e0 65 32 22 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b  e2", zRelative);
282f0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
28300 20 20 63 68 61 72 20 2a 7a 55 74 66 38 20 3d 20    char *zUtf8 = 
28310 77 69 6e 43 6f 6e 76 65 72 74 54 6f 55 74 66 38  winConvertToUtf8
28320 46 69 6c 65 6e 61 6d 65 28 7a 4f 75 74 29 3b 0a  Filename(zOut);.
28330 20 20 20 20 20 20 69 66 28 20 21 7a 55 74 66 38        if( !zUtf8
28340 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
28350 74 65 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a  te3_free(zOut);.
28360 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
28370 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
28380 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  M;.      }.     
28390 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
283a0 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66  f(MIN(nFull, pVf
283b0 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20  s->mxPathname), 
283c0 7a 46 75 6c 6c 2c 20 22 25 73 22 2c 20 7a 55 74  zFull, "%s", zUt
283d0 66 38 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  f8);.      sqlit
283e0 65 33 5f 66 72 65 65 28 7a 55 74 66 38 29 3b 0a  e3_free(zUtf8);.
283f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
28400 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20 7d 0a  ee(zOut);.    }.
28410 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
28420 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 0a  ITE_OK;.#endif..
28430 23 69 66 20 28 53 51 4c 49 54 45 5f 4f 53 5f 57  #if (SQLITE_OS_W
28440 49 4e 43 45 20 7c 7c 20 53 51 4c 49 54 45 5f 4f  INCE || SQLITE_O
28450 53 5f 57 49 4e 52 54 29 20 26 26 20 21 64 65 66  S_WINRT) && !def
28460 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29  ined(__CYGWIN__)
28470 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
28480 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
28490 45 5f 45 52 52 4f 52 20 29 3b 0a 20 20 2f 2a 20  E_ERROR );.  /* 
284a0 57 69 6e 43 45 20 68 61 73 20 6e 6f 20 63 6f 6e  WinCE has no con
284b0 63 65 70 74 20 6f 66 20 61 20 72 65 6c 61 74 69  cept of a relati
284c0 76 65 20 70 61 74 68 6e 61 6d 65 2c 20 6f 72 20  ve pathname, or 
284d0 73 6f 20 49 20 61 6d 20 74 6f 6c 64 2e 20 2a 2f  so I am told. */
284e0 0a 20 20 2f 2a 20 57 69 6e 52 54 20 68 61 73 20  .  /* WinRT has 
284f0 6e 6f 20 77 61 79 20 74 6f 20 63 6f 6e 76 65 72  no way to conver
28500 74 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74  t a relative pat
28510 68 20 74 6f 20 61 6e 20 61 62 73 6f 6c 75 74 65  h to an absolute
28520 20 6f 6e 65 2e 20 2a 2f 0a 20 20 69 66 20 28 20   one. */.  if ( 
28530 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72  sqlite3_data_dir
28540 65 63 74 6f 72 79 20 26 26 20 21 77 69 6e 49 73  ectory && !winIs
28550 56 65 72 62 61 74 69 6d 50 61 74 68 6e 61 6d 65  VerbatimPathname
28560 28 7a 52 65 6c 61 74 69 76 65 29 20 29 7b 0a 20  (zRelative) ){. 
28570 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 4e 4f 54     /*.    ** NOT
28580 45 3a 20 57 65 20 61 72 65 20 64 65 61 6c 69 6e  E: We are dealin
28590 67 20 77 69 74 68 20 61 20 72 65 6c 61 74 69 76  g with a relativ
285a0 65 20 70 61 74 68 20 6e 61 6d 65 20 61 6e 64 20  e path name and 
285b0 74 68 65 20 64 61 74 61 0a 20 20 20 20 2a 2a 20  the data.    ** 
285c0 20 20 20 20 20 20 64 69 72 65 63 74 6f 72 79 20        directory 
285d0 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20 20 54  has been set.  T
285e0 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74  herefore, use it
285f0 20 61 73 20 74 68 65 20 62 61 73 69 73 0a 20 20   as the basis.  
28600 20 20 2a 2a 20 20 20 20 20 20 20 66 6f 72 20 63    **       for c
28610 6f 6e 76 65 72 74 69 6e 67 20 74 68 65 20 72 65  onverting the re
28620 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61 6d 65  lative path name
28630 20 74 6f 20 61 6e 20 61 62 73 6f 6c 75 74 65 0a   to an absolute.
28640 20 20 20 20 2a 2a 20 20 20 20 20 20 20 6f 6e 65      **       one
28650 20 62 79 20 70 72 65 70 65 6e 64 69 6e 67 20 74   by prepending t
28660 68 65 20 64 61 74 61 20 64 69 72 65 63 74 6f 72  he data director
28670 79 20 61 6e 64 20 61 20 62 61 63 6b 73 6c 61 73  y and a backslas
28680 68 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  h..    */.    sq
28690 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d  lite3_snprintf(M
286a0 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e  IN(nFull, pVfs->
286b0 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75  mxPathname), zFu
286c0 6c 6c 2c 20 22 25 73 25 63 25 73 22 2c 0a 20 20  ll, "%s%c%s",.  
286d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
286e0 20 20 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f     sqlite3_data_
286f0 64 69 72 65 63 74 6f 72 79 2c 20 77 69 6e 47 65  directory, winGe
28700 74 44 69 72 53 65 70 28 29 2c 20 7a 52 65 6c 61  tDirSep(), zRela
28710 74 69 76 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  tive);.  }else{.
28720 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
28730 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20  intf(MIN(nFull, 
28740 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
28750 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 22 2c 20  ), zFull, "%s", 
28760 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 7d 0a  zRelative);.  }.
28770 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
28780 4f 4b 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  OK;.#endif..#if 
28790 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45  !SQLITE_OS_WINCE
287a0 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57   && !SQLITE_OS_W
287b0 49 4e 52 54 20 26 26 20 21 64 65 66 69 6e 65 64  INRT && !defined
287c0 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20 44  (__CYGWIN__).  D
287d0 57 4f 52 44 20 6e 42 79 74 65 3b 0a 20 20 76 6f  WORD nByte;.  vo
287e0 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 0a  id *zConverted;.
287f0 20 20 63 68 61 72 20 2a 7a 4f 75 74 3b 0a 0a 20    char *zOut;.. 
28800 20 2f 2a 20 49 66 20 74 68 69 73 20 70 61 74 68   /* If this path
28810 20 6e 61 6d 65 20 62 65 67 69 6e 73 20 77 69 74   name begins wit
28820 68 20 22 2f 58 3a 22 2c 20 77 68 65 72 65 20 22  h "/X:", where "
28830 58 22 20 69 73 20 61 6e 79 20 61 6c 70 68 61 62  X" is any alphab
28840 65 74 69 63 0a 20 20 2a 2a 20 63 68 61 72 61 63  etic.  ** charac
28850 74 65 72 2c 20 64 69 73 63 61 72 64 20 74 68 65  ter, discard the
28860 20 69 6e 69 74 69 61 6c 20 22 2f 22 20 66 72 6f   initial "/" fro
28870 6d 20 74 68 65 20 70 61 74 68 6e 61 6d 65 2e 0a  m the pathname..
28880 20 20 2a 2f 0a 20 20 69 66 28 20 7a 52 65 6c 61    */.  if( zRela
28890 74 69 76 65 5b 30 5d 3d 3d 27 2f 27 20 26 26 20  tive[0]=='/' && 
288a0 77 69 6e 49 73 44 72 69 76 65 4c 65 74 74 65 72  winIsDriveLetter
288b0 41 6e 64 43 6f 6c 6f 6e 28 7a 52 65 6c 61 74 69  AndColon(zRelati
288c0 76 65 2b 31 29 20 29 7b 0a 20 20 20 20 7a 52 65  ve+1) ){.    zRe
288d0 6c 61 74 69 76 65 2b 2b 3b 0a 20 20 7d 0a 0a 20  lative++;.  }.. 
288e0 20 2f 2a 20 49 74 27 73 20 6f 64 64 20 74 6f 20   /* It's odd to 
288f0 73 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65  simulate an io-e
28900 72 72 6f 72 20 68 65 72 65 2c 20 62 75 74 20 72  rror here, but r
28910 65 61 6c 6c 79 20 74 68 69 73 20 69 73 20 6a 75  eally this is ju
28920 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68  st.  ** using th
28930 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61  e io-error infra
28940 73 74 72 75 63 74 75 72 65 20 74 6f 20 74 65 73  structure to tes
28950 74 20 74 68 61 74 20 53 51 4c 69 74 65 20 68 61  t that SQLite ha
28960 6e 64 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a 20  ndles this.  ** 
28970 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67  function failing
28980 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
28990 63 6f 75 6c 64 20 66 61 69 6c 20 69 66 2c 20 66  could fail if, f
289a0 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 0a  or example, the.
289b0 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 77 6f 72    ** current wor
289c0 6b 69 6e 67 20 64 69 72 65 63 74 6f 72 79 20 68  king directory h
289d0 61 73 20 62 65 65 6e 20 75 6e 6c 69 6e 6b 65 64  as been unlinked
289e0 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74  ..  */.  Simulat
289f0 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
28a00 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b   SQLITE_ERROR );
28a10 0a 20 20 69 66 20 28 20 73 71 6c 69 74 65 33 5f  .  if ( sqlite3_
28a20 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79 20 26  data_directory &
28a30 26 20 21 77 69 6e 49 73 56 65 72 62 61 74 69 6d  & !winIsVerbatim
28a40 50 61 74 68 6e 61 6d 65 28 7a 52 65 6c 61 74 69  Pathname(zRelati
28a50 76 65 29 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20  ve) ){.    /*.  
28a60 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 65 20 61 72    ** NOTE: We ar
28a70 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61  e dealing with a
28a80 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e   relative path n
28a90 61 6d 65 20 61 6e 64 20 74 68 65 20 64 61 74 61  ame and the data
28aa0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 64 69  .    **       di
28ab0 72 65 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e  rectory has been
28ac0 20 73 65 74 2e 20 20 54 68 65 72 65 66 6f 72 65   set.  Therefore
28ad0 2c 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20  , use it as the 
28ae0 62 61 73 69 73 0a 20 20 20 20 2a 2a 20 20 20 20  basis.    **    
28af0 20 20 20 66 6f 72 20 63 6f 6e 76 65 72 74 69 6e     for convertin
28b00 67 20 74 68 65 20 72 65 6c 61 74 69 76 65 20 70  g the relative p
28b10 61 74 68 20 6e 61 6d 65 20 74 6f 20 61 6e 20 61  ath name to an a
28b20 62 73 6f 6c 75 74 65 0a 20 20 20 20 2a 2a 20 20  bsolute.    **  
28b30 20 20 20 20 20 6f 6e 65 20 62 79 20 70 72 65 70       one by prep
28b40 65 6e 64 69 6e 67 20 74 68 65 20 64 61 74 61 20  ending the data 
28b50 64 69 72 65 63 74 6f 72 79 20 61 6e 64 20 61 20  directory and a 
28b60 62 61 63 6b 73 6c 61 73 68 2e 0a 20 20 20 20 2a  backslash..    *
28b70 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  /.    sqlite3_sn
28b80 70 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c  printf(MIN(nFull
28b90 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  , pVfs->mxPathna
28ba0 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 25  me), zFull, "%s%
28bb0 63 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20  c%s",.          
28bc0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
28bd0 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72  e3_data_director
28be0 79 2c 20 77 69 6e 47 65 74 44 69 72 53 65 70 28  y, winGetDirSep(
28bf0 29 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20  ), zRelative);. 
28c00 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
28c10 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 7a 43 6f 6e 76  _OK;.  }.  zConv
28c20 65 72 74 65 64 20 3d 20 77 69 6e 43 6f 6e 76 65  erted = winConve
28c30 72 74 46 72 6f 6d 55 74 66 38 46 69 6c 65 6e 61  rtFromUtf8Filena
28c40 6d 65 28 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20  me(zRelative);. 
28c50 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d   if( zConverted=
28c60 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
28c70 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
28c80 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f  MEM;.  }.  if( o
28c90 73 49 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 4c  sIsNT() ){.    L
28ca0 50 57 53 54 52 20 7a 54 65 6d 70 3b 0a 20 20 20  PWSTR zTemp;.   
28cb0 20 6e 42 79 74 65 20 3d 20 6f 73 47 65 74 46 75   nByte = osGetFu
28cc0 6c 6c 50 61 74 68 4e 61 6d 65 57 28 28 4c 50 43  llPathNameW((LPC
28cd0 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c  WSTR)zConverted,
28ce0 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69   0, 0, 0);.    i
28cf0 66 28 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20  f( nByte==0 ){. 
28d00 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
28d10 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
28d20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c       return winL
28d30 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43  ogError(SQLITE_C
28d40 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48  ANTOPEN_FULLPATH
28d50 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  , osGetLastError
28d60 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  (),.            
28d70 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
28d80 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 31 22 2c  nFullPathname1",
28d90 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 20   zRelative);.   
28da0 20 7d 0a 20 20 20 20 6e 42 79 74 65 20 2b 3d 20   }.    nByte += 
28db0 33 3b 0a 20 20 20 20 7a 54 65 6d 70 20 3d 20 73  3;.    zTemp = s
28dc0 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
28dd0 28 20 6e 42 79 74 65 2a 73 69 7a 65 6f 66 28 7a  ( nByte*sizeof(z
28de0 54 65 6d 70 5b 30 5d 29 20 29 3b 0a 20 20 20 20  Temp[0]) );.    
28df0 69 66 28 20 7a 54 65 6d 70 3d 3d 30 20 29 7b 0a  if( zTemp==0 ){.
28e00 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
28e10 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
28e20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
28e30 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b  ITE_IOERR_NOMEM;
28e40 0a 20 20 20 20 7d 0a 20 20 20 20 6e 42 79 74 65  .    }.    nByte
28e50 20 3d 20 6f 73 47 65 74 46 75 6c 6c 50 61 74 68   = osGetFullPath
28e60 4e 61 6d 65 57 28 28 4c 50 43 57 53 54 52 29 7a  NameW((LPCWSTR)z
28e70 43 6f 6e 76 65 72 74 65 64 2c 20 6e 42 79 74 65  Converted, nByte
28e80 2c 20 7a 54 65 6d 70 2c 20 30 29 3b 0a 20 20 20  , zTemp, 0);.   
28e90 20 69 66 28 20 6e 42 79 74 65 3d 3d 30 20 29 7b   if( nByte==0 ){
28ea0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
28eb0 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
28ec0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
28ed0 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20  ree(zTemp);.    
28ee0 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45    return winLogE
28ef0 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54  rror(SQLITE_CANT
28f00 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48 2c 20 6f  OPEN_FULLPATH, o
28f10 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c  sGetLastError(),
28f20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
28f30 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 46 75            "winFu
28f40 6c 6c 50 61 74 68 6e 61 6d 65 32 22 2c 20 7a 52  llPathname2", zR
28f50 65 6c 61 74 69 76 65 29 3b 0a 20 20 20 20 7d 0a  elative);.    }.
28f60 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
28f70 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
28f80 20 20 7a 4f 75 74 20 3d 20 77 69 6e 55 6e 69 63    zOut = winUnic
28f90 6f 64 65 54 6f 55 74 66 38 28 7a 54 65 6d 70 29  odeToUtf8(zTemp)
28fa0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
28fb0 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20 7d 0a 23  ee(zTemp);.  }.#
28fc0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  ifdef SQLITE_WIN
28fd0 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c  32_HAS_ANSI.  el
28fe0 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54  se{.    char *zT
28ff0 65 6d 70 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d  emp;.    nByte =
29000 20 6f 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61   osGetFullPathNa
29010 6d 65 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76  meA((char*)zConv
29020 65 72 74 65 64 2c 20 30 2c 20 30 2c 20 30 29 3b  erted, 0, 0, 0);
29030 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65 3d 3d  .    if( nByte==
29040 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
29050 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74  e3_free(zConvert
29060 65 64 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ed);.      retur
29070 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  n winLogError(SQ
29080 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55  LITE_CANTOPEN_FU
29090 4c 4c 50 41 54 48 2c 20 6f 73 47 65 74 4c 61 73  LLPATH, osGetLas
290a0 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20  tError(),.      
290b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
290c0 20 20 20 22 77 69 6e 46 75 6c 6c 50 61 74 68 6e     "winFullPathn
290d0 61 6d 65 33 22 2c 20 7a 52 65 6c 61 74 69 76 65  ame3", zRelative
290e0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 42 79  );.    }.    nBy
290f0 74 65 20 2b 3d 20 33 3b 0a 20 20 20 20 7a 54 65  te += 3;.    zTe
29100 6d 70 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  mp = sqlite3Mall
29110 6f 63 5a 65 72 6f 28 20 6e 42 79 74 65 2a 73 69  ocZero( nByte*si
29120 7a 65 6f 66 28 7a 54 65 6d 70 5b 30 5d 29 20 29  zeof(zTemp[0]) )
29130 3b 0a 20 20 20 20 69 66 28 20 7a 54 65 6d 70 3d  ;.    if( zTemp=
29140 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
29150 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
29160 74 65 64 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ted);.      retu
29170 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
29180 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20  NOMEM;.    }.   
29190 20 6e 42 79 74 65 20 3d 20 6f 73 47 65 74 46 75   nByte = osGetFu
291a0 6c 6c 50 61 74 68 4e 61 6d 65 41 28 28 63 68 61  llPathNameA((cha
291b0 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 6e  r*)zConverted, n
291c0 42 79 74 65 2c 20 7a 54 65 6d 70 2c 20 30 29 3b  Byte, zTemp, 0);
291d0 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65 3d 3d  .    if( nByte==
291e0 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
291f0 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74  e3_free(zConvert
29200 65 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ed);.      sqlit
29210 65 33 5f 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a  e3_free(zTemp);.
29220 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e        return win
29230 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
29240 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54  CANTOPEN_FULLPAT
29250 48 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f  H, osGetLastErro
29260 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  r(),.           
29270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
29280 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 34 22  inFullPathname4"
29290 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20  , zRelative);.  
292a0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
292b0 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
292c0 3b 0a 20 20 20 20 7a 4f 75 74 20 3d 20 73 71 6c  ;.    zOut = sql
292d0 69 74 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f  ite3_win32_mbcs_
292e0 74 6f 5f 75 74 66 38 28 7a 54 65 6d 70 29 3b 0a  to_utf8(zTemp);.
292f0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
29300 28 7a 54 65 6d 70 29 3b 0a 20 20 7d 0a 23 65 6e  (zTemp);.  }.#en
29310 64 69 66 0a 20 20 69 66 28 20 7a 4f 75 74 20 29  dif.  if( zOut )
29320 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  {.    sqlite3_sn
29330 70 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c  printf(MIN(nFull
29340 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  , pVfs->mxPathna
29350 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 22  me), zFull, "%s"
29360 2c 20 7a 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c  , zOut);.    sql
29370 69 74 65 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b  ite3_free(zOut);
29380 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
29390 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  TE_OK;.  }else{.
293a0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
293b0 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20  E_IOERR_NOMEM;. 
293c0 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 69 66   }.#endif.}..#if
293d0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
293e0 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a  _LOAD_EXTENSION.
293f0 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65 73  /*.** Interfaces
29400 20 66 6f 72 20 6f 70 65 6e 69 6e 67 20 61 20 73   for opening a s
29410 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20 66  hared library, f
29420 69 6e 64 69 6e 67 20 65 6e 74 72 79 20 70 6f 69  inding entry poi
29430 6e 74 73 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68  nts.** within th
29440 65 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79  e shared library
29450 2c 20 61 6e 64 20 63 6c 6f 73 69 6e 67 20 74 68  , and closing th
29460 65 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79  e shared library
29470 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
29480 20 2a 77 69 6e 44 6c 4f 70 65 6e 28 73 71 6c 69   *winDlOpen(sqli
29490 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 63  te3_vfs *pVfs, c
294a0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
294b0 6e 61 6d 65 29 7b 0a 20 20 48 41 4e 44 4c 45 20  name){.  HANDLE 
294c0 68 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  h;.#if defined(_
294d0 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20 69 6e 74  _CYGWIN__).  int
294e0 20 6e 46 75 6c 6c 20 3d 20 70 56 66 73 2d 3e 6d   nFull = pVfs->m
294f0 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 63  xPathname+1;.  c
29500 68 61 72 20 2a 7a 46 75 6c 6c 20 3d 20 73 71 6c  har *zFull = sql
29510 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20  ite3MallocZero( 
29520 6e 46 75 6c 6c 20 29 3b 0a 20 20 76 6f 69 64 20  nFull );.  void 
29530 2a 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 30 3b  *zConverted = 0;
29540 0a 20 20 69 66 28 20 7a 46 75 6c 6c 3d 3d 30 20  .  if( zFull==0 
29550 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  ){.    OSTRACE((
29560 22 44 4c 4f 50 45 4e 20 6e 61 6d 65 3d 25 73 2c  "DLOPEN name=%s,
29570 20 68 61 6e 64 6c 65 3d 25 70 5c 6e 22 2c 20 7a   handle=%p\n", z
29580 46 69 6c 65 6e 61 6d 65 2c 20 28 76 6f 69 64 2a  Filename, (void*
29590 29 30 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  )0));.    return
295a0 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 77 69   0;.  }.  if( wi
295b0 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56  nFullPathname(pV
295c0 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e  fs, zFilename, n
295d0 46 75 6c 6c 2c 20 7a 46 75 6c 6c 29 21 3d 53 51  Full, zFull)!=SQ
295e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
295f0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c  qlite3_free(zFul
29600 6c 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28  l);.    OSTRACE(
29610 28 22 44 4c 4f 50 45 4e 20 6e 61 6d 65 3d 25 73  ("DLOPEN name=%s
29620 2c 20 68 61 6e 64 6c 65 3d 25 70 5c 6e 22 2c 20  , handle=%p\n", 
29630 7a 46 69 6c 65 6e 61 6d 65 2c 20 28 76 6f 69 64  zFilename, (void
29640 2a 29 30 29 29 3b 0a 20 20 20 20 72 65 74 75 72  *)0));.    retur
29650 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 43 6f 6e 76  n 0;.  }.  zConv
29660 65 72 74 65 64 20 3d 20 77 69 6e 43 6f 6e 76 65  erted = winConve
29670 72 74 46 72 6f 6d 55 74 66 38 46 69 6c 65 6e 61  rtFromUtf8Filena
29680 6d 65 28 7a 46 75 6c 6c 29 3b 0a 20 20 73 71 6c  me(zFull);.  sql
29690 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 29  ite3_free(zFull)
296a0 3b 0a 23 65 6c 73 65 0a 20 20 76 6f 69 64 20 2a  ;.#else.  void *
296b0 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77 69 6e  zConverted = win
296c0 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66 38 46  ConvertFromUtf8F
296d0 69 6c 65 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d  ilename(zFilenam
296e0 65 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  e);.  UNUSED_PAR
296f0 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 23 65  AMETER(pVfs);.#e
29700 6e 64 69 66 0a 20 20 69 66 28 20 7a 43 6f 6e 76  ndif.  if( zConv
29710 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  erted==0 ){.    
29720 4f 53 54 52 41 43 45 28 28 22 44 4c 4f 50 45 4e  OSTRACE(("DLOPEN
29730 20 6e 61 6d 65 3d 25 73 2c 20 68 61 6e 64 6c 65   name=%s, handle
29740 3d 25 70 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d  =%p\n", zFilenam
29750 65 2c 20 28 76 6f 69 64 2a 29 30 29 29 3b 0a 20  e, (void*)0));. 
29760 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
29770 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20  .  if( osIsNT() 
29780 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  ){.#if SQLITE_OS
29790 5f 57 49 4e 52 54 0a 20 20 20 20 68 20 3d 20 6f  _WINRT.    h = o
297a0 73 4c 6f 61 64 50 61 63 6b 61 67 65 64 4c 69 62  sLoadPackagedLib
297b0 72 61 72 79 28 28 4c 50 43 57 53 54 52 29 7a 43  rary((LPCWSTR)zC
297c0 6f 6e 76 65 72 74 65 64 2c 20 30 29 3b 0a 23 65  onverted, 0);.#e
297d0 6c 73 65 0a 20 20 20 20 68 20 3d 20 6f 73 4c 6f  lse.    h = osLo
297e0 61 64 4c 69 62 72 61 72 79 57 28 28 4c 50 43 57  adLibraryW((LPCW
297f0 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b  STR)zConverted);
29800 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 69 66 64  .#endif.  }.#ifd
29810 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ef SQLITE_WIN32_
29820 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b  HAS_ANSI.  else{
29830 0a 20 20 20 20 68 20 3d 20 6f 73 4c 6f 61 64 4c  .    h = osLoadL
29840 69 62 72 61 72 79 41 28 28 63 68 61 72 2a 29 7a  ibraryA((char*)z
29850 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 7d 0a  Converted);.  }.
29860 23 65 6e 64 69 66 0a 20 20 4f 53 54 52 41 43 45  #endif.  OSTRACE
29870 28 28 22 44 4c 4f 50 45 4e 20 6e 61 6d 65 3d 25  (("DLOPEN name=%
29880 73 2c 20 68 61 6e 64 6c 65 3d 25 70 5c 6e 22 2c  s, handle=%p\n",
29890 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 28 76 6f 69   zFilename, (voi
298a0 64 2a 29 68 29 29 3b 0a 20 20 73 71 6c 69 74 65  d*)h));.  sqlite
298b0 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
298c0 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 76 6f  d);.  return (vo
298d0 69 64 2a 29 68 3b 0a 7d 0a 73 74 61 74 69 63 20  id*)h;.}.static 
298e0 76 6f 69 64 20 77 69 6e 44 6c 45 72 72 6f 72 28  void winDlError(
298f0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
29900 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61  s, int nBuf, cha
29910 72 20 2a 7a 42 75 66 4f 75 74 29 7b 0a 20 20 55  r *zBufOut){.  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 77 69 6e 47 65 74 4c  pVfs);.  winGetL
29940 61 73 74 45 72 72 6f 72 4d 73 67 28 6f 73 47 65  astErrorMsg(osGe
29950 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 6e 42  tLastError(), nB
29960 75 66 2c 20 7a 42 75 66 4f 75 74 29 3b 0a 7d 0a  uf, zBufOut);.}.
29970 73 74 61 74 69 63 20 76 6f 69 64 20 28 2a 77 69  static void (*wi
29980 6e 44 6c 53 79 6d 28 73 71 6c 69 74 65 33 5f 76  nDlSym(sqlite3_v
29990 66 73 20 2a 70 56 66 73 2c 76 6f 69 64 20 2a 70  fs *pVfs,void *p
299a0 48 2c 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53  H,const char *zS
299b0 79 6d 29 29 28 76 6f 69 64 29 7b 0a 20 20 46 41  ym))(void){.  FA
299c0 52 50 52 4f 43 20 70 72 6f 63 3b 0a 20 20 55 4e  RPROC proc;.  UN
299d0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
299e0 56 66 73 29 3b 0a 20 20 70 72 6f 63 20 3d 20 6f  Vfs);.  proc = o
299f0 73 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 41  sGetProcAddressA
29a00 28 28 48 41 4e 44 4c 45 29 70 48 2c 20 7a 53 79  ((HANDLE)pH, zSy
29a10 6d 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  m);.  OSTRACE(("
29a20 44 4c 53 59 4d 20 68 61 6e 64 6c 65 3d 25 70 2c  DLSYM handle=%p,
29a30 20 73 79 6d 62 6f 6c 3d 25 73 2c 20 61 64 64 72   symbol=%s, addr
29a40 65 73 73 3d 25 70 5c 6e 22 2c 0a 20 20 20 20 20  ess=%p\n",.     
29a50 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70 48 2c        (void*)pH,
29a60 20 7a 53 79 6d 2c 20 28 76 6f 69 64 2a 29 70 72   zSym, (void*)pr
29a70 6f 63 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  oc));.  return (
29a80 76 6f 69 64 28 2a 29 28 76 6f 69 64 29 29 70 72  void(*)(void))pr
29a90 6f 63 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  oc;.}.static voi
29aa0 64 20 77 69 6e 44 6c 43 6c 6f 73 65 28 73 71 6c  d winDlClose(sql
29ab0 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
29ac0 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65 29 7b 0a  void *pHandle){.
29ad0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
29ae0 45 52 28 70 56 66 73 29 3b 0a 20 20 6f 73 46 72  ER(pVfs);.  osFr
29af0 65 65 4c 69 62 72 61 72 79 28 28 48 41 4e 44 4c  eeLibrary((HANDL
29b00 45 29 70 48 61 6e 64 6c 65 29 3b 0a 20 20 4f 53  E)pHandle);.  OS
29b10 54 52 41 43 45 28 28 22 44 4c 43 4c 4f 53 45 20  TRACE(("DLCLOSE 
29b20 68 61 6e 64 6c 65 3d 25 70 5c 6e 22 2c 20 28 76  handle=%p\n", (v
29b30 6f 69 64 2a 29 70 48 61 6e 64 6c 65 29 29 3b 0a  oid*)pHandle));.
29b40 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 53 51  }.#else /* if SQ
29b50 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45  LITE_OMIT_LOAD_E
29b60 58 54 45 4e 53 49 4f 4e 20 69 73 20 64 65 66 69  XTENSION is defi
29b70 6e 65 64 3a 20 2a 2f 0a 20 20 23 64 65 66 69 6e  ned: */.  #defin
29b80 65 20 77 69 6e 44 6c 4f 70 65 6e 20 20 30 0a 20  e winDlOpen  0. 
29b90 20 23 64 65 66 69 6e 65 20 77 69 6e 44 6c 45 72   #define winDlEr
29ba0 72 6f 72 20 30 0a 20 20 23 64 65 66 69 6e 65 20  ror 0.  #define 
29bb0 77 69 6e 44 6c 53 79 6d 20 20 20 30 0a 20 20 23  winDlSym   0.  #
29bc0 64 65 66 69 6e 65 20 77 69 6e 44 6c 43 6c 6f 73  define winDlClos
29bd0 65 20 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  e 0.#endif.../*.
29be0 2a 2a 20 57 72 69 74 65 20 75 70 20 74 6f 20 6e  ** Write up to n
29bf0 42 75 66 20 62 79 74 65 73 20 6f 66 20 72 61 6e  Buf bytes of ran
29c00 64 6f 6d 6e 65 73 73 20 69 6e 74 6f 20 7a 42 75  domness into zBu
29c10 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  f..*/.static int
29c20 20 77 69 6e 52 61 6e 64 6f 6d 6e 65 73 73 28 73   winRandomness(s
29c30 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
29c40 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72  , int nBuf, char
29c50 20 2a 7a 42 75 66 29 7b 0a 20 20 69 6e 74 20 6e   *zBuf){.  int n
29c60 20 3d 20 30 3b 0a 20 20 55 4e 55 53 45 44 5f 50   = 0;.  UNUSED_P
29c70 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a  ARAMETER(pVfs);.
29c80 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
29c90 54 45 5f 54 45 53 54 29 0a 20 20 6e 20 3d 20 6e  TE_TEST).  n = n
29ca0 42 75 66 3b 0a 20 20 6d 65 6d 73 65 74 28 7a 42  Buf;.  memset(zB
29cb0 75 66 2c 20 30 2c 20 6e 42 75 66 29 3b 0a 23 65  uf, 0, nBuf);.#e
29cc0 6c 73 65 0a 20 20 69 66 28 20 73 69 7a 65 6f 66  lse.  if( sizeof
29cd0 28 53 59 53 54 45 4d 54 49 4d 45 29 3c 3d 6e 42  (SYSTEMTIME)<=nB
29ce0 75 66 2d 6e 20 29 7b 0a 20 20 20 20 53 59 53 54  uf-n ){.    SYST
29cf0 45 4d 54 49 4d 45 20 78 3b 0a 20 20 20 20 6f 73  EMTIME x;.    os
29d00 47 65 74 53 79 73 74 65 6d 54 69 6d 65 28 26 78  GetSystemTime(&x
29d10 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a  );.    memcpy(&z
29d20 42 75 66 5b 6e 5d 2c 20 26 78 2c 20 73 69 7a 65  Buf[n], &x, size
29d30 6f 66 28 78 29 29 3b 0a 20 20 20 20 6e 20 2b 3d  of(x));.    n +=
29d40 20 73 69 7a 65 6f 66 28 78 29 3b 0a 20 20 7d 0a   sizeof(x);.  }.
29d50 20 20 69 66 28 20 73 69 7a 65 6f 66 28 44 57 4f    if( sizeof(DWO
29d60 52 44 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20  RD)<=nBuf-n ){. 
29d70 20 20 20 44 57 4f 52 44 20 70 69 64 20 3d 20 6f     DWORD pid = o
29d80 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
29d90 73 73 49 64 28 29 3b 0a 20 20 20 20 6d 65 6d 63  ssId();.    memc
29da0 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 70 69  py(&zBuf[n], &pi
29db0 64 2c 20 73 69 7a 65 6f 66 28 70 69 64 29 29 3b  d, sizeof(pid));
29dc0 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66  .    n += sizeof
29dd0 28 70 69 64 29 3b 0a 20 20 7d 0a 23 69 66 20 53  (pid);.  }.#if S
29de0 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
29df0 20 69 66 28 20 73 69 7a 65 6f 66 28 55 4c 4f 4e   if( sizeof(ULON
29e00 47 4c 4f 4e 47 29 3c 3d 6e 42 75 66 2d 6e 20 29  GLONG)<=nBuf-n )
29e10 7b 0a 20 20 20 20 55 4c 4f 4e 47 4c 4f 4e 47 20  {.    ULONGLONG 
29e20 63 6e 74 20 3d 20 6f 73 47 65 74 54 69 63 6b 43  cnt = osGetTickC
29e30 6f 75 6e 74 36 34 28 29 3b 0a 20 20 20 20 6d 65  ount64();.    me
29e40 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26  mcpy(&zBuf[n], &
29e50 63 6e 74 2c 20 73 69 7a 65 6f 66 28 63 6e 74 29  cnt, sizeof(cnt)
29e60 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65  );.    n += size
29e70 6f 66 28 63 6e 74 29 3b 0a 20 20 7d 0a 23 65 6c  of(cnt);.  }.#el
29e80 73 65 0a 20 20 69 66 28 20 73 69 7a 65 6f 66 28  se.  if( sizeof(
29e90 44 57 4f 52 44 29 3c 3d 6e 42 75 66 2d 6e 20 29  DWORD)<=nBuf-n )
29ea0 7b 0a 20 20 20 20 44 57 4f 52 44 20 63 6e 74 20  {.    DWORD cnt 
29eb0 3d 20 6f 73 47 65 74 54 69 63 6b 43 6f 75 6e 74  = osGetTickCount
29ec0 28 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  ();.    memcpy(&
29ed0 7a 42 75 66 5b 6e 5d 2c 20 26 63 6e 74 2c 20 73  zBuf[n], &cnt, s
29ee0 69 7a 65 6f 66 28 63 6e 74 29 29 3b 0a 20 20 20  izeof(cnt));.   
29ef0 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 63 6e 74   n += sizeof(cnt
29f00 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
29f10 69 66 28 20 73 69 7a 65 6f 66 28 4c 41 52 47 45  if( sizeof(LARGE
29f20 5f 49 4e 54 45 47 45 52 29 3c 3d 6e 42 75 66 2d  _INTEGER)<=nBuf-
29f30 6e 20 29 7b 0a 20 20 20 20 4c 41 52 47 45 5f 49  n ){.    LARGE_I
29f40 4e 54 45 47 45 52 20 69 3b 0a 20 20 20 20 6f 73  NTEGER i;.    os
29f50 51 75 65 72 79 50 65 72 66 6f 72 6d 61 6e 63 65  QueryPerformance
29f60 43 6f 75 6e 74 65 72 28 26 69 29 3b 0a 20 20 20  Counter(&i);.   
29f70 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d   memcpy(&zBuf[n]
29f80 2c 20 26 69 2c 20 73 69 7a 65 6f 66 28 69 29 29  , &i, sizeof(i))
29f90 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f  ;.    n += sizeo
29fa0 66 28 69 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  f(i);.  }.#endif
29fb0 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
29fc0 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72  ./*.** Sleep for
29fd0 20 61 20 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e   a little while.
29fe0 20 20 52 65 74 75 72 6e 20 74 68 65 20 61 6d 6f    Return the amo
29ff0 75 6e 74 20 6f 66 20 74 69 6d 65 20 73 6c 65 70  unt of time slep
2a000 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
2a010 20 77 69 6e 53 6c 65 65 70 28 73 71 6c 69 74 65   winSleep(sqlite
2a020 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74  3_vfs *pVfs, int
2a030 20 6d 69 63 72 6f 73 65 63 29 7b 0a 20 20 73 71   microsec){.  sq
2a040 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65  lite3_win32_slee
2a050 70 28 28 6d 69 63 72 6f 73 65 63 2b 39 39 39 29  p((microsec+999)
2a060 2f 31 30 30 30 29 3b 0a 20 20 55 4e 55 53 45 44  /1000);.  UNUSED
2a070 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29  _PARAMETER(pVfs)
2a080 3b 0a 20 20 72 65 74 75 72 6e 20 28 28 6d 69 63  ;.  return ((mic
2a090 72 6f 73 65 63 2b 39 39 39 29 2f 31 30 30 30 29  rosec+999)/1000)
2a0a0 2a 31 30 30 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  *1000;.}../*.** 
2a0b0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61  The following va
2a0c0 72 69 61 62 6c 65 2c 20 69 66 20 73 65 74 20 74  riable, if set t
2a0d0 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c  o a non-zero val
2a0e0 75 65 2c 20 69 73 20 69 6e 74 65 72 70 72 65 74  ue, is interpret
2a0f0 65 64 20 61 73 0a 2a 2a 20 74 68 65 20 6e 75 6d  ed as.** the num
2a100 62 65 72 20 6f 66 20 73 65 63 6f 6e 64 73 20 73  ber of seconds s
2a110 69 6e 63 65 20 31 39 37 30 20 61 6e 64 20 69 73  ince 1970 and is
2a120 20 75 73 65 64 20 74 6f 20 73 65 74 20 74 68 65   used to set the
2a130 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 73 71   result of.** sq
2a140 6c 69 74 65 33 4f 73 43 75 72 72 65 6e 74 54 69  lite3OsCurrentTi
2a150 6d 65 28 29 20 64 75 72 69 6e 67 20 74 65 73 74  me() during test
2a160 69 6e 67 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ing..*/.#ifdef S
2a170 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73  QLITE_TEST.int s
2a180 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74  qlite3_current_t
2a190 69 6d 65 20 3d 20 30 3b 20 20 2f 2a 20 46 61 6b  ime = 0;  /* Fak
2a1a0 65 20 73 79 73 74 65 6d 20 74 69 6d 65 20 69 6e  e system time in
2a1b0 20 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 31   seconds since 1
2a1c0 39 37 30 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a  970. */.#endif..
2a1d0 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 63  /*.** Find the c
2a1e0 75 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e 20  urrent time (in 
2a1f0 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64 69  Universal Coordi
2a200 6e 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57 72  nated Time).  Wr
2a210 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 0a  ite into *piNow.
2a220 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  ** the current t
2a230 69 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73 20  ime and date as 
2a240 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d  a Julian Day num
2a250 62 65 72 20 74 69 6d 65 73 20 38 36 5f 34 30 30  ber times 86_400
2a260 5f 30 30 30 2e 20 20 49 6e 0a 2a 2a 20 6f 74 68  _000.  In.** oth
2a270 65 72 20 77 6f 72 64 73 2c 20 77 72 69 74 65 20  er words, write 
2a280 69 6e 74 6f 20 2a 70 69 4e 6f 77 20 74 68 65 20  into *piNow the 
2a290 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73  number of millis
2a2a0 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 74 68 65  econds since the
2a2b0 20 4a 75 6c 69 61 6e 0a 2a 2a 20 65 70 6f 63 68   Julian.** epoch
2a2c0 20 6f 66 20 6e 6f 6f 6e 20 69 6e 20 47 72 65 65   of noon in Gree
2a2d0 6e 77 69 63 68 20 6f 6e 20 4e 6f 76 65 6d 62 65  nwich on Novembe
2a2e0 72 20 32 34 2c 20 34 37 31 34 20 42 2e 43 20 61  r 24, 4714 B.C a
2a2f0 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 0a  ccording to the.
2a300 2a 2a 20 70 72 6f 6c 65 70 74 69 63 20 47 72 65  ** proleptic Gre
2a310 67 6f 72 69 61 6e 20 63 61 6c 65 6e 64 61 72 2e  gorian calendar.
2a320 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73  .**.** On succes
2a330 73 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  s, return SQLITE
2a340 5f 4f 4b 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  _OK.  Return SQL
2a350 49 54 45 5f 45 52 52 4f 52 20 69 66 20 74 68 65  ITE_ERROR if the
2a360 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 0a 2a   time and date.*
2a370 2a 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e  * cannot be foun
2a380 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
2a390 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 49   winCurrentTimeI
2a3a0 6e 74 36 34 28 73 71 6c 69 74 65 33 5f 76 66 73  nt64(sqlite3_vfs
2a3b0 20 2a 70 56 66 73 2c 20 73 71 6c 69 74 65 33 5f   *pVfs, sqlite3_
2a3c0 69 6e 74 36 34 20 2a 70 69 4e 6f 77 29 7b 0a 20  int64 *piNow){. 
2a3d0 20 2f 2a 20 46 49 4c 45 54 49 4d 45 20 73 74 72   /* FILETIME str
2a3e0 75 63 74 75 72 65 20 69 73 20 61 20 36 34 2d 62  ucture is a 64-b
2a3f0 69 74 20 76 61 6c 75 65 20 72 65 70 72 65 73 65  it value represe
2a400 6e 74 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72  nting the number
2a410 20 6f 66 0a 20 20 20 20 20 31 30 30 2d 6e 61 6e   of.     100-nan
2a420 6f 73 65 63 6f 6e 64 20 69 6e 74 65 72 76 61 6c  osecond interval
2a430 73 20 73 69 6e 63 65 20 4a 61 6e 75 61 72 79 20  s since January 
2a440 31 2c 20 31 36 30 31 20 28 3d 20 4a 44 20 32 33  1, 1601 (= JD 23
2a450 30 35 38 31 33 2e 35 29 2e 0a 20 20 2a 2f 0a 20  05813.5)..  */. 
2a460 20 46 49 4c 45 54 49 4d 45 20 66 74 3b 0a 20 20   FILETIME ft;.  
2a470 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c  static const sql
2a480 69 74 65 33 5f 69 6e 74 36 34 20 77 69 6e 46 69  ite3_int64 winFi
2a490 6c 65 74 69 6d 65 45 70 6f 63 68 20 3d 20 32 33  letimeEpoch = 23
2a4a0 30 35 38 31 33 35 2a 28 73 71 6c 69 74 65 33 5f  058135*(sqlite3_
2a4b0 69 6e 74 36 34 29 38 36 34 30 30 30 30 3b 0a 23  int64)8640000;.#
2a4c0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
2a4d0 54 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  T.  static const
2a4e0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 75   sqlite3_int64 u
2a4f0 6e 69 78 45 70 6f 63 68 20 3d 20 32 34 34 30 35  nixEpoch = 24405
2a500 38 37 35 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74  875*(sqlite3_int
2a510 36 34 29 38 36 34 30 30 30 30 3b 0a 23 65 6e 64  64)8640000;.#end
2a520 69 66 0a 20 20 2f 2a 20 32 5e 33 32 20 2d 20 74  if.  /* 2^32 - t
2a530 6f 20 61 76 6f 69 64 20 75 73 65 20 6f 66 20 4c  o avoid use of L
2a540 4c 20 61 6e 64 20 77 61 72 6e 69 6e 67 73 20 69  L and warnings i
2a550 6e 20 67 63 63 20 2a 2f 0a 20 20 73 74 61 74 69  n gcc */.  stati
2a560 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  c const sqlite3_
2a570 69 6e 74 36 34 20 6d 61 78 33 32 42 69 74 56 61  int64 max32BitVa
2a580 6c 75 65 20 3d 0a 20 20 20 20 20 20 28 73 71 6c  lue =.      (sql
2a590 69 74 65 33 5f 69 6e 74 36 34 29 32 30 30 30 30  ite3_int64)20000
2a5a0 30 30 30 30 30 20 2b 20 28 73 71 6c 69 74 65 33  00000 + (sqlite3
2a5b0 5f 69 6e 74 36 34 29 32 30 30 30 30 30 30 30 30  _int64)200000000
2a5c0 30 20 2b 0a 20 20 20 20 20 20 28 73 71 6c 69 74  0 +.      (sqlit
2a5d0 65 33 5f 69 6e 74 36 34 29 32 39 34 39 36 37 32  e3_int64)2949672
2a5e0 39 36 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  96;..#if SQLITE_
2a5f0 4f 53 5f 57 49 4e 43 45 0a 20 20 53 59 53 54 45  OS_WINCE.  SYSTE
2a600 4d 54 49 4d 45 20 74 69 6d 65 3b 0a 20 20 6f 73  MTIME time;.  os
2a610 47 65 74 53 79 73 74 65 6d 54 69 6d 65 28 26 74  GetSystemTime(&t
2a620 69 6d 65 29 3b 0a 20 20 2f 2a 20 69 66 20 53 79  ime);.  /* if Sy
2a630 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54 69  stemTimeToFileTi
2a640 6d 65 28 29 20 66 61 69 6c 73 2c 20 69 74 20 72  me() fails, it r
2a650 65 74 75 72 6e 73 20 7a 65 72 6f 2e 20 2a 2f 0a  eturns zero. */.
2a660 20 20 69 66 20 28 21 6f 73 53 79 73 74 65 6d 54    if (!osSystemT
2a670 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65 28 26 74  imeToFileTime(&t
2a680 69 6d 65 2c 26 66 74 29 29 7b 0a 20 20 20 20 72  ime,&ft)){.    r
2a690 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
2a6a0 4f 52 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20  OR;.  }.#else.  
2a6b0 6f 73 47 65 74 53 79 73 74 65 6d 54 69 6d 65 41  osGetSystemTimeA
2a6c0 73 46 69 6c 65 54 69 6d 65 28 20 26 66 74 20 29  sFileTime( &ft )
2a6d0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2a 70 69 4e  ;.#endif..  *piN
2a6e0 6f 77 20 3d 20 77 69 6e 46 69 6c 65 74 69 6d 65  ow = winFiletime
2a6f0 45 70 6f 63 68 20 2b 0a 20 20 20 20 20 20 20 20  Epoch +.        
2a700 20 20 20 20 28 28 28 28 73 71 6c 69 74 65 33 5f      ((((sqlite3_
2a710 69 6e 74 36 34 29 66 74 2e 64 77 48 69 67 68 44  int64)ft.dwHighD
2a720 61 74 65 54 69 6d 65 29 2a 6d 61 78 33 32 42 69  ateTime)*max32Bi
2a730 74 56 61 6c 75 65 29 20 2b 0a 20 20 20 20 20 20  tValue) +.      
2a740 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65           (sqlite
2a750 33 5f 69 6e 74 36 34 29 66 74 2e 64 77 4c 6f 77  3_int64)ft.dwLow
2a760 44 61 74 65 54 69 6d 65 29 2f 28 73 71 6c 69 74  DateTime)/(sqlit
2a770 65 33 5f 69 6e 74 36 34 29 31 30 30 30 30 3b 0a  e3_int64)10000;.
2a780 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
2a790 45 53 54 0a 20 20 69 66 28 20 73 71 6c 69 74 65  EST.  if( sqlite
2a7a0 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 29  3_current_time )
2a7b0 7b 0a 20 20 20 20 2a 70 69 4e 6f 77 20 3d 20 31  {.    *piNow = 1
2a7c0 30 30 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74  000*(sqlite3_int
2a7d0 36 34 29 73 71 6c 69 74 65 33 5f 63 75 72 72 65  64)sqlite3_curre
2a7e0 6e 74 5f 74 69 6d 65 20 2b 20 75 6e 69 78 45 70  nt_time + unixEp
2a7f0 6f 63 68 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  och;.  }.#endif.
2a800 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
2a810 45 52 28 70 56 66 73 29 3b 0a 20 20 72 65 74 75  ER(pVfs);.  retu
2a820 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
2a830 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20  ./*.** Find the 
2a840 63 75 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e  current time (in
2a850 20 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64   Universal Coord
2a860 69 6e 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57  inated Time).  W
2a870 72 69 74 65 20 74 68 65 0a 2a 2a 20 63 75 72 72  rite the.** curr
2a880 65 6e 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74  ent time and dat
2a890 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61  e as a Julian Da
2a8a0 79 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70  y number into *p
2a8b0 72 4e 6f 77 20 61 6e 64 0a 2a 2a 20 72 65 74 75  rNow and.** retu
2a8c0 72 6e 20 30 2e 20 20 52 65 74 75 72 6e 20 31 20  rn 0.  Return 1 
2a8d0 69 66 20 74 68 65 20 74 69 6d 65 20 61 6e 64 20  if the time and 
2a8e0 64 61 74 65 20 63 61 6e 6e 6f 74 20 62 65 20 66  date cannot be f
2a8f0 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ound..*/.static 
2a900 69 6e 74 20 77 69 6e 43 75 72 72 65 6e 74 54 69  int winCurrentTi
2a910 6d 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  me(sqlite3_vfs *
2a920 70 56 66 73 2c 20 64 6f 75 62 6c 65 20 2a 70 72  pVfs, double *pr
2a930 4e 6f 77 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Now){.  int rc;.
2a940 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
2a950 69 3b 0a 20 20 72 63 20 3d 20 77 69 6e 43 75 72  i;.  rc = winCur
2a960 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 70 56  rentTimeInt64(pV
2a970 66 73 2c 20 26 69 29 3b 0a 20 20 69 66 28 20 21  fs, &i);.  if( !
2a980 72 63 20 29 7b 0a 20 20 20 20 2a 70 72 4e 6f 77  rc ){.    *prNow
2a990 20 3d 20 69 2f 38 36 34 30 30 30 30 30 2e 30 3b   = i/86400000.0;
2a9a0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2a9b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69  ;.}../*.** The i
2a9c0 64 65 61 20 69 73 20 74 68 61 74 20 74 68 69 73  dea is that this
2a9d0 20 66 75 6e 63 74 69 6f 6e 20 77 6f 72 6b 73 20   function works 
2a9e0 6c 69 6b 65 20 61 20 63 6f 6d 62 69 6e 61 74 69  like a combinati
2a9f0 6f 6e 20 6f 66 0a 2a 2a 20 47 65 74 4c 61 73 74  on of.** GetLast
2aa00 45 72 72 6f 72 28 29 20 61 6e 64 20 46 6f 72 6d  Error() and Form
2aa10 61 74 4d 65 73 73 61 67 65 28 29 20 6f 6e 20 57  atMessage() on W
2aa20 69 6e 64 6f 77 73 20 28 6f 72 20 65 72 72 6e 6f  indows (or errno
2aa30 20 61 6e 64 0a 2a 2a 20 73 74 72 65 72 72 6f 72   and.** strerror
2aa40 5f 72 28 29 20 6f 6e 20 55 6e 69 78 29 2e 20 41  _r() on Unix). A
2aa50 66 74 65 72 20 61 6e 20 65 72 72 6f 72 20 69 73  fter an error is
2aa60 20 72 65 74 75 72 6e 65 64 20 62 79 20 61 6e 20   returned by an 
2aa70 4f 53 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2c 20  OS.** function, 
2aa80 53 51 4c 69 74 65 20 63 61 6c 6c 73 20 74 68 69  SQLite calls thi
2aa90 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20  s function with 
2aaa0 7a 42 75 66 20 70 6f 69 6e 74 69 6e 67 20 74 6f  zBuf pointing to
2aab0 0a 2a 2a 20 61 20 62 75 66 66 65 72 20 6f 66 20  .** a buffer of 
2aac0 6e 42 75 66 20 62 79 74 65 73 2e 20 54 68 65 20  nBuf bytes. The 
2aad0 4f 53 20 6c 61 79 65 72 20 73 68 6f 75 6c 64 20  OS layer should 
2aae0 70 6f 70 75 6c 61 74 65 20 74 68 65 0a 2a 2a 20  populate the.** 
2aaf0 62 75 66 66 65 72 20 77 69 74 68 20 61 20 6e 75  buffer with a nu
2ab00 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 55 54 46  l-terminated UTF
2ab10 2d 38 20 65 6e 63 6f 64 65 64 20 65 72 72 6f 72  -8 encoded error
2ab20 20 6d 65 73 73 61 67 65 0a 2a 2a 20 64 65 73 63   message.** desc
2ab30 72 69 62 69 6e 67 20 74 68 65 20 6c 61 73 74 20  ribing the last 
2ab40 49 4f 20 65 72 72 6f 72 20 74 6f 20 68 61 76 65  IO error to have
2ab50 20 6f 63 63 75 72 72 65 64 20 77 69 74 68 69 6e   occurred within
2ab60 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20   the calling.** 
2ab70 74 68 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  thread..**.** If
2ab80 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61   the error messa
2ab90 67 65 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 20  ge is too large 
2aba0 66 6f 72 20 74 68 65 20 73 75 70 70 6c 69 65 64  for the supplied
2abb0 20 62 75 66 66 65 72 2c 0a 2a 2a 20 69 74 20 73   buffer,.** it s
2abc0 68 6f 75 6c 64 20 62 65 20 74 72 75 6e 63 61 74  hould be truncat
2abd0 65 64 2e 20 54 68 65 20 72 65 74 75 72 6e 20 76  ed. The return v
2abe0 61 6c 75 65 20 6f 66 20 78 47 65 74 4c 61 73 74  alue of xGetLast
2abf0 45 72 72 6f 72 0a 2a 2a 20 69 73 20 7a 65 72 6f  Error.** is zero
2ac00 20 69 66 20 74 68 65 20 65 72 72 6f 72 20 6d 65   if the error me
2ac10 73 73 61 67 65 20 66 69 74 73 20 69 6e 20 74 68  ssage fits in th
2ac20 65 20 62 75 66 66 65 72 2c 20 6f 72 20 6e 6f 6e  e buffer, or non
2ac30 2d 7a 65 72 6f 0a 2a 2a 20 6f 74 68 65 72 77 69  -zero.** otherwi
2ac40 73 65 20 28 69 66 20 74 68 65 20 6d 65 73 73 61  se (if the messa
2ac50 67 65 20 77 61 73 20 74 72 75 6e 63 61 74 65 64  ge was truncated
2ac60 29 2e 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 69  ). If non-zero i
2ac70 73 20 72 65 74 75 72 6e 65 64 2c 0a 2a 2a 20 74  s returned,.** t
2ac80 68 65 6e 20 69 74 20 69 73 20 6e 6f 74 20 6e 65  hen it is not ne
2ac90 63 65 73 73 61 72 79 20 74 6f 20 69 6e 63 6c 75  cessary to inclu
2aca0 64 65 20 74 68 65 20 6e 75 6c 2d 74 65 72 6d 69  de the nul-termi
2acb0 6e 61 74 6f 72 20 63 68 61 72 61 63 74 65 72 0a  nator character.
2acc0 2a 2a 20 69 6e 20 74 68 65 20 6f 75 74 70 75 74  ** in the output
2acd0 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 4e   buffer..**.** N
2ace0 6f 74 20 73 75 70 70 6c 79 69 6e 67 20 61 6e 20  ot supplying an 
2acf0 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77 69  error message wi
2ad00 6c 6c 20 68 61 76 65 20 6e 6f 20 61 64 76 65 72  ll have no adver
2ad10 73 65 20 65 66 66 65 63 74 0a 2a 2a 20 6f 6e 20  se effect.** on 
2ad20 53 51 4c 69 74 65 2e 20 49 74 20 69 73 20 66 69  SQLite. It is fi
2ad30 6e 65 20 74 6f 20 68 61 76 65 20 61 6e 20 69 6d  ne to have an im
2ad40 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 74 68 61  plementation tha
2ad50 74 20 6e 65 76 65 72 0a 2a 2a 20 72 65 74 75 72  t never.** retur
2ad60 6e 73 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ns an error mess
2ad70 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 6e 74  age:.**.**   int
2ad80 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72 28 73   xGetLastError(s
2ad90 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
2ada0 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72  , int nBuf, char
2adb0 20 2a 7a 42 75 66 29 7b 0a 2a 2a 20 20 20 20 20   *zBuf){.**     
2adc0 61 73 73 65 72 74 28 7a 42 75 66 5b 30 5d 3d 3d  assert(zBuf[0]==
2add0 27 5c 30 27 29 3b 0a 2a 2a 20 20 20 20 20 72 65  '\0');.**     re
2ade0 74 75 72 6e 20 30 3b 0a 2a 2a 20 20 20 7d 0a 2a  turn 0;.**   }.*
2adf0 2a 0a 2a 2a 20 48 6f 77 65 76 65 72 20 69 66 20  *.** However if 
2ae00 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
2ae10 20 69 73 20 73 75 70 70 6c 69 65 64 2c 20 69 74   is supplied, it
2ae20 20 77 69 6c 6c 20 62 65 20 69 6e 63 6f 72 70 6f   will be incorpo
2ae30 72 61 74 65 64 0a 2a 2a 20 62 79 20 73 71 6c 69  rated.** by sqli
2ae40 74 65 20 69 6e 74 6f 20 74 68 65 20 65 72 72 6f  te into the erro
2ae50 72 20 6d 65 73 73 61 67 65 20 61 76 61 69 6c 61  r message availa
2ae60 62 6c 65 20 74 6f 20 74 68 65 20 75 73 65 72 20  ble to the user 
2ae70 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33  using.** sqlite3
2ae80 5f 65 72 72 6d 73 67 28 29 2c 20 70 6f 73 73 69  _errmsg(), possi
2ae90 62 6c 79 20 6d 61 6b 69 6e 67 20 49 4f 20 65 72  bly making IO er
2aea0 72 6f 72 73 20 65 61 73 69 65 72 20 74 6f 20 64  rors easier to d
2aeb0 65 62 75 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ebug..*/.static 
2aec0 69 6e 74 20 77 69 6e 47 65 74 4c 61 73 74 45 72  int winGetLastEr
2aed0 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ror(sqlite3_vfs 
2aee0 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c  *pVfs, int nBuf,
2aef0 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20   char *zBuf){.  
2af00 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
2af10 28 70 56 66 73 29 3b 0a 20 20 72 65 74 75 72 6e  (pVfs);.  return
2af20 20 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f 72   winGetLastError
2af30 4d 73 67 28 6f 73 47 65 74 4c 61 73 74 45 72 72  Msg(osGetLastErr
2af40 6f 72 28 29 2c 20 6e 42 75 66 2c 20 7a 42 75 66  or(), nBuf, zBuf
2af50 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74  );.}../*.** Init
2af60 69 61 6c 69 7a 65 20 61 6e 64 20 64 65 69 6e 69  ialize and deini
2af70 74 69 61 6c 69 7a 65 20 74 68 65 20 6f 70 65 72  tialize the oper
2af80 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69 6e 74  ating system int
2af90 65 72 66 61 63 65 2e 0a 2a 2f 0a 69 6e 74 20 73  erface..*/.int s
2afa0 71 6c 69 74 65 33 5f 6f 73 5f 69 6e 69 74 28 76  qlite3_os_init(v
2afb0 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20 73  oid){.  static s
2afc0 71 6c 69 74 65 33 5f 76 66 73 20 77 69 6e 56 66  qlite3_vfs winVf
2afd0 73 20 3d 20 7b 0a 20 20 20 20 33 2c 20 20 20 20  s = {.    3,    
2afe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2aff0 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20  * iVersion */.  
2b000 20 20 73 69 7a 65 6f 66 28 77 69 6e 46 69 6c 65    sizeof(winFile
2b010 29 2c 20 20 20 20 20 2f 2a 20 73 7a 4f 73 46 69  ),     /* szOsFi
2b020 6c 65 20 2a 2f 0a 20 20 20 20 53 51 4c 49 54 45  le */.    SQLITE
2b030 5f 57 49 4e 33 32 5f 4d 41 58 5f 50 41 54 48 5f  _WIN32_MAX_PATH_
2b040 42 59 54 45 53 2c 20 2f 2a 20 6d 78 50 61 74 68  BYTES, /* mxPath
2b050 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20  name */.    0,  
2b060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b070 20 2f 2a 20 70 4e 65 78 74 20 2a 2f 0a 20 20 20   /* pNext */.   
2b080 20 22 77 69 6e 33 32 22 2c 20 20 20 20 20 20 20   "win32",       
2b090 20 20 20 20 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a        /* zName *
2b0a0 2f 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20 20  /.    0,        
2b0b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 41             /* pA
2b0c0 70 70 44 61 74 61 20 2a 2f 0a 20 20 20 20 77 69  ppData */.    wi
2b0d0 6e 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20  nOpen,          
2b0e0 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2a 2f 0a 20     /* xOpen */. 
2b0f0 20 20 20 77 69 6e 44 65 6c 65 74 65 2c 20 20 20     winDelete,   
2b100 20 20 20 20 20 20 20 20 2f 2a 20 78 44 65 6c 65          /* xDele
2b110 74 65 20 2a 2f 0a 20 20 20 20 77 69 6e 41 63 63  te */.    winAcc
2b120 65 73 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ess,           /
2b130 2a 20 78 41 63 63 65 73 73 20 2a 2f 0a 20 20 20  * xAccess */.   
2b140 20 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65   winFullPathname
2b150 2c 20 20 20 20 20 2f 2a 20 78 46 75 6c 6c 50 61  ,     /* xFullPa
2b160 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 77 69  thname */.    wi
2b170 6e 44 6c 4f 70 65 6e 2c 20 20 20 20 20 20 20 20  nDlOpen,        
2b180 20 20 20 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a 2f     /* xDlOpen */
2b190 0a 20 20 20 20 77 69 6e 44 6c 45 72 72 6f 72 2c  .    winDlError,
2b1a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c            /* xDl
2b1b0 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20 77 69 6e  Error */.    win
2b1c0 44 6c 53 79 6d 2c 20 20 20 20 20 20 20 20 20 20  DlSym,          
2b1d0 20 20 2f 2a 20 78 44 6c 53 79 6d 20 2a 2f 0a 20    /* xDlSym */. 
2b1e0 20 20 20 77 69 6e 44 6c 43 6c 6f 73 65 2c 20 20     winDlClose,  
2b1f0 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 43 6c          /* xDlCl
2b200 6f 73 65 20 2a 2f 0a 20 20 20 20 77 69 6e 52 61  ose */.    winRa
2b210 6e 64 6f 6d 6e 65 73 73 2c 20 20 20 20 20 20 20  ndomness,       
2b220 2f 2a 20 78 52 61 6e 64 6f 6d 6e 65 73 73 20 2a  /* xRandomness *
2b230 2f 0a 20 20 20 20 77 69 6e 53 6c 65 65 70 2c 20  /.    winSleep, 
2b240 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
2b250 6c 65 65 70 20 2a 2f 0a 20 20 20 20 77 69 6e 43  leep */.    winC
2b260 75 72 72 65 6e 74 54 69 6d 65 2c 20 20 20 20 20  urrentTime,     
2b270 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65   /* xCurrentTime
2b280 20 2a 2f 0a 20 20 20 20 77 69 6e 47 65 74 4c 61   */.    winGetLa
2b290 73 74 45 72 72 6f 72 2c 20 20 20 20 20 2f 2a 20  stError,     /* 
2b2a0 78 47 65 74 4c 61 73 74 45 72 72 6f 72 20 2a 2f  xGetLastError */
2b2b0 0a 20 20 20 20 77 69 6e 43 75 72 72 65 6e 74 54  .    winCurrentT
2b2c0 69 6d 65 49 6e 74 36 34 2c 20 2f 2a 20 78 43 75  imeInt64, /* xCu
2b2d0 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 20 2a  rrentTimeInt64 *
2b2e0 2f 0a 20 20 20 20 77 69 6e 53 65 74 53 79 73 74  /.    winSetSyst
2b2f0 65 6d 43 61 6c 6c 2c 20 20 20 20 2f 2a 20 78 53  emCall,    /* xS
2b300 65 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a  etSystemCall */.
2b310 20 20 20 20 77 69 6e 47 65 74 53 79 73 74 65 6d      winGetSystem
2b320 43 61 6c 6c 2c 20 20 20 20 2f 2a 20 78 47 65 74  Call,    /* xGet
2b330 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20  SystemCall */.  
2b340 20 20 77 69 6e 4e 65 78 74 53 79 73 74 65 6d 43    winNextSystemC
2b350 61 6c 6c 2c 20 20 20 2f 2a 20 78 4e 65 78 74 53  all,   /* xNextS
2b360 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 7d  ystemCall */.  }
2b370 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ;.#if defined(SQ
2b380 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57  LITE_WIN32_HAS_W
2b390 49 44 45 29 0a 20 20 73 74 61 74 69 63 20 73 71  IDE).  static sq
2b3a0 6c 69 74 65 33 5f 76 66 73 20 77 69 6e 4c 6f 6e  lite3_vfs winLon
2b3b0 67 50 61 74 68 56 66 73 20 3d 20 7b 0a 20 20 20  gPathVfs = {.   
2b3c0 20 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   3,             
2b3d0 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f        /* iVersio
2b3e0 6e 20 2a 2f 0a 20 20 20 20 73 69 7a 65 6f 66 28  n */.    sizeof(
2b3f0 77 69 6e 46 69 6c 65 29 2c 20 20 20 20 20 2f 2a  winFile),     /*
2b400 20 73 7a 4f 73 46 69 6c 65 20 2a 2f 0a 20 20 20   szOsFile */.   
2b410 20 53 51 4c 49 54 45 5f 57 49 4e 4e 54 5f 4d 41   SQLITE_WINNT_MA
2b420 58 5f 50 41 54 48 5f 42 59 54 45 53 2c 20 2f 2a  X_PATH_BYTES, /*
2b430 20 6d 78 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20   mxPathname */. 
2b440 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20     0,           
2b450 20 20 20 20 20 20 20 20 2f 2a 20 70 4e 65 78 74          /* pNext
2b460 20 2a 2f 0a 20 20 20 20 22 77 69 6e 33 32 2d 6c   */.    "win32-l
2b470 6f 6e 67 70 61 74 68 22 2c 20 20 20 20 2f 2a 20  ongpath",    /* 
2b480 7a 4e 61 6d 65 20 2a 2f 0a 20 20 20 20 30 2c 20  zName */.    0, 
2b490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b4a0 20 20 2f 2a 20 70 41 70 70 44 61 74 61 20 2a 2f    /* pAppData */
2b4b0 0a 20 20 20 20 77 69 6e 4f 70 65 6e 2c 20 20 20  .    winOpen,   
2b4c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4f 70            /* xOp
2b4d0 65 6e 20 2a 2f 0a 20 20 20 20 77 69 6e 44 65 6c  en */.    winDel
2b4e0 65 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ete,           /
2b4f0 2a 20 78 44 65 6c 65 74 65 20 2a 2f 0a 20 20 20  * xDelete */.   
2b500 20 77 69 6e 41 63 63 65 73 73 2c 20 20 20 20 20   winAccess,     
2b510 20 20 20 20 20 20 2f 2a 20 78 41 63 63 65 73 73        /* xAccess
2b520 20 2a 2f 0a 20 20 20 20 77 69 6e 46 75 6c 6c 50   */.    winFullP
2b530 61 74 68 6e 61 6d 65 2c 20 20 20 20 20 2f 2a 20  athname,     /* 
2b540 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 2a 2f  xFullPathname */
2b550 0a 20 20 20 20 77 69 6e 44 6c 4f 70 65 6e 2c 20  .    winDlOpen, 
2b560 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c            /* xDl
2b570 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 77 69 6e 44  Open */.    winD
2b580 6c 45 72 72 6f 72 2c 20 20 20 20 20 20 20 20 20  lError,         
2b590 20 2f 2a 20 78 44 6c 45 72 72 6f 72 20 2a 2f 0a   /* xDlError */.
2b5a0 20 20 20 20 77 69 6e 44 6c 53 79 6d 2c 20 20 20      winDlSym,   
2b5b0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 53           /* xDlS
2b5c0 79 6d 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 43  ym */.    winDlC
2b5d0 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  lose,          /
2b5e0 2a 20 78 44 6c 43 6c 6f 73 65 20 2a 2f 0a 20 20  * xDlClose */.  
2b5f0 20 20 77 69 6e 52 61 6e 64 6f 6d 6e 65 73 73 2c    winRandomness,
2b600 20 20 20 20 20 20 20 2f 2a 20 78 52 61 6e 64 6f         /* xRando
2b610 6d 6e 65 73 73 20 2a 2f 0a 20 20 20 20 77 69 6e  mness */.    win
2b620 53 6c 65 65 70 2c 20 20 20 20 20 20 20 20 20 20  Sleep,          
2b630 20 20 2f 2a 20 78 53 6c 65 65 70 20 2a 2f 0a 20    /* xSleep */. 
2b640 20 20 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d     winCurrentTim
2b650 65 2c 20 20 20 20 20 20 2f 2a 20 78 43 75 72 72  e,      /* xCurr
2b660 65 6e 74 54 69 6d 65 20 2a 2f 0a 20 20 20 20 77  entTime */.    w
2b670 69 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 2c 20  inGetLastError, 
2b680 20 20 20 20 2f 2a 20 78 47 65 74 4c 61 73 74 45      /* xGetLastE
2b690 72 72 6f 72 20 2a 2f 0a 20 20 20 20 77 69 6e 43  rror */.    winC
2b6a0 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 2c  urrentTimeInt64,
2b6b0 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65   /* xCurrentTime
2b6c0 49 6e 74 36 34 20 2a 2f 0a 20 20 20 20 77 69 6e  Int64 */.    win
2b6d0 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20  SetSystemCall,  
2b6e0 20 20 2f 2a 20 78 53 65 74 53 79 73 74 65 6d 43    /* xSetSystemC
2b6f0 61 6c 6c 20 2a 2f 0a 20 20 20 20 77 69 6e 47 65  all */.    winGe
2b700 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20 20  tSystemCall,    
2b710 2f 2a 20 78 47 65 74 53 79 73 74 65 6d 43 61 6c  /* xGetSystemCal
2b720 6c 20 2a 2f 0a 20 20 20 20 77 69 6e 4e 65 78 74  l */.    winNext
2b730 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20 2f 2a  SystemCall,   /*
2b740 20 78 4e 65 78 74 53 79 73 74 65 6d 43 61 6c 6c   xNextSystemCall
2b750 20 2a 2f 0a 20 20 7d 3b 0a 23 65 6e 64 69 66 0a   */.  };.#endif.
2b760 0a 20 20 2f 2a 20 44 6f 75 62 6c 65 2d 63 68 65  .  /* Double-che
2b770 63 6b 20 74 68 61 74 20 74 68 65 20 61 53 79 73  ck that the aSys
2b780 63 61 6c 6c 5b 5d 20 61 72 72 61 79 20 68 61 73  call[] array has
2b790 20 62 65 65 6e 20 63 6f 6e 73 74 72 75 63 74 65   been constructe
2b7a0 64 0a 20 20 2a 2a 20 63 6f 72 72 65 63 74 6c 79  d.  ** correctly
2b7b0 2e 20 20 53 65 65 20 74 69 63 6b 65 74 20 5b 62  .  See ticket [b
2b7c0 62 33 61 38 36 65 38 39 30 63 38 65 39 36 61 62  b3a86e890c8e96ab
2b7d0 5d 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 41  ] */.  assert( A
2b7e0 72 72 61 79 53 69 7a 65 28 61 53 79 73 63 61 6c  rraySize(aSyscal
2b7f0 6c 29 3d 3d 37 37 20 29 3b 0a 0a 20 20 2f 2a 20  l)==77 );..  /* 
2b800 67 65 74 20 6d 65 6d 6f 72 79 20 6d 61 70 20 61  get memory map a
2b810 6c 6c 6f 63 61 74 69 6f 6e 20 67 72 61 6e 75 6c  llocation granul
2b820 61 72 69 74 79 20 2a 2f 0a 20 20 6d 65 6d 73 65  arity */.  memse
2b830 74 28 26 77 69 6e 53 79 73 49 6e 66 6f 2c 20 30  t(&winSysInfo, 0
2b840 2c 20 73 69 7a 65 6f 66 28 53 59 53 54 45 4d 5f  , sizeof(SYSTEM_
2b850 49 4e 46 4f 29 29 3b 0a 23 69 66 20 53 51 4c 49  INFO));.#if SQLI
2b860 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 6f 73  TE_OS_WINRT.  os
2b870 47 65 74 4e 61 74 69 76 65 53 79 73 74 65 6d 49  GetNativeSystemI
2b880 6e 66 6f 28 26 77 69 6e 53 79 73 49 6e 66 6f 29  nfo(&winSysInfo)
2b890 3b 0a 23 65 6c 73 65 0a 20 20 6f 73 47 65 74 53  ;.#else.  osGetS
2b8a0 79 73 74 65 6d 49 6e 66 6f 28 26 77 69 6e 53 79  ystemInfo(&winSy
2b8b0 73 49 6e 66 6f 29 3b 0a 23 65 6e 64 69 66 0a 20  sInfo);.#endif. 
2b8c0 20 61 73 73 65 72 74 28 20 77 69 6e 53 79 73 49   assert( winSysI
2b8d0 6e 66 6f 2e 64 77 41 6c 6c 6f 63 61 74 69 6f 6e  nfo.dwAllocation
2b8e0 47 72 61 6e 75 6c 61 72 69 74 79 3e 30 20 29 3b  Granularity>0 );
2b8f0 0a 20 20 61 73 73 65 72 74 28 20 77 69 6e 53 79  .  assert( winSy
2b900 73 49 6e 66 6f 2e 64 77 50 61 67 65 53 69 7a 65  sInfo.dwPageSize
2b910 3e 30 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33  >0 );..  sqlite3
2b920 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28 26 77  _vfs_register(&w
2b930 69 6e 56 66 73 2c 20 31 29 3b 0a 0a 23 69 66 20  inVfs, 1);..#if 
2b940 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
2b950 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20  IN32_HAS_WIDE). 
2b960 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67   sqlite3_vfs_reg
2b970 69 73 74 65 72 28 26 77 69 6e 4c 6f 6e 67 50 61  ister(&winLongPa
2b980 74 68 56 66 73 2c 20 30 29 3b 0a 23 65 6e 64 69  thVfs, 0);.#endi
2b990 66 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  f..  return SQLI
2b9a0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 69 6e 74 20 73 71  TE_OK;.}..int sq
2b9b0 6c 69 74 65 33 5f 6f 73 5f 65 6e 64 28 76 6f 69  lite3_os_end(voi
2b9c0 64 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  d){.#if SQLITE_O
2b9d0 53 5f 57 49 4e 52 54 0a 20 20 69 66 28 20 73 6c  S_WINRT.  if( sl
2b9e0 65 65 70 4f 62 6a 21 3d 4e 55 4c 4c 20 29 7b 0a  eepObj!=NULL ){.
2b9f0 20 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c      osCloseHandl
2ba00 65 28 73 6c 65 65 70 4f 62 6a 29 3b 0a 20 20 20  e(sleepObj);.   
2ba10 20 73 6c 65 65 70 4f 62 6a 20 3d 20 4e 55 4c 4c   sleepObj = NULL
2ba20 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72  ;.  }.#endif.  r
2ba30 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2ba40 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  .}..#endif /* SQ
2ba50 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 2a 2f 0a     LITE_OS_WIN */.