/ Hex Artifact Content
Login

Artifact 1c936c7b0659d0eb12b868e2cd710a570e78873e:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63   file contains c
0190: 6f 64 65 20 74 68 61 74 20 69 73 20 73 70 65 63  ode that is spec
01a0: 69 66 69 63 20 74 6f 20 57 69 6e 64 6f 77 73 2e  ific to Windows.
01b0: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71  .*/.#include "sq
01c0: 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 66 20 53  liteInt.h".#if S
01d0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 20 20 20  QLITE_OS_WIN    
01e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
01f0: 69 73 20 66 69 6c 65 20 69 73 20 75 73 65 64 20  is file is used 
0200: 66 6f 72 20 57 69 6e 64 6f 77 73 20 6f 6e 6c 79  for Windows only
0210: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 6c 75   */../*.** Inclu
0220: 64 65 20 63 6f 64 65 20 74 68 61 74 20 69 73 20  de code that is 
0230: 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6f 73  common to all os
0240: 5f 2a 2e 63 20 66 69 6c 65 73 0a 2a 2f 0a 23 69  _*.c files.*/.#i
0250: 6e 63 6c 75 64 65 20 22 6f 73 5f 63 6f 6d 6d 6f  nclude "os_commo
0260: 6e 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 6c  n.h"../*.** Incl
0270: 75 64 65 20 74 68 65 20 68 65 61 64 65 72 20 66  ude the header f
0280: 69 6c 65 20 66 6f 72 20 74 68 65 20 57 69 6e 64  ile for the Wind
0290: 6f 77 73 20 56 46 53 2e 0a 2a 2f 0a 23 69 6e 63  ows VFS..*/.#inc
02a0: 6c 75 64 65 20 22 6f 73 5f 77 69 6e 2e 68 22 0a  lude "os_win.h".
02b0: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 69 6e 67  ./*.** Compiling
02c0: 20 61 6e 64 20 75 73 69 6e 67 20 57 41 4c 20 6d   and using WAL m
02d0: 6f 64 65 20 72 65 71 75 69 72 65 73 20 73 65 76  ode requires sev
02e0: 65 72 61 6c 20 41 50 49 73 20 74 68 61 74 20 61  eral APIs that a
02f0: 72 65 20 6f 6e 6c 79 0a 2a 2a 20 61 76 61 69 6c  re only.** avail
0300: 61 62 6c 65 20 69 6e 20 57 69 6e 64 6f 77 73 20  able in Windows 
0310: 70 6c 61 74 66 6f 72 6d 73 20 62 61 73 65 64 20  platforms based 
0320: 6f 6e 20 74 68 65 20 4e 54 20 6b 65 72 6e 65 6c  on the NT kernel
0330: 2e 0a 2a 2f 0a 23 69 66 20 21 53 51 4c 49 54 45  ..*/.#if !SQLITE
0340: 5f 4f 53 5f 57 49 4e 4e 54 20 26 26 20 21 64 65  _OS_WINNT && !de
0350: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
0360: 54 5f 57 41 4c 29 0a 23 20 20 65 72 72 6f 72 20  T_WAL).#  error 
0370: 22 57 41 4c 20 6d 6f 64 65 20 72 65 71 75 69 72  "WAL mode requir
0380: 65 73 20 73 75 70 70 6f 72 74 20 66 72 6f 6d 20  es support from 
0390: 74 68 65 20 57 69 6e 64 6f 77 73 20 4e 54 20 6b  the Windows NT k
03a0: 65 72 6e 65 6c 2c 20 63 6f 6d 70 69 6c 65 5c 0a  ernel, compile\.
03b0: 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4f 4d 49   with SQLITE_OMI
03c0: 54 5f 57 41 4c 2e 22 0a 23 65 6e 64 69 66 0a 0a  T_WAL.".#endif..
03d0: 2f 2a 0a 2a 2a 20 41 72 65 20 6d 6f 73 74 20 6f  /*.** Are most o
03e0: 66 20 74 68 65 20 57 69 6e 33 32 20 41 4e 53 49  f the Win32 ANSI
03f0: 20 41 50 49 73 20 61 76 61 69 6c 61 62 6c 65 20   APIs available 
0400: 28 69 2e 65 2e 20 77 69 74 68 20 63 65 72 74 61  (i.e. with certa
0410: 69 6e 20 65 78 63 65 70 74 69 6f 6e 73 0a 2a 2a  in exceptions.**
0420: 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 73 75   based on the su
0430: 62 2d 70 6c 61 74 66 6f 72 6d 29 3f 0a 2a 2f 0a  b-platform)?.*/.
0440: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
0450: 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f  INCE && !SQLITE_
0460: 4f 53 5f 57 49 4e 52 54 20 26 26 20 21 64 65 66  OS_WINRT && !def
0470: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
0480: 32 5f 4e 4f 5f 41 4e 53 49 29 0a 23 20 20 64 65  2_NO_ANSI).#  de
0490: 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33  fine SQLITE_WIN3
04a0: 32 5f 48 41 53 5f 41 4e 53 49 0a 23 65 6e 64 69  2_HAS_ANSI.#endi
04b0: 66 0a 0a 2f 2a 0a 2a 2a 20 41 72 65 20 6d 6f 73  f../*.** Are mos
04c0: 74 20 6f 66 20 74 68 65 20 57 69 6e 33 32 20 55  t of the Win32 U
04d0: 6e 69 63 6f 64 65 20 41 50 49 73 20 61 76 61 69  nicode APIs avai
04e0: 6c 61 62 6c 65 20 28 69 2e 65 2e 20 77 69 74 68  lable (i.e. with
04f0: 20 63 65 72 74 61 69 6e 20 65 78 63 65 70 74 69   certain excepti
0500: 6f 6e 73 0a 2a 2a 20 62 61 73 65 64 20 6f 6e 20  ons.** based on 
0510: 74 68 65 20 73 75 62 2d 70 6c 61 74 66 6f 72 6d  the sub-platform
0520: 29 3f 0a 2a 2f 0a 23 69 66 20 28 53 51 4c 49 54  )?.*/.#if (SQLIT
0530: 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 53 51  E_OS_WINCE || SQ
0540: 4c 49 54 45 5f 4f 53 5f 57 49 4e 4e 54 20 7c 7c  LITE_OS_WINNT ||
0550: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
0560: 29 20 26 26 20 5c 0a 20 20 20 20 21 64 65 66 69  ) && \.    !defi
0570: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
0580: 5f 4e 4f 5f 57 49 44 45 29 0a 23 20 20 64 65 66  _NO_WIDE).#  def
0590: 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ine SQLITE_WIN32
05a0: 5f 48 41 53 5f 57 49 44 45 0a 23 65 6e 64 69 66  _HAS_WIDE.#endif
05b0: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
05c0: 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 73  e at least one s
05d0: 65 74 20 6f 66 20 57 69 6e 33 32 20 41 50 49 73  et of Win32 APIs
05e0: 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a   is available..*
05f0: 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  /.#if !defined(S
0600: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
0610: 41 4e 53 49 29 20 26 26 20 21 64 65 66 69 6e 65  ANSI) && !define
0620: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
0630: 41 53 5f 57 49 44 45 29 0a 23 20 20 65 72 72 6f  AS_WIDE).#  erro
0640: 72 20 22 41 74 20 6c 65 61 73 74 20 6f 6e 65 20  r "At least one 
0650: 6f 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  of SQLITE_WIN32_
0660: 48 41 53 5f 41 4e 53 49 20 61 6e 64 20 53 51 4c  HAS_ANSI and SQL
0670: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
0680: 44 45 5c 0a 20 6d 75 73 74 20 62 65 20 64 65 66  DE\. must be def
0690: 69 6e 65 64 2e 22 0a 23 65 6e 64 69 66 0a 0a 2f  ined.".#endif../
06a0: 2a 0a 2a 2a 20 44 65 66 69 6e 65 20 74 68 65 20  *.** Define the 
06b0: 72 65 71 75 69 72 65 64 20 57 69 6e 64 6f 77 73  required Windows
06c0: 20 53 44 4b 20 76 65 72 73 69 6f 6e 20 63 6f 6e   SDK version con
06d0: 73 74 61 6e 74 73 20 69 66 20 74 68 65 79 20 61  stants if they a
06e0: 72 65 20 6e 6f 74 0a 2a 2a 20 61 6c 72 65 61 64  re not.** alread
06f0: 79 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2f 0a  y available..*/.
0700: 23 69 66 6e 64 65 66 20 4e 54 44 44 49 5f 57 49  #ifndef NTDDI_WI
0710: 4e 38 0a 23 20 20 64 65 66 69 6e 65 20 4e 54 44  N8.#  define NTD
0720: 44 49 5f 57 49 4e 38 20 20 20 20 20 20 20 20 20  DI_WIN8         
0730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
0740: 78 30 36 30 32 30 30 30 30 0a 23 65 6e 64 69 66  x06020000.#endif
0750: 0a 0a 23 69 66 6e 64 65 66 20 4e 54 44 44 49 5f  ..#ifndef NTDDI_
0760: 57 49 4e 42 4c 55 45 0a 23 20 20 64 65 66 69 6e  WINBLUE.#  defin
0770: 65 20 4e 54 44 44 49 5f 57 49 4e 42 4c 55 45 20  e NTDDI_WINBLUE 
0780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0790: 20 20 20 20 30 78 30 36 30 33 30 30 30 30 0a 23      0x06030000.#
07a0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 68 65  endif../*.** Che
07b0: 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
07c0: 20 47 65 74 56 65 72 73 69 6f 6e 45 78 5b 41 57   GetVersionEx[AW
07d0: 5d 20 66 75 6e 63 74 69 6f 6e 73 20 61 72 65 20  ] functions are 
07e0: 64 65 70 72 65 63 61 74 65 64 20 6f 6e 20 74 68  deprecated on th
07f0: 65 0a 2a 2a 20 74 61 72 67 65 74 20 73 79 73 74  e.** target syst
0800: 65 6d 2e 20 20 47 65 74 56 65 72 73 69 6f 6e 45  em.  GetVersionE
0810: 78 20 77 61 73 20 66 69 72 73 74 20 64 65 70 72  x was first depr
0820: 65 63 61 74 65 64 20 69 6e 20 57 69 6e 38 2e 31  ecated in Win8.1
0830: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
0840: 49 54 45 5f 57 49 4e 33 32 5f 47 45 54 56 45 52  ITE_WIN32_GETVER
0850: 53 49 4f 4e 45 58 0a 23 20 20 69 66 20 64 65 66  SIONEX.#  if def
0860: 69 6e 65 64 28 4e 54 44 44 49 5f 56 45 52 53 49  ined(NTDDI_VERSI
0870: 4f 4e 29 20 26 26 20 4e 54 44 44 49 5f 56 45 52  ON) && NTDDI_VER
0880: 53 49 4f 4e 20 3e 3d 20 4e 54 44 44 49 5f 57 49  SION >= NTDDI_WI
0890: 4e 42 4c 55 45 0a 23 20 20 20 20 64 65 66 69 6e  NBLUE.#    defin
08a0: 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 47  e SQLITE_WIN32_G
08b0: 45 54 56 45 52 53 49 4f 4e 45 58 20 20 20 30 20  ETVERSIONEX   0 
08c0: 20 20 2f 2a 20 47 65 74 56 65 72 73 69 6f 6e 45    /* GetVersionE
08d0: 78 28 29 20 69 73 20 64 65 70 72 65 63 61 74 65  x() is deprecate
08e0: 64 20 2a 2f 0a 23 20 20 65 6c 73 65 0a 23 20 20  d */.#  else.#  
08f0: 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f    define SQLITE_
0900: 57 49 4e 33 32 5f 47 45 54 56 45 52 53 49 4f 4e  WIN32_GETVERSION
0910: 45 58 20 20 20 31 20 20 20 2f 2a 20 47 65 74 56  EX   1   /* GetV
0920: 65 72 73 69 6f 6e 45 78 28 29 20 69 73 20 63 75  ersionEx() is cu
0930: 72 72 65 6e 74 20 2a 2f 0a 23 20 20 65 6e 64 69  rrent */.#  endi
0940: 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  f.#endif../*.** 
0950: 54 68 69 73 20 63 6f 6e 73 74 61 6e 74 20 73 68  This constant sh
0960: 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 62 65 20  ould already be 
0970: 64 65 66 69 6e 65 64 20 28 69 6e 20 74 68 65 20  defined (in the 
0980: 22 57 69 6e 44 65 66 2e 68 22 20 53 44 4b 20 66  "WinDef.h" SDK f
0990: 69 6c 65 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  ile)..*/.#ifndef
09a0: 20 4d 41 58 5f 50 41 54 48 0a 23 20 20 64 65 66   MAX_PATH.#  def
09b0: 69 6e 65 20 4d 41 58 5f 50 41 54 48 20 20 20 20  ine MAX_PATH    
09c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09d0: 20 20 28 32 36 30 29 0a 23 65 6e 64 69 66 0a 0a    (260).#endif..
09e0: 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 70 61  /*.** Maximum pa
09f0: 74 68 6e 61 6d 65 20 6c 65 6e 67 74 68 20 28 69  thname length (i
0a00: 6e 20 63 68 61 72 73 29 20 66 6f 72 20 57 69 6e  n chars) for Win
0a10: 33 32 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64  32.  This should
0a20: 20 6e 6f 72 6d 61 6c 6c 79 20 62 65 0a 2a 2a 20   normally be.** 
0a30: 4d 41 58 5f 50 41 54 48 2e 0a 2a 2f 0a 23 69 66  MAX_PATH..*/.#if
0a40: 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  ndef SQLITE_WIN3
0a50: 32 5f 4d 41 58 5f 50 41 54 48 5f 43 48 41 52 53  2_MAX_PATH_CHARS
0a60: 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54  .#  define SQLIT
0a70: 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 50 41 54 48  E_WIN32_MAX_PATH
0a80: 5f 43 48 41 52 53 20 20 20 28 4d 41 58 5f 50 41  _CHARS   (MAX_PA
0a90: 54 48 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  TH).#endif../*.*
0aa0: 2a 20 54 68 69 73 20 63 6f 6e 73 74 61 6e 74 20  * This constant 
0ab0: 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 62  should already b
0ac0: 65 20 64 65 66 69 6e 65 64 20 28 69 6e 20 74 68  e defined (in th
0ad0: 65 20 22 57 69 6e 4e 54 2e 68 22 20 53 44 4b 20  e "WinNT.h" SDK 
0ae0: 66 69 6c 65 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65  file)..*/.#ifnde
0af0: 66 20 55 4e 49 43 4f 44 45 5f 53 54 52 49 4e 47  f UNICODE_STRING
0b00: 5f 4d 41 58 5f 43 48 41 52 53 0a 23 20 20 64 65  _MAX_CHARS.#  de
0b10: 66 69 6e 65 20 55 4e 49 43 4f 44 45 5f 53 54 52  fine UNICODE_STR
0b20: 49 4e 47 5f 4d 41 58 5f 43 48 41 52 53 20 20 20  ING_MAX_CHARS   
0b30: 20 20 20 28 33 32 37 36 37 29 0a 23 65 6e 64 69     (32767).#endi
0b40: 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d  f../*.** Maximum
0b50: 20 70 61 74 68 6e 61 6d 65 20 6c 65 6e 67 74 68   pathname length
0b60: 20 28 69 6e 20 63 68 61 72 73 29 20 66 6f 72 20   (in chars) for 
0b70: 57 69 6e 4e 54 2e 20 20 54 68 69 73 20 73 68 6f  WinNT.  This sho
0b80: 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20 62 65 0a  uld normally be.
0b90: 2a 2a 20 55 4e 49 43 4f 44 45 5f 53 54 52 49 4e  ** UNICODE_STRIN
0ba0: 47 5f 4d 41 58 5f 43 48 41 52 53 2e 0a 2a 2f 0a  G_MAX_CHARS..*/.
0bb0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57  #ifndef SQLITE_W
0bc0: 49 4e 4e 54 5f 4d 41 58 5f 50 41 54 48 5f 43 48  INNT_MAX_PATH_CH
0bd0: 41 52 53 0a 23 20 20 64 65 66 69 6e 65 20 53 51  ARS.#  define SQ
0be0: 4c 49 54 45 5f 57 49 4e 4e 54 5f 4d 41 58 5f 50  LITE_WINNT_MAX_P
0bf0: 41 54 48 5f 43 48 41 52 53 20 20 20 28 55 4e 49  ATH_CHARS   (UNI
0c00: 43 4f 44 45 5f 53 54 52 49 4e 47 5f 4d 41 58 5f  CODE_STRING_MAX_
0c10: 43 48 41 52 53 29 0a 23 65 6e 64 69 66 0a 0a 2f  CHARS).#endif../
0c20: 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 70 61 74  *.** Maximum pat
0c30: 68 6e 61 6d 65 20 6c 65 6e 67 74 68 20 28 69 6e  hname length (in
0c40: 20 62 79 74 65 73 29 20 66 6f 72 20 57 69 6e 33   bytes) for Win3
0c50: 32 2e 20 20 54 68 65 20 4d 41 58 5f 50 41 54 48  2.  The MAX_PATH
0c60: 20 6d 61 63 72 6f 20 69 73 20 69 6e 0a 2a 2a 20   macro is in.** 
0c70: 63 68 61 72 61 63 74 65 72 73 2c 20 73 6f 20 77  characters, so w
0c80: 65 20 61 6c 6c 6f 63 61 74 65 20 34 20 62 79 74  e allocate 4 byt
0c90: 65 73 20 70 65 72 20 63 68 61 72 61 63 74 65 72  es per character
0ca0: 20 61 73 73 75 6d 69 6e 67 20 77 6f 72 73 74 2d   assuming worst-
0cb0: 63 61 73 65 20 6f 66 0a 2a 2a 20 34 2d 62 79 74  case of.** 4-byt
0cc0: 65 73 2d 70 65 72 2d 63 68 61 72 61 63 74 65 72  es-per-character
0cd0: 20 66 6f 72 20 55 54 46 38 2e 0a 2a 2f 0a 23 69   for UTF8..*/.#i
0ce0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  fndef SQLITE_WIN
0cf0: 33 32 5f 4d 41 58 5f 50 41 54 48 5f 42 59 54 45  32_MAX_PATH_BYTE
0d00: 53 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49  S.#  define SQLI
0d10: 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 50 41 54  TE_WIN32_MAX_PAT
0d20: 48 5f 42 59 54 45 53 20 20 20 28 53 51 4c 49 54  H_BYTES   (SQLIT
0d30: 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 50 41 54 48  E_WIN32_MAX_PATH
0d40: 5f 43 48 41 52 53 2a 34 29 0a 23 65 6e 64 69 66  _CHARS*4).#endif
0d50: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20  ../*.** Maximum 
0d60: 70 61 74 68 6e 61 6d 65 20 6c 65 6e 67 74 68 20  pathname length 
0d70: 28 69 6e 20 62 79 74 65 73 29 20 66 6f 72 20 57  (in bytes) for W
0d80: 69 6e 4e 54 2e 20 20 54 68 69 73 20 73 68 6f 75  inNT.  This shou
0d90: 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20 62 65 0a 2a  ld normally be.*
0da0: 2a 20 55 4e 49 43 4f 44 45 5f 53 54 52 49 4e 47  * UNICODE_STRING
0db0: 5f 4d 41 58 5f 43 48 41 52 53 20 2a 20 73 69 7a  _MAX_CHARS * siz
0dc0: 65 6f 66 28 57 43 48 41 52 29 2e 0a 2a 2f 0a 23  eof(WCHAR)..*/.#
0dd0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49  ifndef SQLITE_WI
0de0: 4e 4e 54 5f 4d 41 58 5f 50 41 54 48 5f 42 59 54  NNT_MAX_PATH_BYT
0df0: 45 53 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c  ES.#  define SQL
0e00: 49 54 45 5f 57 49 4e 4e 54 5f 4d 41 58 5f 50 41  ITE_WINNT_MAX_PA
0e10: 54 48 5f 42 59 54 45 53 20 20 20 5c 0a 20 20 20  TH_BYTES   \.   
0e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e30: 20 20 20 20 20 20 20 20 20 28 73 69 7a 65 6f 66           (sizeof
0e40: 28 57 43 48 41 52 29 20 2a 20 53 51 4c 49 54 45  (WCHAR) * SQLITE
0e50: 5f 57 49 4e 4e 54 5f 4d 41 58 5f 50 41 54 48 5f  _WINNT_MAX_PATH_
0e60: 43 48 41 52 53 29 0a 23 65 6e 64 69 66 0a 0a 2f  CHARS).#endif../
0e70: 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 65 72 72  *.** Maximum err
0e80: 6f 72 20 6d 65 73 73 61 67 65 20 6c 65 6e 67 74  or message lengt
0e90: 68 20 28 69 6e 20 63 68 61 72 73 29 20 66 6f 72  h (in chars) for
0ea0: 20 57 69 6e 52 54 2e 0a 2a 2f 0a 23 69 66 6e 64   WinRT..*/.#ifnd
0eb0: 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ef SQLITE_WIN32_
0ec0: 4d 41 58 5f 45 52 52 4d 53 47 5f 43 48 41 52 53  MAX_ERRMSG_CHARS
0ed0: 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54  .#  define SQLIT
0ee0: 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 45 52 52 4d  E_WIN32_MAX_ERRM
0ef0: 53 47 5f 43 48 41 52 53 20 28 31 30 32 34 29 0a  SG_CHARS (1024).
0f00: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
0f10: 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20 69  turns non-zero i
0f20: 66 20 74 68 65 20 63 68 61 72 61 63 74 65 72 20  f the character 
0f30: 73 68 6f 75 6c 64 20 62 65 20 74 72 65 61 74 65  should be treate
0f40: 64 20 61 73 20 61 20 64 69 72 65 63 74 6f 72 79  d as a directory
0f50: 0a 2a 2a 20 73 65 70 61 72 61 74 6f 72 2e 0a 2a  .** separator..*
0f60: 2f 0a 23 69 66 6e 64 65 66 20 77 69 6e 49 73 44  /.#ifndef winIsD
0f70: 69 72 53 65 70 0a 23 20 20 64 65 66 69 6e 65 20  irSep.#  define 
0f80: 77 69 6e 49 73 44 69 72 53 65 70 28 61 29 20 20  winIsDirSep(a)  
0f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28                ((
0fa0: 28 61 29 20 3d 3d 20 27 2f 27 29 20 7c 7c 20 28  (a) == '/') || (
0fb0: 28 61 29 20 3d 3d 20 27 5c 5c 27 29 29 0a 23 65  (a) == '\\')).#e
0fc0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
0fd0: 20 6d 61 63 72 6f 20 69 73 20 75 73 65 64 20 77   macro is used w
0fe0: 68 65 6e 20 61 20 6c 6f 63 61 6c 20 76 61 72 69  hen a local vari
0ff0: 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f 20 61  able is set to a
1000: 20 76 61 6c 75 65 20 74 68 61 74 20 69 73 0a 2a   value that is.*
1010: 2a 20 5b 73 6f 6d 65 74 69 6d 65 73 5d 20 6e 6f  * [sometimes] no
1020: 74 20 75 73 65 64 20 62 79 20 74 68 65 20 63 6f  t used by the co
1030: 64 65 20 28 65 2e 67 2e 20 76 69 61 20 63 6f 6e  de (e.g. via con
1040: 64 69 74 69 6f 6e 61 6c 20 63 6f 6d 70 69 6c 61  ditional compila
1050: 74 69 6f 6e 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65  tion)..*/.#ifnde
1060: 66 20 55 4e 55 53 45 44 5f 56 41 52 49 41 42 4c  f UNUSED_VARIABL
1070: 45 5f 56 41 4c 55 45 0a 23 20 20 64 65 66 69 6e  E_VALUE.#  defin
1080: 65 20 55 4e 55 53 45 44 5f 56 41 52 49 41 42 4c  e UNUSED_VARIABL
1090: 45 5f 56 41 4c 55 45 28 78 29 20 20 20 20 20 20  E_VALUE(x)      
10a0: 28 76 6f 69 64 29 28 78 29 0a 23 65 6e 64 69 66  (void)(x).#endif
10b0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20  ../*.** Returns 
10c0: 74 68 65 20 63 68 61 72 61 63 74 65 72 20 74 68  the character th
10d0: 61 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65  at should be use
10e0: 64 20 61 73 20 74 68 65 20 64 69 72 65 63 74 6f  d as the directo
10f0: 72 79 20 73 65 70 61 72 61 74 6f 72 2e 0a 2a 2f  ry separator..*/
1100: 0a 23 69 66 6e 64 65 66 20 77 69 6e 47 65 74 44  .#ifndef winGetD
1110: 69 72 53 65 70 0a 23 20 20 64 65 66 69 6e 65 20  irSep.#  define 
1120: 77 69 6e 47 65 74 44 69 72 53 65 70 28 29 20 20  winGetDirSep()  
1130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 27 5c                '\
1140: 5c 27 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  \'.#endif../*.**
1150: 20 44 6f 20 77 65 20 6e 65 65 64 20 74 6f 20 6d   Do we need to m
1160: 61 6e 75 61 6c 6c 79 20 64 65 66 69 6e 65 20 74  anually define t
1170: 68 65 20 57 69 6e 33 32 20 66 69 6c 65 20 6d 61  he Win32 file ma
1180: 70 70 69 6e 67 20 41 50 49 73 20 66 6f 72 20 75  pping APIs for u
1190: 73 65 20 77 69 74 68 20 57 41 4c 0a 2a 2a 20 6d  se with WAL.** m
11a0: 6f 64 65 20 28 65 2e 67 2e 20 74 68 65 73 65 20  ode (e.g. these 
11b0: 41 50 49 73 20 61 72 65 20 61 76 61 69 6c 61 62  APIs are availab
11c0: 6c 65 20 69 6e 20 74 68 65 20 57 69 6e 64 6f 77  le in the Window
11d0: 73 20 43 45 20 53 44 4b 3b 20 68 6f 77 65 76 65  s CE SDK; howeve
11e0: 72 2c 20 74 68 65 79 0a 2a 2a 20 61 72 65 20 6e  r, they.** are n
11f0: 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68  ot present in th
1200: 65 20 68 65 61 64 65 72 20 66 69 6c 65 29 3f 0a  e header file)?.
1210: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 57 49  */.#if SQLITE_WI
1220: 4e 33 32 5f 46 49 4c 45 4d 41 50 50 49 4e 47 5f  N32_FILEMAPPING_
1230: 41 50 49 20 26 26 20 21 64 65 66 69 6e 65 64 28  API && !defined(
1240: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29  SQLITE_OMIT_WAL)
1250: 0a 2f 2a 0a 2a 2a 20 54 77 6f 20 6f 66 20 74 68  ./*.** Two of th
1260: 65 20 66 69 6c 65 20 6d 61 70 70 69 6e 67 20 41  e file mapping A
1270: 50 49 73 20 61 72 65 20 64 69 66 66 65 72 65 6e  PIs are differen
1280: 74 20 75 6e 64 65 72 20 57 69 6e 52 54 2e 20 20  t under WinRT.  
1290: 46 69 67 75 72 65 20 6f 75 74 20 77 68 69 63 68  Figure out which
12a0: 0a 2a 2a 20 73 65 74 20 77 65 20 6e 65 65 64 2e  .** set we need.
12b0: 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  .*/.#if SQLITE_O
12c0: 53 5f 57 49 4e 52 54 0a 57 49 4e 42 41 53 45 41  S_WINRT.WINBASEA
12d0: 50 49 20 48 41 4e 44 4c 45 20 57 49 4e 41 50 49  PI HANDLE WINAPI
12e0: 20 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69   CreateFileMappi
12f0: 6e 67 46 72 6f 6d 41 70 70 28 48 41 4e 44 4c 45  ngFromApp(HANDLE
1300: 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 53 45  , \.        LPSE
1310: 43 55 52 49 54 59 5f 41 54 54 52 49 42 55 54 45  CURITY_ATTRIBUTE
1320: 53 2c 20 55 4c 4f 4e 47 2c 20 55 4c 4f 4e 47 36  S, ULONG, ULONG6
1330: 34 2c 20 4c 50 43 57 53 54 52 29 3b 0a 0a 57 49  4, LPCWSTR);..WI
1340: 4e 42 41 53 45 41 50 49 20 4c 50 56 4f 49 44 20  NBASEAPI LPVOID 
1350: 57 49 4e 41 50 49 20 4d 61 70 56 69 65 77 4f 66  WINAPI MapViewOf
1360: 46 69 6c 65 46 72 6f 6d 41 70 70 28 48 41 4e 44  FileFromApp(HAND
1370: 4c 45 2c 20 55 4c 4f 4e 47 2c 20 55 4c 4f 4e 47  LE, ULONG, ULONG
1380: 36 34 2c 20 53 49 5a 45 5f 54 29 3b 0a 23 65 6c  64, SIZE_T);.#el
1390: 73 65 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  se.#if defined(S
13a0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
13b0: 41 4e 53 49 29 0a 57 49 4e 42 41 53 45 41 50 49  ANSI).WINBASEAPI
13c0: 20 48 41 4e 44 4c 45 20 57 49 4e 41 50 49 20 43   HANDLE WINAPI C
13d0: 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67  reateFileMapping
13e0: 41 28 48 41 4e 44 4c 45 2c 20 4c 50 53 45 43 55  A(HANDLE, LPSECU
13f0: 52 49 54 59 5f 41 54 54 52 49 42 55 54 45 53 2c  RITY_ATTRIBUTES,
1400: 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44   \.        DWORD
1410: 2c 20 44 57 4f 52 44 2c 20 44 57 4f 52 44 2c 20  , DWORD, DWORD, 
1420: 4c 50 43 53 54 52 29 3b 0a 23 65 6e 64 69 66 20  LPCSTR);.#endif 
1430: 2f 2a 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  /* defined(SQLIT
1440: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
1450: 29 20 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65  ) */..#if define
1460: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
1470: 41 53 5f 57 49 44 45 29 0a 57 49 4e 42 41 53 45  AS_WIDE).WINBASE
1480: 41 50 49 20 48 41 4e 44 4c 45 20 57 49 4e 41 50  API HANDLE WINAP
1490: 49 20 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70  I CreateFileMapp
14a0: 69 6e 67 57 28 48 41 4e 44 4c 45 2c 20 4c 50 53  ingW(HANDLE, LPS
14b0: 45 43 55 52 49 54 59 5f 41 54 54 52 49 42 55 54  ECURITY_ATTRIBUT
14c0: 45 53 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57  ES, \.        DW
14d0: 4f 52 44 2c 20 44 57 4f 52 44 2c 20 44 57 4f 52  ORD, DWORD, DWOR
14e0: 44 2c 20 4c 50 43 57 53 54 52 29 3b 0a 23 65 6e  D, LPCWSTR);.#en
14f0: 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53  dif /* defined(S
1500: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
1510: 57 49 44 45 29 20 2a 2f 0a 0a 57 49 4e 42 41 53  WIDE) */..WINBAS
1520: 45 41 50 49 20 4c 50 56 4f 49 44 20 57 49 4e 41  EAPI LPVOID WINA
1530: 50 49 20 4d 61 70 56 69 65 77 4f 66 46 69 6c 65  PI MapViewOfFile
1540: 28 48 41 4e 44 4c 45 2c 20 44 57 4f 52 44 2c 20  (HANDLE, DWORD, 
1550: 44 57 4f 52 44 2c 20 44 57 4f 52 44 2c 20 53 49  DWORD, DWORD, SI
1560: 5a 45 5f 54 29 3b 0a 23 65 6e 64 69 66 20 2f 2a  ZE_T);.#endif /*
1570: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
1580: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20   */../*.** This 
1590: 66 69 6c 65 20 6d 61 70 70 69 6e 67 20 41 50 49  file mapping API
15a0: 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20 62 6f   is common to bo
15b0: 74 68 20 57 69 6e 33 32 20 61 6e 64 20 57 69 6e  th Win32 and Win
15c0: 52 54 2e 0a 2a 2f 0a 57 49 4e 42 41 53 45 41 50  RT..*/.WINBASEAP
15d0: 49 20 42 4f 4f 4c 20 57 49 4e 41 50 49 20 55 6e  I BOOL WINAPI Un
15e0: 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 28 4c 50  mapViewOfFile(LP
15f0: 43 56 4f 49 44 29 3b 0a 23 65 6e 64 69 66 20 2f  CVOID);.#endif /
1600: 2a 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 46  * SQLITE_WIN32_F
1610: 49 4c 45 4d 41 50 50 49 4e 47 5f 41 50 49 20 26  ILEMAPPING_API &
1620: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
1630: 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 2a 2f 0a 0a  E_OMIT_WAL) */..
1640: 2f 2a 0a 2a 2a 20 53 6f 6d 65 20 4d 69 63 72 6f  /*.** Some Micro
1650: 73 6f 66 74 20 63 6f 6d 70 69 6c 65 72 73 20 6c  soft compilers l
1660: 61 63 6b 20 74 68 69 73 20 64 65 66 69 6e 69 74  ack this definit
1670: 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ion..*/.#ifndef 
1680: 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54  INVALID_FILE_ATT
1690: 52 49 42 55 54 45 53 0a 23 20 64 65 66 69 6e 65  RIBUTES.# define
16a0: 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54   INVALID_FILE_AT
16b0: 54 52 49 42 55 54 45 53 20 28 28 44 57 4f 52 44  TRIBUTES ((DWORD
16c0: 29 2d 31 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66  )-1).#endif..#if
16d0: 6e 64 65 66 20 46 49 4c 45 5f 46 4c 41 47 5f 4d  ndef FILE_FLAG_M
16e0: 41 53 4b 0a 23 20 64 65 66 69 6e 65 20 46 49 4c  ASK.# define FIL
16f0: 45 5f 46 4c 41 47 5f 4d 41 53 4b 20 20 20 20 20  E_FLAG_MASK     
1700: 20 20 20 20 20 28 30 78 46 46 33 43 30 30 30 30       (0xFF3C0000
1710: 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  ).#endif..#ifnde
1720: 66 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  f FILE_ATTRIBUTE
1730: 5f 4d 41 53 4b 0a 23 20 64 65 66 69 6e 65 20 46  _MASK.# define F
1740: 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 4d 41  ILE_ATTRIBUTE_MA
1750: 53 4b 20 20 20 20 20 28 30 78 30 30 30 33 46 46  SK     (0x0003FF
1760: 46 37 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  F7).#endif..#ifn
1770: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1780: 57 41 4c 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72  WAL./* Forward r
1790: 65 66 65 72 65 6e 63 65 73 20 74 6f 20 73 74 72  eferences to str
17a0: 75 63 74 75 72 65 73 20 75 73 65 64 20 66 6f 72  uctures used for
17b0: 20 57 41 4c 20 2a 2f 0a 74 79 70 65 64 65 66 20   WAL */.typedef 
17c0: 73 74 72 75 63 74 20 77 69 6e 53 68 6d 20 77 69  struct winShm wi
17d0: 6e 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20  nShm;           
17e0: 2f 2a 20 41 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  /* A connection 
17f0: 74 6f 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  to shared-memory
1800: 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75   */.typedef stru
1810: 63 74 20 77 69 6e 53 68 6d 4e 6f 64 65 20 77 69  ct winShmNode wi
1820: 6e 53 68 6d 4e 6f 64 65 3b 20 20 20 2f 2a 20 41  nShmNode;   /* A
1830: 20 72 65 67 69 6f 6e 20 6f 66 20 73 68 61 72 65   region of share
1840: 64 2d 6d 65 6d 6f 72 79 20 2a 2f 0a 23 65 6e 64  d-memory */.#end
1850: 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 69 6e 43 45 20  if../*.** WinCE 
1860: 6c 61 63 6b 73 20 6e 61 74 69 76 65 20 73 75 70  lacks native sup
1870: 70 6f 72 74 20 66 6f 72 20 66 69 6c 65 20 6c 6f  port for file lo
1880: 63 6b 69 6e 67 20 73 6f 20 77 65 20 68 61 76 65  cking so we have
1890: 20 74 6f 20 66 61 6b 65 20 69 74 0a 2a 2a 20 77   to fake it.** w
18a0: 69 74 68 20 73 6f 6d 65 20 63 6f 64 65 20 6f 66  ith some code of
18b0: 20 6f 75 72 20 6f 77 6e 2e 0a 2a 2f 0a 23 69 66   our own..*/.#if
18c0: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
18d0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
18e0: 77 69 6e 63 65 4c 6f 63 6b 20 7b 0a 20 20 69 6e  winceLock {.  in
18f0: 74 20 6e 52 65 61 64 65 72 73 3b 20 20 20 20 20  t nReaders;     
1900: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
1910: 65 61 64 65 72 20 6c 6f 63 6b 73 20 6f 62 74 61  eader locks obta
1920: 69 6e 65 64 20 2a 2f 0a 20 20 42 4f 4f 4c 20 62  ined */.  BOOL b
1930: 50 65 6e 64 69 6e 67 3b 20 20 20 20 20 20 2f 2a  Pending;      /*
1940: 20 49 6e 64 69 63 61 74 65 73 20 61 20 70 65 6e   Indicates a pen
1950: 64 69 6e 67 20 6c 6f 63 6b 20 68 61 73 20 62 65  ding lock has be
1960: 65 6e 20 6f 62 74 61 69 6e 65 64 20 2a 2f 0a 20  en obtained */. 
1970: 20 42 4f 4f 4c 20 62 52 65 73 65 72 76 65 64 3b   BOOL bReserved;
1980: 20 20 20 20 20 2f 2a 20 49 6e 64 69 63 61 74 65       /* Indicate
1990: 73 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63  s a reserved loc
19a0: 6b 20 68 61 73 20 62 65 65 6e 20 6f 62 74 61 69  k has been obtai
19b0: 6e 65 64 20 2a 2f 0a 20 20 42 4f 4f 4c 20 62 45  ned */.  BOOL bE
19c0: 78 63 6c 75 73 69 76 65 3b 20 20 20 20 2f 2a 20  xclusive;    /* 
19d0: 49 6e 64 69 63 61 74 65 73 20 61 6e 20 65 78 63  Indicates an exc
19e0: 6c 75 73 69 76 65 20 6c 6f 63 6b 20 68 61 73 20  lusive lock has 
19f0: 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 2a 2f  been obtained */
1a00: 0a 7d 20 77 69 6e 63 65 4c 6f 63 6b 3b 0a 23 65  .} winceLock;.#e
1a10: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
1a20: 77 69 6e 46 69 6c 65 20 73 74 72 75 63 74 75 72  winFile structur
1a30: 65 20 69 73 20 61 20 73 75 62 63 6c 61 73 73 20  e is a subclass 
1a40: 6f 66 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  of sqlite3_file*
1a50: 20 73 70 65 63 69 66 69 63 20 74 6f 20 74 68 65   specific to the
1a60: 20 77 69 6e 33 32 0a 2a 2a 20 70 6f 72 74 61 62   win32.** portab
1a70: 69 6c 69 74 79 20 6c 61 79 65 72 2e 0a 2a 2f 0a  ility layer..*/.
1a80: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 77  typedef struct w
1a90: 69 6e 46 69 6c 65 20 77 69 6e 46 69 6c 65 3b 0a  inFile winFile;.
1aa0: 73 74 72 75 63 74 20 77 69 6e 46 69 6c 65 20 7b  struct winFile {
1ab0: 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  .  const sqlite3
1ac0: 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 70 4d 65  _io_methods *pMe
1ad0: 74 68 6f 64 3b 20 2f 2a 2a 2a 20 4d 75 73 74 20  thod; /*** Must 
1ae0: 62 65 20 66 69 72 73 74 20 2a 2a 2a 2f 0a 20 20  be first ***/.  
1af0: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
1b00: 73 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56  s;      /* The V
1b10: 46 53 20 75 73 65 64 20 74 6f 20 6f 70 65 6e 20  FS used to open 
1b20: 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 48  this file */.  H
1b30: 41 4e 44 4c 45 20 68 3b 20 20 20 20 20 20 20 20  ANDLE h;        
1b40: 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65         /* Handle
1b50: 20 66 6f 72 20 61 63 63 65 73 73 69 6e 67 20 74   for accessing t
1b60: 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20  he file */.  u8 
1b70: 6c 6f 63 6b 74 79 70 65 3b 20 20 20 20 20 20 20  locktype;       
1b80: 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20       /* Type of 
1b90: 6c 6f 63 6b 20 63 75 72 72 65 6e 74 6c 79 20 68  lock currently h
1ba0: 65 6c 64 20 6f 6e 20 74 68 69 73 20 66 69 6c 65  eld on this file
1bb0: 20 2a 2f 0a 20 20 73 68 6f 72 74 20 73 68 61 72   */.  short shar
1bc0: 65 64 4c 6f 63 6b 42 79 74 65 3b 20 20 20 2f 2a  edLockByte;   /*
1bd0: 20 52 61 6e 64 6f 6d 6c 79 20 63 68 6f 73 65 6e   Randomly chosen
1be0: 20 62 79 74 65 20 75 73 65 64 20 61 73 20 61 20   byte used as a 
1bf0: 73 68 61 72 65 64 20 6c 6f 63 6b 20 2a 2f 0a 20  shared lock */. 
1c00: 20 75 38 20 63 74 72 6c 46 6c 61 67 73 3b 20 20   u8 ctrlFlags;  
1c10: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
1c20: 73 2e 20 20 53 65 65 20 57 49 4e 46 49 4c 45 5f  s.  See WINFILE_
1c30: 2a 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 44 57 4f  * below */.  DWO
1c40: 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 20 20 20  RD lastErrno;   
1c50: 20 20 20 20 20 2f 2a 20 54 68 65 20 57 69 6e 64       /* The Wind
1c60: 6f 77 73 20 65 72 72 6e 6f 20 66 72 6f 6d 20 74  ows errno from t
1c70: 68 65 20 6c 61 73 74 20 49 2f 4f 20 65 72 72 6f  he last I/O erro
1c80: 72 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  r */.#ifndef SQL
1c90: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 77  ITE_OMIT_WAL.  w
1ca0: 69 6e 53 68 6d 20 2a 70 53 68 6d 3b 20 20 20 20  inShm *pShm;    
1cb0: 20 20 20 20 20 20 20 2f 2a 20 49 6e 73 74 61 6e         /* Instan
1cc0: 63 65 20 6f 66 20 73 68 61 72 65 64 20 6d 65 6d  ce of shared mem
1cd0: 6f 72 79 20 6f 6e 20 74 68 69 73 20 66 69 6c 65  ory on this file
1ce0: 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 63 6f 6e   */.#endif.  con
1cf0: 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 3b 20  st char *zPath; 
1d00: 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20 70 61 74       /* Full pat
1d10: 68 6e 61 6d 65 20 6f 66 20 74 68 69 73 20 66 69  hname of this fi
1d20: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 43 68  le */.  int szCh
1d30: 75 6e 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  unk;            
1d40: 2f 2a 20 43 68 75 6e 6b 20 73 69 7a 65 20 63 6f  /* Chunk size co
1d50: 6e 66 69 67 75 72 65 64 20 62 79 20 46 43 4e 54  nfigured by FCNT
1d60: 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 20 2a 2f 0a  L_CHUNK_SIZE */.
1d70: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
1d80: 4e 43 45 0a 20 20 4c 50 57 53 54 52 20 7a 44 65  NCE.  LPWSTR zDe
1d90: 6c 65 74 65 4f 6e 43 6c 6f 73 65 3b 20 20 2f 2a  leteOnClose;  /*
1da0: 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f   Name of file to
1db0: 20 64 65 6c 65 74 65 20 77 68 65 6e 20 63 6c 6f   delete when clo
1dc0: 73 69 6e 67 20 2a 2f 0a 20 20 48 41 4e 44 4c 45  sing */.  HANDLE
1dd0: 20 68 4d 75 74 65 78 3b 20 20 20 20 20 20 20 20   hMutex;        
1de0: 20 20 2f 2a 20 4d 75 74 65 78 20 75 73 65 64 20    /* Mutex used 
1df0: 74 6f 20 63 6f 6e 74 72 6f 6c 20 61 63 63 65 73  to control acces
1e00: 73 20 74 6f 20 73 68 61 72 65 64 20 6c 6f 63 6b  s to shared lock
1e10: 20 2a 2f 0a 20 20 48 41 4e 44 4c 45 20 68 53 68   */.  HANDLE hSh
1e20: 61 72 65 64 3b 20 20 20 20 20 20 20 20 20 2f 2a  ared;         /*
1e30: 20 53 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 73   Shared memory s
1e40: 65 67 6d 65 6e 74 20 75 73 65 64 20 66 6f 72 20  egment used for 
1e50: 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20 77 69 6e  locking */.  win
1e60: 63 65 4c 6f 63 6b 20 6c 6f 63 61 6c 3b 20 20 20  ceLock local;   
1e70: 20 20 20 20 20 2f 2a 20 4c 6f 63 6b 73 20 6f 62       /* Locks ob
1e80: 74 61 69 6e 65 64 20 62 79 20 74 68 69 73 20 69  tained by this i
1e90: 6e 73 74 61 6e 63 65 20 6f 66 20 77 69 6e 46 69  nstance of winFi
1ea0: 6c 65 20 2a 2f 0a 20 20 77 69 6e 63 65 4c 6f 63  le */.  winceLoc
1eb0: 6b 20 2a 73 68 61 72 65 64 3b 20 20 20 20 20 20  k *shared;      
1ec0: 2f 2a 20 47 6c 6f 62 61 6c 20 73 68 61 72 65 64  /* Global shared
1ed0: 20 6c 6f 63 6b 20 6d 65 6d 6f 72 79 20 66 6f 72   lock memory for
1ee0: 20 74 68 65 20 66 69 6c 65 20 20 2a 2f 0a 23 65   the file  */.#e
1ef0: 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
1f00: 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
1f10: 20 20 69 6e 74 20 6e 46 65 74 63 68 4f 75 74 3b    int nFetchOut;
1f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f30: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 75 74  /* Number of out
1f40: 73 74 61 6e 64 69 6e 67 20 78 46 65 74 63 68 20  standing xFetch 
1f50: 72 65 66 65 72 65 6e 63 65 73 20 2a 2f 0a 20 20  references */.  
1f60: 48 41 4e 44 4c 45 20 68 4d 61 70 3b 20 20 20 20  HANDLE hMap;    
1f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f80: 20 48 61 6e 64 6c 65 20 66 6f 72 20 61 63 63 65   Handle for acce
1f90: 73 73 69 6e 67 20 6d 65 6d 6f 72 79 20 6d 61 70  ssing memory map
1fa0: 70 69 6e 67 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  ping */.  void *
1fb0: 70 4d 61 70 52 65 67 69 6f 6e 3b 20 20 20 20 20  pMapRegion;     
1fc0: 20 20 20 20 20 20 20 20 2f 2a 20 41 72 65 61 20          /* Area 
1fd0: 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64 20 2a 2f  memory mapped */
1fe0: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
1ff0: 20 6d 6d 61 70 53 69 7a 65 3b 20 20 20 20 20 20   mmapSize;      
2000: 20 2f 2a 20 55 73 61 62 6c 65 20 73 69 7a 65 20   /* Usable size 
2010: 6f 66 20 6d 61 70 70 65 64 20 72 65 67 69 6f 6e  of mapped region
2020: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
2030: 74 36 34 20 6d 6d 61 70 53 69 7a 65 41 63 74 75  t64 mmapSizeActu
2040: 61 6c 3b 20 2f 2a 20 41 63 74 75 61 6c 20 73 69  al; /* Actual si
2050: 7a 65 20 6f 66 20 6d 61 70 70 65 64 20 72 65 67  ze of mapped reg
2060: 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ion */.  sqlite3
2070: 5f 69 6e 74 36 34 20 6d 6d 61 70 53 69 7a 65 4d  _int64 mmapSizeM
2080: 61 78 3b 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67  ax;    /* Config
2090: 75 72 65 64 20 46 43 4e 54 4c 5f 4d 4d 41 50 5f  ured FCNTL_MMAP_
20a0: 53 49 5a 45 20 76 61 6c 75 65 20 2a 2f 0a 23 65  SIZE value */.#e
20b0: 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  ndif.};../*.** A
20c0: 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 20 66 6f  llowed values fo
20d0: 72 20 77 69 6e 46 69 6c 65 2e 63 74 72 6c 46 6c  r winFile.ctrlFl
20e0: 61 67 73 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 57  ags.*/.#define W
20f0: 49 4e 46 49 4c 45 5f 52 44 4f 4e 4c 59 20 20 20  INFILE_RDONLY   
2100: 20 20 20 20 20 20 20 30 78 30 32 20 20 20 2f 2a         0x02   /*
2110: 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 72   Connection is r
2120: 65 61 64 20 6f 6e 6c 79 20 2a 2f 0a 23 64 65 66  ead only */.#def
2130: 69 6e 65 20 57 49 4e 46 49 4c 45 5f 50 45 52 53  ine WINFILE_PERS
2140: 49 53 54 5f 57 41 4c 20 20 20 20 20 30 78 30 34  IST_WAL     0x04
2150: 20 20 20 2f 2a 20 50 65 72 73 69 73 74 65 6e 74     /* Persistent
2160: 20 57 41 4c 20 6d 6f 64 65 20 2a 2f 0a 23 64 65   WAL mode */.#de
2170: 66 69 6e 65 20 57 49 4e 46 49 4c 45 5f 50 53 4f  fine WINFILE_PSO
2180: 57 20 20 20 20 20 20 20 20 20 20 20 20 30 78 31  W            0x1
2190: 30 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4f  0   /* SQLITE_IO
21a0: 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56  CAP_POWERSAFE_OV
21b0: 45 52 57 52 49 54 45 20 2a 2f 0a 0a 2f 2a 0a 20  ERWRITE */../*. 
21c0: 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68  * The size of th
21d0: 65 20 62 75 66 66 65 72 20 75 73 65 64 20 62 79  e buffer used by
21e0: 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 77   sqlite3_win32_w
21f0: 72 69 74 65 5f 64 65 62 75 67 28 29 2e 0a 20 2a  rite_debug().. *
2200: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
2210: 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53  _WIN32_DBG_BUF_S
2220: 49 5a 45 0a 23 20 20 64 65 66 69 6e 65 20 53 51  IZE.#  define SQ
2230: 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42  LITE_WIN32_DBG_B
2240: 55 46 5f 53 49 5a 45 20 20 20 28 28 69 6e 74 29  UF_SIZE   ((int)
2250: 28 34 30 39 36 2d 73 69 7a 65 6f 66 28 44 57 4f  (4096-sizeof(DWO
2260: 52 44 29 29 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  RD))).#endif../*
2270: 0a 20 2a 20 54 68 65 20 76 61 6c 75 65 20 75 73  . * The value us
2280: 65 64 20 77 69 74 68 20 73 71 6c 69 74 65 33 5f  ed with sqlite3_
2290: 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74  win32_set_direct
22a0: 6f 72 79 28 29 20 74 6f 20 73 70 65 63 69 66 79  ory() to specify
22b0: 20 74 68 61 74 0a 20 2a 20 74 68 65 20 64 61 74   that. * the dat
22c0: 61 20 64 69 72 65 63 74 6f 72 79 20 73 68 6f 75  a directory shou
22d0: 6c 64 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 20  ld be changed.. 
22e0: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
22f0: 45 5f 57 49 4e 33 32 5f 44 41 54 41 5f 44 49 52  E_WIN32_DATA_DIR
2300: 45 43 54 4f 52 59 5f 54 59 50 45 0a 23 20 20 64  ECTORY_TYPE.#  d
2310: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e  efine SQLITE_WIN
2320: 33 32 5f 44 41 54 41 5f 44 49 52 45 43 54 4f 52  32_DATA_DIRECTOR
2330: 59 5f 54 59 50 45 20 28 31 29 0a 23 65 6e 64 69  Y_TYPE (1).#endi
2340: 66 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20 76 61 6c  f../*. * The val
2350: 75 65 20 75 73 65 64 20 77 69 74 68 20 73 71 6c  ue used with sql
2360: 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64  ite3_win32_set_d
2370: 69 72 65 63 74 6f 72 79 28 29 20 74 6f 20 73 70  irectory() to sp
2380: 65 63 69 66 79 20 74 68 61 74 0a 20 2a 20 74 68  ecify that. * th
2390: 65 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65  e temporary dire
23a0: 63 74 6f 72 79 20 73 68 6f 75 6c 64 20 62 65 20  ctory should be 
23b0: 63 68 61 6e 67 65 64 2e 0a 20 2a 2f 0a 23 69 66  changed.. */.#if
23c0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  ndef SQLITE_WIN3
23d0: 32 5f 54 45 4d 50 5f 44 49 52 45 43 54 4f 52 59  2_TEMP_DIRECTORY
23e0: 5f 54 59 50 45 0a 23 20 20 64 65 66 69 6e 65 20  _TYPE.#  define 
23f0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 54 45 4d  SQLITE_WIN32_TEM
2400: 50 5f 44 49 52 45 43 54 4f 52 59 5f 54 59 50 45  P_DIRECTORY_TYPE
2410: 20 28 32 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a   (2).#endif../*.
2420: 20 2a 20 49 66 20 63 6f 6d 70 69 6c 65 64 20 77   * If compiled w
2430: 69 74 68 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ith SQLITE_WIN32
2440: 5f 4d 41 4c 4c 4f 43 20 6f 6e 20 57 69 6e 64 6f  _MALLOC on Windo
2450: 77 73 2c 20 77 65 20 77 69 6c 6c 20 75 73 65 20  ws, we will use 
2460: 74 68 65 0a 20 2a 20 76 61 72 69 6f 75 73 20 57  the. * various W
2470: 69 6e 33 32 20 41 50 49 20 68 65 61 70 20 66 75  in32 API heap fu
2480: 6e 63 74 69 6f 6e 73 20 69 6e 73 74 65 61 64 20  nctions instead 
2490: 6f 66 20 6f 75 72 20 6f 77 6e 2e 0a 20 2a 2f 0a  of our own.. */.
24a0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49  #ifdef SQLITE_WI
24b0: 4e 33 32 5f 4d 41 4c 4c 4f 43 0a 0a 2f 2a 0a 20  N32_MALLOC../*. 
24c0: 2a 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 6e  * If this is non
24d0: 2d 7a 65 72 6f 2c 20 61 6e 20 69 73 6f 6c 61 74  -zero, an isolat
24e0: 65 64 20 68 65 61 70 20 77 69 6c 6c 20 62 65 20  ed heap will be 
24f0: 63 72 65 61 74 65 64 20 62 79 20 74 68 65 20 6e  created by the n
2500: 61 74 69 76 65 20 57 69 6e 33 32 0a 20 2a 20 61  ative Win32. * a
2510: 6c 6c 6f 63 61 74 6f 72 20 73 75 62 73 79 73 74  llocator subsyst
2520: 65 6d 3b 20 6f 74 68 65 72 77 69 73 65 2c 20 74  em; otherwise, t
2530: 68 65 20 64 65 66 61 75 6c 74 20 70 72 6f 63 65  he default proce
2540: 73 73 20 68 65 61 70 20 77 69 6c 6c 20 62 65 20  ss heap will be 
2550: 75 73 65 64 2e 20 20 54 68 69 73 0a 20 2a 20 73  used.  This. * s
2560: 65 74 74 69 6e 67 20 68 61 73 20 6e 6f 20 65 66  etting has no ef
2570: 66 65 63 74 20 77 68 65 6e 20 63 6f 6d 70 69 6c  fect when compil
2580: 69 6e 67 20 66 6f 72 20 57 69 6e 52 54 2e 20 20  ing for WinRT.  
2590: 42 79 20 64 65 66 61 75 6c 74 2c 20 74 68 69 73  By default, this
25a0: 20 69 73 20 65 6e 61 62 6c 65 64 0a 20 2a 20 61   is enabled. * a
25b0: 6e 64 20 61 6e 20 69 73 6f 6c 61 74 65 64 20 68  nd an isolated h
25c0: 65 61 70 20 77 69 6c 6c 20 62 65 20 63 72 65 61  eap will be crea
25d0: 74 65 64 20 74 6f 20 73 74 6f 72 65 20 61 6c 6c  ted to store all
25e0: 20 61 6c 6c 6f 63 61 74 65 64 20 64 61 74 61 2e   allocated data.
25f0: 0a 20 2a 0a 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  . *. ***********
2600: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2610: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2620: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2630: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2640: 2a 2a 2a 0a 20 2a 20 57 41 52 4e 49 4e 47 3a 20  ***. * WARNING: 
2650: 49 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20  It is important 
2660: 74 6f 20 6e 6f 74 65 20 74 68 61 74 20 77 68 65  to note that whe
2670: 6e 20 74 68 69 73 20 73 65 74 74 69 6e 67 20 69  n this setting i
2680: 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64 20 74  s non-zero and t
2690: 68 65 0a 20 2a 20 20 20 20 20 20 20 20 20 20 77  he. *          w
26a0: 69 6e 4d 65 6d 53 68 75 74 64 6f 77 6e 20 66 75  inMemShutdown fu
26b0: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
26c0: 20 28 65 2e 67 2e 20 62 79 20 74 68 65 20 73 71   (e.g. by the sq
26d0: 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 0a 20  lite3_shutdown. 
26e0: 2a 20 20 20 20 20 20 20 20 20 20 66 75 6e 63 74  *          funct
26f0: 69 6f 6e 29 2c 20 61 6c 6c 20 64 61 74 61 20 74  ion), all data t
2700: 68 61 74 20 77 61 73 20 61 6c 6c 6f 63 61 74 65  hat was allocate
2710: 64 20 75 73 69 6e 67 20 74 68 65 20 69 73 6f 6c  d using the isol
2720: 61 74 65 64 20 68 65 61 70 20 77 69 6c 6c 0a 20  ated heap will. 
2730: 2a 20 20 20 20 20 20 20 20 20 20 62 65 20 66 72  *          be fr
2740: 65 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  eed immediately 
2750: 61 6e 64 20 61 6e 79 20 61 74 74 65 6d 70 74 20  and any attempt 
2760: 74 6f 20 61 63 63 65 73 73 20 61 6e 79 20 6f 66  to access any of
2770: 20 74 68 61 74 20 66 72 65 65 64 0a 20 2a 20 20   that freed. *  
2780: 20 20 20 20 20 20 20 20 64 61 74 61 20 77 69 6c          data wil
2790: 6c 20 61 6c 6d 6f 73 74 20 63 65 72 74 61 69 6e  l almost certain
27a0: 6c 79 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20  ly result in an 
27b0: 69 6d 6d 65 64 69 61 74 65 20 61 63 63 65 73 73  immediate access
27c0: 20 76 69 6f 6c 61 74 69 6f 6e 2e 0a 20 2a 2a 2a   violation.. ***
27d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2800: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2810: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 2a 2f 0a  ***********. */.
2820: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57  #ifndef SQLITE_W
2830: 49 4e 33 32 5f 48 45 41 50 5f 43 52 45 41 54 45  IN32_HEAP_CREATE
2840: 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54  .#  define SQLIT
2850: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 43 52 45  E_WIN32_HEAP_CRE
2860: 41 54 45 20 20 20 20 28 54 52 55 45 29 0a 23 65  ATE    (TRUE).#e
2870: 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20  ndif../*. * The 
2880: 69 6e 69 74 69 61 6c 20 73 69 7a 65 20 6f 66 20  initial size of 
2890: 74 68 65 20 57 69 6e 33 32 2d 73 70 65 63 69 66  the Win32-specif
28a0: 69 63 20 68 65 61 70 2e 20 20 54 68 69 73 20 76  ic heap.  This v
28b0: 61 6c 75 65 20 6d 61 79 20 62 65 20 7a 65 72 6f  alue may be zero
28c0: 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  .. */.#ifndef SQ
28d0: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
28e0: 49 4e 49 54 5f 53 49 5a 45 0a 23 20 20 64 65 66  INIT_SIZE.#  def
28f0: 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ine SQLITE_WIN32
2900: 5f 48 45 41 50 5f 49 4e 49 54 5f 53 49 5a 45 20  _HEAP_INIT_SIZE 
2910: 28 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  ((SQLITE_DEFAULT
2920: 5f 43 41 43 48 45 5f 53 49 5a 45 29 20 2a 20 5c  _CACHE_SIZE) * \
2930: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2950: 20 20 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f          (SQLITE_
2960: 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
2970: 45 29 20 2b 20 34 31 39 34 33 30 34 29 0a 23 65  E) + 4194304).#e
2980: 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20  ndif../*. * The 
2990: 6d 61 78 69 6d 75 6d 20 73 69 7a 65 20 6f 66 20  maximum size of 
29a0: 74 68 65 20 57 69 6e 33 32 2d 73 70 65 63 69 66  the Win32-specif
29b0: 69 63 20 68 65 61 70 2e 20 20 54 68 69 73 20 76  ic heap.  This v
29c0: 61 6c 75 65 20 6d 61 79 20 62 65 20 7a 65 72 6f  alue may be zero
29d0: 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  .. */.#ifndef SQ
29e0: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
29f0: 4d 41 58 5f 53 49 5a 45 0a 23 20 20 64 65 66 69  MAX_SIZE.#  defi
2a00: 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ne SQLITE_WIN32_
2a10: 48 45 41 50 5f 4d 41 58 5f 53 49 5a 45 20 20 28  HEAP_MAX_SIZE  (
2a20: 30 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a  0).#endif../*. *
2a30: 20 54 68 65 20 65 78 74 72 61 20 66 6c 61 67 73   The extra flags
2a40: 20 74 6f 20 75 73 65 20 69 6e 20 63 61 6c 6c 73   to use in calls
2a50: 20 74 6f 20 74 68 65 20 57 69 6e 33 32 20 68 65   to the Win32 he
2a60: 61 70 20 41 50 49 73 2e 20 20 54 68 69 73 20 76  ap APIs.  This v
2a70: 61 6c 75 65 20 6d 61 79 20 62 65 0a 20 2a 20 7a  alue may be. * z
2a80: 65 72 6f 20 66 6f 72 20 74 68 65 20 64 65 66 61  ero for the defa
2a90: 75 6c 74 20 62 65 68 61 76 69 6f 72 2e 0a 20 2a  ult behavior.. *
2aa0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
2ab0: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47  _WIN32_HEAP_FLAG
2ac0: 53 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49  S.#  define SQLI
2ad0: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c  TE_WIN32_HEAP_FL
2ae0: 41 47 53 20 20 20 20 20 28 30 29 0a 23 65 6e 64  AGS     (0).#end
2af0: 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 77  if.../*.** The w
2b00: 69 6e 4d 65 6d 44 61 74 61 20 73 74 72 75 63 74  inMemData struct
2b10: 75 72 65 20 73 74 6f 72 65 73 20 69 6e 66 6f 72  ure stores infor
2b20: 6d 61 74 69 6f 6e 20 72 65 71 75 69 72 65 64 20  mation required 
2b30: 62 79 20 74 68 65 20 57 69 6e 33 32 2d 73 70 65  by the Win32-spe
2b40: 63 69 66 69 63 0a 2a 2a 20 73 71 6c 69 74 65 33  cific.** sqlite3
2b50: 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 69 6d 70  _mem_methods imp
2b60: 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2f 0a  lementation..*/.
2b70: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 77  typedef struct w
2b80: 69 6e 4d 65 6d 44 61 74 61 20 77 69 6e 4d 65 6d  inMemData winMem
2b90: 44 61 74 61 3b 0a 73 74 72 75 63 74 20 77 69 6e  Data;.struct win
2ba0: 4d 65 6d 44 61 74 61 20 7b 0a 23 69 66 6e 64 65  MemData {.#ifnde
2bb0: 66 20 4e 44 45 42 55 47 0a 20 20 75 33 32 20 6d  f NDEBUG.  u32 m
2bc0: 61 67 69 63 31 3b 20 20 20 2f 2a 20 4d 61 67 69  agic1;   /* Magi
2bd0: 63 20 6e 75 6d 62 65 72 20 74 6f 20 64 65 74 65  c number to dete
2be0: 63 74 20 73 74 72 75 63 74 75 72 65 20 63 6f 72  ct structure cor
2bf0: 72 75 70 74 69 6f 6e 2e 20 2a 2f 0a 23 65 6e 64  ruption. */.#end
2c00: 69 66 0a 20 20 48 41 4e 44 4c 45 20 68 48 65 61  if.  HANDLE hHea
2c10: 70 3b 20 2f 2a 20 54 68 65 20 68 61 6e 64 6c 65  p; /* The handle
2c20: 20 74 6f 20 6f 75 72 20 68 65 61 70 2e 20 2a 2f   to our heap. */
2c30: 0a 20 20 42 4f 4f 4c 20 62 4f 77 6e 65 64 3b 20  .  BOOL bOwned; 
2c40: 20 2f 2a 20 44 6f 20 77 65 20 6f 77 6e 20 74 68   /* Do we own th
2c50: 65 20 68 65 61 70 20 28 69 2e 65 2e 20 64 65 73  e heap (i.e. des
2c60: 74 72 6f 79 20 69 74 20 6f 6e 20 73 68 75 74 64  troy it on shutd
2c70: 6f 77 6e 29 3f 20 2a 2f 0a 23 69 66 6e 64 65 66  own)? */.#ifndef
2c80: 20 4e 44 45 42 55 47 0a 20 20 75 33 32 20 6d 61   NDEBUG.  u32 ma
2c90: 67 69 63 32 3b 20 20 20 2f 2a 20 4d 61 67 69 63  gic2;   /* Magic
2ca0: 20 6e 75 6d 62 65 72 20 74 6f 20 64 65 74 65 63   number to detec
2cb0: 74 20 73 74 72 75 63 74 75 72 65 20 63 6f 72 72  t structure corr
2cc0: 75 70 74 69 6f 6e 2e 20 2a 2f 0a 23 65 6e 64 69  uption. */.#endi
2cd0: 66 0a 7d 3b 0a 0a 23 69 66 6e 64 65 66 20 4e 44  f.};..#ifndef ND
2ce0: 45 42 55 47 0a 23 64 65 66 69 6e 65 20 57 49 4e  EBUG.#define WIN
2cf0: 4d 45 4d 5f 4d 41 47 49 43 31 20 20 20 20 20 30  MEM_MAGIC1     0
2d00: 78 34 32 62 32 38 33 30 62 0a 23 64 65 66 69 6e  x42b2830b.#defin
2d10: 65 20 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 32 20  e WINMEM_MAGIC2 
2d20: 20 20 20 20 30 78 62 64 34 64 37 63 66 34 0a 23      0xbd4d7cf4.#
2d30: 65 6e 64 69 66 0a 0a 73 74 61 74 69 63 20 73 74  endif..static st
2d40: 72 75 63 74 20 77 69 6e 4d 65 6d 44 61 74 61 20  ruct winMemData 
2d50: 77 69 6e 5f 6d 65 6d 5f 64 61 74 61 20 3d 20 7b  win_mem_data = {
2d60: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
2d70: 20 20 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 31 2c    WINMEM_MAGIC1,
2d80: 0a 23 65 6e 64 69 66 0a 20 20 4e 55 4c 4c 2c 20  .#endif.  NULL, 
2d90: 46 41 4c 53 45 0a 23 69 66 6e 64 65 66 20 4e 44  FALSE.#ifndef ND
2da0: 45 42 55 47 0a 20 20 2c 57 49 4e 4d 45 4d 5f 4d  EBUG.  ,WINMEM_M
2db0: 41 47 49 43 32 0a 23 65 6e 64 69 66 0a 7d 3b 0a  AGIC2.#endif.};.
2dc0: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
2dd0: 23 64 65 66 69 6e 65 20 77 69 6e 4d 65 6d 41 73  #define winMemAs
2de0: 73 65 72 74 4d 61 67 69 63 31 28 29 20 61 73 73  sertMagic1() ass
2df0: 65 72 74 28 20 77 69 6e 5f 6d 65 6d 5f 64 61 74  ert( win_mem_dat
2e00: 61 2e 6d 61 67 69 63 31 3d 3d 57 49 4e 4d 45 4d  a.magic1==WINMEM
2e10: 5f 4d 41 47 49 43 31 20 29 0a 23 64 65 66 69 6e  _MAGIC1 ).#defin
2e20: 65 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61  e winMemAssertMa
2e30: 67 69 63 32 28 29 20 61 73 73 65 72 74 28 20 77  gic2() assert( w
2e40: 69 6e 5f 6d 65 6d 5f 64 61 74 61 2e 6d 61 67 69  in_mem_data.magi
2e50: 63 32 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49 43  c2==WINMEM_MAGIC
2e60: 32 20 29 0a 23 64 65 66 69 6e 65 20 77 69 6e 4d  2 ).#define winM
2e70: 65 6d 41 73 73 65 72 74 4d 61 67 69 63 28 29 20  emAssertMagic() 
2e80: 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67   winMemAssertMag
2e90: 69 63 31 28 29 3b 20 77 69 6e 4d 65 6d 41 73 73  ic1(); winMemAss
2ea0: 65 72 74 4d 61 67 69 63 32 28 29 3b 0a 23 65 6c  ertMagic2();.#el
2eb0: 73 65 0a 23 64 65 66 69 6e 65 20 77 69 6e 4d 65  se.#define winMe
2ec0: 6d 41 73 73 65 72 74 4d 61 67 69 63 28 29 0a 23  mAssertMagic().#
2ed0: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 77  endif..#define w
2ee0: 69 6e 4d 65 6d 47 65 74 44 61 74 61 50 74 72 28  inMemGetDataPtr(
2ef0: 29 20 20 26 77 69 6e 5f 6d 65 6d 5f 64 61 74 61  )  &win_mem_data
2f00: 0a 23 64 65 66 69 6e 65 20 77 69 6e 4d 65 6d 47  .#define winMemG
2f10: 65 74 48 65 61 70 28 29 20 20 20 20 20 77 69 6e  etHeap()     win
2f20: 5f 6d 65 6d 5f 64 61 74 61 2e 68 48 65 61 70 0a  _mem_data.hHeap.
2f30: 23 64 65 66 69 6e 65 20 77 69 6e 4d 65 6d 47 65  #define winMemGe
2f40: 74 4f 77 6e 65 64 28 29 20 20 20 20 77 69 6e 5f  tOwned()    win_
2f50: 6d 65 6d 5f 64 61 74 61 2e 62 4f 77 6e 65 64 0a  mem_data.bOwned.
2f60: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 77 69  .static void *wi
2f70: 6e 4d 65 6d 4d 61 6c 6c 6f 63 28 69 6e 74 20 6e  nMemMalloc(int n
2f80: 42 79 74 65 73 29 3b 0a 73 74 61 74 69 63 20 76  Bytes);.static v
2f90: 6f 69 64 20 77 69 6e 4d 65 6d 46 72 65 65 28 76  oid winMemFree(v
2fa0: 6f 69 64 20 2a 70 50 72 69 6f 72 29 3b 0a 73 74  oid *pPrior);.st
2fb0: 61 74 69 63 20 76 6f 69 64 20 2a 77 69 6e 4d 65  atic void *winMe
2fc0: 6d 52 65 61 6c 6c 6f 63 28 76 6f 69 64 20 2a 70  mRealloc(void *p
2fd0: 50 72 69 6f 72 2c 20 69 6e 74 20 6e 42 79 74 65  Prior, int nByte
2fe0: 73 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77  s);.static int w
2ff0: 69 6e 4d 65 6d 53 69 7a 65 28 76 6f 69 64 20 2a  inMemSize(void *
3000: 70 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77  p);.static int w
3010: 69 6e 4d 65 6d 52 6f 75 6e 64 75 70 28 69 6e 74  inMemRoundup(int
3020: 20 6e 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20   n);.static int 
3030: 77 69 6e 4d 65 6d 49 6e 69 74 28 76 6f 69 64 20  winMemInit(void 
3040: 2a 70 41 70 70 44 61 74 61 29 3b 0a 73 74 61 74  *pAppData);.stat
3050: 69 63 20 76 6f 69 64 20 77 69 6e 4d 65 6d 53 68  ic void winMemSh
3060: 75 74 64 6f 77 6e 28 76 6f 69 64 20 2a 70 41 70  utdown(void *pAp
3070: 70 44 61 74 61 29 3b 0a 0a 63 6f 6e 73 74 20 73  pData);..const s
3080: 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f  qlite3_mem_metho
3090: 64 73 20 2a 73 71 6c 69 74 65 33 4d 65 6d 47 65  ds *sqlite3MemGe
30a0: 74 57 69 6e 33 32 28 76 6f 69 64 29 3b 0a 23 65  tWin32(void);.#e
30b0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 57  ndif /* SQLITE_W
30c0: 49 4e 33 32 5f 4d 41 4c 4c 4f 43 20 2a 2f 0a 0a  IN32_MALLOC */..
30d0: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
30e0: 69 6e 67 20 76 61 72 69 61 62 6c 65 20 69 73 20  ing variable is 
30f0: 28 6e 6f 72 6d 61 6c 6c 79 29 20 73 65 74 20 6f  (normally) set o
3100: 6e 63 65 20 61 6e 64 20 6e 65 76 65 72 20 63 68  nce and never ch
3110: 61 6e 67 65 73 0a 2a 2a 20 74 68 65 72 65 61 66  anges.** thereaf
3120: 74 65 72 2e 20 20 49 74 20 72 65 63 6f 72 64 73  ter.  It records
3130: 20 77 68 65 74 68 65 72 20 74 68 65 20 6f 70 65   whether the ope
3140: 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69 73  rating system is
3150: 20 57 69 6e 39 78 0a 2a 2a 20 6f 72 20 57 69 6e   Win9x.** or Win
3160: 4e 54 2e 0a 2a 2a 0a 2a 2a 20 30 3a 20 20 20 4f  NT..**.** 0:   O
3170: 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
3180: 75 6e 6b 6e 6f 77 6e 2e 0a 2a 2a 20 31 3a 20 20  unknown..** 1:  
3190: 20 4f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   Operating syste
31a0: 6d 20 69 73 20 57 69 6e 39 78 2e 0a 2a 2a 20 32  m is Win9x..** 2
31b0: 3a 20 20 20 4f 70 65 72 61 74 69 6e 67 20 73 79  :   Operating sy
31c0: 73 74 65 6d 20 69 73 20 57 69 6e 4e 54 2e 0a 2a  stem is WinNT..*
31d0: 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65 72 20 74 6f  *.** In order to
31e0: 20 66 61 63 69 6c 69 74 61 74 65 20 74 65 73 74   facilitate test
31f0: 69 6e 67 20 6f 6e 20 61 20 57 69 6e 4e 54 20 73  ing on a WinNT s
3200: 79 73 74 65 6d 2c 20 74 68 65 20 74 65 73 74 20  ystem, the test 
3210: 66 69 78 74 75 72 65 0a 2a 2a 20 63 61 6e 20 6d  fixture.** can m
3220: 61 6e 75 61 6c 6c 79 20 73 65 74 20 74 68 69 73  anually set this
3230: 20 76 61 6c 75 65 20 74 6f 20 31 20 74 6f 20 65   value to 1 to e
3240: 6d 75 6c 61 74 65 20 57 69 6e 39 38 20 62 65 68  mulate Win98 beh
3250: 61 76 69 6f 72 2e 0a 2a 2f 0a 23 69 66 64 65 66  avior..*/.#ifdef
3260: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 4c 4f 4e   SQLITE_TEST.LON
3270: 47 20 76 6f 6c 61 74 69 6c 65 20 73 71 6c 69 74  G volatile sqlit
3280: 65 33 5f 6f 73 5f 74 79 70 65 20 3d 20 30 3b 0a  e3_os_type = 0;.
3290: 23 65 6c 73 65 0a 73 74 61 74 69 63 20 4c 4f 4e  #else.static LON
32a0: 47 20 76 6f 6c 61 74 69 6c 65 20 73 71 6c 69 74  G volatile sqlit
32b0: 65 33 5f 6f 73 5f 74 79 70 65 20 3d 20 30 3b 0a  e3_os_type = 0;.
32c0: 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
32d0: 53 59 53 43 41 4c 4c 0a 23 20 20 64 65 66 69 6e  SYSCALL.#  defin
32e0: 65 20 53 59 53 43 41 4c 4c 20 73 71 6c 69 74 65  e SYSCALL sqlite
32f0: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 0a 23 65  3_syscall_ptr.#e
3300: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
3310: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 74   function is not
3320: 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 57 69   available on Wi
3330: 6e 64 6f 77 73 20 43 45 20 6f 72 20 57 69 6e 52  ndows CE or WinR
3340: 54 2e 0a 20 2a 2f 0a 0a 23 69 66 20 53 51 4c 49  T.. */..#if SQLI
3350: 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 53  TE_OS_WINCE || S
3360: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 23  QLITE_OS_WINRT.#
3370: 20 20 64 65 66 69 6e 65 20 6f 73 41 72 65 46 69    define osAreFi
3380: 6c 65 41 70 69 73 41 4e 53 49 28 29 20 20 20 20  leApisANSI()    
3390: 20 20 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a     1.#endif../*.
33a0: 2a 2a 20 4d 61 6e 79 20 73 79 73 74 65 6d 20 63  ** Many system c
33b0: 61 6c 6c 73 20 61 72 65 20 61 63 63 65 73 73 65  alls are accesse
33c0: 64 20 74 68 72 6f 75 67 68 20 70 6f 69 6e 74 65  d through pointe
33d0: 72 2d 74 6f 2d 66 75 6e 63 74 69 6f 6e 73 20 73  r-to-functions s
33e0: 6f 20 74 68 61 74 0a 2a 2a 20 74 68 65 79 20 6d  o that.** they m
33f0: 61 79 20 62 65 20 6f 76 65 72 72 69 64 64 65 6e  ay be overridden
3400: 20 61 74 20 72 75 6e 74 69 6d 65 20 74 6f 20 66   at runtime to f
3410: 61 63 69 6c 69 74 61 74 65 20 66 61 75 6c 74 20  acilitate fault 
3420: 69 6e 6a 65 63 74 69 6f 6e 20 64 75 72 69 6e 67  injection during
3430: 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20  .** testing and 
3440: 73 61 6e 64 62 6f 78 69 6e 67 2e 20 20 54 68 65  sandboxing.  The
3450: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 72 61 79   following array
3460: 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 73   holds the names
3470: 20 61 6e 64 20 70 6f 69 6e 74 65 72 73 0a 2a 2a   and pointers.**
3480: 20 74 6f 20 61 6c 6c 20 6f 76 65 72 72 69 64 65   to all override
3490: 61 62 6c 65 20 73 79 73 74 65 6d 20 63 61 6c 6c  able system call
34a0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72  s..*/.static str
34b0: 75 63 74 20 77 69 6e 5f 73 79 73 63 61 6c 6c 20  uct win_syscall 
34c0: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
34d0: 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  zName;          
34e0: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
34f0: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a   system call */.
3500: 20 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c    sqlite3_syscal
3510: 6c 5f 70 74 72 20 70 43 75 72 72 65 6e 74 3b 20  l_ptr pCurrent; 
3520: 2f 2a 20 43 75 72 72 65 6e 74 20 76 61 6c 75 65  /* Current value
3530: 20 6f 66 20 74 68 65 20 73 79 73 74 65 6d 20 63   of the system c
3540: 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  all */.  sqlite3
3550: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 70 44 65  _syscall_ptr pDe
3560: 66 61 75 6c 74 3b 20 2f 2a 20 44 65 66 61 75 6c  fault; /* Defaul
3570: 74 20 76 61 6c 75 65 20 2a 2f 0a 7d 20 61 53 79  t value */.} aSy
3580: 73 63 61 6c 6c 5b 5d 20 3d 20 7b 0a 23 69 66 20  scall[] = {.#if 
3590: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45  !SQLITE_OS_WINCE
35a0: 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57   && !SQLITE_OS_W
35b0: 49 4e 52 54 0a 20 20 7b 20 22 41 72 65 46 69 6c  INRT.  { "AreFil
35c0: 65 41 70 69 73 41 4e 53 49 22 2c 20 20 20 20 20  eApisANSI",     
35d0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 41 72 65      (SYSCALL)Are
35e0: 46 69 6c 65 41 70 69 73 41 4e 53 49 2c 20 20 20  FileApisANSI,   
35f0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
3600: 0a 20 20 7b 20 22 41 72 65 46 69 6c 65 41 70 69  .  { "AreFileApi
3610: 73 41 4e 53 49 22 2c 20 20 20 20 20 20 20 20 20  sANSI",         
3620: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
3630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3640: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
3650: 69 66 6e 64 65 66 20 6f 73 41 72 65 46 69 6c 65  ifndef osAreFile
3660: 41 70 69 73 41 4e 53 49 0a 23 64 65 66 69 6e 65  ApisANSI.#define
3670: 20 6f 73 41 72 65 46 69 6c 65 41 70 69 73 41 4e   osAreFileApisAN
3680: 53 49 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  SI ((BOOL(WINAPI
3690: 2a 29 28 56 4f 49 44 29 29 61 53 79 73 63 61 6c  *)(VOID))aSyscal
36a0: 6c 5b 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 23  l[0].pCurrent).#
36b0: 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54  endif..#if SQLIT
36c0: 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 64 65  E_OS_WINCE && de
36d0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
36e0: 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b  32_HAS_WIDE).  {
36f0: 20 22 43 68 61 72 4c 6f 77 65 72 57 22 2c 20 20   "CharLowerW",  
3700: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
3710: 43 41 4c 4c 29 43 68 61 72 4c 6f 77 65 72 57 2c  CALL)CharLowerW,
3720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
3730: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 68  },.#else.  { "Ch
3740: 61 72 4c 6f 77 65 72 57 22 2c 20 20 20 20 20 20  arLowerW",      
3750: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
3760: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
3770: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
3780: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
3790: 73 43 68 61 72 4c 6f 77 65 72 57 20 28 28 4c 50  sCharLowerW ((LP
37a0: 57 53 54 52 28 57 49 4e 41 50 49 2a 29 28 4c 50  WSTR(WINAPI*)(LP
37b0: 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 31  WSTR))aSyscall[1
37c0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
37d0: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
37e0: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
37f0: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
3800: 45 29 0a 20 20 7b 20 22 43 68 61 72 55 70 70 65  E).  { "CharUppe
3810: 72 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  rW",            
3820: 20 20 28 53 59 53 43 41 4c 4c 29 43 68 61 72 55    (SYSCALL)CharU
3830: 70 70 65 72 57 2c 20 20 20 20 20 20 20 20 20 20  pperW,          
3840: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
3850: 20 7b 20 22 43 68 61 72 55 70 70 65 72 57 22 2c   { "CharUpperW",
3860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
3870: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
3880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3890: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
38a0: 66 69 6e 65 20 6f 73 43 68 61 72 55 70 70 65 72  fine osCharUpper
38b0: 57 20 28 28 4c 50 57 53 54 52 28 57 49 4e 41 50  W ((LPWSTR(WINAP
38c0: 49 2a 29 28 4c 50 57 53 54 52 29 29 61 53 79 73  I*)(LPWSTR))aSys
38d0: 63 61 6c 6c 5b 32 5d 2e 70 43 75 72 72 65 6e 74  call[2].pCurrent
38e0: 29 0a 0a 20 20 7b 20 22 43 6c 6f 73 65 48 61 6e  )..  { "CloseHan
38f0: 64 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  dle",           
3900: 20 20 28 53 59 53 43 41 4c 4c 29 43 6c 6f 73 65    (SYSCALL)Close
3910: 48 61 6e 64 6c 65 2c 20 20 20 20 20 20 20 20 20  Handle,         
3920: 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e      0 },..#defin
3930: 65 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 20  e osCloseHandle 
3940: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
3950: 48 41 4e 44 4c 45 29 29 61 53 79 73 63 61 6c 6c  HANDLE))aSyscall
3960: 5b 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  [3].pCurrent)..#
3970: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
3980: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
3990: 29 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c  ).  { "CreateFil
39a0: 65 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  eA",            
39b0: 20 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65   (SYSCALL)Create
39c0: 46 69 6c 65 41 2c 20 20 20 20 20 20 20 20 20 20  FileA,          
39d0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
39e0: 7b 20 22 43 72 65 61 74 65 46 69 6c 65 41 22 2c  { "CreateFileA",
39f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
3a00: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
3a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
3a20: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
3a30: 69 6e 65 20 6f 73 43 72 65 61 74 65 46 69 6c 65  ine osCreateFile
3a40: 41 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50  A ((HANDLE(WINAP
3a50: 49 2a 29 28 4c 50 43 53 54 52 2c 44 57 4f 52 44  I*)(LPCSTR,DWORD
3a60: 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20  ,DWORD, \.      
3a70: 20 20 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54    LPSECURITY_ATT
3a80: 52 49 42 55 54 45 53 2c 44 57 4f 52 44 2c 44 57  RIBUTES,DWORD,DW
3a90: 4f 52 44 2c 48 41 4e 44 4c 45 29 29 61 53 79 73  ORD,HANDLE))aSys
3aa0: 63 61 6c 6c 5b 34 5d 2e 70 43 75 72 72 65 6e 74  call[4].pCurrent
3ab0: 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  )..#if !SQLITE_O
3ac0: 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e  S_WINRT && defin
3ad0: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
3ae0: 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 43  HAS_WIDE).  { "C
3af0: 72 65 61 74 65 46 69 6c 65 57 22 2c 20 20 20 20  reateFileW",    
3b00: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
3b10: 4c 29 43 72 65 61 74 65 46 69 6c 65 57 2c 20 20  L)CreateFileW,  
3b20: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
3b30: 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65 61 74  #else.  { "Creat
3b40: 65 46 69 6c 65 57 22 2c 20 20 20 20 20 20 20 20  eFileW",        
3b50: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
3b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b70: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
3b80: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72  if..#define osCr
3b90: 65 61 74 65 46 69 6c 65 57 20 28 28 48 41 4e 44  eateFileW ((HAND
3ba0: 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57  LE(WINAPI*)(LPCW
3bb0: 53 54 52 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c  STR,DWORD,DWORD,
3bc0: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 53 45 43   \.        LPSEC
3bd0: 55 52 49 54 59 5f 41 54 54 52 49 42 55 54 45 53  URITY_ATTRIBUTES
3be0: 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 48 41 4e  ,DWORD,DWORD,HAN
3bf0: 44 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 35 5d  DLE))aSyscall[5]
3c00: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
3c10: 28 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  (!SQLITE_OS_WINR
3c20: 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  T && defined(SQL
3c30: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
3c40: 53 49 29 20 26 26 20 5c 0a 20 20 20 20 20 20 20  SI) && \.       
3c50: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
3c60: 5f 4f 4d 49 54 5f 57 41 4c 29 29 0a 20 20 7b 20  _OMIT_WAL)).  { 
3c70: 22 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69  "CreateFileMappi
3c80: 6e 67 41 22 2c 20 20 20 20 20 20 28 53 59 53 43  ngA",      (SYSC
3c90: 41 4c 4c 29 43 72 65 61 74 65 46 69 6c 65 4d 61  ALL)CreateFileMa
3ca0: 70 70 69 6e 67 41 2c 20 20 20 20 20 20 30 20 7d  ppingA,      0 }
3cb0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65  ,.#else.  { "Cre
3cc0: 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 41 22  ateFileMappingA"
3cd0: 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29  ,      (SYSCALL)
3ce0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
3cf0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
3d00: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
3d10: 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e  CreateFileMappin
3d20: 67 41 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41  gA ((HANDLE(WINA
3d30: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 50 53 45  PI*)(HANDLE,LPSE
3d40: 43 55 52 49 54 59 5f 41 54 54 52 49 42 55 54 45  CURITY_ATTRIBUTE
3d50: 53 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f  S, \.        DWO
3d60: 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 4c  RD,DWORD,DWORD,L
3d70: 50 43 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b  PCSTR))aSyscall[
3d80: 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  6].pCurrent)..#i
3d90: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
3da0: 45 20 7c 7c 20 28 21 53 51 4c 49 54 45 5f 4f 53  E || (!SQLITE_OS
3db0: 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65  _WINRT && define
3dc0: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
3dd0: 41 53 5f 57 49 44 45 29 20 26 26 20 5c 0a 20 20  AS_WIDE) && \.  
3de0: 20 20 20 20 20 20 21 64 65 66 69 6e 65 64 28 53        !defined(S
3df0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 29  QLITE_OMIT_WAL))
3e00: 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65  .  { "CreateFile
3e10: 4d 61 70 70 69 6e 67 57 22 2c 20 20 20 20 20 20  MappingW",      
3e20: 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65 46  (SYSCALL)CreateF
3e30: 69 6c 65 4d 61 70 70 69 6e 67 57 2c 20 20 20 20  ileMappingW,    
3e40: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
3e50: 20 22 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70   "CreateFileMapp
3e60: 69 6e 67 57 22 2c 20 20 20 20 20 20 28 53 59 53  ingW",      (SYS
3e70: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
3e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
3e90: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
3ea0: 6e 65 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d  ne osCreateFileM
3eb0: 61 70 70 69 6e 67 57 20 28 28 48 41 4e 44 4c 45  appingW ((HANDLE
3ec0: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
3ed0: 2c 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54 52  ,LPSECURITY_ATTR
3ee0: 49 42 55 54 45 53 2c 20 5c 0a 20 20 20 20 20 20  IBUTES, \.      
3ef0: 20 20 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57    DWORD,DWORD,DW
3f00: 4f 52 44 2c 4c 50 43 57 53 54 52 29 29 61 53 79  ORD,LPCWSTR))aSy
3f10: 73 63 61 6c 6c 5b 37 5d 2e 70 43 75 72 72 65 6e  scall[7].pCurren
3f20: 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  t)..#if !SQLITE_
3f30: 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69  OS_WINRT && defi
3f40: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
3f50: 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22  _HAS_WIDE).  { "
3f60: 43 72 65 61 74 65 4d 75 74 65 78 57 22 2c 20 20  CreateMutexW",  
3f70: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
3f80: 4c 4c 29 43 72 65 61 74 65 4d 75 74 65 78 57 2c  LL)CreateMutexW,
3f90: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
3fa0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65 61  .#else.  { "Crea
3fb0: 74 65 4d 75 74 65 78 57 22 2c 20 20 20 20 20 20  teMutexW",      
3fc0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
3fd0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3fe0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
3ff0: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43  dif..#define osC
4000: 72 65 61 74 65 4d 75 74 65 78 57 20 28 28 48 41  reateMutexW ((HA
4010: 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50  NDLE(WINAPI*)(LP
4020: 53 45 43 55 52 49 54 59 5f 41 54 54 52 49 42 55  SECURITY_ATTRIBU
4030: 54 45 53 2c 42 4f 4f 4c 2c 20 5c 0a 20 20 20 20  TES,BOOL, \.    
4040: 20 20 20 20 4c 50 43 57 53 54 52 29 29 61 53 79      LPCWSTR))aSy
4050: 73 63 61 6c 6c 5b 38 5d 2e 70 43 75 72 72 65 6e  scall[8].pCurren
4060: 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  t)..#if defined(
4070: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
4080: 5f 41 4e 53 49 29 0a 20 20 7b 20 22 44 65 6c 65  _ANSI).  { "Dele
4090: 74 65 46 69 6c 65 41 22 2c 20 20 20 20 20 20 20  teFileA",       
40a0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 44        (SYSCALL)D
40b0: 65 6c 65 74 65 46 69 6c 65 41 2c 20 20 20 20 20  eleteFileA,     
40c0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
40d0: 73 65 0a 20 20 7b 20 22 44 65 6c 65 74 65 46 69  se.  { "DeleteFi
40e0: 6c 65 41 22 2c 20 20 20 20 20 20 20 20 20 20 20  leA",           
40f0: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
4100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4110: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
4120: 0a 23 64 65 66 69 6e 65 20 6f 73 44 65 6c 65 74  .#define osDelet
4130: 65 46 69 6c 65 41 20 28 28 42 4f 4f 4c 28 57 49  eFileA ((BOOL(WI
4140: 4e 41 50 49 2a 29 28 4c 50 43 53 54 52 29 29 61  NAPI*)(LPCSTR))a
4150: 53 79 73 63 61 6c 6c 5b 39 5d 2e 70 43 75 72 72  Syscall[9].pCurr
4160: 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65  ent)..#if define
4170: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
4180: 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 44 65  AS_WIDE).  { "De
4190: 6c 65 74 65 46 69 6c 65 57 22 2c 20 20 20 20 20  leteFileW",     
41a0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
41b0: 29 44 65 6c 65 74 65 46 69 6c 65 57 2c 20 20 20  )DeleteFileW,   
41c0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
41d0: 65 6c 73 65 0a 20 20 7b 20 22 44 65 6c 65 74 65  else.  { "Delete
41e0: 46 69 6c 65 57 22 2c 20 20 20 20 20 20 20 20 20  FileW",         
41f0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
4200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4210: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
4220: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 44 65 6c  f..#define osDel
4230: 65 74 65 46 69 6c 65 57 20 28 28 42 4f 4f 4c 28  eteFileW ((BOOL(
4240: 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52  WINAPI*)(LPCWSTR
4250: 29 29 61 53 79 73 63 61 6c 6c 5b 31 30 5d 2e 70  ))aSyscall[10].p
4260: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51  Current)..#if SQ
4270: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
4280: 7b 20 22 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63  { "FileTimeToLoc
4290: 61 6c 46 69 6c 65 54 69 6d 65 22 2c 20 28 53 59  alFileTime", (SY
42a0: 53 43 41 4c 4c 29 46 69 6c 65 54 69 6d 65 54 6f  SCALL)FileTimeTo
42b0: 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65 2c 20 30  LocalFileTime, 0
42c0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 46   },.#else.  { "F
42d0: 69 6c 65 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69  ileTimeToLocalFi
42e0: 6c 65 54 69 6d 65 22 2c 20 28 53 59 53 43 41 4c  leTime", (SYSCAL
42f0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
4300: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
4310: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
4320: 6f 73 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63 61  osFileTimeToLoca
4330: 6c 46 69 6c 65 54 69 6d 65 20 28 28 42 4f 4f 4c  lFileTime ((BOOL
4340: 28 57 49 4e 41 50 49 2a 29 28 43 4f 4e 53 54 20  (WINAPI*)(CONST 
4350: 46 49 4c 45 54 49 4d 45 2a 2c 20 5c 0a 20 20 20  FILETIME*, \.   
4360: 20 20 20 20 20 4c 50 46 49 4c 45 54 49 4d 45 29       LPFILETIME)
4370: 29 61 53 79 73 63 61 6c 6c 5b 31 31 5d 2e 70 43  )aSyscall[11].pC
4380: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c  urrent)..#if SQL
4390: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 7b  ITE_OS_WINCE.  {
43a0: 20 22 46 69 6c 65 54 69 6d 65 54 6f 53 79 73 74   "FileTimeToSyst
43b0: 65 6d 54 69 6d 65 22 2c 20 20 20 20 28 53 59 53  emTime",    (SYS
43c0: 43 41 4c 4c 29 46 69 6c 65 54 69 6d 65 54 6f 53  CALL)FileTimeToS
43d0: 79 73 74 65 6d 54 69 6d 65 2c 20 20 20 20 30 20  ystemTime,    0 
43e0: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 46 69  },.#else.  { "Fi
43f0: 6c 65 54 69 6d 65 54 6f 53 79 73 74 65 6d 54 69  leTimeToSystemTi
4400: 6d 65 22 2c 20 20 20 20 28 53 59 53 43 41 4c 4c  me",    (SYSCALL
4410: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
4420: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
4430: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
4440: 73 46 69 6c 65 54 69 6d 65 54 6f 53 79 73 74 65  sFileTimeToSyste
4450: 6d 54 69 6d 65 20 28 28 42 4f 4f 4c 28 57 49 4e  mTime ((BOOL(WIN
4460: 41 50 49 2a 29 28 43 4f 4e 53 54 20 46 49 4c 45  API*)(CONST FILE
4470: 54 49 4d 45 2a 2c 20 5c 0a 20 20 20 20 20 20 20  TIME*, \.       
4480: 20 4c 50 53 59 53 54 45 4d 54 49 4d 45 29 29 61   LPSYSTEMTIME))a
4490: 53 79 73 63 61 6c 6c 5b 31 32 5d 2e 70 43 75 72  Syscall[12].pCur
44a0: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 46 6c 75 73  rent)..  { "Flus
44b0: 68 46 69 6c 65 42 75 66 66 65 72 73 22 2c 20 20  hFileBuffers",  
44c0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 46        (SYSCALL)F
44d0: 6c 75 73 68 46 69 6c 65 42 75 66 66 65 72 73 2c  lushFileBuffers,
44e0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64          0 },..#d
44f0: 65 66 69 6e 65 20 6f 73 46 6c 75 73 68 46 69 6c  efine osFlushFil
4500: 65 42 75 66 66 65 72 73 20 28 28 42 4f 4f 4c 28  eBuffers ((BOOL(
4510: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 29  WINAPI*)(HANDLE)
4520: 29 61 53 79 73 63 61 6c 6c 5b 31 33 5d 2e 70 43  )aSyscall[13].pC
4530: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66  urrent)..#if def
4540: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
4550: 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20  2_HAS_ANSI).  { 
4560: 22 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 41 22  "FormatMessageA"
4570: 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43  ,          (SYSC
4580: 41 4c 4c 29 46 6f 72 6d 61 74 4d 65 73 73 61 67  ALL)FormatMessag
4590: 65 41 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d  eA,          0 }
45a0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 46 6f 72  ,.#else.  { "For
45b0: 6d 61 74 4d 65 73 73 61 67 65 41 22 2c 20 20 20  matMessageA",   
45c0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
45d0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
45e0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
45f0: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
4600: 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 41 20 28  FormatMessageA (
4610: 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28  (DWORD(WINAPI*)(
4620: 44 57 4f 52 44 2c 4c 50 43 56 4f 49 44 2c 44 57  DWORD,LPCVOID,DW
4630: 4f 52 44 2c 44 57 4f 52 44 2c 4c 50 53 54 52 2c  ORD,DWORD,LPSTR,
4640: 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44   \.        DWORD
4650: 2c 76 61 5f 6c 69 73 74 2a 29 29 61 53 79 73 63  ,va_list*))aSysc
4660: 61 6c 6c 5b 31 34 5d 2e 70 43 75 72 72 65 6e 74  all[14].pCurrent
4670: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  )..#if defined(S
4680: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
4690: 57 49 44 45 29 0a 20 20 7b 20 22 46 6f 72 6d 61  WIDE).  { "Forma
46a0: 74 4d 65 73 73 61 67 65 57 22 2c 20 20 20 20 20  tMessageW",     
46b0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 46 6f       (SYSCALL)Fo
46c0: 72 6d 61 74 4d 65 73 73 61 67 65 57 2c 20 20 20  rmatMessageW,   
46d0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
46e0: 65 0a 20 20 7b 20 22 46 6f 72 6d 61 74 4d 65 73  e.  { "FormatMes
46f0: 73 61 67 65 57 22 2c 20 20 20 20 20 20 20 20 20  sageW",         
4700: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
4710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4720: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
4730: 23 64 65 66 69 6e 65 20 6f 73 46 6f 72 6d 61 74  #define osFormat
4740: 4d 65 73 73 61 67 65 57 20 28 28 44 57 4f 52 44  MessageW ((DWORD
4750: 28 57 49 4e 41 50 49 2a 29 28 44 57 4f 52 44 2c  (WINAPI*)(DWORD,
4760: 4c 50 43 56 4f 49 44 2c 44 57 4f 52 44 2c 44 57  LPCVOID,DWORD,DW
4770: 4f 52 44 2c 4c 50 57 53 54 52 2c 20 5c 0a 20 20  ORD,LPWSTR, \.  
4780: 20 20 20 20 20 20 44 57 4f 52 44 2c 76 61 5f 6c        DWORD,va_l
4790: 69 73 74 2a 29 29 61 53 79 73 63 61 6c 6c 5b 31  ist*))aSyscall[1
47a0: 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  5].pCurrent)..#i
47b0: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
47c0: 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45  E_OMIT_LOAD_EXTE
47d0: 4e 53 49 4f 4e 29 0a 20 20 7b 20 22 46 72 65 65  NSION).  { "Free
47e0: 4c 69 62 72 61 72 79 22 2c 20 20 20 20 20 20 20  Library",       
47f0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 46        (SYSCALL)F
4800: 72 65 65 4c 69 62 72 61 72 79 2c 20 20 20 20 20  reeLibrary,     
4810: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
4820: 73 65 0a 20 20 7b 20 22 46 72 65 65 4c 69 62 72  se.  { "FreeLibr
4830: 61 72 79 22 2c 20 20 20 20 20 20 20 20 20 20 20  ary",           
4840: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
4850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4860: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
4870: 0a 23 64 65 66 69 6e 65 20 6f 73 46 72 65 65 4c  .#define osFreeL
4880: 69 62 72 61 72 79 20 28 28 42 4f 4f 4c 28 57 49  ibrary ((BOOL(WI
4890: 4e 41 50 49 2a 29 28 48 4d 4f 44 55 4c 45 29 29  NAPI*)(HMODULE))
48a0: 61 53 79 73 63 61 6c 6c 5b 31 36 5d 2e 70 43 75  aSyscall[16].pCu
48b0: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 47 65 74  rrent)..  { "Get
48c0: 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
48d0: 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29  ",     (SYSCALL)
48e0: 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
48f0: 73 49 64 2c 20 20 20 20 20 30 20 7d 2c 0a 0a 23  sId,     0 },..#
4900: 64 65 66 69 6e 65 20 6f 73 47 65 74 43 75 72 72  define osGetCurr
4910: 65 6e 74 50 72 6f 63 65 73 73 49 64 20 28 28 44  entProcessId ((D
4920: 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 56 4f  WORD(WINAPI*)(VO
4930: 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 31 37 5d  ID))aSyscall[17]
4940: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
4950: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45  !SQLITE_OS_WINCE
4960: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
4970: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
4980: 49 29 0a 20 20 7b 20 22 47 65 74 44 69 73 6b 46  I).  { "GetDiskF
4990: 72 65 65 53 70 61 63 65 41 22 2c 20 20 20 20 20  reeSpaceA",     
49a0: 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 44 69    (SYSCALL)GetDi
49b0: 73 6b 46 72 65 65 53 70 61 63 65 41 2c 20 20 20  skFreeSpaceA,   
49c0: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
49d0: 20 7b 20 22 47 65 74 44 69 73 6b 46 72 65 65 53   { "GetDiskFreeS
49e0: 70 61 63 65 41 22 2c 20 20 20 20 20 20 20 28 53  paceA",       (S
49f0: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
4a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a10: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
4a20: 66 69 6e 65 20 6f 73 47 65 74 44 69 73 6b 46 72  fine osGetDiskFr
4a30: 65 65 53 70 61 63 65 41 20 28 28 42 4f 4f 4c 28  eeSpaceA ((BOOL(
4a40: 57 49 4e 41 50 49 2a 29 28 4c 50 43 53 54 52 2c  WINAPI*)(LPCSTR,
4a50: 4c 50 44 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c  LPDWORD,LPDWORD,
4a60: 4c 50 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20  LPDWORD, \.     
4a70: 20 20 20 4c 50 44 57 4f 52 44 29 29 61 53 79 73     LPDWORD))aSys
4a80: 63 61 6c 6c 5b 31 38 5d 2e 70 43 75 72 72 65 6e  call[18].pCurren
4a90: 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  t)..#if !SQLITE_
4aa0: 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c  OS_WINCE && !SQL
4ab0: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20  ITE_OS_WINRT && 
4ac0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
4ad0: 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20  IN32_HAS_WIDE). 
4ae0: 20 7b 20 22 47 65 74 44 69 73 6b 46 72 65 65 53   { "GetDiskFreeS
4af0: 70 61 63 65 57 22 2c 20 20 20 20 20 20 20 28 53  paceW",       (S
4b00: 59 53 43 41 4c 4c 29 47 65 74 44 69 73 6b 46 72  YSCALL)GetDiskFr
4b10: 65 65 53 70 61 63 65 57 2c 20 20 20 20 20 20 20  eeSpaceW,       
4b20: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
4b30: 47 65 74 44 69 73 6b 46 72 65 65 53 70 61 63 65  GetDiskFreeSpace
4b40: 57 22 2c 20 20 20 20 20 20 20 28 53 59 53 43 41  W",       (SYSCA
4b50: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
4b60: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
4b70: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
4b80: 20 6f 73 47 65 74 44 69 73 6b 46 72 65 65 53 70   osGetDiskFreeSp
4b90: 61 63 65 57 20 28 28 42 4f 4f 4c 28 57 49 4e 41  aceW ((BOOL(WINA
4ba0: 50 49 2a 29 28 4c 50 43 57 53 54 52 2c 4c 50 44  PI*)(LPCWSTR,LPD
4bb0: 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 4c 50 44  WORD,LPDWORD,LPD
4bc0: 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20  WORD, \.        
4bd0: 4c 50 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c  LPDWORD))aSyscal
4be0: 6c 5b 31 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[19].pCurrent).
4bf0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
4c00: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
4c10: 53 49 29 0a 20 20 7b 20 22 47 65 74 46 69 6c 65  SI).  { "GetFile
4c20: 41 74 74 72 69 62 75 74 65 73 41 22 2c 20 20 20  AttributesA",   
4c30: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 46     (SYSCALL)GetF
4c40: 69 6c 65 41 74 74 72 69 62 75 74 65 73 41 2c 20  ileAttributesA, 
4c50: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
4c60: 20 20 7b 20 22 47 65 74 46 69 6c 65 41 74 74 72    { "GetFileAttr
4c70: 69 62 75 74 65 73 41 22 2c 20 20 20 20 20 20 28  ibutesA",      (
4c80: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
4c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ca0: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
4cb0: 65 66 69 6e 65 20 6f 73 47 65 74 46 69 6c 65 41  efine osGetFileA
4cc0: 74 74 72 69 62 75 74 65 73 41 20 28 28 44 57 4f  ttributesA ((DWO
4cd0: 52 44 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 53  RD(WINAPI*)(LPCS
4ce0: 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 32 30 5d  TR))aSyscall[20]
4cf0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
4d00: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
4d10: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
4d20: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
4d30: 45 29 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 41  E).  { "GetFileA
4d40: 74 74 72 69 62 75 74 65 73 57 22 2c 20 20 20 20  ttributesW",    
4d50: 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 46 69    (SYSCALL)GetFi
4d60: 6c 65 41 74 74 72 69 62 75 74 65 73 57 2c 20 20  leAttributesW,  
4d70: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
4d80: 20 7b 20 22 47 65 74 46 69 6c 65 41 74 74 72 69   { "GetFileAttri
4d90: 62 75 74 65 73 57 22 2c 20 20 20 20 20 20 28 53  butesW",      (S
4da0: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
4db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4dc0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
4dd0: 66 69 6e 65 20 6f 73 47 65 74 46 69 6c 65 41 74  fine osGetFileAt
4de0: 74 72 69 62 75 74 65 73 57 20 28 28 44 57 4f 52  tributesW ((DWOR
4df0: 44 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53  D(WINAPI*)(LPCWS
4e00: 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 32 31 5d  TR))aSyscall[21]
4e10: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
4e20: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
4e30: 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20  IN32_HAS_WIDE). 
4e40: 20 7b 20 22 47 65 74 46 69 6c 65 41 74 74 72 69   { "GetFileAttri
4e50: 62 75 74 65 73 45 78 57 22 2c 20 20 20 20 28 53  butesExW",    (S
4e60: 59 53 43 41 4c 4c 29 47 65 74 46 69 6c 65 41 74  YSCALL)GetFileAt
4e70: 74 72 69 62 75 74 65 73 45 78 57 2c 20 20 20 20  tributesExW,    
4e80: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
4e90: 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
4ea0: 73 45 78 57 22 2c 20 20 20 20 28 53 59 53 43 41  sExW",    (SYSCA
4eb0: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
4ec0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
4ed0: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
4ee0: 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62   osGetFileAttrib
4ef0: 75 74 65 73 45 78 57 20 28 28 42 4f 4f 4c 28 57  utesExW ((BOOL(W
4f00: 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52 2c  INAPI*)(LPCWSTR,
4f10: 47 45 54 5f 46 49 4c 45 45 58 5f 49 4e 46 4f 5f  GET_FILEEX_INFO_
4f20: 4c 45 56 45 4c 53 2c 20 5c 0a 20 20 20 20 20 20  LEVELS, \.      
4f30: 20 20 4c 50 56 4f 49 44 29 29 61 53 79 73 63 61    LPVOID))aSysca
4f40: 6c 6c 5b 32 32 5d 2e 70 43 75 72 72 65 6e 74 29  ll[22].pCurrent)
4f50: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
4f60: 5f 57 49 4e 52 54 0a 20 20 7b 20 22 47 65 74 46  _WINRT.  { "GetF
4f70: 69 6c 65 53 69 7a 65 22 2c 20 20 20 20 20 20 20  ileSize",       
4f80: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47        (SYSCALL)G
4f90: 65 74 46 69 6c 65 53 69 7a 65 2c 20 20 20 20 20  etFileSize,     
4fa0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
4fb0: 73 65 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 53  se.  { "GetFileS
4fc0: 69 7a 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ize",           
4fd0: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
4fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ff0: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
5000: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 46 69  .#define osGetFi
5010: 6c 65 53 69 7a 65 20 28 28 44 57 4f 52 44 28 57  leSize ((DWORD(W
5020: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c  INAPI*)(HANDLE,L
5030: 50 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c  PDWORD))aSyscall
5040: 5b 32 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [23].pCurrent)..
5050: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
5060: 49 4e 43 45 20 26 26 20 64 65 66 69 6e 65 64 28  INCE && defined(
5070: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
5080: 5f 41 4e 53 49 29 0a 20 20 7b 20 22 47 65 74 46  _ANSI).  { "GetF
5090: 75 6c 6c 50 61 74 68 4e 61 6d 65 41 22 2c 20 20  ullPathNameA",  
50a0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47        (SYSCALL)G
50b0: 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41 2c  etFullPathNameA,
50c0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
50d0: 73 65 0a 20 20 7b 20 22 47 65 74 46 75 6c 6c 50  se.  { "GetFullP
50e0: 61 74 68 4e 61 6d 65 41 22 2c 20 20 20 20 20 20  athNameA",      
50f0: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
5100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5110: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
5120: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 46 75  .#define osGetFu
5130: 6c 6c 50 61 74 68 4e 61 6d 65 41 20 28 28 44 57  llPathNameA ((DW
5140: 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 4c 50 43  ORD(WINAPI*)(LPC
5150: 53 54 52 2c 44 57 4f 52 44 2c 4c 50 53 54 52 2c  STR,DWORD,LPSTR,
5160: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 53 54 52   \.        LPSTR
5170: 2a 29 29 61 53 79 73 63 61 6c 6c 5b 32 34 5d 2e  *))aSyscall[24].
5180: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
5190: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
51a0: 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  && !SQLITE_OS_WI
51b0: 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53  NRT && defined(S
51c0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
51d0: 57 49 44 45 29 0a 20 20 7b 20 22 47 65 74 46 75  WIDE).  { "GetFu
51e0: 6c 6c 50 61 74 68 4e 61 6d 65 57 22 2c 20 20 20  llPathNameW",   
51f0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65       (SYSCALL)Ge
5200: 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57 2c 20  tFullPathNameW, 
5210: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
5220: 65 0a 20 20 7b 20 22 47 65 74 46 75 6c 6c 50 61  e.  { "GetFullPa
5230: 74 68 4e 61 6d 65 57 22 2c 20 20 20 20 20 20 20  thNameW",       
5240: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
5250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5260: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
5270: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 46 75 6c  #define osGetFul
5280: 6c 50 61 74 68 4e 61 6d 65 57 20 28 28 44 57 4f  lPathNameW ((DWO
5290: 52 44 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57  RD(WINAPI*)(LPCW
52a0: 53 54 52 2c 44 57 4f 52 44 2c 4c 50 57 53 54 52  STR,DWORD,LPWSTR
52b0: 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 57 53  , \.        LPWS
52c0: 54 52 2a 29 29 61 53 79 73 63 61 6c 6c 5b 32 35  TR*))aSyscall[25
52d0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
52e0: 20 22 47 65 74 4c 61 73 74 45 72 72 6f 72 22 2c   "GetLastError",
52f0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
5300: 43 41 4c 4c 29 47 65 74 4c 61 73 74 45 72 72 6f  CALL)GetLastErro
5310: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 30 20  r,            0 
5320: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65  },..#define osGe
5330: 74 4c 61 73 74 45 72 72 6f 72 20 28 28 44 57 4f  tLastError ((DWO
5340: 52 44 28 57 49 4e 41 50 49 2a 29 28 56 4f 49 44  RD(WINAPI*)(VOID
5350: 29 29 61 53 79 73 63 61 6c 6c 5b 32 36 5d 2e 70  ))aSyscall[26].p
5360: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 64  Current)..#if !d
5370: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
5380: 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f  IT_LOAD_EXTENSIO
5390: 4e 29 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  N).#if SQLITE_OS
53a0: 5f 57 49 4e 43 45 0a 20 20 2f 2a 20 54 68 65 20  _WINCE.  /* The 
53b0: 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 41 28  GetProcAddressA(
53c0: 29 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c  ) routine is onl
53d0: 79 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 57  y available on W
53e0: 69 6e 64 6f 77 73 20 43 45 2e 20 2a 2f 0a 20 20  indows CE. */.  
53f0: 7b 20 22 47 65 74 50 72 6f 63 41 64 64 72 65 73  { "GetProcAddres
5400: 73 41 22 2c 20 20 20 20 20 20 20 20 20 28 53 59  sA",         (SY
5410: 53 43 41 4c 4c 29 47 65 74 50 72 6f 63 41 64 64  SCALL)GetProcAdd
5420: 72 65 73 73 41 2c 20 20 20 20 20 20 20 20 20 30  ressA,         0
5430: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 41   },.#else.  /* A
5440: 6c 6c 20 6f 74 68 65 72 20 57 69 6e 64 6f 77 73  ll other Windows
5450: 20 70 6c 61 74 66 6f 72 6d 73 20 65 78 70 65 63   platforms expec
5460: 74 20 47 65 74 50 72 6f 63 41 64 64 72 65 73 73  t GetProcAddress
5470: 28 29 20 74 6f 20 74 61 6b 65 0a 20 20 2a 2a 20  () to take.  ** 
5480: 61 6e 20 41 4e 53 49 20 73 74 72 69 6e 67 20 72  an ANSI string r
5490: 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65  egardless of the
54a0: 20 5f 55 4e 49 43 4f 44 45 20 73 65 74 74 69 6e   _UNICODE settin
54b0: 67 20 2a 2f 0a 20 20 7b 20 22 47 65 74 50 72 6f  g */.  { "GetPro
54c0: 63 41 64 64 72 65 73 73 41 22 2c 20 20 20 20 20  cAddressA",     
54d0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74      (SYSCALL)Get
54e0: 50 72 6f 63 41 64 64 72 65 73 73 2c 20 20 20 20  ProcAddress,    
54f0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
5500: 66 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74  f.#else.  { "Get
5510: 50 72 6f 63 41 64 64 72 65 73 73 41 22 2c 20 20  ProcAddressA",  
5520: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
5530: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
5540: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
5550: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
5560: 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 41 20  GetProcAddressA 
5570: 28 28 46 41 52 50 52 4f 43 28 57 49 4e 41 50 49  ((FARPROC(WINAPI
5580: 2a 29 28 48 4d 4f 44 55 4c 45 2c 20 5c 0a 20 20  *)(HMODULE, \.  
5590: 20 20 20 20 20 20 4c 50 43 53 54 52 29 29 61 53        LPCSTR))aS
55a0: 79 73 63 61 6c 6c 5b 32 37 5d 2e 70 43 75 72 72  yscall[27].pCurr
55b0: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
55c0: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22  E_OS_WINRT.  { "
55d0: 47 65 74 53 79 73 74 65 6d 49 6e 66 6f 22 2c 20  GetSystemInfo", 
55e0: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
55f0: 4c 4c 29 47 65 74 53 79 73 74 65 6d 49 6e 66 6f  LL)GetSystemInfo
5600: 2c 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c  ,           0 },
5610: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 53  .#else.  { "GetS
5620: 79 73 74 65 6d 49 6e 66 6f 22 2c 20 20 20 20 20  ystemInfo",     
5630: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
5640: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
5650: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
5660: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47  dif..#define osG
5670: 65 74 53 79 73 74 65 6d 49 6e 66 6f 20 28 28 56  etSystemInfo ((V
5680: 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 4c 50 53  OID(WINAPI*)(LPS
5690: 59 53 54 45 4d 5f 49 4e 46 4f 29 29 61 53 79 73  YSTEM_INFO))aSys
56a0: 63 61 6c 6c 5b 32 38 5d 2e 70 43 75 72 72 65 6e  call[28].pCurren
56b0: 74 29 0a 0a 20 20 7b 20 22 47 65 74 53 79 73 74  t)..  { "GetSyst
56c0: 65 6d 54 69 6d 65 22 2c 20 20 20 20 20 20 20 20  emTime",        
56d0: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 53     (SYSCALL)GetS
56e0: 79 73 74 65 6d 54 69 6d 65 2c 20 20 20 20 20 20  ystemTime,      
56f0: 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69       0 },..#defi
5700: 6e 65 20 6f 73 47 65 74 53 79 73 74 65 6d 54 69  ne osGetSystemTi
5710: 6d 65 20 28 28 56 4f 49 44 28 57 49 4e 41 50 49  me ((VOID(WINAPI
5720: 2a 29 28 4c 50 53 59 53 54 45 4d 54 49 4d 45 29  *)(LPSYSTEMTIME)
5730: 29 61 53 79 73 63 61 6c 6c 5b 32 39 5d 2e 70 43  )aSyscall[29].pC
5740: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
5750: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
5760: 7b 20 22 47 65 74 53 79 73 74 65 6d 54 69 6d 65  { "GetSystemTime
5770: 41 73 46 69 6c 65 54 69 6d 65 22 2c 20 28 53 59  AsFileTime", (SY
5780: 53 43 41 4c 4c 29 47 65 74 53 79 73 74 65 6d 54  SCALL)GetSystemT
5790: 69 6d 65 41 73 46 69 6c 65 54 69 6d 65 2c 20 30  imeAsFileTime, 0
57a0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47   },.#else.  { "G
57b0: 65 74 53 79 73 74 65 6d 54 69 6d 65 41 73 46 69  etSystemTimeAsFi
57c0: 6c 65 54 69 6d 65 22 2c 20 28 53 59 53 43 41 4c  leTime", (SYSCAL
57d0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
57e0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
57f0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
5800: 6f 73 47 65 74 53 79 73 74 65 6d 54 69 6d 65 41  osGetSystemTimeA
5810: 73 46 69 6c 65 54 69 6d 65 20 28 28 56 4f 49 44  sFileTime ((VOID
5820: 28 57 49 4e 41 50 49 2a 29 28 20 5c 0a 20 20 20  (WINAPI*)( \.   
5830: 20 20 20 20 20 4c 50 46 49 4c 45 54 49 4d 45 29       LPFILETIME)
5840: 29 61 53 79 73 63 61 6c 6c 5b 33 30 5d 2e 70 43  )aSyscall[30].pC
5850: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66  urrent)..#if def
5860: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
5870: 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20  2_HAS_ANSI).  { 
5880: 22 47 65 74 54 65 6d 70 50 61 74 68 41 22 2c 20  "GetTempPathA", 
5890: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
58a0: 41 4c 4c 29 47 65 74 54 65 6d 70 50 61 74 68 41  ALL)GetTempPathA
58b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d  ,            0 }
58c0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74  ,.#else.  { "Get
58d0: 54 65 6d 70 50 61 74 68 41 22 2c 20 20 20 20 20  TempPathA",     
58e0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
58f0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
5900: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
5910: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
5920: 47 65 74 54 65 6d 70 50 61 74 68 41 20 28 28 44  GetTempPathA ((D
5930: 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 44 57  WORD(WINAPI*)(DW
5940: 4f 52 44 2c 4c 50 53 54 52 29 29 61 53 79 73 63  ORD,LPSTR))aSysc
5950: 61 6c 6c 5b 33 31 5d 2e 70 43 75 72 72 65 6e 74  all[31].pCurrent
5960: 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  )..#if !SQLITE_O
5970: 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e  S_WINRT && defin
5980: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
5990: 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 47  HAS_WIDE).  { "G
59a0: 65 74 54 65 6d 70 50 61 74 68 57 22 2c 20 20 20  etTempPathW",   
59b0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
59c0: 4c 29 47 65 74 54 65 6d 70 50 61 74 68 57 2c 20  L)GetTempPathW, 
59d0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
59e0: 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 54 65  #else.  { "GetTe
59f0: 6d 70 50 61 74 68 57 22 2c 20 20 20 20 20 20 20  mpPathW",       
5a00: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
5a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a20: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
5a30: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65  if..#define osGe
5a40: 74 54 65 6d 70 50 61 74 68 57 20 28 28 44 57 4f  tTempPathW ((DWO
5a50: 52 44 28 57 49 4e 41 50 49 2a 29 28 44 57 4f 52  RD(WINAPI*)(DWOR
5a60: 44 2c 4c 50 57 53 54 52 29 29 61 53 79 73 63 61  D,LPWSTR))aSysca
5a70: 6c 6c 5b 33 32 5d 2e 70 43 75 72 72 65 6e 74 29  ll[32].pCurrent)
5a80: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
5a90: 5f 57 49 4e 52 54 0a 20 20 7b 20 22 47 65 74 54  _WINRT.  { "GetT
5aa0: 69 63 6b 43 6f 75 6e 74 22 2c 20 20 20 20 20 20  ickCount",      
5ab0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47        (SYSCALL)G
5ac0: 65 74 54 69 63 6b 43 6f 75 6e 74 2c 20 20 20 20  etTickCount,    
5ad0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
5ae0: 73 65 0a 20 20 7b 20 22 47 65 74 54 69 63 6b 43  se.  { "GetTickC
5af0: 6f 75 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20  ount",          
5b00: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
5b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b20: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
5b30: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 54 69  .#define osGetTi
5b40: 63 6b 43 6f 75 6e 74 20 28 28 44 57 4f 52 44 28  ckCount ((DWORD(
5b50: 57 49 4e 41 50 49 2a 29 28 56 4f 49 44 29 29 61  WINAPI*)(VOID))a
5b60: 53 79 73 63 61 6c 6c 5b 33 33 5d 2e 70 43 75 72  Syscall[33].pCur
5b70: 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e  rent)..#if defin
5b80: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
5b90: 48 41 53 5f 41 4e 53 49 29 20 26 26 20 64 65 66  HAS_ANSI) && def
5ba0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
5bb0: 32 5f 47 45 54 56 45 52 53 49 4f 4e 45 58 29 20  2_GETVERSIONEX) 
5bc0: 26 26 20 5c 0a 20 20 20 20 20 20 20 20 53 51 4c  && \.        SQL
5bd0: 49 54 45 5f 57 49 4e 33 32 5f 47 45 54 56 45 52  ITE_WIN32_GETVER
5be0: 53 49 4f 4e 45 58 0a 20 20 7b 20 22 47 65 74 56  SIONEX.  { "GetV
5bf0: 65 72 73 69 6f 6e 45 78 41 22 2c 20 20 20 20 20  ersionExA",     
5c00: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47        (SYSCALL)G
5c10: 65 74 56 65 72 73 69 6f 6e 45 78 41 2c 20 20 20  etVersionExA,   
5c20: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
5c30: 73 65 0a 20 20 7b 20 22 47 65 74 56 65 72 73 69  se.  { "GetVersi
5c40: 6f 6e 45 78 41 22 2c 20 20 20 20 20 20 20 20 20  onExA",         
5c50: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
5c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c70: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
5c80: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 56 65  .#define osGetVe
5c90: 72 73 69 6f 6e 45 78 41 20 28 28 42 4f 4f 4c 28  rsionExA ((BOOL(
5ca0: 57 49 4e 41 50 49 2a 29 28 20 5c 0a 20 20 20 20  WINAPI*)( \.    
5cb0: 20 20 20 20 4c 50 4f 53 56 45 52 53 49 4f 4e 49      LPOSVERSIONI
5cc0: 4e 46 4f 41 29 29 61 53 79 73 63 61 6c 6c 5b 33  NFOA))aSyscall[3
5cd0: 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  4].pCurrent)..#i
5ce0: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
5cf0: 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  RT && defined(SQ
5d00: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57  LITE_WIN32_HAS_W
5d10: 49 44 45 29 20 26 26 20 5c 0a 20 20 20 20 20 20  IDE) && \.      
5d20: 20 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45    defined(SQLITE
5d30: 5f 57 49 4e 33 32 5f 47 45 54 56 45 52 53 49 4f  _WIN32_GETVERSIO
5d40: 4e 45 58 29 20 26 26 20 53 51 4c 49 54 45 5f 57  NEX) && SQLITE_W
5d50: 49 4e 33 32 5f 47 45 54 56 45 52 53 49 4f 4e 45  IN32_GETVERSIONE
5d60: 58 0a 20 20 7b 20 22 47 65 74 56 65 72 73 69 6f  X.  { "GetVersio
5d70: 6e 45 78 57 22 2c 20 20 20 20 20 20 20 20 20 20  nExW",          
5d80: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 56 65 72   (SYSCALL)GetVer
5d90: 73 69 6f 6e 45 78 57 2c 20 20 20 20 20 20 20 20  sionExW,        
5da0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
5db0: 7b 20 22 47 65 74 56 65 72 73 69 6f 6e 45 78 57  { "GetVersionExW
5dc0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ",           (SY
5dd0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
5de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
5df0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
5e00: 69 6e 65 20 6f 73 47 65 74 56 65 72 73 69 6f 6e  ine osGetVersion
5e10: 45 78 57 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  ExW ((BOOL(WINAP
5e20: 49 2a 29 28 20 5c 0a 20 20 20 20 20 20 20 20 4c  I*)( \.        L
5e30: 50 4f 53 56 45 52 53 49 4f 4e 49 4e 46 4f 57 29  POSVERSIONINFOW)
5e40: 29 61 53 79 73 63 61 6c 6c 5b 33 35 5d 2e 70 43  )aSyscall[35].pC
5e50: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 48 65  urrent)..  { "He
5e60: 61 70 41 6c 6c 6f 63 22 2c 20 20 20 20 20 20 20  apAlloc",       
5e70: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
5e80: 29 48 65 61 70 41 6c 6c 6f 63 2c 20 20 20 20 20  )HeapAlloc,     
5e90: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a            0 },..
5ea0: 23 64 65 66 69 6e 65 20 6f 73 48 65 61 70 41 6c  #define osHeapAl
5eb0: 6c 6f 63 20 28 28 4c 50 56 4f 49 44 28 57 49 4e  loc ((LPVOID(WIN
5ec0: 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f  API*)(HANDLE,DWO
5ed0: 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 53 49  RD, \.        SI
5ee0: 5a 45 5f 54 29 29 61 53 79 73 63 61 6c 6c 5b 33  ZE_T))aSyscall[3
5ef0: 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  6].pCurrent)..#i
5f00: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
5f10: 52 54 0a 20 20 7b 20 22 48 65 61 70 43 72 65 61  RT.  { "HeapCrea
5f20: 74 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  te",            
5f30: 20 20 28 53 59 53 43 41 4c 4c 29 48 65 61 70 43    (SYSCALL)HeapC
5f40: 72 65 61 74 65 2c 20 20 20 20 20 20 20 20 20 20  reate,          
5f50: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
5f60: 20 7b 20 22 48 65 61 70 43 72 65 61 74 65 22 2c   { "HeapCreate",
5f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
5f80: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
5f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5fa0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
5fb0: 66 69 6e 65 20 6f 73 48 65 61 70 43 72 65 61 74  fine osHeapCreat
5fc0: 65 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50  e ((HANDLE(WINAP
5fd0: 49 2a 29 28 44 57 4f 52 44 2c 53 49 5a 45 5f 54  I*)(DWORD,SIZE_T
5fe0: 2c 20 5c 0a 20 20 20 20 20 20 20 20 53 49 5a 45  , \.        SIZE
5ff0: 5f 54 29 29 61 53 79 73 63 61 6c 6c 5b 33 37 5d  _T))aSyscall[37]
6000: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
6010: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
6020: 0a 20 20 7b 20 22 48 65 61 70 44 65 73 74 72 6f  .  { "HeapDestro
6030: 79 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  y",             
6040: 28 53 59 53 43 41 4c 4c 29 48 65 61 70 44 65 73  (SYSCALL)HeapDes
6050: 74 72 6f 79 2c 20 20 20 20 20 20 20 20 20 20 20  troy,           
6060: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
6070: 20 22 48 65 61 70 44 65 73 74 72 6f 79 22 2c 20   "HeapDestroy", 
6080: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
6090: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
60a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
60b0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
60c0: 6e 65 20 6f 73 48 65 61 70 44 65 73 74 72 6f 79  ne osHeapDestroy
60d0: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
60e0: 28 48 41 4e 44 4c 45 29 29 61 53 79 73 63 61 6c  (HANDLE))aSyscal
60f0: 6c 5b 33 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[38].pCurrent).
6100: 0a 20 20 7b 20 22 48 65 61 70 46 72 65 65 22 2c  .  { "HeapFree",
6110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6120: 28 53 59 53 43 41 4c 4c 29 48 65 61 70 46 72 65  (SYSCALL)HeapFre
6130: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
6140: 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20    0 },..#define 
6150: 6f 73 48 65 61 70 46 72 65 65 20 28 28 42 4f 4f  osHeapFree ((BOO
6160: 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  L(WINAPI*)(HANDL
6170: 45 2c 44 57 4f 52 44 2c 4c 50 56 4f 49 44 29 29  E,DWORD,LPVOID))
6180: 61 53 79 73 63 61 6c 6c 5b 33 39 5d 2e 70 43 75  aSyscall[39].pCu
6190: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 48 65 61  rrent)..  { "Hea
61a0: 70 52 65 41 6c 6c 6f 63 22 2c 20 20 20 20 20 20  pReAlloc",      
61b0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
61c0: 48 65 61 70 52 65 41 6c 6c 6f 63 2c 20 20 20 20  HeapReAlloc,    
61d0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23           0 },..#
61e0: 64 65 66 69 6e 65 20 6f 73 48 65 61 70 52 65 41  define osHeapReA
61f0: 6c 6c 6f 63 20 28 28 4c 50 56 4f 49 44 28 57 49  lloc ((LPVOID(WI
6200: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57  NAPI*)(HANDLE,DW
6210: 4f 52 44 2c 4c 50 56 4f 49 44 2c 20 5c 0a 20 20  ORD,LPVOID, \.  
6220: 20 20 20 20 20 20 53 49 5a 45 5f 54 29 29 61 53        SIZE_T))aS
6230: 79 73 63 61 6c 6c 5b 34 30 5d 2e 70 43 75 72 72  yscall[40].pCurr
6240: 65 6e 74 29 0a 0a 20 20 7b 20 22 48 65 61 70 53  ent)..  { "HeapS
6250: 69 7a 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ize",           
6260: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65       (SYSCALL)He
6270: 61 70 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20  apSize,         
6280: 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65         0 },..#de
6290: 66 69 6e 65 20 6f 73 48 65 61 70 53 69 7a 65 20  fine osHeapSize 
62a0: 28 28 53 49 5a 45 5f 54 28 57 49 4e 41 50 49 2a  ((SIZE_T(WINAPI*
62b0: 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 20  )(HANDLE,DWORD, 
62c0: 5c 0a 20 20 20 20 20 20 20 20 4c 50 43 56 4f 49  \.        LPCVOI
62d0: 44 29 29 61 53 79 73 63 61 6c 6c 5b 34 31 5d 2e  D))aSyscall[41].
62e0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
62f0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
6300: 20 20 7b 20 22 48 65 61 70 56 61 6c 69 64 61 74    { "HeapValidat
6310: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28  e",            (
6320: 53 59 53 43 41 4c 4c 29 48 65 61 70 56 61 6c 69  SYSCALL)HeapVali
6330: 64 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  date,           
6340: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
6350: 22 48 65 61 70 56 61 6c 69 64 61 74 65 22 2c 20  "HeapValidate", 
6360: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
6370: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
6380: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
6390: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
63a0: 65 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74 65  e osHeapValidate
63b0: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
63c0: 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 20 5c  (HANDLE,DWORD, \
63d0: 0a 20 20 20 20 20 20 20 20 4c 50 43 56 4f 49 44  .        LPCVOID
63e0: 29 29 61 53 79 73 63 61 6c 6c 5b 34 32 5d 2e 70  ))aSyscall[42].p
63f0: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53  Current)..#if !S
6400: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26  QLITE_OS_WINCE &
6410: 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  & !SQLITE_OS_WIN
6420: 52 54 0a 20 20 7b 20 22 48 65 61 70 43 6f 6d 70  RT.  { "HeapComp
6430: 61 63 74 22 2c 20 20 20 20 20 20 20 20 20 20 20  act",           
6440: 20 20 28 53 59 53 43 41 4c 4c 29 48 65 61 70 43    (SYSCALL)HeapC
6450: 6f 6d 70 61 63 74 2c 20 20 20 20 20 20 20 20 20  ompact,         
6460: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
6470: 20 7b 20 22 48 65 61 70 43 6f 6d 70 61 63 74 22   { "HeapCompact"
6480: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ,             (S
6490: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
64a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
64b0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
64c0: 66 69 6e 65 20 6f 73 48 65 61 70 43 6f 6d 70 61  fine osHeapCompa
64d0: 63 74 20 28 28 55 49 4e 54 28 57 49 4e 41 50 49  ct ((UINT(WINAPI
64e0: 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 29  *)(HANDLE,DWORD)
64f0: 29 61 53 79 73 63 61 6c 6c 5b 34 33 5d 2e 70 43  )aSyscall[43].pC
6500: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66  urrent)..#if def
6510: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
6520: 32 5f 48 41 53 5f 41 4e 53 49 29 20 26 26 20 21  2_HAS_ANSI) && !
6530: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
6540: 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49  MIT_LOAD_EXTENSI
6550: 4f 4e 29 0a 20 20 7b 20 22 4c 6f 61 64 4c 69 62  ON).  { "LoadLib
6560: 72 61 72 79 41 22 2c 20 20 20 20 20 20 20 20 20  raryA",         
6570: 20 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f 61 64     (SYSCALL)Load
6580: 4c 69 62 72 61 72 79 41 2c 20 20 20 20 20 20 20  LibraryA,       
6590: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
65a0: 20 20 7b 20 22 4c 6f 61 64 4c 69 62 72 61 72 79    { "LoadLibrary
65b0: 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28  A",            (
65c0: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
65d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
65e0: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
65f0: 65 66 69 6e 65 20 6f 73 4c 6f 61 64 4c 69 62 72  efine osLoadLibr
6600: 61 72 79 41 20 28 28 48 4d 4f 44 55 4c 45 28 57  aryA ((HMODULE(W
6610: 49 4e 41 50 49 2a 29 28 4c 50 43 53 54 52 29 29  INAPI*)(LPCSTR))
6620: 61 53 79 73 63 61 6c 6c 5b 34 34 5d 2e 70 43 75  aSyscall[44].pCu
6630: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c  rrent)..#if !SQL
6640: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20  ITE_OS_WINRT && 
6650: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
6660: 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 20 26  IN32_HAS_WIDE) &
6670: 26 20 5c 0a 20 20 20 20 20 20 20 20 21 64 65 66  & \.        !def
6680: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
6690: 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 29  _LOAD_EXTENSION)
66a0: 0a 20 20 7b 20 22 4c 6f 61 64 4c 69 62 72 61 72  .  { "LoadLibrar
66b0: 79 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  yW",            
66c0: 28 53 59 53 43 41 4c 4c 29 4c 6f 61 64 4c 69 62  (SYSCALL)LoadLib
66d0: 72 61 72 79 57 2c 20 20 20 20 20 20 20 20 20 20  raryW,          
66e0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
66f0: 20 22 4c 6f 61 64 4c 69 62 72 61 72 79 57 22 2c   "LoadLibraryW",
6700: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
6710: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
6720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
6730: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
6740: 6e 65 20 6f 73 4c 6f 61 64 4c 69 62 72 61 72 79  ne osLoadLibrary
6750: 57 20 28 28 48 4d 4f 44 55 4c 45 28 57 49 4e 41  W ((HMODULE(WINA
6760: 50 49 2a 29 28 4c 50 43 57 53 54 52 29 29 61 53  PI*)(LPCWSTR))aS
6770: 79 73 63 61 6c 6c 5b 34 35 5d 2e 70 43 75 72 72  yscall[45].pCurr
6780: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
6790: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22  E_OS_WINRT.  { "
67a0: 4c 6f 63 61 6c 46 72 65 65 22 2c 20 20 20 20 20  LocalFree",     
67b0: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
67c0: 4c 4c 29 4c 6f 63 61 6c 46 72 65 65 2c 20 20 20  LL)LocalFree,   
67d0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
67e0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 63 61  .#else.  { "Loca
67f0: 6c 46 72 65 65 22 2c 20 20 20 20 20 20 20 20 20  lFree",         
6800: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
6810: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
6820: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
6830: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4c  dif..#define osL
6840: 6f 63 61 6c 46 72 65 65 20 28 28 48 4c 4f 43 41  ocalFree ((HLOCA
6850: 4c 28 57 49 4e 41 50 49 2a 29 28 48 4c 4f 43 41  L(WINAPI*)(HLOCA
6860: 4c 29 29 61 53 79 73 63 61 6c 6c 5b 34 36 5d 2e  L))aSyscall[46].
6870: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
6880: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
6890: 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  && !SQLITE_OS_WI
68a0: 4e 52 54 0a 20 20 7b 20 22 4c 6f 63 6b 46 69 6c  NRT.  { "LockFil
68b0: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
68c0: 20 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f 63 6b     (SYSCALL)Lock
68d0: 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  File,           
68e0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
68f0: 20 20 7b 20 22 4c 6f 63 6b 46 69 6c 65 22 2c 20    { "LockFile", 
6900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
6910: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
6920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6930: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 69   0 },.#endif..#i
6940: 66 6e 64 65 66 20 6f 73 4c 6f 63 6b 46 69 6c 65  fndef osLockFile
6950: 0a 23 64 65 66 69 6e 65 20 6f 73 4c 6f 63 6b 46  .#define osLockF
6960: 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  ile ((BOOL(WINAP
6970: 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44  I*)(HANDLE,DWORD
6980: 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a  ,DWORD,DWORD, \.
6990: 20 20 20 20 20 20 20 20 44 57 4f 52 44 29 29 61          DWORD))a
69a0: 53 79 73 63 61 6c 6c 5b 34 37 5d 2e 70 43 75 72  Syscall[47].pCur
69b0: 72 65 6e 74 29 0a 23 65 6e 64 69 66 0a 0a 23 69  rent).#endif..#i
69c0: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
69d0: 43 45 0a 20 20 7b 20 22 4c 6f 63 6b 46 69 6c 65  CE.  { "LockFile
69e0: 45 78 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  Ex",            
69f0: 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f 63 6b 46    (SYSCALL)LockF
6a00: 69 6c 65 45 78 2c 20 20 20 20 20 20 20 20 20 20  ileEx,          
6a10: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
6a20: 20 7b 20 22 4c 6f 63 6b 46 69 6c 65 45 78 22 2c   { "LockFileEx",
6a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
6a40: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
6a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a60: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 69 66  0 },.#endif..#if
6a70: 6e 64 65 66 20 6f 73 4c 6f 63 6b 46 69 6c 65 45  ndef osLockFileE
6a80: 78 0a 23 64 65 66 69 6e 65 20 6f 73 4c 6f 63 6b  x.#define osLock
6a90: 46 69 6c 65 45 78 20 28 28 42 4f 4f 4c 28 57 49  FileEx ((BOOL(WI
6aa0: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57  NAPI*)(HANDLE,DW
6ab0: 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c  ORD,DWORD,DWORD,
6ac0: 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20  DWORD, \.       
6ad0: 20 4c 50 4f 56 45 52 4c 41 50 50 45 44 29 29 61   LPOVERLAPPED))a
6ae0: 53 79 73 63 61 6c 6c 5b 34 38 5d 2e 70 43 75 72  Syscall[48].pCur
6af0: 72 65 6e 74 29 0a 23 65 6e 64 69 66 0a 0a 23 69  rent).#endif..#i
6b00: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
6b10: 45 20 7c 7c 20 28 21 53 51 4c 49 54 45 5f 4f 53  E || (!SQLITE_OS
6b20: 5f 57 49 4e 52 54 20 26 26 20 21 64 65 66 69 6e  _WINRT && !defin
6b30: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ed(SQLITE_OMIT_W
6b40: 41 4c 29 29 0a 20 20 7b 20 22 4d 61 70 56 69 65  AL)).  { "MapVie
6b50: 77 4f 66 46 69 6c 65 22 2c 20 20 20 20 20 20 20  wOfFile",       
6b60: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4d 61 70      (SYSCALL)Map
6b70: 56 69 65 77 4f 66 46 69 6c 65 2c 20 20 20 20 20  ViewOfFile,     
6b80: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
6b90: 0a 20 20 7b 20 22 4d 61 70 56 69 65 77 4f 66 46  .  { "MapViewOfF
6ba0: 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ile",           
6bb0: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
6bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6bd0: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
6be0: 64 65 66 69 6e 65 20 6f 73 4d 61 70 56 69 65 77  define osMapView
6bf0: 4f 66 46 69 6c 65 20 28 28 4c 50 56 4f 49 44 28  OfFile ((LPVOID(
6c00: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c  WINAPI*)(HANDLE,
6c10: 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52  DWORD,DWORD,DWOR
6c20: 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 53 49 5a  D, \.        SIZ
6c30: 45 5f 54 29 29 61 53 79 73 63 61 6c 6c 5b 34 39  E_T))aSyscall[49
6c40: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
6c50: 20 22 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64   "MultiByteToWid
6c60: 65 43 68 61 72 22 2c 20 20 20 20 20 28 53 59 53  eChar",     (SYS
6c70: 43 41 4c 4c 29 4d 75 6c 74 69 42 79 74 65 54 6f  CALL)MultiByteTo
6c80: 57 69 64 65 43 68 61 72 2c 20 20 20 20 20 30 20  WideChar,     0 
6c90: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4d 75  },..#define osMu
6ca0: 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43 68 61  ltiByteToWideCha
6cb0: 72 20 28 28 69 6e 74 28 57 49 4e 41 50 49 2a 29  r ((int(WINAPI*)
6cc0: 28 55 49 4e 54 2c 44 57 4f 52 44 2c 4c 50 43 53  (UINT,DWORD,LPCS
6cd0: 54 52 2c 69 6e 74 2c 4c 50 57 53 54 52 2c 20 5c  TR,int,LPWSTR, \
6ce0: 0a 20 20 20 20 20 20 20 20 69 6e 74 29 29 61 53  .        int))aS
6cf0: 79 73 63 61 6c 6c 5b 35 30 5d 2e 70 43 75 72 72  yscall[50].pCurr
6d00: 65 6e 74 29 0a 0a 20 20 7b 20 22 51 75 65 72 79  ent)..  { "Query
6d10: 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f 75 6e 74  PerformanceCount
6d20: 65 72 22 2c 20 28 53 59 53 43 41 4c 4c 29 51 75  er", (SYSCALL)Qu
6d30: 65 72 79 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f  eryPerformanceCo
6d40: 75 6e 74 65 72 2c 20 30 20 7d 2c 0a 0a 23 64 65  unter, 0 },..#de
6d50: 66 69 6e 65 20 6f 73 51 75 65 72 79 50 65 72 66  fine osQueryPerf
6d60: 6f 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72 20 28  ormanceCounter (
6d70: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 20  (BOOL(WINAPI*)( 
6d80: 5c 0a 20 20 20 20 20 20 20 20 4c 41 52 47 45 5f  \.        LARGE_
6d90: 49 4e 54 45 47 45 52 2a 29 29 61 53 79 73 63 61  INTEGER*))aSysca
6da0: 6c 6c 5b 35 31 5d 2e 70 43 75 72 72 65 6e 74 29  ll[51].pCurrent)
6db0: 0a 0a 20 20 7b 20 22 52 65 61 64 46 69 6c 65 22  ..  { "ReadFile"
6dc0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
6dd0: 20 28 53 59 53 43 41 4c 4c 29 52 65 61 64 46 69   (SYSCALL)ReadFi
6de0: 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
6df0: 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65     0 },..#define
6e00: 20 6f 73 52 65 61 64 46 69 6c 65 20 28 28 42 4f   osReadFile ((BO
6e10: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44  OL(WINAPI*)(HAND
6e20: 4c 45 2c 4c 50 56 4f 49 44 2c 44 57 4f 52 44 2c  LE,LPVOID,DWORD,
6e30: 4c 50 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20  LPDWORD, \.     
6e40: 20 20 20 4c 50 4f 56 45 52 4c 41 50 50 45 44 29     LPOVERLAPPED)
6e50: 29 61 53 79 73 63 61 6c 6c 5b 35 32 5d 2e 70 43  )aSyscall[52].pC
6e60: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 53 65  urrent)..  { "Se
6e70: 74 45 6e 64 4f 66 46 69 6c 65 22 2c 20 20 20 20  tEndOfFile",    
6e80: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
6e90: 29 53 65 74 45 6e 64 4f 66 46 69 6c 65 2c 20 20  )SetEndOfFile,  
6ea0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a            0 },..
6eb0: 23 64 65 66 69 6e 65 20 6f 73 53 65 74 45 6e 64  #define osSetEnd
6ec0: 4f 66 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49  OfFile ((BOOL(WI
6ed0: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 29 29 61  NAPI*)(HANDLE))a
6ee0: 53 79 73 63 61 6c 6c 5b 35 33 5d 2e 70 43 75 72  Syscall[53].pCur
6ef0: 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49  rent)..#if !SQLI
6f00: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20  TE_OS_WINRT.  { 
6f10: 22 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 22  "SetFilePointer"
6f20: 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43  ,          (SYSC
6f30: 41 4c 4c 29 53 65 74 46 69 6c 65 50 6f 69 6e 74  ALL)SetFilePoint
6f40: 65 72 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d  er,          0 }
6f50: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 53 65 74  ,.#else.  { "Set
6f60: 46 69 6c 65 50 6f 69 6e 74 65 72 22 2c 20 20 20  FilePointer",   
6f70: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
6f80: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
6f90: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
6fa0: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
6fb0: 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 20 28  SetFilePointer (
6fc0: 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28  (DWORD(WINAPI*)(
6fd0: 48 41 4e 44 4c 45 2c 4c 4f 4e 47 2c 50 4c 4f 4e  HANDLE,LONG,PLON
6fe0: 47 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f  G, \.        DWO
6ff0: 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 35 34 5d  RD))aSyscall[54]
7000: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
7010: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
7020: 0a 20 20 7b 20 22 53 6c 65 65 70 22 2c 20 20 20  .  { "Sleep",   
7030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7040: 28 53 59 53 43 41 4c 4c 29 53 6c 65 65 70 2c 20  (SYSCALL)Sleep, 
7050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7060: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
7070: 20 22 53 6c 65 65 70 22 2c 20 20 20 20 20 20 20   "Sleep",       
7080: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
7090: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
70a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
70b0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
70c0: 6e 65 20 6f 73 53 6c 65 65 70 20 28 28 56 4f 49  ne osSleep ((VOI
70d0: 44 28 57 49 4e 41 50 49 2a 29 28 44 57 4f 52 44  D(WINAPI*)(DWORD
70e0: 29 29 61 53 79 73 63 61 6c 6c 5b 35 35 5d 2e 70  ))aSyscall[55].p
70f0: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 53  Current)..  { "S
7100: 79 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54  ystemTimeToFileT
7110: 69 6d 65 22 2c 20 20 20 20 28 53 59 53 43 41 4c  ime",    (SYSCAL
7120: 4c 29 53 79 73 74 65 6d 54 69 6d 65 54 6f 46 69  L)SystemTimeToFi
7130: 6c 65 54 69 6d 65 2c 20 20 20 20 30 20 7d 2c 0a  leTime,    0 },.
7140: 0a 23 64 65 66 69 6e 65 20 6f 73 53 79 73 74 65  .#define osSyste
7150: 6d 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65 20  mTimeToFileTime 
7160: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
7170: 43 4f 4e 53 54 20 53 59 53 54 45 4d 54 49 4d 45  CONST SYSTEMTIME
7180: 2a 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 46  *, \.        LPF
7190: 49 4c 45 54 49 4d 45 29 29 61 53 79 73 63 61 6c  ILETIME))aSyscal
71a0: 6c 5b 35 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[56].pCurrent).
71b0: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
71c0: 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45  WINCE && !SQLITE
71d0: 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 55  _OS_WINRT.  { "U
71e0: 6e 6c 6f 63 6b 46 69 6c 65 22 2c 20 20 20 20 20  nlockFile",     
71f0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
7200: 4c 29 55 6e 6c 6f 63 6b 46 69 6c 65 2c 20 20 20  L)UnlockFile,   
7210: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
7220: 23 65 6c 73 65 0a 20 20 7b 20 22 55 6e 6c 6f 63  #else.  { "Unloc
7230: 6b 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20  kFile",         
7240: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
7250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7260: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
7270: 69 66 0a 0a 23 69 66 6e 64 65 66 20 6f 73 55 6e  if..#ifndef osUn
7280: 6c 6f 63 6b 46 69 6c 65 0a 23 64 65 66 69 6e 65  lockFile.#define
7290: 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 20 28 28   osUnlockFile ((
72a0: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41  BOOL(WINAPI*)(HA
72b0: 4e 44 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44  NDLE,DWORD,DWORD
72c0: 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20  ,DWORD, \.      
72d0: 20 20 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c    DWORD))aSyscal
72e0: 6c 5b 35 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[57].pCurrent).
72f0: 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 53 51 4c  #endif..#if !SQL
7300: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 7b  ITE_OS_WINCE.  {
7310: 20 22 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 22 2c   "UnlockFileEx",
7320: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
7330: 43 41 4c 4c 29 55 6e 6c 6f 63 6b 46 69 6c 65 45  CALL)UnlockFileE
7340: 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 30 20  x,            0 
7350: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 55 6e  },.#else.  { "Un
7360: 6c 6f 63 6b 46 69 6c 65 45 78 22 2c 20 20 20 20  lockFileEx",    
7370: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
7380: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
7390: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
73a0: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
73b0: 73 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 20 28 28  sUnlockFileEx ((
73c0: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41  BOOL(WINAPI*)(HA
73d0: 4e 44 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44  NDLE,DWORD,DWORD
73e0: 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20  ,DWORD, \.      
73f0: 20 20 4c 50 4f 56 45 52 4c 41 50 50 45 44 29 29    LPOVERLAPPED))
7400: 61 53 79 73 63 61 6c 6c 5b 35 38 5d 2e 70 43 75  aSyscall[58].pCu
7410: 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49  rrent)..#if SQLI
7420: 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 21  TE_OS_WINCE || !
7430: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
7440: 4d 49 54 5f 57 41 4c 29 0a 20 20 7b 20 22 55 6e  MIT_WAL).  { "Un
7450: 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 22 2c 20  mapViewOfFile", 
7460: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
7470: 29 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65  )UnmapViewOfFile
7480: 2c 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23  ,         0 },.#
7490: 65 6c 73 65 0a 20 20 7b 20 22 55 6e 6d 61 70 56  else.  { "UnmapV
74a0: 69 65 77 4f 66 46 69 6c 65 22 2c 20 20 20 20 20  iewOfFile",     
74b0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
74c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
74d0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
74e0: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 55 6e 6d  f..#define osUnm
74f0: 61 70 56 69 65 77 4f 66 46 69 6c 65 20 28 28 42  apViewOfFile ((B
7500: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43  OOL(WINAPI*)(LPC
7510: 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 35  VOID))aSyscall[5
7520: 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  9].pCurrent)..  
7530: 7b 20 22 57 69 64 65 43 68 61 72 54 6f 4d 75 6c  { "WideCharToMul
7540: 74 69 42 79 74 65 22 2c 20 20 20 20 20 28 53 59  tiByte",     (SY
7550: 53 43 41 4c 4c 29 57 69 64 65 43 68 61 72 54 6f  SCALL)WideCharTo
7560: 4d 75 6c 74 69 42 79 74 65 2c 20 20 20 20 20 30  MultiByte,     0
7570: 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 57   },..#define osW
7580: 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79  ideCharToMultiBy
7590: 74 65 20 28 28 69 6e 74 28 57 49 4e 41 50 49 2a  te ((int(WINAPI*
75a0: 29 28 55 49 4e 54 2c 44 57 4f 52 44 2c 4c 50 43  )(UINT,DWORD,LPC
75b0: 57 53 54 52 2c 69 6e 74 2c 4c 50 53 54 52 2c 69  WSTR,int,LPSTR,i
75c0: 6e 74 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  nt, \.        LP
75d0: 43 53 54 52 2c 4c 50 42 4f 4f 4c 29 29 61 53 79  CSTR,LPBOOL))aSy
75e0: 73 63 61 6c 6c 5b 36 30 5d 2e 70 43 75 72 72 65  scall[60].pCurre
75f0: 6e 74 29 0a 0a 20 20 7b 20 22 57 72 69 74 65 46  nt)..  { "WriteF
7600: 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ile",           
7610: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 57 72 69      (SYSCALL)Wri
7620: 74 65 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20  teFile,         
7630: 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66        0 },..#def
7640: 69 6e 65 20 6f 73 57 72 69 74 65 46 69 6c 65 20  ine osWriteFile 
7650: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
7660: 48 41 4e 44 4c 45 2c 4c 50 43 56 4f 49 44 2c 44  HANDLE,LPCVOID,D
7670: 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 20 5c 0a  WORD,LPDWORD, \.
7680: 20 20 20 20 20 20 20 20 4c 50 4f 56 45 52 4c 41          LPOVERLA
7690: 50 50 45 44 29 29 61 53 79 73 63 61 6c 6c 5b 36  PPED))aSyscall[6
76a0: 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  1].pCurrent)..#i
76b0: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
76c0: 54 0a 20 20 7b 20 22 43 72 65 61 74 65 45 76 65  T.  { "CreateEve
76d0: 6e 74 45 78 57 22 2c 20 20 20 20 20 20 20 20 20  ntExW",         
76e0: 20 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65   (SYSCALL)Create
76f0: 45 76 65 6e 74 45 78 57 2c 20 20 20 20 20 20 20  EventExW,       
7700: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
7710: 7b 20 22 43 72 65 61 74 65 45 76 65 6e 74 45 78  { "CreateEventEx
7720: 57 22 2c 20 20 20 20 20 20 20 20 20 20 28 53 59  W",          (SY
7730: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
7740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
7750: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
7760: 69 6e 65 20 6f 73 43 72 65 61 74 65 45 76 65 6e  ine osCreateEven
7770: 74 45 78 57 20 28 28 48 41 4e 44 4c 45 28 57 49  tExW ((HANDLE(WI
7780: 4e 41 50 49 2a 29 28 4c 50 53 45 43 55 52 49 54  NAPI*)(LPSECURIT
7790: 59 5f 41 54 54 52 49 42 55 54 45 53 2c 4c 50 43  Y_ATTRIBUTES,LPC
77a0: 57 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20  WSTR, \.        
77b0: 44 57 4f 52 44 2c 44 57 4f 52 44 29 29 61 53 79  DWORD,DWORD))aSy
77c0: 73 63 61 6c 6c 5b 36 32 5d 2e 70 43 75 72 72 65  scall[62].pCurre
77d0: 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  nt)..#if !SQLITE
77e0: 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 57  _OS_WINRT.  { "W
77f0: 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65  aitForSingleObje
7800: 63 74 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c  ct",     (SYSCAL
7810: 4c 29 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f  L)WaitForSingleO
7820: 62 6a 65 63 74 2c 20 20 20 20 20 30 20 7d 2c 0a  bject,     0 },.
7830: 23 65 6c 73 65 0a 20 20 7b 20 22 57 61 69 74 46  #else.  { "WaitF
7840: 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 22 2c  orSingleObject",
7850: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
7860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7870: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
7880: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 57 61  if..#define osWa
7890: 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63  itForSingleObjec
78a0: 74 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49  t ((DWORD(WINAPI
78b0: 2a 29 28 48 41 4e 44 4c 45 2c 20 5c 0a 20 20 20  *)(HANDLE, \.   
78c0: 20 20 20 20 20 44 57 4f 52 44 29 29 61 53 79 73       DWORD))aSys
78d0: 63 61 6c 6c 5b 36 33 5d 2e 70 43 75 72 72 65 6e  call[63].pCurren
78e0: 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  t)..#if SQLITE_O
78f0: 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 57 61 69  S_WINRT.  { "Wai
7900: 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74  tForSingleObject
7910: 45 78 22 2c 20 20 20 28 53 59 53 43 41 4c 4c 29  Ex",   (SYSCALL)
7920: 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a  WaitForSingleObj
7930: 65 63 74 45 78 2c 20 20 20 30 20 7d 2c 0a 23 65  ectEx,   0 },.#e
7940: 6c 73 65 0a 20 20 7b 20 22 57 61 69 74 46 6f 72  lse.  { "WaitFor
7950: 53 69 6e 67 6c 65 4f 62 6a 65 63 74 45 78 22 2c  SingleObjectEx",
7960: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
7970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7980: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
7990: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 57 61 69 74  ..#define osWait
79a0: 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 45  ForSingleObjectE
79b0: 78 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49  x ((DWORD(WINAPI
79c0: 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c  *)(HANDLE,DWORD,
79d0: 20 5c 0a 20 20 20 20 20 20 20 20 42 4f 4f 4c 29   \.        BOOL)
79e0: 29 61 53 79 73 63 61 6c 6c 5b 36 34 5d 2e 70 43  )aSyscall[64].pC
79f0: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c  urrent)..#if SQL
7a00: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b  ITE_OS_WINRT.  {
7a10: 20 22 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72   "SetFilePointer
7a20: 45 78 22 2c 20 20 20 20 20 20 20 20 28 53 59 53  Ex",        (SYS
7a30: 43 41 4c 4c 29 53 65 74 46 69 6c 65 50 6f 69 6e  CALL)SetFilePoin
7a40: 74 65 72 45 78 2c 20 20 20 20 20 20 20 20 30 20  terEx,        0 
7a50: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 53 65  },.#else.  { "Se
7a60: 74 46 69 6c 65 50 6f 69 6e 74 65 72 45 78 22 2c  tFilePointerEx",
7a70: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
7a80: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
7a90: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
7aa0: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
7ab0: 73 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 45  sSetFilePointerE
7ac0: 78 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  x ((BOOL(WINAPI*
7ad0: 29 28 48 41 4e 44 4c 45 2c 4c 41 52 47 45 5f 49  )(HANDLE,LARGE_I
7ae0: 4e 54 45 47 45 52 2c 20 5c 0a 20 20 20 20 20 20  NTEGER, \.      
7af0: 20 20 50 4c 41 52 47 45 5f 49 4e 54 45 47 45 52    PLARGE_INTEGER
7b00: 2c 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c  ,DWORD))aSyscall
7b10: 5b 36 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [65].pCurrent)..
7b20: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
7b30: 4e 52 54 0a 20 20 7b 20 22 47 65 74 46 69 6c 65  NRT.  { "GetFile
7b40: 49 6e 66 6f 72 6d 61 74 69 6f 6e 42 79 48 61 6e  InformationByHan
7b50: 64 6c 65 45 78 22 2c 20 28 53 59 53 43 41 4c 4c  dleEx", (SYSCALL
7b60: 29 47 65 74 46 69 6c 65 49 6e 66 6f 72 6d 61 74  )GetFileInformat
7b70: 69 6f 6e 42 79 48 61 6e 64 6c 65 45 78 2c 20 30  ionByHandleEx, 0
7b80: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47   },.#else.  { "G
7b90: 65 74 46 69 6c 65 49 6e 66 6f 72 6d 61 74 69 6f  etFileInformatio
7ba0: 6e 42 79 48 61 6e 64 6c 65 45 78 22 2c 20 28 53  nByHandleEx", (S
7bb0: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
7bc0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
7bd0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
7be0: 6f 73 47 65 74 46 69 6c 65 49 6e 66 6f 72 6d 61  osGetFileInforma
7bf0: 74 69 6f 6e 42 79 48 61 6e 64 6c 65 45 78 20 28  tionByHandleEx (
7c00: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48  (BOOL(WINAPI*)(H
7c10: 41 4e 44 4c 45 2c 20 5c 0a 20 20 20 20 20 20 20  ANDLE, \.       
7c20: 20 46 49 4c 45 5f 49 4e 46 4f 5f 42 59 5f 48 41   FILE_INFO_BY_HA
7c30: 4e 44 4c 45 5f 43 4c 41 53 53 2c 4c 50 56 4f 49  NDLE_CLASS,LPVOI
7c40: 44 2c 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c  D,DWORD))aSyscal
7c50: 6c 5b 36 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[66].pCurrent).
7c60: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
7c70: 49 4e 52 54 20 26 26 20 21 64 65 66 69 6e 65 64  INRT && !defined
7c80: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c  (SQLITE_OMIT_WAL
7c90: 29 0a 20 20 7b 20 22 4d 61 70 56 69 65 77 4f 66  ).  { "MapViewOf
7ca0: 46 69 6c 65 46 72 6f 6d 41 70 70 22 2c 20 20 20  FileFromApp",   
7cb0: 20 28 53 59 53 43 41 4c 4c 29 4d 61 70 56 69 65   (SYSCALL)MapVie
7cc0: 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 2c 20  wOfFileFromApp, 
7cd0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
7ce0: 7b 20 22 4d 61 70 56 69 65 77 4f 66 46 69 6c 65  { "MapViewOfFile
7cf0: 46 72 6f 6d 41 70 70 22 2c 20 20 20 20 28 53 59  FromApp",    (SY
7d00: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
7d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
7d20: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
7d30: 69 6e 65 20 6f 73 4d 61 70 56 69 65 77 4f 66 46  ine osMapViewOfF
7d40: 69 6c 65 46 72 6f 6d 41 70 70 20 28 28 4c 50 56  ileFromApp ((LPV
7d50: 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  OID(WINAPI*)(HAN
7d60: 44 4c 45 2c 55 4c 4f 4e 47 2c 55 4c 4f 4e 47 36  DLE,ULONG,ULONG6
7d70: 34 2c 20 5c 0a 20 20 20 20 20 20 20 20 53 49 5a  4, \.        SIZ
7d80: 45 5f 54 29 29 61 53 79 73 63 61 6c 6c 5b 36 37  E_T))aSyscall[67
7d90: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
7da0: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
7db0: 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65  .  { "CreateFile
7dc0: 32 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  2",             
7dd0: 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65 46  (SYSCALL)CreateF
7de0: 69 6c 65 32 2c 20 20 20 20 20 20 20 20 20 20 20  ile2,           
7df0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
7e00: 20 22 43 72 65 61 74 65 46 69 6c 65 32 22 2c 20   "CreateFile2", 
7e10: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
7e20: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
7e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
7e40: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
7e50: 6e 65 20 6f 73 43 72 65 61 74 65 46 69 6c 65 32  ne osCreateFile2
7e60: 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49   ((HANDLE(WINAPI
7e70: 2a 29 28 4c 50 43 57 53 54 52 2c 44 57 4f 52 44  *)(LPCWSTR,DWORD
7e80: 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a  ,DWORD,DWORD, \.
7e90: 20 20 20 20 20 20 20 20 4c 50 43 52 45 41 54 45          LPCREATE
7ea0: 46 49 4c 45 32 5f 45 58 54 45 4e 44 45 44 5f 50  FILE2_EXTENDED_P
7eb0: 41 52 41 4d 45 54 45 52 53 29 29 61 53 79 73 63  ARAMETERS))aSysc
7ec0: 61 6c 6c 5b 36 38 5d 2e 70 43 75 72 72 65 6e 74  all[68].pCurrent
7ed0: 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  )..#if SQLITE_OS
7ee0: 5f 57 49 4e 52 54 20 26 26 20 21 64 65 66 69 6e  _WINRT && !defin
7ef0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c  ed(SQLITE_OMIT_L
7f00: 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 29 0a 20  OAD_EXTENSION). 
7f10: 20 7b 20 22 4c 6f 61 64 50 61 63 6b 61 67 65 64   { "LoadPackaged
7f20: 4c 69 62 72 61 72 79 22 2c 20 20 20 20 20 28 53  Library",     (S
7f30: 59 53 43 41 4c 4c 29 4c 6f 61 64 50 61 63 6b 61  YSCALL)LoadPacka
7f40: 67 65 64 4c 69 62 72 61 72 79 2c 20 20 20 20 20  gedLibrary,     
7f50: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
7f60: 4c 6f 61 64 50 61 63 6b 61 67 65 64 4c 69 62 72  LoadPackagedLibr
7f70: 61 72 79 22 2c 20 20 20 20 20 28 53 59 53 43 41  ary",     (SYSCA
7f80: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
7f90: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
7fa0: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
7fb0: 20 6f 73 4c 6f 61 64 50 61 63 6b 61 67 65 64 4c   osLoadPackagedL
7fc0: 69 62 72 61 72 79 20 28 28 48 4d 4f 44 55 4c 45  ibrary ((HMODULE
7fd0: 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54  (WINAPI*)(LPCWST
7fe0: 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f  R, \.        DWO
7ff0: 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 36 39 5d  RD))aSyscall[69]
8000: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
8010: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
8020: 20 20 7b 20 22 47 65 74 54 69 63 6b 43 6f 75 6e    { "GetTickCoun
8030: 74 36 34 22 2c 20 20 20 20 20 20 20 20 20 20 28  t64",          (
8040: 53 59 53 43 41 4c 4c 29 47 65 74 54 69 63 6b 43  SYSCALL)GetTickC
8050: 6f 75 6e 74 36 34 2c 20 20 20 20 20 20 20 20 20  ount64,         
8060: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
8070: 22 47 65 74 54 69 63 6b 43 6f 75 6e 74 36 34 22  "GetTickCount64"
8080: 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43  ,          (SYSC
8090: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
80a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
80b0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
80c0: 65 20 6f 73 47 65 74 54 69 63 6b 43 6f 75 6e 74  e osGetTickCount
80d0: 36 34 20 28 28 55 4c 4f 4e 47 4c 4f 4e 47 28 57  64 ((ULONGLONG(W
80e0: 49 4e 41 50 49 2a 29 28 56 4f 49 44 29 29 61 53  INAPI*)(VOID))aS
80f0: 79 73 63 61 6c 6c 5b 37 30 5d 2e 70 43 75 72 72  yscall[70].pCurr
8100: 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45  ent)..#if SQLITE
8110: 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 47  _OS_WINRT.  { "G
8120: 65 74 4e 61 74 69 76 65 53 79 73 74 65 6d 49 6e  etNativeSystemIn
8130: 66 6f 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c  fo",     (SYSCAL
8140: 4c 29 47 65 74 4e 61 74 69 76 65 53 79 73 74 65  L)GetNativeSyste
8150: 6d 49 6e 66 6f 2c 20 20 20 20 20 30 20 7d 2c 0a  mInfo,     0 },.
8160: 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 4e 61  #else.  { "GetNa
8170: 74 69 76 65 53 79 73 74 65 6d 49 6e 66 6f 22 2c  tiveSystemInfo",
8180: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
8190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
81a0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
81b0: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65  if..#define osGe
81c0: 74 4e 61 74 69 76 65 53 79 73 74 65 6d 49 6e 66  tNativeSystemInf
81d0: 6f 20 28 28 56 4f 49 44 28 57 49 4e 41 50 49 2a  o ((VOID(WINAPI*
81e0: 29 28 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 53  )( \.        LPS
81f0: 59 53 54 45 4d 5f 49 4e 46 4f 29 29 61 53 79 73  YSTEM_INFO))aSys
8200: 63 61 6c 6c 5b 37 31 5d 2e 70 43 75 72 72 65 6e  call[71].pCurren
8210: 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  t)..#if defined(
8220: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
8230: 5f 41 4e 53 49 29 0a 20 20 7b 20 22 4f 75 74 70  _ANSI).  { "Outp
8240: 75 74 44 65 62 75 67 53 74 72 69 6e 67 41 22 2c  utDebugStringA",
8250: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4f        (SYSCALL)O
8260: 75 74 70 75 74 44 65 62 75 67 53 74 72 69 6e 67  utputDebugString
8270: 41 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c  A,      0 },.#el
8280: 73 65 0a 20 20 7b 20 22 4f 75 74 70 75 74 44 65  se.  { "OutputDe
8290: 62 75 67 53 74 72 69 6e 67 41 22 2c 20 20 20 20  bugStringA",    
82a0: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
82b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
82c0: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
82d0: 0a 23 64 65 66 69 6e 65 20 6f 73 4f 75 74 70 75  .#define osOutpu
82e0: 74 44 65 62 75 67 53 74 72 69 6e 67 41 20 28 28  tDebugStringA ((
82f0: 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 4c 50  VOID(WINAPI*)(LP
8300: 43 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 37  CSTR))aSyscall[7
8310: 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  2].pCurrent)..#i
8320: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
8330: 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29  _WIN32_HAS_WIDE)
8340: 0a 20 20 7b 20 22 4f 75 74 70 75 74 44 65 62 75  .  { "OutputDebu
8350: 67 53 74 72 69 6e 67 57 22 2c 20 20 20 20 20 20  gStringW",      
8360: 28 53 59 53 43 41 4c 4c 29 4f 75 74 70 75 74 44  (SYSCALL)OutputD
8370: 65 62 75 67 53 74 72 69 6e 67 57 2c 20 20 20 20  ebugStringW,    
8380: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
8390: 20 22 4f 75 74 70 75 74 44 65 62 75 67 53 74 72   "OutputDebugStr
83a0: 69 6e 67 57 22 2c 20 20 20 20 20 20 28 53 59 53  ingW",      (SYS
83b0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
83c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
83d0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
83e0: 6e 65 20 6f 73 4f 75 74 70 75 74 44 65 62 75 67  ne osOutputDebug
83f0: 53 74 72 69 6e 67 57 20 28 28 56 4f 49 44 28 57  StringW ((VOID(W
8400: 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52 29  INAPI*)(LPCWSTR)
8410: 29 61 53 79 73 63 61 6c 6c 5b 37 33 5d 2e 70 43  )aSyscall[73].pC
8420: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 47 65  urrent)..  { "Ge
8430: 74 50 72 6f 63 65 73 73 48 65 61 70 22 2c 20 20  tProcessHeap",  
8440: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
8450: 29 47 65 74 50 72 6f 63 65 73 73 48 65 61 70 2c  )GetProcessHeap,
8460: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a            0 },..
8470: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 50 72 6f  #define osGetPro
8480: 63 65 73 73 48 65 61 70 20 28 28 48 41 4e 44 4c  cessHeap ((HANDL
8490: 45 28 57 49 4e 41 50 49 2a 29 28 56 4f 49 44 29  E(WINAPI*)(VOID)
84a0: 29 61 53 79 73 63 61 6c 6c 5b 37 34 5d 2e 70 43  )aSyscall[74].pC
84b0: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c  urrent)..#if SQL
84c0: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20  ITE_OS_WINRT && 
84d0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
84e0: 4f 4d 49 54 5f 57 41 4c 29 0a 20 20 7b 20 22 43  OMIT_WAL).  { "C
84f0: 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67  reateFileMapping
8500: 46 72 6f 6d 41 70 70 22 2c 20 28 53 59 53 43 41  FromApp", (SYSCA
8510: 4c 4c 29 43 72 65 61 74 65 46 69 6c 65 4d 61 70  LL)CreateFileMap
8520: 70 69 6e 67 46 72 6f 6d 41 70 70 2c 20 30 20 7d  pingFromApp, 0 }
8530: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65  ,.#else.  { "Cre
8540: 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 46 72  ateFileMappingFr
8550: 6f 6d 41 70 70 22 2c 20 28 53 59 53 43 41 4c 4c  omApp", (SYSCALL
8560: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
8570: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
8580: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
8590: 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e  CreateFileMappin
85a0: 67 46 72 6f 6d 41 70 70 20 28 28 48 41 4e 44 4c  gFromApp ((HANDL
85b0: 45 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  E(WINAPI*)(HANDL
85c0: 45 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 53  E, \.        LPS
85d0: 45 43 55 52 49 54 59 5f 41 54 54 52 49 42 55 54  ECURITY_ATTRIBUT
85e0: 45 53 2c 55 4c 4f 4e 47 2c 55 4c 4f 4e 47 36 34  ES,ULONG,ULONG64
85f0: 2c 4c 50 43 57 53 54 52 29 29 61 53 79 73 63 61  ,LPCWSTR))aSysca
8600: 6c 6c 5b 37 35 5d 2e 70 43 75 72 72 65 6e 74 29  ll[75].pCurrent)
8610: 0a 0a 2f 2a 0a 2a 2a 20 4e 4f 54 45 3a 20 4f 6e  ../*.** NOTE: On
8620: 20 73 6f 6d 65 20 73 75 62 2d 70 6c 61 74 66 6f   some sub-platfo
8630: 72 6d 73 2c 20 74 68 65 20 49 6e 74 65 72 6c 6f  rms, the Interlo
8640: 63 6b 65 64 43 6f 6d 70 61 72 65 45 78 63 68 61  ckedCompareExcha
8650: 6e 67 65 20 22 66 75 6e 63 74 69 6f 6e 22 0a 2a  nge "function".*
8660: 2a 20 20 20 20 20 20 20 69 73 20 72 65 61 6c 6c  *       is reall
8670: 79 20 6a 75 73 74 20 61 20 6d 61 63 72 6f 20 74  y just a macro t
8680: 68 61 74 20 75 73 65 73 20 61 20 63 6f 6d 70 69  hat uses a compi
8690: 6c 65 72 20 69 6e 74 72 69 6e 73 69 63 20 28 65  ler intrinsic (e
86a0: 2e 67 2e 20 78 36 34 29 2e 0a 2a 2a 20 20 20 20  .g. x64)..**    
86b0: 20 20 20 53 6f 20 64 6f 20 6e 6f 74 20 74 72 79     So do not try
86c0: 20 74 6f 20 6d 61 6b 65 20 74 68 69 73 20 69 73   to make this is
86d0: 20 69 6e 74 6f 20 61 20 72 65 64 65 66 69 6e 61   into a redefina
86e0: 62 6c 65 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a  ble interface..*
86f0: 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 49 6e  /.#if defined(In
8700: 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72 65  terlockedCompare
8710: 45 78 63 68 61 6e 67 65 29 0a 20 20 7b 20 22 49  Exchange).  { "I
8720: 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72  nterlockedCompar
8730: 65 45 78 63 68 61 6e 67 65 22 2c 20 28 53 59 53  eExchange", (SYS
8740: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
8750: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
8760: 0a 23 64 65 66 69 6e 65 20 6f 73 49 6e 74 65 72  .#define osInter
8770: 6c 6f 63 6b 65 64 43 6f 6d 70 61 72 65 45 78 63  lockedCompareExc
8780: 68 61 6e 67 65 20 49 6e 74 65 72 6c 6f 63 6b 65  hange Interlocke
8790: 64 43 6f 6d 70 61 72 65 45 78 63 68 61 6e 67 65  dCompareExchange
87a0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 49 6e 74 65  .#else.  { "Inte
87b0: 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72 65 45 78  rlockedCompareEx
87c0: 63 68 61 6e 67 65 22 2c 20 28 53 59 53 43 41 4c  change", (SYSCAL
87d0: 4c 29 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d  L)InterlockedCom
87e0: 70 61 72 65 45 78 63 68 61 6e 67 65 2c 20 30 20  pareExchange, 0 
87f0: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 49 6e  },..#define osIn
8800: 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72 65  terlockedCompare
8810: 45 78 63 68 61 6e 67 65 20 28 28 4c 4f 4e 47 28  Exchange ((LONG(
8820: 57 49 4e 41 50 49 2a 29 28 4c 4f 4e 47 20 76 6f  WINAPI*)(LONG vo
8830: 6c 61 74 69 6c 65 2a 2c 20 5c 0a 20 20 20 20 20  latile*, \.     
8840: 20 20 20 4c 4f 4e 47 2c 4c 4f 4e 47 29 29 61 53     LONG,LONG))aS
8850: 79 73 63 61 6c 6c 5b 37 36 5d 2e 70 43 75 72 72  yscall[76].pCurr
8860: 65 6e 74 29 0a 23 65 6e 64 69 66 20 2f 2a 20 64  ent).#endif /* d
8870: 65 66 69 6e 65 64 28 49 6e 74 65 72 6c 6f 63 6b  efined(Interlock
8880: 65 64 43 6f 6d 70 61 72 65 45 78 63 68 61 6e 67  edCompareExchang
8890: 65 29 20 2a 2f 0a 0a 7d 3b 20 2f 2a 20 45 6e 64  e) */..}; /* End
88a0: 20 6f 66 20 74 68 65 20 6f 76 65 72 72 69 64 65   of the override
88b0: 61 62 6c 65 20 73 79 73 74 65 6d 20 63 61 6c 6c  able system call
88c0: 73 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  s */../*.** This
88d0: 20 69 73 20 74 68 65 20 78 53 65 74 53 79 73 74   is the xSetSyst
88e0: 65 6d 43 61 6c 6c 28 29 20 6d 65 74 68 6f 64 20  emCall() method 
88f0: 6f 66 20 73 71 6c 69 74 65 33 5f 76 66 73 20 66  of sqlite3_vfs f
8900: 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65 0a 2a 2a  or all of the.**
8910: 20 22 77 69 6e 33 32 22 20 56 46 53 65 73 2e 20   "win32" VFSes. 
8920: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
8930: 4b 20 6f 70 6f 6e 20 73 75 63 63 65 73 73 66 75  K opon successfu
8940: 6c 6c 79 20 75 70 64 61 74 69 6e 67 20 74 68 65  lly updating the
8950: 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  .** system call 
8960: 70 6f 69 6e 74 65 72 2c 20 6f 72 20 53 51 4c 49  pointer, or SQLI
8970: 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 69 66 20 74  TE_NOTFOUND if t
8980: 68 65 72 65 20 69 73 20 6e 6f 20 63 6f 6e 66 69  here is no confi
8990: 67 75 72 61 62 6c 65 0a 2a 2a 20 73 79 73 74 65  gurable.** syste
89a0: 6d 20 63 61 6c 6c 20 6e 61 6d 65 64 20 7a 4e 61  m call named zNa
89b0: 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  me..*/.static in
89c0: 74 20 77 69 6e 53 65 74 53 79 73 74 65 6d 43 61  t winSetSystemCa
89d0: 6c 6c 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  ll(.  sqlite3_vf
89e0: 73 20 2a 70 4e 6f 74 55 73 65 64 2c 20 20 20 20  s *pNotUsed,    
89f0: 20 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20 70      /* The VFS p
8a00: 6f 69 6e 74 65 72 2e 20 20 4e 6f 74 20 75 73 65  ointer.  Not use
8a10: 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  d */.  const cha
8a20: 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20  r *zName,       
8a30: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
8a40: 73 79 73 74 65 6d 20 63 61 6c 6c 20 74 6f 20 6f  system call to o
8a50: 76 65 72 72 69 64 65 20 2a 2f 0a 20 20 73 71 6c  verride */.  sql
8a60: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
8a70: 20 70 4e 65 77 46 75 6e 63 20 20 2f 2a 20 50 6f   pNewFunc  /* Po
8a80: 69 6e 74 65 72 20 74 6f 20 6e 65 77 20 73 79 73  inter to new sys
8a90: 74 65 6d 20 63 61 6c 6c 20 76 61 6c 75 65 20 2a  tem call value *
8aa0: 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  /.){.  unsigned 
8ab0: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 20  int i;.  int rc 
8ac0: 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  = SQLITE_NOTFOUN
8ad0: 44 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  D;..  UNUSED_PAR
8ae0: 41 4d 45 54 45 52 28 70 4e 6f 74 55 73 65 64 29  AMETER(pNotUsed)
8af0: 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30  ;.  if( zName==0
8b00: 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f   ){.    /* If no
8b10: 20 7a 4e 61 6d 65 20 69 73 20 67 69 76 65 6e 2c   zName is given,
8b20: 20 72 65 73 74 6f 72 65 20 61 6c 6c 20 73 79 73   restore all sys
8b30: 74 65 6d 20 63 61 6c 6c 73 20 74 6f 20 74 68 65  tem calls to the
8b40: 69 72 20 64 65 66 61 75 6c 74 0a 20 20 20 20 2a  ir default.    *
8b50: 2a 20 73 65 74 74 69 6e 67 73 20 61 6e 64 20 72  * settings and r
8b60: 65 74 75 72 6e 20 4e 55 4c 4c 0a 20 20 20 20 2a  eturn NULL.    *
8b70: 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  /.    rc = SQLIT
8b80: 45 5f 4f 4b 3b 0a 20 20 20 20 66 6f 72 28 69 3d  E_OK;.    for(i=
8b90: 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 79 73  0; i<sizeof(aSys
8ba0: 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53 79  call)/sizeof(aSy
8bb0: 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b  scall[0]); i++){
8bc0: 0a 20 20 20 20 20 20 69 66 28 20 61 53 79 73 63  .      if( aSysc
8bd0: 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 20  all[i].pDefault 
8be0: 29 7b 0a 20 20 20 20 20 20 20 20 61 53 79 73 63  ){.        aSysc
8bf0: 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 20  all[i].pCurrent 
8c00: 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44  = aSyscall[i].pD
8c10: 65 66 61 75 6c 74 3b 0a 20 20 20 20 20 20 7d 0a  efault;.      }.
8c20: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
8c30: 20 20 20 2f 2a 20 49 66 20 7a 4e 61 6d 65 20 69     /* If zName i
8c40: 73 20 73 70 65 63 69 66 69 65 64 2c 20 6f 70 65  s specified, ope
8c50: 72 61 74 65 20 6f 6e 20 6f 6e 6c 79 20 74 68 65  rate on only the
8c60: 20 6f 6e 65 20 73 79 73 74 65 6d 20 63 61 6c 6c   one system call
8c70: 0a 20 20 20 20 2a 2a 20 73 70 65 63 69 66 69 65  .    ** specifie
8c80: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  d..    */.    fo
8c90: 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28  r(i=0; i<sizeof(
8ca0: 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66  aSyscall)/sizeof
8cb0: 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69  (aSyscall[0]); i
8cc0: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  ++){.      if( s
8cd0: 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79  trcmp(zName, aSy
8ce0: 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d  scall[i].zName)=
8cf0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  =0 ){.        if
8d00: 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44  ( aSyscall[i].pD
8d10: 65 66 61 75 6c 74 3d 3d 30 20 29 7b 0a 20 20 20  efault==0 ){.   
8d20: 20 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b         aSyscall[
8d30: 69 5d 2e 70 44 65 66 61 75 6c 74 20 3d 20 61 53  i].pDefault = aS
8d40: 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65  yscall[i].pCurre
8d50: 6e 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  nt;.        }.  
8d60: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
8d70: 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 69 66  E_OK;.        if
8d80: 28 20 70 4e 65 77 46 75 6e 63 3d 3d 30 20 29 20  ( pNewFunc==0 ) 
8d90: 70 4e 65 77 46 75 6e 63 20 3d 20 61 53 79 73 63  pNewFunc = aSysc
8da0: 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3b  all[i].pDefault;
8db0: 0a 20 20 20 20 20 20 20 20 61 53 79 73 63 61 6c  .        aSyscal
8dc0: 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 20 3d 20  l[i].pCurrent = 
8dd0: 70 4e 65 77 46 75 6e 63 3b 0a 20 20 20 20 20 20  pNewFunc;.      
8de0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
8df0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
8e00: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
8e10: 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75   Return the valu
8e20: 65 20 6f 66 20 61 20 73 79 73 74 65 6d 20 63 61  e of a system ca
8e30: 6c 6c 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c  ll.  Return NULL
8e40: 20 69 66 20 7a 4e 61 6d 65 20 69 73 20 6e 6f 74   if zName is not
8e50: 20 61 0a 2a 2a 20 72 65 63 6f 67 6e 69 7a 65 64   a.** recognized
8e60: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6e 61 6d   system call nam
8e70: 65 2e 20 20 4e 55 4c 4c 20 69 73 20 61 6c 73 6f  e.  NULL is also
8e80: 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65   returned if the
8e90: 20 73 79 73 74 65 6d 20 63 61 6c 6c 0a 2a 2a 20   system call.** 
8ea0: 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  is currently und
8eb0: 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  efined..*/.stati
8ec0: 63 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c  c sqlite3_syscal
8ed0: 6c 5f 70 74 72 20 77 69 6e 47 65 74 53 79 73 74  l_ptr winGetSyst
8ee0: 65 6d 43 61 6c 6c 28 0a 20 20 73 71 6c 69 74 65  emCall(.  sqlite
8ef0: 33 5f 76 66 73 20 2a 70 4e 6f 74 55 73 65 64 2c  3_vfs *pNotUsed,
8f00: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
8f10: 4e 61 6d 65 0a 29 7b 0a 20 20 75 6e 73 69 67 6e  Name.){.  unsign
8f20: 65 64 20 69 6e 74 20 69 3b 0a 0a 20 20 55 4e 55  ed int i;..  UNU
8f30: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 4e  SED_PARAMETER(pN
8f40: 6f 74 55 73 65 64 29 3b 0a 20 20 66 6f 72 28 69  otUsed);.  for(i
8f50: 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 79  =0; i<sizeof(aSy
8f60: 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53  scall)/sizeof(aS
8f70: 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29  yscall[0]); i++)
8f80: 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  {.    if( strcmp
8f90: 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c  (zName, aSyscall
8fa0: 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20  [i].zName)==0 ) 
8fb0: 72 65 74 75 72 6e 20 61 53 79 73 63 61 6c 6c 5b  return aSyscall[
8fc0: 69 5d 2e 70 43 75 72 72 65 6e 74 3b 0a 20 20 7d  i].pCurrent;.  }
8fd0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
8fe0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
8ff0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 72   name of the fir
9000: 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 61  st system call a
9010: 66 74 65 72 20 7a 4e 61 6d 65 2e 20 20 49 66 20  fter zName.  If 
9020: 7a 4e 61 6d 65 3d 3d 4e 55 4c 4c 0a 2a 2a 20 74  zName==NULL.** t
9030: 68 65 6e 20 72 65 74 75 72 6e 20 74 68 65 20 6e  hen return the n
9040: 61 6d 65 20 6f 66 20 74 68 65 20 66 69 72 73 74  ame of the first
9050: 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 52   system call.  R
9060: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e  eturn NULL if zN
9070: 61 6d 65 0a 2a 2a 20 69 73 20 74 68 65 20 6c 61  ame.** is the la
9080: 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6f  st system call o
9090: 72 20 69 66 20 7a 4e 61 6d 65 20 69 73 20 6e 6f  r if zName is no
90a0: 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  t the name of a 
90b0: 76 61 6c 69 64 0a 2a 2a 20 73 79 73 74 65 6d 20  valid.** system 
90c0: 63 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  call..*/.static 
90d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 77 69 6e 4e  const char *winN
90e0: 65 78 74 53 79 73 74 65 6d 43 61 6c 6c 28 73 71  extSystemCall(sq
90f0: 6c 69 74 65 33 5f 76 66 73 20 2a 70 2c 20 63 6f  lite3_vfs *p, co
9100: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29  nst char *zName)
9110: 7b 0a 20 20 69 6e 74 20 69 20 3d 20 2d 31 3b 0a  {.  int i = -1;.
9120: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
9130: 54 45 52 28 70 29 3b 0a 20 20 69 66 28 20 7a 4e  TER(p);.  if( zN
9140: 61 6d 65 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  ame ){.    for(i
9150: 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28  =0; i<ArraySize(
9160: 61 53 79 73 63 61 6c 6c 29 2d 31 3b 20 69 2b 2b  aSyscall)-1; i++
9170: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72  ){.      if( str
9180: 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63  cmp(zName, aSysc
9190: 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  all[i].zName)==0
91a0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
91b0: 20 20 7d 0a 20 20 66 6f 72 28 69 2b 2b 3b 20 69    }.  for(i++; i
91c0: 3c 41 72 72 61 79 53 69 7a 65 28 61 53 79 73 63  <ArraySize(aSysc
91d0: 61 6c 6c 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  all); i++){.    
91e0: 69 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e  if( aSyscall[i].
91f0: 70 43 75 72 72 65 6e 74 21 3d 30 20 29 20 72 65  pCurrent!=0 ) re
9200: 74 75 72 6e 20 61 53 79 73 63 61 6c 6c 5b 69 5d  turn aSyscall[i]
9210: 2e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 72 65  .zName;.  }.  re
9220: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66 64 65  turn 0;.}..#ifde
9230: 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d  f SQLITE_WIN32_M
9240: 41 4c 4c 4f 43 0a 2f 2a 0a 2a 2a 20 49 66 20 61  ALLOC./*.** If a
9250: 20 57 69 6e 33 32 20 6e 61 74 69 76 65 20 68 65   Win32 native he
9260: 61 70 20 68 61 73 20 62 65 65 6e 20 63 6f 6e 66  ap has been conf
9270: 69 67 75 72 65 64 2c 20 74 68 69 73 20 66 75 6e  igured, this fun
9280: 63 74 69 6f 6e 20 77 69 6c 6c 20 61 74 74 65 6d  ction will attem
9290: 70 74 20 74 6f 0a 2a 2a 20 63 6f 6d 70 61 63 74  pt to.** compact
92a0: 20 69 74 2e 20 20 55 70 6f 6e 20 73 75 63 63 65   it.  Upon succe
92b0: 73 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 77 69  ss, SQLITE_OK wi
92c0: 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20  ll be returned. 
92d0: 20 55 70 6f 6e 20 66 61 69 6c 75 72 65 2c 20 6f   Upon failure, o
92e0: 6e 65 0a 2a 2a 20 6f 66 20 53 51 4c 49 54 45 5f  ne.** of SQLITE_
92f0: 4e 4f 4d 45 4d 2c 20 53 51 4c 49 54 45 5f 45 52  NOMEM, SQLITE_ER
9300: 52 4f 52 2c 20 6f 72 20 53 51 4c 49 54 45 5f 4e  ROR, or SQLITE_N
9310: 4f 54 46 4f 55 4e 44 20 77 69 6c 6c 20 62 65 20  OTFOUND will be 
9320: 72 65 74 75 72 6e 65 64 2e 20 20 54 68 65 0a 2a  returned.  The.*
9330: 2a 20 22 70 6e 4c 61 72 67 65 73 74 22 20 61 72  * "pnLargest" ar
9340: 67 75 6d 65 6e 74 2c 20 69 66 20 6e 6f 6e 2d 7a  gument, if non-z
9350: 65 72 6f 2c 20 77 69 6c 6c 20 62 65 20 75 73 65  ero, will be use
9360: 64 20 74 6f 20 72 65 74 75 72 6e 20 74 68 65 20  d to return the 
9370: 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 6c  size of the.** l
9380: 61 72 67 65 73 74 20 63 6f 6d 6d 69 74 74 65 64  argest committed
9390: 20 66 72 65 65 20 62 6c 6f 63 6b 20 69 6e 20 74   free block in t
93a0: 68 65 20 68 65 61 70 2c 20 69 6e 20 62 79 74 65  he heap, in byte
93b0: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
93c0: 33 5f 77 69 6e 33 32 5f 63 6f 6d 70 61 63 74 5f  3_win32_compact_
93d0: 68 65 61 70 28 4c 50 55 49 4e 54 20 70 6e 4c 61  heap(LPUINT pnLa
93e0: 72 67 65 73 74 29 7b 0a 20 20 69 6e 74 20 72 63  rgest){.  int rc
93f0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
9400: 55 49 4e 54 20 6e 4c 61 72 67 65 73 74 20 3d 20  UINT nLargest = 
9410: 30 3b 0a 20 20 48 41 4e 44 4c 45 20 68 48 65 61  0;.  HANDLE hHea
9420: 70 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65  p;..  winMemAsse
9430: 72 74 4d 61 67 69 63 28 29 3b 0a 20 20 68 48 65  rtMagic();.  hHe
9440: 61 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74 48 65  ap = winMemGetHe
9450: 61 70 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ap();.  assert( 
9460: 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61 73  hHeap!=0 );.  as
9470: 73 65 72 74 28 20 68 48 65 61 70 21 3d 49 4e 56  sert( hHeap!=INV
9480: 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
9490: 45 20 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45  E );.#if !SQLITE
94a0: 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66  _OS_WINRT && def
94b0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
94c0: 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54  2_MALLOC_VALIDAT
94d0: 45 29 0a 20 20 61 73 73 65 72 74 28 20 6f 73 48  E).  assert( osH
94e0: 65 61 70 56 61 6c 69 64 61 74 65 28 68 48 65 61  eapValidate(hHea
94f0: 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  p, SQLITE_WIN32_
9500: 48 45 41 50 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c  HEAP_FLAGS, NULL
9510: 29 20 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  ) );.#endif.#if 
9520: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45  !SQLITE_OS_WINCE
9530: 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57   && !SQLITE_OS_W
9540: 49 4e 52 54 0a 20 20 69 66 28 20 28 6e 4c 61 72  INRT.  if( (nLar
9550: 67 65 73 74 3d 6f 73 48 65 61 70 43 6f 6d 70 61  gest=osHeapCompa
9560: 63 74 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45  ct(hHeap, SQLITE
9570: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47  _WIN32_HEAP_FLAG
9580: 53 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 44 57  S))==0 ){.    DW
9590: 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20  ORD lastErrno = 
95a0: 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
95b0: 3b 0a 20 20 20 20 69 66 28 20 6c 61 73 74 45 72  ;.    if( lastEr
95c0: 72 6e 6f 3d 3d 4e 4f 5f 45 52 52 4f 52 20 29 7b  rno==NO_ERROR ){
95d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c  .      sqlite3_l
95e0: 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c  og(SQLITE_NOMEM,
95f0: 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65 61 70   "failed to Heap
9600: 43 6f 6d 70 61 63 74 20 28 6e 6f 20 73 70 61 63  Compact (no spac
9610: 65 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20  e), heap=%p",.  
9620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9630: 28 76 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a 20  (void*)hHeap);. 
9640: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
9650: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73  _NOMEM;.    }els
9660: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
9670: 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 45 52 52 4f  _log(SQLITE_ERRO
9680: 52 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65  R, "failed to He
9690: 61 70 43 6f 6d 70 61 63 74 20 28 25 6c 75 29 2c  apCompact (%lu),
96a0: 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20 20   heap=%p",.     
96b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47               osG
96c0: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 28  etLastError(), (
96d0: 76 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a 20 20  void*)hHeap);.  
96e0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
96f0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d  ERROR;.    }.  }
9700: 0a 23 65 6c 73 65 0a 20 20 73 71 6c 69 74 65 33  .#else.  sqlite3
9710: 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 54 46  _log(SQLITE_NOTF
9720: 4f 55 4e 44 2c 20 22 66 61 69 6c 65 64 20 74 6f  OUND, "failed to
9730: 20 48 65 61 70 43 6f 6d 70 61 63 74 2c 20 68 65   HeapCompact, he
9740: 61 70 3d 25 70 22 2c 0a 20 20 20 20 20 20 20 20  ap=%p",.        
9750: 20 20 20 20 20 20 28 76 6f 69 64 2a 29 68 48 65        (void*)hHe
9760: 61 70 29 3b 0a 20 20 72 63 20 3d 20 53 51 4c 49  ap);.  rc = SQLI
9770: 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 23 65 6e  TE_NOTFOUND;.#en
9780: 64 69 66 0a 20 20 69 66 28 20 70 6e 4c 61 72 67  dif.  if( pnLarg
9790: 65 73 74 20 29 20 2a 70 6e 4c 61 72 67 65 73 74  est ) *pnLargest
97a0: 20 3d 20 6e 4c 61 72 67 65 73 74 3b 0a 20 20 72   = nLargest;.  r
97b0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
97c0: 2a 2a 20 49 66 20 61 20 57 69 6e 33 32 20 6e 61  ** If a Win32 na
97d0: 74 69 76 65 20 68 65 61 70 20 68 61 73 20 62 65  tive heap has be
97e0: 65 6e 20 63 6f 6e 66 69 67 75 72 65 64 2c 20 74  en configured, t
97f0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c  his function wil
9800: 6c 20 61 74 74 65 6d 70 74 20 74 6f 0a 2a 2a 20  l attempt to.** 
9810: 64 65 73 74 72 6f 79 20 61 6e 64 20 72 65 63 72  destroy and recr
9820: 65 61 74 65 20 69 74 2e 20 20 49 66 20 74 68 65  eate it.  If the
9830: 20 57 69 6e 33 32 20 6e 61 74 69 76 65 20 68 65   Win32 native he
9840: 61 70 20 69 73 20 6e 6f 74 20 69 73 6f 6c 61 74  ap is not isolat
9850: 65 64 20 61 6e 64 2f 6f 72 0a 2a 2a 20 74 68 65  ed and/or.** the
9860: 20 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f   sqlite3_memory_
9870: 75 73 65 64 28 29 20 66 75 6e 63 74 69 6f 6e 20  used() function 
9880: 64 6f 65 73 20 6e 6f 74 20 72 65 74 75 72 6e 20  does not return 
9890: 7a 65 72 6f 2c 20 53 51 4c 49 54 45 5f 42 55 53  zero, SQLITE_BUS
98a0: 59 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 72 65 74  Y will.** be ret
98b0: 75 72 6e 65 64 20 61 6e 64 20 6e 6f 20 63 68 61  urned and no cha
98c0: 6e 67 65 73 20 77 69 6c 6c 20 62 65 20 6d 61 64  nges will be mad
98d0: 65 20 74 6f 20 74 68 65 20 57 69 6e 33 32 20 6e  e to the Win32 n
98e0: 61 74 69 76 65 20 68 65 61 70 2e 0a 2a 2f 0a 69  ative heap..*/.i
98f0: 6e 74 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32  nt sqlite3_win32
9900: 5f 72 65 73 65 74 5f 68 65 61 70 28 29 7b 0a 20  _reset_heap(){. 
9910: 20 69 6e 74 20 72 63 3b 0a 20 20 4d 55 54 45 58   int rc;.  MUTEX
9920: 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f  _LOGIC( sqlite3_
9930: 6d 75 74 65 78 20 2a 70 4d 61 73 74 65 72 3b 20  mutex *pMaster; 
9940: 29 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 73 74  ) /* The main st
9950: 61 74 69 63 20 6d 75 74 65 78 20 2a 2f 0a 20 20  atic mutex */.  
9960: 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c  MUTEX_LOGIC( sql
9970: 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 4d 65 6d  ite3_mutex *pMem
9980: 3b 20 29 20 20 20 20 2f 2a 20 54 68 65 20 6d 65  ; )    /* The me
9990: 6d 73 79 73 20 73 74 61 74 69 63 20 6d 75 74 65  msys static mute
99a0: 78 20 2a 2f 0a 20 20 4d 55 54 45 58 5f 4c 4f 47  x */.  MUTEX_LOG
99b0: 49 43 28 20 70 4d 61 73 74 65 72 20 3d 20 73 71  IC( pMaster = sq
99c0: 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
99d0: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
99e0: 54 49 43 5f 4d 41 53 54 45 52 29 3b 20 29 0a 20  TIC_MASTER); ). 
99f0: 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 70 4d   MUTEX_LOGIC( pM
9a00: 65 6d 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65  em = sqlite3Mute
9a10: 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
9a20: 54 45 58 5f 53 54 41 54 49 43 5f 4d 45 4d 29 3b  TEX_STATIC_MEM);
9a30: 20 29 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   ).  sqlite3_mut
9a40: 65 78 5f 65 6e 74 65 72 28 70 4d 61 73 74 65 72  ex_enter(pMaster
9a50: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  );.  sqlite3_mut
9a60: 65 78 5f 65 6e 74 65 72 28 70 4d 65 6d 29 3b 0a  ex_enter(pMem);.
9a70: 20 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61    winMemAssertMa
9a80: 67 69 63 28 29 3b 0a 20 20 69 66 28 20 77 69 6e  gic();.  if( win
9a90: 4d 65 6d 47 65 74 48 65 61 70 28 29 21 3d 4e 55  MemGetHeap()!=NU
9aa0: 4c 4c 20 26 26 20 77 69 6e 4d 65 6d 47 65 74 4f  LL && winMemGetO
9ab0: 77 6e 65 64 28 29 20 26 26 20 73 71 6c 69 74 65  wned() && sqlite
9ac0: 33 5f 6d 65 6d 6f 72 79 5f 75 73 65 64 28 29 3d  3_memory_used()=
9ad0: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20  =0 ){.    /*.   
9ae0: 20 2a 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   ** At this poin
9af0: 74 2c 20 74 68 65 72 65 20 73 68 6f 75 6c 64 20  t, there should 
9b00: 62 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e  be no outstandin
9b10: 67 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  g memory allocat
9b20: 69 6f 6e 73 20 6f 6e 0a 20 20 20 20 2a 2a 20 74  ions on.    ** t
9b30: 68 65 20 68 65 61 70 2e 20 20 41 6c 73 6f 2c 20  he heap.  Also, 
9b40: 73 69 6e 63 65 20 62 6f 74 68 20 74 68 65 20 6d  since both the m
9b50: 61 73 74 65 72 20 61 6e 64 20 6d 65 6d 73 79 73  aster and memsys
9b60: 20 6c 6f 63 6b 73 20 61 72 65 20 63 75 72 72 65   locks are curre
9b70: 6e 74 6c 79 0a 20 20 20 20 2a 2a 20 62 65 69 6e  ntly.    ** bein
9b80: 67 20 68 65 6c 64 20 62 79 20 75 73 2c 20 6e 6f  g held by us, no
9b90: 20 6f 74 68 65 72 20 66 75 6e 63 74 69 6f 6e 20   other function 
9ba0: 28 69 2e 65 2e 20 66 72 6f 6d 20 61 6e 6f 74 68  (i.e. from anoth
9bb0: 65 72 20 74 68 72 65 61 64 29 20 73 68 6f 75 6c  er thread) shoul
9bc0: 64 0a 20 20 20 20 2a 2a 20 62 65 20 61 62 6c 65  d.    ** be able
9bd0: 20 74 6f 20 65 76 65 6e 20 61 63 63 65 73 73 20   to even access 
9be0: 74 68 65 20 68 65 61 70 2e 20 20 41 74 74 65 6d  the heap.  Attem
9bf0: 70 74 20 74 6f 20 64 65 73 74 72 6f 79 20 61 6e  pt to destroy an
9c00: 64 20 72 65 63 72 65 61 74 65 20 6f 75 72 0a 20  d recreate our. 
9c10: 20 20 20 2a 2a 20 69 73 6f 6c 61 74 65 64 20 57     ** isolated W
9c20: 69 6e 33 32 20 6e 61 74 69 76 65 20 68 65 61 70  in32 native heap
9c30: 20 6e 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   now..    */.   
9c40: 20 61 73 73 65 72 74 28 20 77 69 6e 4d 65 6d 47   assert( winMemG
9c50: 65 74 48 65 61 70 28 29 21 3d 4e 55 4c 4c 20 29  etHeap()!=NULL )
9c60: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 77 69  ;.    assert( wi
9c70: 6e 4d 65 6d 47 65 74 4f 77 6e 65 64 28 29 20 29  nMemGetOwned() )
9c80: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ;.    assert( sq
9c90: 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 75 73 65  lite3_memory_use
9ca0: 64 28 29 3d 3d 30 20 29 3b 0a 20 20 20 20 77 69  d()==0 );.    wi
9cb0: 6e 4d 65 6d 53 68 75 74 64 6f 77 6e 28 77 69 6e  nMemShutdown(win
9cc0: 4d 65 6d 47 65 74 44 61 74 61 50 74 72 28 29 29  MemGetDataPtr())
9cd0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 77 69  ;.    assert( wi
9ce0: 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 3d 3d 4e  nMemGetHeap()==N
9cf0: 55 4c 4c 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ULL );.    asser
9d00: 74 28 20 21 77 69 6e 4d 65 6d 47 65 74 4f 77 6e  t( !winMemGetOwn
9d10: 65 64 28 29 20 29 3b 0a 20 20 20 20 61 73 73 65  ed() );.    asse
9d20: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 65 6d 6f  rt( sqlite3_memo
9d30: 72 79 5f 75 73 65 64 28 29 3d 3d 30 20 29 3b 0a  ry_used()==0 );.
9d40: 20 20 20 20 72 63 20 3d 20 77 69 6e 4d 65 6d 49      rc = winMemI
9d50: 6e 69 74 28 77 69 6e 4d 65 6d 47 65 74 44 61 74  nit(winMemGetDat
9d60: 61 50 74 72 28 29 29 3b 0a 20 20 20 20 61 73 73  aPtr());.    ass
9d70: 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
9d80: 4f 4b 20 7c 7c 20 77 69 6e 4d 65 6d 47 65 74 48  OK || winMemGetH
9d90: 65 61 70 28 29 21 3d 4e 55 4c 4c 20 29 3b 0a 20  eap()!=NULL );. 
9da0: 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
9db0: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 77 69 6e 4d  QLITE_OK || winM
9dc0: 65 6d 47 65 74 4f 77 6e 65 64 28 29 20 29 3b 0a  emGetOwned() );.
9dd0: 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
9de0: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c  SQLITE_OK || sql
9df0: 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 75 73 65 64  ite3_memory_used
9e00: 28 29 3d 3d 30 20 29 3b 0a 20 20 7d 65 6c 73 65  ()==0 );.  }else
9e10: 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  {.    /*.    ** 
9e20: 54 68 65 20 57 69 6e 33 32 20 6e 61 74 69 76 65  The Win32 native
9e30: 20 68 65 61 70 20 63 61 6e 6e 6f 74 20 62 65 20   heap cannot be 
9e40: 6d 6f 64 69 66 69 65 64 20 62 65 63 61 75 73 65  modified because
9e50: 20 69 74 20 6d 61 79 20 62 65 20 69 6e 20 75 73   it may be in us
9e60: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  e..    */.    rc
9e70: 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
9e80: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
9e90: 74 65 78 5f 6c 65 61 76 65 28 70 4d 65 6d 29 3b  tex_leave(pMem);
9ea0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
9eb0: 5f 6c 65 61 76 65 28 70 4d 61 73 74 65 72 29 3b  _leave(pMaster);
9ec0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
9ed0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
9ee0: 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 20 2a 2f  _WIN32_MALLOC */
9ef0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
9f00: 63 74 69 6f 6e 20 6f 75 74 70 75 74 73 20 74 68  ction outputs th
9f10: 65 20 73 70 65 63 69 66 69 65 64 20 28 41 4e 53  e specified (ANS
9f20: 49 29 20 73 74 72 69 6e 67 20 74 6f 20 74 68 65  I) string to the
9f30: 20 57 69 6e 33 32 20 64 65 62 75 67 67 65 72 0a   Win32 debugger.
9f40: 2a 2a 20 28 69 66 20 61 76 61 69 6c 61 62 6c 65  ** (if available
9f50: 29 2e 0a 2a 2f 0a 0a 76 6f 69 64 20 73 71 6c 69  )..*/..void sqli
9f60: 74 65 33 5f 77 69 6e 33 32 5f 77 72 69 74 65 5f  te3_win32_write_
9f70: 64 65 62 75 67 28 63 6f 6e 73 74 20 63 68 61 72  debug(const char
9f80: 20 2a 7a 42 75 66 2c 20 69 6e 74 20 6e 42 75 66   *zBuf, int nBuf
9f90: 29 7b 0a 20 20 63 68 61 72 20 7a 44 62 67 42 75  ){.  char zDbgBu
9fa0: 66 5b 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44  f[SQLITE_WIN32_D
9fb0: 42 47 5f 42 55 46 5f 53 49 5a 45 5d 3b 0a 20 20  BG_BUF_SIZE];.  
9fc0: 69 6e 74 20 6e 4d 69 6e 20 3d 20 4d 49 4e 28 6e  int nMin = MIN(n
9fd0: 42 75 66 2c 20 28 53 51 4c 49 54 45 5f 57 49 4e  Buf, (SQLITE_WIN
9fe0: 33 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 20  32_DBG_BUF_SIZE 
9ff0: 2d 20 31 29 29 3b 20 2f 2a 20 6d 61 79 20 62 65  - 1)); /* may be
a000: 20 6e 65 67 61 74 69 76 65 2e 20 2a 2f 0a 20 20   negative. */.  
a010: 69 66 28 20 6e 4d 69 6e 3c 2d 31 20 29 20 6e 4d  if( nMin<-1 ) nM
a020: 69 6e 20 3d 20 2d 31 3b 20 2f 2a 20 61 6c 6c 20  in = -1; /* all 
a030: 6e 65 67 61 74 69 76 65 20 76 61 6c 75 65 73 20  negative values 
a040: 62 65 63 6f 6d 65 20 2d 31 2e 20 2a 2f 0a 20 20  become -1. */.  
a050: 61 73 73 65 72 74 28 20 6e 4d 69 6e 3d 3d 2d 31  assert( nMin==-1
a060: 20 7c 7c 20 6e 4d 69 6e 3d 3d 30 20 7c 7c 20 6e   || nMin==0 || n
a070: 4d 69 6e 3c 53 51 4c 49 54 45 5f 57 49 4e 33 32  Min<SQLITE_WIN32
a080: 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 20 29 3b  _DBG_BUF_SIZE );
a090: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
a0a0: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
a0b0: 53 49 29 0a 20 20 69 66 28 20 6e 4d 69 6e 3e 30  SI).  if( nMin>0
a0c0: 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 7a   ){.    memset(z
a0d0: 44 62 67 42 75 66 2c 20 30 2c 20 53 51 4c 49 54  DbgBuf, 0, SQLIT
a0e0: 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f  E_WIN32_DBG_BUF_
a0f0: 53 49 5a 45 29 3b 0a 20 20 20 20 6d 65 6d 63 70  SIZE);.    memcp
a100: 79 28 7a 44 62 67 42 75 66 2c 20 7a 42 75 66 2c  y(zDbgBuf, zBuf,
a110: 20 6e 4d 69 6e 29 3b 0a 20 20 20 20 6f 73 4f 75   nMin);.    osOu
a120: 74 70 75 74 44 65 62 75 67 53 74 72 69 6e 67 41  tputDebugStringA
a130: 28 7a 44 62 67 42 75 66 29 3b 0a 20 20 7d 65 6c  (zDbgBuf);.  }el
a140: 73 65 7b 0a 20 20 20 20 6f 73 4f 75 74 70 75 74  se{.    osOutput
a150: 44 65 62 75 67 53 74 72 69 6e 67 41 28 7a 42 75  DebugStringA(zBu
a160: 66 29 3b 0a 20 20 7d 0a 23 65 6c 69 66 20 64 65  f);.  }.#elif de
a170: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
a180: 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 6d  32_HAS_WIDE).  m
a190: 65 6d 73 65 74 28 7a 44 62 67 42 75 66 2c 20 30  emset(zDbgBuf, 0
a1a0: 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44  , SQLITE_WIN32_D
a1b0: 42 47 5f 42 55 46 5f 53 49 5a 45 29 3b 0a 20 20  BG_BUF_SIZE);.  
a1c0: 69 66 20 28 20 6f 73 4d 75 6c 74 69 42 79 74 65  if ( osMultiByte
a1d0: 54 6f 57 69 64 65 43 68 61 72 28 0a 20 20 20 20  ToWideChar(.    
a1e0: 20 20 20 20 20 20 6f 73 41 72 65 46 69 6c 65 41        osAreFileA
a1f0: 70 69 73 41 4e 53 49 28 29 20 3f 20 43 50 5f 41  pisANSI() ? CP_A
a200: 43 50 20 3a 20 43 50 5f 4f 45 4d 43 50 2c 20 30  CP : CP_OEMCP, 0
a210: 2c 20 7a 42 75 66 2c 0a 20 20 20 20 20 20 20 20  , zBuf,.        
a220: 20 20 6e 4d 69 6e 2c 20 28 4c 50 57 53 54 52 29    nMin, (LPWSTR)
a230: 7a 44 62 67 42 75 66 2c 20 53 51 4c 49 54 45 5f  zDbgBuf, SQLITE_
a240: 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49  WIN32_DBG_BUF_SI
a250: 5a 45 2f 73 69 7a 65 6f 66 28 57 43 48 41 52 29  ZE/sizeof(WCHAR)
a260: 29 3c 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  )<=0 ){.    retu
a270: 72 6e 3b 0a 20 20 7d 0a 20 20 6f 73 4f 75 74 70  rn;.  }.  osOutp
a280: 75 74 44 65 62 75 67 53 74 72 69 6e 67 57 28 28  utDebugStringW((
a290: 4c 50 43 57 53 54 52 29 7a 44 62 67 42 75 66 29  LPCWSTR)zDbgBuf)
a2a0: 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 6e 4d  ;.#else.  if( nM
a2b0: 69 6e 3e 30 20 29 7b 0a 20 20 20 20 6d 65 6d 73  in>0 ){.    mems
a2c0: 65 74 28 7a 44 62 67 42 75 66 2c 20 30 2c 20 53  et(zDbgBuf, 0, S
a2d0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f  QLITE_WIN32_DBG_
a2e0: 42 55 46 5f 53 49 5a 45 29 3b 0a 20 20 20 20 6d  BUF_SIZE);.    m
a2f0: 65 6d 63 70 79 28 7a 44 62 67 42 75 66 2c 20 7a  emcpy(zDbgBuf, z
a300: 42 75 66 2c 20 6e 4d 69 6e 29 3b 0a 20 20 20 20  Buf, nMin);.    
a310: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
a320: 22 25 73 22 2c 20 7a 44 62 67 42 75 66 29 3b 0a  "%s", zDbgBuf);.
a330: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 70 72    }else{.    fpr
a340: 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25 73  intf(stderr, "%s
a350: 22 2c 20 7a 42 75 66 29 3b 0a 20 20 7d 0a 23 65  ", zBuf);.  }.#e
a360: 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ndif.}../*.** Th
a370: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74  e following rout
a380: 69 6e 65 20 73 75 73 70 65 6e 64 73 20 74 68 65  ine suspends the
a390: 20 63 75 72 72 65 6e 74 20 74 68 72 65 61 64 20   current thread 
a3a0: 66 6f 72 20 61 74 20 6c 65 61 73 74 20 6d 73 0a  for at least ms.
a3b0: 2a 2a 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 2e  ** milliseconds.
a3c0: 20 20 54 68 69 73 20 69 73 20 65 71 75 69 76 61    This is equiva
a3d0: 6c 65 6e 74 20 74 6f 20 74 68 65 20 57 69 6e 33  lent to the Win3
a3e0: 32 20 53 6c 65 65 70 28 29 20 69 6e 74 65 72 66  2 Sleep() interf
a3f0: 61 63 65 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49  ace..*/.#if SQLI
a400: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 73 74 61 74  TE_OS_WINRT.stat
a410: 69 63 20 48 41 4e 44 4c 45 20 73 6c 65 65 70 4f  ic HANDLE sleepO
a420: 62 6a 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69  bj = NULL;.#endi
a430: 66 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f  f..void sqlite3_
a440: 77 69 6e 33 32 5f 73 6c 65 65 70 28 44 57 4f 52  win32_sleep(DWOR
a450: 44 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 29 7b  D milliseconds){
a460: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
a470: 49 4e 52 54 0a 20 20 69 66 20 28 20 73 6c 65 65  INRT.  if ( slee
a480: 70 4f 62 6a 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20  pObj==NULL ){.  
a490: 20 20 73 6c 65 65 70 4f 62 6a 20 3d 20 6f 73 43    sleepObj = osC
a4a0: 72 65 61 74 65 45 76 65 6e 74 45 78 57 28 4e 55  reateEventExW(NU
a4b0: 4c 4c 2c 20 4e 55 4c 4c 2c 20 43 52 45 41 54 45  LL, NULL, CREATE
a4c0: 5f 45 56 45 4e 54 5f 4d 41 4e 55 41 4c 5f 52 45  _EVENT_MANUAL_RE
a4d0: 53 45 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20  SET,.           
a4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a4f0: 20 20 20 20 20 53 59 4e 43 48 52 4f 4e 49 5a 45       SYNCHRONIZE
a500: 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
a510: 20 73 6c 65 65 70 4f 62 6a 21 3d 4e 55 4c 4c 20   sleepObj!=NULL 
a520: 29 3b 0a 20 20 6f 73 57 61 69 74 46 6f 72 53 69  );.  osWaitForSi
a530: 6e 67 6c 65 4f 62 6a 65 63 74 45 78 28 73 6c 65  ngleObjectEx(sle
a540: 65 70 4f 62 6a 2c 20 6d 69 6c 6c 69 73 65 63 6f  epObj, milliseco
a550: 6e 64 73 2c 20 46 41 4c 53 45 29 3b 0a 23 65 6c  nds, FALSE);.#el
a560: 73 65 0a 20 20 6f 73 53 6c 65 65 70 28 6d 69 6c  se.  osSleep(mil
a570: 6c 69 73 65 63 6f 6e 64 73 29 3b 0a 23 65 6e 64  liseconds);.#end
a580: 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  if.}../*.** Retu
a590: 72 6e 20 74 72 75 65 20 28 6e 6f 6e 2d 7a 65 72  rn true (non-zer
a5a0: 6f 29 20 69 66 20 77 65 20 61 72 65 20 72 75 6e  o) if we are run
a5b0: 6e 69 6e 67 20 75 6e 64 65 72 20 57 69 6e 4e 54  ning under WinNT
a5c0: 2c 20 57 69 6e 32 4b 2c 20 57 69 6e 58 50 2c 0a  , Win2K, WinXP,.
a5d0: 2a 2a 20 6f 72 20 57 69 6e 43 45 2e 20 20 52 65  ** or WinCE.  Re
a5e0: 74 75 72 6e 20 66 61 6c 73 65 20 28 7a 65 72 6f  turn false (zero
a5f0: 29 20 66 6f 72 20 57 69 6e 39 35 2c 20 57 69 6e  ) for Win95, Win
a600: 39 38 2c 20 6f 72 20 57 69 6e 4d 45 2e 0a 2a 2a  98, or WinME..**
a610: 0a 2a 2a 20 48 65 72 65 20 69 73 20 61 6e 20 69  .** Here is an i
a620: 6e 74 65 72 65 73 74 69 6e 67 20 6f 62 73 65 72  nteresting obser
a630: 76 61 74 69 6f 6e 3a 20 20 57 69 6e 39 35 2c 20  vation:  Win95, 
a640: 57 69 6e 39 38 2c 20 61 6e 64 20 57 69 6e 4d 45  Win98, and WinME
a650: 20 6c 61 63 6b 0a 2a 2a 20 74 68 65 20 4c 6f 63   lack.** the Loc
a660: 6b 46 69 6c 65 45 78 28 29 20 41 50 49 2e 20 20  kFileEx() API.  
a670: 42 75 74 20 77 65 20 63 61 6e 20 73 74 69 6c 6c  But we can still
a680: 20 73 74 61 74 69 63 61 6c 6c 79 20 6c 69 6e 6b   statically link
a690: 20 61 67 61 69 6e 73 74 20 74 68 61 74 0a 2a 2a   against that.**
a6a0: 20 41 50 49 20 61 73 20 6c 6f 6e 67 20 61 73 20   API as long as 
a6b0: 77 65 20 64 6f 6e 27 74 20 63 61 6c 6c 20 69 74  we don't call it
a6c0: 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67 20 57 69   when running Wi
a6d0: 6e 39 35 2f 39 38 2f 4d 45 2e 20 20 41 20 63 61  n95/98/ME.  A ca
a6e0: 6c 6c 20 74 6f 0a 2a 2a 20 74 68 69 73 20 72 6f  ll to.** this ro
a6f0: 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f  utine is used to
a700: 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68   determine if th
a710: 65 20 68 6f 73 74 20 69 73 20 57 69 6e 39 35 2f  e host is Win95/
a720: 39 38 2f 4d 45 20 6f 72 0a 2a 2a 20 57 69 6e 4e  98/ME or.** WinN
a730: 54 2f 32 4b 2f 58 50 20 73 6f 20 74 68 61 74 20  T/2K/XP so that 
a740: 77 65 20 77 69 6c 6c 20 6b 6e 6f 77 20 77 68 65  we will know whe
a750: 74 68 65 72 20 6f 72 20 6e 6f 74 20 77 65 20 63  ther or not we c
a760: 61 6e 20 73 61 66 65 6c 79 20 63 61 6c 6c 0a 2a  an safely call.*
a770: 2a 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 45 78  * the LockFileEx
a780: 28 29 20 41 50 49 2e 0a 2a 2f 0a 0a 23 69 66 20  () API..*/..#if 
a790: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
a7a0: 57 49 4e 33 32 5f 47 45 54 56 45 52 53 49 4f 4e  WIN32_GETVERSION
a7b0: 45 58 29 20 7c 7c 20 21 53 51 4c 49 54 45 5f 57  EX) || !SQLITE_W
a7c0: 49 4e 33 32 5f 47 45 54 56 45 52 53 49 4f 4e 45  IN32_GETVERSIONE
a7d0: 58 0a 23 20 64 65 66 69 6e 65 20 6f 73 49 73 4e  X.# define osIsN
a7e0: 54 28 29 20 20 28 31 29 0a 23 65 6c 69 66 20 53  T()  (1).#elif S
a7f0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c  QLITE_OS_WINCE |
a800: 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  | SQLITE_OS_WINR
a810: 54 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  T || !defined(SQ
a820: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
a830: 4e 53 49 29 0a 23 20 64 65 66 69 6e 65 20 6f 73  NSI).# define os
a840: 49 73 4e 54 28 29 20 20 28 31 29 0a 23 65 6c 69  IsNT()  (1).#eli
a850: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
a860: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45  E_WIN32_HAS_WIDE
a870: 29 0a 23 20 64 65 66 69 6e 65 20 6f 73 49 73 4e  ).# define osIsN
a880: 54 28 29 20 20 28 30 29 0a 23 65 6c 73 65 0a 23  T()  (0).#else.#
a890: 20 64 65 66 69 6e 65 20 6f 73 49 73 4e 54 28 29   define osIsNT()
a8a0: 20 20 28 28 73 71 6c 69 74 65 33 5f 6f 73 5f 74    ((sqlite3_os_t
a8b0: 79 70 65 3d 3d 32 29 20 7c 7c 20 73 71 6c 69 74  ype==2) || sqlit
a8c0: 65 33 5f 77 69 6e 33 32 5f 69 73 5f 6e 74 28 29  e3_win32_is_nt()
a8d0: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
a8e0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65  This function de
a8f0: 74 65 72 6d 69 6e 65 73 20 69 66 20 74 68 65 20  termines if the 
a900: 6d 61 63 68 69 6e 65 20 69 73 20 72 75 6e 6e 69  machine is runni
a910: 6e 67 20 61 20 76 65 72 73 69 6f 6e 20 6f 66 20  ng a version of 
a920: 57 69 6e 64 6f 77 73 0a 2a 2a 20 62 61 73 65 64  Windows.** based
a930: 20 6f 6e 20 74 68 65 20 4e 54 20 6b 65 72 6e 65   on the NT kerne
a940: 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  l..*/.int sqlite
a950: 33 5f 77 69 6e 33 32 5f 69 73 5f 6e 74 28 76 6f  3_win32_is_nt(vo
a960: 69 64 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64  id){.#if defined
a970: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 47 45  (SQLITE_WIN32_GE
a980: 54 56 45 52 53 49 4f 4e 45 58 29 20 26 26 20 53  TVERSIONEX) && S
a990: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 47 45 54 56  QLITE_WIN32_GETV
a9a0: 45 52 53 49 4f 4e 45 58 0a 20 20 69 66 28 20 6f  ERSIONEX.  if( o
a9b0: 73 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70  sInterlockedComp
a9c0: 61 72 65 45 78 63 68 61 6e 67 65 28 26 73 71 6c  areExchange(&sql
a9d0: 69 74 65 33 5f 6f 73 5f 74 79 70 65 2c 20 30 2c  ite3_os_type, 0,
a9e0: 20 30 29 3d 3d 30 20 29 7b 0a 23 69 66 20 21 53   0)==0 ){.#if !S
a9f0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26  QLITE_OS_WINRT &
aa00: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
aa10: 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29  _WIN32_HAS_WIDE)
aa20: 20 26 26 20 5c 0a 20 20 20 20 20 20 20 20 64 65   && \.        de
aa30: 66 69 6e 65 64 28 4e 54 44 44 49 5f 56 45 52 53  fined(NTDDI_VERS
aa40: 49 4f 4e 29 20 26 26 20 4e 54 44 44 49 5f 56 45  ION) && NTDDI_VE
aa50: 52 53 49 4f 4e 20 3e 3d 20 4e 54 44 44 49 5f 57  RSION >= NTDDI_W
aa60: 49 4e 38 0a 20 20 20 20 4f 53 56 45 52 53 49 4f  IN8.    OSVERSIO
aa70: 4e 49 4e 46 4f 57 20 73 49 6e 66 6f 3b 0a 20 20  NINFOW sInfo;.  
aa80: 20 20 73 49 6e 66 6f 2e 64 77 4f 53 56 65 72 73    sInfo.dwOSVers
aa90: 69 6f 6e 49 6e 66 6f 53 69 7a 65 20 3d 20 73 69  ionInfoSize = si
aaa0: 7a 65 6f 66 28 73 49 6e 66 6f 29 3b 0a 20 20 20  zeof(sInfo);.   
aab0: 20 6f 73 47 65 74 56 65 72 73 69 6f 6e 45 78 57   osGetVersionExW
aac0: 28 26 73 49 6e 66 6f 29 3b 0a 20 20 20 20 6f 73  (&sInfo);.    os
aad0: 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61  InterlockedCompa
aae0: 72 65 45 78 63 68 61 6e 67 65 28 26 73 71 6c 69  reExchange(&sqli
aaf0: 74 65 33 5f 6f 73 5f 74 79 70 65 2c 0a 20 20 20  te3_os_type,.   
ab00: 20 20 20 20 20 28 73 49 6e 66 6f 2e 64 77 50 6c       (sInfo.dwPl
ab10: 61 74 66 6f 72 6d 49 64 20 3d 3d 20 56 45 52 5f  atformId == VER_
ab20: 50 4c 41 54 46 4f 52 4d 5f 57 49 4e 33 32 5f 4e  PLATFORM_WIN32_N
ab30: 54 29 20 3f 20 32 20 3a 20 31 2c 20 30 29 3b 0a  T) ? 2 : 1, 0);.
ab40: 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 53 51  #elif defined(SQ
ab50: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
ab60: 4e 53 49 29 0a 20 20 20 20 4f 53 56 45 52 53 49  NSI).    OSVERSI
ab70: 4f 4e 49 4e 46 4f 41 20 73 49 6e 66 6f 3b 0a 20  ONINFOA sInfo;. 
ab80: 20 20 20 73 49 6e 66 6f 2e 64 77 4f 53 56 65 72     sInfo.dwOSVer
ab90: 73 69 6f 6e 49 6e 66 6f 53 69 7a 65 20 3d 20 73  sionInfoSize = s
aba0: 69 7a 65 6f 66 28 73 49 6e 66 6f 29 3b 0a 20 20  izeof(sInfo);.  
abb0: 20 20 6f 73 47 65 74 56 65 72 73 69 6f 6e 45 78    osGetVersionEx
abc0: 41 28 26 73 49 6e 66 6f 29 3b 0a 20 20 20 20 6f  A(&sInfo);.    o
abd0: 73 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70  sInterlockedComp
abe0: 61 72 65 45 78 63 68 61 6e 67 65 28 26 73 71 6c  areExchange(&sql
abf0: 69 74 65 33 5f 6f 73 5f 74 79 70 65 2c 0a 20 20  ite3_os_type,.  
ac00: 20 20 20 20 20 20 28 73 49 6e 66 6f 2e 64 77 50        (sInfo.dwP
ac10: 6c 61 74 66 6f 72 6d 49 64 20 3d 3d 20 56 45 52  latformId == VER
ac20: 5f 50 4c 41 54 46 4f 52 4d 5f 57 49 4e 33 32 5f  _PLATFORM_WIN32_
ac30: 4e 54 29 20 3f 20 32 20 3a 20 31 2c 20 30 29 3b  NT) ? 2 : 1, 0);
ac40: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 72 65  .#endif.  }.  re
ac50: 74 75 72 6e 20 6f 73 49 6e 74 65 72 6c 6f 63 6b  turn osInterlock
ac60: 65 64 43 6f 6d 70 61 72 65 45 78 63 68 61 6e 67  edCompareExchang
ac70: 65 28 26 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79  e(&sqlite3_os_ty
ac80: 70 65 2c 20 32 2c 20 32 29 3d 3d 32 3b 0a 23 65  pe, 2, 2)==2;.#e
ac90: 6c 69 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  lif SQLITE_TEST.
aca0: 20 20 72 65 74 75 72 6e 20 6f 73 49 6e 74 65 72    return osInter
acb0: 6c 6f 63 6b 65 64 43 6f 6d 70 61 72 65 45 78 63  lockedCompareExc
acc0: 68 61 6e 67 65 28 26 73 71 6c 69 74 65 33 5f 6f  hange(&sqlite3_o
acd0: 73 5f 74 79 70 65 2c 20 32 2c 20 32 29 3d 3d 32  s_type, 2, 2)==2
ace0: 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72 6e  ;.#else.  return
acf0: 20 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 69   1;.#endif.}..#i
ad00: 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  fdef SQLITE_WIN3
ad10: 32 5f 4d 41 4c 4c 4f 43 0a 2f 2a 0a 2a 2a 20 41  2_MALLOC./*.** A
ad20: 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65 73 20 6f  llocate nBytes o
ad30: 66 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61  f memory..*/.sta
ad40: 74 69 63 20 76 6f 69 64 20 2a 77 69 6e 4d 65 6d  tic void *winMem
ad50: 4d 61 6c 6c 6f 63 28 69 6e 74 20 6e 42 79 74 65  Malloc(int nByte
ad60: 73 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 48 65  s){.  HANDLE hHe
ad70: 61 70 3b 0a 20 20 76 6f 69 64 20 2a 70 3b 0a 0a  ap;.  void *p;..
ad80: 20 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61    winMemAssertMa
ad90: 67 69 63 28 29 3b 0a 20 20 68 48 65 61 70 20 3d  gic();.  hHeap =
ada0: 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29   winMemGetHeap()
adb0: 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48 65 61  ;.  assert( hHea
adc0: 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  p!=0 );.  assert
add0: 28 20 68 48 65 61 70 21 3d 49 4e 56 41 4c 49 44  ( hHeap!=INVALID
ade0: 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b  _HANDLE_VALUE );
adf0: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
ae00: 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64  WINRT && defined
ae10: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41  (SQLITE_WIN32_MA
ae20: 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a 20  LLOC_VALIDATE). 
ae30: 20 61 73 73 65 72 74 28 20 6f 73 48 65 61 70 56   assert( osHeapV
ae40: 61 6c 69 64 61 74 65 28 68 48 65 61 70 2c 20 53  alidate(hHeap, S
ae50: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
ae60: 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c 29 20 29 3b  _FLAGS, NULL) );
ae70: 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74  .#endif.  assert
ae80: 28 20 6e 42 79 74 65 73 3e 3d 30 20 29 3b 0a 20  ( nBytes>=0 );. 
ae90: 20 70 20 3d 20 6f 73 48 65 61 70 41 6c 6c 6f 63   p = osHeapAlloc
aea0: 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57  (hHeap, SQLITE_W
aeb0: 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c  IN32_HEAP_FLAGS,
aec0: 20 28 53 49 5a 45 5f 54 29 6e 42 79 74 65 73 29   (SIZE_T)nBytes)
aed0: 3b 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20  ;.  if( !p ){.  
aee0: 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51    sqlite3_log(SQ
aef0: 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69  LITE_NOMEM, "fai
af00: 6c 65 64 20 74 6f 20 48 65 61 70 41 6c 6c 6f 63  led to HeapAlloc
af10: 20 25 75 20 62 79 74 65 73 20 28 25 6c 75 29 2c   %u bytes (%lu),
af20: 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20 20   heap=%p",.     
af30: 20 20 20 20 20 20 20 20 20 20 20 6e 42 79 74 65             nByte
af40: 73 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f  s, osGetLastErro
af50: 72 28 29 2c 20 28 76 6f 69 64 2a 29 68 48 65 61  r(), (void*)hHea
af60: 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  p);.  }.  return
af70: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65   p;.}../*.** Fre
af80: 65 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61  e memory..*/.sta
af90: 74 69 63 20 76 6f 69 64 20 77 69 6e 4d 65 6d 46  tic void winMemF
afa0: 72 65 65 28 76 6f 69 64 20 2a 70 50 72 69 6f 72  ree(void *pPrior
afb0: 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 48 65 61  ){.  HANDLE hHea
afc0: 70 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65  p;..  winMemAsse
afd0: 72 74 4d 61 67 69 63 28 29 3b 0a 20 20 68 48 65  rtMagic();.  hHe
afe0: 61 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74 48 65  ap = winMemGetHe
aff0: 61 70 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ap();.  assert( 
b000: 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61 73  hHeap!=0 );.  as
b010: 73 65 72 74 28 20 68 48 65 61 70 21 3d 49 4e 56  sert( hHeap!=INV
b020: 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
b030: 45 20 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45  E );.#if !SQLITE
b040: 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66  _OS_WINRT && def
b050: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
b060: 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54  2_MALLOC_VALIDAT
b070: 45 29 0a 20 20 61 73 73 65 72 74 28 20 6f 73 48  E).  assert( osH
b080: 65 61 70 56 61 6c 69 64 61 74 65 28 68 48 65 61  eapValidate(hHea
b090: 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  p, SQLITE_WIN32_
b0a0: 48 45 41 50 5f 46 4c 41 47 53 2c 20 70 50 72 69  HEAP_FLAGS, pPri
b0b0: 6f 72 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  or) );.#endif.  
b0c0: 69 66 28 20 21 70 50 72 69 6f 72 20 29 20 72 65  if( !pPrior ) re
b0d0: 74 75 72 6e 3b 20 2f 2a 20 50 61 73 73 69 6e 67  turn; /* Passing
b0e0: 20 4e 55 4c 4c 20 74 6f 20 48 65 61 70 46 72 65   NULL to HeapFre
b0f0: 65 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 20  e is undefined. 
b100: 2a 2f 0a 20 20 69 66 28 20 21 6f 73 48 65 61 70  */.  if( !osHeap
b110: 46 72 65 65 28 68 48 65 61 70 2c 20 53 51 4c 49  Free(hHeap, SQLI
b120: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c  TE_WIN32_HEAP_FL
b130: 41 47 53 2c 20 70 50 72 69 6f 72 29 20 29 7b 0a  AGS, pPrior) ){.
b140: 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
b150: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66  SQLITE_NOMEM, "f
b160: 61 69 6c 65 64 20 74 6f 20 48 65 61 70 46 72 65  ailed to HeapFre
b170: 65 20 62 6c 6f 63 6b 20 25 70 20 28 25 6c 75 29  e block %p (%lu)
b180: 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20  , heap=%p",.    
b190: 20 20 20 20 20 20 20 20 20 20 20 20 70 50 72 69              pPri
b1a0: 6f 72 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72  or, osGetLastErr
b1b0: 6f 72 28 29 2c 20 28 76 6f 69 64 2a 29 68 48 65  or(), (void*)hHe
b1c0: 61 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ap);.  }.}../*.*
b1d0: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 73 69 7a  * Change the siz
b1e0: 65 20 6f 66 20 61 6e 20 65 78 69 73 74 69 6e 67  e of an existing
b1f0: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
b200: 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  on.*/.static voi
b210: 64 20 2a 77 69 6e 4d 65 6d 52 65 61 6c 6c 6f 63  d *winMemRealloc
b220: 28 76 6f 69 64 20 2a 70 50 72 69 6f 72 2c 20 69  (void *pPrior, i
b230: 6e 74 20 6e 42 79 74 65 73 29 7b 0a 20 20 48 41  nt nBytes){.  HA
b240: 4e 44 4c 45 20 68 48 65 61 70 3b 0a 20 20 76 6f  NDLE hHeap;.  vo
b250: 69 64 20 2a 70 3b 0a 0a 20 20 77 69 6e 4d 65 6d  id *p;..  winMem
b260: 41 73 73 65 72 74 4d 61 67 69 63 28 29 3b 0a 20  AssertMagic();. 
b270: 20 68 48 65 61 70 20 3d 20 77 69 6e 4d 65 6d 47   hHeap = winMemG
b280: 65 74 48 65 61 70 28 29 3b 0a 20 20 61 73 73 65  etHeap();.  asse
b290: 72 74 28 20 68 48 65 61 70 21 3d 30 20 29 3b 0a  rt( hHeap!=0 );.
b2a0: 20 20 61 73 73 65 72 74 28 20 68 48 65 61 70 21    assert( hHeap!
b2b0: 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f  =INVALID_HANDLE_
b2c0: 56 41 4c 55 45 20 29 3b 0a 23 69 66 20 21 53 51  VALUE );.#if !SQ
b2d0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
b2e0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
b2f0: 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c  WIN32_MALLOC_VAL
b300: 49 44 41 54 45 29 0a 20 20 61 73 73 65 72 74 28  IDATE).  assert(
b310: 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74 65 28   osHeapValidate(
b320: 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49  hHeap, SQLITE_WI
b330: 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20  N32_HEAP_FLAGS, 
b340: 70 50 72 69 6f 72 29 20 29 3b 0a 23 65 6e 64 69  pPrior) );.#endi
b350: 66 0a 20 20 61 73 73 65 72 74 28 20 6e 42 79 74  f.  assert( nByt
b360: 65 73 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 21  es>=0 );.  if( !
b370: 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 70 20  pPrior ){.    p 
b380: 3d 20 6f 73 48 65 61 70 41 6c 6c 6f 63 28 68 48  = osHeapAlloc(hH
b390: 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33  eap, SQLITE_WIN3
b3a0: 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 28 53  2_HEAP_FLAGS, (S
b3b0: 49 5a 45 5f 54 29 6e 42 79 74 65 73 29 3b 0a 20  IZE_T)nBytes);. 
b3c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20   }else{.    p = 
b3d0: 6f 73 48 65 61 70 52 65 41 6c 6c 6f 63 28 68 48  osHeapReAlloc(hH
b3e0: 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33  eap, SQLITE_WIN3
b3f0: 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 70 50  2_HEAP_FLAGS, pP
b400: 72 69 6f 72 2c 20 28 53 49 5a 45 5f 54 29 6e 42  rior, (SIZE_T)nB
b410: 79 74 65 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ytes);.  }.  if(
b420: 20 21 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74   !p ){.    sqlit
b430: 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f  e3_log(SQLITE_NO
b440: 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f 20  MEM, "failed to 
b450: 25 73 20 25 75 20 62 79 74 65 73 20 28 25 6c 75  %s %u bytes (%lu
b460: 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20  ), heap=%p",.   
b470: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 72               pPr
b480: 69 6f 72 20 3f 20 22 48 65 61 70 52 65 41 6c 6c  ior ? "HeapReAll
b490: 6f 63 22 20 3a 20 22 48 65 61 70 41 6c 6c 6f 63  oc" : "HeapAlloc
b4a0: 22 2c 20 6e 42 79 74 65 73 2c 20 6f 73 47 65 74  ", nBytes, osGet
b4b0: 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20  LastError(),.   
b4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f               (vo
b4d0: 69 64 2a 29 68 48 65 61 70 29 3b 0a 20 20 7d 0a  id*)hHeap);.  }.
b4e0: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
b4f0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
b500: 73 69 7a 65 20 6f 66 20 61 6e 20 6f 75 74 73 74  size of an outst
b510: 61 6e 64 69 6e 67 20 61 6c 6c 6f 63 61 74 69 6f  anding allocatio
b520: 6e 2c 20 69 6e 20 62 79 74 65 73 2e 0a 2a 2f 0a  n, in bytes..*/.
b530: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 65  static int winMe
b540: 6d 53 69 7a 65 28 76 6f 69 64 20 2a 70 29 7b 0a  mSize(void *p){.
b550: 20 20 48 41 4e 44 4c 45 20 68 48 65 61 70 3b 0a    HANDLE hHeap;.
b560: 20 20 53 49 5a 45 5f 54 20 6e 3b 0a 0a 20 20 77    SIZE_T n;..  w
b570: 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63  inMemAssertMagic
b580: 28 29 3b 0a 20 20 68 48 65 61 70 20 3d 20 77 69  ();.  hHeap = wi
b590: 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 3b 0a 20  nMemGetHeap();. 
b5a0: 20 61 73 73 65 72 74 28 20 68 48 65 61 70 21 3d   assert( hHeap!=
b5b0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68  0 );.  assert( h
b5c0: 48 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41  Heap!=INVALID_HA
b5d0: 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69  NDLE_VALUE );.#i
b5e0: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
b5f0: 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  RT && defined(SQ
b600: 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f  LITE_WIN32_MALLO
b610: 43 5f 56 41 4c 49 44 41 54 45 29 0a 20 20 61 73  C_VALIDATE).  as
b620: 73 65 72 74 28 20 6f 73 48 65 61 70 56 61 6c 69  sert( osHeapVali
b630: 64 61 74 65 28 68 48 65 61 70 2c 20 53 51 4c 49  date(hHeap, SQLI
b640: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c  TE_WIN32_HEAP_FL
b650: 41 47 53 2c 20 70 29 20 29 3b 0a 23 65 6e 64 69  AGS, p) );.#endi
b660: 66 0a 20 20 69 66 28 20 21 70 20 29 20 72 65 74  f.  if( !p ) ret
b670: 75 72 6e 20 30 3b 0a 20 20 6e 20 3d 20 6f 73 48  urn 0;.  n = osH
b680: 65 61 70 53 69 7a 65 28 68 48 65 61 70 2c 20 53  eapSize(hHeap, S
b690: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
b6a0: 5f 46 4c 41 47 53 2c 20 70 29 3b 0a 20 20 69 66  _FLAGS, p);.  if
b6b0: 28 20 6e 3d 3d 28 53 49 5a 45 5f 54 29 2d 31 20  ( n==(SIZE_T)-1 
b6c0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c  ){.    sqlite3_l
b6d0: 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c  og(SQLITE_NOMEM,
b6e0: 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65 61 70   "failed to Heap
b6f0: 53 69 7a 65 20 62 6c 6f 63 6b 20 25 70 20 28 25  Size block %p (%
b700: 6c 75 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20  lu), heap=%p",. 
b710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
b720: 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  , osGetLastError
b730: 28 29 2c 20 28 76 6f 69 64 2a 29 68 48 65 61 70  (), (void*)hHeap
b740: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
b750: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 69  .  }.  return (i
b760: 6e 74 29 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  nt)n;.}../*.** R
b770: 6f 75 6e 64 20 75 70 20 61 20 72 65 71 75 65 73  ound up a reques
b780: 74 20 73 69 7a 65 20 74 6f 20 74 68 65 20 6e 65  t size to the ne
b790: 78 74 20 76 61 6c 69 64 20 61 6c 6c 6f 63 61 74  xt valid allocat
b7a0: 69 6f 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61  ion size..*/.sta
b7b0: 74 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d 52 6f  tic int winMemRo
b7c0: 75 6e 64 75 70 28 69 6e 74 20 6e 29 7b 0a 20 20  undup(int n){.  
b7d0: 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a  return n;.}../*.
b7e0: 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  ** Initialize th
b7f0: 69 73 20 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a 73 74  is module..*/.st
b800: 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d 49  atic int winMemI
b810: 6e 69 74 28 76 6f 69 64 20 2a 70 41 70 70 44 61  nit(void *pAppDa
b820: 74 61 29 7b 0a 20 20 77 69 6e 4d 65 6d 44 61 74  ta){.  winMemDat
b830: 61 20 2a 70 57 69 6e 4d 65 6d 44 61 74 61 20 3d  a *pWinMemData =
b840: 20 28 77 69 6e 4d 65 6d 44 61 74 61 20 2a 29 70   (winMemData *)p
b850: 41 70 70 44 61 74 61 3b 0a 0a 20 20 69 66 28 20  AppData;..  if( 
b860: 21 70 57 69 6e 4d 65 6d 44 61 74 61 20 29 20 72  !pWinMemData ) r
b870: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
b880: 4f 52 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57  OR;.  assert( pW
b890: 69 6e 4d 65 6d 44 61 74 61 2d 3e 6d 61 67 69 63  inMemData->magic
b8a0: 31 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 31  1==WINMEM_MAGIC1
b8b0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57   );.  assert( pW
b8c0: 69 6e 4d 65 6d 44 61 74 61 2d 3e 6d 61 67 69 63  inMemData->magic
b8d0: 32 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 32  2==WINMEM_MAGIC2
b8e0: 20 29 3b 0a 0a 23 69 66 20 21 53 51 4c 49 54 45   );..#if !SQLITE
b8f0: 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 53 51 4c  _OS_WINRT && SQL
b900: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 43  ITE_WIN32_HEAP_C
b910: 52 45 41 54 45 0a 20 20 69 66 28 20 21 70 57 69  REATE.  if( !pWi
b920: 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20  nMemData->hHeap 
b930: 29 7b 0a 20 20 20 20 44 57 4f 52 44 20 64 77 49  ){.    DWORD dwI
b940: 6e 69 74 69 61 6c 53 69 7a 65 20 3d 20 53 51 4c  nitialSize = SQL
b950: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 49  ITE_WIN32_HEAP_I
b960: 4e 49 54 5f 53 49 5a 45 3b 0a 20 20 20 20 44 57  NIT_SIZE;.    DW
b970: 4f 52 44 20 64 77 4d 61 78 69 6d 75 6d 53 69 7a  ORD dwMaximumSiz
b980: 65 20 3d 20 28 44 57 4f 52 44 29 73 71 6c 69 74  e = (DWORD)sqlit
b990: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e  e3GlobalConfig.n
b9a0: 48 65 61 70 3b 0a 20 20 20 20 69 66 28 20 64 77  Heap;.    if( dw
b9b0: 4d 61 78 69 6d 75 6d 53 69 7a 65 3d 3d 30 20 29  MaximumSize==0 )
b9c0: 7b 0a 20 20 20 20 20 20 64 77 4d 61 78 69 6d 75  {.      dwMaximu
b9d0: 6d 53 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f 57  mSize = SQLITE_W
b9e0: 49 4e 33 32 5f 48 45 41 50 5f 4d 41 58 5f 53 49  IN32_HEAP_MAX_SI
b9f0: 5a 45 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ZE;.    }else if
ba00: 28 20 64 77 49 6e 69 74 69 61 6c 53 69 7a 65 3e  ( dwInitialSize>
ba10: 64 77 4d 61 78 69 6d 75 6d 53 69 7a 65 20 29 7b  dwMaximumSize ){
ba20: 0a 20 20 20 20 20 20 64 77 49 6e 69 74 69 61 6c  .      dwInitial
ba30: 53 69 7a 65 20 3d 20 64 77 4d 61 78 69 6d 75 6d  Size = dwMaximum
ba40: 53 69 7a 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Size;.    }.    
ba50: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65  pWinMemData->hHe
ba60: 61 70 20 3d 20 6f 73 48 65 61 70 43 72 65 61 74  ap = osHeapCreat
ba70: 65 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  e(SQLITE_WIN32_H
ba80: 45 41 50 5f 46 4c 41 47 53 2c 0a 20 20 20 20 20  EAP_FLAGS,.     
ba90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
baa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bab0: 20 64 77 49 6e 69 74 69 61 6c 53 69 7a 65 2c 20   dwInitialSize, 
bac0: 64 77 4d 61 78 69 6d 75 6d 53 69 7a 65 29 3b 0a  dwMaximumSize);.
bad0: 20 20 20 20 69 66 28 20 21 70 57 69 6e 4d 65 6d      if( !pWinMem
bae0: 44 61 74 61 2d 3e 68 48 65 61 70 20 29 7b 0a 20  Data->hHeap ){. 
baf0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67       sqlite3_log
bb00: 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 0a 20  (SQLITE_NOMEM,. 
bb10: 20 20 20 20 20 20 20 20 20 22 66 61 69 6c 65 64           "failed
bb20: 20 74 6f 20 48 65 61 70 43 72 65 61 74 65 20 28   to HeapCreate (
bb30: 25 6c 75 29 2c 20 66 6c 61 67 73 3d 25 75 2c 20  %lu), flags=%u, 
bb40: 69 6e 69 74 53 69 7a 65 3d 25 6c 75 2c 20 6d 61  initSize=%lu, ma
bb50: 78 53 69 7a 65 3d 25 6c 75 22 2c 0a 20 20 20 20  xSize=%lu",.    
bb60: 20 20 20 20 20 20 6f 73 47 65 74 4c 61 73 74 45        osGetLastE
bb70: 72 72 6f 72 28 29 2c 20 53 51 4c 49 54 45 5f 57  rror(), SQLITE_W
bb80: 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c  IN32_HEAP_FLAGS,
bb90: 20 64 77 49 6e 69 74 69 61 6c 53 69 7a 65 2c 0a   dwInitialSize,.
bba0: 20 20 20 20 20 20 20 20 20 20 64 77 4d 61 78 69            dwMaxi
bbb0: 6d 75 6d 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  mumSize);.      
bbc0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
bbd0: 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  MEM;.    }.    p
bbe0: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e  WinMemData->bOwn
bbf0: 65 64 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 61  ed = TRUE;.    a
bc00: 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61  ssert( pWinMemDa
bc10: 74 61 2d 3e 62 4f 77 6e 65 64 20 29 3b 0a 20 20  ta->bOwned );.  
bc20: 7d 0a 23 65 6c 73 65 0a 20 20 70 57 69 6e 4d 65  }.#else.  pWinMe
bc30: 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 3d 20 6f  mData->hHeap = o
bc40: 73 47 65 74 50 72 6f 63 65 73 73 48 65 61 70 28  sGetProcessHeap(
bc50: 29 3b 0a 20 20 69 66 28 20 21 70 57 69 6e 4d 65  );.  if( !pWinMe
bc60: 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 29 7b 0a  mData->hHeap ){.
bc70: 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
bc80: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 0a 20 20  SQLITE_NOMEM,.  
bc90: 20 20 20 20 20 20 22 66 61 69 6c 65 64 20 74 6f        "failed to
bca0: 20 47 65 74 50 72 6f 63 65 73 73 48 65 61 70 20   GetProcessHeap 
bcb0: 28 25 6c 75 29 22 2c 20 6f 73 47 65 74 4c 61 73  (%lu)", osGetLas
bcc0: 74 45 72 72 6f 72 28 29 29 3b 0a 20 20 20 20 72  tError());.    r
bcd0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
bce0: 45 4d 3b 0a 20 20 7d 0a 20 20 70 57 69 6e 4d 65  EM;.  }.  pWinMe
bcf0: 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20 3d 20  mData->bOwned = 
bd00: 46 41 4c 53 45 3b 0a 20 20 61 73 73 65 72 74 28  FALSE;.  assert(
bd10: 20 21 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62   !pWinMemData->b
bd20: 4f 77 6e 65 64 20 29 3b 0a 23 65 6e 64 69 66 0a  Owned );.#endif.
bd30: 20 20 61 73 73 65 72 74 28 20 70 57 69 6e 4d 65    assert( pWinMe
bd40: 6d 44 61 74 61 2d 3e 68 48 65 61 70 21 3d 30 20  mData->hHeap!=0 
bd50: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57 69  );.  assert( pWi
bd60: 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 21  nMemData->hHeap!
bd70: 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f  =INVALID_HANDLE_
bd80: 56 41 4c 55 45 20 29 3b 0a 23 69 66 20 21 53 51  VALUE );.#if !SQ
bd90: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
bda0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
bdb0: 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c  WIN32_MALLOC_VAL
bdc0: 49 44 41 54 45 29 0a 20 20 61 73 73 65 72 74 28  IDATE).  assert(
bdd0: 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74 65 28   osHeapValidate(
bde0: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65  pWinMemData->hHe
bdf0: 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ap, SQLITE_WIN32
be00: 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 4e 55 4c  _HEAP_FLAGS, NUL
be10: 4c 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72  L) );.#endif.  r
be20: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
be30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 69 6e 69 74  .}../*.** Deinit
be40: 69 61 6c 69 7a 65 20 74 68 69 73 20 6d 6f 64 75  ialize this modu
be50: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  le..*/.static vo
be60: 69 64 20 77 69 6e 4d 65 6d 53 68 75 74 64 6f 77  id winMemShutdow
be70: 6e 28 76 6f 69 64 20 2a 70 41 70 70 44 61 74 61  n(void *pAppData
be80: 29 7b 0a 20 20 77 69 6e 4d 65 6d 44 61 74 61 20  ){.  winMemData 
be90: 2a 70 57 69 6e 4d 65 6d 44 61 74 61 20 3d 20 28  *pWinMemData = (
bea0: 77 69 6e 4d 65 6d 44 61 74 61 20 2a 29 70 41 70  winMemData *)pAp
beb0: 70 44 61 74 61 3b 0a 0a 20 20 69 66 28 20 21 70  pData;..  if( !p
bec0: 57 69 6e 4d 65 6d 44 61 74 61 20 29 20 72 65 74  WinMemData ) ret
bed0: 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70  urn;.  assert( p
bee0: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 6d 61 67 69  WinMemData->magi
bef0: 63 31 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49 43  c1==WINMEM_MAGIC
bf00: 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  1 );.  assert( p
bf10: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 6d 61 67 69  WinMemData->magi
bf20: 63 32 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49 43  c2==WINMEM_MAGIC
bf30: 32 20 29 3b 0a 0a 20 20 69 66 28 20 70 57 69 6e  2 );..  if( pWin
bf40: 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 29  MemData->hHeap )
bf50: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 57  {.    assert( pW
bf60: 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70  inMemData->hHeap
bf70: 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  !=INVALID_HANDLE
bf80: 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66 20 21 53  _VALUE );.#if !S
bf90: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26  QLITE_OS_WINRT &
bfa0: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
bfb0: 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41  _WIN32_MALLOC_VA
bfc0: 4c 49 44 41 54 45 29 0a 20 20 20 20 61 73 73 65  LIDATE).    asse
bfd0: 72 74 28 20 6f 73 48 65 61 70 56 61 6c 69 64 61  rt( osHeapValida
bfe0: 74 65 28 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e  te(pWinMemData->
bff0: 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49  hHeap, SQLITE_WI
c000: 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20  N32_HEAP_FLAGS, 
c010: 4e 55 4c 4c 29 20 29 3b 0a 23 65 6e 64 69 66 0a  NULL) );.#endif.
c020: 20 20 20 20 69 66 28 20 70 57 69 6e 4d 65 6d 44      if( pWinMemD
c030: 61 74 61 2d 3e 62 4f 77 6e 65 64 20 29 7b 0a 20  ata->bOwned ){. 
c040: 20 20 20 20 20 69 66 28 20 21 6f 73 48 65 61 70       if( !osHeap
c050: 44 65 73 74 72 6f 79 28 70 57 69 6e 4d 65 6d 44  Destroy(pWinMemD
c060: 61 74 61 2d 3e 68 48 65 61 70 29 20 29 7b 0a 20  ata->hHeap) ){. 
c070: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c         sqlite3_l
c080: 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c  og(SQLITE_NOMEM,
c090: 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65 61 70   "failed to Heap
c0a0: 44 65 73 74 72 6f 79 20 28 25 6c 75 29 2c 20 68  Destroy (%lu), h
c0b0: 65 61 70 3d 25 70 22 2c 0a 20 20 20 20 20 20 20  eap=%p",.       
c0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47               osG
c0d0: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 28  etLastError(), (
c0e0: 76 6f 69 64 2a 29 70 57 69 6e 4d 65 6d 44 61 74  void*)pWinMemDat
c0f0: 61 2d 3e 68 48 65 61 70 29 3b 0a 20 20 20 20 20  a->hHeap);.     
c100: 20 7d 0a 20 20 20 20 20 20 70 57 69 6e 4d 65 6d   }.      pWinMem
c110: 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20 3d 20 46  Data->bOwned = F
c120: 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ALSE;.    }.    
c130: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65  pWinMemData->hHe
c140: 61 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 7d  ap = NULL;.  }.}
c150: 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70 75 6c 61 74 65  ../*.** Populate
c160: 20 74 68 65 20 6c 6f 77 2d 6c 65 76 65 6c 20 6d   the low-level m
c170: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
c180: 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65   function pointe
c190: 72 73 20 69 6e 0a 2a 2a 20 73 71 6c 69 74 65 33  rs in.** sqlite3
c1a0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 20 77  GlobalConfig.m w
c1b0: 69 74 68 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  ith pointers to 
c1c0: 74 68 65 20 72 6f 75 74 69 6e 65 73 20 69 6e 20  the routines in 
c1d0: 74 68 69 73 20 66 69 6c 65 2e 20 54 68 65 0a 2a  this file. The.*
c1e0: 2a 20 61 72 67 75 6d 65 6e 74 73 20 73 70 65 63  * arguments spec
c1f0: 69 66 79 20 74 68 65 20 62 6c 6f 63 6b 20 6f 66  ify the block of
c200: 20 6d 65 6d 6f 72 79 20 74 6f 20 6d 61 6e 61 67   memory to manag
c210: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
c220: 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61  utine is only ca
c230: 6c 6c 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f  lled by sqlite3_
c240: 63 6f 6e 66 69 67 28 29 2c 20 61 6e 64 20 74 68  config(), and th
c250: 65 72 65 66 6f 72 65 0a 2a 2a 20 69 73 20 6e 6f  erefore.** is no
c260: 74 20 72 65 71 75 69 72 65 64 20 74 6f 20 62 65  t required to be
c270: 20 74 68 72 65 61 64 73 61 66 65 20 28 69 74 20   threadsafe (it 
c280: 69 73 20 6e 6f 74 29 2e 0a 2a 2f 0a 63 6f 6e 73  is not)..*/.cons
c290: 74 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65  t sqlite3_mem_me
c2a0: 74 68 6f 64 73 20 2a 73 71 6c 69 74 65 33 4d 65  thods *sqlite3Me
c2b0: 6d 47 65 74 57 69 6e 33 32 28 76 6f 69 64 29 7b  mGetWin32(void){
c2c0: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
c2d0: 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68  sqlite3_mem_meth
c2e0: 6f 64 73 20 77 69 6e 4d 65 6d 4d 65 74 68 6f 64  ods winMemMethod
c2f0: 73 20 3d 20 7b 0a 20 20 20 20 77 69 6e 4d 65 6d  s = {.    winMem
c300: 4d 61 6c 6c 6f 63 2c 0a 20 20 20 20 77 69 6e 4d  Malloc,.    winM
c310: 65 6d 46 72 65 65 2c 0a 20 20 20 20 77 69 6e 4d  emFree,.    winM
c320: 65 6d 52 65 61 6c 6c 6f 63 2c 0a 20 20 20 20 77  emRealloc,.    w
c330: 69 6e 4d 65 6d 53 69 7a 65 2c 0a 20 20 20 20 77  inMemSize,.    w
c340: 69 6e 4d 65 6d 52 6f 75 6e 64 75 70 2c 0a 20 20  inMemRoundup,.  
c350: 20 20 77 69 6e 4d 65 6d 49 6e 69 74 2c 0a 20 20    winMemInit,.  
c360: 20 20 77 69 6e 4d 65 6d 53 68 75 74 64 6f 77 6e    winMemShutdown
c370: 2c 0a 20 20 20 20 26 77 69 6e 5f 6d 65 6d 5f 64  ,.    &win_mem_d
c380: 61 74 61 0a 20 20 7d 3b 0a 20 20 72 65 74 75 72  ata.  };.  retur
c390: 6e 20 26 77 69 6e 4d 65 6d 4d 65 74 68 6f 64 73  n &winMemMethods
c3a0: 3b 0a 7d 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65  ;.}..void sqlite
c3b0: 33 4d 65 6d 53 65 74 44 65 66 61 75 6c 74 28 76  3MemSetDefault(v
c3c0: 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  oid){.  sqlite3_
c3d0: 63 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f 43 4f  config(SQLITE_CO
c3e0: 4e 46 49 47 5f 4d 41 4c 4c 4f 43 2c 20 73 71 6c  NFIG_MALLOC, sql
c3f0: 69 74 65 33 4d 65 6d 47 65 74 57 69 6e 33 32 28  ite3MemGetWin32(
c400: 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ));.}.#endif /* 
c410: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c  SQLITE_WIN32_MAL
c420: 4c 4f 43 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f  LOC */../*.** Co
c430: 6e 76 65 72 74 20 61 20 55 54 46 2d 38 20 73 74  nvert a UTF-8 st
c440: 72 69 6e 67 20 74 6f 20 4d 69 63 72 6f 73 6f 66  ring to Microsof
c450: 74 20 55 6e 69 63 6f 64 65 20 28 55 54 46 2d 31  t Unicode (UTF-1
c460: 36 3f 29 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65  6?)..**.** Space
c470: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74   to hold the ret
c480: 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73 20  urned string is 
c490: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61  obtained from ma
c4a0: 6c 6c 6f 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lloc..*/.static 
c4b0: 4c 50 57 53 54 52 20 77 69 6e 55 74 66 38 54 6f  LPWSTR winUtf8To
c4c0: 55 6e 69 63 6f 64 65 28 63 6f 6e 73 74 20 63 68  Unicode(const ch
c4d0: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a  ar *zFilename){.
c4e0: 20 20 69 6e 74 20 6e 43 68 61 72 3b 0a 20 20 4c    int nChar;.  L
c4f0: 50 57 53 54 52 20 7a 57 69 64 65 46 69 6c 65 6e  PWSTR zWideFilen
c500: 61 6d 65 3b 0a 0a 20 20 6e 43 68 61 72 20 3d 20  ame;..  nChar = 
c510: 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64  osMultiByteToWid
c520: 65 43 68 61 72 28 43 50 5f 55 54 46 38 2c 20 30  eChar(CP_UTF8, 0
c530: 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c  , zFilename, -1,
c540: 20 4e 55 4c 4c 2c 20 30 29 3b 0a 20 20 69 66 28   NULL, 0);.  if(
c550: 20 6e 43 68 61 72 3d 3d 30 20 29 7b 0a 20 20 20   nChar==0 ){.   
c560: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
c570: 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 20 3d   zWideFilename =
c580: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
c590: 72 6f 28 20 6e 43 68 61 72 2a 73 69 7a 65 6f 66  ro( nChar*sizeof
c5a0: 28 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 5b 30  (zWideFilename[0
c5b0: 5d 29 20 29 3b 0a 20 20 69 66 28 20 7a 57 69 64  ]) );.  if( zWid
c5c0: 65 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a  eFilename==0 ){.
c5d0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
c5e0: 7d 0a 20 20 6e 43 68 61 72 20 3d 20 6f 73 4d 75  }.  nChar = osMu
c5f0: 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43 68 61  ltiByteToWideCha
c600: 72 28 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a 46  r(CP_UTF8, 0, zF
c610: 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a 57 69  ilename, -1, zWi
c620: 64 65 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20  deFilename,.    
c630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c640: 20 20 20 20 20 20 20 20 20 20 20 20 6e 43 68 61              nCha
c650: 72 29 3b 0a 20 20 69 66 28 20 6e 43 68 61 72 3d  r);.  if( nChar=
c660: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
c670: 33 5f 66 72 65 65 28 7a 57 69 64 65 46 69 6c 65  3_free(zWideFile
c680: 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 57 69 64 65  name);.    zWide
c690: 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20  Filename = 0;.  
c6a0: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 57 69 64 65  }.  return zWide
c6b0: 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a  Filename;.}../*.
c6c0: 2a 2a 20 43 6f 6e 76 65 72 74 20 4d 69 63 72 6f  ** Convert Micro
c6d0: 73 6f 66 74 20 55 6e 69 63 6f 64 65 20 74 6f 20  soft Unicode to 
c6e0: 55 54 46 2d 38 2e 20 20 53 70 61 63 65 20 74 6f  UTF-8.  Space to
c6f0: 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e   hold the return
c700: 65 64 20 73 74 72 69 6e 67 20 69 73 0a 2a 2a 20  ed string is.** 
c710: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
c720: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a  lite3_malloc()..
c730: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
c740: 77 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66 38  winUnicodeToUtf8
c750: 28 4c 50 43 57 53 54 52 20 7a 57 69 64 65 46 69  (LPCWSTR zWideFi
c760: 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 6e  lename){.  int n
c770: 42 79 74 65 3b 0a 20 20 63 68 61 72 20 2a 7a 46  Byte;.  char *zF
c780: 69 6c 65 6e 61 6d 65 3b 0a 0a 20 20 6e 42 79 74  ilename;..  nByt
c790: 65 20 3d 20 6f 73 57 69 64 65 43 68 61 72 54 6f  e = osWideCharTo
c7a0: 4d 75 6c 74 69 42 79 74 65 28 43 50 5f 55 54 46  MultiByte(CP_UTF
c7b0: 38 2c 20 30 2c 20 7a 57 69 64 65 46 69 6c 65 6e  8, 0, zWideFilen
c7c0: 61 6d 65 2c 20 2d 31 2c 20 30 2c 20 30 2c 20 30  ame, -1, 0, 0, 0
c7d0: 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e 42 79 74  , 0);.  if( nByt
c7e0: 65 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20 72 65  e == 0 ){.    re
c7f0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 46  turn 0;.  }.  zF
c800: 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ilename = sqlite
c810: 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42 79  3MallocZero( nBy
c820: 74 65 20 29 3b 0a 20 20 69 66 28 20 7a 46 69 6c  te );.  if( zFil
c830: 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  ename==0 ){.    
c840: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
c850: 6e 42 79 74 65 20 3d 20 6f 73 57 69 64 65 43 68  nByte = osWideCh
c860: 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 28 43 50  arToMultiByte(CP
c870: 5f 55 54 46 38 2c 20 30 2c 20 7a 57 69 64 65 46  _UTF8, 0, zWideF
c880: 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a 46 69  ilename, -1, zFi
c890: 6c 65 6e 61 6d 65 2c 20 6e 42 79 74 65 2c 0a 20  lename, nByte,. 
c8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
c8c0: 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e 42 79 74  , 0);.  if( nByt
c8d0: 65 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20 73 71  e == 0 ){.    sq
c8e0: 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 69 6c 65  lite3_free(zFile
c8f0: 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 46 69 6c 65  name);.    zFile
c900: 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  name = 0;.  }.  
c910: 72 65 74 75 72 6e 20 7a 46 69 6c 65 6e 61 6d 65  return zFilename
c920: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  ;.}../*.** Conve
c930: 72 74 20 61 6e 20 41 4e 53 49 20 73 74 72 69 6e  rt an ANSI strin
c940: 67 20 74 6f 20 4d 69 63 72 6f 73 6f 66 74 20 55  g to Microsoft U
c950: 6e 69 63 6f 64 65 2c 20 62 61 73 65 64 20 6f 6e  nicode, based on
c960: 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20   the.** current 
c970: 63 6f 64 65 70 61 67 65 20 73 65 74 74 69 6e 67  codepage setting
c980: 73 20 66 6f 72 20 66 69 6c 65 20 61 70 69 73 2e  s for file apis.
c990: 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20  .**.** Space to 
c9a0: 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65  hold the returne
c9b0: 64 20 73 74 72 69 6e 67 20 69 73 20 6f 62 74 61  d string is obta
c9c0: 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20 73 71 6c  ined.** from sql
c9d0: 69 74 65 33 5f 6d 61 6c 6c 6f 63 2e 0a 2a 2f 0a  ite3_malloc..*/.
c9e0: 73 74 61 74 69 63 20 4c 50 57 53 54 52 20 77 69  static LPWSTR wi
c9f0: 6e 4d 62 63 73 54 6f 55 6e 69 63 6f 64 65 28 63  nMbcsToUnicode(c
ca00: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
ca10: 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 6e 42 79  name){.  int nBy
ca20: 74 65 3b 0a 20 20 4c 50 57 53 54 52 20 7a 4d 62  te;.  LPWSTR zMb
ca30: 63 73 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 69 6e  csFilename;.  in
ca40: 74 20 63 6f 64 65 70 61 67 65 20 3d 20 6f 73 41  t codepage = osA
ca50: 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49 28 29  reFileApisANSI()
ca60: 20 3f 20 43 50 5f 41 43 50 20 3a 20 43 50 5f 4f   ? CP_ACP : CP_O
ca70: 45 4d 43 50 3b 0a 0a 20 20 6e 42 79 74 65 20 3d  EMCP;..  nByte =
ca80: 20 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f 57 69   osMultiByteToWi
ca90: 64 65 43 68 61 72 28 63 6f 64 65 70 61 67 65 2c  deChar(codepage,
caa0: 20 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d   0, zFilename, -
cab0: 31 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20  1, NULL,.       
cac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cad0: 20 20 20 20 20 20 20 20 20 30 29 2a 73 69 7a 65           0)*size
cae0: 6f 66 28 57 43 48 41 52 29 3b 0a 20 20 69 66 28  of(WCHAR);.  if(
caf0: 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20   nByte==0 ){.   
cb00: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
cb10: 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 20 3d   zMbcsFilename =
cb20: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
cb30: 72 6f 28 20 6e 42 79 74 65 2a 73 69 7a 65 6f 66  ro( nByte*sizeof
cb40: 28 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 5b 30  (zMbcsFilename[0
cb50: 5d 29 20 29 3b 0a 20 20 69 66 28 20 7a 4d 62 63  ]) );.  if( zMbc
cb60: 73 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a  sFilename==0 ){.
cb70: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
cb80: 7d 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73 4d 75  }.  nByte = osMu
cb90: 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43 68 61  ltiByteToWideCha
cba0: 72 28 63 6f 64 65 70 61 67 65 2c 20 30 2c 20 7a  r(codepage, 0, z
cbb0: 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a 4d  Filename, -1, zM
cbc0: 62 63 73 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20  bcsFilename,.   
cbd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cbe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 42 79               nBy
cbf0: 74 65 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65  te);.  if( nByte
cc00: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
cc10: 65 33 5f 66 72 65 65 28 7a 4d 62 63 73 46 69 6c  e3_free(zMbcsFil
cc20: 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 4d 62 63  ename);.    zMbc
cc30: 73 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20  sFilename = 0;. 
cc40: 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4d 62 63   }.  return zMbc
cc50: 73 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a  sFilename;.}../*
cc60: 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 4d 69 63 72  .** Convert Micr
cc70: 6f 73 6f 66 74 20 55 6e 69 63 6f 64 65 20 74 6f  osoft Unicode to
cc80: 20 6d 75 6c 74 69 2d 62 79 74 65 20 63 68 61 72   multi-byte char
cc90: 61 63 74 65 72 20 73 74 72 69 6e 67 2c 20 62 61  acter string, ba
cca0: 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 75 73  sed on the.** us
ccb0: 65 72 27 73 20 41 4e 53 49 20 63 6f 64 65 70 61  er's ANSI codepa
ccc0: 67 65 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20  ge..**.** Space 
ccd0: 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75  to hold the retu
cce0: 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73 20 6f  rned string is o
ccf0: 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20  btained from.** 
cd00: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29  sqlite3_malloc()
cd10: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
cd20: 20 2a 77 69 6e 55 6e 69 63 6f 64 65 54 6f 4d 62   *winUnicodeToMb
cd30: 63 73 28 4c 50 43 57 53 54 52 20 7a 57 69 64 65  cs(LPCWSTR zWide
cd40: 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74  Filename){.  int
cd50: 20 6e 42 79 74 65 3b 0a 20 20 63 68 61 72 20 2a   nByte;.  char *
cd60: 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 69 6e 74  zFilename;.  int
cd70: 20 63 6f 64 65 70 61 67 65 20 3d 20 6f 73 41 72   codepage = osAr
cd80: 65 46 69 6c 65 41 70 69 73 41 4e 53 49 28 29 20  eFileApisANSI() 
cd90: 3f 20 43 50 5f 41 43 50 20 3a 20 43 50 5f 4f 45  ? CP_ACP : CP_OE
cda0: 4d 43 50 3b 0a 0a 20 20 6e 42 79 74 65 20 3d 20  MCP;..  nByte = 
cdb0: 6f 73 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74  osWideCharToMult
cdc0: 69 42 79 74 65 28 63 6f 64 65 70 61 67 65 2c 20  iByte(codepage, 
cdd0: 30 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65  0, zWideFilename
cde0: 2c 20 2d 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30  , -1, 0, 0, 0, 0
cdf0: 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 20 3d  );.  if( nByte =
ce00: 3d 20 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  = 0 ){.    retur
ce10: 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c 65  n 0;.  }.  zFile
ce20: 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 61  name = sqlite3Ma
ce30: 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42 79 74 65 20  llocZero( nByte 
ce40: 29 3b 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61  );.  if( zFilena
ce50: 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  me==0 ){.    ret
ce60: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 42 79  urn 0;.  }.  nBy
ce70: 74 65 20 3d 20 6f 73 57 69 64 65 43 68 61 72 54  te = osWideCharT
ce80: 6f 4d 75 6c 74 69 42 79 74 65 28 63 6f 64 65 70  oMultiByte(codep
ce90: 61 67 65 2c 20 30 2c 20 7a 57 69 64 65 46 69 6c  age, 0, zWideFil
cea0: 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a 46 69 6c 65  ename, -1, zFile
ceb0: 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20  name,.          
cec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ced0: 20 20 20 20 20 20 6e 42 79 74 65 2c 20 30 2c 20        nByte, 0, 
cee0: 30 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 20  0);.  if( nByte 
cef0: 3d 3d 20 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  == 0 ){.    sqli
cf00: 74 65 33 5f 66 72 65 65 28 7a 46 69 6c 65 6e 61  te3_free(zFilena
cf10: 6d 65 29 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61  me);.    zFilena
cf20: 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  me = 0;.  }.  re
cf30: 74 75 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a  turn zFilename;.
cf40: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  }../*.** Convert
cf50: 20 6d 75 6c 74 69 62 79 74 65 20 63 68 61 72 61   multibyte chara
cf60: 63 74 65 72 20 73 74 72 69 6e 67 20 74 6f 20 55  cter string to U
cf70: 54 46 2d 38 2e 20 20 53 70 61 63 65 20 74 6f 20  TF-8.  Space to 
cf80: 68 6f 6c 64 20 74 68 65 0a 2a 2a 20 72 65 74 75  hold the.** retu
cf90: 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73 20 6f  rned string is o
cfa0: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
cfb0: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a  ite3_malloc()..*
cfc0: 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f  /.char *sqlite3_
cfd0: 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74  win32_mbcs_to_ut
cfe0: 66 38 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  f8(const char *z
cff0: 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 63 68 61  Filename){.  cha
d000: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 55 74 66 38  r *zFilenameUtf8
d010: 3b 0a 20 20 4c 50 57 53 54 52 20 7a 54 6d 70 57  ;.  LPWSTR zTmpW
d020: 69 64 65 3b 0a 0a 20 20 7a 54 6d 70 57 69 64 65  ide;..  zTmpWide
d030: 20 3d 20 77 69 6e 4d 62 63 73 54 6f 55 6e 69 63   = winMbcsToUnic
d040: 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  ode(zFilename);.
d050: 20 20 69 66 28 20 7a 54 6d 70 57 69 64 65 3d 3d    if( zTmpWide==
d060: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
d070: 30 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c 65 6e 61  0;.  }.  zFilena
d080: 6d 65 55 74 66 38 20 3d 20 77 69 6e 55 6e 69 63  meUtf8 = winUnic
d090: 6f 64 65 54 6f 55 74 66 38 28 7a 54 6d 70 57 69  odeToUtf8(zTmpWi
d0a0: 64 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  de);.  sqlite3_f
d0b0: 72 65 65 28 7a 54 6d 70 57 69 64 65 29 3b 0a 20  ree(zTmpWide);. 
d0c0: 20 72 65 74 75 72 6e 20 7a 46 69 6c 65 6e 61 6d   return zFilenam
d0d0: 65 55 74 66 38 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eUtf8;.}../*.** 
d0e0: 43 6f 6e 76 65 72 74 20 55 54 46 2d 38 20 74 6f  Convert UTF-8 to
d0f0: 20 6d 75 6c 74 69 62 79 74 65 20 63 68 61 72 61   multibyte chara
d100: 63 74 65 72 20 73 74 72 69 6e 67 2e 20 20 53 70  cter string.  Sp
d110: 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a  ace to hold the.
d120: 2a 2a 20 72 65 74 75 72 6e 65 64 20 73 74 72 69  ** returned stri
d130: 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66  ng is obtained f
d140: 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  rom sqlite3_mall
d150: 6f 63 28 29 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73  oc()..*/.char *s
d160: 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75 74 66  qlite3_win32_utf
d170: 38 5f 74 6f 5f 6d 62 63 73 28 63 6f 6e 73 74 20  8_to_mbcs(const 
d180: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29  char *zFilename)
d190: 7b 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  {.  char *zFilen
d1a0: 61 6d 65 4d 62 63 73 3b 0a 20 20 4c 50 57 53 54  ameMbcs;.  LPWST
d1b0: 52 20 7a 54 6d 70 57 69 64 65 3b 0a 0a 20 20 7a  R zTmpWide;..  z
d1c0: 54 6d 70 57 69 64 65 20 3d 20 77 69 6e 55 74 66  TmpWide = winUtf
d1d0: 38 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65  8ToUnicode(zFile
d1e0: 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 54 6d  name);.  if( zTm
d1f0: 70 57 69 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20  pWide==0 ){.    
d200: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
d210: 7a 46 69 6c 65 6e 61 6d 65 4d 62 63 73 20 3d 20  zFilenameMbcs = 
d220: 77 69 6e 55 6e 69 63 6f 64 65 54 6f 4d 62 63 73  winUnicodeToMbcs
d230: 28 7a 54 6d 70 57 69 64 65 29 3b 0a 20 20 73 71  (zTmpWide);.  sq
d240: 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 6d 70 57  lite3_free(zTmpW
d250: 69 64 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a  ide);.  return z
d260: 46 69 6c 65 6e 61 6d 65 4d 62 63 73 3b 0a 7d 0a  FilenameMbcs;.}.
d270: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
d280: 74 69 6f 6e 20 73 65 74 73 20 74 68 65 20 64 61  tion sets the da
d290: 74 61 20 64 69 72 65 63 74 6f 72 79 20 6f 72 20  ta directory or 
d2a0: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 64 69  the temporary di
d2b0: 72 65 63 74 6f 72 79 20 62 61 73 65 64 20 6f 6e  rectory based on
d2c0: 0a 2a 2a 20 74 68 65 20 70 72 6f 76 69 64 65 64  .** the provided
d2d0: 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 54 68 65   arguments.  The
d2e0: 20 74 79 70 65 20 61 72 67 75 6d 65 6e 74 20 6d   type argument m
d2f0: 75 73 74 20 62 65 20 31 20 69 6e 20 6f 72 64 65  ust be 1 in orde
d300: 72 20 74 6f 20 73 65 74 20 74 68 65 0a 2a 2a 20  r to set the.** 
d310: 64 61 74 61 20 64 69 72 65 63 74 6f 72 79 20 6f  data directory o
d320: 72 20 32 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  r 2 in order to 
d330: 73 65 74 20 74 68 65 20 74 65 6d 70 6f 72 61 72  set the temporar
d340: 79 20 64 69 72 65 63 74 6f 72 79 2e 20 20 54 68  y directory.  Th
d350: 65 20 7a 56 61 6c 75 65 0a 2a 2a 20 61 72 67 75  e zValue.** argu
d360: 6d 65 6e 74 20 69 73 20 74 68 65 20 6e 61 6d 65  ment is the name
d370: 20 6f 66 20 74 68 65 20 64 69 72 65 63 74 6f 72   of the director
d380: 79 20 74 6f 20 75 73 65 2e 20 20 54 68 65 20 72  y to use.  The r
d390: 65 74 75 72 6e 20 76 61 6c 75 65 20 77 69 6c 6c  eturn value will
d3a0: 20 62 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b   be.** SQLITE_OK
d3b0: 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2e 0a   if successful..
d3c0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 77  */.int sqlite3_w
d3d0: 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f  in32_set_directo
d3e0: 72 79 28 44 57 4f 52 44 20 74 79 70 65 2c 20 4c  ry(DWORD type, L
d3f0: 50 43 57 53 54 52 20 7a 56 61 6c 75 65 29 7b 0a  PCWSTR zValue){.
d400: 20 20 63 68 61 72 20 2a 2a 70 70 44 69 72 65 63    char **ppDirec
d410: 74 6f 72 79 20 3d 20 30 3b 0a 23 69 66 6e 64 65  tory = 0;.#ifnde
d420: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
d430: 54 4f 49 4e 49 54 0a 20 20 69 6e 74 20 72 63 20  TOINIT.  int rc 
d440: 3d 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61  = sqlite3_initia
d450: 6c 69 7a 65 28 29 3b 0a 20 20 69 66 28 20 72 63  lize();.  if( rc
d460: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65   ) return rc;.#e
d470: 6e 64 69 66 0a 20 20 69 66 28 20 74 79 70 65 3d  ndif.  if( type=
d480: 3d 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 41  =SQLITE_WIN32_DA
d490: 54 41 5f 44 49 52 45 43 54 4f 52 59 5f 54 59 50  TA_DIRECTORY_TYP
d4a0: 45 20 29 7b 0a 20 20 20 20 70 70 44 69 72 65 63  E ){.    ppDirec
d4b0: 74 6f 72 79 20 3d 20 26 73 71 6c 69 74 65 33 5f  tory = &sqlite3_
d4c0: 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79 3b 0a  data_directory;.
d4d0: 20 20 7d 65 6c 73 65 20 69 66 28 20 74 79 70 65    }else if( type
d4e0: 3d 3d 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 54  ==SQLITE_WIN32_T
d4f0: 45 4d 50 5f 44 49 52 45 43 54 4f 52 59 5f 54 59  EMP_DIRECTORY_TY
d500: 50 45 20 29 7b 0a 20 20 20 20 70 70 44 69 72 65  PE ){.    ppDire
d510: 63 74 6f 72 79 20 3d 20 26 73 71 6c 69 74 65 33  ctory = &sqlite3
d520: 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 3b  _temp_directory;
d530: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21  .  }.  assert( !
d540: 70 70 44 69 72 65 63 74 6f 72 79 20 7c 7c 20 74  ppDirectory || t
d550: 79 70 65 3d 3d 53 51 4c 49 54 45 5f 57 49 4e 33  ype==SQLITE_WIN3
d560: 32 5f 44 41 54 41 5f 44 49 52 45 43 54 4f 52 59  2_DATA_DIRECTORY
d570: 5f 54 59 50 45 0a 20 20 20 20 20 20 20 20 20 20  _TYPE.          
d580: 7c 7c 20 74 79 70 65 3d 3d 53 51 4c 49 54 45 5f  || type==SQLITE_
d590: 57 49 4e 33 32 5f 54 45 4d 50 5f 44 49 52 45 43  WIN32_TEMP_DIREC
d5a0: 54 4f 52 59 5f 54 59 50 45 0a 20 20 29 3b 0a 20  TORY_TYPE.  );. 
d5b0: 20 61 73 73 65 72 74 28 20 21 70 70 44 69 72 65   assert( !ppDire
d5c0: 63 74 6f 72 79 20 7c 7c 20 73 71 6c 69 74 65 33  ctory || sqlite3
d5d0: 4d 65 6d 64 65 62 75 67 48 61 73 54 79 70 65 28  MemdebugHasType(
d5e0: 2a 70 70 44 69 72 65 63 74 6f 72 79 2c 20 4d 45  *ppDirectory, ME
d5f0: 4d 54 59 50 45 5f 48 45 41 50 29 20 29 3b 0a 20  MTYPE_HEAP) );. 
d600: 20 69 66 28 20 70 70 44 69 72 65 63 74 6f 72 79   if( ppDirectory
d610: 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 56   ){.    char *zV
d620: 61 6c 75 65 55 74 66 38 20 3d 20 30 3b 0a 20 20  alueUtf8 = 0;.  
d630: 20 20 69 66 28 20 7a 56 61 6c 75 65 20 26 26 20    if( zValue && 
d640: 7a 56 61 6c 75 65 5b 30 5d 20 29 7b 0a 20 20 20  zValue[0] ){.   
d650: 20 20 20 7a 56 61 6c 75 65 55 74 66 38 20 3d 20     zValueUtf8 = 
d660: 77 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66 38  winUnicodeToUtf8
d670: 28 7a 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20  (zValue);.      
d680: 69 66 20 28 20 7a 56 61 6c 75 65 55 74 66 38 3d  if ( zValueUtf8=
d690: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  =0 ){.        re
d6a0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
d6b0: 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  M;.      }.    }
d6c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
d6d0: 65 28 2a 70 70 44 69 72 65 63 74 6f 72 79 29 3b  e(*ppDirectory);
d6e0: 0a 20 20 20 20 2a 70 70 44 69 72 65 63 74 6f 72  .    *ppDirector
d6f0: 79 20 3d 20 7a 56 61 6c 75 65 55 74 66 38 3b 0a  y = zValueUtf8;.
d700: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
d710: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  E_OK;.  }.  retu
d720: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
d730: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 72 65  .}../*.** The re
d740: 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 77 69  turn value of wi
d750: 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67  nGetLastErrorMsg
d760: 0a 2a 2a 20 69 73 20 7a 65 72 6f 20 69 66 20 74  .** is zero if t
d770: 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  he error message
d780: 20 66 69 74 73 20 69 6e 20 74 68 65 20 62 75 66   fits in the buf
d790: 66 65 72 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f  fer, or non-zero
d7a0: 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65 20 28 69  .** otherwise (i
d7b0: 66 20 74 68 65 20 6d 65 73 73 61 67 65 20 77 61  f the message wa
d7c0: 73 20 74 72 75 6e 63 61 74 65 64 29 2e 0a 2a 2f  s truncated)..*/
d7d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 47  .static int winG
d7e0: 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67 28 44  etLastErrorMsg(D
d7f0: 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 2c 20  WORD lastErrno, 
d800: 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a  int nBuf, char *
d810: 7a 42 75 66 29 7b 0a 20 20 2f 2a 20 46 6f 72 6d  zBuf){.  /* Form
d820: 61 74 4d 65 73 73 61 67 65 20 72 65 74 75 72 6e  atMessage return
d830: 73 20 30 20 6f 6e 20 66 61 69 6c 75 72 65 2e 20  s 0 on failure. 
d840: 20 4f 74 68 65 72 77 69 73 65 20 69 74 0a 20 20   Otherwise it.  
d850: 2a 2a 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e  ** returns the n
d860: 75 6d 62 65 72 20 6f 66 20 54 43 48 41 52 73 20  umber of TCHARs 
d870: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6f  written to the o
d880: 75 74 70 75 74 0a 20 20 2a 2a 20 62 75 66 66 65  utput.  ** buffe
d890: 72 2c 20 65 78 63 6c 75 64 69 6e 67 20 74 68 65  r, excluding the
d8a0: 20 74 65 72 6d 69 6e 61 74 69 6e 67 20 6e 75 6c   terminating nul
d8b0: 6c 20 63 68 61 72 2e 0a 20 20 2a 2f 0a 20 20 44  l char..  */.  D
d8c0: 57 4f 52 44 20 64 77 4c 65 6e 20 3d 20 30 3b 0a  WORD dwLen = 0;.
d8d0: 20 20 63 68 61 72 20 2a 7a 4f 75 74 20 3d 20 30    char *zOut = 0
d8e0: 3b 0a 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28  ;..  if( osIsNT(
d8f0: 29 20 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f  ) ){.#if SQLITE_
d900: 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 57 43 48  OS_WINRT.    WCH
d910: 41 52 20 7a 54 65 6d 70 57 69 64 65 5b 53 51 4c  AR zTempWide[SQL
d920: 49 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 45 52  ITE_WIN32_MAX_ER
d930: 52 4d 53 47 5f 43 48 41 52 53 2b 31 5d 3b 0a 20  RMSG_CHARS+1];. 
d940: 20 20 20 64 77 4c 65 6e 20 3d 20 6f 73 46 6f 72     dwLen = osFor
d950: 6d 61 74 4d 65 73 73 61 67 65 57 28 46 4f 52 4d  matMessageW(FORM
d960: 41 54 5f 4d 45 53 53 41 47 45 5f 46 52 4f 4d 5f  AT_MESSAGE_FROM_
d970: 53 59 53 54 45 4d 20 7c 0a 20 20 20 20 20 20 20  SYSTEM |.       
d980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d990: 20 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d 45 53        FORMAT_MES
d9a0: 53 41 47 45 5f 49 47 4e 4f 52 45 5f 49 4e 53 45  SAGE_IGNORE_INSE
d9b0: 52 54 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20  RTS,.           
d9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d9d0: 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20    NULL,.        
d9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d9f0: 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 2c 0a       lastErrno,.
da00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da10: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 0a               0,.
da20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da30: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 65               zTe
da40: 6d 70 57 69 64 65 2c 0a 20 20 20 20 20 20 20 20  mpWide,.        
da50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da60: 20 20 20 20 20 53 51 4c 49 54 45 5f 57 49 4e 33       SQLITE_WIN3
da70: 32 5f 4d 41 58 5f 45 52 52 4d 53 47 5f 43 48 41  2_MAX_ERRMSG_CHA
da80: 52 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  RS,.            
da90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
daa0: 20 30 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 4c   0);.#else.    L
dab0: 50 57 53 54 52 20 7a 54 65 6d 70 57 69 64 65 20  PWSTR zTempWide 
dac0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 64 77 4c 65  = NULL;.    dwLe
dad0: 6e 20 3d 20 6f 73 46 6f 72 6d 61 74 4d 65 73 73  n = osFormatMess
dae0: 61 67 65 57 28 46 4f 52 4d 41 54 5f 4d 45 53 53  ageW(FORMAT_MESS
daf0: 41 47 45 5f 41 4c 4c 4f 43 41 54 45 5f 42 55 46  AGE_ALLOCATE_BUF
db00: 46 45 52 20 7c 0a 20 20 20 20 20 20 20 20 20 20  FER |.          
db10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db20: 20 20 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47     FORMAT_MESSAG
db30: 45 5f 46 52 4f 4d 5f 53 59 53 54 45 4d 20 7c 0a  E_FROM_SYSTEM |.
db40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db50: 20 20 20 20 20 20 20 20 20 20 20 20 20 46 4f 52               FOR
db60: 4d 41 54 5f 4d 45 53 53 41 47 45 5f 49 47 4e 4f  MAT_MESSAGE_IGNO
db70: 52 45 5f 49 4e 53 45 52 54 53 2c 0a 20 20 20 20  RE_INSERTS,.    
db80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db90: 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 0a 20           NULL,. 
dba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dbb0: 20 20 20 20 20 20 20 20 20 20 20 20 6c 61 73 74              last
dbc0: 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  Errno,.         
dbd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dbe0: 20 20 20 20 30 2c 0a 20 20 20 20 20 20 20 20 20      0,.         
dbf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc00: 20 20 20 20 28 4c 50 57 53 54 52 29 20 26 7a 54      (LPWSTR) &zT
dc10: 65 6d 70 57 69 64 65 2c 0a 20 20 20 20 20 20 20  empWide,.       
dc20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc30: 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20 20        0,.       
dc40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc50: 20 20 20 20 20 20 30 29 3b 0a 23 65 6e 64 69 66        0);.#endif
dc60: 0a 20 20 20 20 69 66 28 20 64 77 4c 65 6e 20 3e  .    if( dwLen >
dc70: 20 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 61   0 ){.      /* a
dc80: 6c 6c 6f 63 61 74 65 20 61 20 62 75 66 66 65 72  llocate a buffer
dc90: 20 61 6e 64 20 63 6f 6e 76 65 72 74 20 74 6f 20   and convert to 
dca0: 55 54 46 38 20 2a 2f 0a 20 20 20 20 20 20 73 71  UTF8 */.      sq
dcb0: 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
dcc0: 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20  Malloc();.      
dcd0: 7a 4f 75 74 20 3d 20 77 69 6e 55 6e 69 63 6f 64  zOut = winUnicod
dce0: 65 54 6f 55 74 66 38 28 7a 54 65 6d 70 57 69 64  eToUtf8(zTempWid
dcf0: 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
dd00: 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
dd10: 28 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  ();.#if !SQLITE_
dd20: 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 20 20 2f  OS_WINRT.      /
dd30: 2a 20 66 72 65 65 20 74 68 65 20 73 79 73 74 65  * free the syste
dd40: 6d 20 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74  m buffer allocat
dd50: 65 64 20 62 79 20 46 6f 72 6d 61 74 4d 65 73 73  ed by FormatMess
dd60: 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 6f 73 4c  age */.      osL
dd70: 6f 63 61 6c 46 72 65 65 28 7a 54 65 6d 70 57 69  ocalFree(zTempWi
dd80: 64 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  de);.#endif.    
dd90: 7d 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c  }.  }.#ifdef SQL
dda0: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
ddb0: 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 63  SI.  else{.    c
ddc0: 68 61 72 20 2a 7a 54 65 6d 70 20 3d 20 4e 55 4c  har *zTemp = NUL
ddd0: 4c 3b 0a 20 20 20 20 64 77 4c 65 6e 20 3d 20 6f  L;.    dwLen = o
dde0: 73 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 41 28  sFormatMessageA(
ddf0: 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 41  FORMAT_MESSAGE_A
de00: 4c 4c 4f 43 41 54 45 5f 42 55 46 46 45 52 20 7c  LLOCATE_BUFFER |
de10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
de20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 46 4f                FO
de30: 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 46 52 4f  RMAT_MESSAGE_FRO
de40: 4d 5f 53 59 53 54 45 4d 20 7c 0a 20 20 20 20 20  M_SYSTEM |.     
de50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de60: 20 20 20 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d          FORMAT_M
de70: 45 53 53 41 47 45 5f 49 47 4e 4f 52 45 5f 49 4e  ESSAGE_IGNORE_IN
de80: 53 45 52 54 53 2c 0a 20 20 20 20 20 20 20 20 20  SERTS,.         
de90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dea0: 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20      NULL,.      
deb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dec0: 20 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f         lastErrno
ded0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
dee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
def0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
df00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
df10: 4c 50 53 54 52 29 20 26 7a 54 65 6d 70 2c 0a 20  LPSTR) &zTemp,. 
df20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df30: 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 0a 20              0,. 
df40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df50: 20 20 20 20 20 20 20 20 20 20 20 20 30 29 3b 0a              0);.
df60: 20 20 20 20 69 66 28 20 64 77 4c 65 6e 20 3e 20      if( dwLen > 
df70: 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 61 6c  0 ){.      /* al
df80: 6c 6f 63 61 74 65 20 61 20 62 75 66 66 65 72 20  locate a buffer 
df90: 61 6e 64 20 63 6f 6e 76 65 72 74 20 74 6f 20 55  and convert to U
dfa0: 54 46 38 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  TF8 */.      sql
dfb0: 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d  ite3BeginBenignM
dfc0: 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 7a  alloc();.      z
dfd0: 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 5f 77 69  Out = sqlite3_wi
dfe0: 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38  n32_mbcs_to_utf8
dff0: 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 73  (zTemp);.      s
e000: 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
e010: 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 2f  alloc();.      /
e020: 2a 20 66 72 65 65 20 74 68 65 20 73 79 73 74 65  * free the syste
e030: 6d 20 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74  m buffer allocat
e040: 65 64 20 62 79 20 46 6f 72 6d 61 74 4d 65 73 73  ed by FormatMess
e050: 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 6f 73 4c  age */.      osL
e060: 6f 63 61 6c 46 72 65 65 28 7a 54 65 6d 70 29 3b  ocalFree(zTemp);
e070: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
e080: 66 0a 20 20 69 66 28 20 30 20 3d 3d 20 64 77 4c  f.  if( 0 == dwL
e090: 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  en ){.    sqlite
e0a0: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2c  3_snprintf(nBuf,
e0b0: 20 7a 42 75 66 2c 20 22 4f 73 45 72 72 6f 72 20   zBuf, "OsError 
e0c0: 30 78 25 6c 78 20 28 25 6c 75 29 22 2c 20 6c 61  0x%lx (%lu)", la
e0d0: 73 74 45 72 72 6e 6f 2c 20 6c 61 73 74 45 72 72  stErrno, lastErr
e0e0: 6e 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  no);.  }else{.  
e0f0: 20 20 2f 2a 20 63 6f 70 79 20 61 20 6d 61 78 69    /* copy a maxi
e100: 6d 75 6d 20 6f 66 20 6e 42 75 66 20 63 68 61 72  mum of nBuf char
e110: 73 20 74 6f 20 6f 75 74 70 75 74 20 62 75 66 66  s to output buff
e120: 65 72 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  er */.    sqlite
e130: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2c  3_snprintf(nBuf,
e140: 20 7a 42 75 66 2c 20 22 25 73 22 2c 20 7a 4f 75   zBuf, "%s", zOu
e150: 74 29 3b 0a 20 20 20 20 2f 2a 20 66 72 65 65 20  t);.    /* free 
e160: 74 68 65 20 55 54 46 38 20 62 75 66 66 65 72 20  the UTF8 buffer 
e170: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  */.    sqlite3_f
e180: 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 7d 0a 20  ree(zOut);.  }. 
e190: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
e1a0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
e1b0: 74 69 6f 6e 20 2d 20 77 69 6e 4c 6f 67 45 72 72  tion - winLogErr
e1c0: 6f 72 41 74 4c 69 6e 65 28 29 20 2d 20 69 73 20  orAtLine() - is 
e1d0: 6f 6e 6c 79 20 65 76 65 72 20 63 61 6c 6c 65 64  only ever called
e1e0: 20 76 69 61 20 74 68 65 20 6d 61 63 72 6f 0a 2a   via the macro.*
e1f0: 2a 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 29 2e  * winLogError().
e200: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
e210: 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 61  ine is invoked a
e220: 66 74 65 72 20 61 6e 20 65 72 72 6f 72 20 6f 63  fter an error oc
e230: 63 75 72 73 20 69 6e 20 61 6e 20 4f 53 20 66 75  curs in an OS fu
e240: 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20 6c 6f  nction..** It lo
e250: 67 73 20 61 20 6d 65 73 73 61 67 65 20 75 73 69  gs a message usi
e260: 6e 67 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29  ng sqlite3_log()
e270: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
e280: 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66  current value of
e290: 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 61  .** error code a
e2a0: 6e 64 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 2c  nd, if possible,
e2b0: 20 74 68 65 20 68 75 6d 61 6e 2d 72 65 61 64 61   the human-reada
e2c0: 62 6c 65 20 65 71 75 69 76 61 6c 65 6e 74 20 66  ble equivalent f
e2d0: 72 6f 6d 0a 2a 2a 20 46 6f 72 6d 61 74 4d 65 73  rom.** FormatMes
e2e0: 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  sage..**.** The 
e2f0: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 70  first argument p
e300: 61 73 73 65 64 20 74 6f 20 74 68 65 20 6d 61 63  assed to the mac
e310: 72 6f 20 73 68 6f 75 6c 64 20 62 65 20 74 68 65  ro should be the
e320: 20 65 72 72 6f 72 20 63 6f 64 65 20 74 68 61 74   error code that
e330: 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 74 75  .** will be retu
e340: 72 6e 65 64 20 74 6f 20 53 51 4c 69 74 65 20 28  rned to SQLite (
e350: 65 2e 67 2e 20 53 51 4c 49 54 45 5f 49 4f 45 52  e.g. SQLITE_IOER
e360: 52 5f 44 45 4c 45 54 45 2c 20 53 51 4c 49 54 45  R_DELETE, SQLITE
e370: 5f 43 41 4e 54 4f 50 45 4e 29 2e 0a 2a 2a 20 54  _CANTOPEN)..** T
e380: 68 65 20 74 77 6f 20 73 75 62 73 65 71 75 65 6e  he two subsequen
e390: 74 20 61 72 67 75 6d 65 6e 74 73 20 73 68 6f 75  t arguments shou
e3a0: 6c 64 20 62 65 20 74 68 65 20 6e 61 6d 65 20 6f  ld be the name o
e3b0: 66 20 74 68 65 20 4f 53 20 66 75 6e 63 74 69 6f  f the OS functio
e3c0: 6e 20 74 68 61 74 0a 2a 2a 20 66 61 69 6c 65 64  n that.** failed
e3d0: 20 61 6e 64 20 74 68 65 20 61 73 73 6f 63 69 61   and the associa
e3e0: 74 65 64 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  ted file-system 
e3f0: 70 61 74 68 2c 20 69 66 20 61 6e 79 2e 0a 2a 2f  path, if any..*/
e400: 0a 23 64 65 66 69 6e 65 20 77 69 6e 4c 6f 67 45  .#define winLogE
e410: 72 72 6f 72 28 61 2c 62 2c 63 2c 64 29 20 20 20  rror(a,b,c,d)   
e420: 77 69 6e 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e  winLogErrorAtLin
e430: 65 28 61 2c 62 2c 63 2c 64 2c 5f 5f 4c 49 4e 45  e(a,b,c,d,__LINE
e440: 5f 5f 29 0a 73 74 61 74 69 63 20 69 6e 74 20 77  __).static int w
e450: 69 6e 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65  inLogErrorAtLine
e460: 28 0a 20 20 69 6e 74 20 65 72 72 63 6f 64 65 2c  (.  int errcode,
e470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e480: 20 20 20 20 2f 2a 20 53 51 4c 69 74 65 20 65 72      /* SQLite er
e490: 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 44 57  ror code */.  DW
e4a0: 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 2c 20 20  ORD lastErrno,  
e4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e4c0: 20 57 69 6e 33 32 20 6c 61 73 74 20 65 72 72 6f   Win32 last erro
e4d0: 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  r */.  const cha
e4e0: 72 20 2a 7a 46 75 6e 63 2c 20 20 20 20 20 20 20  r *zFunc,       
e4f0: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
e500: 66 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20 74 68  f OS function th
e510: 61 74 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 63  at failed */.  c
e520: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
e530: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
e540: 2a 20 46 69 6c 65 20 70 61 74 68 20 61 73 73 6f  * File path asso
e550: 63 69 61 74 65 64 20 77 69 74 68 20 65 72 72 6f  ciated with erro
e560: 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 69 6e 65  r */.  int iLine
e570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e580: 20 20 20 20 20 20 20 2f 2a 20 53 6f 75 72 63 65         /* Source
e590: 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 77 68 65   line number whe
e5a0: 72 65 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65  re error occurre
e5b0: 64 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 7a  d */.){.  char z
e5c0: 4d 73 67 5b 35 30 30 5d 3b 20 20 20 20 20 20 20  Msg[500];       
e5d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 75 6d            /* Hum
e5e0: 61 6e 20 72 65 61 64 61 62 6c 65 20 65 72 72 6f  an readable erro
e5f0: 72 20 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20  r text */.  int 
e600: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
e610: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
e620: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a  oop counter */..
e630: 20 20 7a 4d 73 67 5b 30 5d 20 3d 20 30 3b 0a 20    zMsg[0] = 0;. 
e640: 20 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f 72   winGetLastError
e650: 4d 73 67 28 6c 61 73 74 45 72 72 6e 6f 2c 20 73  Msg(lastErrno, s
e660: 69 7a 65 6f 66 28 7a 4d 73 67 29 2c 20 7a 4d 73  izeof(zMsg), zMs
e670: 67 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 72  g);.  assert( er
e680: 72 63 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b  rcode!=SQLITE_OK
e690: 20 29 3b 0a 20 20 69 66 28 20 7a 50 61 74 68 3d   );.  if( zPath=
e6a0: 3d 30 20 29 20 7a 50 61 74 68 20 3d 20 22 22 3b  =0 ) zPath = "";
e6b0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a 4d 73 67  .  for(i=0; zMsg
e6c0: 5b 69 5d 20 26 26 20 7a 4d 73 67 5b 69 5d 21 3d  [i] && zMsg[i]!=
e6d0: 27 5c 72 27 20 26 26 20 7a 4d 73 67 5b 69 5d 21  '\r' && zMsg[i]!
e6e0: 3d 27 5c 6e 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20  ='\n'; i++){}.  
e6f0: 7a 4d 73 67 5b 69 5d 20 3d 20 30 3b 0a 20 20 73  zMsg[i] = 0;.  s
e700: 71 6c 69 74 65 33 5f 6c 6f 67 28 65 72 72 63 6f  qlite3_log(errco
e710: 64 65 2c 0a 20 20 20 20 20 20 22 6f 73 5f 77 69  de,.      "os_wi
e720: 6e 2e 63 3a 25 64 3a 20 28 25 6c 75 29 20 25 73  n.c:%d: (%lu) %s
e730: 28 25 73 29 20 2d 20 25 73 22 2c 0a 20 20 20 20  (%s) - %s",.    
e740: 20 20 69 4c 69 6e 65 2c 20 6c 61 73 74 45 72 72    iLine, lastErr
e750: 6e 6f 2c 20 7a 46 75 6e 63 2c 20 7a 50 61 74 68  no, zFunc, zPath
e760: 2c 20 7a 4d 73 67 0a 20 20 29 3b 0a 0a 20 20 72  , zMsg.  );..  r
e770: 65 74 75 72 6e 20 65 72 72 63 6f 64 65 3b 0a 7d  eturn errcode;.}
e780: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62  ../*.** The numb
e790: 65 72 20 6f 66 20 74 69 6d 65 73 20 74 68 61 74  er of times that
e7a0: 20 61 20 52 65 61 64 46 69 6c 65 28 29 2c 20 57   a ReadFile(), W
e7b0: 72 69 74 65 46 69 6c 65 28 29 2c 20 61 6e 64 20  riteFile(), and 
e7c0: 44 65 6c 65 74 65 46 69 6c 65 28 29 0a 2a 2a 20  DeleteFile().** 
e7d0: 77 69 6c 6c 20 62 65 20 72 65 74 72 69 65 64 20  will be retried 
e7e0: 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 6c 6f 63 6b  following a lock
e7f0: 69 6e 67 20 65 72 72 6f 72 20 2d 20 70 72 6f 62  ing error - prob
e800: 61 62 6c 79 20 63 61 75 73 65 64 20 62 79 0a 2a  ably caused by.*
e810: 2a 20 61 6e 74 69 76 69 72 75 73 20 73 6f 66 74  * antivirus soft
e820: 77 61 72 65 2e 20 20 41 6c 73 6f 20 74 68 65 20  ware.  Also the 
e830: 69 6e 69 74 69 61 6c 20 64 65 6c 61 79 20 62 65  initial delay be
e840: 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 72  fore the first r
e850: 65 74 72 79 2e 0a 2a 2a 20 54 68 65 20 64 65 6c  etry..** The del
e860: 61 79 20 69 6e 63 72 65 61 73 65 73 20 6c 69 6e  ay increases lin
e870: 65 61 72 6c 79 20 77 69 74 68 20 65 61 63 68 20  early with each 
e880: 72 65 74 72 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65  retry..*/.#ifnde
e890: 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49  f SQLITE_WIN32_I
e8a0: 4f 45 52 52 5f 52 45 54 52 59 0a 23 20 64 65 66  OERR_RETRY.# def
e8b0: 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ine SQLITE_WIN32
e8c0: 5f 49 4f 45 52 52 5f 52 45 54 52 59 20 31 30 0a  _IOERR_RETRY 10.
e8d0: 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53  #endif.#ifndef S
e8e0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52  QLITE_WIN32_IOER
e8f0: 52 5f 52 45 54 52 59 5f 44 45 4c 41 59 0a 23 20  R_RETRY_DELAY.# 
e900: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49  define SQLITE_WI
e910: 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 5f  N32_IOERR_RETRY_
e920: 44 45 4c 41 59 20 32 35 0a 23 65 6e 64 69 66 0a  DELAY 25.#endif.
e930: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 49 6f  static int winIo
e940: 65 72 72 52 65 74 72 79 20 3d 20 53 51 4c 49 54  errRetry = SQLIT
e950: 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45  E_WIN32_IOERR_RE
e960: 54 52 59 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  TRY;.static int 
e970: 77 69 6e 49 6f 65 72 72 52 65 74 72 79 44 65 6c  winIoerrRetryDel
e980: 61 79 20 3d 20 53 51 4c 49 54 45 5f 57 49 4e 33  ay = SQLITE_WIN3
e990: 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 5f 44 45  2_IOERR_RETRY_DE
e9a0: 4c 41 59 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  LAY;../*.** The 
e9b0: 22 77 69 6e 49 6f 65 72 72 43 61 6e 52 65 74 72  "winIoerrCanRetr
e9c0: 79 31 22 20 6d 61 63 72 6f 20 69 73 20 75 73 65  y1" macro is use
e9d0: 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69  d to determine i
e9e0: 66 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 49  f a particular I
e9f0: 2f 4f 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65  /O.** error code
ea00: 20 6f 62 74 61 69 6e 65 64 20 76 69 61 20 47 65   obtained via Ge
ea10: 74 4c 61 73 74 45 72 72 6f 72 28 29 20 69 73 20  tLastError() is 
ea20: 65 6c 69 67 69 62 6c 65 20 74 6f 20 62 65 20 72  eligible to be r
ea30: 65 74 72 69 65 64 2e 20 20 49 74 0a 2a 2a 20 6d  etried.  It.** m
ea40: 75 73 74 20 61 63 63 65 70 74 20 74 68 65 20 65  ust accept the e
ea50: 72 72 6f 72 20 63 6f 64 65 20 44 57 4f 52 44 20  rror code DWORD 
ea60: 61 73 20 69 74 73 20 6f 6e 6c 79 20 61 72 67 75  as its only argu
ea70: 6d 65 6e 74 20 61 6e 64 20 73 68 6f 75 6c 64 20  ment and should 
ea80: 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65  return.** non-ze
ea90: 72 6f 20 69 66 20 74 68 65 20 65 72 72 6f 72 20  ro if the error 
eaa0: 63 6f 64 65 20 69 73 20 74 72 61 6e 73 69 65 6e  code is transien
eab0: 74 20 69 6e 20 6e 61 74 75 72 65 20 61 6e 64 20  t in nature and 
eac0: 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 0a 2a 2a  the operation.**
ead0: 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
eae0: 20 67 65 6e 65 72 61 74 69 6e 67 20 74 68 65 20   generating the 
eaf0: 6f 72 69 67 69 6e 61 6c 20 65 72 72 6f 72 20 6d  original error m
eb00: 69 67 68 74 20 73 75 63 63 65 65 64 20 75 70 6f  ight succeed upo
eb10: 6e 20 62 65 69 6e 67 0a 2a 2a 20 72 65 74 72 69  n being.** retri
eb20: 65 64 2e 20 20 54 68 65 20 61 72 67 75 6d 65 6e  ed.  The argumen
eb30: 74 20 74 6f 20 74 68 69 73 20 6d 61 63 72 6f 20  t to this macro 
eb40: 73 68 6f 75 6c 64 20 62 65 20 61 20 76 61 72 69  should be a vari
eb50: 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 64 64 69  able..**.** Addi
eb60: 74 69 6f 6e 61 6c 6c 79 2c 20 61 20 6d 61 63 72  tionally, a macr
eb70: 6f 20 6e 61 6d 65 64 20 22 77 69 6e 49 6f 65 72  o named "winIoer
eb80: 72 43 61 6e 52 65 74 72 79 32 22 20 6d 61 79 20  rCanRetry2" may 
eb90: 62 65 20 64 65 66 69 6e 65 64 2e 20 20 49 66 20  be defined.  If 
eba0: 69 74 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65 64  it.** is defined
ebb0: 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 63 6f 6e  , it will be con
ebc0: 73 75 6c 74 65 64 20 6f 6e 6c 79 20 77 68 65 6e  sulted only when
ebd0: 20 74 68 65 20 6d 61 63 72 6f 20 22 77 69 6e 49   the macro "winI
ebe0: 6f 65 72 72 43 61 6e 52 65 74 72 79 31 22 0a 2a  oerrCanRetry1".*
ebf0: 2a 20 72 65 74 75 72 6e 73 20 7a 65 72 6f 2e 20  * returns zero. 
ec00: 20 54 68 65 20 22 77 69 6e 49 6f 65 72 72 43 61   The "winIoerrCa
ec10: 6e 52 65 74 72 79 32 22 20 6d 61 63 72 6f 20 69  nRetry2" macro i
ec20: 73 20 63 6f 6d 70 6c 65 74 65 6c 79 20 6f 70 74  s completely opt
ec30: 69 6f 6e 61 6c 20 61 6e 64 0a 2a 2a 20 6d 61 79  ional and.** may
ec40: 20 62 65 20 75 73 65 64 20 74 6f 20 69 6e 63 6c   be used to incl
ec50: 75 64 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 65  ude additional e
ec60: 72 72 6f 72 20 63 6f 64 65 73 20 69 6e 20 74 68  rror codes in th
ec70: 65 20 73 65 74 20 74 68 61 74 20 73 68 6f 75 6c  e set that shoul
ec80: 64 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20 74  d.** result in t
ec90: 68 65 20 66 61 69 6c 69 6e 67 20 49 2f 4f 20 6f  he failing I/O o
eca0: 70 65 72 61 74 69 6f 6e 20 62 65 69 6e 67 20 72  peration being r
ecb0: 65 74 72 69 65 64 20 62 79 20 74 68 65 20 63 61  etried by the ca
ecc0: 6c 6c 65 72 2e 20 20 49 66 0a 2a 2a 20 64 65 66  ller.  If.** def
ecd0: 69 6e 65 64 2c 20 74 68 65 20 22 77 69 6e 49 6f  ined, the "winIo
ece0: 65 72 72 43 61 6e 52 65 74 72 79 32 22 20 6d 61  errCanRetry2" ma
ecf0: 63 72 6f 20 6d 75 73 74 20 65 78 68 69 62 69 74  cro must exhibit
ed00: 20 65 78 74 65 72 6e 61 6c 20 73 65 6d 61 6e 74   external semant
ed10: 69 63 73 0a 2a 2a 20 69 64 65 6e 74 69 63 61 6c  ics.** identical
ed20: 20 74 6f 20 74 68 6f 73 65 20 6f 66 20 74 68 65   to those of the
ed30: 20 22 77 69 6e 49 6f 65 72 72 43 61 6e 52 65 74   "winIoerrCanRet
ed40: 72 79 31 22 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23  ry1" macro..*/.#
ed50: 69 66 20 21 64 65 66 69 6e 65 64 28 77 69 6e 49  if !defined(winI
ed60: 6f 65 72 72 43 61 6e 52 65 74 72 79 31 29 0a 23  oerrCanRetry1).#
ed70: 64 65 66 69 6e 65 20 77 69 6e 49 6f 65 72 72 43  define winIoerrC
ed80: 61 6e 52 65 74 72 79 31 28 61 29 20 28 28 28 61  anRetry1(a) (((a
ed90: 29 3d 3d 45 52 52 4f 52 5f 41 43 43 45 53 53 5f  )==ERROR_ACCESS_
eda0: 44 45 4e 49 45 44 29 20 20 20 20 20 20 20 20 7c  DENIED)        |
edb0: 7c 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20  | \.            
edc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
edd0: 20 20 28 28 61 29 3d 3d 45 52 52 4f 52 5f 53 48    ((a)==ERROR_SH
ede0: 41 52 49 4e 47 5f 56 49 4f 4c 41 54 49 4f 4e 29  ARING_VIOLATION)
edf0: 20 20 20 20 7c 7c 20 5c 0a 20 20 20 20 20 20 20      || \.       
ee00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee10: 20 20 20 20 20 20 20 28 28 61 29 3d 3d 45 52 52         ((a)==ERR
ee20: 4f 52 5f 4c 4f 43 4b 5f 56 49 4f 4c 41 54 49 4f  OR_LOCK_VIOLATIO
ee30: 4e 29 20 20 20 20 20 20 20 7c 7c 20 5c 0a 20 20  N)       || \.  
ee40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee50: 20 20 20 20 20 20 20 20 20 20 20 20 28 28 61 29              ((a)
ee60: 3d 3d 45 52 52 4f 52 5f 44 45 56 5f 4e 4f 54 5f  ==ERROR_DEV_NOT_
ee70: 45 58 49 53 54 29 20 20 20 20 20 20 20 20 7c 7c  EXIST)        ||
ee80: 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   \.             
ee90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eea0: 20 28 28 61 29 3d 3d 45 52 52 4f 52 5f 4e 45 54   ((a)==ERROR_NET
eeb0: 4e 41 4d 45 5f 44 45 4c 45 54 45 44 29 20 20 20  NAME_DELETED)   
eec0: 20 20 20 7c 7c 20 5c 0a 20 20 20 20 20 20 20 20     || \.        
eed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eee0: 20 20 20 20 20 20 28 28 61 29 3d 3d 45 52 52 4f        ((a)==ERRO
eef0: 52 5f 53 45 4d 5f 54 49 4d 45 4f 55 54 29 20 20  R_SEM_TIMEOUT)  
ef00: 20 20 20 20 20 20 20 20 7c 7c 20 5c 0a 20 20 20          || \.   
ef10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef20: 20 20 20 20 20 20 20 20 20 20 20 28 28 61 29 3d             ((a)=
ef30: 3d 45 52 52 4f 52 5f 4e 45 54 57 4f 52 4b 5f 55  =ERROR_NETWORK_U
ef40: 4e 52 45 41 43 48 41 42 4c 45 29 29 0a 23 65 6e  NREACHABLE)).#en
ef50: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 20  dif../*.** If a 
ef60: 52 65 61 64 46 69 6c 65 28 29 20 6f 72 20 57 72  ReadFile() or Wr
ef70: 69 74 65 46 69 6c 65 28 29 20 65 72 72 6f 72 20  iteFile() error 
ef80: 6f 63 63 75 72 73 2c 20 69 6e 76 6f 6b 65 20 74  occurs, invoke t
ef90: 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 74  his routine.** t
efa0: 6f 20 73 65 65 20 69 66 20 69 74 20 73 68 6f 75  o see if it shou
efb0: 6c 64 20 62 65 20 72 65 74 72 69 65 64 2e 20 20  ld be retried.  
efc0: 52 65 74 75 72 6e 20 54 52 55 45 20 74 6f 20 72  Return TRUE to r
efd0: 65 74 72 79 2e 20 20 52 65 74 75 72 6e 20 46 41  etry.  Return FA
efe0: 4c 53 45 0a 2a 2a 20 74 6f 20 67 69 76 65 20 75  LSE.** to give u
eff0: 70 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72 2e  p with an error.
f000: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
f010: 69 6e 52 65 74 72 79 49 6f 65 72 72 28 69 6e 74  inRetryIoerr(int
f020: 20 2a 70 6e 52 65 74 72 79 2c 20 44 57 4f 52 44   *pnRetry, DWORD
f030: 20 2a 70 45 72 72 6f 72 29 7b 0a 20 20 44 57 4f   *pError){.  DWO
f040: 52 44 20 65 20 3d 20 6f 73 47 65 74 4c 61 73 74  RD e = osGetLast
f050: 45 72 72 6f 72 28 29 3b 0a 20 20 69 66 28 20 2a  Error();.  if( *
f060: 70 6e 52 65 74 72 79 3e 3d 77 69 6e 49 6f 65 72  pnRetry>=winIoer
f070: 72 52 65 74 72 79 20 29 7b 0a 20 20 20 20 69 66  rRetry ){.    if
f080: 28 20 70 45 72 72 6f 72 20 29 7b 0a 20 20 20 20  ( pError ){.    
f090: 20 20 2a 70 45 72 72 6f 72 20 3d 20 65 3b 0a 20    *pError = e;. 
f0a0: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
f0b0: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 77 69 6e  0;.  }.  if( win
f0c0: 49 6f 65 72 72 43 61 6e 52 65 74 72 79 31 28 65  IoerrCanRetry1(e
f0d0: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
f0e0: 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28 77 69 6e  _win32_sleep(win
f0f0: 49 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79 2a  IoerrRetryDelay*
f100: 28 31 2b 2a 70 6e 52 65 74 72 79 29 29 3b 0a 20  (1+*pnRetry));. 
f110: 20 20 20 2b 2b 2a 70 6e 52 65 74 72 79 3b 0a 20     ++*pnRetry;. 
f120: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
f130: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 77 69 6e  .#if defined(win
f140: 49 6f 65 72 72 43 61 6e 52 65 74 72 79 32 29 0a  IoerrCanRetry2).
f150: 20 20 65 6c 73 65 20 69 66 28 20 77 69 6e 49 6f    else if( winIo
f160: 65 72 72 43 61 6e 52 65 74 72 79 32 28 65 29 20  errCanRetry2(e) 
f170: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 77  ){.    sqlite3_w
f180: 69 6e 33 32 5f 73 6c 65 65 70 28 77 69 6e 49 6f  in32_sleep(winIo
f190: 65 72 72 52 65 74 72 79 44 65 6c 61 79 2a 28 31  errRetryDelay*(1
f1a0: 2b 2a 70 6e 52 65 74 72 79 29 29 3b 0a 20 20 20  +*pnRetry));.   
f1b0: 20 2b 2b 2a 70 6e 52 65 74 72 79 3b 0a 20 20 20   ++*pnRetry;.   
f1c0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 23   return 1;.  }.#
f1d0: 65 6e 64 69 66 0a 20 20 69 66 28 20 70 45 72 72  endif.  if( pErr
f1e0: 6f 72 20 29 7b 0a 20 20 20 20 2a 70 45 72 72 6f  or ){.    *pErro
f1f0: 72 20 3d 20 65 3b 0a 20 20 7d 0a 20 20 72 65 74  r = e;.  }.  ret
f200: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
f210: 4c 6f 67 20 61 20 49 2f 4f 20 65 72 72 6f 72 20  Log a I/O error 
f220: 72 65 74 72 79 20 65 70 69 73 6f 64 65 2e 0a 2a  retry episode..*
f230: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69  /.static void wi
f240: 6e 4c 6f 67 49 6f 65 72 72 28 69 6e 74 20 6e 52  nLogIoerr(int nR
f250: 65 74 72 79 29 7b 0a 20 20 69 66 28 20 6e 52 65  etry){.  if( nRe
f260: 74 72 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  try ){.    sqlit
f270: 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 49 4f  e3_log(SQLITE_IO
f280: 45 52 52 2c 0a 20 20 20 20 20 20 22 64 65 6c 61  ERR,.      "dela
f290: 79 65 64 20 25 64 6d 73 20 66 6f 72 20 6c 6f 63  yed %dms for loc
f2a0: 6b 2f 73 68 61 72 69 6e 67 20 63 6f 6e 66 6c 69  k/sharing confli
f2b0: 63 74 22 2c 0a 20 20 20 20 20 20 77 69 6e 49 6f  ct",.      winIo
f2c0: 65 72 72 52 65 74 72 79 44 65 6c 61 79 2a 6e 52  errRetryDelay*nR
f2d0: 65 74 72 79 2a 28 6e 52 65 74 72 79 2b 31 29 2f  etry*(nRetry+1)/
f2e0: 32 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a 0a  2.    );.  }.}..
f2f0: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
f300: 4e 43 45 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  NCE./***********
f310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
f350: 2a 20 54 68 69 73 20 73 65 63 74 69 6f 6e 20 63  * This section c
f360: 6f 6e 74 61 69 6e 73 20 63 6f 64 65 20 66 6f 72  ontains code for
f370: 20 57 69 6e 43 45 20 6f 6e 6c 79 2e 0a 2a 2f 0a   WinCE only..*/.
f380: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
f390: 49 54 45 5f 4d 53 56 43 5f 4c 4f 43 41 4c 54 49  ITE_MSVC_LOCALTI
f3a0: 4d 45 5f 41 50 49 29 20 7c 7c 20 21 53 51 4c 49  ME_API) || !SQLI
f3b0: 54 45 5f 4d 53 56 43 5f 4c 4f 43 41 4c 54 49 4d  TE_MSVC_LOCALTIM
f3c0: 45 5f 41 50 49 0a 2f 2a 0a 2a 2a 20 54 68 65 20  E_API./*.** The 
f3d0: 4d 53 56 43 20 43 52 54 20 6f 6e 20 57 69 6e 64  MSVC CRT on Wind
f3e0: 6f 77 73 20 43 45 20 6d 61 79 20 6e 6f 74 20 68  ows CE may not h
f3f0: 61 76 65 20 61 20 6c 6f 63 61 6c 74 69 6d 65 28  ave a localtime(
f400: 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 53 6f 0a  ) function.  So.
f410: 2a 2a 20 63 72 65 61 74 65 20 61 20 73 75 62 73  ** create a subs
f420: 74 69 74 75 74 65 2e 0a 2a 2f 0a 23 69 6e 63 6c  titute..*/.#incl
f430: 75 64 65 20 3c 74 69 6d 65 2e 68 3e 0a 73 74 72  ude <time.h>.str
f440: 75 63 74 20 74 6d 20 2a 5f 5f 63 64 65 63 6c 20  uct tm *__cdecl 
f450: 6c 6f 63 61 6c 74 69 6d 65 28 63 6f 6e 73 74 20  localtime(const 
f460: 74 69 6d 65 5f 74 20 2a 74 29 0a 7b 0a 20 20 73  time_t *t).{.  s
f470: 74 61 74 69 63 20 73 74 72 75 63 74 20 74 6d 20  tatic struct tm 
f480: 79 3b 0a 20 20 46 49 4c 45 54 49 4d 45 20 75 54  y;.  FILETIME uT
f490: 6d 2c 20 6c 54 6d 3b 0a 20 20 53 59 53 54 45 4d  m, lTm;.  SYSTEM
f4a0: 54 49 4d 45 20 70 54 6d 3b 0a 20 20 73 71 6c 69  TIME pTm;.  sqli
f4b0: 74 65 33 5f 69 6e 74 36 34 20 74 36 34 3b 0a 20  te3_int64 t64;. 
f4c0: 20 74 36 34 20 3d 20 2a 74 3b 0a 20 20 74 36 34   t64 = *t;.  t64
f4d0: 20 3d 20 28 74 36 34 20 2b 20 31 31 36 34 34 34   = (t64 + 116444
f4e0: 37 33 36 30 30 29 2a 31 30 30 30 30 30 30 30 3b  73600)*10000000;
f4f0: 0a 20 20 75 54 6d 2e 64 77 4c 6f 77 44 61 74 65  .  uTm.dwLowDate
f500: 54 69 6d 65 20 3d 20 28 44 57 4f 52 44 29 28 74  Time = (DWORD)(t
f510: 36 34 20 26 20 30 78 46 46 46 46 46 46 46 46 29  64 & 0xFFFFFFFF)
f520: 3b 0a 20 20 75 54 6d 2e 64 77 48 69 67 68 44 61  ;.  uTm.dwHighDa
f530: 74 65 54 69 6d 65 3d 20 28 44 57 4f 52 44 29 28  teTime= (DWORD)(
f540: 74 36 34 20 3e 3e 20 33 32 29 3b 0a 20 20 6f 73  t64 >> 32);.  os
f550: 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63 61 6c 46  FileTimeToLocalF
f560: 69 6c 65 54 69 6d 65 28 26 75 54 6d 2c 26 6c 54  ileTime(&uTm,&lT
f570: 6d 29 3b 0a 20 20 6f 73 46 69 6c 65 54 69 6d 65  m);.  osFileTime
f580: 54 6f 53 79 73 74 65 6d 54 69 6d 65 28 26 6c 54  ToSystemTime(&lT
f590: 6d 2c 26 70 54 6d 29 3b 0a 20 20 79 2e 74 6d 5f  m,&pTm);.  y.tm_
f5a0: 79 65 61 72 20 3d 20 70 54 6d 2e 77 59 65 61 72  year = pTm.wYear
f5b0: 20 2d 20 31 39 30 30 3b 0a 20 20 79 2e 74 6d 5f   - 1900;.  y.tm_
f5c0: 6d 6f 6e 20 3d 20 70 54 6d 2e 77 4d 6f 6e 74 68  mon = pTm.wMonth
f5d0: 20 2d 20 31 3b 0a 20 20 79 2e 74 6d 5f 77 64 61   - 1;.  y.tm_wda
f5e0: 79 20 3d 20 70 54 6d 2e 77 44 61 79 4f 66 57 65  y = pTm.wDayOfWe
f5f0: 65 6b 3b 0a 20 20 79 2e 74 6d 5f 6d 64 61 79 20  ek;.  y.tm_mday 
f600: 3d 20 70 54 6d 2e 77 44 61 79 3b 0a 20 20 79 2e  = pTm.wDay;.  y.
f610: 74 6d 5f 68 6f 75 72 20 3d 20 70 54 6d 2e 77 48  tm_hour = pTm.wH
f620: 6f 75 72 3b 0a 20 20 79 2e 74 6d 5f 6d 69 6e 20  our;.  y.tm_min 
f630: 3d 20 70 54 6d 2e 77 4d 69 6e 75 74 65 3b 0a 20  = pTm.wMinute;. 
f640: 20 79 2e 74 6d 5f 73 65 63 20 3d 20 70 54 6d 2e   y.tm_sec = pTm.
f650: 77 53 65 63 6f 6e 64 3b 0a 20 20 72 65 74 75 72  wSecond;.  retur
f660: 6e 20 26 79 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  n &y;.}.#endif..
f670: 23 64 65 66 69 6e 65 20 48 41 4e 44 4c 45 5f 54  #define HANDLE_T
f680: 4f 5f 57 49 4e 46 49 4c 45 28 61 29 20 28 77 69  O_WINFILE(a) (wi
f690: 6e 46 69 6c 65 2a 29 26 28 28 63 68 61 72 2a 29  nFile*)&((char*)
f6a0: 61 29 5b 2d 28 69 6e 74 29 6f 66 66 73 65 74 6f  a)[-(int)offseto
f6b0: 66 28 77 69 6e 46 69 6c 65 2c 68 29 5d 0a 0a 2f  f(winFile,h)]../
f6c0: 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 6c  *.** Acquire a l
f6d0: 6f 63 6b 20 6f 6e 20 74 68 65 20 68 61 6e 64 6c  ock on the handl
f6e0: 65 20 68 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  e h.*/.static vo
f6f0: 69 64 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71  id winceMutexAcq
f700: 75 69 72 65 28 48 41 4e 44 4c 45 20 68 29 7b 0a  uire(HANDLE h){.
f710: 20 20 20 44 57 4f 52 44 20 64 77 45 72 72 3b 0a     DWORD dwErr;.
f720: 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 64 77 45     do {.     dwE
f730: 72 72 20 3d 20 6f 73 57 61 69 74 46 6f 72 53 69  rr = osWaitForSi
f740: 6e 67 6c 65 4f 62 6a 65 63 74 28 68 2c 20 49 4e  ngleObject(h, IN
f750: 46 49 4e 49 54 45 29 3b 0a 20 20 20 7d 20 77 68  FINITE);.   } wh
f760: 69 6c 65 20 28 64 77 45 72 72 20 21 3d 20 57 41  ile (dwErr != WA
f770: 49 54 5f 4f 42 4a 45 43 54 5f 30 20 26 26 20 64  IT_OBJECT_0 && d
f780: 77 45 72 72 20 21 3d 20 57 41 49 54 5f 41 42 41  wErr != WAIT_ABA
f790: 4e 44 4f 4e 45 44 29 3b 0a 7d 0a 2f 2a 0a 2a 2a  NDONED);.}./*.**
f7a0: 20 52 65 6c 65 61 73 65 20 61 20 6c 6f 63 6b 20   Release a lock 
f7b0: 61 63 71 75 69 72 65 64 20 62 79 20 77 69 6e 63  acquired by winc
f7c0: 65 4d 75 74 65 78 41 63 71 75 69 72 65 28 29 0a  eMutexAcquire().
f7d0: 2a 2f 0a 23 64 65 66 69 6e 65 20 77 69 6e 63 65  */.#define wince
f7e0: 4d 75 74 65 78 52 65 6c 65 61 73 65 28 68 29 20  MutexRelease(h) 
f7f0: 52 65 6c 65 61 73 65 4d 75 74 65 78 28 68 29 0a  ReleaseMutex(h).
f800: 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74 68  ./*.** Create th
f810: 65 20 6d 75 74 65 78 20 61 6e 64 20 73 68 61 72  e mutex and shar
f820: 65 64 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 66  ed memory used f
f830: 6f 72 20 6c 6f 63 6b 69 6e 67 20 69 6e 20 74 68  or locking in th
f840: 65 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69  e file.** descri
f850: 70 74 6f 72 20 70 46 69 6c 65 0a 2a 2f 0a 73 74  ptor pFile.*/.st
f860: 61 74 69 63 20 69 6e 74 20 77 69 6e 63 65 43 72  atic int winceCr
f870: 65 61 74 65 4c 6f 63 6b 28 63 6f 6e 73 74 20 63  eateLock(const c
f880: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
f890: 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b  winFile *pFile){
f8a0: 0a 20 20 4c 50 57 53 54 52 20 7a 54 6f 6b 3b 0a  .  LPWSTR zTok;.
f8b0: 20 20 4c 50 57 53 54 52 20 7a 4e 61 6d 65 3b 0a    LPWSTR zName;.
f8c0: 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e    DWORD lastErrn
f8d0: 6f 3b 0a 20 20 42 4f 4f 4c 20 62 4c 6f 67 67 65  o;.  BOOL bLogge
f8e0: 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20 42 4f 4f  d = FALSE;.  BOO
f8f0: 4c 20 62 49 6e 69 74 20 3d 20 54 52 55 45 3b 0a  L bInit = TRUE;.
f900: 0a 20 20 7a 4e 61 6d 65 20 3d 20 77 69 6e 55 74  .  zName = winUt
f910: 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c  f8ToUnicode(zFil
f920: 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e  ename);.  if( zN
f930: 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  ame==0 ){.    /*
f940: 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 20 2a   out of memory *
f950: 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  /.    return SQL
f960: 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b  ITE_IOERR_NOMEM;
f970: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69  .  }..  /* Initi
f980: 61 6c 69 7a 65 20 74 68 65 20 6c 6f 63 61 6c 20  alize the local 
f990: 6c 6f 63 6b 64 61 74 61 20 2a 2f 0a 20 20 6d 65  lockdata */.  me
f9a0: 6d 73 65 74 28 26 70 46 69 6c 65 2d 3e 6c 6f 63  mset(&pFile->loc
f9b0: 61 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 46  al, 0, sizeof(pF
f9c0: 69 6c 65 2d 3e 6c 6f 63 61 6c 29 29 3b 0a 0a 20  ile->local));.. 
f9d0: 20 2f 2a 20 52 65 70 6c 61 63 65 20 74 68 65 20   /* Replace the 
f9e0: 62 61 63 6b 73 6c 61 73 68 65 73 20 66 72 6f 6d  backslashes from
f9f0: 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 61 6e   the filename an
fa00: 64 20 6c 6f 77 65 72 63 61 73 65 20 69 74 0a 20  d lowercase it. 
fa10: 20 2a 2a 20 74 6f 20 64 65 72 69 76 65 20 61 20   ** to derive a 
fa20: 6d 75 74 65 78 20 6e 61 6d 65 2e 20 2a 2f 0a 20  mutex name. */. 
fa30: 20 7a 54 6f 6b 20 3d 20 6f 73 43 68 61 72 4c 6f   zTok = osCharLo
fa40: 77 65 72 57 28 7a 4e 61 6d 65 29 3b 0a 20 20 66  werW(zName);.  f
fa50: 6f 72 20 28 3b 2a 7a 54 6f 6b 3b 7a 54 6f 6b 2b  or (;*zTok;zTok+
fa60: 2b 29 7b 0a 20 20 20 20 69 66 20 28 2a 7a 54 6f  +){.    if (*zTo
fa70: 6b 20 3d 3d 20 27 5c 5c 27 29 20 2a 7a 54 6f 6b  k == '\\') *zTok
fa80: 20 3d 20 27 5f 27 3b 0a 20 20 7d 0a 0a 20 20 2f   = '_';.  }..  /
fa90: 2a 20 43 72 65 61 74 65 2f 6f 70 65 6e 20 74 68  * Create/open th
faa0: 65 20 6e 61 6d 65 64 20 6d 75 74 65 78 20 2a 2f  e named mutex */
fab0: 0a 20 20 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78  .  pFile->hMutex
fac0: 20 3d 20 6f 73 43 72 65 61 74 65 4d 75 74 65 78   = osCreateMutex
fad0: 57 28 4e 55 4c 4c 2c 20 46 41 4c 53 45 2c 20 7a  W(NULL, FALSE, z
fae0: 4e 61 6d 65 29 3b 0a 20 20 69 66 20 28 21 70 46  Name);.  if (!pF
faf0: 69 6c 65 2d 3e 68 4d 75 74 65 78 29 7b 0a 20 20  ile->hMutex){.  
fb00: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
fb10: 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
fb20: 72 6f 72 28 29 3b 0a 20 20 20 20 73 71 6c 69 74  ror();.    sqlit
fb30: 65 33 5f 66 72 65 65 28 7a 4e 61 6d 65 29 3b 0a  e3_free(zName);.
fb40: 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f      return winLo
fb50: 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
fb60: 45 52 52 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74  ERR, pFile->last
fb70: 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  Errno,.         
fb80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
fb90: 69 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b 31 22  inceCreateLock1"
fba0: 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  , zFilename);.  
fbb0: 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20  }..  /* Acquire 
fbc0: 74 68 65 20 6d 75 74 65 78 20 62 65 66 6f 72 65  the mutex before
fbd0: 20 63 6f 6e 74 69 6e 75 69 6e 67 20 2a 2f 0a 20   continuing */. 
fbe0: 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71 75 69   winceMutexAcqui
fbf0: 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78  re(pFile->hMutex
fc00: 29 3b 0a 0a 20 20 2f 2a 20 53 69 6e 63 65 20 74  );..  /* Since t
fc10: 68 65 20 6e 61 6d 65 73 20 6f 66 20 6e 61 6d 65  he names of name
fc20: 64 20 6d 75 74 65 78 65 73 2c 20 73 65 6d 61 70  d mutexes, semap
fc30: 68 6f 72 65 73 2c 20 66 69 6c 65 20 6d 61 70 70  hores, file mapp
fc40: 69 6e 67 73 20 65 74 63 20 61 72 65 0a 20 20 2a  ings etc are.  *
fc50: 2a 20 63 61 73 65 2d 73 65 6e 73 69 74 69 76 65  * case-sensitive
fc60: 2c 20 74 61 6b 65 20 61 64 76 61 6e 74 61 67 65  , take advantage
fc70: 20 6f 66 20 74 68 61 74 20 62 79 20 75 70 70 65   of that by uppe
fc80: 72 63 61 73 69 6e 67 20 74 68 65 20 6d 75 74 65  rcasing the mute
fc90: 78 20 6e 61 6d 65 0a 20 20 2a 2a 20 61 6e 64 20  x name.  ** and 
fca0: 75 73 69 6e 67 20 74 68 61 74 20 61 73 20 74 68  using that as th
fcb0: 65 20 73 68 61 72 65 64 20 66 69 6c 65 6d 61 70  e shared filemap
fcc0: 70 69 6e 67 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a  ping name..  */.
fcd0: 20 20 6f 73 43 68 61 72 55 70 70 65 72 57 28 7a    osCharUpperW(z
fce0: 4e 61 6d 65 29 3b 0a 20 20 70 46 69 6c 65 2d 3e  Name);.  pFile->
fcf0: 68 53 68 61 72 65 64 20 3d 20 6f 73 43 72 65 61  hShared = osCrea
fd00: 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 28 49  teFileMappingW(I
fd10: 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
fd20: 4c 55 45 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20  LUE, NULL,.     
fd30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fd40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fd50: 20 20 20 50 41 47 45 5f 52 45 41 44 57 52 49 54     PAGE_READWRIT
fd60: 45 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 69 6e  E, 0, sizeof(win
fd70: 63 65 4c 6f 63 6b 29 2c 0a 20 20 20 20 20 20 20  ceLock),.       
fd80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fd90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fda0: 20 7a 4e 61 6d 65 29 3b 0a 0a 20 20 2f 2a 20 53   zName);..  /* S
fdb0: 65 74 20 61 20 66 6c 61 67 20 74 68 61 74 20 69  et a flag that i
fdc0: 6e 64 69 63 61 74 65 73 20 77 65 27 72 65 20 74  ndicates we're t
fdd0: 68 65 20 66 69 72 73 74 20 74 6f 20 63 72 65 61  he first to crea
fde0: 74 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 73 6f  te the memory so
fdf0: 20 69 74 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65   it.  ** must be
fe00: 20 7a 65 72 6f 2d 69 6e 69 74 69 61 6c 69 7a 65   zero-initialize
fe10: 64 20 2a 2f 0a 20 20 6c 61 73 74 45 72 72 6e 6f  d */.  lastErrno
fe20: 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
fe30: 72 28 29 3b 0a 20 20 69 66 20 28 6c 61 73 74 45  r();.  if (lastE
fe40: 72 72 6e 6f 20 3d 3d 20 45 52 52 4f 52 5f 41 4c  rrno == ERROR_AL
fe50: 52 45 41 44 59 5f 45 58 49 53 54 53 29 7b 0a 20  READY_EXISTS){. 
fe60: 20 20 20 62 49 6e 69 74 20 3d 20 46 41 4c 53 45     bInit = FALSE
fe70: 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  ;.  }..  sqlite3
fe80: 5f 66 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 0a 20  _free(zName);.. 
fe90: 20 2f 2a 20 49 66 20 77 65 20 73 75 63 63 65 65   /* If we succee
fea0: 64 65 64 20 69 6e 20 6d 61 6b 69 6e 67 20 74 68  ded in making th
feb0: 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  e shared memory 
fec0: 68 61 6e 64 6c 65 2c 20 6d 61 70 20 69 74 2e 20  handle, map it. 
fed0: 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
fee0: 68 53 68 61 72 65 64 20 29 7b 0a 20 20 20 20 70  hShared ){.    p
fef0: 46 69 6c 65 2d 3e 73 68 61 72 65 64 20 3d 20 28  File->shared = (
ff00: 77 69 6e 63 65 4c 6f 63 6b 2a 29 6f 73 4d 61 70  winceLock*)osMap
ff10: 56 69 65 77 4f 66 46 69 6c 65 28 70 46 69 6c 65  ViewOfFile(pFile
ff20: 2d 3e 68 53 68 61 72 65 64 2c 0a 20 20 20 20 20  ->hShared,.     
ff30: 20 20 20 20 20 20 20 20 46 49 4c 45 5f 4d 41 50          FILE_MAP
ff40: 5f 52 45 41 44 7c 46 49 4c 45 5f 4d 41 50 5f 57  _READ|FILE_MAP_W
ff50: 52 49 54 45 2c 20 30 2c 20 30 2c 20 73 69 7a 65  RITE, 0, 0, size
ff60: 6f 66 28 77 69 6e 63 65 4c 6f 63 6b 29 29 3b 0a  of(winceLock));.
ff70: 20 20 20 20 2f 2a 20 49 66 20 6d 61 70 70 69 6e      /* If mappin
ff80: 67 20 66 61 69 6c 65 64 2c 20 63 6c 6f 73 65 20  g failed, close 
ff90: 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  the shared memor
ffa0: 79 20 68 61 6e 64 6c 65 20 61 6e 64 20 65 72 61  y handle and era
ffb0: 73 65 20 69 74 20 2a 2f 0a 20 20 20 20 69 66 28  se it */.    if(
ffc0: 20 21 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 20   !pFile->shared 
ffd0: 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
ffe0: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
fff0: 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
10000 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28      winLogError(
10010 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 70 46  SQLITE_IOERR, pF
10020 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a  ile->lastErrno,.
10030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10040 20 20 22 77 69 6e 63 65 43 72 65 61 74 65 4c 6f    "winceCreateLo
10050 63 6b 32 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29  ck2", zFilename)
10060 3b 0a 20 20 20 20 20 20 62 4c 6f 67 67 65 64 20  ;.      bLogged 
10070 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20 6f 73  = TRUE;.      os
10080 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c  CloseHandle(pFil
10090 65 2d 3e 68 53 68 61 72 65 64 29 3b 0a 20 20 20  e->hShared);.   
100a0 20 20 20 70 46 69 6c 65 2d 3e 68 53 68 61 72 65     pFile->hShare
100b0 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a  d = NULL;.    }.
100c0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 73 68 61    }..  /* If sha
100d0 72 65 64 20 6d 65 6d 6f 72 79 20 63 6f 75 6c 64  red memory could
100e0 20 6e 6f 74 20 62 65 20 63 72 65 61 74 65 64 2c   not be created,
100f0 20 74 68 65 6e 20 63 6c 6f 73 65 20 74 68 65 20   then close the 
10100 6d 75 74 65 78 20 61 6e 64 20 66 61 69 6c 20 2a  mutex and fail *
10110 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 68  /.  if( pFile->h
10120 53 68 61 72 65 64 3d 3d 4e 55 4c 4c 20 29 7b 0a  Shared==NULL ){.
10130 20 20 20 20 69 66 28 20 21 62 4c 6f 67 67 65 64      if( !bLogged
10140 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   ){.      pFile-
10150 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73  >lastErrno = las
10160 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 77 69  tErrno;.      wi
10170 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
10180 5f 49 4f 45 52 52 2c 20 70 46 69 6c 65 2d 3e 6c  _IOERR, pFile->l
10190 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
101a0 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
101b0 63 65 43 72 65 61 74 65 4c 6f 63 6b 33 22 2c 20  ceCreateLock3", 
101c0 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  zFilename);.    
101d0 20 20 62 4c 6f 67 67 65 64 20 3d 20 54 52 55 45    bLogged = TRUE
101e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 69 6e 63  ;.    }.    winc
101f0 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28 70 46  eMutexRelease(pF
10200 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20  ile->hMutex);.  
10210 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28    osCloseHandle(
10220 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a  pFile->hMutex);.
10230 20 20 20 20 70 46 69 6c 65 2d 3e 68 4d 75 74 65      pFile->hMute
10240 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 72 65  x = NULL;.    re
10250 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
10260 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69  R;.  }..  /* Ini
10270 74 69 61 6c 69 7a 65 20 74 68 65 20 73 68 61 72  tialize the shar
10280 65 64 20 6d 65 6d 6f 72 79 20 69 66 20 77 65 27  ed memory if we'
10290 72 65 20 73 75 70 70 6f 73 65 64 20 74 6f 20 2a  re supposed to *
102a0 2f 0a 20 20 69 66 28 20 62 49 6e 69 74 20 29 7b  /.  if( bInit ){
102b0 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 46 69 6c  .    memset(pFil
102c0 65 2d 3e 73 68 61 72 65 64 2c 20 30 2c 20 73 69  e->shared, 0, si
102d0 7a 65 6f 66 28 77 69 6e 63 65 4c 6f 63 6b 29 29  zeof(winceLock))
102e0 3b 0a 20 20 7d 0a 0a 20 20 77 69 6e 63 65 4d 75  ;.  }..  winceMu
102f0 74 65 78 52 65 6c 65 61 73 65 28 70 46 69 6c 65  texRelease(pFile
10300 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 72 65 74  ->hMutex);.  ret
10310 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
10320 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 74 72 6f 79 20  ../*.** Destroy 
10330 74 68 65 20 70 61 72 74 20 6f 66 20 77 69 6e 46  the part of winF
10340 69 6c 65 20 74 68 61 74 20 64 65 61 6c 73 20 77  ile that deals w
10350 69 74 68 20 77 69 6e 63 65 20 6c 6f 63 6b 73 0a  ith wince locks.
10360 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
10370 69 6e 63 65 44 65 73 74 72 6f 79 4c 6f 63 6b 28  inceDestroyLock(
10380 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b  winFile *pFile){
10390 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 68 4d  .  if (pFile->hM
103a0 75 74 65 78 29 7b 0a 20 20 20 20 2f 2a 20 41 63  utex){.    /* Ac
103b0 71 75 69 72 65 20 74 68 65 20 6d 75 74 65 78 20  quire the mutex 
103c0 2a 2f 0a 20 20 20 20 77 69 6e 63 65 4d 75 74 65  */.    winceMute
103d0 78 41 63 71 75 69 72 65 28 70 46 69 6c 65 2d 3e  xAcquire(pFile->
103e0 68 4d 75 74 65 78 29 3b 0a 0a 20 20 20 20 2f 2a  hMutex);..    /*
103f0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62   The following b
10400 6c 6f 63 6b 73 20 73 68 6f 75 6c 64 20 70 72 6f  locks should pro
10410 62 61 62 6c 79 20 61 73 73 65 72 74 20 69 6e 20  bably assert in 
10420 64 65 62 75 67 20 6d 6f 64 65 2c 20 62 75 74 20  debug mode, but 
10430 74 68 65 79 0a 20 20 20 20 20 20 20 61 72 65 20  they.       are 
10440 74 6f 20 63 6c 65 61 6e 75 70 20 69 6e 20 63 61  to cleanup in ca
10450 73 65 20 61 6e 79 20 6c 6f 63 6b 73 20 72 65 6d  se any locks rem
10460 61 69 6e 65 64 20 6f 70 65 6e 20 2a 2f 0a 20 20  ained open */.  
10470 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63    if (pFile->loc
10480 61 6c 2e 6e 52 65 61 64 65 72 73 29 7b 0a 20 20  al.nReaders){.  
10490 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65      pFile->share
104a0 64 2d 3e 6e 52 65 61 64 65 72 73 20 2d 2d 3b 0a  d->nReaders --;.
104b0 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 70 46      }.    if (pF
104c0 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65  ile->local.bRese
104d0 72 76 65 64 29 7b 0a 20 20 20 20 20 20 70 46 69  rved){.      pFi
104e0 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52 65 73  le->shared->bRes
104f0 65 72 76 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20  erved = FALSE;. 
10500 20 20 20 7d 0a 20 20 20 20 69 66 20 28 70 46 69     }.    if (pFi
10510 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69  le->local.bPendi
10520 6e 67 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  ng){.      pFile
10530 2d 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e 64 69  ->shared->bPendi
10540 6e 67 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20  ng = FALSE;.    
10550 7d 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d  }.    if (pFile-
10560 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69 76  >local.bExclusiv
10570 65 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  e){.      pFile-
10580 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75 73  >shared->bExclus
10590 69 76 65 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20  ive = FALSE;.   
105a0 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 2d 72 65   }..    /* De-re
105b0 66 65 72 65 6e 63 65 20 61 6e 64 20 63 6c 6f 73  ference and clos
105c0 65 20 6f 75 72 20 63 6f 70 79 20 6f 66 20 74 68  e our copy of th
105d0 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  e shared memory 
105e0 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 20 20 6f 73  handle */.    os
105f0 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 28  UnmapViewOfFile(
10600 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 29 3b 0a  pFile->shared);.
10610 20 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c      osCloseHandl
10620 65 28 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64  e(pFile->hShared
10630 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 6e 65 20  );..    /* Done 
10640 77 69 74 68 20 74 68 65 20 6d 75 74 65 78 20 2a  with the mutex *
10650 2f 0a 20 20 20 20 77 69 6e 63 65 4d 75 74 65 78  /.    winceMutex
10660 52 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68  Release(pFile->h
10670 4d 75 74 65 78 29 3b 0a 20 20 20 20 6f 73 43 6c  Mutex);.    osCl
10680 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d  oseHandle(pFile-
10690 3e 68 4d 75 74 65 78 29 3b 0a 20 20 20 20 70 46  >hMutex);.    pF
106a0 69 6c 65 2d 3e 68 4d 75 74 65 78 20 3d 20 4e 55  ile->hMutex = NU
106b0 4c 4c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  LL;.  }.}../*.**
106c0 20 41 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69   An implementati
106d0 6f 6e 20 6f 66 20 74 68 65 20 4c 6f 63 6b 46 69  on of the LockFi
106e0 6c 65 28 29 20 41 50 49 20 6f 66 20 57 69 6e 64  le() API of Wind
106f0 6f 77 73 20 66 6f 72 20 43 45 0a 2a 2f 0a 73 74  ows for CE.*/.st
10700 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 63 65 4c  atic BOOL winceL
10710 6f 63 6b 46 69 6c 65 28 0a 20 20 4c 50 48 41 4e  ockFile(.  LPHAN
10720 44 4c 45 20 70 68 46 69 6c 65 2c 0a 20 20 44 57  DLE phFile,.  DW
10730 4f 52 44 20 64 77 46 69 6c 65 4f 66 66 73 65 74  ORD dwFileOffset
10740 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 64 77 46  Low,.  DWORD dwF
10750 69 6c 65 4f 66 66 73 65 74 48 69 67 68 2c 0a 20  ileOffsetHigh,. 
10760 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66   DWORD nNumberOf
10770 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 2c 0a  BytesToLockLow,.
10780 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f    DWORD nNumberO
10790 66 42 79 74 65 73 54 6f 4c 6f 63 6b 48 69 67 68  fBytesToLockHigh
107a0 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70  .){.  winFile *p
107b0 46 69 6c 65 20 3d 20 48 41 4e 44 4c 45 5f 54 4f  File = HANDLE_TO
107c0 5f 57 49 4e 46 49 4c 45 28 70 68 46 69 6c 65 29  _WINFILE(phFile)
107d0 3b 0a 20 20 42 4f 4f 4c 20 62 52 65 74 75 72 6e  ;.  BOOL bReturn
107e0 20 3d 20 46 41 4c 53 45 3b 0a 0a 20 20 55 4e 55   = FALSE;..  UNU
107f0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 77  SED_PARAMETER(dw
10800 46 69 6c 65 4f 66 66 73 65 74 48 69 67 68 29 3b  FileOffsetHigh);
10810 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
10820 54 45 52 28 6e 4e 75 6d 62 65 72 4f 66 42 79 74  TER(nNumberOfByt
10830 65 73 54 6f 4c 6f 63 6b 48 69 67 68 29 3b 0a 0a  esToLockHigh);..
10840 20 20 69 66 20 28 21 70 46 69 6c 65 2d 3e 68 4d    if (!pFile->hM
10850 75 74 65 78 29 20 72 65 74 75 72 6e 20 54 52 55  utex) return TRU
10860 45 3b 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 41  E;.  winceMutexA
10870 63 71 75 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d  cquire(pFile->hM
10880 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 57 61 6e  utex);..  /* Wan
10890 74 69 6e 67 20 61 6e 20 65 78 63 6c 75 73 69 76  ting an exclusiv
108a0 65 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 69 66 20  e lock? */.  if 
108b0 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77  (dwFileOffsetLow
108c0 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45   == (DWORD)SHARE
108d0 44 5f 46 49 52 53 54 0a 20 20 20 20 20 20 20 26  D_FIRST.       &
108e0 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  & nNumberOfBytes
108f0 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 28 44 57  ToLockLow == (DW
10900 4f 52 44 29 53 48 41 52 45 44 5f 53 49 5a 45 29  ORD)SHARED_SIZE)
10910 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d  {.    if (pFile-
10920 3e 73 68 61 72 65 64 2d 3e 6e 52 65 61 64 65 72  >shared->nReader
10930 73 20 3d 3d 20 30 20 26 26 20 70 46 69 6c 65 2d  s == 0 && pFile-
10940 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75 73  >shared->bExclus
10950 69 76 65 20 3d 3d 20 30 29 7b 0a 20 20 20 20 20  ive == 0){.     
10960 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d    pFile->shared-
10970 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 20 54 52  >bExclusive = TR
10980 55 45 3b 0a 20 20 20 20 20 20 20 70 46 69 6c 65  UE;.       pFile
10990 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69  ->local.bExclusi
109a0 76 65 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20  ve = TRUE;.     
109b0 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45    bReturn = TRUE
109c0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
109d0 2a 20 57 61 6e 74 20 61 20 72 65 61 64 2d 6f 6e  * Want a read-on
109e0 6c 79 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 65 6c  ly lock? */.  el
109f0 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66  se if (dwFileOff
10a00 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44  setLow == (DWORD
10a10 29 53 48 41 52 45 44 5f 46 49 52 53 54 20 26 26  )SHARED_FIRST &&
10a20 0a 20 20 20 20 20 20 20 20 20 20 20 6e 4e 75 6d  .           nNum
10a30 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b  berOfBytesToLock
10a40 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20 69  Low == 1){.    i
10a50 66 20 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64  f (pFile->shared
10a60 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 3d 20  ->bExclusive == 
10a70 30 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  0){.      pFile-
10a80 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 20  >local.nReaders 
10a90 2b 2b 3b 0a 20 20 20 20 20 20 69 66 20 28 70 46  ++;.      if (pF
10aa0 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64  ile->local.nRead
10ab0 65 72 73 20 3d 3d 20 31 29 7b 0a 20 20 20 20 20  ers == 1){.     
10ac0 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64     pFile->shared
10ad0 2d 3e 6e 52 65 61 64 65 72 73 20 2b 2b 3b 0a 20  ->nReaders ++;. 
10ae0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 52 65       }.      bRe
10af0 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20  turn = TRUE;.   
10b00 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 61 6e   }.  }..  /* Wan
10b10 74 20 61 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b  t a pending lock
10b20 3f 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20 28  ? */.  else if (
10b30 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20  dwFileOffsetLow 
10b40 3d 3d 20 28 44 57 4f 52 44 29 50 45 4e 44 49 4e  == (DWORD)PENDIN
10b50 47 5f 42 59 54 45 0a 20 20 20 20 20 20 20 20 20  G_BYTE.         
10b60 20 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79    && nNumberOfBy
10b70 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20  tesToLockLow == 
10b80 31 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f  1){.    /* If no
10b90 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 20 68 61   pending lock ha
10ba0 73 20 62 65 65 6e 20 61 63 71 75 69 72 65 64 2c  s been acquired,
10bb0 20 74 68 65 6e 20 61 63 71 75 69 72 65 20 69 74   then acquire it
10bc0 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 46 69 6c   */.    if (pFil
10bd0 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e 64  e->shared->bPend
10be0 69 6e 67 20 3d 3d 20 30 29 20 7b 0a 20 20 20 20  ing == 0) {.    
10bf0 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d    pFile->shared-
10c00 3e 62 50 65 6e 64 69 6e 67 20 3d 20 54 52 55 45  >bPending = TRUE
10c10 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  ;.      pFile->l
10c20 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67 20 3d 20  ocal.bPending = 
10c30 54 52 55 45 3b 0a 20 20 20 20 20 20 62 52 65 74  TRUE;.      bRet
10c40 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20  urn = TRUE;.    
10c50 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 61 6e 74  }.  }..  /* Want
10c60 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b   a reserved lock
10c70 3f 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20 28  ? */.  else if (
10c80 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20  dwFileOffsetLow 
10c90 3d 3d 20 28 44 57 4f 52 44 29 52 45 53 45 52 56  == (DWORD)RESERV
10ca0 45 44 5f 42 59 54 45 0a 20 20 20 20 20 20 20 20  ED_BYTE.        
10cb0 20 20 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42     && nNumberOfB
10cc0 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d  ytesToLockLow ==
10cd0 20 31 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69   1){.    if (pFi
10ce0 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52 65 73  le->shared->bRes
10cf0 65 72 76 65 64 20 3d 3d 20 30 29 20 7b 0a 20 20  erved == 0) {.  
10d00 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65      pFile->share
10d10 64 2d 3e 62 52 65 73 65 72 76 65 64 20 3d 20 54  d->bReserved = T
10d20 52 55 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65  RUE;.      pFile
10d30 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76 65  ->local.bReserve
10d40 64 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20  d = TRUE;.      
10d50 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a  bReturn = TRUE;.
10d60 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 77 69 6e      }.  }..  win
10d70 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28 70  ceMutexRelease(p
10d80 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20  File->hMutex);. 
10d90 20 72 65 74 75 72 6e 20 62 52 65 74 75 72 6e 3b   return bReturn;
10da0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6d 70  .}../*.** An imp
10db0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
10dc0 68 65 20 55 6e 6c 6f 63 6b 46 69 6c 65 20 41 50  he UnlockFile AP
10dd0 49 20 6f 66 20 57 69 6e 64 6f 77 73 20 66 6f 72  I of Windows for
10de0 20 43 45 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f   CE.*/.static BO
10df0 4f 4c 20 77 69 6e 63 65 55 6e 6c 6f 63 6b 46 69  OL winceUnlockFi
10e00 6c 65 28 0a 20 20 4c 50 48 41 4e 44 4c 45 20 70  le(.  LPHANDLE p
10e10 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20 64  hFile,.  DWORD d
10e20 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 2c 0a  wFileOffsetLow,.
10e30 20 20 44 57 4f 52 44 20 64 77 46 69 6c 65 4f 66    DWORD dwFileOf
10e40 66 73 65 74 48 69 67 68 2c 0a 20 20 44 57 4f 52  fsetHigh,.  DWOR
10e50 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  D nNumberOfBytes
10e60 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 2c 0a 20 20 44  ToUnlockLow,.  D
10e70 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79  WORD nNumberOfBy
10e80 74 65 73 54 6f 55 6e 6c 6f 63 6b 48 69 67 68 0a  tesToUnlockHigh.
10e90 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46  ){.  winFile *pF
10ea0 69 6c 65 20 3d 20 48 41 4e 44 4c 45 5f 54 4f 5f  ile = HANDLE_TO_
10eb0 57 49 4e 46 49 4c 45 28 70 68 46 69 6c 65 29 3b  WINFILE(phFile);
10ec0 0a 20 20 42 4f 4f 4c 20 62 52 65 74 75 72 6e 20  .  BOOL bReturn 
10ed0 3d 20 46 41 4c 53 45 3b 0a 0a 20 20 55 4e 55 53  = FALSE;..  UNUS
10ee0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 77 46  ED_PARAMETER(dwF
10ef0 69 6c 65 4f 66 66 73 65 74 48 69 67 68 29 3b 0a  ileOffsetHigh);.
10f00 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
10f10 45 52 28 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65  ER(nNumberOfByte
10f20 73 54 6f 55 6e 6c 6f 63 6b 48 69 67 68 29 3b 0a  sToUnlockHigh);.
10f30 0a 20 20 69 66 20 28 21 70 46 69 6c 65 2d 3e 68  .  if (!pFile->h
10f40 4d 75 74 65 78 29 20 72 65 74 75 72 6e 20 54 52  Mutex) return TR
10f50 55 45 3b 0a 20 20 77 69 6e 63 65 4d 75 74 65 78  UE;.  winceMutex
10f60 41 63 71 75 69 72 65 28 70 46 69 6c 65 2d 3e 68  Acquire(pFile->h
10f70 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 52 65  Mutex);..  /* Re
10f80 6c 65 61 73 69 6e 67 20 61 20 72 65 61 64 65 72  leasing a reader
10f90 20 6c 6f 63 6b 20 6f 72 20 61 6e 20 65 78 63 6c   lock or an excl
10fa0 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20  usive lock */.  
10fb0 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74  if (dwFileOffset
10fc0 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48  Low == (DWORD)SH
10fd0 41 52 45 44 5f 46 49 52 53 54 29 7b 0a 20 20 20  ARED_FIRST){.   
10fe0 20 2f 2a 20 44 69 64 20 77 65 20 68 61 76 65 20   /* Did we have 
10ff0 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
11000 6b 3f 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 46  k? */.    if (pF
11010 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c  ile->local.bExcl
11020 75 73 69 76 65 29 7b 0a 20 20 20 20 20 20 61 73  usive){.      as
11030 73 65 72 74 28 6e 4e 75 6d 62 65 72 4f 66 42 79  sert(nNumberOfBy
11040 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d  tesToUnlockLow =
11050 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f  = (DWORD)SHARED_
11060 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 70 46 69  SIZE);.      pFi
11070 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75  le->local.bExclu
11080 73 69 76 65 20 3d 20 46 41 4c 53 45 3b 0a 20 20  sive = FALSE;.  
11090 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65      pFile->share
110a0 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 20  d->bExclusive = 
110b0 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 62 52 65  FALSE;.      bRe
110c0 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20  turn = TRUE;.   
110d0 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 69 64 20 77   }..    /* Did w
110e0 65 20 6a 75 73 74 20 68 61 76 65 20 61 20 72 65  e just have a re
110f0 61 64 65 72 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20  ader lock? */.  
11100 20 20 65 6c 73 65 20 69 66 20 28 70 46 69 6c 65    else if (pFile
11110 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73  ->local.nReaders
11120 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
11130 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f  nNumberOfBytesTo
11140 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 28 44 57  UnlockLow == (DW
11150 4f 52 44 29 53 48 41 52 45 44 5f 53 49 5a 45 0a  ORD)SHARED_SIZE.
11160 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
11170 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f  nNumberOfBytesTo
11180 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 3b  UnlockLow == 1);
11190 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f  .      pFile->lo
111a0 63 61 6c 2e 6e 52 65 61 64 65 72 73 20 2d 2d 3b  cal.nReaders --;
111b0 0a 20 20 20 20 20 20 69 66 20 28 70 46 69 6c 65  .      if (pFile
111c0 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73  ->local.nReaders
111d0 20 3d 3d 20 30 29 0a 20 20 20 20 20 20 7b 0a 20   == 0).      {. 
111e0 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68         pFile->sh
111f0 61 72 65 64 2d 3e 6e 52 65 61 64 65 72 73 20 2d  ared->nReaders -
11200 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  -;.      }.     
11210 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b   bReturn = TRUE;
11220 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
11230 20 52 65 6c 65 61 73 69 6e 67 20 61 20 70 65 6e   Releasing a pen
11240 64 69 6e 67 20 6c 6f 63 6b 20 2a 2f 0a 20 20 65  ding lock */.  e
11250 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66  lse if (dwFileOf
11260 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52  fsetLow == (DWOR
11270 44 29 50 45 4e 44 49 4e 47 5f 42 59 54 45 0a 20  D)PENDING_BYTE. 
11280 20 20 20 20 20 20 20 20 20 20 26 26 20 6e 4e 75            && nNu
11290 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c  mberOfBytesToUnl
112a0 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20  ockLow == 1){.  
112b0 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63    if (pFile->loc
112c0 61 6c 2e 62 50 65 6e 64 69 6e 67 29 7b 0a 20 20  al.bPending){.  
112d0 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c      pFile->local
112e0 2e 62 50 65 6e 64 69 6e 67 20 3d 20 46 41 4c 53  .bPending = FALS
112f0 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  E;.      pFile->
11300 73 68 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e 67  shared->bPending
11310 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20   = FALSE;.      
11320 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a  bReturn = TRUE;.
11330 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 52      }.  }.  /* R
11340 65 6c 65 61 73 69 6e 67 20 61 20 72 65 73 65 72  eleasing a reser
11350 76 65 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 65 6c  ved lock */.  el
11360 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66  se if (dwFileOff
11370 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44  setLow == (DWORD
11380 29 52 45 53 45 52 56 45 44 5f 42 59 54 45 0a 20  )RESERVED_BYTE. 
11390 20 20 20 20 20 20 20 20 20 20 26 26 20 6e 4e 75            && nNu
113a0 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c  mberOfBytesToUnl
113b0 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20  ockLow == 1){.  
113c0 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63    if (pFile->loc
113d0 61 6c 2e 62 52 65 73 65 72 76 65 64 29 20 7b 0a  al.bReserved) {.
113e0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63        pFile->loc
113f0 61 6c 2e 62 52 65 73 65 72 76 65 64 20 3d 20 46  al.bReserved = F
11400 41 4c 53 45 3b 0a 20 20 20 20 20 20 70 46 69 6c  ALSE;.      pFil
11410 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52 65 73 65  e->shared->bRese
11420 72 76 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20  rved = FALSE;.  
11430 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52      bReturn = TR
11440 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  UE;.    }.  }.. 
11450 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c 65 61   winceMutexRelea
11460 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78  se(pFile->hMutex
11470 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 52 65 74  );.  return bRet
11480 75 72 6e 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 45 6e 64  urn;.}./*.** End
11490 20 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c 20   of the special 
114a0 63 6f 64 65 20 66 6f 72 20 77 69 6e 63 65 0a 2a  code for wince.*
114b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
114c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
114d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
114e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
114f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 65  ************/.#e
11500 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
11510 53 5f 57 49 4e 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a  S_WINCE */../*.*
11520 2a 20 4c 6f 63 6b 20 61 20 66 69 6c 65 20 72 65  * Lock a file re
11530 67 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  gion..*/.static 
11540 42 4f 4f 4c 20 77 69 6e 4c 6f 63 6b 46 69 6c 65  BOOL winLockFile
11550 28 0a 20 20 4c 50 48 41 4e 44 4c 45 20 70 68 46  (.  LPHANDLE phF
11560 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20 66 6c 61  ile,.  DWORD fla
11570 67 73 2c 0a 20 20 44 57 4f 52 44 20 6f 66 66 73  gs,.  DWORD offs
11580 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6f  etLow,.  DWORD o
11590 66 66 73 65 74 48 69 67 68 2c 0a 20 20 44 57 4f  ffsetHigh,.  DWO
115a0 52 44 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 0a  RD numBytesLow,.
115b0 20 20 44 57 4f 52 44 20 6e 75 6d 42 79 74 65 73    DWORD numBytes
115c0 48 69 67 68 0a 29 7b 0a 23 69 66 20 53 51 4c 49  High.){.#if SQLI
115d0 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 2f 2a  TE_OS_WINCE.  /*
115e0 0a 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 69 6e 64  .  ** NOTE: Wind
115f0 6f 77 73 20 43 45 20 69 73 20 68 61 6e 64 6c 65  ows CE is handle
11600 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20 68 65  d differently he
11610 72 65 20 64 75 65 20 69 74 73 20 6c 61 63 6b 20  re due its lack 
11620 6f 66 20 74 68 65 20 57 69 6e 33 32 0a 20 20 2a  of the Win32.  *
11630 2a 20 20 20 20 20 20 20 41 50 49 20 4c 6f 63 6b  *       API Lock
11640 46 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74  File..  */.  ret
11650 75 72 6e 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c  urn winceLockFil
11660 65 28 70 68 46 69 6c 65 2c 20 6f 66 66 73 65 74  e(phFile, offset
11670 4c 6f 77 2c 20 6f 66 66 73 65 74 48 69 67 68 2c  Low, offsetHigh,
11680 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11690 20 20 20 20 20 20 20 20 6e 75 6d 42 79 74 65 73          numBytes
116a0 4c 6f 77 2c 20 6e 75 6d 42 79 74 65 73 48 69 67  Low, numBytesHig
116b0 68 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28 20  h);.#else.  if( 
116c0 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 20 20 20  osIsNT() ){.    
116d0 4f 56 45 52 4c 41 50 50 45 44 20 6f 76 6c 70 3b  OVERLAPPED ovlp;
116e0 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 6f 76 6c  .    memset(&ovl
116f0 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4f 56 45  p, 0, sizeof(OVE
11700 52 4c 41 50 50 45 44 29 29 3b 0a 20 20 20 20 6f  RLAPPED));.    o
11710 76 6c 70 2e 4f 66 66 73 65 74 20 3d 20 6f 66 66  vlp.Offset = off
11720 73 65 74 4c 6f 77 3b 0a 20 20 20 20 6f 76 6c 70  setLow;.    ovlp
11730 2e 4f 66 66 73 65 74 48 69 67 68 20 3d 20 6f 66  .OffsetHigh = of
11740 66 73 65 74 48 69 67 68 3b 0a 20 20 20 20 72 65  fsetHigh;.    re
11750 74 75 72 6e 20 6f 73 4c 6f 63 6b 46 69 6c 65 45  turn osLockFileE
11760 78 28 2a 70 68 46 69 6c 65 2c 20 66 6c 61 67 73  x(*phFile, flags
11770 2c 20 30 2c 20 6e 75 6d 42 79 74 65 73 4c 6f 77  , 0, numBytesLow
11780 2c 20 6e 75 6d 42 79 74 65 73 48 69 67 68 2c 20  , numBytesHigh, 
11790 26 6f 76 6c 70 29 3b 0a 20 20 7d 65 6c 73 65 7b  &ovlp);.  }else{
117a0 0a 20 20 20 20 72 65 74 75 72 6e 20 6f 73 4c 6f  .    return osLo
117b0 63 6b 46 69 6c 65 28 2a 70 68 46 69 6c 65 2c 20  ckFile(*phFile, 
117c0 6f 66 66 73 65 74 4c 6f 77 2c 20 6f 66 66 73 65  offsetLow, offse
117d0 74 48 69 67 68 2c 20 6e 75 6d 42 79 74 65 73 4c  tHigh, numBytesL
117e0 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ow,.            
117f0 20 20 20 20 20 20 20 20 20 20 6e 75 6d 42 79 74            numByt
11800 65 73 48 69 67 68 29 3b 0a 20 20 7d 0a 23 65 6e  esHigh);.  }.#en
11810 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c  dif.}../*.** Unl
11820 6f 63 6b 20 61 20 66 69 6c 65 20 72 65 67 69 6f  ock a file regio
11830 6e 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 42 4f  n.. */.static BO
11840 4f 4c 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65  OL winUnlockFile
11850 28 0a 20 20 4c 50 48 41 4e 44 4c 45 20 70 68 46  (.  LPHANDLE phF
11860 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20 6f 66 66  ile,.  DWORD off
11870 73 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20  setLow,.  DWORD 
11880 6f 66 66 73 65 74 48 69 67 68 2c 0a 20 20 44 57  offsetHigh,.  DW
11890 4f 52 44 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c  ORD numBytesLow,
118a0 0a 20 20 44 57 4f 52 44 20 6e 75 6d 42 79 74 65  .  DWORD numByte
118b0 73 48 69 67 68 0a 29 7b 0a 23 69 66 20 53 51 4c  sHigh.){.#if SQL
118c0 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 2f  ITE_OS_WINCE.  /
118d0 2a 0a 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 69 6e  *.  ** NOTE: Win
118e0 64 6f 77 73 20 43 45 20 69 73 20 68 61 6e 64 6c  dows CE is handl
118f0 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20 68  ed differently h
11900 65 72 65 20 64 75 65 20 69 74 73 20 6c 61 63 6b  ere due its lack
11910 20 6f 66 20 74 68 65 20 57 69 6e 33 32 0a 20 20   of the Win32.  
11920 2a 2a 20 20 20 20 20 20 20 41 50 49 20 55 6e 6c  **       API Unl
11930 6f 63 6b 46 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  ockFile..  */.  
11940 72 65 74 75 72 6e 20 77 69 6e 63 65 55 6e 6c 6f  return winceUnlo
11950 63 6b 46 69 6c 65 28 70 68 46 69 6c 65 2c 20 6f  ckFile(phFile, o
11960 66 66 73 65 74 4c 6f 77 2c 20 6f 66 66 73 65 74  ffsetLow, offset
11970 48 69 67 68 2c 0a 20 20 20 20 20 20 20 20 20 20  High,.          
11980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
11990 75 6d 42 79 74 65 73 4c 6f 77 2c 20 6e 75 6d 42  umBytesLow, numB
119a0 79 74 65 73 48 69 67 68 29 3b 0a 23 65 6c 73 65  ytesHigh);.#else
119b0 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20  .  if( osIsNT() 
119c0 29 7b 0a 20 20 20 20 4f 56 45 52 4c 41 50 50 45  ){.    OVERLAPPE
119d0 44 20 6f 76 6c 70 3b 0a 20 20 20 20 6d 65 6d 73  D ovlp;.    mems
119e0 65 74 28 26 6f 76 6c 70 2c 20 30 2c 20 73 69 7a  et(&ovlp, 0, siz
119f0 65 6f 66 28 4f 56 45 52 4c 41 50 50 45 44 29 29  eof(OVERLAPPED))
11a00 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66 66 73 65  ;.    ovlp.Offse
11a10 74 20 3d 20 6f 66 66 73 65 74 4c 6f 77 3b 0a 20  t = offsetLow;. 
11a20 20 20 20 6f 76 6c 70 2e 4f 66 66 73 65 74 48 69     ovlp.OffsetHi
11a30 67 68 20 3d 20 6f 66 66 73 65 74 48 69 67 68 3b  gh = offsetHigh;
11a40 0a 20 20 20 20 72 65 74 75 72 6e 20 6f 73 55 6e  .    return osUn
11a50 6c 6f 63 6b 46 69 6c 65 45 78 28 2a 70 68 46 69  lockFileEx(*phFi
11a60 6c 65 2c 20 30 2c 20 6e 75 6d 42 79 74 65 73 4c  le, 0, numBytesL
11a70 6f 77 2c 20 6e 75 6d 42 79 74 65 73 48 69 67 68  ow, numBytesHigh
11a80 2c 20 26 6f 76 6c 70 29 3b 0a 20 20 7d 65 6c 73  , &ovlp);.  }els
11a90 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6f 73  e{.    return os
11aa0 55 6e 6c 6f 63 6b 46 69 6c 65 28 2a 70 68 46 69  UnlockFile(*phFi
11ab0 6c 65 2c 20 6f 66 66 73 65 74 4c 6f 77 2c 20 6f  le, offsetLow, o
11ac0 66 66 73 65 74 48 69 67 68 2c 20 6e 75 6d 42 79  ffsetHigh, numBy
11ad0 74 65 73 4c 6f 77 2c 0a 20 20 20 20 20 20 20 20  tesLow,.        
11ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11af0 6e 75 6d 42 79 74 65 73 48 69 67 68 29 3b 0a 20  numBytesHigh);. 
11b00 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 2a   }.#endif.}../**
11b10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11b20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11b30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11b40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11b50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54  ***********.** T
11b60 68 65 20 6e 65 78 74 20 67 72 6f 75 70 20 6f 66  he next group of
11b70 20 72 6f 75 74 69 6e 65 73 20 69 6d 70 6c 65 6d   routines implem
11b80 65 6e 74 20 74 68 65 20 49 2f 4f 20 6d 65 74 68  ent the I/O meth
11b90 6f 64 73 20 73 70 65 63 69 66 69 65 64 0a 2a 2a  ods specified.**
11ba0 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 33 5f   by the sqlite3_
11bb0 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
11bc0 74 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  t..*************
11bd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11be0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11bf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11c00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11c10 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 20 4d  */../*.** Some M
11c20 69 63 72 6f 73 6f 66 74 20 63 6f 6d 70 69 6c 65  icrosoft compile
11c30 72 73 20 6c 61 63 6b 20 74 68 69 73 20 64 65 66  rs lack this def
11c40 69 6e 69 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e  inition..*/.#ifn
11c50 64 65 66 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f  def INVALID_SET_
11c60 46 49 4c 45 5f 50 4f 49 4e 54 45 52 0a 23 20 64  FILE_POINTER.# d
11c70 65 66 69 6e 65 20 49 4e 56 41 4c 49 44 5f 53 45  efine INVALID_SE
11c80 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 20 28  T_FILE_POINTER (
11c90 28 44 57 4f 52 44 29 2d 31 29 0a 23 65 6e 64 69  (DWORD)-1).#endi
11ca0 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  f../*.** Move th
11cb0 65 20 63 75 72 72 65 6e 74 20 70 6f 73 69 74 69  e current positi
11cc0 6f 6e 20 6f 66 20 74 68 65 20 66 69 6c 65 20 68  on of the file h
11cd0 61 6e 64 6c 65 20 70 61 73 73 65 64 20 61 73 20  andle passed as 
11ce0 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 61 72 67  the first.** arg
11cf0 75 6d 65 6e 74 20 74 6f 20 6f 66 66 73 65 74 20  ument to offset 
11d00 69 4f 66 66 73 65 74 20 77 69 74 68 69 6e 20 74  iOffset within t
11d10 68 65 20 66 69 6c 65 2e 20 49 66 20 73 75 63 63  he file. If succ
11d20 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e 20 30  essful, return 0
11d30 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
11d40 73 65 74 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  set pFile->lastE
11d50 72 72 6e 6f 20 61 6e 64 20 72 65 74 75 72 6e 20  rrno and return 
11d60 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61  non-zero..*/.sta
11d70 74 69 63 20 69 6e 74 20 77 69 6e 53 65 65 6b 46  tic int winSeekF
11d80 69 6c 65 28 77 69 6e 46 69 6c 65 20 2a 70 46 69  ile(winFile *pFi
11d90 6c 65 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  le, sqlite3_int6
11da0 34 20 69 4f 66 66 73 65 74 29 7b 0a 23 69 66 20  4 iOffset){.#if 
11db0 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
11dc0 0a 20 20 4c 4f 4e 47 20 75 70 70 65 72 42 69 74  .  LONG upperBit
11dd0 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
11de0 20 20 20 2f 2a 20 4d 6f 73 74 20 73 69 67 2e 20     /* Most sig. 
11df0 33 32 20 62 69 74 73 20 6f 66 20 6e 65 77 20 6f  32 bits of new o
11e00 66 66 73 65 74 20 2a 2f 0a 20 20 4c 4f 4e 47 20  ffset */.  LONG 
11e10 6c 6f 77 65 72 42 69 74 73 3b 20 20 20 20 20 20  lowerBits;      
11e20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
11e30 61 73 74 20 73 69 67 2e 20 33 32 20 62 69 74 73  ast sig. 32 bits
11e40 20 6f 66 20 6e 65 77 20 6f 66 66 73 65 74 20 2a   of new offset *
11e50 2f 0a 20 20 44 57 4f 52 44 20 64 77 52 65 74 3b  /.  DWORD dwRet;
11e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e70 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74      /* Value ret
11e80 75 72 6e 65 64 20 62 79 20 53 65 74 46 69 6c 65  urned by SetFile
11e90 50 6f 69 6e 74 65 72 28 29 20 2a 2f 0a 20 20 44  Pointer() */.  D
11ea0 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 20  WORD lastErrno; 
11eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11ec0 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64  * Value returned
11ed0 20 62 79 20 47 65 74 4c 61 73 74 45 72 72 6f 72   by GetLastError
11ee0 28 29 20 2a 2f 0a 0a 20 20 4f 53 54 52 41 43 45  () */..  OSTRACE
11ef0 28 28 22 53 45 45 4b 20 66 69 6c 65 3d 25 70 2c  (("SEEK file=%p,
11f00 20 6f 66 66 73 65 74 3d 25 6c 6c 64 5c 6e 22 2c   offset=%lld\n",
11f10 20 70 46 69 6c 65 2d 3e 68 2c 20 69 4f 66 66 73   pFile->h, iOffs
11f20 65 74 29 29 3b 0a 0a 20 20 75 70 70 65 72 42 69  et));..  upperBi
11f30 74 73 20 3d 20 28 4c 4f 4e 47 29 28 28 69 4f 66  ts = (LONG)((iOf
11f40 66 73 65 74 3e 3e 33 32 29 20 26 20 30 78 37 66  fset>>32) & 0x7f
11f50 66 66 66 66 66 66 29 3b 0a 20 20 6c 6f 77 65 72  ffffff);.  lower
11f60 42 69 74 73 20 3d 20 28 4c 4f 4e 47 29 28 69 4f  Bits = (LONG)(iO
11f70 66 66 73 65 74 20 26 20 30 78 66 66 66 66 66 66  ffset & 0xffffff
11f80 66 66 29 3b 0a 0a 20 20 2f 2a 20 41 50 49 20 6f  ff);..  /* API o
11f90 64 64 69 74 79 3a 20 49 66 20 73 75 63 63 65 73  ddity: If succes
11fa0 73 66 75 6c 2c 20 53 65 74 46 69 6c 65 50 6f 69  sful, SetFilePoi
11fb0 6e 74 65 72 28 29 20 72 65 74 75 72 6e 73 20 61  nter() returns a
11fc0 20 64 77 6f 72 64 0a 20 20 2a 2a 20 63 6f 6e 74   dword.  ** cont
11fd0 61 69 6e 69 6e 67 20 74 68 65 20 6c 6f 77 65 72  aining the lower
11fe0 20 33 32 2d 62 69 74 73 20 6f 66 20 74 68 65 20   32-bits of the 
11ff0 6e 65 77 20 66 69 6c 65 2d 6f 66 66 73 65 74 2e  new file-offset.
12000 20 4f 72 2c 20 69 66 20 69 74 20 66 61 69 6c 73   Or, if it fails
12010 2c 0a 20 20 2a 2a 20 69 74 20 72 65 74 75 72 6e  ,.  ** it return
12020 73 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49  s INVALID_SET_FI
12030 4c 45 5f 50 4f 49 4e 54 45 52 2e 20 48 6f 77 65  LE_POINTER. Howe
12040 76 65 72 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  ver according to
12050 20 4d 53 44 4e 2c 0a 20 20 2a 2a 20 49 4e 56 41   MSDN,.  ** INVA
12060 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49  LID_SET_FILE_POI
12070 4e 54 45 52 20 6d 61 79 20 61 6c 73 6f 20 62 65  NTER may also be
12080 20 61 20 76 61 6c 69 64 20 6e 65 77 20 6f 66 66   a valid new off
12090 73 65 74 2e 20 53 6f 20 74 6f 20 64 65 74 65 72  set. So to deter
120a0 6d 69 6e 65 0a 20 20 2a 2a 20 77 68 65 74 68 65  mine.  ** whethe
120b0 72 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 61  r an error has a
120c0 63 74 75 61 6c 6c 79 20 6f 63 63 75 72 72 65 64  ctually occurred
120d0 2c 20 69 74 20 69 73 20 61 6c 73 6f 20 6e 65 63  , it is also nec
120e0 65 73 73 61 72 79 20 74 6f 20 63 61 6c 6c 0a 20  essary to call. 
120f0 20 2a 2a 20 47 65 74 4c 61 73 74 45 72 72 6f 72   ** GetLastError
12100 28 29 2e 0a 20 20 2a 2f 0a 20 20 64 77 52 65 74  ()..  */.  dwRet
12110 20 3d 20 6f 73 53 65 74 46 69 6c 65 50 6f 69 6e   = osSetFilePoin
12120 74 65 72 28 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f  ter(pFile->h, lo
12130 77 65 72 42 69 74 73 2c 20 26 75 70 70 65 72 42  werBits, &upperB
12140 69 74 73 2c 20 46 49 4c 45 5f 42 45 47 49 4e 29  its, FILE_BEGIN)
12150 3b 0a 0a 20 20 69 66 28 20 28 64 77 52 65 74 3d  ;..  if( (dwRet=
12160 3d 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c  =INVALID_SET_FIL
12170 45 5f 50 4f 49 4e 54 45 52 0a 20 20 20 20 20 20  E_POINTER.      
12180 26 26 20 28 28 6c 61 73 74 45 72 72 6e 6f 20 3d  && ((lastErrno =
12190 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
121a0 29 29 21 3d 4e 4f 5f 45 52 52 4f 52 29 29 20 29  ))!=NO_ERROR)) )
121b0 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73  {.    pFile->las
121c0 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72  tErrno = lastErr
121d0 6e 6f 3b 0a 20 20 20 20 77 69 6e 4c 6f 67 45 72  no;.    winLogEr
121e0 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
121f0 5f 53 45 45 4b 2c 20 70 46 69 6c 65 2d 3e 6c 61  _SEEK, pFile->la
12200 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
12210 20 20 20 20 20 20 20 20 20 22 77 69 6e 53 65 65           "winSee
12220 6b 46 69 6c 65 22 2c 20 70 46 69 6c 65 2d 3e 7a  kFile", pFile->z
12230 50 61 74 68 29 3b 0a 20 20 20 20 4f 53 54 52 41  Path);.    OSTRA
12240 43 45 28 28 22 53 45 45 4b 20 66 69 6c 65 3d 25  CE(("SEEK file=%
12250 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45  p, rc=SQLITE_IOE
12260 52 52 5f 53 45 45 4b 5c 6e 22 2c 20 70 46 69 6c  RR_SEEK\n", pFil
12270 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75  e->h));.    retu
12280 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54  rn 1;.  }..  OST
12290 52 41 43 45 28 28 22 53 45 45 4b 20 66 69 6c 65  RACE(("SEEK file
122a0 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f  =%p, rc=SQLITE_O
122b0 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29  K\n", pFile->h))
122c0 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 23 65  ;.  return 0;.#e
122d0 6c 73 65 0a 20 20 2f 2a 0a 20 20 2a 2a 20 53 61  lse.  /*.  ** Sa
122e0 6d 65 20 61 73 20 61 62 6f 76 65 2c 20 65 78 63  me as above, exc
122f0 65 70 74 20 74 68 61 74 20 74 68 69 73 20 69 6d  ept that this im
12300 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 77 6f 72  plementation wor
12310 6b 73 20 66 6f 72 20 57 69 6e 52 54 2e 0a 20 20  ks for WinRT..  
12320 2a 2f 0a 0a 20 20 4c 41 52 47 45 5f 49 4e 54 45  */..  LARGE_INTE
12330 47 45 52 20 78 3b 20 20 20 20 20 20 20 20 20 20  GER x;          
12340 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77        /* The new
12350 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 42 4f 4f   offset */.  BOO
12360 4c 20 62 52 65 74 3b 20 20 20 20 20 20 20 20 20  L bRet;         
12370 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12380 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  Value returned b
12390 79 20 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72  y SetFilePointer
123a0 45 78 28 29 20 2a 2f 0a 0a 20 20 78 2e 51 75 61  Ex() */..  x.Qua
123b0 64 50 61 72 74 20 3d 20 69 4f 66 66 73 65 74 3b  dPart = iOffset;
123c0 0a 20 20 62 52 65 74 20 3d 20 6f 73 53 65 74 46  .  bRet = osSetF
123d0 69 6c 65 50 6f 69 6e 74 65 72 45 78 28 70 46 69  ilePointerEx(pFi
123e0 6c 65 2d 3e 68 2c 20 78 2c 20 30 2c 20 46 49 4c  le->h, x, 0, FIL
123f0 45 5f 42 45 47 49 4e 29 3b 0a 0a 20 20 69 66 28  E_BEGIN);..  if(
12400 21 62 52 65 74 29 7b 0a 20 20 20 20 70 46 69 6c  !bRet){.    pFil
12410 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f  e->lastErrno = o
12420 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b  sGetLastError();
12430 0a 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72  .    winLogError
12440 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 45  (SQLITE_IOERR_SE
12450 45 4b 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  EK, pFile->lastE
12460 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
12470 20 20 20 20 20 20 22 77 69 6e 53 65 65 6b 46 69        "winSeekFi
12480 6c 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  le", pFile->zPat
12490 68 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28  h);.    OSTRACE(
124a0 28 22 53 45 45 4b 20 66 69 6c 65 3d 25 70 2c 20  ("SEEK file=%p, 
124b0 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rc=SQLITE_IOERR_
124c0 53 45 45 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  SEEK\n", pFile->
124d0 68 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  h));.    return 
124e0 31 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43  1;.  }..  OSTRAC
124f0 45 28 28 22 53 45 45 4b 20 66 69 6c 65 3d 25 70  E(("SEEK file=%p
12500 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e  , rc=SQLITE_OK\n
12510 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20  ", pFile->h));. 
12520 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69   return 0;.#endi
12530 66 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  f.}..#if SQLITE_
12540 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
12550 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
12560 65 6e 63 65 73 20 74 6f 20 56 46 53 20 68 65 6c  ences to VFS hel
12570 70 65 72 20 6d 65 74 68 6f 64 73 20 75 73 65 64  per methods used
12580 20 66 6f 72 20 6d 65 6d 6f 72 79 20 6d 61 70 70   for memory mapp
12590 65 64 20 66 69 6c 65 73 20 2a 2f 0a 73 74 61 74  ed files */.stat
125a0 69 63 20 69 6e 74 20 77 69 6e 4d 61 70 66 69 6c  ic int winMapfil
125b0 65 28 77 69 6e 46 69 6c 65 2a 2c 20 73 71 6c 69  e(winFile*, sqli
125c0 74 65 33 5f 69 6e 74 36 34 29 3b 0a 73 74 61 74  te3_int64);.stat
125d0 69 63 20 69 6e 74 20 77 69 6e 55 6e 6d 61 70 66  ic int winUnmapf
125e0 69 6c 65 28 77 69 6e 46 69 6c 65 2a 29 3b 0a 23  ile(winFile*);.#
125f0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  endif../*.** Clo
12600 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  se a file..**.**
12610 20 49 74 20 69 73 20 72 65 70 6f 72 74 65 64 20   It is reported 
12620 74 68 61 74 20 61 6e 20 61 74 74 65 6d 70 74 20  that an attempt 
12630 74 6f 20 63 6c 6f 73 65 20 61 20 68 61 6e 64 6c  to close a handl
12640 65 20 6d 69 67 68 74 20 73 6f 6d 65 74 69 6d 65  e might sometime
12650 73 0a 2a 2a 20 66 61 69 6c 2e 20 20 54 68 69 73  s.** fail.  This
12660 20 69 73 20 61 20 76 65 72 79 20 75 6e 72 65 61   is a very unrea
12670 73 6f 6e 61 62 6c 65 20 72 65 73 75 6c 74 2c 20  sonable result, 
12680 62 75 74 20 57 69 6e 64 6f 77 73 20 69 73 20 6e  but Windows is n
12690 6f 74 6f 72 69 6f 75 73 0a 2a 2a 20 66 6f 72 20  otorious.** for 
126a0 62 65 69 6e 67 20 75 6e 72 65 61 73 6f 6e 61 62  being unreasonab
126b0 6c 65 20 73 6f 20 49 20 64 6f 20 6e 6f 74 20 64  le so I do not d
126c0 6f 75 62 74 20 74 68 61 74 20 69 74 20 6d 69 67  oubt that it mig
126d0 68 74 20 68 61 70 70 65 6e 2e 20 20 49 66 0a 2a  ht happen.  If.*
126e0 2a 20 74 68 65 20 63 6c 6f 73 65 20 66 61 69 6c  * the close fail
126f0 73 2c 20 77 65 20 70 61 75 73 65 20 66 6f 72 20  s, we pause for 
12700 31 30 30 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73  100 milliseconds
12710 20 61 6e 64 20 74 72 79 20 61 67 61 69 6e 2e 20   and try again. 
12720 20 41 73 0a 2a 2a 20 6d 61 6e 79 20 61 73 20 4d   As.** many as M
12730 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d 50 54 20  X_CLOSE_ATTEMPT 
12740 61 74 74 65 6d 70 74 73 20 74 6f 20 63 6c 6f 73  attempts to clos
12750 65 20 74 68 65 20 68 61 6e 64 6c 65 20 61 72 65  e the handle are
12760 20 6d 61 64 65 20 62 65 66 6f 72 65 0a 2a 2a 20   made before.** 
12770 67 69 76 69 6e 67 20 75 70 20 61 6e 64 20 72 65  giving up and re
12780 74 75 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72  turning an error
12790 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 58 5f  ..*/.#define MX_
127a0 43 4c 4f 53 45 5f 41 54 54 45 4d 50 54 20 33 0a  CLOSE_ATTEMPT 3.
127b0 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 43 6c  static int winCl
127c0 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ose(sqlite3_file
127d0 20 2a 69 64 29 7b 0a 20 20 69 6e 74 20 72 63 2c   *id){.  int rc,
127e0 20 63 6e 74 20 3d 20 30 3b 0a 20 20 77 69 6e 46   cnt = 0;.  winF
127f0 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69  ile *pFile = (wi
12800 6e 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 61 73  nFile*)id;..  as
12810 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 23  sert( id!=0 );.#
12820 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
12830 49 54 5f 57 41 4c 0a 20 20 61 73 73 65 72 74 28  IT_WAL.  assert(
12840 20 70 46 69 6c 65 2d 3e 70 53 68 6d 3d 3d 30 20   pFile->pShm==0 
12850 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65  );.#endif.  asse
12860 72 74 28 20 70 46 69 6c 65 2d 3e 68 21 3d 4e 55  rt( pFile->h!=NU
12870 4c 4c 20 26 26 20 70 46 69 6c 65 2d 3e 68 21 3d  LL && pFile->h!=
12880 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56  INVALID_HANDLE_V
12890 41 4c 55 45 20 29 3b 0a 20 20 4f 53 54 52 41 43  ALUE );.  OSTRAC
128a0 45 28 28 22 43 4c 4f 53 45 20 66 69 6c 65 3d 25  E(("CLOSE file=%
128b0 70 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29  p\n", pFile->h))
128c0 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  ;..#if SQLITE_MA
128d0 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
128e0 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28 70 46 69  winUnmapfile(pFi
128f0 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 64  le);.#endif..  d
12900 6f 7b 0a 20 20 20 20 72 63 20 3d 20 6f 73 43 6c  o{.    rc = osCl
12910 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d  oseHandle(pFile-
12920 3e 68 29 3b 0a 20 20 20 20 2f 2a 20 53 69 6d 75  >h);.    /* Simu
12930 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d  lateIOError( rc=
12940 30 3b 20 63 6e 74 3d 4d 58 5f 43 4c 4f 53 45 5f  0; cnt=MX_CLOSE_
12950 41 54 54 45 4d 50 54 3b 20 29 3b 20 2a 2f 0a 20  ATTEMPT; ); */. 
12960 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 30 20 26   }while( rc==0 &
12970 26 20 2b 2b 63 6e 74 20 3c 20 4d 58 5f 43 4c 4f  & ++cnt < MX_CLO
12980 53 45 5f 41 54 54 45 4d 50 54 20 26 26 20 28 73  SE_ATTEMPT && (s
12990 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65  qlite3_win32_sle
129a0 65 70 28 31 30 30 29 2c 20 31 29 20 29 3b 0a 23  ep(100), 1) );.#
129b0 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
129c0 43 45 0a 23 64 65 66 69 6e 65 20 57 49 4e 43 45  CE.#define WINCE
129d0 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d 50  _DELETION_ATTEMP
129e0 54 53 20 33 0a 20 20 77 69 6e 63 65 44 65 73 74  TS 3.  winceDest
129f0 72 6f 79 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a  royLock(pFile);.
12a00 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 7a 44 65    if( pFile->zDe
12a10 6c 65 74 65 4f 6e 43 6c 6f 73 65 20 29 7b 0a 20  leteOnClose ){. 
12a20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a     int cnt = 0;.
12a30 20 20 20 20 77 68 69 6c 65 28 0a 20 20 20 20 20      while(.     
12a40 20 20 20 20 20 20 6f 73 44 65 6c 65 74 65 46 69        osDeleteFi
12a50 6c 65 57 28 70 46 69 6c 65 2d 3e 7a 44 65 6c 65  leW(pFile->zDele
12a60 74 65 4f 6e 43 6c 6f 73 65 29 3d 3d 30 0a 20 20  teOnClose)==0.  
12a70 20 20 20 20 20 20 26 26 20 6f 73 47 65 74 46 69        && osGetFi
12a80 6c 65 41 74 74 72 69 62 75 74 65 73 57 28 70 46  leAttributesW(pF
12a90 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c  ile->zDeleteOnCl
12aa0 6f 73 65 29 21 3d 30 78 66 66 66 66 66 66 66 66  ose)!=0xffffffff
12ab0 0a 20 20 20 20 20 20 20 20 26 26 20 63 6e 74 2b  .        && cnt+
12ac0 2b 20 3c 20 57 49 4e 43 45 5f 44 45 4c 45 54 49  + < WINCE_DELETI
12ad0 4f 4e 5f 41 54 54 45 4d 50 54 53 0a 20 20 20 20  ON_ATTEMPTS.    
12ae0 29 7b 0a 20 20 20 20 20 20 20 73 71 6c 69 74 65  ){.       sqlite
12af0 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28 31 30  3_win32_sleep(10
12b00 30 29 3b 20 20 2f 2a 20 57 61 69 74 20 61 20 6c  0);  /* Wait a l
12b10 69 74 74 6c 65 20 62 65 66 6f 72 65 20 74 72 79  ittle before try
12b20 69 6e 67 20 61 67 61 69 6e 20 2a 2f 0a 20 20 20  ing again */.   
12b30 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
12b40 72 65 65 28 70 46 69 6c 65 2d 3e 7a 44 65 6c 65  ree(pFile->zDele
12b50 74 65 4f 6e 43 6c 6f 73 65 29 3b 0a 20 20 7d 0a  teOnClose);.  }.
12b60 23 65 6e 64 69 66 0a 20 20 69 66 28 20 72 63 20  #endif.  if( rc 
12b70 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68 20  ){.    pFile->h 
12b80 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 20 20 4f 70  = NULL;.  }.  Op
12b90 65 6e 43 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20  enCounter(-1);. 
12ba0 20 4f 53 54 52 41 43 45 28 28 22 43 4c 4f 53 45   OSTRACE(("CLOSE
12bb0 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c   file=%p, rc=%s\
12bc0 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63  n", pFile->h, rc
12bd0 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65   ? "ok" : "faile
12be0 64 22 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  d"));.  return r
12bf0 63 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20  c ? SQLITE_OK.  
12c00 20 20 20 20 20 20 20 20 20 20 3a 20 77 69 6e 4c            : winL
12c10 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
12c20 4f 45 52 52 5f 43 4c 4f 53 45 2c 20 6f 73 47 65  OERR_CLOSE, osGe
12c30 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20  tLastError(),.  
12c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c50 20 20 20 20 20 20 20 20 22 77 69 6e 43 6c 6f 73          "winClos
12c60 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  e", pFile->zPath
12c70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  );.}../*.** Read
12c80 20 64 61 74 61 20 66 72 6f 6d 20 61 20 66 69 6c   data from a fil
12c90 65 20 69 6e 74 6f 20 61 20 62 75 66 66 65 72 2e  e into a buffer.
12ca0 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
12cb0 4f 4b 20 69 66 20 61 6c 6c 0a 2a 2a 20 62 79 74  OK if all.** byt
12cc0 65 73 20 77 65 72 65 20 72 65 61 64 20 73 75 63  es were read suc
12cd0 63 65 73 73 66 75 6c 6c 79 20 61 6e 64 20 53 51  cessfully and SQ
12ce0 4c 49 54 45 5f 49 4f 45 52 52 20 69 66 20 61 6e  LITE_IOERR if an
12cf0 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77  ything goes.** w
12d00 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rong..*/.static 
12d10 69 6e 74 20 77 69 6e 52 65 61 64 28 0a 20 20 73  int winRead(.  s
12d20 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
12d30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
12d40 65 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a  e to read from *
12d50 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20  /.  void *pBuf, 
12d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12d70 2a 20 57 72 69 74 65 20 63 6f 6e 74 65 6e 74 20  * Write content 
12d80 69 6e 74 6f 20 74 68 69 73 20 62 75 66 66 65 72  into this buffer
12d90 20 2a 2f 0a 20 20 69 6e 74 20 61 6d 74 2c 20 20   */.  int amt,  
12da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12db0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
12dc0 74 65 73 20 74 6f 20 72 65 61 64 20 2a 2f 0a 20  tes to read */. 
12dd0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f   sqlite3_int64 o
12de0 66 66 73 65 74 20 20 20 20 20 20 20 2f 2a 20 42  ffset       /* B
12df0 65 67 69 6e 20 72 65 61 64 69 6e 67 20 61 74 20  egin reading at 
12e00 74 68 69 73 20 6f 66 66 73 65 74 20 2a 2f 0a 29  this offset */.)
12e10 7b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  {.#if !SQLITE_OS
12e20 5f 57 49 4e 43 45 0a 20 20 4f 56 45 52 4c 41 50  _WINCE.  OVERLAP
12e30 50 45 44 20 6f 76 65 72 6c 61 70 70 65 64 3b 20  PED overlapped; 
12e40 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
12e50 6f 66 66 73 65 74 20 66 6f 72 20 52 65 61 64 46  offset for ReadF
12e60 69 6c 65 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  ile. */.#endif. 
12e70 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20   winFile *pFile 
12e80 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 20  = (winFile*)id; 
12e90 20 2f 2a 20 66 69 6c 65 20 68 61 6e 64 6c 65 20   /* file handle 
12ea0 2a 2f 0a 20 20 44 57 4f 52 44 20 6e 52 65 61 64  */.  DWORD nRead
12eb0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
12ec0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
12ed0 66 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79  f bytes actually
12ee0 20 72 65 61 64 20 66 72 6f 6d 20 66 69 6c 65 20   read from file 
12ef0 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 74 72 79 20  */.  int nRetry 
12f00 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
12f10 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
12f20 66 20 72 65 74 72 79 73 20 2a 2f 0a 0a 20 20 61  f retrys */..  a
12f30 73 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a  ssert( id!=0 );.
12f40 20 20 61 73 73 65 72 74 28 20 61 6d 74 3e 30 20    assert( amt>0 
12f50 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66  );.  assert( off
12f60 73 65 74 3e 3d 30 20 29 3b 0a 20 20 53 69 6d 75  set>=0 );.  Simu
12f70 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75  lateIOError(retu
12f80 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
12f90 52 45 41 44 29 3b 0a 20 20 4f 53 54 52 41 43 45  READ);.  OSTRACE
12fa0 28 28 22 52 45 41 44 20 66 69 6c 65 3d 25 70 2c  (("READ file=%p,
12fb0 20 62 75 66 66 65 72 3d 25 70 2c 20 61 6d 6f 75   buffer=%p, amou
12fc0 6e 74 3d 25 64 2c 20 6f 66 66 73 65 74 3d 25 6c  nt=%d, offset=%l
12fd0 6c 64 2c 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 0a  ld, lock=%d\n",.
12fe0 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
12ff0 2d 3e 68 2c 20 70 42 75 66 2c 20 61 6d 74 2c 20  ->h, pBuf, amt, 
13000 6f 66 66 73 65 74 2c 20 70 46 69 6c 65 2d 3e 6c  offset, pFile->l
13010 6f 63 6b 74 79 70 65 29 29 3b 0a 0a 23 69 66 20  ocktype));..#if 
13020 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
13030 53 49 5a 45 3e 30 0a 20 20 2f 2a 20 44 65 61 6c  SIZE>0.  /* Deal
13040 20 77 69 74 68 20 61 73 20 6d 75 63 68 20 6f 66   with as much of
13050 20 74 68 69 73 20 72 65 61 64 20 72 65 71 75 65   this read reque
13060 73 74 20 61 73 20 70 6f 73 73 69 62 6c 65 20 62  st as possible b
13070 79 20 74 72 61 6e 73 66 65 72 69 6e 67 0a 20 20  y transfering.  
13080 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65  ** data from the
13090 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20   memory mapping 
130a0 75 73 69 6e 67 20 6d 65 6d 63 70 79 28 29 2e 20  using memcpy(). 
130b0 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73 65 74   */.  if( offset
130c0 3c 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65  <pFile->mmapSize
130d0 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 66 66 73   ){.    if( offs
130e0 65 74 2b 61 6d 74 20 3c 3d 20 70 46 69 6c 65 2d  et+amt <= pFile-
130f0 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20  >mmapSize ){.   
13100 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20     memcpy(pBuf, 
13110 26 28 28 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e  &((u8 *)(pFile->
13120 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66  pMapRegion))[off
13130 73 65 74 5d 2c 20 61 6d 74 29 3b 0a 20 20 20 20  set], amt);.    
13140 20 20 4f 53 54 52 41 43 45 28 28 22 52 45 41 44    OSTRACE(("READ
13150 2d 4d 4d 41 50 20 66 69 6c 65 3d 25 70 2c 20 72  -MMAP file=%p, r
13160 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20  c=SQLITE_OK\n", 
13170 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20  pFile->h));.    
13180 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
13190 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  OK;.    }else{. 
131a0 20 20 20 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d       int nCopy =
131b0 20 28 69 6e 74 29 28 70 46 69 6c 65 2d 3e 6d 6d   (int)(pFile->mm
131c0 61 70 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 29  apSize - offset)
131d0 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70  ;.      memcpy(p
131e0 42 75 66 2c 20 26 28 28 75 38 20 2a 29 28 70 46  Buf, &((u8 *)(pF
131f0 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29  ile->pMapRegion)
13200 29 5b 6f 66 66 73 65 74 5d 2c 20 6e 43 6f 70 79  )[offset], nCopy
13210 29 3b 0a 20 20 20 20 20 20 70 42 75 66 20 3d 20  );.      pBuf = 
13220 26 28 28 75 38 20 2a 29 70 42 75 66 29 5b 6e 43  &((u8 *)pBuf)[nC
13230 6f 70 79 5d 3b 0a 20 20 20 20 20 20 61 6d 74 20  opy];.      amt 
13240 2d 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 20 20  -= nCopy;.      
13250 6f 66 66 73 65 74 20 2b 3d 20 6e 43 6f 70 79 3b  offset += nCopy;
13260 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
13270 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  f..#if SQLITE_OS
13280 5f 57 49 4e 43 45 0a 20 20 69 66 28 20 77 69 6e  _WINCE.  if( win
13290 53 65 65 6b 46 69 6c 65 28 70 46 69 6c 65 2c 20  SeekFile(pFile, 
132a0 6f 66 66 73 65 74 29 20 29 7b 0a 20 20 20 20 4f  offset) ){.    O
132b0 53 54 52 41 43 45 28 28 22 52 45 41 44 20 66 69  STRACE(("READ fi
132c0 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
132d0 5f 46 55 4c 4c 5c 6e 22 2c 20 70 46 69 6c 65 2d  _FULL\n", pFile-
132e0 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  >h));.    return
132f0 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20   SQLITE_FULL;.  
13300 7d 0a 20 20 77 68 69 6c 65 28 20 21 6f 73 52 65  }.  while( !osRe
13310 61 64 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c  adFile(pFile->h,
13320 20 70 42 75 66 2c 20 61 6d 74 2c 20 26 6e 52 65   pBuf, amt, &nRe
13330 61 64 2c 20 30 29 20 29 7b 0a 23 65 6c 73 65 0a  ad, 0) ){.#else.
13340 20 20 6d 65 6d 73 65 74 28 26 6f 76 65 72 6c 61    memset(&overla
13350 70 70 65 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28  pped, 0, sizeof(
13360 4f 56 45 52 4c 41 50 50 45 44 29 29 3b 0a 20 20  OVERLAPPED));.  
13370 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66 66 73 65  overlapped.Offse
13380 74 20 3d 20 28 4c 4f 4e 47 29 28 6f 66 66 73 65  t = (LONG)(offse
13390 74 20 26 20 30 78 66 66 66 66 66 66 66 66 29 3b  t & 0xffffffff);
133a0 0a 20 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66  .  overlapped.Of
133b0 66 73 65 74 48 69 67 68 20 3d 20 28 4c 4f 4e 47  fsetHigh = (LONG
133c0 29 28 28 6f 66 66 73 65 74 3e 3e 33 32 29 20 26  )((offset>>32) &
133d0 20 30 78 37 66 66 66 66 66 66 66 29 3b 0a 20 20   0x7fffffff);.  
133e0 77 68 69 6c 65 28 20 21 6f 73 52 65 61 64 46 69  while( !osReadFi
133f0 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 70 42 75  le(pFile->h, pBu
13400 66 2c 20 61 6d 74 2c 20 26 6e 52 65 61 64 2c 20  f, amt, &nRead, 
13410 26 6f 76 65 72 6c 61 70 70 65 64 29 20 26 26 0a  &overlapped) &&.
13420 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 4c 61           osGetLa
13430 73 74 45 72 72 6f 72 28 29 21 3d 45 52 52 4f 52  stError()!=ERROR
13440 5f 48 41 4e 44 4c 45 5f 45 4f 46 20 29 7b 0a 23  _HANDLE_EOF ){.#
13450 65 6e 64 69 66 0a 20 20 20 20 44 57 4f 52 44 20  endif.    DWORD 
13460 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 69  lastErrno;.    i
13470 66 28 20 77 69 6e 52 65 74 72 79 49 6f 65 72 72  f( winRetryIoerr
13480 28 26 6e 52 65 74 72 79 2c 20 26 6c 61 73 74 45  (&nRetry, &lastE
13490 72 72 6e 6f 29 20 29 20 63 6f 6e 74 69 6e 75 65  rrno) ) continue
134a0 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73  ;.    pFile->las
134b0 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72  tErrno = lastErr
134c0 6e 6f 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28  no;.    OSTRACE(
134d0 28 22 52 45 41 44 20 66 69 6c 65 3d 25 70 2c 20  ("READ file=%p, 
134e0 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rc=SQLITE_IOERR_
134f0 52 45 41 44 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  READ\n", pFile->
13500 68 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  h));.    return 
13510 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
13520 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 2c 20 70  TE_IOERR_READ, p
13530 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c  File->lastErrno,
13540 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13550 20 20 20 20 20 20 20 20 22 77 69 6e 52 65 61 64          "winRead
13560 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
13570 3b 0a 20 20 7d 0a 20 20 77 69 6e 4c 6f 67 49 6f  ;.  }.  winLogIo
13580 65 72 72 28 6e 52 65 74 72 79 29 3b 0a 20 20 69  err(nRetry);.  i
13590 66 28 20 6e 52 65 61 64 3c 28 44 57 4f 52 44 29  f( nRead<(DWORD)
135a0 61 6d 74 20 29 7b 0a 20 20 20 20 2f 2a 20 55 6e  amt ){.    /* Un
135b0 72 65 61 64 20 70 61 72 74 73 20 6f 66 20 74 68  read parts of th
135c0 65 20 62 75 66 66 65 72 20 6d 75 73 74 20 62 65  e buffer must be
135d0 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 2a 2f 0a   zero-filled */.
135e0 20 20 20 20 6d 65 6d 73 65 74 28 26 28 28 63 68      memset(&((ch
135f0 61 72 2a 29 70 42 75 66 29 5b 6e 52 65 61 64 5d  ar*)pBuf)[nRead]
13600 2c 20 30 2c 20 61 6d 74 2d 6e 52 65 61 64 29 3b  , 0, amt-nRead);
13610 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 52  .    OSTRACE(("R
13620 45 41 44 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  EAD file=%p, rc=
13630 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
13640 52 54 5f 52 45 41 44 5c 6e 22 2c 20 70 46 69 6c  RT_READ\n", pFil
13650 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75  e->h));.    retu
13660 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
13670 53 48 4f 52 54 5f 52 45 41 44 3b 0a 20 20 7d 0a  SHORT_READ;.  }.
13680 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52 45 41  .  OSTRACE(("REA
13690 44 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51  D file=%p, rc=SQ
136a0 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c  LITE_OK\n", pFil
136b0 65 2d 3e 68 29 29 3b 0a 20 20 72 65 74 75 72 6e  e->h));.  return
136c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
136d0 2a 0a 2a 2a 20 57 72 69 74 65 20 64 61 74 61 20  *.** Write data 
136e0 66 72 6f 6d 20 61 20 62 75 66 66 65 72 20 69 6e  from a buffer in
136f0 74 6f 20 61 20 66 69 6c 65 2e 20 20 52 65 74 75  to a file.  Retu
13700 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
13710 73 75 63 63 65 73 73 0a 2a 2a 20 6f 72 20 73 6f  success.** or so
13720 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63  me other error c
13730 6f 64 65 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a  ode on failure..
13740 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
13750 6e 57 72 69 74 65 28 0a 20 20 73 71 6c 69 74 65  nWrite(.  sqlite
13760 33 5f 66 69 6c 65 20 2a 69 64 2c 20 20 20 20 20  3_file *id,     
13770 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
13780 65 20 74 6f 20 77 72 69 74 65 20 69 6e 74 6f 20  e to write into 
13790 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  */.  const void 
137a0 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 20  *pBuf,          
137b0 20 20 20 20 20 2f 2a 20 54 68 65 20 62 79 74 65       /* The byte
137c0 73 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  s to be written 
137d0 2a 2f 0a 20 20 69 6e 74 20 61 6d 74 2c 20 20 20  */.  int amt,   
137e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
137f0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
13800 66 20 62 79 74 65 73 20 74 6f 20 77 72 69 74 65  f bytes to write
13810 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
13820 74 36 34 20 6f 66 66 73 65 74 20 20 20 20 20 20  t64 offset      
13830 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
13840 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 20 74 6f  into the file to
13850 20 62 65 67 69 6e 20 77 72 69 74 69 6e 67 20 61   begin writing a
13860 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  t */.){.  int rc
13870 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
13880 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
13890 65 20 69 66 20 65 72 72 6f 72 20 68 61 73 20 6f  e if error has o
138a0 63 63 75 72 72 65 64 2c 20 65 6c 73 65 20 66 61  ccurred, else fa
138b0 6c 73 65 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65  lse */.  winFile
138c0 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69   *pFile = (winFi
138d0 6c 65 2a 29 69 64 3b 20 20 2f 2a 20 46 69 6c 65  le*)id;  /* File
138e0 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74   handle */.  int
138f0 20 6e 52 65 74 72 79 20 3d 20 30 3b 20 20 20 20   nRetry = 0;    
13900 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13910 4e 75 6d 62 65 72 20 6f 66 20 72 65 74 72 69 65  Number of retrie
13920 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  s */..  assert( 
13930 61 6d 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  amt>0 );.  asser
13940 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 53 69  t( pFile );.  Si
13950 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65  mulateIOError(re
13960 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
13970 52 5f 57 52 49 54 45 29 3b 0a 20 20 53 69 6d 75  R_WRITE);.  Simu
13980 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f  lateDiskfullErro
13990 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  r(return SQLITE_
139a0 46 55 4c 4c 29 3b 0a 0a 20 20 4f 53 54 52 41 43  FULL);..  OSTRAC
139b0 45 28 28 22 57 52 49 54 45 20 66 69 6c 65 3d 25  E(("WRITE file=%
139c0 70 2c 20 62 75 66 66 65 72 3d 25 70 2c 20 61 6d  p, buffer=%p, am
139d0 6f 75 6e 74 3d 25 64 2c 20 6f 66 66 73 65 74 3d  ount=%d, offset=
139e0 25 6c 6c 64 2c 20 6c 6f 63 6b 3d 25 64 5c 6e 22  %lld, lock=%d\n"
139f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69  ,.           pFi
13a00 6c 65 2d 3e 68 2c 20 70 42 75 66 2c 20 61 6d 74  le->h, pBuf, amt
13a10 2c 20 6f 66 66 73 65 74 2c 20 70 46 69 6c 65 2d  , offset, pFile-
13a20 3e 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 0a 23 69  >locktype));..#i
13a30 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
13a40 50 5f 53 49 5a 45 3e 30 0a 20 20 2f 2a 20 44 65  P_SIZE>0.  /* De
13a50 61 6c 20 77 69 74 68 20 61 73 20 6d 75 63 68 20  al with as much 
13a60 6f 66 20 74 68 69 73 20 77 72 69 74 65 20 72 65  of this write re
13a70 71 75 65 73 74 20 61 73 20 70 6f 73 73 69 62 6c  quest as possibl
13a80 65 20 62 79 20 74 72 61 6e 73 66 65 72 69 6e 67  e by transfering
13a90 0a 20 20 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20  .  ** data from 
13aa0 74 68 65 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69  the memory mappi
13ab0 6e 67 20 75 73 69 6e 67 20 6d 65 6d 63 70 79 28  ng using memcpy(
13ac0 29 2e 20 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66  ).  */.  if( off
13ad0 73 65 74 3c 70 46 69 6c 65 2d 3e 6d 6d 61 70 53  set<pFile->mmapS
13ae0 69 7a 65 20 29 7b 0a 20 20 20 20 69 66 28 20 6f  ize ){.    if( o
13af0 66 66 73 65 74 2b 61 6d 74 20 3c 3d 20 70 46 69  ffset+amt <= pFi
13b00 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a  le->mmapSize ){.
13b10 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 28 28        memcpy(&((
13b20 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61  u8 *)(pFile->pMa
13b30 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74  pRegion))[offset
13b40 5d 2c 20 70 42 75 66 2c 20 61 6d 74 29 3b 0a 20  ], pBuf, amt);. 
13b50 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 57       OSTRACE(("W
13b60 52 49 54 45 2d 4d 4d 41 50 20 66 69 6c 65 3d 25  RITE-MMAP file=%
13b70 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c  p, rc=SQLITE_OK\
13b80 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  n", pFile->h));.
13b90 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
13ba0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73  ITE_OK;.    }els
13bb0 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6f  e{.      int nCo
13bc0 70 79 20 3d 20 28 69 6e 74 29 28 70 46 69 6c 65  py = (int)(pFile
13bd0 2d 3e 6d 6d 61 70 53 69 7a 65 20 2d 20 6f 66 66  ->mmapSize - off
13be0 73 65 74 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  set);.      memc
13bf0 70 79 28 26 28 28 75 38 20 2a 29 28 70 46 69 6c  py(&((u8 *)(pFil
13c00 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b  e->pMapRegion))[
13c10 6f 66 66 73 65 74 5d 2c 20 70 42 75 66 2c 20 6e  offset], pBuf, n
13c20 43 6f 70 79 29 3b 0a 20 20 20 20 20 20 70 42 75  Copy);.      pBu
13c30 66 20 3d 20 26 28 28 75 38 20 2a 29 70 42 75 66  f = &((u8 *)pBuf
13c40 29 5b 6e 43 6f 70 79 5d 3b 0a 20 20 20 20 20 20  )[nCopy];.      
13c50 61 6d 74 20 2d 3d 20 6e 43 6f 70 79 3b 0a 20 20  amt -= nCopy;.  
13c60 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 6e 43      offset += nC
13c70 6f 70 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  opy;.    }.  }.#
13c80 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54  endif..#if SQLIT
13c90 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 72 63 20  E_OS_WINCE.  rc 
13ca0 3d 20 77 69 6e 53 65 65 6b 46 69 6c 65 28 70 46  = winSeekFile(pF
13cb0 69 6c 65 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20  ile, offset);.  
13cc0 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 23 65 6c  if( rc==0 ){.#el
13cd0 73 65 0a 20 20 7b 0a 23 65 6e 64 69 66 0a 23 69  se.  {.#endif.#i
13ce0 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
13cf0 43 45 0a 20 20 20 20 4f 56 45 52 4c 41 50 50 45  CE.    OVERLAPPE
13d00 44 20 6f 76 65 72 6c 61 70 70 65 64 3b 20 20 20  D overlapped;   
13d10 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 66 66 73       /* The offs
13d20 65 74 20 66 6f 72 20 57 72 69 74 65 46 69 6c 65  et for WriteFile
13d30 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 20 20  . */.#endif.    
13d40 75 38 20 2a 61 52 65 6d 20 3d 20 28 75 38 20 2a  u8 *aRem = (u8 *
13d50 29 70 42 75 66 3b 20 20 20 20 20 20 20 20 2f 2a  )pBuf;        /*
13d60 20 44 61 74 61 20 79 65 74 20 74 6f 20 62 65 20   Data yet to be 
13d70 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 20 20 69  written */.    i
13d80 6e 74 20 6e 52 65 6d 20 3d 20 61 6d 74 3b 20 20  nt nRem = amt;  
13d90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13da0 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
13db0 79 65 74 20 74 6f 20 62 65 20 77 72 69 74 74 65  yet to be writte
13dc0 6e 20 2a 2f 0a 20 20 20 20 44 57 4f 52 44 20 6e  n */.    DWORD n
13dd0 57 72 69 74 65 3b 20 20 20 20 20 20 20 20 20 20  Write;          
13de0 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
13df0 77 72 69 74 74 65 6e 20 62 79 20 65 61 63 68 20  written by each 
13e00 57 72 69 74 65 46 69 6c 65 28 29 20 63 61 6c 6c  WriteFile() call
13e10 20 2a 2f 0a 20 20 20 20 44 57 4f 52 44 20 6c 61   */.    DWORD la
13e20 73 74 45 72 72 6e 6f 20 3d 20 4e 4f 5f 45 52 52  stErrno = NO_ERR
13e30 4f 52 3b 20 20 20 2f 2a 20 56 61 6c 75 65 20 72  OR;   /* Value r
13e40 65 74 75 72 6e 65 64 20 62 79 20 47 65 74 4c 61  eturned by GetLa
13e50 73 74 45 72 72 6f 72 28 29 20 2a 2f 0a 0a 23 69  stError() */..#i
13e60 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
13e70 43 45 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 6f  CE.    memset(&o
13e80 76 65 72 6c 61 70 70 65 64 2c 20 30 2c 20 73 69  verlapped, 0, si
13e90 7a 65 6f 66 28 4f 56 45 52 4c 41 50 50 45 44 29  zeof(OVERLAPPED)
13ea0 29 3b 0a 20 20 20 20 6f 76 65 72 6c 61 70 70 65  );.    overlappe
13eb0 64 2e 4f 66 66 73 65 74 20 3d 20 28 4c 4f 4e 47  d.Offset = (LONG
13ec0 29 28 6f 66 66 73 65 74 20 26 20 30 78 66 66 66  )(offset & 0xfff
13ed0 66 66 66 66 66 29 3b 0a 20 20 20 20 6f 76 65 72  fffff);.    over
13ee0 6c 61 70 70 65 64 2e 4f 66 66 73 65 74 48 69 67  lapped.OffsetHig
13ef0 68 20 3d 20 28 4c 4f 4e 47 29 28 28 6f 66 66 73  h = (LONG)((offs
13f00 65 74 3e 3e 33 32 29 20 26 20 30 78 37 66 66 66  et>>32) & 0x7fff
13f10 66 66 66 66 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  ffff);.#endif.. 
13f20 20 20 20 77 68 69 6c 65 28 20 6e 52 65 6d 3e 30     while( nRem>0
13f30 20 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f   ){.#if SQLITE_O
13f40 53 5f 57 49 4e 43 45 0a 20 20 20 20 20 20 69 66  S_WINCE.      if
13f50 28 20 21 6f 73 57 72 69 74 65 46 69 6c 65 28 70  ( !osWriteFile(p
13f60 46 69 6c 65 2d 3e 68 2c 20 61 52 65 6d 2c 20 6e  File->h, aRem, n
13f70 52 65 6d 2c 20 26 6e 57 72 69 74 65 2c 20 30 29  Rem, &nWrite, 0)
13f80 20 29 7b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20   ){.#else.      
13f90 69 66 28 20 21 6f 73 57 72 69 74 65 46 69 6c 65  if( !osWriteFile
13fa0 28 70 46 69 6c 65 2d 3e 68 2c 20 61 52 65 6d 2c  (pFile->h, aRem,
13fb0 20 6e 52 65 6d 2c 20 26 6e 57 72 69 74 65 2c 20   nRem, &nWrite, 
13fc0 26 6f 76 65 72 6c 61 70 70 65 64 29 20 29 7b 0a  &overlapped) ){.
13fd0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 69  #endif.        i
13fe0 66 28 20 77 69 6e 52 65 74 72 79 49 6f 65 72 72  f( winRetryIoerr
13ff0 28 26 6e 52 65 74 72 79 2c 20 26 6c 61 73 74 45  (&nRetry, &lastE
14000 72 72 6e 6f 29 20 29 20 63 6f 6e 74 69 6e 75 65  rrno) ) continue
14010 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
14020 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
14030 73 73 65 72 74 28 20 6e 57 72 69 74 65 3d 3d 30  ssert( nWrite==0
14040 20 7c 7c 20 6e 57 72 69 74 65 3c 3d 28 44 57 4f   || nWrite<=(DWO
14050 52 44 29 6e 52 65 6d 20 29 3b 0a 20 20 20 20 20  RD)nRem );.     
14060 20 69 66 28 20 6e 57 72 69 74 65 3d 3d 30 20 7c   if( nWrite==0 |
14070 7c 20 6e 57 72 69 74 65 3e 28 44 57 4f 52 44 29  | nWrite>(DWORD)
14080 6e 52 65 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  nRem ){.        
14090 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
140a0 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
140b0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
140c0 20 20 20 7d 0a 23 69 66 20 21 53 51 4c 49 54 45     }.#if !SQLITE
140d0 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20 20 20  _OS_WINCE.      
140e0 6f 66 66 73 65 74 20 2b 3d 20 6e 57 72 69 74 65  offset += nWrite
140f0 3b 0a 20 20 20 20 20 20 6f 76 65 72 6c 61 70 70  ;.      overlapp
14100 65 64 2e 4f 66 66 73 65 74 20 3d 20 28 4c 4f 4e  ed.Offset = (LON
14110 47 29 28 6f 66 66 73 65 74 20 26 20 30 78 66 66  G)(offset & 0xff
14120 66 66 66 66 66 66 29 3b 0a 20 20 20 20 20 20 6f  ffffff);.      o
14130 76 65 72 6c 61 70 70 65 64 2e 4f 66 66 73 65 74  verlapped.Offset
14140 48 69 67 68 20 3d 20 28 4c 4f 4e 47 29 28 28 6f  High = (LONG)((o
14150 66 66 73 65 74 3e 3e 33 32 29 20 26 20 30 78 37  ffset>>32) & 0x7
14160 66 66 66 66 66 66 66 29 3b 0a 23 65 6e 64 69 66  fffffff);.#endif
14170 0a 20 20 20 20 20 20 61 52 65 6d 20 2b 3d 20 6e  .      aRem += n
14180 57 72 69 74 65 3b 0a 20 20 20 20 20 20 6e 52 65  Write;.      nRe
14190 6d 20 2d 3d 20 6e 57 72 69 74 65 3b 0a 20 20 20  m -= nWrite;.   
141a0 20 7d 0a 20 20 20 20 69 66 28 20 6e 52 65 6d 3e   }.    if( nRem>
141b0 30 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  0 ){.      pFile
141c0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61  ->lastErrno = la
141d0 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72  stErrno;.      r
141e0 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  c = 1;.    }.  }
141f0 0a 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ..  if( rc ){.  
14200 20 20 69 66 28 20 20 20 28 20 70 46 69 6c 65 2d    if(   ( pFile-
14210 3e 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f  >lastErrno==ERRO
14220 52 5f 48 41 4e 44 4c 45 5f 44 49 53 4b 5f 46 55  R_HANDLE_DISK_FU
14230 4c 4c 20 29 0a 20 20 20 20 20 20 20 7c 7c 20 28  LL ).       || (
14240 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
14250 6f 3d 3d 45 52 52 4f 52 5f 44 49 53 4b 5f 46 55  o==ERROR_DISK_FU
14260 4c 4c 20 29 29 7b 0a 20 20 20 20 20 20 4f 53 54  LL )){.      OST
14270 52 41 43 45 28 28 22 57 52 49 54 45 20 66 69 6c  RACE(("WRITE fil
14280 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%p, rc=SQLITE_
14290 46 55 4c 4c 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  FULL\n", pFile->
142a0 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  h));.      retur
142b0 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  n winLogError(SQ
142c0 4c 49 54 45 5f 46 55 4c 4c 2c 20 70 46 69 6c 65  LITE_FULL, pFile
142d0 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20  ->lastErrno,.   
142e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
142f0 20 20 20 20 20 20 22 77 69 6e 57 72 69 74 65 31        "winWrite1
14300 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
14310 3b 0a 20 20 20 20 7d 0a 20 20 20 20 4f 53 54 52  ;.    }.    OSTR
14320 41 43 45 28 28 22 57 52 49 54 45 20 66 69 6c 65  ACE(("WRITE file
14330 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49  =%p, rc=SQLITE_I
14340 4f 45 52 52 5f 57 52 49 54 45 5c 6e 22 2c 20 70  OERR_WRITE\n", p
14350 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72  File->h));.    r
14360 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f  eturn winLogErro
14370 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57  r(SQLITE_IOERR_W
14380 52 49 54 45 2c 20 70 46 69 6c 65 2d 3e 6c 61 73  RITE, pFile->las
14390 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
143a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
143b0 77 69 6e 57 72 69 74 65 32 22 2c 20 70 46 69 6c  winWrite2", pFil
143c0 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 65 6c  e->zPath);.  }el
143d0 73 65 7b 0a 20 20 20 20 77 69 6e 4c 6f 67 49 6f  se{.    winLogIo
143e0 65 72 72 28 6e 52 65 74 72 79 29 3b 0a 20 20 7d  err(nRetry);.  }
143f0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 57 52 49  .  OSTRACE(("WRI
14400 54 45 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53  TE file=%p, rc=S
14410 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69  QLITE_OK\n", pFi
14420 6c 65 2d 3e 68 29 29 3b 0a 20 20 72 65 74 75 72  le->h));.  retur
14430 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
14440 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 61  /*.** Truncate a
14450 6e 20 6f 70 65 6e 20 66 69 6c 65 20 74 6f 20 61  n open file to a
14460 20 73 70 65 63 69 66 69 65 64 20 73 69 7a 65 0a   specified size.
14470 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
14480 6e 54 72 75 6e 63 61 74 65 28 73 71 6c 69 74 65  nTruncate(sqlite
14490 33 5f 66 69 6c 65 20 2a 69 64 2c 20 73 71 6c 69  3_file *id, sqli
144a0 74 65 33 5f 69 6e 74 36 34 20 6e 42 79 74 65 29  te3_int64 nByte)
144b0 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69  {.  winFile *pFi
144c0 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69  le = (winFile*)i
144d0 64 3b 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64  d;  /* File hand
144e0 6c 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  le object */.  i
144f0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
14500 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  K;             /
14510 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66 6f  * Return code fo
14520 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  r this function 
14530 2a 2f 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45  */.  DWORD lastE
14540 72 72 6e 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28  rrno;..  assert(
14550 20 70 46 69 6c 65 20 29 3b 0a 20 20 53 69 6d 75   pFile );.  Simu
14560 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75  lateIOError(retu
14570 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
14580 54 52 55 4e 43 41 54 45 29 3b 0a 20 20 4f 53 54  TRUNCATE);.  OST
14590 52 41 43 45 28 28 22 54 52 55 4e 43 41 54 45 20  RACE(("TRUNCATE 
145a0 66 69 6c 65 3d 25 70 2c 20 73 69 7a 65 3d 25 6c  file=%p, size=%l
145b0 6c 64 2c 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 0a  ld, lock=%d\n",.
145c0 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
145d0 2d 3e 68 2c 20 6e 42 79 74 65 2c 20 70 46 69 6c  ->h, nByte, pFil
145e0 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 0a  e->locktype));..
145f0 20 20 2f 2a 20 49 66 20 74 68 65 20 75 73 65 72    /* If the user
14600 20 68 61 73 20 63 6f 6e 66 69 67 75 72 65 64 20   has configured 
14610 61 20 63 68 75 6e 6b 2d 73 69 7a 65 20 66 6f 72  a chunk-size for
14620 20 74 68 69 73 20 66 69 6c 65 2c 20 74 72 75 6e   this file, trun
14630 63 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 66 69  cate the.  ** fi
14640 6c 65 20 73 6f 20 74 68 61 74 20 69 74 20 63 6f  le so that it co
14650 6e 73 69 73 74 73 20 6f 66 20 61 6e 20 69 6e 74  nsists of an int
14660 65 67 65 72 20 6e 75 6d 62 65 72 20 6f 66 20 63  eger number of c
14670 68 75 6e 6b 73 20 28 69 2e 65 2e 20 74 68 65 0a  hunks (i.e. the.
14680 20 20 2a 2a 20 61 63 74 75 61 6c 20 66 69 6c 65    ** actual file
14690 20 73 69 7a 65 20 61 66 74 65 72 20 74 68 65 20   size after the 
146a0 6f 70 65 72 61 74 69 6f 6e 20 6d 61 79 20 62 65  operation may be
146b0 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
146c0 20 72 65 71 75 65 73 74 65 64 0a 20 20 2a 2a 20   requested.  ** 
146d0 73 69 7a 65 29 2e 0a 20 20 2a 2f 0a 20 20 69 66  size)..  */.  if
146e0 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b  ( pFile->szChunk
146f0 3e 30 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20  >0 ){.    nByte 
14700 3d 20 28 28 6e 42 79 74 65 20 2b 20 70 46 69 6c  = ((nByte + pFil
14710 65 2d 3e 73 7a 43 68 75 6e 6b 20 2d 20 31 29 2f  e->szChunk - 1)/
14720 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 29 20  pFile->szChunk) 
14730 2a 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b  * pFile->szChunk
14740 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 45  ;.  }..  /* SetE
14750 6e 64 4f 66 46 69 6c 65 28 29 20 72 65 74 75 72  ndOfFile() retur
14760 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20 77 68 65 6e  ns non-zero when
14770 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20   successful, or 
14780 7a 65 72 6f 20 77 68 65 6e 20 69 74 20 66 61 69  zero when it fai
14790 6c 73 2e 20 2a 2f 0a 20 20 69 66 28 20 77 69 6e  ls. */.  if( win
147a0 53 65 65 6b 46 69 6c 65 28 70 46 69 6c 65 2c 20  SeekFile(pFile, 
147b0 6e 42 79 74 65 29 20 29 7b 0a 20 20 20 20 72 63  nByte) ){.    rc
147c0 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53   = winLogError(S
147d0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e  QLITE_IOERR_TRUN
147e0 43 41 54 45 2c 20 70 46 69 6c 65 2d 3e 6c 61 73  CATE, pFile->las
147f0 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
14800 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
14810 6e 54 72 75 6e 63 61 74 65 31 22 2c 20 70 46 69  nTruncate1", pFi
14820 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 65  le->zPath);.  }e
14830 6c 73 65 20 69 66 28 20 30 3d 3d 6f 73 53 65 74  lse if( 0==osSet
14840 45 6e 64 4f 66 46 69 6c 65 28 70 46 69 6c 65 2d  EndOfFile(pFile-
14850 3e 68 29 20 26 26 0a 20 20 20 20 20 20 20 20 20  >h) &&.         
14860 20 20 20 28 28 6c 61 73 74 45 72 72 6e 6f 20 3d     ((lastErrno =
14870 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
14880 29 29 21 3d 45 52 52 4f 52 5f 55 53 45 52 5f 4d  ))!=ERROR_USER_M
14890 41 50 50 45 44 5f 46 49 4c 45 29 20 29 7b 0a 20  APPED_FILE) ){. 
148a0 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
148b0 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b  rno = lastErrno;
148c0 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67  .    rc = winLog
148d0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
148e0 52 52 5f 54 52 55 4e 43 41 54 45 2c 20 70 46 69  RR_TRUNCATE, pFi
148f0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20  le->lastErrno,. 
14900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14910 20 20 20 20 22 77 69 6e 54 72 75 6e 63 61 74 65      "winTruncate
14920 32 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  2", pFile->zPath
14930 29 3b 0a 20 20 7d 0a 0a 23 69 66 20 53 51 4c 49  );.  }..#if SQLI
14940 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
14950 3e 30 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 66  >0.  /* If the f
14960 69 6c 65 20 77 61 73 20 74 72 75 6e 63 61 74 65  ile was truncate
14970 64 20 74 6f 20 61 20 73 69 7a 65 20 73 6d 61 6c  d to a size smal
14980 6c 65 72 20 74 68 61 6e 20 74 68 65 20 63 75 72  ler than the cur
14990 72 65 6e 74 6c 79 0a 20 20 2a 2a 20 6d 61 70 70  rently.  ** mapp
149a0 65 64 20 72 65 67 69 6f 6e 2c 20 72 65 64 75 63  ed region, reduc
149b0 65 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20  e the effective 
149c0 6d 61 70 70 69 6e 67 20 73 69 7a 65 20 61 73 20  mapping size as 
149d0 77 65 6c 6c 2e 20 53 51 4c 69 74 65 20 77 69 6c  well. SQLite wil
149e0 6c 0a 20 20 2a 2a 20 75 73 65 20 72 65 61 64 28  l.  ** use read(
149f0 29 20 61 6e 64 20 77 72 69 74 65 28 29 20 74 6f  ) and write() to
14a00 20 61 63 63 65 73 73 20 64 61 74 61 20 62 65 79   access data bey
14a10 6f 6e 64 20 74 68 69 73 20 70 6f 69 6e 74 20 66  ond this point f
14a20 72 6f 6d 20 6e 6f 77 20 6f 6e 2e 0a 20 20 2a 2f  rom now on..  */
14a30 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 4d  .  if( pFile->pM
14a40 61 70 52 65 67 69 6f 6e 20 26 26 20 6e 42 79 74  apRegion && nByt
14a50 65 3c 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a  e<pFile->mmapSiz
14a60 65 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  e ){.    pFile->
14a70 6d 6d 61 70 53 69 7a 65 20 3d 20 6e 42 79 74 65  mmapSize = nByte
14a80 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
14a90 4f 53 54 52 41 43 45 28 28 22 54 52 55 4e 43 41  OSTRACE(("TRUNCA
14aa0 54 45 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 25  TE file=%p, rc=%
14ab0 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  s\n", pFile->h, 
14ac0 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72  sqlite3ErrName(r
14ad0 63 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  c)));.  return r
14ae0 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  c;.}..#ifdef SQL
14af0 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 43  ITE_TEST./*.** C
14b00 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20  ount the number 
14b10 6f 66 20 66 75 6c 6c 73 79 6e 63 73 20 61 6e 64  of fullsyncs and
14b20 20 6e 6f 72 6d 61 6c 20 73 79 6e 63 73 2e 20 20   normal syncs.  
14b30 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20  This is used to 
14b40 74 65 73 74 0a 2a 2a 20 74 68 61 74 20 73 79 6e  test.** that syn
14b50 63 73 20 61 6e 64 20 66 75 6c 6c 73 79 6e 63 73  cs and fullsyncs
14b60 20 61 72 65 20 6f 63 63 75 72 69 6e 67 20 61 74   are occuring at
14b70 20 74 68 65 20 72 69 67 68 74 20 74 69 6d 65 73   the right times
14b80 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
14b90 5f 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b  _sync_count = 0;
14ba0 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 66 75 6c  .int sqlite3_ful
14bb0 6c 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b  lsync_count = 0;
14bc0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d  .#endif../*.** M
14bd0 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 77 72 69  ake sure all wri
14be0 74 65 73 20 74 6f 20 61 20 70 61 72 74 69 63 75  tes to a particu
14bf0 6c 61 72 20 66 69 6c 65 20 61 72 65 20 63 6f 6d  lar file are com
14c00 6d 69 74 74 65 64 20 74 6f 20 64 69 73 6b 2e 0a  mitted to disk..
14c10 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
14c20 6e 53 79 6e 63 28 73 71 6c 69 74 65 33 5f 66 69  nSync(sqlite3_fi
14c30 6c 65 20 2a 69 64 2c 20 69 6e 74 20 66 6c 61 67  le *id, int flag
14c40 73 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  s){.#ifndef SQLI
14c50 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 2f 2a 0a  TE_NO_SYNC.  /*.
14c60 20 20 2a 2a 20 55 73 65 64 20 6f 6e 6c 79 20 77    ** Used only w
14c70 68 65 6e 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  hen SQLITE_NO_SY
14c80 4e 43 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65  NC is not define
14c90 64 2e 0a 20 20 20 2a 2f 0a 20 20 42 4f 4f 4c 20  d..   */.  BOOL 
14ca0 72 63 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21  rc;.#endif.#if !
14cb0 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20  defined(NDEBUG) 
14cc0 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
14cd0 54 45 5f 4e 4f 5f 53 59 4e 43 29 20 7c 7c 20 5c  TE_NO_SYNC) || \
14ce0 0a 20 20 20 20 28 64 65 66 69 6e 65 64 28 53 51  .    (defined(SQ
14cf0 4c 49 54 45 5f 54 45 53 54 29 20 26 26 20 64 65  LITE_TEST) && de
14d00 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
14d10 55 47 29 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 55  UG)).  /*.  ** U
14d20 73 65 64 20 77 68 65 6e 20 53 51 4c 49 54 45 5f  sed when SQLITE_
14d30 4e 4f 5f 53 59 4e 43 20 69 73 20 6e 6f 74 20 64  NO_SYNC is not d
14d40 65 66 69 6e 65 64 20 61 6e 64 20 62 79 20 74 68  efined and by th
14d50 65 20 61 73 73 65 72 74 28 29 20 61 6e 64 2f 6f  e assert() and/o
14d60 72 0a 20 20 2a 2a 20 4f 53 54 52 41 43 45 28 29  r.  ** OSTRACE()
14d70 20 6d 61 63 72 6f 73 2e 0a 20 20 20 2a 2f 0a 20   macros..   */. 
14d80 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20   winFile *pFile 
14d90 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a  = (winFile*)id;.
14da0 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50  #else.  UNUSED_P
14db0 41 52 41 4d 45 54 45 52 28 69 64 29 3b 0a 23 65  ARAMETER(id);.#e
14dc0 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
14dd0 70 46 69 6c 65 20 29 3b 0a 20 20 2f 2a 20 43 68  pFile );.  /* Ch
14de0 65 63 6b 20 74 68 61 74 20 6f 6e 65 20 6f 66 20  eck that one of 
14df0 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
14e00 41 4c 20 6f 72 20 46 55 4c 4c 20 77 61 73 20 70  AL or FULL was p
14e10 61 73 73 65 64 20 2a 2f 0a 20 20 61 73 73 65 72  assed */.  asser
14e20 74 28 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d  t((flags&0x0F)==
14e30 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
14e40 41 4c 0a 20 20 20 20 20 20 7c 7c 20 28 66 6c 61  AL.      || (fla
14e50 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45  gs&0x0F)==SQLITE
14e60 5f 53 59 4e 43 5f 46 55 4c 4c 0a 20 20 29 3b 0a  _SYNC_FULL.  );.
14e70 0a 20 20 2f 2a 20 55 6e 69 78 20 63 61 6e 6e 6f  .  /* Unix canno
14e80 74 2c 20 62 75 74 20 73 6f 6d 65 20 73 79 73 74  t, but some syst
14e90 65 6d 73 20 6d 61 79 20 72 65 74 75 72 6e 20 53  ems may return S
14ea0 51 4c 49 54 45 5f 46 55 4c 4c 20 66 72 6f 6d 20  QLITE_FULL from 
14eb0 68 65 72 65 2e 20 54 68 69 73 0a 20 20 2a 2a 20  here. This.  ** 
14ec0 6c 69 6e 65 20 69 73 20 74 6f 20 74 65 73 74 20  line is to test 
14ed0 74 68 61 74 20 64 6f 69 6e 67 20 73 6f 20 64 6f  that doing so do
14ee0 65 73 20 6e 6f 74 20 63 61 75 73 65 20 61 6e 79  es not cause any
14ef0 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 2a 2f 0a   problems..  */.
14f00 20 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75    SimulateDiskfu
14f10 6c 6c 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  llError( return 
14f20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 3b 0a 0a  SQLITE_FULL );..
14f30 20 20 4f 53 54 52 41 43 45 28 28 22 53 59 4e 43    OSTRACE(("SYNC
14f40 20 66 69 6c 65 3d 25 70 2c 20 66 6c 61 67 73 3d   file=%p, flags=
14f50 25 78 2c 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 0a  %x, lock=%d\n",.
14f60 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
14f70 2d 3e 68 2c 20 66 6c 61 67 73 2c 20 70 46 69 6c  ->h, flags, pFil
14f80 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 0a  e->locktype));..
14f90 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 54  #ifndef SQLITE_T
14fa0 45 53 54 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  EST.  UNUSED_PAR
14fb0 41 4d 45 54 45 52 28 66 6c 61 67 73 29 3b 0a 23  AMETER(flags);.#
14fc0 65 6c 73 65 0a 20 20 69 66 28 20 28 66 6c 61 67  else.  if( (flag
14fd0 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f  s&0x0F)==SQLITE_
14fe0 53 59 4e 43 5f 46 55 4c 4c 20 29 7b 0a 20 20 20  SYNC_FULL ){.   
14ff0 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e   sqlite3_fullsyn
15000 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 20 20 7d 0a 20  c_count++;.  }. 
15010 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f   sqlite3_sync_co
15020 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20  unt++;.#endif.. 
15030 20 2f 2a 20 49 66 20 77 65 20 63 6f 6d 70 69 6c   /* If we compil
15040 65 64 20 77 69 74 68 20 74 68 65 20 53 51 4c 49  ed with the SQLI
15050 54 45 5f 4e 4f 5f 53 59 4e 43 20 66 6c 61 67 2c  TE_NO_SYNC flag,
15060 20 74 68 65 6e 20 73 79 6e 63 69 6e 67 20 69 73   then syncing is
15070 20 61 0a 20 20 2a 2a 20 6e 6f 2d 6f 70 0a 20 20   a.  ** no-op.  
15080 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
15090 5f 4e 4f 5f 53 59 4e 43 0a 20 20 4f 53 54 52 41  _NO_SYNC.  OSTRA
150a0 43 45 28 28 22 53 59 4e 43 2d 4e 4f 50 20 66 69  CE(("SYNC-NOP fi
150b0 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
150c0 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  _OK\n", pFile->h
150d0 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ));.  return SQL
150e0 49 54 45 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 20 20  ITE_OK;.#else.  
150f0 72 63 20 3d 20 6f 73 46 6c 75 73 68 46 69 6c 65  rc = osFlushFile
15100 42 75 66 66 65 72 73 28 70 46 69 6c 65 2d 3e 68  Buffers(pFile->h
15110 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  );.  SimulateIOE
15120 72 72 6f 72 28 20 72 63 3d 46 41 4c 53 45 20 29  rror( rc=FALSE )
15130 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
15140 20 20 4f 53 54 52 41 43 45 28 28 22 53 59 4e 43    OSTRACE(("SYNC
15150 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c   file=%p, rc=SQL
15160 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65  ITE_OK\n", pFile
15170 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75 72  ->h));.    retur
15180 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
15190 65 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d  else{.    pFile-
151a0 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47  >lastErrno = osG
151b0 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
151c0 20 20 20 4f 53 54 52 41 43 45 28 28 22 53 59 4e     OSTRACE(("SYN
151d0 43 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51  C file=%p, rc=SQ
151e0 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43  LITE_IOERR_FSYNC
151f0 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  \n", pFile->h));
15200 0a 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c  .    return winL
15210 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
15220 4f 45 52 52 5f 46 53 59 4e 43 2c 20 70 46 69 6c  OERR_FSYNC, pFil
15230 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20  e->lastErrno,.  
15240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15250 20 20 20 20 20 22 77 69 6e 53 79 6e 63 22 2c 20       "winSync", 
15260 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
15270 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a   }.#endif.}../*.
15280 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65  ** Determine the
15290 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66   current size of
152a0 20 61 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73   a file in bytes
152b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
152c0 69 6e 46 69 6c 65 53 69 7a 65 28 73 71 6c 69 74  inFileSize(sqlit
152d0 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 73 71 6c  e3_file *id, sql
152e0 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 53 69 7a  ite3_int64 *pSiz
152f0 65 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70  e){.  winFile *p
15300 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a  File = (winFile*
15310 29 69 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  )id;.  int rc = 
15320 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73  SQLITE_OK;..  as
15330 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20  sert( id!=0 );. 
15340 20 61 73 73 65 72 74 28 20 70 53 69 7a 65 21 3d   assert( pSize!=
15350 30 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49  0 );.  SimulateI
15360 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51  OError(return SQ
15370 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54  LITE_IOERR_FSTAT
15380 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53  );.  OSTRACE(("S
15390 49 5a 45 20 66 69 6c 65 3d 25 70 2c 20 70 53 69  IZE file=%p, pSi
153a0 7a 65 3d 25 70 5c 6e 22 2c 20 70 46 69 6c 65 2d  ze=%p\n", pFile-
153b0 3e 68 2c 20 70 53 69 7a 65 29 29 3b 0a 0a 23 69  >h, pSize));..#i
153c0 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
153d0 54 0a 20 20 7b 0a 20 20 20 20 46 49 4c 45 5f 53  T.  {.    FILE_S
153e0 54 41 4e 44 41 52 44 5f 49 4e 46 4f 20 69 6e 66  TANDARD_INFO inf
153f0 6f 3b 0a 20 20 20 20 69 66 28 20 6f 73 47 65 74  o;.    if( osGet
15400 46 69 6c 65 49 6e 66 6f 72 6d 61 74 69 6f 6e 42  FileInformationB
15410 79 48 61 6e 64 6c 65 45 78 28 70 46 69 6c 65 2d  yHandleEx(pFile-
15420 3e 68 2c 20 46 69 6c 65 53 74 61 6e 64 61 72 64  >h, FileStandard
15430 49 6e 66 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  Info,.          
15440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15450 20 20 20 20 20 20 20 20 20 20 20 26 69 6e 66 6f             &info
15460 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 20  , sizeof(info)) 
15470 29 7b 0a 20 20 20 20 20 20 2a 70 53 69 7a 65 20  ){.      *pSize 
15480 3d 20 69 6e 66 6f 2e 45 6e 64 4f 66 46 69 6c 65  = info.EndOfFile
15490 2e 51 75 61 64 50 61 72 74 3b 0a 20 20 20 20 7d  .QuadPart;.    }
154a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 46 69 6c  else{.      pFil
154b0 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f  e->lastErrno = o
154c0 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b  sGetLastError();
154d0 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c  .      rc = winL
154e0 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
154f0 4f 45 52 52 5f 46 53 54 41 54 2c 20 70 46 69 6c  OERR_FSTAT, pFil
15500 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20  e->lastErrno,.  
15510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15520 20 20 20 20 20 22 77 69 6e 46 69 6c 65 53 69 7a       "winFileSiz
15530 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  e", pFile->zPath
15540 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c  );.    }.  }.#el
15550 73 65 0a 20 20 7b 0a 20 20 20 20 44 57 4f 52 44  se.  {.    DWORD
15560 20 75 70 70 65 72 42 69 74 73 3b 0a 20 20 20 20   upperBits;.    
15570 44 57 4f 52 44 20 6c 6f 77 65 72 42 69 74 73 3b  DWORD lowerBits;
15580 0a 20 20 20 20 44 57 4f 52 44 20 6c 61 73 74 45  .    DWORD lastE
15590 72 72 6e 6f 3b 0a 0a 20 20 20 20 6c 6f 77 65 72  rrno;..    lower
155a0 42 69 74 73 20 3d 20 6f 73 47 65 74 46 69 6c 65  Bits = osGetFile
155b0 53 69 7a 65 28 70 46 69 6c 65 2d 3e 68 2c 20 26  Size(pFile->h, &
155c0 75 70 70 65 72 42 69 74 73 29 3b 0a 20 20 20 20  upperBits);.    
155d0 2a 70 53 69 7a 65 20 3d 20 28 28 28 73 71 6c 69  *pSize = (((sqli
155e0 74 65 33 5f 69 6e 74 36 34 29 75 70 70 65 72 42  te3_int64)upperB
155f0 69 74 73 29 3c 3c 33 32 29 20 2b 20 6c 6f 77 65  its)<<32) + lowe
15600 72 42 69 74 73 3b 0a 20 20 20 20 69 66 28 20 20  rBits;.    if(  
15610 20 28 6c 6f 77 65 72 42 69 74 73 20 3d 3d 20 49   (lowerBits == I
15620 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 53 49 5a 45  NVALID_FILE_SIZE
15630 29 0a 20 20 20 20 20 20 20 26 26 20 28 28 6c 61  ).       && ((la
15640 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
15650 61 73 74 45 72 72 6f 72 28 29 29 21 3d 4e 4f 5f  astError())!=NO_
15660 45 52 52 4f 52 29 20 29 7b 0a 20 20 20 20 20 20  ERROR) ){.      
15670 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
15680 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20   = lastErrno;.  
15690 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45      rc = winLogE
156a0 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
156b0 52 5f 46 53 54 41 54 2c 20 70 46 69 6c 65 2d 3e  R_FSTAT, pFile->
156c0 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  lastErrno,.     
156d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
156e0 20 20 22 77 69 6e 46 69 6c 65 53 69 7a 65 22 2c    "winFileSize",
156f0 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
15700 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
15710 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 49 5a  .  OSTRACE(("SIZ
15720 45 20 66 69 6c 65 3d 25 70 2c 20 70 53 69 7a 65  E file=%p, pSize
15730 3d 25 70 2c 20 2a 70 53 69 7a 65 3d 25 6c 6c 64  =%p, *pSize=%lld
15740 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20  , rc=%s\n",.    
15750 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c         pFile->h,
15760 20 70 53 69 7a 65 2c 20 2a 70 53 69 7a 65 2c 20   pSize, *pSize, 
15770 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72  sqlite3ErrName(r
15780 63 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  c)));.  return r
15790 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 4f 43 4b  c;.}../*.** LOCK
157a0 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49  FILE_FAIL_IMMEDI
157b0 41 54 45 4c 59 20 69 73 20 75 6e 64 65 66 69 6e  ATELY is undefin
157c0 65 64 20 6f 6e 20 73 6f 6d 65 20 57 69 6e 64 6f  ed on some Windo
157d0 77 73 20 73 79 73 74 65 6d 73 2e 0a 2a 2f 0a 23  ws systems..*/.#
157e0 69 66 6e 64 65 66 20 4c 4f 43 4b 46 49 4c 45 5f  ifndef LOCKFILE_
157f0 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59  FAIL_IMMEDIATELY
15800 0a 23 20 64 65 66 69 6e 65 20 4c 4f 43 4b 46 49  .# define LOCKFI
15810 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54  LE_FAIL_IMMEDIAT
15820 45 4c 59 20 31 0a 23 65 6e 64 69 66 0a 0a 23 69  ELY 1.#endif..#i
15830 66 6e 64 65 66 20 4c 4f 43 4b 46 49 4c 45 5f 45  fndef LOCKFILE_E
15840 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 23 20  XCLUSIVE_LOCK.# 
15850 64 65 66 69 6e 65 20 4c 4f 43 4b 46 49 4c 45 5f  define LOCKFILE_
15860 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 32  EXCLUSIVE_LOCK 2
15870 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 48  .#endif../*.** H
15880 69 73 74 6f 72 69 63 61 6c 6c 79 2c 20 53 51 4c  istorically, SQL
15890 69 74 65 20 68 61 73 20 75 73 65 64 20 62 6f 74  ite has used bot
158a0 68 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 20 61  h the LockFile a
158b0 6e 64 20 4c 6f 63 6b 46 69 6c 65 45 78 20 66 75  nd LockFileEx fu
158c0 6e 63 74 69 6f 6e 73 2e 0a 2a 2a 20 57 68 65 6e  nctions..** When
158d0 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 20 66 75   the LockFile fu
158e0 6e 63 74 69 6f 6e 20 77 61 73 20 75 73 65 64 2c  nction was used,
158f0 20 69 74 20 77 61 73 20 61 6c 77 61 79 73 20 65   it was always e
15900 78 70 65 63 74 65 64 20 74 6f 20 66 61 69 6c 0a  xpected to fail.
15910 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 69  ** immediately i
15920 66 20 74 68 65 20 6c 6f 63 6b 20 63 6f 75 6c 64  f the lock could
15930 20 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64   not be obtained
15940 2e 20 20 41 6c 73 6f 2c 20 69 74 20 61 6c 77 61  .  Also, it alwa
15950 79 73 20 65 78 70 65 63 74 65 64 20 74 6f 0a 2a  ys expected to.*
15960 2a 20 6f 62 74 61 69 6e 20 61 6e 20 65 78 63 6c  * obtain an excl
15970 75 73 69 76 65 20 6c 6f 63 6b 2e 20 20 54 68 65  usive lock.  The
15980 73 65 20 66 6c 61 67 73 20 61 72 65 20 75 73 65  se flags are use
15990 64 20 77 69 74 68 20 74 68 65 20 4c 6f 63 6b 46  d with the LockF
159a0 69 6c 65 45 78 20 66 75 6e 63 74 69 6f 6e 0a 2a  ileEx function.*
159b0 2a 20 61 6e 64 20 72 65 66 6c 65 63 74 20 74 68  * and reflect th
159c0 6f 73 65 20 65 78 70 65 63 74 61 74 69 6f 6e 73  ose expectations
159d0 3b 20 74 68 65 72 65 66 6f 72 65 2c 20 74 68 65  ; therefore, the
159e0 79 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20  y should not be 
159f0 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 23 69 66 6e  changed..*/.#ifn
15a00 64 65 66 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46  def SQLITE_LOCKF
15a10 49 4c 45 5f 46 4c 41 47 53 0a 23 20 64 65 66 69  ILE_FLAGS.# defi
15a20 6e 65 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49  ne SQLITE_LOCKFI
15a30 4c 45 5f 46 4c 41 47 53 20 20 20 28 4c 4f 43 4b  LE_FLAGS   (LOCK
15a40 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49  FILE_FAIL_IMMEDI
15a50 41 54 45 4c 59 20 7c 20 5c 0a 20 20 20 20 20 20  ATELY | \.      
15a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15a70 20 20 20 20 20 20 20 20 20 20 20 20 4c 4f 43 4b              LOCK
15a80 46 49 4c 45 5f 45 58 43 4c 55 53 49 56 45 5f 4c  FILE_EXCLUSIVE_L
15a90 4f 43 4b 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  OCK).#endif../*.
15aa0 2a 2a 20 43 75 72 72 65 6e 74 6c 79 2c 20 53 51  ** Currently, SQ
15ab0 4c 69 74 65 20 6e 65 76 65 72 20 63 61 6c 6c 73  Lite never calls
15ac0 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 45 78 20   the LockFileEx 
15ad0 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 6f 75 74  function without
15ae0 20 77 61 6e 74 69 6e 67 20 74 68 65 0a 2a 2a 20   wanting the.** 
15af0 63 61 6c 6c 20 74 6f 20 66 61 69 6c 20 69 6d 6d  call to fail imm
15b00 65 64 69 61 74 65 6c 79 20 69 66 20 74 68 65 20  ediately if the 
15b10 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20 62 65 20 6f  lock cannot be o
15b20 62 74 61 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66 6e  btained..*/.#ifn
15b30 64 65 66 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46  def SQLITE_LOCKF
15b40 49 4c 45 45 58 5f 46 4c 41 47 53 0a 23 20 64 65  ILEEX_FLAGS.# de
15b50 66 69 6e 65 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  fine SQLITE_LOCK
15b60 46 49 4c 45 45 58 5f 46 4c 41 47 53 20 28 4c 4f  FILEEX_FLAGS (LO
15b70 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45  CKFILE_FAIL_IMME
15b80 44 49 41 54 45 4c 59 29 0a 23 65 6e 64 69 66 0a  DIATELY).#endif.
15b90 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61  ./*.** Acquire a
15ba0 20 72 65 61 64 65 72 20 6c 6f 63 6b 2e 0a 2a 2a   reader lock..**
15bb0 20 44 69 66 66 65 72 65 6e 74 20 41 50 49 20 72   Different API r
15bc0 6f 75 74 69 6e 65 73 20 61 72 65 20 63 61 6c 6c  outines are call
15bd0 65 64 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20  ed depending on 
15be0 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
15bf0 68 69 73 0a 2a 2a 20 69 73 20 57 69 6e 39 78 20  his.** is Win9x 
15c00 6f 72 20 57 69 6e 4e 54 2e 0a 2a 2f 0a 73 74 61  or WinNT..*/.sta
15c10 74 69 63 20 69 6e 74 20 77 69 6e 47 65 74 52 65  tic int winGetRe
15c20 61 64 4c 6f 63 6b 28 77 69 6e 46 69 6c 65 20 2a  adLock(winFile *
15c30 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20 72 65  pFile){.  int re
15c40 73 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52  s;.  OSTRACE(("R
15c50 45 41 44 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70  EAD-LOCK file=%p
15c60 2c 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20 70 46  , lock=%d\n", pF
15c70 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c  ile->h, pFile->l
15c80 6f 63 6b 74 79 70 65 29 29 3b 0a 20 20 69 66 28  ocktype));.  if(
15c90 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 23 69 66   osIsNT() ){.#if
15ca0 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
15cb0 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 4e  .    /*.    ** N
15cc0 4f 54 45 3a 20 57 69 6e 64 6f 77 73 20 43 45 20  OTE: Windows CE 
15cd0 69 73 20 68 61 6e 64 6c 65 64 20 64 69 66 66 65  is handled diffe
15ce0 72 65 6e 74 6c 79 20 68 65 72 65 20 64 75 65 20  rently here due 
15cf0 69 74 73 20 6c 61 63 6b 20 6f 66 20 74 68 65 20  its lack of the 
15d00 57 69 6e 33 32 0a 20 20 20 20 2a 2a 20 20 20 20  Win32.    **    
15d10 20 20 20 41 50 49 20 4c 6f 63 6b 46 69 6c 65 45     API LockFileE
15d20 78 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65  x..    */.    re
15d30 73 20 3d 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c  s = winceLockFil
15d40 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41  e(&pFile->h, SHA
15d50 52 45 44 5f 46 49 52 53 54 2c 20 30 2c 20 31 2c  RED_FIRST, 0, 1,
15d60 20 30 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 72   0);.#else.    r
15d70 65 73 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65  es = winLockFile
15d80 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49  (&pFile->h, SQLI
15d90 54 45 5f 4c 4f 43 4b 46 49 4c 45 45 58 5f 46 4c  TE_LOCKFILEEX_FL
15da0 41 47 53 2c 20 53 48 41 52 45 44 5f 46 49 52 53  AGS, SHARED_FIRS
15db0 54 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  T, 0,.          
15dc0 20 20 20 20 20 20 20 20 20 20 20 20 53 48 41 52              SHAR
15dd0 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 23 65 6e  ED_SIZE, 0);.#en
15de0 64 69 66 0a 20 20 7d 0a 23 69 66 64 65 66 20 53  dif.  }.#ifdef S
15df0 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
15e00 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20  ANSI.  else{.   
15e10 20 69 6e 74 20 6c 6b 3b 0a 20 20 20 20 73 71 6c   int lk;.    sql
15e20 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28  ite3_randomness(
15e30 73 69 7a 65 6f 66 28 6c 6b 29 2c 20 26 6c 6b 29  sizeof(lk), &lk)
15e40 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61  ;.    pFile->sha
15e50 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20 28 73  redLockByte = (s
15e60 68 6f 72 74 29 28 28 6c 6b 20 26 20 30 78 37 66  hort)((lk & 0x7f
15e70 66 66 66 66 66 66 29 25 28 53 48 41 52 45 44 5f  ffffff)%(SHARED_
15e80 53 49 5a 45 20 2d 20 31 29 29 3b 0a 20 20 20 20  SIZE - 1));.    
15e90 72 65 73 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c  res = winLockFil
15ea0 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c  e(&pFile->h, SQL
15eb0 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41  ITE_LOCKFILE_FLA
15ec0 47 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  GS,.            
15ed0 20 20 20 20 20 20 20 20 20 20 53 48 41 52 45 44            SHARED
15ee0 5f 46 49 52 53 54 2b 70 46 69 6c 65 2d 3e 73 68  _FIRST+pFile->sh
15ef0 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 30 2c  aredLockByte, 0,
15f00 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64   1, 0);.  }.#end
15f10 69 66 0a 20 20 69 66 28 20 72 65 73 20 3d 3d 20  if.  if( res == 
15f20 30 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  0 ){.    pFile->
15f30 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
15f40 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
15f50 20 20 2f 2a 20 4e 6f 20 6e 65 65 64 20 74 6f 20    /* No need to 
15f60 6c 6f 67 20 61 20 66 61 69 6c 75 72 65 20 74 6f  log a failure to
15f70 20 6c 6f 63 6b 20 2a 2f 0a 20 20 7d 0a 20 20 4f   lock */.  }.  O
15f80 53 54 52 41 43 45 28 28 22 52 45 41 44 2d 4c 4f  STRACE(("READ-LO
15f90 43 4b 20 66 69 6c 65 3d 25 70 2c 20 72 65 73 75  CK file=%p, resu
15fa0 6c 74 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d  lt=%d\n", pFile-
15fb0 3e 68 2c 20 72 65 73 29 29 3b 0a 20 20 72 65 74  >h, res));.  ret
15fc0 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn res;.}../*.*
15fd0 2a 20 55 6e 64 6f 20 61 20 72 65 61 64 6c 6f 63  * Undo a readloc
15fe0 6b 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  k.*/.static int 
15ff0 77 69 6e 55 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63  winUnlockReadLoc
16000 6b 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65  k(winFile *pFile
16010 29 7b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20  ){.  int res;.  
16020 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b  DWORD lastErrno;
16030 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52 45 41  .  OSTRACE(("REA
16040 44 2d 55 4e 4c 4f 43 4b 20 66 69 6c 65 3d 25 70  D-UNLOCK file=%p
16050 2c 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20 70 46  , lock=%d\n", pF
16060 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c  ile->h, pFile->l
16070 6f 63 6b 74 79 70 65 29 29 3b 0a 20 20 69 66 28  ocktype));.  if(
16080 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 20 20   osIsNT() ){.   
16090 20 72 65 73 20 3d 20 77 69 6e 55 6e 6c 6f 63 6b   res = winUnlock
160a0 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20  File(&pFile->h, 
160b0 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c  SHARED_FIRST, 0,
160c0 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29   SHARED_SIZE, 0)
160d0 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c  ;.  }.#ifdef SQL
160e0 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
160f0 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 72  SI.  else{.    r
16100 65 73 20 3d 20 77 69 6e 55 6e 6c 6f 63 6b 46 69  es = winUnlockFi
16110 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 48  le(&pFile->h, SH
16120 41 52 45 44 5f 46 49 52 53 54 2b 70 46 69 6c 65  ARED_FIRST+pFile
16130 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65  ->sharedLockByte
16140 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a  , 0, 1, 0);.  }.
16150 23 65 6e 64 69 66 0a 20 20 69 66 28 20 72 65 73  #endif.  if( res
16160 3d 3d 30 20 26 26 20 28 28 6c 61 73 74 45 72 72  ==0 && ((lastErr
16170 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
16180 72 6f 72 28 29 29 21 3d 45 52 52 4f 52 5f 4e 4f  ror())!=ERROR_NO
16190 54 5f 4c 4f 43 4b 45 44 29 20 29 7b 0a 20 20 20  T_LOCKED) ){.   
161a0 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
161b0 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20  o = lastErrno;. 
161c0 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53     winLogError(S
161d0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
161e0 43 4b 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  CK, pFile->lastE
161f0 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
16200 20 20 20 20 20 20 22 77 69 6e 55 6e 6c 6f 63 6b        "winUnlock
16210 52 65 61 64 4c 6f 63 6b 22 2c 20 70 46 69 6c 65  ReadLock", pFile
16220 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 20 20  ->zPath);.  }.  
16230 4f 53 54 52 41 43 45 28 28 22 52 45 41 44 2d 55  OSTRACE(("READ-U
16240 4e 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 72  NLOCK file=%p, r
16250 65 73 75 6c 74 3d 25 64 5c 6e 22 2c 20 70 46 69  esult=%d\n", pFi
16260 6c 65 2d 3e 68 2c 20 72 65 73 29 29 3b 0a 20 20  le->h, res));.  
16270 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f  return res;.}../
16280 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69  *.** Lock the fi
16290 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b  le with the lock
162a0 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61   specified by pa
162b0 72 61 6d 65 74 65 72 20 6c 6f 63 6b 74 79 70 65  rameter locktype
162c0 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65   - one.** of the
162d0 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
162e0 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44  *     (1) SHARED
162f0 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29  _LOCK.**     (2)
16300 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a   RESERVED_LOCK.*
16310 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e  *     (3) PENDIN
16320 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34  G_LOCK.**     (4
16330 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ) EXCLUSIVE_LOCK
16340 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73  .**.** Sometimes
16350 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67   when requesting
16360 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c   one lock state,
16370 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b   additional lock
16380 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69   states.** are i
16390 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65  nserted in betwe
163a0 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67  en.  The locking
163b0 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f   might fail on o
163c0 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a  ne of the later.
163d0 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c  ** transitions l
163e0 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20  eaving the lock 
163f0 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20  state different 
16400 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61  from what it sta
16410 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c  rted but.** stil
16420 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67  l short of its g
16430 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  oal.  The follow
16440 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20  ing chart shows 
16450 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74  the allowed.** t
16460 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74  ransitions and t
16470 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65  he inserted inte
16480 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a  rmediate states:
16490 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b  .**.**    UNLOCK
164a0 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20  ED -> SHARED.** 
164b0 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53     SHARED -> RES
164c0 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  ERVED.**    SHAR
164d0 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
164e0 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
164f0 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28     RESERVED -> (
16500 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
16510 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44  USIVE.**    PEND
16520 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  ING -> EXCLUSIVE
16530 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
16540 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e  ine will only in
16550 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20  crease a lock.  
16560 54 68 65 20 77 69 6e 55 6e 6c 6f 63 6b 28 29 20  The winUnlock() 
16570 72 6f 75 74 69 6e 65 0a 2a 2a 20 65 72 61 73 65  routine.** erase
16580 73 20 61 6c 6c 20 6c 6f 63 6b 73 20 61 74 20 6f  s all locks at o
16590 6e 63 65 20 61 6e 64 20 72 65 74 75 72 6e 73 20  nce and returns 
165a0 75 73 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74  us immediately t
165b0 6f 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  o locking level 
165c0 30 2e 0a 2a 2a 20 49 74 20 69 73 20 6e 6f 74 20  0..** It is not 
165d0 70 6f 73 73 69 62 6c 65 20 74 6f 20 6c 6f 77 65  possible to lowe
165e0 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  r the locking le
165f0 76 65 6c 20 6f 6e 65 20 73 74 65 70 20 61 74 20  vel one step at 
16600 61 20 74 69 6d 65 2e 20 20 59 6f 75 0a 2a 2a 20  a time.  You.** 
16610 6d 75 73 74 20 67 6f 20 73 74 72 61 69 67 68 74  must go straight
16620 20 74 6f 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65   to locking leve
16630 6c 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  l 0..*/.static i
16640 6e 74 20 77 69 6e 4c 6f 63 6b 28 73 71 6c 69 74  nt winLock(sqlit
16650 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
16660 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e   locktype){.  in
16670 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
16680 3b 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63  ;    /* Return c
16690 6f 64 65 20 66 72 6f 6d 20 73 75 62 72 6f 75 74  ode from subrout
166a0 69 6e 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ines */.  int re
166b0 73 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20  s = 1;          
166c0 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20 61 20   /* Result of a 
166d0 57 69 6e 64 6f 77 73 20 6c 6f 63 6b 20 63 61 6c  Windows lock cal
166e0 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 65 77 4c 6f  l */.  int newLo
166f0 63 6b 74 79 70 65 3b 20 20 20 20 20 20 20 2f 2a  cktype;       /*
16700 20 53 65 74 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b   Set pFile->lock
16710 74 79 70 65 20 74 6f 20 74 68 69 73 20 76 61 6c  type to this val
16720 75 65 20 62 65 66 6f 72 65 20 65 78 69 74 69 6e  ue before exitin
16730 67 20 2a 2f 0a 20 20 69 6e 74 20 67 6f 74 50 65  g */.  int gotPe
16740 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20 30 3b 2f 2a  ndingLock = 0;/*
16750 20 54 72 75 65 20 69 66 20 77 65 20 61 63 71 75   True if we acqu
16760 69 72 65 64 20 61 20 50 45 4e 44 49 4e 47 20 6c  ired a PENDING l
16770 6f 63 6b 20 74 68 69 73 20 74 69 6d 65 20 2a 2f  ock this time */
16780 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  .  winFile *pFil
16790 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64  e = (winFile*)id
167a0 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72  ;.  DWORD lastEr
167b0 72 6e 6f 20 3d 20 4e 4f 5f 45 52 52 4f 52 3b 0a  rno = NO_ERROR;.
167c0 0a 20 20 61 73 73 65 72 74 28 20 69 64 21 3d 30  .  assert( id!=0
167d0 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22   );.  OSTRACE(("
167e0 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6f 6c  LOCK file=%p, ol
167f0 64 4c 6f 63 6b 3d 25 64 28 25 64 29 2c 20 6e 65  dLock=%d(%d), ne
16800 77 4c 6f 63 6b 3d 25 64 5c 6e 22 2c 0a 20 20 20  wLock=%d\n",.   
16810 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68          pFile->h
16820 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  , pFile->locktyp
16830 65 2c 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64  e, pFile->shared
16840 4c 6f 63 6b 42 79 74 65 2c 20 6c 6f 63 6b 74 79  LockByte, lockty
16850 70 65 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  pe));..  /* If t
16860 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20  here is already 
16870 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20 74  a lock of this t
16880 79 70 65 20 6f 72 20 6d 6f 72 65 20 72 65 73 74  ype or more rest
16890 72 69 63 74 69 76 65 20 6f 6e 20 74 68 65 0a 20  rictive on the. 
168a0 20 2a 2a 20 4f 73 46 69 6c 65 2c 20 64 6f 20 6e   ** OsFile, do n
168b0 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75 73  othing. Don't us
168c0 65 20 74 68 65 20 65 6e 64 5f 6c 6f 63 6b 3a 20  e the end_lock: 
168d0 65 78 69 74 20 70 61 74 68 2c 20 61 73 0a 20 20  exit path, as.  
168e0 2a 2a 20 73 71 6c 69 74 65 33 4f 73 45 6e 74 65  ** sqlite3OsEnte
168f0 72 4d 75 74 65 78 28 29 20 68 61 73 6e 27 74 20  rMutex() hasn't 
16900 62 65 65 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e  been called yet.
16910 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  .  */.  if( pFil
16920 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 6c 6f 63  e->locktype>=loc
16930 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 4f 53 54  ktype ){.    OST
16940 52 41 43 45 28 28 22 4c 4f 43 4b 2d 48 45 4c 44  RACE(("LOCK-HELD
16950 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c   file=%p, rc=SQL
16960 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65  ITE_OK\n", pFile
16970 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75 72  ->h));.    retur
16980 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
16990 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
169a0 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71   the locking seq
169b0 75 65 6e 63 65 20 69 73 20 63 6f 72 72 65 63 74  uence is correct
169c0 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
169d0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 21  pFile->locktype!
169e0 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 6c 6f 63 6b  =NO_LOCK || lock
169f0 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
16a00 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c  K );.  assert( l
16a10 6f 63 6b 74 79 70 65 21 3d 50 45 4e 44 49 4e 47  ocktype!=PENDING
16a20 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
16a30 74 28 20 6c 6f 63 6b 74 79 70 65 21 3d 52 45 53  t( locktype!=RES
16a40 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46  ERVED_LOCK || pF
16a50 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53  ile->locktype==S
16a60 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20  HARED_LOCK );.. 
16a70 20 2f 2a 20 4c 6f 63 6b 20 74 68 65 20 50 45 4e   /* Lock the PEN
16a80 44 49 4e 47 5f 4c 4f 43 4b 20 62 79 74 65 20 69  DING_LOCK byte i
16a90 66 20 77 65 20 6e 65 65 64 20 74 6f 20 61 63 71  f we need to acq
16aa0 75 69 72 65 20 61 20 50 45 4e 44 49 4e 47 20 6c  uire a PENDING l
16ab0 6f 63 6b 20 6f 72 0a 20 20 2a 2a 20 61 20 53 48  ock or.  ** a SH
16ac0 41 52 45 44 20 6c 6f 63 6b 2e 20 20 49 66 20 77  ARED lock.  If w
16ad0 65 20 61 72 65 20 61 63 71 75 69 72 69 6e 67 20  e are acquiring 
16ae0 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74  a SHARED lock, t
16af0 68 65 20 61 63 71 75 69 73 69 74 69 6f 6e 20 6f  he acquisition o
16b00 66 0a 20 20 2a 2a 20 74 68 65 20 50 45 4e 44 49  f.  ** the PENDI
16b10 4e 47 5f 4c 4f 43 4b 20 62 79 74 65 20 69 73 20  NG_LOCK byte is 
16b20 74 65 6d 70 6f 72 61 72 79 2e 0a 20 20 2a 2f 0a  temporary..  */.
16b30 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20    newLocktype = 
16b40 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3b  pFile->locktype;
16b50 0a 20 20 69 66 28 20 20 20 28 70 46 69 6c 65 2d  .  if(   (pFile-
16b60 3e 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f  >locktype==NO_LO
16b70 43 4b 29 0a 20 20 20 20 20 7c 7c 20 28 20 20 20  CK).     || (   
16b80 28 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55  (locktype==EXCLU
16b90 53 49 56 45 5f 4c 4f 43 4b 29 0a 20 20 20 20 20  SIVE_LOCK).     
16ba0 20 20 20 20 26 26 20 28 70 46 69 6c 65 2d 3e 6c      && (pFile->l
16bb0 6f 63 6b 74 79 70 65 3d 3d 52 45 53 45 52 56 45  ocktype==RESERVE
16bc0 44 5f 4c 4f 43 4b 29 29 0a 20 20 29 7b 0a 20 20  D_LOCK)).  ){.  
16bd0 20 20 69 6e 74 20 63 6e 74 20 3d 20 33 3b 0a 20    int cnt = 3;. 
16be0 20 20 20 77 68 69 6c 65 28 20 63 6e 74 2d 2d 3e     while( cnt-->
16bf0 30 20 26 26 20 28 72 65 73 20 3d 20 77 69 6e 4c  0 && (res = winL
16c00 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e  ockFile(&pFile->
16c10 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49  h, SQLITE_LOCKFI
16c20 4c 45 5f 46 4c 41 47 53 2c 0a 20 20 20 20 20 20  LE_FLAGS,.      
16c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c50 20 20 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c     PENDING_BYTE,
16c60 20 30 2c 20 31 2c 20 30 29 29 3d 3d 30 20 29 7b   0, 1, 0))==0 ){
16c70 0a 20 20 20 20 20 20 2f 2a 20 54 72 79 20 33 20  .      /* Try 3 
16c80 74 69 6d 65 73 20 74 6f 20 67 65 74 20 74 68 65  times to get the
16c90 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 2e 20 20   pending lock.  
16ca0 54 68 69 73 20 69 73 20 6e 65 65 64 65 64 20 74  This is needed t
16cb0 6f 20 77 6f 72 6b 0a 20 20 20 20 20 20 2a 2a 20  o work.      ** 
16cc0 61 72 6f 75 6e 64 20 70 72 6f 62 6c 65 6d 73 20  around problems 
16cd0 63 61 75 73 65 64 20 62 79 20 69 6e 64 65 78 69  caused by indexi
16ce0 6e 67 20 61 6e 64 2f 6f 72 20 61 6e 74 69 2d 76  ng and/or anti-v
16cf0 69 72 75 73 20 73 6f 66 74 77 61 72 65 20 6f 6e  irus software on
16d00 0a 20 20 20 20 20 20 2a 2a 20 57 69 6e 64 6f 77  .      ** Window
16d10 73 20 73 79 73 74 65 6d 73 2e 0a 20 20 20 20 20  s systems..     
16d20 20 2a 2a 20 49 66 20 79 6f 75 20 61 72 65 20 75   ** If you are u
16d30 73 69 6e 67 20 74 68 69 73 20 63 6f 64 65 20 61  sing this code a
16d40 73 20 61 20 6d 6f 64 65 6c 20 66 6f 72 20 61 6c  s a model for al
16d50 74 65 72 6e 61 74 69 76 65 20 56 46 53 65 73 2c  ternative VFSes,
16d60 20 64 6f 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a   do not.      **
16d70 20 63 6f 70 79 20 74 68 69 73 20 72 65 74 72 79   copy this retry
16d80 20 6c 6f 67 69 63 2e 20 20 49 74 20 69 73 20 61   logic.  It is a
16d90 20 68 61 63 6b 20 69 6e 74 65 6e 64 65 64 20 66   hack intended f
16da0 6f 72 20 57 69 6e 64 6f 77 73 20 6f 6e 6c 79 2e  or Windows only.
16db0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
16dc0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
16dd0 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
16de0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f      OSTRACE(("LO
16df0 43 4b 2d 50 45 4e 44 49 4e 47 2d 46 41 49 4c 20  CK-PENDING-FAIL 
16e00 66 69 6c 65 3d 25 70 2c 20 63 6f 75 6e 74 3d 25  file=%p, count=%
16e10 64 2c 20 72 65 73 75 6c 74 3d 25 64 5c 6e 22 2c  d, result=%d\n",
16e20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16e30 70 46 69 6c 65 2d 3e 68 2c 20 63 6e 74 2c 20 72  pFile->h, cnt, r
16e40 65 73 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  es));.      if( 
16e50 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52  lastErrno==ERROR
16e60 5f 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 20  _INVALID_HANDLE 
16e70 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65  ){.        pFile
16e80 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61  ->lastErrno = la
16e90 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20  stErrno;.       
16ea0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
16eb0 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20  RR_LOCK;.       
16ec0 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 2d   OSTRACE(("LOCK-
16ed0 46 41 49 4c 20 66 69 6c 65 3d 25 70 2c 20 63 6f  FAIL file=%p, co
16ee0 75 6e 74 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22  unt=%d, rc=%s\n"
16ef0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
16f00 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 63 6e 74     pFile->h, cnt
16f10 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65  , sqlite3ErrName
16f20 28 72 63 29 29 29 3b 0a 20 20 20 20 20 20 20 20  (rc)));.        
16f30 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
16f40 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 6e 74   }.      if( cnt
16f50 20 29 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32   ) sqlite3_win32
16f60 5f 73 6c 65 65 70 28 31 29 3b 0a 20 20 20 20 7d  _sleep(1);.    }
16f70 0a 20 20 20 20 67 6f 74 50 65 6e 64 69 6e 67 4c  .    gotPendingL
16f80 6f 63 6b 20 3d 20 72 65 73 3b 0a 20 20 20 20 69  ock = res;.    i
16f90 66 28 20 21 72 65 73 20 29 7b 0a 20 20 20 20 20  f( !res ){.     
16fa0 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47   lastErrno = osG
16fb0 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
16fc0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41     }.  }..  /* A
16fd0 63 71 75 69 72 65 20 61 20 73 68 61 72 65 64 20  cquire a shared 
16fe0 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20  lock.  */.  if( 
16ff0 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44  locktype==SHARED
17000 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20 29 7b 0a  _LOCK && res ){.
17010 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c      assert( pFil
17020 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f  e->locktype==NO_
17030 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 65 73 20  LOCK );.    res 
17040 3d 20 77 69 6e 47 65 74 52 65 61 64 4c 6f 63 6b  = winGetReadLock
17050 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 69 66 28  (pFile);.    if(
17060 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20 6e 65   res ){.      ne
17070 77 4c 6f 63 6b 74 79 70 65 20 3d 20 53 48 41 52  wLocktype = SHAR
17080 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c  ED_LOCK;.    }el
17090 73 65 7b 0a 20 20 20 20 20 20 6c 61 73 74 45 72  se{.      lastEr
170a0 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
170b0 72 72 6f 72 28 29 3b 0a 20 20 20 20 7d 0a 20 20  rror();.    }.  
170c0 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20  }..  /* Acquire 
170d0 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 0a  a RESERVED lock.
170e0 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74    */.  if( lockt
170f0 79 70 65 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ype==RESERVED_LO
17100 43 4b 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20  CK && res ){.   
17110 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
17120 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44  locktype==SHARED
17130 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 65 73  _LOCK );.    res
17140 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26   = winLockFile(&
17150 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45  pFile->h, SQLITE
17160 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53 2c  _LOCKFILE_FLAGS,
17170 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20   RESERVED_BYTE, 
17180 30 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 69 66  0, 1, 0);.    if
17190 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20 6e  ( res ){.      n
171a0 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 52 45 53  ewLocktype = RES
171b0 45 52 56 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20  ERVED_LOCK;.    
171c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c 61 73  }else{.      las
171d0 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
171e0 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 7d  stError();.    }
171f0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69  .  }..  /* Acqui
17200 72 65 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63  re a PENDING loc
17210 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63  k.  */.  if( loc
17220 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45  ktype==EXCLUSIVE
17230 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20 29 7b 0a  _LOCK && res ){.
17240 20 20 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20      newLocktype 
17250 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a  = PENDING_LOCK;.
17260 20 20 20 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f      gotPendingLo
17270 63 6b 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  ck = 0;.  }..  /
17280 2a 20 41 63 71 75 69 72 65 20 61 6e 20 45 58 43  * Acquire an EXC
17290 4c 55 53 49 56 45 20 6c 6f 63 6b 0a 20 20 2a 2f  LUSIVE lock.  */
172a0 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d  .  if( locktype=
172b0 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
172c0 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20 61 73  && res ){.    as
172d0 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63  sert( pFile->loc
172e0 6b 74 79 70 65 3e 3d 53 48 41 52 45 44 5f 4c 4f  ktype>=SHARED_LO
172f0 43 4b 20 29 3b 0a 20 20 20 20 72 65 73 20 3d 20  CK );.    res = 
17300 77 69 6e 55 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63  winUnlockReadLoc
17310 6b 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 72 65  k(pFile);.    re
17320 73 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28  s = winLockFile(
17330 26 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54  &pFile->h, SQLIT
17340 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53  E_LOCKFILE_FLAGS
17350 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20  , SHARED_FIRST, 
17360 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
17370 20 20 20 20 20 20 20 20 20 53 48 41 52 45 44 5f           SHARED_
17380 53 49 5a 45 2c 20 30 29 3b 0a 20 20 20 20 69 66  SIZE, 0);.    if
17390 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20 6e  ( res ){.      n
173a0 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 45 58 43  ewLocktype = EXC
173b0 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b 0a 20 20 20  LUSIVE_LOCK;.   
173c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c 61   }else{.      la
173d0 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
173e0 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
173f0 20 20 77 69 6e 47 65 74 52 65 61 64 4c 6f 63 6b    winGetReadLock
17400 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20  (pFile);.    }. 
17410 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 61   }..  /* If we a
17420 72 65 20 68 6f 6c 64 69 6e 67 20 61 20 50 45 4e  re holding a PEN
17430 44 49 4e 47 20 6c 6f 63 6b 20 74 68 61 74 20 6f  DING lock that o
17440 75 67 68 74 20 74 6f 20 62 65 20 72 65 6c 65 61  ught to be relea
17450 73 65 64 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 72  sed, then.  ** r
17460 65 6c 65 61 73 65 20 69 74 20 6e 6f 77 2e 0a 20  elease it now.. 
17470 20 2a 2f 0a 20 20 69 66 28 20 67 6f 74 50 65 6e   */.  if( gotPen
17480 64 69 6e 67 4c 6f 63 6b 20 26 26 20 6c 6f 63 6b  dingLock && lock
17490 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
174a0 4b 20 29 7b 0a 20 20 20 20 77 69 6e 55 6e 6c 6f  K ){.    winUnlo
174b0 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68  ckFile(&pFile->h
174c0 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20  , PENDING_BYTE, 
174d0 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20  0, 1, 0);.  }.. 
174e0 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 73   /* Update the s
174f0 74 61 74 65 20 6f 66 20 74 68 65 20 6c 6f 63 6b  tate of the lock
17500 20 68 61 73 20 68 65 6c 64 20 69 6e 20 74 68 65   has held in the
17510 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
17520 20 74 68 65 6e 0a 20 20 2a 2a 20 72 65 74 75 72   then.  ** retur
17530 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  n the appropriat
17540 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 0a 20  e result code.. 
17550 20 2a 2f 0a 20 20 69 66 28 20 72 65 73 20 29 7b   */.  if( res ){
17560 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
17570 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _OK;.  }else{.  
17580 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
17590 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a  no = lastErrno;.
175a0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
175b0 42 55 53 59 3b 0a 20 20 20 20 4f 53 54 52 41 43  BUSY;.    OSTRAC
175c0 45 28 28 22 4c 4f 43 4b 2d 46 41 49 4c 20 66 69  E(("LOCK-FAIL fi
175d0 6c 65 3d 25 70 2c 20 77 61 6e 74 65 64 3d 25 64  le=%p, wanted=%d
175e0 2c 20 67 6f 74 3d 25 64 5c 6e 22 2c 0a 20 20 20  , got=%d\n",.   
175f0 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
17600 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 2c 20 6e 65  >h, locktype, ne
17610 77 4c 6f 63 6b 74 79 70 65 29 29 3b 0a 20 20 7d  wLocktype));.  }
17620 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  .  pFile->lockty
17630 70 65 20 3d 20 28 75 38 29 6e 65 77 4c 6f 63 6b  pe = (u8)newLock
17640 74 79 70 65 3b 0a 20 20 4f 53 54 52 41 43 45 28  type;.  OSTRACE(
17650 28 22 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20  ("LOCK file=%p, 
17660 6c 6f 63 6b 3d 25 64 2c 20 72 63 3d 25 73 5c 6e  lock=%d, rc=%s\n
17670 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46  ",.           pF
17680 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c  ile->h, pFile->l
17690 6f 63 6b 74 79 70 65 2c 20 73 71 6c 69 74 65 33  ocktype, sqlite3
176a0 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20  ErrName(rc)));. 
176b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
176c0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
176d0 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72  e checks if ther
176e0 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20  e is a RESERVED 
176f0 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65  lock held on the
17700 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69   specified.** fi
17710 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e  le by this or an
17720 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e  y other process.
17730 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20   If such a lock 
17740 69 73 20 68 65 6c 64 2c 20 72 65 74 75 72 6e 0a  is held, return.
17750 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 6f 74 68  ** non-zero, oth
17760 65 72 77 69 73 65 20 7a 65 72 6f 2e 0a 2a 2f 0a  erwise zero..*/.
17770 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 43 68  static int winCh
17780 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
17790 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
177a0 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b  , int *pResOut){
177b0 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 77 69  .  int res;.  wi
177c0 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  nFile *pFile = (
177d0 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20  winFile*)id;..  
177e0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
177f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
17800 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56  OERR_CHECKRESERV
17810 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 4f 53 54  EDLOCK; );.  OST
17820 52 41 43 45 28 28 22 54 45 53 54 2d 57 52 2d 4c  RACE(("TEST-WR-L
17830 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 70 52 65  OCK file=%p, pRe
17840 73 4f 75 74 3d 25 70 5c 6e 22 2c 20 70 46 69 6c  sOut=%p\n", pFil
17850 65 2d 3e 68 2c 20 70 52 65 73 4f 75 74 29 29 3b  e->h, pResOut));
17860 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 21 3d  ..  assert( id!=
17870 30 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65  0 );.  if( pFile
17880 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 52 45 53 45  ->locktype>=RESE
17890 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  RVED_LOCK ){.   
178a0 20 72 65 73 20 3d 20 31 3b 0a 20 20 20 20 4f 53   res = 1;.    OS
178b0 54 52 41 43 45 28 28 22 54 45 53 54 2d 57 52 2d  TRACE(("TEST-WR-
178c0 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 72 65  LOCK file=%p, re
178d0 73 75 6c 74 3d 25 64 20 28 6c 6f 63 61 6c 29 5c  sult=%d (local)\
178e0 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 65  n", pFile->h, re
178f0 73 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  s));.  }else{.  
17900 20 20 72 65 73 20 3d 20 77 69 6e 4c 6f 63 6b 46    res = winLockF
17910 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53  ile(&pFile->h, S
17920 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 45 58  QLITE_LOCKFILEEX
17930 5f 46 4c 41 47 53 2c 52 45 53 45 52 56 45 44 5f  _FLAGS,RESERVED_
17940 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a  BYTE, 0, 1, 0);.
17950 20 20 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20      if( res ){. 
17960 20 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 46 69       winUnlockFi
17970 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 52 45  le(&pFile->h, RE
17980 53 45 52 56 45 44 5f 42 59 54 45 2c 20 30 2c 20  SERVED_BYTE, 0, 
17990 31 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  1, 0);.    }.   
179a0 20 72 65 73 20 3d 20 21 72 65 73 3b 0a 20 20 20   res = !res;.   
179b0 20 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 2d   OSTRACE(("TEST-
179c0 57 52 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c  WR-LOCK file=%p,
179d0 20 72 65 73 75 6c 74 3d 25 64 20 28 72 65 6d 6f   result=%d (remo
179e0 74 65 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  te)\n", pFile->h
179f0 2c 20 72 65 73 29 29 3b 0a 20 20 7d 0a 20 20 2a  , res));.  }.  *
17a00 70 52 65 73 4f 75 74 20 3d 20 72 65 73 3b 0a 20  pResOut = res;. 
17a10 20 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 2d   OSTRACE(("TEST-
17a20 57 52 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c  WR-LOCK file=%p,
17a30 20 70 52 65 73 4f 75 74 3d 25 70 2c 20 2a 70 52   pResOut=%p, *pR
17a40 65 73 4f 75 74 3d 25 64 2c 20 72 63 3d 53 51 4c  esOut=%d, rc=SQL
17a50 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20  ITE_OK\n",.     
17a60 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20        pFile->h, 
17a70 70 52 65 73 4f 75 74 2c 20 2a 70 52 65 73 4f 75  pResOut, *pResOu
17a80 74 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  t));.  return SQ
17a90 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
17aa0 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b  * Lower the lock
17ab0 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c  ing level on fil
17ac0 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 64 20  e descriptor id 
17ad0 74 6f 20 6c 6f 63 6b 74 79 70 65 2e 20 20 6c 6f  to locktype.  lo
17ae0 63 6b 74 79 70 65 0a 2a 2a 20 6d 75 73 74 20 62  cktype.** must b
17af0 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b  e either NO_LOCK
17b00 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e   or SHARED_LOCK.
17b10 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f  .**.** If the lo
17b20 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74  cking level of t
17b30 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
17b40 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74  or is already at
17b50 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65   or below.** the
17b60 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69   requested locki
17b70 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72  ng level, this r
17b80 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
17b90 70 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 6e  p..**.** It is n
17ba0 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20  ot possible for 
17bb0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 20  this routine to 
17bc0 66 61 69 6c 20 69 66 20 74 68 65 20 73 65 63 6f  fail if the seco
17bd0 6e 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69  nd argument.** i
17be0 73 20 4e 4f 5f 4c 4f 43 4b 2e 20 20 49 66 20 74  s NO_LOCK.  If t
17bf0 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
17c00 6e 74 20 69 73 20 53 48 41 52 45 44 5f 4c 4f 43  nt is SHARED_LOC
17c10 4b 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  K then this rout
17c20 69 6e 65 0a 2a 2a 20 6d 69 67 68 74 20 72 65 74  ine.** might ret
17c30 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
17c40 3b 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.*/.static int 
17c50 77 69 6e 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65  winUnlock(sqlite
17c60 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
17c70 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74  locktype){.  int
17c80 20 74 79 70 65 3b 0a 20 20 77 69 6e 46 69 6c 65   type;.  winFile
17c90 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69   *pFile = (winFi
17ca0 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72 63  le*)id;.  int rc
17cb0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
17cc0 61 73 73 65 72 74 28 20 70 46 69 6c 65 21 3d 30  assert( pFile!=0
17cd0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f   );.  assert( lo
17ce0 63 6b 74 79 70 65 3c 3d 53 48 41 52 45 44 5f 4c  cktype<=SHARED_L
17cf0 4f 43 4b 20 29 3b 0a 20 20 4f 53 54 52 41 43 45  OCK );.  OSTRACE
17d00 28 28 22 55 4e 4c 4f 43 4b 20 66 69 6c 65 3d 25  (("UNLOCK file=%
17d10 70 2c 20 6f 6c 64 4c 6f 63 6b 3d 25 64 28 25 64  p, oldLock=%d(%d
17d20 29 2c 20 6e 65 77 4c 6f 63 6b 3d 25 64 5c 6e 22  ), newLock=%d\n"
17d30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69  ,.           pFi
17d40 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f  le->h, pFile->lo
17d50 63 6b 74 79 70 65 2c 20 70 46 69 6c 65 2d 3e 73  cktype, pFile->s
17d60 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 6c  haredLockByte, l
17d70 6f 63 6b 74 79 70 65 29 29 3b 0a 20 20 74 79 70  ocktype));.  typ
17d80 65 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  e = pFile->lockt
17d90 79 70 65 3b 0a 20 20 69 66 28 20 74 79 70 65 3e  ype;.  if( type>
17da0 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
17db0 29 7b 0a 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b  ){.    winUnlock
17dc0 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20  File(&pFile->h, 
17dd0 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c  SHARED_FIRST, 0,
17de0 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29   SHARED_SIZE, 0)
17df0 3b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 74 79  ;.    if( lockty
17e00 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe==SHARED_LOCK 
17e10 26 26 20 21 77 69 6e 47 65 74 52 65 61 64 4c 6f  && !winGetReadLo
17e20 63 6b 28 70 46 69 6c 65 29 20 29 7b 0a 20 20 20  ck(pFile) ){.   
17e30 20 20 20 2f 2a 20 54 68 69 73 20 73 68 6f 75 6c     /* This shoul
17e40 64 20 6e 65 76 65 72 20 68 61 70 70 65 6e 2e 20  d never happen. 
17e50 20 57 65 20 73 68 6f 75 6c 64 20 61 6c 77 61 79   We should alway
17e60 73 20 62 65 20 61 62 6c 65 20 74 6f 0a 20 20 20  s be able to.   
17e70 20 20 20 2a 2a 20 72 65 61 63 71 75 69 72 65 20     ** reacquire 
17e80 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f  the read lock */
17e90 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c  .      rc = winL
17ea0 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
17eb0 4f 45 52 52 5f 55 4e 4c 4f 43 4b 2c 20 6f 73 47  OERR_UNLOCK, osG
17ec0 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20  etLastError(),. 
17ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ee0 20 20 20 20 20 20 22 77 69 6e 55 6e 6c 6f 63 6b        "winUnlock
17ef0 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
17f00 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
17f10 28 20 74 79 70 65 3e 3d 52 45 53 45 52 56 45 44  ( type>=RESERVED
17f20 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 77 69 6e  _LOCK ){.    win
17f30 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c  UnlockFile(&pFil
17f40 65 2d 3e 68 2c 20 52 45 53 45 52 56 45 44 5f 42  e->h, RESERVED_B
17f50 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20  YTE, 0, 1, 0);. 
17f60 20 7d 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70   }.  if( locktyp
17f70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 26 26 20 74 79  e==NO_LOCK && ty
17f80 70 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe>=SHARED_LOCK 
17f90 29 7b 0a 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b  ){.    winUnlock
17fa0 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b  ReadLock(pFile);
17fb0 0a 20 20 7d 0a 20 20 69 66 28 20 74 79 70 65 3e  .  }.  if( type>
17fc0 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 7b  =PENDING_LOCK ){
17fd0 0a 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 46 69  .    winUnlockFi
17fe0 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 50 45  le(&pFile->h, PE
17ff0 4e 44 49 4e 47 5f 42 59 54 45 2c 20 30 2c 20 31  NDING_BYTE, 0, 1
18000 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 70 46 69 6c  , 0);.  }.  pFil
18010 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 28 75  e->locktype = (u
18020 38 29 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 4f 53  8)locktype;.  OS
18030 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 66  TRACE(("UNLOCK f
18040 69 6c 65 3d 25 70 2c 20 6c 6f 63 6b 3d 25 64 2c  ile=%p, lock=%d,
18050 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20   rc=%s\n",.     
18060 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20        pFile->h, 
18070 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c  pFile->locktype,
18080 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28   sqlite3ErrName(
18090 72 63 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  rc)));.  return 
180a0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  rc;.}../*.** If 
180b0 2a 70 41 72 67 20 69 73 20 69 6e 69 74 69 74 69  *pArg is inititi
180c0 61 6c 6c 79 20 6e 65 67 61 74 69 76 65 20 74 68  ally negative th
180d0 65 6e 20 74 68 69 73 20 69 73 20 61 20 71 75 65  en this is a que
180e0 72 79 2e 20 20 53 65 74 20 2a 70 41 72 67 20 74  ry.  Set *pArg t
180f0 6f 0a 2a 2a 20 31 20 6f 72 20 30 20 64 65 70 65  o.** 1 or 0 depe
18100 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72  nding on whether
18110 20 6f 72 20 6e 6f 74 20 62 69 74 20 6d 61 73 6b   or not bit mask
18120 20 6f 66 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46   of pFile->ctrlF
18130 6c 61 67 73 20 69 73 20 73 65 74 2e 0a 2a 2a 0a  lags is set..**.
18140 2a 2a 20 49 66 20 2a 70 41 72 67 20 69 73 20 30  ** If *pArg is 0
18150 20 6f 72 20 31 2c 20 74 68 65 6e 20 63 6c 65 61   or 1, then clea
18160 72 20 6f 72 20 73 65 74 20 74 68 65 20 6d 61 73  r or set the mas
18170 6b 20 62 69 74 20 6f 66 20 70 46 69 6c 65 2d 3e  k bit of pFile->
18180 63 74 72 6c 46 6c 61 67 73 2e 0a 2a 2f 0a 73 74  ctrlFlags..*/.st
18190 61 74 69 63 20 76 6f 69 64 20 77 69 6e 4d 6f 64  atic void winMod
181a0 65 42 69 74 28 77 69 6e 46 69 6c 65 20 2a 70 46  eBit(winFile *pF
181b0 69 6c 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  ile, unsigned ch
181c0 61 72 20 6d 61 73 6b 2c 20 69 6e 74 20 2a 70 41  ar mask, int *pA
181d0 72 67 29 7b 0a 20 20 69 66 28 20 2a 70 41 72 67  rg){.  if( *pArg
181e0 3c 30 20 29 7b 0a 20 20 20 20 2a 70 41 72 67 20  <0 ){.    *pArg 
181f0 3d 20 28 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c  = (pFile->ctrlFl
18200 61 67 73 20 26 20 6d 61 73 6b 29 21 3d 30 3b 0a  ags & mask)!=0;.
18210 20 20 7d 65 6c 73 65 20 69 66 28 20 28 2a 70 41    }else if( (*pA
18220 72 67 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 46  rg)==0 ){.    pF
18230 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26  ile->ctrlFlags &
18240 3d 20 7e 6d 61 73 6b 3b 0a 20 20 7d 65 6c 73 65  = ~mask;.  }else
18250 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72  {.    pFile->ctr
18260 6c 46 6c 61 67 73 20 7c 3d 20 6d 61 73 6b 3b 0a  lFlags |= mask;.
18270 20 20 7d 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72    }.}../* Forwar
18280 64 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  d references to 
18290 56 46 53 20 68 65 6c 70 65 72 20 6d 65 74 68 6f  VFS helper metho
182a0 64 73 20 75 73 65 64 20 66 6f 72 20 74 65 6d 70  ds used for temp
182b0 6f 72 61 72 79 20 66 69 6c 65 73 20 2a 2f 0a 73  orary files */.s
182c0 74 61 74 69 63 20 69 6e 74 20 77 69 6e 47 65 74  tatic int winGet
182d0 54 65 6d 70 6e 61 6d 65 28 73 71 6c 69 74 65 33  Tempname(sqlite3
182e0 5f 76 66 73 20 2a 2c 20 63 68 61 72 20 2a 2a 29  _vfs *, char **)
182f0 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  ;.static int win
18300 49 73 44 69 72 28 63 6f 6e 73 74 20 76 6f 69 64  IsDir(const void
18310 20 2a 29 3b 0a 73 74 61 74 69 63 20 42 4f 4f 4c   *);.static BOOL
18320 20 77 69 6e 49 73 44 72 69 76 65 4c 65 74 74 65   winIsDriveLette
18330 72 41 6e 64 43 6f 6c 6f 6e 28 63 6f 6e 73 74 20  rAndColon(const 
18340 63 68 61 72 20 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20  char *);../*.** 
18350 43 6f 6e 74 72 6f 6c 20 61 6e 64 20 71 75 65 72  Control and quer
18360 79 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 66 69  y of the open fi
18370 6c 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74  le handle..*/.st
18380 61 74 69 63 20 69 6e 74 20 77 69 6e 46 69 6c 65  atic int winFile
18390 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f  Control(sqlite3_
183a0 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6f 70  file *id, int op
183b0 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20  , void *pArg){. 
183c0 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20   winFile *pFile 
183d0 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a  = (winFile*)id;.
183e0 20 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54    OSTRACE(("FCNT
183f0 4c 20 66 69 6c 65 3d 25 70 2c 20 6f 70 3d 25 64  L file=%p, op=%d
18400 2c 20 70 41 72 67 3d 25 70 5c 6e 22 2c 20 70 46  , pArg=%p\n", pF
18410 69 6c 65 2d 3e 68 2c 20 6f 70 2c 20 70 41 72 67  ile->h, op, pArg
18420 29 29 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70  ));.  switch( op
18430 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c   ){.    case SQL
18440 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54  ITE_FCNTL_LOCKST
18450 41 54 45 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69  ATE: {.      *(i
18460 6e 74 2a 29 70 41 72 67 20 3d 20 70 46 69 6c 65  nt*)pArg = pFile
18470 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20  ->locktype;.    
18480 20 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54    OSTRACE(("FCNT
18490 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51  L file=%p, rc=SQ
184a0 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c  LITE_OK\n", pFil
184b0 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65  e->h));.      re
184c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
184d0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
184e0 51 4c 49 54 45 5f 4c 41 53 54 5f 45 52 52 4e 4f  QLITE_LAST_ERRNO
184f0 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a  : {.      *(int*
18500 29 70 41 72 67 20 3d 20 28 69 6e 74 29 70 46 69  )pArg = (int)pFi
18510 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20  le->lastErrno;. 
18520 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46       OSTRACE(("F
18530 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63  CNTL file=%p, rc
18540 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70  =SQLITE_OK\n", p
18550 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20  File->h));.     
18560 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
18570 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
18580 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 43  e SQLITE_FCNTL_C
18590 48 55 4e 4b 5f 53 49 5a 45 3a 20 7b 0a 20 20 20  HUNK_SIZE: {.   
185a0 20 20 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e     pFile->szChun
185b0 6b 20 3d 20 2a 28 69 6e 74 20 2a 29 70 41 72 67  k = *(int *)pArg
185c0 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  ;.      OSTRACE(
185d0 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c  ("FCNTL file=%p,
185e0 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22   rc=SQLITE_OK\n"
185f0 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
18600 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
18610 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
18620 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
18630 4c 5f 53 49 5a 45 5f 48 49 4e 54 3a 20 7b 0a 20  L_SIZE_HINT: {. 
18640 20 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e       if( pFile->
18650 73 7a 43 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20  szChunk>0 ){.   
18660 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74       sqlite3_int
18670 36 34 20 6f 6c 64 53 7a 3b 0a 20 20 20 20 20 20  64 oldSz;.      
18680 20 20 69 6e 74 20 72 63 20 3d 20 77 69 6e 46 69    int rc = winFi
18690 6c 65 53 69 7a 65 28 69 64 2c 20 26 6f 6c 64 53  leSize(id, &oldS
186a0 7a 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  z);.        if( 
186b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
186c0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
186d0 65 33 5f 69 6e 74 36 34 20 6e 65 77 53 7a 20 3d  e3_int64 newSz =
186e0 20 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34   *(sqlite3_int64
186f0 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20 20 20  *)pArg;.        
18700 20 20 69 66 28 20 6e 65 77 53 7a 3e 6f 6c 64 53    if( newSz>oldS
18710 7a 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  z ){.           
18720 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
18730 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20  Benign(1);.     
18740 20 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 54         rc = winT
18750 72 75 6e 63 61 74 65 28 69 64 2c 20 6e 65 77 53  runcate(id, newS
18760 7a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  z);.            
18770 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
18780 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20  enign(0);.      
18790 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
187a0 20 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28          OSTRACE(
187b0 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c  ("FCNTL file=%p,
187c0 20 72 63 3d 25 73 5c 6e 22 2c 20 70 46 69 6c 65   rc=%s\n", pFile
187d0 2d 3e 68 2c 20 73 71 6c 69 74 65 33 45 72 72 4e  ->h, sqlite3ErrN
187e0 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 20 20 20  ame(rc)));.     
187f0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
18800 20 20 20 20 7d 0a 20 20 20 20 20 20 4f 53 54 52      }.      OSTR
18810 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65  ACE(("FCNTL file
18820 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f  =%p, rc=SQLITE_O
18830 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29  K\n", pFile->h))
18840 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
18850 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
18860 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
18870 46 43 4e 54 4c 5f 50 45 52 53 49 53 54 5f 57 41  FCNTL_PERSIST_WA
18880 4c 3a 20 7b 0a 20 20 20 20 20 20 77 69 6e 4d 6f  L: {.      winMo
18890 64 65 42 69 74 28 70 46 69 6c 65 2c 20 57 49 4e  deBit(pFile, WIN
188a0 46 49 4c 45 5f 50 45 52 53 49 53 54 5f 57 41 4c  FILE_PERSIST_WAL
188b0 2c 20 28 69 6e 74 2a 29 70 41 72 67 29 3b 0a 20  , (int*)pArg);. 
188c0 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46       OSTRACE(("F
188d0 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63  CNTL file=%p, rc
188e0 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70  =SQLITE_OK\n", p
188f0 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20  File->h));.     
18900 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
18910 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
18920 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50  e SQLITE_FCNTL_P
18930 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49  OWERSAFE_OVERWRI
18940 54 45 3a 20 7b 0a 20 20 20 20 20 20 77 69 6e 4d  TE: {.      winM
18950 6f 64 65 42 69 74 28 70 46 69 6c 65 2c 20 57 49  odeBit(pFile, WI
18960 4e 46 49 4c 45 5f 50 53 4f 57 2c 20 28 69 6e 74  NFILE_PSOW, (int
18970 2a 29 70 41 72 67 29 3b 0a 20 20 20 20 20 20 4f  *)pArg);.      O
18980 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66  STRACE(("FCNTL f
18990 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  ile=%p, rc=SQLIT
189a0 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  E_OK\n", pFile->
189b0 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  h));.      retur
189c0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
189d0 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
189e0 54 45 5f 46 43 4e 54 4c 5f 56 46 53 4e 41 4d 45  TE_FCNTL_VFSNAME
189f0 3a 20 7b 0a 20 20 20 20 20 20 2a 28 63 68 61 72  : {.      *(char
18a00 2a 2a 29 70 41 72 67 20 3d 20 73 71 6c 69 74 65  **)pArg = sqlite
18a10 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20  3_mprintf("%s", 
18a20 70 46 69 6c 65 2d 3e 70 56 66 73 2d 3e 7a 4e 61  pFile->pVfs->zNa
18a30 6d 65 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41  me);.      OSTRA
18a40 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d  CE(("FCNTL file=
18a50 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b  %p, rc=SQLITE_OK
18a60 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  \n", pFile->h));
18a70 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
18a80 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
18a90 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
18aa0 43 4e 54 4c 5f 57 49 4e 33 32 5f 41 56 5f 52 45  CNTL_WIN32_AV_RE
18ab0 54 52 59 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  TRY: {.      int
18ac0 20 2a 61 20 3d 20 28 69 6e 74 2a 29 70 41 72 67   *a = (int*)pArg
18ad0 3b 0a 20 20 20 20 20 20 69 66 28 20 61 5b 30 5d  ;.      if( a[0]
18ae0 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 77 69  >0 ){.        wi
18af0 6e 49 6f 65 72 72 52 65 74 72 79 20 3d 20 61 5b  nIoerrRetry = a[
18b00 30 5d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  0];.      }else{
18b10 0a 20 20 20 20 20 20 20 20 61 5b 30 5d 20 3d 20  .        a[0] = 
18b20 77 69 6e 49 6f 65 72 72 52 65 74 72 79 3b 0a 20  winIoerrRetry;. 
18b30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
18b40 20 61 5b 31 5d 3e 30 20 29 7b 0a 20 20 20 20 20   a[1]>0 ){.     
18b50 20 20 20 77 69 6e 49 6f 65 72 72 52 65 74 72 79     winIoerrRetry
18b60 44 65 6c 61 79 20 3d 20 61 5b 31 5d 3b 0a 20 20  Delay = a[1];.  
18b70 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
18b80 20 20 20 61 5b 31 5d 20 3d 20 77 69 6e 49 6f 65     a[1] = winIoe
18b90 72 72 52 65 74 72 79 44 65 6c 61 79 3b 0a 20 20  rrRetryDelay;.  
18ba0 20 20 20 20 7d 0a 20 20 20 20 20 20 4f 53 54 52      }.      OSTR
18bb0 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65  ACE(("FCNTL file
18bc0 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f  =%p, rc=SQLITE_O
18bd0 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29  K\n", pFile->h))
18be0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
18bf0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
18c00 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
18c10 53 54 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  ST.    case SQLI
18c20 54 45 5f 46 43 4e 54 4c 5f 57 49 4e 33 32 5f 53  TE_FCNTL_WIN32_S
18c30 45 54 5f 48 41 4e 44 4c 45 3a 20 7b 0a 20 20 20  ET_HANDLE: {.   
18c40 20 20 20 4c 50 48 41 4e 44 4c 45 20 70 68 46 69     LPHANDLE phFi
18c50 6c 65 20 3d 20 28 4c 50 48 41 4e 44 4c 45 29 70  le = (LPHANDLE)p
18c60 41 72 67 3b 0a 20 20 20 20 20 20 48 41 4e 44 4c  Arg;.      HANDL
18c70 45 20 68 4f 6c 64 46 69 6c 65 20 3d 20 70 46 69  E hOldFile = pFi
18c80 6c 65 2d 3e 68 3b 0a 20 20 20 20 20 20 70 46 69  le->h;.      pFi
18c90 6c 65 2d 3e 68 20 3d 20 2a 70 68 46 69 6c 65 3b  le->h = *phFile;
18ca0 0a 20 20 20 20 20 20 2a 70 68 46 69 6c 65 20 3d  .      *phFile =
18cb0 20 68 4f 6c 64 46 69 6c 65 3b 0a 20 20 20 20 20   hOldFile;.     
18cc0 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c   OSTRACE(("FCNTL
18cd0 20 6f 6c 64 46 69 6c 65 3d 25 70 2c 20 6e 65 77   oldFile=%p, new
18ce0 46 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49  File=%p, rc=SQLI
18cf0 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20  TE_OK\n",.      
18d00 20 20 20 20 20 20 20 20 20 68 4f 6c 64 46 69 6c           hOldFil
18d10 65 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20  e, pFile->h));. 
18d20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
18d30 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23 65 6e  TE_OK;.    }.#en
18d40 64 69 66 0a 20 20 20 20 63 61 73 65 20 53 51 4c  dif.    case SQL
18d50 49 54 45 5f 46 43 4e 54 4c 5f 54 45 4d 50 46 49  ITE_FCNTL_TEMPFI
18d60 4c 45 4e 41 4d 45 3a 20 7b 0a 20 20 20 20 20 20  LENAME: {.      
18d70 63 68 61 72 20 2a 7a 54 46 69 6c 65 20 3d 20 30  char *zTFile = 0
18d80 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d  ;.      int rc =
18d90 20 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65 28   winGetTempname(
18da0 70 46 69 6c 65 2d 3e 70 56 66 73 2c 20 26 7a 54  pFile->pVfs, &zT
18db0 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 69 66 28  File);.      if(
18dc0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
18dd0 7b 0a 20 20 20 20 20 20 20 20 2a 28 63 68 61 72  {.        *(char
18de0 2a 2a 29 70 41 72 67 20 3d 20 7a 54 46 69 6c 65  **)pArg = zTFile
18df0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
18e00 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20  OSTRACE(("FCNTL 
18e10 66 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e  file=%p, rc=%s\n
18e20 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 73 71 6c  ", pFile->h, sql
18e30 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29  ite3ErrName(rc))
18e40 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
18e50 72 63 3b 0a 20 20 20 20 7d 0a 23 69 66 20 53 51  rc;.    }.#if SQ
18e60 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
18e70 5a 45 3e 30 0a 20 20 20 20 63 61 73 65 20 53 51  ZE>0.    case SQ
18e80 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f  LITE_FCNTL_MMAP_
18e90 53 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20 69 36  SIZE: {.      i6
18ea0 34 20 6e 65 77 4c 69 6d 69 74 20 3d 20 2a 28 69  4 newLimit = *(i
18eb0 36 34 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20  64*)pArg;.      
18ec0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
18ed0 4f 4b 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65  OK;.      if( ne
18ee0 77 4c 69 6d 69 74 3e 73 71 6c 69 74 65 33 47 6c  wLimit>sqlite3Gl
18ef0 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 78 4d 6d 61  obalConfig.mxMma
18f00 70 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 65 77  p ){.        new
18f10 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 47  Limit = sqlite3G
18f20 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 78 4d 6d  lobalConfig.mxMm
18f30 61 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ap;.      }.    
18f40 20 20 2a 28 69 36 34 2a 29 70 41 72 67 20 3d 20    *(i64*)pArg = 
18f50 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d  pFile->mmapSizeM
18f60 61 78 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65  ax;.      if( ne
18f70 77 4c 69 6d 69 74 3e 3d 30 20 26 26 20 6e 65 77  wLimit>=0 && new
18f80 4c 69 6d 69 74 21 3d 70 46 69 6c 65 2d 3e 6d 6d  Limit!=pFile->mm
18f90 61 70 53 69 7a 65 4d 61 78 20 26 26 20 70 46 69  apSizeMax && pFi
18fa0 6c 65 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30  le->nFetchOut==0
18fb0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c   ){.        pFil
18fc0 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 3d  e->mmapSizeMax =
18fd0 20 6e 65 77 4c 69 6d 69 74 3b 0a 20 20 20 20 20   newLimit;.     
18fe0 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6d 6d     if( pFile->mm
18ff0 61 70 53 69 7a 65 3e 30 20 29 7b 0a 20 20 20 20  apSize>0 ){.    
19000 20 20 20 20 20 20 77 69 6e 55 6e 6d 61 70 66 69        winUnmapfi
19010 6c 65 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20  le(pFile);.     
19020 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4d 61 70       rc = winMap
19030 66 69 6c 65 28 70 46 69 6c 65 2c 20 2d 31 29 3b  file(pFile, -1);
19040 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
19050 20 7d 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45   }.      OSTRACE
19060 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70  (("FCNTL file=%p
19070 2c 20 72 63 3d 25 73 5c 6e 22 2c 20 70 46 69 6c  , rc=%s\n", pFil
19080 65 2d 3e 68 2c 20 73 71 6c 69 74 65 33 45 72 72  e->h, sqlite3Err
19090 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 20 20  Name(rc)));.    
190a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
190b0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20   }.#endif.  }.  
190c0 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20  OSTRACE(("FCNTL 
190d0 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49  file=%p, rc=SQLI
190e0 54 45 5f 4e 4f 54 46 4f 55 4e 44 5c 6e 22 2c 20  TE_NOTFOUND\n", 
190f0 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 72 65  pFile->h));.  re
19100 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46  turn SQLITE_NOTF
19110 4f 55 4e 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  OUND;.}../*.** R
19120 65 74 75 72 6e 20 74 68 65 20 73 65 63 74 6f 72  eturn the sector
19130 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f   size in bytes o
19140 66 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  f the underlying
19150 20 62 6c 6f 63 6b 20 64 65 76 69 63 65 20 66 6f   block device fo
19160 72 0a 2a 2a 20 74 68 65 20 73 70 65 63 69 66 69  r.** the specifi
19170 65 64 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73  ed file. This is
19180 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 35   almost always 5
19190 31 32 20 62 79 74 65 73 2c 20 62 75 74 20 6d 61  12 bytes, but ma
191a0 79 20 62 65 0a 2a 2a 20 6c 61 72 67 65 72 20 66  y be.** larger f
191b0 6f 72 20 73 6f 6d 65 20 64 65 76 69 63 65 73 2e  or some devices.
191c0 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 63 6f  .**.** SQLite co
191d0 64 65 20 61 73 73 75 6d 65 73 20 74 68 69 73 20  de assumes this 
191e0 66 75 6e 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20  function cannot 
191f0 66 61 69 6c 2e 20 49 74 20 61 6c 73 6f 20 61 73  fail. It also as
19200 73 75 6d 65 73 20 74 68 61 74 0a 2a 2a 20 69 66  sumes that.** if
19210 20 74 77 6f 20 66 69 6c 65 73 20 61 72 65 20 63   two files are c
19220 72 65 61 74 65 64 20 69 6e 20 74 68 65 20 73 61  reated in the sa
19230 6d 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 64  me file-system d
19240 69 72 65 63 74 6f 72 79 20 28 69 2e 65 2e 0a 2a  irectory (i.e..*
19250 2a 20 61 20 64 61 74 61 62 61 73 65 20 61 6e 64  * a database and
19260 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   its journal fil
19270 65 29 20 74 68 61 74 20 74 68 65 20 73 65 63 74  e) that the sect
19280 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 20  or size will be 
19290 74 68 65 0a 2a 2a 20 73 61 6d 65 20 66 6f 72 20  the.** same for 
192a0 62 6f 74 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  both..*/.static 
192b0 69 6e 74 20 77 69 6e 53 65 63 74 6f 72 53 69 7a  int winSectorSiz
192c0 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
192d0 69 64 29 7b 0a 20 20 28 76 6f 69 64 29 69 64 3b  id){.  (void)id;
192e0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
192f0 5f 44 45 46 41 55 4c 54 5f 53 45 43 54 4f 52 5f  _DEFAULT_SECTOR_
19300 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  SIZE;.}../*.** R
19310 65 74 75 72 6e 20 61 20 76 65 63 74 6f 72 20 6f  eturn a vector o
19320 66 20 64 65 76 69 63 65 20 63 68 61 72 61 63 74  f device charact
19330 65 72 69 73 74 69 63 73 2e 0a 2a 2f 0a 73 74 61  eristics..*/.sta
19340 74 69 63 20 69 6e 74 20 77 69 6e 44 65 76 69 63  tic int winDevic
19350 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
19360 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
19370 64 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70  d){.  winFile *p
19380 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b   = (winFile*)id;
19390 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
193a0 5f 49 4f 43 41 50 5f 55 4e 44 45 4c 45 54 41 42  _IOCAP_UNDELETAB
193b0 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 20 7c 0a 20  LE_WHEN_OPEN |. 
193c0 20 20 20 20 20 20 20 20 28 28 70 2d 3e 63 74 72          ((p->ctr
193d0 6c 46 6c 61 67 73 20 26 20 57 49 4e 46 49 4c 45  lFlags & WINFILE
193e0 5f 50 53 4f 57 29 3f 53 51 4c 49 54 45 5f 49 4f  _PSOW)?SQLITE_IO
193f0 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56  CAP_POWERSAFE_OV
19400 45 52 57 52 49 54 45 3a 30 29 3b 0a 7d 0a 0a 2f  ERWRITE:0);.}../
19410 2a 0a 2a 2a 20 57 69 6e 64 6f 77 73 20 77 69 6c  *.** Windows wil
19420 6c 20 6f 6e 6c 79 20 6c 65 74 20 79 6f 75 20 63  l only let you c
19430 72 65 61 74 65 20 66 69 6c 65 20 76 69 65 77 20  reate file view 
19440 6d 61 70 70 69 6e 67 73 0a 2a 2a 20 6f 6e 20 61  mappings.** on a
19450 6c 6c 6f 63 61 74 69 6f 6e 20 73 69 7a 65 20 67  llocation size g
19460 72 61 6e 75 6c 61 72 69 74 79 20 62 6f 75 6e 64  ranularity bound
19470 61 72 69 65 73 2e 0a 2a 2a 20 44 75 72 69 6e 67  aries..** During
19480 20 73 71 6c 69 74 65 33 5f 6f 73 5f 69 6e 69 74   sqlite3_os_init
19490 28 29 20 77 65 20 64 6f 20 61 20 47 65 74 53 79  () we do a GetSy
194a0 73 74 65 6d 49 6e 66 6f 28 29 0a 2a 2a 20 74 6f  stemInfo().** to
194b0 20 67 65 74 20 74 68 65 20 67 72 61 6e 75 6c 61   get the granula
194c0 72 69 74 79 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74  rity size..*/.st
194d0 61 74 69 63 20 53 59 53 54 45 4d 5f 49 4e 46 4f  atic SYSTEM_INFO
194e0 20 77 69 6e 53 79 73 49 6e 66 6f 3b 0a 0a 23 69   winSysInfo;..#i
194f0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
19500 54 5f 57 41 4c 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c  T_WAL../*.** Hel
19510 70 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f  per functions to
19520 20 6f 62 74 61 69 6e 20 61 6e 64 20 72 65 6c 69   obtain and reli
19530 6e 71 75 69 73 68 20 74 68 65 20 67 6c 6f 62 61  nquish the globa
19540 6c 20 6d 75 74 65 78 2e 20 54 68 65 0a 2a 2a 20  l mutex. The.** 
19550 67 6c 6f 62 61 6c 20 6d 75 74 65 78 20 69 73 20  global mutex is 
19560 75 73 65 64 20 74 6f 20 70 72 6f 74 65 63 74 20  used to protect 
19570 74 68 65 20 77 69 6e 4c 6f 63 6b 49 6e 66 6f 20  the winLockInfo 
19580 6f 62 6a 65 63 74 73 20 75 73 65 64 20 62 79 0a  objects used by.
19590 2a 2a 20 74 68 69 73 20 66 69 6c 65 2c 20 61 6c  ** this file, al
195a0 6c 20 6f 66 20 77 68 69 63 68 20 6d 61 79 20 62  l of which may b
195b0 65 20 73 68 61 72 65 64 20 62 79 20 6d 75 6c 74  e shared by mult
195c0 69 70 6c 65 20 74 68 72 65 61 64 73 2e 0a 2a 2a  iple threads..**
195d0 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 77 69 6e  .** Function win
195e0 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 69  ShmMutexHeld() i
195f0 73 20 75 73 65 64 20 74 6f 20 61 73 73 65 72 74  s used to assert
19600 28 29 20 74 68 61 74 20 74 68 65 20 67 6c 6f 62  () that the glob
19610 61 6c 20 6d 75 74 65 78 0a 2a 2a 20 69 73 20 68  al mutex.** is h
19620 65 6c 64 20 77 68 65 6e 20 72 65 71 75 69 72 65  eld when require
19630 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  d. This function
19640 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 61 73   is only used as
19650 20 70 61 72 74 20 6f 66 20 61 73 73 65 72 74 28   part of assert(
19660 29 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 2e  ).** statements.
19670 20 65 2e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 77 69   e.g..**.**   wi
19680 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 29  nShmEnterMutex()
19690 0a 2a 2a 20 20 20 20 20 61 73 73 65 72 74 28 20  .**     assert( 
196a0 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28  winShmMutexHeld(
196b0 29 20 29 3b 0a 2a 2a 20 20 20 77 69 6e 53 68 6d  ) );.**   winShm
196c0 4c 65 61 76 65 4d 75 74 65 78 28 29 0a 2a 2f 0a  LeaveMutex().*/.
196d0 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 53  static void winS
196e0 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 76 6f 69  hmEnterMutex(voi
196f0 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  d){.  sqlite3_mu
19700 74 65 78 5f 65 6e 74 65 72 28 73 71 6c 69 74 65  tex_enter(sqlite
19710 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
19720 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
19730 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 73 74 61 74  MASTER));.}.stat
19740 69 63 20 76 6f 69 64 20 77 69 6e 53 68 6d 4c 65  ic void winShmLe
19750 61 76 65 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a  aveMutex(void){.
19760 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
19770 6c 65 61 76 65 28 73 71 6c 69 74 65 33 4d 75 74  leave(sqlite3Mut
19780 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
19790 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54  UTEX_STATIC_MAST
197a0 45 52 29 29 3b 0a 7d 0a 23 69 66 6e 64 65 66 20  ER));.}.#ifndef 
197b0 4e 44 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e  NDEBUG.static in
197c0 74 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c  t winShmMutexHel
197d0 64 28 76 6f 69 64 29 20 7b 0a 20 20 72 65 74 75  d(void) {.  retu
197e0 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  rn sqlite3_mutex
197f0 5f 68 65 6c 64 28 73 71 6c 69 74 65 33 4d 75 74  _held(sqlite3Mut
19800 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
19810 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54  UTEX_STATIC_MAST
19820 45 52 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ER));.}.#endif..
19830 2f 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20 75 73 65  /*.** Object use
19840 64 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20 61  d to represent a
19850 20 73 69 6e 67 6c 65 20 66 69 6c 65 20 6f 70 65   single file ope
19860 6e 65 64 20 61 6e 64 20 6d 6d 61 70 70 65 64 20  ned and mmapped 
19870 74 6f 20 70 72 6f 76 69 64 65 0a 2a 2a 20 73 68  to provide.** sh
19880 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20 20 57 68  ared memory.  Wh
19890 65 6e 20 6d 75 6c 74 69 70 6c 65 20 74 68 72 65  en multiple thre
198a0 61 64 73 20 61 6c 6c 20 72 65 66 65 72 65 6e 63  ads all referenc
198b0 65 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 6c 6f  e the same.** lo
198c0 67 2d 73 75 6d 6d 61 72 79 2c 20 65 61 63 68 20  g-summary, each 
198d0 74 68 72 65 61 64 20 68 61 73 20 69 74 73 20 6f  thread has its o
198e0 77 6e 20 77 69 6e 46 69 6c 65 20 6f 62 6a 65 63  wn winFile objec
198f0 74 2c 20 62 75 74 20 74 68 65 79 20 61 6c 6c 0a  t, but they all.
19900 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 61 20 73 69  ** point to a si
19910 6e 67 6c 65 20 69 6e 73 74 61 6e 63 65 20 6f 66  ngle instance of
19920 20 74 68 69 73 20 6f 62 6a 65 63 74 2e 20 20 49   this object.  I
19930 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 65  n other words, e
19940 61 63 68 0a 2a 2a 20 6c 6f 67 2d 73 75 6d 6d 61  ach.** log-summa
19950 72 79 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 6c  ry is opened onl
19960 79 20 6f 6e 63 65 20 70 65 72 20 70 72 6f 63 65  y once per proce
19970 73 73 2e 0a 2a 2a 0a 2a 2a 20 77 69 6e 53 68 6d  ss..**.** winShm
19980 4d 75 74 65 78 48 65 6c 64 28 29 20 6d 75 73 74  MutexHeld() must
19990 20 62 65 20 74 72 75 65 20 77 68 65 6e 20 63 72   be true when cr
199a0 65 61 74 69 6e 67 20 6f 72 20 64 65 73 74 72 6f  eating or destro
199b0 79 69 6e 67 0a 2a 2a 20 74 68 69 73 20 6f 62 6a  ying.** this obj
199c0 65 63 74 20 6f 72 20 77 68 69 6c 65 20 72 65 61  ect or while rea
199d0 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20  ding or writing 
199e0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69  the following fi
199f0 65 6c 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  elds:.**.**     
19a00 20 6e 52 65 66 0a 2a 2a 20 20 20 20 20 20 70 4e   nRef.**      pN
19a10 65 78 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  ext.**.** The fo
19a20 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 20 61  llowing fields a
19a30 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20 61 66 74  re read-only aft
19a40 65 72 20 74 68 65 20 6f 62 6a 65 63 74 20 69 73  er the object is
19a50 20 63 72 65 61 74 65 64 3a 0a 2a 2a 0a 2a 2a 20   created:.**.** 
19a60 20 20 20 20 20 66 69 64 0a 2a 2a 20 20 20 20 20       fid.**     
19a70 20 7a 46 69 6c 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a   zFilename.**.**
19a80 20 45 69 74 68 65 72 20 77 69 6e 53 68 6d 4e 6f   Either winShmNo
19a90 64 65 2e 6d 75 74 65 78 20 6d 75 73 74 20 62 65  de.mutex must be
19aa0 20 68 65 6c 64 20 6f 72 20 77 69 6e 53 68 6d 4e   held or winShmN
19ab0 6f 64 65 2e 6e 52 65 66 3d 3d 30 20 61 6e 64 0a  ode.nRef==0 and.
19ac0 2a 2a 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65  ** winShmMutexHe
19ad0 6c 64 28 29 20 69 73 20 74 72 75 65 20 77 68 65  ld() is true whe
19ae0 6e 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69  n reading or wri
19af0 74 69 6e 67 20 61 6e 79 20 6f 74 68 65 72 20 66  ting any other f
19b00 69 65 6c 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20  ield.** in this 
19b10 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2f  structure..**.*/
19b20 0a 73 74 72 75 63 74 20 77 69 6e 53 68 6d 4e 6f  .struct winShmNo
19b30 64 65 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  de {.  sqlite3_m
19b40 75 74 65 78 20 2a 6d 75 74 65 78 3b 20 20 20 20  utex *mutex;    
19b50 20 20 2f 2a 20 4d 75 74 65 78 20 74 6f 20 61 63    /* Mutex to ac
19b60 63 65 73 73 20 74 68 69 73 20 6f 62 6a 65 63 74  cess this object
19b70 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c   */.  char *zFil
19b80 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  ename;          
19b90 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
19ba0 66 69 6c 65 20 2a 2f 0a 20 20 77 69 6e 46 69 6c  file */.  winFil
19bb0 65 20 68 46 69 6c 65 3b 20 20 20 20 20 20 20 20  e hFile;        
19bc0 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e       /* File han
19bd0 64 6c 65 20 66 72 6f 6d 20 77 69 6e 4f 70 65 6e  dle from winOpen
19be0 20 2a 2f 0a 0a 20 20 69 6e 74 20 73 7a 52 65 67   */..  int szReg
19bf0 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  ion;            
19c00 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 68 61    /* Size of sha
19c10 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f  red-memory regio
19c20 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 67  ns */.  int nReg
19c30 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  ion;            
19c40 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 72     /* Size of ar
19c50 72 61 79 20 61 70 52 65 67 69 6f 6e 20 2a 2f 0a  ray apRegion */.
19c60 20 20 73 74 72 75 63 74 20 53 68 6d 52 65 67 69    struct ShmRegi
19c70 6f 6e 20 7b 0a 20 20 20 20 48 41 4e 44 4c 45 20  on {.    HANDLE 
19c80 68 4d 61 70 3b 20 20 20 20 20 20 20 20 20 20 20  hMap;           
19c90 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65    /* File handle
19ca0 20 66 72 6f 6d 20 43 72 65 61 74 65 46 69 6c 65   from CreateFile
19cb0 4d 61 70 70 69 6e 67 20 2a 2f 0a 20 20 20 20 76  Mapping */.    v
19cc0 6f 69 64 20 2a 70 4d 61 70 3b 0a 20 20 7d 20 2a  oid *pMap;.  } *
19cd0 61 52 65 67 69 6f 6e 3b 0a 20 20 44 57 4f 52 44  aRegion;.  DWORD
19ce0 20 6c 61 73 74 45 72 72 6e 6f 3b 20 20 20 20 20   lastErrno;     
19cf0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 69 6e        /* The Win
19d00 64 6f 77 73 20 65 72 72 6e 6f 20 66 72 6f 6d 20  dows errno from 
19d10 74 68 65 20 6c 61 73 74 20 49 2f 4f 20 65 72 72  the last I/O err
19d20 6f 72 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e 52 65  or */..  int nRe
19d30 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
19d40 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
19d50 20 77 69 6e 53 68 6d 20 6f 62 6a 65 63 74 73 20   winShm objects 
19d60 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 69 73  pointing to this
19d70 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70 46   */.  winShm *pF
19d80 69 72 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  irst;           
19d90 20 2f 2a 20 41 6c 6c 20 77 69 6e 53 68 6d 20 6f   /* All winShm o
19da0 62 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e 67 20  bjects pointing 
19db0 74 6f 20 74 68 69 73 20 2a 2f 0a 20 20 77 69 6e  to this */.  win
19dc0 53 68 6d 4e 6f 64 65 20 2a 70 4e 65 78 74 3b 20  ShmNode *pNext; 
19dd0 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20          /* Next 
19de0 69 6e 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 77  in list of all w
19df0 69 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74  inShmNode object
19e00 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  s */.#ifdef SQLI
19e10 54 45 5f 44 45 42 55 47 0a 20 20 75 38 20 6e 65  TE_DEBUG.  u8 ne
19e20 78 74 53 68 6d 49 64 3b 20 20 20 20 20 20 20 20  xtShmId;        
19e30 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 61 76        /* Next av
19e40 61 69 6c 61 62 6c 65 20 77 69 6e 53 68 6d 2e 69  ailable winShm.i
19e50 64 20 76 61 6c 75 65 20 2a 2f 0a 23 65 6e 64 69  d value */.#endi
19e60 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 67 6c  f.};../*.** A gl
19e70 6f 62 61 6c 20 61 72 72 61 79 20 6f 66 20 61 6c  obal array of al
19e80 6c 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a  l winShmNode obj
19e90 65 63 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ects..**.** The 
19ea0 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28  winShmMutexHeld(
19eb0 29 20 6d 75 73 74 20 62 65 20 74 72 75 65 20 77  ) must be true w
19ec0 68 69 6c 65 20 72 65 61 64 69 6e 67 20 6f 72 20  hile reading or 
19ed0 77 72 69 74 69 6e 67 20 74 68 69 73 20 6c 69 73  writing this lis
19ee0 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 77 69 6e  t..*/.static win
19ef0 53 68 6d 4e 6f 64 65 20 2a 77 69 6e 53 68 6d 4e  ShmNode *winShmN
19f00 6f 64 65 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a  odeList = 0;../*
19f10 0a 2a 2a 20 53 74 72 75 63 74 75 72 65 20 75 73  .** Structure us
19f20 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 20 62 79  ed internally by
19f30 20 74 68 69 73 20 56 46 53 20 74 6f 20 72 65 63   this VFS to rec
19f40 6f 72 64 20 74 68 65 20 73 74 61 74 65 20 6f 66  ord the state of
19f50 20 61 6e 0a 2a 2a 20 6f 70 65 6e 20 73 68 61 72   an.** open shar
19f60 65 64 20 6d 65 6d 6f 72 79 20 63 6f 6e 6e 65 63  ed memory connec
19f70 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tion..**.** The 
19f80 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73  following fields
19f90 20 61 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64   are initialized
19fa0 20 77 68 65 6e 20 74 68 69 73 20 6f 62 6a 65 63   when this objec
19fb0 74 20 69 73 20 63 72 65 61 74 65 64 20 61 6e 64  t is created and
19fc0 0a 2a 2a 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c  .** are read-onl
19fd0 79 20 74 68 65 72 65 61 66 74 65 72 3a 0a 2a 2a  y thereafter:.**
19fe0 0a 2a 2a 20 20 20 20 77 69 6e 53 68 6d 2e 70 53  .**    winShm.pS
19ff0 68 6d 4e 6f 64 65 0a 2a 2a 20 20 20 20 77 69 6e  hmNode.**    win
1a000 53 68 6d 2e 69 64 0a 2a 2a 0a 2a 2a 20 41 6c 6c  Shm.id.**.** All
1a010 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20 61 72   other fields ar
1a020 65 20 72 65 61 64 2f 77 72 69 74 65 2e 20 20 54  e read/write.  T
1a030 68 65 20 77 69 6e 53 68 6d 2e 70 53 68 6d 4e 6f  he winShm.pShmNo
1a040 64 65 2d 3e 6d 75 74 65 78 20 6d 75 73 74 20 62  de->mutex must b
1a050 65 20 68 65 6c 64 0a 2a 2a 20 77 68 69 6c 65 20  e held.** while 
1a060 61 63 63 65 73 73 69 6e 67 20 61 6e 79 20 72 65  accessing any re
1a070 61 64 2f 77 72 69 74 65 20 66 69 65 6c 64 73 2e  ad/write fields.
1a080 0a 2a 2f 0a 73 74 72 75 63 74 20 77 69 6e 53 68  .*/.struct winSh
1a090 6d 20 7b 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65  m {.  winShmNode
1a0a0 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20   *pShmNode;     
1a0b0 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69   /* The underlyi
1a0c0 6e 67 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6f 62  ng winShmNode ob
1a0d0 6a 65 63 74 20 2a 2f 0a 20 20 77 69 6e 53 68 6d  ject */.  winShm
1a0e0 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20   *pNext;        
1a0f0 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 77 69 6e       /* Next win
1a100 53 68 6d 20 77 69 74 68 20 74 68 65 20 73 61 6d  Shm with the sam
1a110 65 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a  e winShmNode */.
1a120 20 20 75 38 20 68 61 73 4d 75 74 65 78 3b 20 20    u8 hasMutex;  
1a130 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a140 54 72 75 65 20 69 66 20 68 6f 6c 64 69 6e 67 20  True if holding 
1a150 74 68 65 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6d  the winShmNode m
1a160 75 74 65 78 20 2a 2f 0a 20 20 75 31 36 20 73 68  utex */.  u16 sh
1a170 61 72 65 64 4d 61 73 6b 3b 20 20 20 20 20 20 20  aredMask;       
1a180 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
1a190 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 68 65 6c  shared locks hel
1a1a0 64 20 2a 2f 0a 20 20 75 31 36 20 65 78 63 6c 4d  d */.  u16 exclM
1a1b0 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ask;            
1a1c0 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 65 78 63    /* Mask of exc
1a1d0 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 68 65 6c  lusive locks hel
1a1e0 64 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  d */.#ifdef SQLI
1a1f0 54 45 5f 44 45 42 55 47 0a 20 20 75 38 20 69 64  TE_DEBUG.  u8 id
1a200 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1a210 20 20 20 20 20 20 2f 2a 20 49 64 20 6f 66 20 74        /* Id of t
1a220 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  his connection w
1a230 69 74 68 20 69 74 73 20 77 69 6e 53 68 6d 4e 6f  ith its winShmNo
1a240 64 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a  de */.#endif.};.
1a250 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 61 6e 74 73  ./*.** Constants
1a260 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e   used for lockin
1a270 67 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e  g.*/.#define WIN
1a280 5f 53 48 4d 5f 42 41 53 45 20 20 20 28 28 32 32  _SHM_BASE   ((22
1a290 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43  +SQLITE_SHM_NLOC
1a2a0 4b 29 2a 34 29 20 20 20 20 20 20 20 20 2f 2a 20  K)*4)        /* 
1a2b0 66 69 72 73 74 20 6c 6f 63 6b 20 62 79 74 65 20  first lock byte 
1a2c0 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e 5f 53  */.#define WIN_S
1a2d0 48 4d 5f 44 4d 53 20 20 20 20 28 57 49 4e 5f 53  HM_DMS    (WIN_S
1a2e0 48 4d 5f 42 41 53 45 2b 53 51 4c 49 54 45 5f 53  HM_BASE+SQLITE_S
1a2f0 48 4d 5f 4e 4c 4f 43 4b 29 20 20 2f 2a 20 64 65  HM_NLOCK)  /* de
1a300 61 64 6d 61 6e 20 73 77 69 74 63 68 20 2a 2f 0a  adman switch */.
1a310 0a 2f 2a 0a 2a 2a 20 41 70 70 6c 79 20 61 64 76  ./*.** Apply adv
1a320 69 73 6f 72 79 20 6c 6f 63 6b 73 20 66 6f 72 20  isory locks for 
1a330 61 6c 6c 20 6e 20 62 79 74 65 73 20 62 65 67 69  all n bytes begi
1a340 6e 6e 69 6e 67 20 61 74 20 6f 66 73 74 2e 0a 2a  nning at ofst..*
1a350 2f 0a 23 64 65 66 69 6e 65 20 5f 53 48 4d 5f 55  /.#define _SHM_U
1a360 4e 4c 43 4b 20 20 31 0a 23 64 65 66 69 6e 65 20  NLCK  1.#define 
1a370 5f 53 48 4d 5f 52 44 4c 43 4b 20 20 32 0a 23 64  _SHM_RDLCK  2.#d
1a380 65 66 69 6e 65 20 5f 53 48 4d 5f 57 52 4c 43 4b  efine _SHM_WRLCK
1a390 20 20 33 0a 73 74 61 74 69 63 20 69 6e 74 20 77    3.static int w
1a3a0 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28  inShmSystemLock(
1a3b0 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70  .  winShmNode *p
1a3c0 46 69 6c 65 2c 20 20 20 20 2f 2a 20 41 70 70 6c  File,    /* Appl
1a3d0 79 20 6c 6f 63 6b 73 20 74 6f 20 74 68 69 73 20  y locks to this 
1a3e0 6f 70 65 6e 20 73 68 61 72 65 64 2d 6d 65 6d 6f  open shared-memo
1a3f0 72 79 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20  ry segment */.  
1a400 69 6e 74 20 6c 6f 63 6b 54 79 70 65 2c 20 20 20  int lockType,   
1a410 20 20 20 20 20 20 2f 2a 20 5f 53 48 4d 5f 55 4e        /* _SHM_UN
1a420 4c 43 4b 2c 20 5f 53 48 4d 5f 52 44 4c 43 4b 2c  LCK, _SHM_RDLCK,
1a430 20 6f 72 20 5f 53 48 4d 5f 57 52 4c 43 4b 20 2a   or _SHM_WRLCK *
1a440 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20 20 20  /.  int ofst,   
1a450 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
1a460 73 65 74 20 74 6f 20 66 69 72 73 74 20 62 79 74  set to first byt
1a470 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 2f 75  e to be locked/u
1a480 6e 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74  nlocked */.  int
1a490 20 6e 42 79 74 65 20 20 20 20 20 20 20 20 20 20   nByte          
1a4a0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1a4b0 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 6f 72  bytes to lock or
1a4c0 20 75 6e 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20   unlock */.){.  
1a4d0 69 6e 74 20 72 63 20 3d 20 30 3b 20 20 20 20 20  int rc = 0;     
1a4e0 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
1a4f0 63 6f 64 65 20 66 6f 72 6d 20 4c 6f 63 6b 2f 55  code form Lock/U
1a500 6e 6c 6f 63 6b 46 69 6c 65 45 78 28 29 20 2a 2f  nlockFileEx() */
1a510 0a 0a 20 20 2f 2a 20 41 63 63 65 73 73 20 74 6f  ..  /* Access to
1a520 20 74 68 65 20 77 69 6e 53 68 6d 4e 6f 64 65 20   the winShmNode 
1a530 6f 62 6a 65 63 74 20 69 73 20 73 65 72 69 61 6c  object is serial
1a540 69 7a 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  ized by the call
1a550 65 72 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  er */.  assert( 
1a560 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
1a570 6c 64 28 70 46 69 6c 65 2d 3e 6d 75 74 65 78 29  ld(pFile->mutex)
1a580 20 7c 7c 20 70 46 69 6c 65 2d 3e 6e 52 65 66 3d   || pFile->nRef=
1a590 3d 30 20 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45  =0 );..  OSTRACE
1a5a0 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 66 69 6c 65  (("SHM-LOCK file
1a5b0 3d 25 70 2c 20 6c 6f 63 6b 3d 25 64 2c 20 6f 66  =%p, lock=%d, of
1a5c0 66 73 65 74 3d 25 64 2c 20 73 69 7a 65 3d 25 64  fset=%d, size=%d
1a5d0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
1a5e0 70 46 69 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c 20  pFile->hFile.h, 
1a5f0 6c 6f 63 6b 54 79 70 65 2c 20 6f 66 73 74 2c 20  lockType, ofst, 
1a600 6e 42 79 74 65 29 29 3b 0a 0a 20 20 2f 2a 20 52  nByte));..  /* R
1a610 65 6c 65 61 73 65 2f 41 63 71 75 69 72 65 20 74  elease/Acquire t
1a620 68 65 20 73 79 73 74 65 6d 2d 6c 65 76 65 6c 20  he system-level 
1a630 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 6c 6f  lock */.  if( lo
1a640 63 6b 54 79 70 65 3d 3d 5f 53 48 4d 5f 55 4e 4c  ckType==_SHM_UNL
1a650 43 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 77  CK ){.    rc = w
1a660 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46  inUnlockFile(&pF
1a670 69 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c 20 6f 66  ile->hFile.h, of
1a680 73 74 2c 20 30 2c 20 6e 42 79 74 65 2c 20 30 29  st, 0, nByte, 0)
1a690 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
1a6a0 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
1a6b0 20 6c 6f 63 6b 69 6e 67 20 70 61 72 61 6d 65 74   locking paramet
1a6c0 65 72 73 20 2a 2f 0a 20 20 20 20 44 57 4f 52 44  ers */.    DWORD
1a6d0 20 64 77 46 6c 61 67 73 20 3d 20 4c 4f 43 4b 46   dwFlags = LOCKF
1a6e0 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41  ILE_FAIL_IMMEDIA
1a6f0 54 45 4c 59 3b 0a 20 20 20 20 69 66 28 20 6c 6f  TELY;.    if( lo
1a700 63 6b 54 79 70 65 20 3d 3d 20 5f 53 48 4d 5f 57  ckType == _SHM_W
1a710 52 4c 43 4b 20 29 20 64 77 46 6c 61 67 73 20 7c  RLCK ) dwFlags |
1a720 3d 20 4c 4f 43 4b 46 49 4c 45 5f 45 58 43 4c 55  = LOCKFILE_EXCLU
1a730 53 49 56 45 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72  SIVE_LOCK;.    r
1a740 63 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28  c = winLockFile(
1a750 26 70 46 69 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c  &pFile->hFile.h,
1a760 20 64 77 46 6c 61 67 73 2c 20 6f 66 73 74 2c 20   dwFlags, ofst, 
1a770 30 2c 20 6e 42 79 74 65 2c 20 30 29 3b 0a 20 20  0, nByte, 0);.  
1a780 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d 20 30 20  }..  if( rc!= 0 
1a790 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
1a7a0 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  TE_OK;.  }else{.
1a7b0 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
1a7c0 72 72 6e 6f 20 3d 20 20 6f 73 47 65 74 4c 61 73  rrno =  osGetLas
1a7d0 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 72 63  tError();.    rc
1a7e0 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
1a7f0 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28 28    }..  OSTRACE((
1a800 22 53 48 4d 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25  "SHM-LOCK file=%
1a810 70 2c 20 66 75 6e 63 3d 25 73 2c 20 65 72 72 6e  p, func=%s, errn
1a820 6f 3d 25 6c 75 2c 20 72 63 3d 25 73 5c 6e 22 2c  o=%lu, rc=%s\n",
1a830 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c  .           pFil
1a840 65 2d 3e 68 46 69 6c 65 2e 68 2c 20 28 6c 6f 63  e->hFile.h, (loc
1a850 6b 54 79 70 65 20 3d 3d 20 5f 53 48 4d 5f 55 4e  kType == _SHM_UN
1a860 4c 43 4b 29 20 3f 20 22 77 69 6e 55 6e 6c 6f 63  LCK) ? "winUnloc
1a870 6b 46 69 6c 65 22 20 3a 0a 20 20 20 20 20 20 20  kFile" :.       
1a880 20 20 20 20 22 77 69 6e 4c 6f 63 6b 46 69 6c 65      "winLockFile
1a890 22 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  ", pFile->lastEr
1a8a0 72 6e 6f 2c 20 73 71 6c 69 74 65 33 45 72 72 4e  rno, sqlite3ErrN
1a8b0 61 6d 65 28 72 63 29 29 29 3b 0a 0a 20 20 72 65  ame(rc)));..  re
1a8c0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46  turn rc;.}../* F
1a8d0 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
1a8e0 73 20 74 6f 20 56 46 53 20 6d 65 74 68 6f 64 73  s to VFS methods
1a8f0 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77   */.static int w
1a900 69 6e 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76  inOpen(sqlite3_v
1a910 66 73 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c  fs*,const char*,
1a920 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 69 6e  sqlite3_file*,in
1a930 74 2c 69 6e 74 2a 29 3b 0a 73 74 61 74 69 63 20  t,int*);.static 
1a940 69 6e 74 20 77 69 6e 44 65 6c 65 74 65 28 73 71  int winDelete(sq
1a950 6c 69 74 65 33 5f 76 66 73 20 2a 2c 63 6f 6e 73  lite3_vfs *,cons
1a960 74 20 63 68 61 72 2a 2c 69 6e 74 29 3b 0a 0a 2f  t char*,int);../
1a970 2a 0a 2a 2a 20 50 75 72 67 65 20 74 68 65 20 77  *.** Purge the w
1a980 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 20 6c 69  inShmNodeList li
1a990 73 74 20 6f 66 20 61 6c 6c 20 65 6e 74 72 69 65  st of all entrie
1a9a0 73 20 77 69 74 68 20 77 69 6e 53 68 6d 4e 6f 64  s with winShmNod
1a9b0 65 2e 6e 52 65 66 3d 3d 30 2e 0a 2a 2a 0a 2a 2a  e.nRef==0..**.**
1a9c0 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 56   This is not a V
1a9d0 46 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  FS shared-memory
1a9e0 20 6d 65 74 68 6f 64 3b 20 69 74 20 69 73 20 61   method; it is a
1a9f0 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69 6f   utility functio
1aa00 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 62 79 20 56  n called.** by V
1aa10 46 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  FS shared-memory
1aa20 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 73 74 61   methods..*/.sta
1aa30 74 69 63 20 76 6f 69 64 20 77 69 6e 53 68 6d 50  tic void winShmP
1aa40 75 72 67 65 28 73 71 6c 69 74 65 33 5f 76 66 73  urge(sqlite3_vfs
1aa50 20 2a 70 56 66 73 2c 20 69 6e 74 20 64 65 6c 65   *pVfs, int dele
1aa60 74 65 46 6c 61 67 29 7b 0a 20 20 77 69 6e 53 68  teFlag){.  winSh
1aa70 6d 4e 6f 64 65 20 2a 2a 70 70 3b 0a 20 20 77 69  mNode **pp;.  wi
1aa80 6e 53 68 6d 4e 6f 64 65 20 2a 70 3b 0a 20 20 61  nShmNode *p;.  a
1aa90 73 73 65 72 74 28 20 77 69 6e 53 68 6d 4d 75 74  ssert( winShmMut
1aaa0 65 78 48 65 6c 64 28 29 20 29 3b 0a 20 20 4f 53  exHeld() );.  OS
1aab0 54 52 41 43 45 28 28 22 53 48 4d 2d 50 55 52 47  TRACE(("SHM-PURG
1aac0 45 20 70 69 64 3d 25 6c 75 2c 20 64 65 6c 65 74  E pid=%lu, delet
1aad0 65 46 6c 61 67 3d 25 64 5c 6e 22 2c 0a 20 20 20  eFlag=%d\n",.   
1aae0 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
1aaf0 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
1ab00 20 64 65 6c 65 74 65 46 6c 61 67 29 29 3b 0a 20   deleteFlag));. 
1ab10 20 70 70 20 3d 20 26 77 69 6e 53 68 6d 4e 6f 64   pp = &winShmNod
1ab20 65 4c 69 73 74 3b 0a 20 20 77 68 69 6c 65 28 20  eList;.  while( 
1ab30 28 70 20 3d 20 2a 70 70 29 21 3d 30 20 29 7b 0a  (p = *pp)!=0 ){.
1ab40 20 20 20 20 69 66 28 20 70 2d 3e 6e 52 65 66 3d      if( p->nRef=
1ab50 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
1ab60 69 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  i;.      if( p->
1ab70 6d 75 74 65 78 20 29 7b 20 73 71 6c 69 74 65 33  mutex ){ sqlite3
1ab80 5f 6d 75 74 65 78 5f 66 72 65 65 28 70 2d 3e 6d  _mutex_free(p->m
1ab90 75 74 65 78 29 3b 20 7d 0a 20 20 20 20 20 20 66  utex); }.      f
1aba0 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 52 65  or(i=0; i<p->nRe
1abb0 67 69 6f 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  gion; i++){.    
1abc0 20 20 20 20 42 4f 4f 4c 20 62 52 63 20 3d 20 6f      BOOL bRc = o
1abd0 73 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65  sUnmapViewOfFile
1abe0 28 70 2d 3e 61 52 65 67 69 6f 6e 5b 69 5d 2e 70  (p->aRegion[i].p
1abf0 4d 61 70 29 3b 0a 20 20 20 20 20 20 20 20 4f 53  Map);.        OS
1ac00 54 52 41 43 45 28 28 22 53 48 4d 2d 50 55 52 47  TRACE(("SHM-PURG
1ac10 45 2d 55 4e 4d 41 50 20 70 69 64 3d 25 6c 75 2c  E-UNMAP pid=%lu,
1ac20 20 72 65 67 69 6f 6e 3d 25 64 2c 20 72 63 3d 25   region=%d, rc=%
1ac30 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
1ac40 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72         osGetCurr
1ac50 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
1ac60 69 2c 20 62 52 63 20 3f 20 22 6f 6b 22 20 3a 20  i, bRc ? "ok" : 
1ac70 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20 20  "failed"));.    
1ac80 20 20 20 20 55 4e 55 53 45 44 5f 56 41 52 49 41      UNUSED_VARIA
1ac90 42 4c 45 5f 56 41 4c 55 45 28 62 52 63 29 3b 0a  BLE_VALUE(bRc);.
1aca0 20 20 20 20 20 20 20 20 62 52 63 20 3d 20 6f 73          bRc = os
1acb0 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 2d 3e 61  CloseHandle(p->a
1acc0 52 65 67 69 6f 6e 5b 69 5d 2e 68 4d 61 70 29 3b  Region[i].hMap);
1acd0 0a 20 20 20 20 20 20 20 20 4f 53 54 52 41 43 45  .        OSTRACE
1ace0 28 28 22 53 48 4d 2d 50 55 52 47 45 2d 43 4c 4f  (("SHM-PURGE-CLO
1acf0 53 45 20 70 69 64 3d 25 6c 75 2c 20 72 65 67 69  SE pid=%lu, regi
1ad00 6f 6e 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22 2c  on=%d, rc=%s\n",
1ad10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1ad20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72    osGetCurrentPr
1ad30 6f 63 65 73 73 49 64 28 29 2c 20 69 2c 20 62 52  ocessId(), i, bR
1ad40 63 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c  c ? "ok" : "fail
1ad50 65 64 22 29 29 3b 0a 20 20 20 20 20 20 20 20 55  ed"));.        U
1ad60 4e 55 53 45 44 5f 56 41 52 49 41 42 4c 45 5f 56  NUSED_VARIABLE_V
1ad70 41 4c 55 45 28 62 52 63 29 3b 0a 20 20 20 20 20  ALUE(bRc);.     
1ad80 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e   }.      if( p->
1ad90 68 46 69 6c 65 2e 68 21 3d 4e 55 4c 4c 20 26 26  hFile.h!=NULL &&
1ada0 20 70 2d 3e 68 46 69 6c 65 2e 68 21 3d 49 4e 56   p->hFile.h!=INV
1adb0 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
1adc0 45 20 29 7b 0a 20 20 20 20 20 20 20 20 53 69 6d  E ){.        Sim
1add0 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
1ade0 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 20 20 77  gn(1);.        w
1adf0 69 6e 43 6c 6f 73 65 28 28 73 71 6c 69 74 65 33  inClose((sqlite3
1ae00 5f 66 69 6c 65 20 2a 29 26 70 2d 3e 68 46 69 6c  _file *)&p->hFil
1ae10 65 29 3b 0a 20 20 20 20 20 20 20 20 53 69 6d 75  e);.        Simu
1ae20 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
1ae30 6e 28 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n(0);.      }.  
1ae40 20 20 20 20 69 66 28 20 64 65 6c 65 74 65 46 6c      if( deleteFl
1ae50 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 53 69  ag ){.        Si
1ae60 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
1ae70 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 20 20  ign(1);.        
1ae80 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
1ae90 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
1aea0 20 20 20 20 77 69 6e 44 65 6c 65 74 65 28 70 56      winDelete(pV
1aeb0 66 73 2c 20 70 2d 3e 7a 46 69 6c 65 6e 61 6d 65  fs, p->zFilename
1aec0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
1aed0 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
1aee0 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20  lloc();.        
1aef0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
1af00 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20  enign(0);.      
1af10 7d 0a 20 20 20 20 20 20 2a 70 70 20 3d 20 70 2d  }.      *pp = p-
1af20 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 73 71  >pNext;.      sq
1af30 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 52  lite3_free(p->aR
1af40 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20 73 71  egion);.      sq
1af50 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
1af60 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1af70 70 70 20 3d 20 26 70 2d 3e 70 4e 65 78 74 3b 0a  pp = &p->pNext;.
1af80 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
1af90 2a 2a 20 4f 70 65 6e 20 74 68 65 20 73 68 61 72  ** Open the shar
1afa0 65 64 2d 6d 65 6d 6f 72 79 20 61 72 65 61 20 61  ed-memory area a
1afb0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 64  ssociated with d
1afc0 61 74 61 62 61 73 65 20 66 69 6c 65 20 70 44 62  atabase file pDb
1afd0 46 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6f  Fd..**.** When o
1afe0 70 65 6e 69 6e 67 20 61 20 6e 65 77 20 73 68 61  pening a new sha
1aff0 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c  red-memory file,
1b000 20 69 66 20 6e 6f 20 6f 74 68 65 72 20 69 6e 73   if no other ins
1b010 74 61 6e 63 65 73 20 6f 66 20 74 68 61 74 0a 2a  tances of that.*
1b020 2a 20 66 69 6c 65 20 61 72 65 20 63 75 72 72 65  * file are curre
1b030 6e 74 6c 79 20 6f 70 65 6e 2c 20 69 6e 20 74 68  ntly open, in th
1b040 69 73 20 70 72 6f 63 65 73 73 20 6f 72 20 69 6e  is process or in
1b050 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73   other processes
1b060 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 66 69  , then.** the fi
1b070 6c 65 20 6d 75 73 74 20 62 65 20 74 72 75 6e 63  le must be trunc
1b080 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 6c 65 6e  ated to zero len
1b090 67 74 68 20 6f 72 20 68 61 76 65 20 69 74 73 20  gth or have its 
1b0a0 68 65 61 64 65 72 20 63 6c 65 61 72 65 64 2e 0a  header cleared..
1b0b0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
1b0c0 6e 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72  nOpenSharedMemor
1b0d0 79 28 77 69 6e 46 69 6c 65 20 2a 70 44 62 46 64  y(winFile *pDbFd
1b0e0 29 7b 0a 20 20 73 74 72 75 63 74 20 77 69 6e 53  ){.  struct winS
1b0f0 68 6d 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  hm *p;          
1b100 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
1b110 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65 20  onnection to be 
1b120 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75  opened */.  stru
1b130 63 74 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70  ct winShmNode *p
1b140 53 68 6d 4e 6f 64 65 20 3d 20 30 3b 20 20 20 2f  ShmNode = 0;   /
1b150 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  * The underlying
1b160 20 6d 6d 61 70 70 65 64 20 66 69 6c 65 20 2a 2f   mmapped file */
1b170 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
1b180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b190 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
1b1a0 63 6f 64 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  code */.  struct
1b1b0 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 4e 65   winShmNode *pNe
1b1c0 77 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  w;           /* 
1b1d0 4e 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  Newly allocated 
1b1e0 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20  winShmNode */.  
1b1f0 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20  int nName;      
1b200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b210 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 7a 4e     /* Size of zN
1b220 61 6d 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ame in bytes */.
1b230 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 46 64  .  assert( pDbFd
1b240 2d 3e 70 53 68 6d 3d 3d 30 20 29 3b 20 20 20 20  ->pShm==0 );    
1b250 2f 2a 20 4e 6f 74 20 70 72 65 76 69 6f 75 73 6c  /* Not previousl
1b260 79 20 6f 70 65 6e 65 64 20 2a 2f 0a 0a 20 20 2f  y opened */..  /
1b270 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  * Allocate space
1b280 20 66 6f 72 20 74 68 65 20 6e 65 77 20 73 71 6c   for the new sql
1b290 69 74 65 33 5f 73 68 6d 20 6f 62 6a 65 63 74 2e  ite3_shm object.
1b2a0 20 20 41 6c 73 6f 20 73 70 65 63 75 6c 61 74 69    Also speculati
1b2b0 76 65 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61  vely.  ** alloca
1b2c0 74 65 20 73 70 61 63 65 20 66 6f 72 20 61 20 6e  te space for a n
1b2d0 65 77 20 77 69 6e 53 68 6d 4e 6f 64 65 20 61 6e  ew winShmNode an
1b2e0 64 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 2a 2f  d filename..  */
1b2f0 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 4d 61  .  p = sqlite3Ma
1b300 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66  llocZero( sizeof
1b310 28 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70 3d  (*p) );.  if( p=
1b320 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
1b330 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a  TE_IOERR_NOMEM;.
1b340 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    nName = sqlite
1b350 33 53 74 72 6c 65 6e 33 30 28 70 44 62 46 64 2d  3Strlen30(pDbFd-
1b360 3e 7a 50 61 74 68 29 3b 0a 20 20 70 4e 65 77 20  >zPath);.  pNew 
1b370 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  = sqlite3MallocZ
1b380 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70 53 68  ero( sizeof(*pSh
1b390 6d 4e 6f 64 65 29 20 2b 20 6e 4e 61 6d 65 20 2b  mNode) + nName +
1b3a0 20 31 37 20 29 3b 0a 20 20 69 66 28 20 70 4e 65   17 );.  if( pNe
1b3b0 77 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  w==0 ){.    sqli
1b3c0 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20  te3_free(p);.   
1b3d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
1b3e0 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  OERR_NOMEM;.  }.
1b3f0 20 20 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d    pNew->zFilenam
1b400 65 20 3d 20 28 63 68 61 72 2a 29 26 70 4e 65 77  e = (char*)&pNew
1b410 5b 31 5d 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  [1];.  sqlite3_s
1b420 6e 70 72 69 6e 74 66 28 6e 4e 61 6d 65 2b 31 35  nprintf(nName+15
1b430 2c 20 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d  , pNew->zFilenam
1b440 65 2c 20 22 25 73 2d 73 68 6d 22 2c 20 70 44 62  e, "%s-shm", pDb
1b450 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 73 71  Fd->zPath);.  sq
1b460 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69 78 33  lite3FileSuffix3
1b470 28 70 44 62 46 64 2d 3e 7a 50 61 74 68 2c 20 70  (pDbFd->zPath, p
1b480 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b  New->zFilename);
1b490 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 74 6f 20 73  ..  /* Look to s
1b4a0 65 65 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ee if there is a
1b4b0 6e 20 65 78 69 73 74 69 6e 67 20 77 69 6e 53 68  n existing winSh
1b4c0 6d 4e 6f 64 65 20 74 68 61 74 20 63 61 6e 20 62  mNode that can b
1b4d0 65 20 75 73 65 64 2e 0a 20 20 2a 2a 20 49 66 20  e used..  ** If 
1b4e0 6e 6f 20 6d 61 74 63 68 69 6e 67 20 77 69 6e 53  no matching winS
1b4f0 68 6d 4e 6f 64 65 20 63 75 72 72 65 6e 74 6c 79  hmNode currently
1b500 20 65 78 69 73 74 73 2c 20 63 72 65 61 74 65 20   exists, create 
1b510 61 20 6e 65 77 20 6f 6e 65 2e 0a 20 20 2a 2f 0a  a new one..  */.
1b520 20 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74    winShmEnterMut
1b530 65 78 28 29 3b 0a 20 20 66 6f 72 28 70 53 68 6d  ex();.  for(pShm
1b540 4e 6f 64 65 20 3d 20 77 69 6e 53 68 6d 4e 6f 64  Node = winShmNod
1b550 65 4c 69 73 74 3b 20 70 53 68 6d 4e 6f 64 65 3b  eList; pShmNode;
1b560 20 70 53 68 6d 4e 6f 64 65 3d 70 53 68 6d 4e 6f   pShmNode=pShmNo
1b570 64 65 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  de->pNext){.    
1b580 2f 2a 20 54 42 44 20 6e 65 65 64 20 74 6f 20 63  /* TBD need to c
1b590 6f 6d 65 20 75 70 20 77 69 74 68 20 62 65 74 74  ome up with bett
1b5a0 65 72 20 6d 61 74 63 68 20 68 65 72 65 2e 20 20  er match here.  
1b5b0 50 65 72 68 61 70 73 0a 20 20 20 20 2a 2a 20 75  Perhaps.    ** u
1b5c0 73 65 20 46 49 4c 45 5f 49 44 5f 42 4f 54 48 5f  se FILE_ID_BOTH_
1b5d0 44 49 52 5f 49 4e 46 4f 20 53 74 72 75 63 74 75  DIR_INFO Structu
1b5e0 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  re..    */.    i
1b5f0 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
1b600 70 28 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c  p(pShmNode->zFil
1b610 65 6e 61 6d 65 2c 20 70 4e 65 77 2d 3e 7a 46 69  ename, pNew->zFi
1b620 6c 65 6e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65  lename)==0 ) bre
1b630 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53  ak;.  }.  if( pS
1b640 68 6d 4e 6f 64 65 20 29 7b 0a 20 20 20 20 73 71  hmNode ){.    sq
1b650 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77 29  lite3_free(pNew)
1b660 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
1b670 53 68 6d 4e 6f 64 65 20 3d 20 70 4e 65 77 3b 0a  ShmNode = pNew;.
1b680 20 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20      pNew = 0;.  
1b690 20 20 28 28 77 69 6e 46 69 6c 65 2a 29 28 26 70    ((winFile*)(&p
1b6a0 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 29 29  ShmNode->hFile))
1b6b0 2d 3e 68 20 3d 20 49 4e 56 41 4c 49 44 5f 48 41  ->h = INVALID_HA
1b6c0 4e 44 4c 45 5f 56 41 4c 55 45 3b 0a 20 20 20 20  NDLE_VALUE;.    
1b6d0 70 53 68 6d 4e 6f 64 65 2d 3e 70 4e 65 78 74 20  pShmNode->pNext 
1b6e0 3d 20 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74  = winShmNodeList
1b6f0 3b 0a 20 20 20 20 77 69 6e 53 68 6d 4e 6f 64 65  ;.    winShmNode
1b700 4c 69 73 74 20 3d 20 70 53 68 6d 4e 6f 64 65 3b  List = pShmNode;
1b710 0a 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e  ..    pShmNode->
1b720 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 5f  mutex = sqlite3_
1b730 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49  mutex_alloc(SQLI
1b740 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a  TE_MUTEX_FAST);.
1b750 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65      if( pShmNode
1b760 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20  ->mutex==0 ){.  
1b770 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1b780 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  IOERR_NOMEM;.   
1b790 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e     goto shm_open
1b7a0 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  _err;.    }..   
1b7b0 20 72 63 20 3d 20 77 69 6e 4f 70 65 6e 28 70 44   rc = winOpen(pD
1b7c0 62 46 64 2d 3e 70 56 66 73 2c 0a 20 20 20 20 20  bFd->pVfs,.     
1b7d0 20 20 20 20 20 20 20 20 20 20 20 20 70 53 68 6d              pShm
1b7e0 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  Node->zFilename,
1b7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b800 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65  Name of the file
1b810 20 28 55 54 46 2d 38 29 20 2a 2f 0a 20 20 20 20   (UTF-8) */.    
1b820 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73 71               (sq
1b830 6c 69 74 65 33 5f 66 69 6c 65 2a 29 26 70 53 68  lite3_file*)&pSh
1b840 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c 20 20 2f  mNode->hFile,  /
1b850 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 68 65  * File handle he
1b860 72 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  re */.          
1b870 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
1b880 45 4e 5f 57 41 4c 20 7c 20 53 51 4c 49 54 45 5f  EN_WAL | SQLITE_
1b890 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c  OPEN_READWRITE |
1b8a0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
1b8b0 41 54 45 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ATE,.           
1b8c0 20 20 20 20 20 20 30 29 3b 0a 20 20 20 20 69 66        0);.    if
1b8d0 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20  ( SQLITE_OK!=rc 
1b8e0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68  ){.      goto sh
1b8f0 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20  m_open_err;.    
1b900 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  }..    /* Check 
1b910 74 6f 20 73 65 65 20 69 66 20 61 6e 6f 74 68 65  to see if anothe
1b920 72 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c  r process is hol
1b930 64 69 6e 67 20 74 68 65 20 64 65 61 64 2d 6d 61  ding the dead-ma
1b940 6e 20 73 77 69 74 63 68 2e 0a 20 20 20 20 2a 2a  n switch..    **
1b950 20 49 66 20 6e 6f 74 2c 20 74 72 75 6e 63 61 74   If not, truncat
1b960 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 7a 65  e the file to ze
1b970 72 6f 20 6c 65 6e 67 74 68 2e 0a 20 20 20 20 2a  ro length..    *
1b980 2f 0a 20 20 20 20 69 66 28 20 77 69 6e 53 68 6d  /.    if( winShm
1b990 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e  SystemLock(pShmN
1b9a0 6f 64 65 2c 20 5f 53 48 4d 5f 57 52 4c 43 4b 2c  ode, _SHM_WRLCK,
1b9b0 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31 29   WIN_SHM_DMS, 1)
1b9c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1b9d0 20 20 20 20 20 72 63 20 3d 20 77 69 6e 54 72 75       rc = winTru
1b9e0 6e 63 61 74 65 28 28 73 71 6c 69 74 65 33 5f 66  ncate((sqlite3_f
1b9f0 69 6c 65 20 2a 29 26 70 53 68 6d 4e 6f 64 65 2d  ile *)&pShmNode-
1ba00 3e 68 46 69 6c 65 2c 20 30 29 3b 0a 20 20 20 20  >hFile, 0);.    
1ba10 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1ba20 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
1ba30 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  c = winLogError(
1ba40 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d  SQLITE_IOERR_SHM
1ba50 4f 50 45 4e 2c 20 6f 73 47 65 74 4c 61 73 74 45  OPEN, osGetLastE
1ba60 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20  rror(),.        
1ba70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba80 20 22 77 69 6e 4f 70 65 6e 53 68 6d 22 2c 20 70   "winOpenShm", p
1ba90 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  DbFd->zPath);.  
1baa0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1bab0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1bac0 4b 20 29 7b 0a 20 20 20 20 20 20 77 69 6e 53 68  K ){.      winSh
1bad0 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d  mSystemLock(pShm
1bae0 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55 4e 4c 43 4b  Node, _SHM_UNLCK
1baf0 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31  , WIN_SHM_DMS, 1
1bb00 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69  );.      rc = wi
1bb10 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70  nShmSystemLock(p
1bb20 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 52 44  ShmNode, _SHM_RD
1bb30 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53  LCK, WIN_SHM_DMS
1bb40 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 1);.    }.    
1bb50 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 73 68  if( rc ) goto sh
1bb60 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 7d 0a  m_open_err;.  }.
1bb70 0a 20 20 2f 2a 20 4d 61 6b 65 20 74 68 65 20 6e  .  /* Make the n
1bb80 65 77 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 20  ew connection a 
1bb90 63 68 69 6c 64 20 6f 66 20 74 68 65 20 77 69 6e  child of the win
1bba0 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 70 2d 3e  ShmNode */.  p->
1bbb0 70 53 68 6d 4e 6f 64 65 20 3d 20 70 53 68 6d 4e  pShmNode = pShmN
1bbc0 6f 64 65 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  ode;.#ifdef SQLI
1bbd0 54 45 5f 44 45 42 55 47 0a 20 20 70 2d 3e 69 64  TE_DEBUG.  p->id
1bbe0 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 65 78   = pShmNode->nex
1bbf0 74 53 68 6d 49 64 2b 2b 3b 0a 23 65 6e 64 69 66  tShmId++;.#endif
1bc00 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  .  pShmNode->nRe
1bc10 66 2b 2b 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53  f++;.  pDbFd->pS
1bc20 68 6d 20 3d 20 70 3b 0a 20 20 77 69 6e 53 68 6d  hm = p;.  winShm
1bc30 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 0a 20  LeaveMutex();.. 
1bc40 20 2f 2a 20 54 68 65 20 72 65 66 65 72 65 6e 63   /* The referenc
1bc50 65 20 63 6f 75 6e 74 20 6f 6e 20 70 53 68 6d 4e  e count on pShmN
1bc60 6f 64 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  ode has already 
1bc70 62 65 65 6e 20 69 6e 63 72 65 6d 65 6e 74 65 64  been incremented
1bc80 20 75 6e 64 65 72 0a 20 20 2a 2a 20 74 68 65 20   under.  ** the 
1bc90 63 6f 76 65 72 20 6f 66 20 74 68 65 20 77 69 6e  cover of the win
1bca0 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 29 20  ShmEnterMutex() 
1bcb0 6d 75 74 65 78 20 61 6e 64 20 74 68 65 20 70 6f  mutex and the po
1bcc0 69 6e 74 65 72 20 66 72 6f 6d 20 74 68 65 0a 20  inter from the. 
1bcd0 20 2a 2a 20 6e 65 77 20 28 73 74 72 75 63 74 20   ** new (struct 
1bce0 77 69 6e 53 68 6d 29 20 6f 62 6a 65 63 74 20 74  winShm) object t
1bcf0 6f 20 74 68 65 20 70 53 68 6d 4e 6f 64 65 20 68  o the pShmNode h
1bd00 61 73 20 62 65 65 6e 20 73 65 74 2e 20 41 6c 6c  as been set. All
1bd10 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 6c 65   that is.  ** le
1bd20 66 74 20 74 6f 20 64 6f 20 69 73 20 74 6f 20 6c  ft to do is to l
1bd30 69 6e 6b 20 74 68 65 20 6e 65 77 20 6f 62 6a 65  ink the new obje
1bd40 63 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b  ct into the link
1bd50 65 64 20 6c 69 73 74 20 73 74 61 72 74 69 6e 67  ed list starting
1bd60 0a 20 20 2a 2a 20 61 74 20 70 53 68 6d 4e 6f 64  .  ** at pShmNod
1bd70 65 2d 3e 70 46 69 72 73 74 2e 20 54 68 69 73 20  e->pFirst. This 
1bd80 6d 75 73 74 20 62 65 20 64 6f 6e 65 20 77 68 69  must be done whi
1bd90 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 70  le holding the p
1bda0 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 0a 20  ShmNode->mutex. 
1bdb0 20 2a 2a 20 6d 75 74 65 78 2e 0a 20 20 2a 2f 0a   ** mutex..  */.
1bdc0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1bdd0 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e  enter(pShmNode->
1bde0 6d 75 74 65 78 29 3b 0a 20 20 70 2d 3e 70 4e 65  mutex);.  p->pNe
1bdf0 78 74 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 70  xt = pShmNode->p
1be00 46 69 72 73 74 3b 0a 20 20 70 53 68 6d 4e 6f 64  First;.  pShmNod
1be10 65 2d 3e 70 46 69 72 73 74 20 3d 20 70 3b 0a 20  e->pFirst = p;. 
1be20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
1be30 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  eave(pShmNode->m
1be40 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
1be50 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a  SQLITE_OK;..  /*
1be60 20 4a 75 6d 70 20 68 65 72 65 20 6f 6e 20 61 6e   Jump here on an
1be70 79 20 65 72 72 6f 72 20 2a 2f 0a 73 68 6d 5f 6f  y error */.shm_o
1be80 70 65 6e 5f 65 72 72 3a 0a 20 20 77 69 6e 53 68  pen_err:.  winSh
1be90 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d  mSystemLock(pShm
1bea0 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55 4e 4c 43 4b  Node, _SHM_UNLCK
1beb0 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31  , WIN_SHM_DMS, 1
1bec0 29 3b 0a 20 20 77 69 6e 53 68 6d 50 75 72 67 65  );.  winShmPurge
1bed0 28 70 44 62 46 64 2d 3e 70 56 66 73 2c 20 30 29  (pDbFd->pVfs, 0)
1bee0 3b 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63  ;      /* This c
1bef0 61 6c 6c 20 66 72 65 65 73 20 70 53 68 6d 4e 6f  all frees pShmNo
1bf00 64 65 20 69 66 20 72 65 71 75 69 72 65 64 20 2a  de if required *
1bf10 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  /.  sqlite3_free
1bf20 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  (p);.  sqlite3_f
1bf30 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 77 69 6e  ree(pNew);.  win
1bf40 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  ShmLeaveMutex();
1bf50 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1bf60 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63  ./*.** Close a c
1bf70 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 73 68 61  onnection to sha
1bf80 72 65 64 2d 6d 65 6d 6f 72 79 2e 20 20 44 65 6c  red-memory.  Del
1bf90 65 74 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69  ete the underlyi
1bfa0 6e 67 0a 2a 2a 20 73 74 6f 72 61 67 65 20 69 66  ng.** storage if
1bfb0 20 64 65 6c 65 74 65 46 6c 61 67 20 69 73 20 74   deleteFlag is t
1bfc0 72 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  rue..*/.static i
1bfd0 6e 74 20 77 69 6e 53 68 6d 55 6e 6d 61 70 28 0a  nt winShmUnmap(.
1bfe0 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
1bff0 66 64 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  fd,          /* 
1c000 44 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67  Database holding
1c010 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a   shared memory *
1c020 2f 0a 20 20 69 6e 74 20 64 65 6c 65 74 65 46 6c  /.  int deleteFl
1c030 61 67 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ag             /
1c040 2a 20 44 65 6c 65 74 65 20 61 66 74 65 72 20 63  * Delete after c
1c050 6c 6f 73 69 6e 67 20 69 66 20 74 72 75 65 20 2a  losing if true *
1c060 2f 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a  /.){.  winFile *
1c070 70 44 62 46 64 3b 20 20 20 20 20 20 20 2f 2a 20  pDbFd;       /* 
1c080 44 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67  Database holding
1c090 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 2a   shared-memory *
1c0a0 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70 3b 20 20  /.  winShm *p;  
1c0b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1c0c0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62   connection to b
1c0d0 65 20 63 6c 6f 73 65 64 20 2a 2f 0a 20 20 77 69  e closed */.  wi
1c0e0 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f  nShmNode *pShmNo
1c0f0 64 65 3b 20 2f 2a 20 54 68 65 20 75 6e 64 65 72  de; /* The under
1c100 6c 79 69 6e 67 20 73 68 61 72 65 64 2d 6d 65 6d  lying shared-mem
1c110 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 77 69  ory file */.  wi
1c120 6e 53 68 6d 20 2a 2a 70 70 3b 20 20 20 20 20 20  nShm **pp;      
1c130 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69      /* For loopi
1c140 6e 67 20 6f 76 65 72 20 73 69 62 6c 69 6e 67 20  ng over sibling 
1c150 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 0a  connections */..
1c160 20 20 70 44 62 46 64 20 3d 20 28 77 69 6e 46 69    pDbFd = (winFi
1c170 6c 65 2a 29 66 64 3b 0a 20 20 70 20 3d 20 70 44  le*)fd;.  p = pD
1c180 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 69 66 28  bFd->pShm;.  if(
1c190 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53   p==0 ) return S
1c1a0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 53 68 6d  QLITE_OK;.  pShm
1c1b0 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f  Node = p->pShmNo
1c1c0 64 65 3b 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65  de;..  /* Remove
1c1d0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 66 72   connection p fr
1c1e0 6f 6d 20 74 68 65 20 73 65 74 20 6f 66 20 63 6f  om the set of co
1c1f0 6e 6e 65 63 74 69 6f 6e 73 20 61 73 73 6f 63 69  nnections associ
1c200 61 74 65 64 0a 20 20 2a 2a 20 77 69 74 68 20 70  ated.  ** with p
1c210 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c  ShmNode */.  sql
1c220 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
1c230 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
1c240 29 3b 0a 20 20 66 6f 72 28 70 70 3d 26 70 53 68  );.  for(pp=&pSh
1c250 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 28  mNode->pFirst; (
1c260 2a 70 70 29 21 3d 70 3b 20 70 70 20 3d 20 26 28  *pp)!=p; pp = &(
1c270 2a 70 70 29 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20  *pp)->pNext){}. 
1c280 20 2a 70 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b   *pp = p->pNext;
1c290 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74 68 65 20  ..  /* Free the 
1c2a0 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 2a 2f 0a  connection p */.
1c2b0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
1c2c0 29 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53 68 6d  );.  pDbFd->pShm
1c2d0 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = 0;.  sqlite3_
1c2e0 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d  mutex_leave(pShm
1c2f0 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 0a 20  Node->mutex);.. 
1c300 20 2f 2a 20 49 66 20 70 53 68 6d 4e 6f 64 65 2d   /* If pShmNode-
1c310 3e 6e 52 65 66 20 68 61 73 20 72 65 61 63 68 65  >nRef has reache
1c320 64 20 30 2c 20 74 68 65 6e 20 63 6c 6f 73 65 20  d 0, then close 
1c330 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a 20  the underlying. 
1c340 20 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72   ** shared-memor
1c350 79 20 66 69 6c 65 2c 20 74 6f 6f 20 2a 2f 0a 20  y file, too */. 
1c360 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65   winShmEnterMute
1c370 78 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  x();.  assert( p
1c380 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3e 30 20  ShmNode->nRef>0 
1c390 29 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  );.  pShmNode->n
1c3a0 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 53 68  Ref--;.  if( pSh
1c3b0 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 29  mNode->nRef==0 )
1c3c0 7b 0a 20 20 20 20 77 69 6e 53 68 6d 50 75 72 67  {.    winShmPurg
1c3d0 65 28 70 44 62 46 64 2d 3e 70 56 66 73 2c 20 64  e(pDbFd->pVfs, d
1c3e0 65 6c 65 74 65 46 6c 61 67 29 3b 0a 20 20 7d 0a  eleteFlag);.  }.
1c3f0 20 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74    winShmLeaveMut
1c400 65 78 28 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  ex();..  return 
1c410 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
1c420 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6c  .** Change the l
1c430 6f 63 6b 20 73 74 61 74 65 20 66 6f 72 20 61 20  ock state for a 
1c440 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73 65  shared-memory se
1c450 67 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  gment..*/.static
1c460 20 69 6e 74 20 77 69 6e 53 68 6d 4c 6f 63 6b 28   int winShmLock(
1c470 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
1c480 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  *fd,          /*
1c490 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   Database file h
1c4a0 6f 6c 64 69 6e 67 20 74 68 65 20 73 68 61 72 65  olding the share
1c4b0 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e  d memory */.  in
1c4c0 74 20 6f 66 73 74 2c 20 20 20 20 20 20 20 20 20  t ofst,         
1c4d0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
1c4e0 74 20 6c 6f 63 6b 20 74 6f 20 61 63 71 75 69 72  t lock to acquir
1c4f0 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a  e or release */.
1c500 20 20 69 6e 74 20 6e 2c 20 20 20 20 20 20 20 20    int n,        
1c510 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c520 4e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20  Number of locks 
1c530 74 6f 20 61 63 71 75 69 72 65 20 6f 72 20 72 65  to acquire or re
1c540 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 66  lease */.  int f
1c550 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20  lags            
1c560 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f        /* What to
1c570 20 64 6f 20 77 69 74 68 20 74 68 65 20 6c 6f 63   do with the loc
1c580 6b 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46 69 6c  k */.){.  winFil
1c590 65 20 2a 70 44 62 46 64 20 3d 20 28 77 69 6e 46  e *pDbFd = (winF
1c5a0 69 6c 65 2a 29 66 64 3b 20 20 20 20 20 20 20 20  ile*)fd;        
1c5b0 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 68 6f  /* Connection ho
1c5c0 6c 64 69 6e 67 20 73 68 61 72 65 64 20 6d 65 6d  lding shared mem
1c5d0 6f 72 79 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20  ory */.  winShm 
1c5e0 2a 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d  *p = pDbFd->pShm
1c5f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1c600 2a 20 54 68 65 20 73 68 61 72 65 64 20 6d 65 6d  * The shared mem
1c610 6f 72 79 20 62 65 69 6e 67 20 6c 6f 63 6b 65 64  ory being locked
1c620 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70 58   */.  winShm *pX
1c630 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1c640 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1c650 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
1c660 61 6c 6c 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a  all siblings */.
1c670 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53    winShmNode *pS
1c680 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d  hmNode = p->pShm
1c690 4e 6f 64 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d  Node;.  int rc =
1c6a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
1c6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c6c0 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a   Result code */.
1c6d0 20 20 75 31 36 20 6d 61 73 6b 3b 20 20 20 20 20    u16 mask;     
1c6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c6f0 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
1c700 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 74 61 6b 65  of locks to take
1c710 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 0a   or release */..
1c720 20 20 61 73 73 65 72 74 28 20 6f 66 73 74 3e 3d    assert( ofst>=
1c730 30 20 26 26 20 6f 66 73 74 2b 6e 3c 3d 53 51 4c  0 && ofst+n<=SQL
1c740 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 20 29 3b  ITE_SHM_NLOCK );
1c750 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 3d 31 20  .  assert( n>=1 
1c760 29 3b 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61  );.  assert( fla
1c770 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f  gs==(SQLITE_SHM_
1c780 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48  LOCK | SQLITE_SH
1c790 4d 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20 20  M_SHARED).      
1c7a0 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49   || flags==(SQLI
1c7b0 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51  TE_SHM_LOCK | SQ
1c7c0 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49  LITE_SHM_EXCLUSI
1c7d0 56 45 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c  VE).       || fl
1c7e0 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d  ags==(SQLITE_SHM
1c7f0 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45  _UNLOCK | SQLITE
1c800 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a 20 20 20  _SHM_SHARED).   
1c810 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53      || flags==(S
1c820 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b  QLITE_SHM_UNLOCK
1c830 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58   | SQLITE_SHM_EX
1c840 43 4c 55 53 49 56 45 29 20 29 3b 0a 20 20 61 73  CLUSIVE) );.  as
1c850 73 65 72 74 28 20 6e 3d 3d 31 20 7c 7c 20 28 66  sert( n==1 || (f
1c860 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48  lags & SQLITE_SH
1c870 4d 5f 45 58 43 4c 55 53 49 56 45 29 21 3d 30 20  M_EXCLUSIVE)!=0 
1c880 29 3b 0a 0a 20 20 6d 61 73 6b 20 3d 20 28 75 31  );..  mask = (u1
1c890 36 29 28 28 31 55 3c 3c 28 6f 66 73 74 2b 6e 29  6)((1U<<(ofst+n)
1c8a0 29 20 2d 20 28 31 55 3c 3c 6f 66 73 74 29 29 3b  ) - (1U<<ofst));
1c8b0 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 31 20 7c  .  assert( n>1 |
1c8c0 7c 20 6d 61 73 6b 3d 3d 28 31 3c 3c 6f 66 73 74  | mask==(1<<ofst
1c8d0 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ) );.  sqlite3_m
1c8e0 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e  utex_enter(pShmN
1c8f0 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69  ode->mutex);.  i
1c900 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54  f( flags & SQLIT
1c910 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 29 7b 0a  E_SHM_UNLOCK ){.
1c920 20 20 20 20 75 31 36 20 61 6c 6c 4d 61 73 6b 20      u16 allMask 
1c930 3d 20 30 3b 20 2f 2a 20 4d 61 73 6b 20 6f 66 20  = 0; /* Mask of 
1c940 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 73 69  locks held by si
1c950 62 6c 69 6e 67 73 20 2a 2f 0a 0a 20 20 20 20 2f  blings */..    /
1c960 2a 20 53 65 65 20 69 66 20 61 6e 79 20 73 69 62  * See if any sib
1c970 6c 69 6e 67 73 20 68 6f 6c 64 20 74 68 69 73 20  lings hold this 
1c980 73 61 6d 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20  same lock */.   
1c990 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65   for(pX=pShmNode
1c9a0 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58  ->pFirst; pX; pX
1c9b0 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  =pX->pNext){.   
1c9c0 20 20 20 69 66 28 20 70 58 3d 3d 70 20 29 20 63     if( pX==p ) c
1c9d0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 61  ontinue;.      a
1c9e0 73 73 65 72 74 28 20 28 70 58 2d 3e 65 78 63 6c  ssert( (pX->excl
1c9f0 4d 61 73 6b 20 26 20 28 70 2d 3e 65 78 63 6c 4d  Mask & (p->exclM
1ca00 61 73 6b 7c 70 2d 3e 73 68 61 72 65 64 4d 61 73  ask|p->sharedMas
1ca10 6b 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  k))==0 );.      
1ca20 61 6c 6c 4d 61 73 6b 20 7c 3d 20 70 58 2d 3e 73  allMask |= pX->s
1ca30 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20 7d  haredMask;.    }
1ca40 0a 0a 20 20 20 20 2f 2a 20 55 6e 6c 6f 63 6b 20  ..    /* Unlock 
1ca50 74 68 65 20 73 79 73 74 65 6d 2d 6c 65 76 65 6c  the system-level
1ca60 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66   locks */.    if
1ca70 28 20 28 6d 61 73 6b 20 26 20 61 6c 6c 4d 61 73  ( (mask & allMas
1ca80 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  k)==0 ){.      r
1ca90 63 20 3d 20 77 69 6e 53 68 6d 53 79 73 74 65 6d  c = winShmSystem
1caa0 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f  Lock(pShmNode, _
1cab0 53 48 4d 5f 55 4e 4c 43 4b 2c 20 6f 66 73 74 2b  SHM_UNLCK, ofst+
1cac0 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29  WIN_SHM_BASE, n)
1cad0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1cae0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
1caf0 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  K;.    }..    /*
1cb00 20 55 6e 64 6f 20 74 68 65 20 6c 6f 63 61 6c 20   Undo the local 
1cb10 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28  locks */.    if(
1cb20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1cb30 7b 0a 20 20 20 20 20 20 70 2d 3e 65 78 63 6c 4d  {.      p->exclM
1cb40 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20  ask &= ~mask;.  
1cb50 20 20 20 20 70 2d 3e 73 68 61 72 65 64 4d 61 73      p->sharedMas
1cb60 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20  k &= ~mask;.    
1cb70 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c  }.  }else if( fl
1cb80 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d  ags & SQLITE_SHM
1cb90 5f 53 48 41 52 45 44 20 29 7b 0a 20 20 20 20 75  _SHARED ){.    u
1cba0 31 36 20 61 6c 6c 53 68 61 72 65 64 20 3d 20 30  16 allShared = 0
1cbb0 3b 20 20 2f 2a 20 55 6e 69 6f 6e 20 6f 66 20 6c  ;  /* Union of l
1cbc0 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 63 6f 6e  ocks held by con
1cbd0 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65 72 20 74  nections other t
1cbe0 68 61 6e 20 22 70 22 20 2a 2f 0a 0a 20 20 20 20  han "p" */..    
1cbf0 2f 2a 20 46 69 6e 64 20 6f 75 74 20 77 68 69 63  /* Find out whic
1cc00 68 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 61  h shared locks a
1cc10 72 65 20 61 6c 72 65 61 64 79 20 68 65 6c 64 20  re already held 
1cc20 62 79 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65  by sibling conne
1cc30 63 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20 49  ctions..    ** I
1cc40 66 20 61 6e 79 20 73 69 62 6c 69 6e 67 20 61 6c  f any sibling al
1cc50 72 65 61 64 79 20 68 6f 6c 64 73 20 61 6e 20 65  ready holds an e
1cc60 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20 67  xclusive lock, g
1cc70 6f 20 61 68 65 61 64 20 61 6e 64 20 72 65 74 75  o ahead and retu
1cc80 72 6e 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45  rn.    ** SQLITE
1cc90 5f 42 55 53 59 2e 0a 20 20 20 20 2a 2f 0a 20 20  _BUSY..    */.  
1cca0 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64    for(pX=pShmNod
1ccb0 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70  e->pFirst; pX; p
1ccc0 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  X=pX->pNext){.  
1ccd0 20 20 20 20 69 66 28 20 28 70 58 2d 3e 65 78 63      if( (pX->exc
1cce0 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30  lMask & mask)!=0
1ccf0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1cd00 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
1cd10 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1cd20 20 20 20 7d 0a 20 20 20 20 20 20 61 6c 6c 53 68     }.      allSh
1cd30 61 72 65 64 20 7c 3d 20 70 58 2d 3e 73 68 61 72  ared |= pX->shar
1cd40 65 64 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20  edMask;.    }.. 
1cd50 20 20 20 2f 2a 20 47 65 74 20 73 68 61 72 65 64     /* Get shared
1cd60 20 6c 6f 63 6b 73 20 61 74 20 74 68 65 20 73 79   locks at the sy
1cd70 73 74 65 6d 20 6c 65 76 65 6c 2c 20 69 66 20 6e  stem level, if n
1cd80 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 20 20  ecessary */.    
1cd90 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1cda0 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  K ){.      if( (
1cdb0 61 6c 6c 53 68 61 72 65 64 20 26 20 6d 61 73 6b  allShared & mask
1cdc0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
1cdd0 72 63 20 3d 20 77 69 6e 53 68 6d 53 79 73 74 65  rc = winShmSyste
1cde0 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20  mLock(pShmNode, 
1cdf0 5f 53 48 4d 5f 52 44 4c 43 4b 2c 20 6f 66 73 74  _SHM_RDLCK, ofst
1ce00 2b 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2c 20 6e  +WIN_SHM_BASE, n
1ce10 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
1ce20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
1ce30 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
1ce40 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65      }..    /* Ge
1ce50 74 20 74 68 65 20 6c 6f 63 61 6c 20 73 68 61 72  t the local shar
1ce60 65 64 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20  ed locks */.    
1ce70 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1ce80 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 73 68  K ){.      p->sh
1ce90 61 72 65 64 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b  aredMask |= mask
1cea0 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
1ceb0 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  .    /* Make sur
1cec0 65 20 6e 6f 20 73 69 62 6c 69 6e 67 20 63 6f 6e  e no sibling con
1ced0 6e 65 63 74 69 6f 6e 73 20 68 6f 6c 64 20 6c 6f  nections hold lo
1cee0 63 6b 73 20 74 68 61 74 20 77 69 6c 6c 20 62 6c  cks that will bl
1cef0 6f 63 6b 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  ock this.    ** 
1cf00 6c 6f 63 6b 2e 20 20 49 66 20 61 6e 79 20 64 6f  lock.  If any do
1cf10 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
1cf20 42 55 53 59 20 72 69 67 68 74 20 61 77 61 79 2e  BUSY right away.
1cf30 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
1cf40 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69  pX=pShmNode->pFi
1cf50 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e  rst; pX; pX=pX->
1cf60 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  pNext){.      if
1cf70 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20  ( (pX->exclMask 
1cf80 26 20 6d 61 73 6b 29 21 3d 30 20 7c 7c 20 28 70  & mask)!=0 || (p
1cf90 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 20  X->sharedMask & 
1cfa0 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20  mask)!=0 ){.    
1cfb0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1cfc0 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 62 72  BUSY;.        br
1cfd0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
1cfe0 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 74   }..    /* Get t
1cff0 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  he exclusive loc
1d000 6b 73 20 61 74 20 74 68 65 20 73 79 73 74 65 6d  ks at the system
1d010 20 6c 65 76 65 6c 2e 20 20 54 68 65 6e 20 69 66   level.  Then if
1d020 20 73 75 63 63 65 73 73 66 75 6c 0a 20 20 20 20   successful.    
1d030 2a 2a 20 61 6c 73 6f 20 6d 61 72 6b 20 74 68 65  ** also mark the
1d040 20 6c 6f 63 61 6c 20 63 6f 6e 6e 65 63 74 69 6f   local connectio
1d050 6e 20 61 73 20 62 65 69 6e 67 20 6c 6f 63 6b 65  n as being locke
1d060 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  d..    */.    if
1d070 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1d080 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69  ){.      rc = wi
1d090 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70  nShmSystemLock(p
1d0a0 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 57 52  ShmNode, _SHM_WR
1d0b0 4c 43 4b 2c 20 6f 66 73 74 2b 57 49 4e 5f 53 48  LCK, ofst+WIN_SH
1d0c0 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20  M_BASE, n);.    
1d0d0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1d0e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61  _OK ){.        a
1d0f0 73 73 65 72 74 28 20 28 70 2d 3e 73 68 61 72 65  ssert( (p->share
1d100 64 4d 61 73 6b 20 26 20 6d 61 73 6b 29 3d 3d 30  dMask & mask)==0
1d110 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65   );.        p->e
1d120 78 63 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b  xclMask |= mask;
1d130 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1d140 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
1d150 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64  ex_leave(pShmNod
1d160 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 4f 53 54  e->mutex);.  OST
1d170 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20  RACE(("SHM-LOCK 
1d180 70 69 64 3d 25 6c 75 2c 20 69 64 3d 25 64 2c 20  pid=%lu, id=%d, 
1d190 73 68 61 72 65 64 4d 61 73 6b 3d 25 30 33 78 2c  sharedMask=%03x,
1d1a0 20 65 78 63 6c 4d 61 73 6b 3d 25 30 33 78 2c 20   exclMask=%03x, 
1d1b0 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  rc=%s\n",.      
1d1c0 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e       osGetCurren
1d1d0 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 2d  tProcessId(), p-
1d1e0 3e 69 64 2c 20 70 2d 3e 73 68 61 72 65 64 4d 61  >id, p->sharedMa
1d1f0 73 6b 2c 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 2c  sk, p->exclMask,
1d200 0a 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  .           sqli
1d210 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29  te3ErrName(rc)))
1d220 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1d230 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
1d240 74 20 61 20 6d 65 6d 6f 72 79 20 62 61 72 72 69  t a memory barri
1d250 65 72 20 6f 72 20 6d 65 6d 6f 72 79 20 66 65 6e  er or memory fen
1d260 63 65 20 6f 6e 20 73 68 61 72 65 64 20 6d 65 6d  ce on shared mem
1d270 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6c  ory..**.** All l
1d280 6f 61 64 73 20 61 6e 64 20 73 74 6f 72 65 73 20  oads and stores 
1d290 62 65 67 75 6e 20 62 65 66 6f 72 65 20 74 68 65  begun before the
1d2a0 20 62 61 72 72 69 65 72 20 6d 75 73 74 20 63 6f   barrier must co
1d2b0 6d 70 6c 65 74 65 20 62 65 66 6f 72 65 0a 2a 2a  mplete before.**
1d2c0 20 61 6e 79 20 6c 6f 61 64 20 6f 72 20 73 74 6f   any load or sto
1d2d0 72 65 20 62 65 67 75 6e 20 61 66 74 65 72 20 74  re begun after t
1d2e0 68 65 20 62 61 72 72 69 65 72 2e 0a 2a 2f 0a 73  he barrier..*/.s
1d2f0 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 53 68  tatic void winSh
1d300 6d 42 61 72 72 69 65 72 28 0a 20 20 73 71 6c 69  mBarrier(.  sqli
1d310 74 65 33 5f 66 69 6c 65 20 2a 66 64 20 20 20 20  te3_file *fd    
1d320 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
1d330 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 68  e holding the sh
1d340 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29  ared memory */.)
1d350 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
1d360 45 54 45 52 28 66 64 29 3b 0a 20 20 2f 2a 20 4d  ETER(fd);.  /* M
1d370 65 6d 6f 72 79 42 61 72 72 69 65 72 28 29 3b 20  emoryBarrier(); 
1d380 2f 2f 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b  // does not work
1d390 20 2d 2d 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 20   -- do not know 
1d3a0 77 68 79 20 6e 6f 74 20 2a 2f 0a 20 20 77 69 6e  why not */.  win
1d3b0 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  ShmEnterMutex();
1d3c0 0a 20 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75  .  winShmLeaveMu
1d3d0 74 65 78 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tex();.}../*.** 
1d3e0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1d3f0 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69   called to obtai
1d400 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 72  n a pointer to r
1d410 65 67 69 6f 6e 20 69 52 65 67 69 6f 6e 20 6f 66  egion iRegion of
1d420 20 74 68 65 0a 2a 2a 20 73 68 61 72 65 64 2d 6d   the.** shared-m
1d430 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64  emory associated
1d440 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61   with the databa
1d450 73 65 20 66 69 6c 65 20 66 64 2e 20 53 68 61 72  se file fd. Shar
1d460 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed-memory region
1d470 73 0a 2a 2a 20 61 72 65 20 6e 75 6d 62 65 72 65  s.** are numbere
1d480 64 20 73 74 61 72 74 69 6e 67 20 66 72 6f 6d 20  d starting from 
1d490 7a 65 72 6f 2e 20 45 61 63 68 20 73 68 61 72 65  zero. Each share
1d4a0 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20  d-memory region 
1d4b0 69 73 20 73 7a 52 65 67 69 6f 6e 0a 2a 2a 20 62  is szRegion.** b
1d4c0 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a  ytes in size..**
1d4d0 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
1d4e0 6f 63 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72  occurs, an error
1d4f0 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
1d500 64 20 61 6e 64 20 2a 70 70 20 69 73 20 73 65 74  d and *pp is set
1d510 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20   to NULL..**.** 
1d520 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68  Otherwise, if th
1d530 65 20 69 73 57 72 69 74 65 20 70 61 72 61 6d 65  e isWrite parame
1d540 74 65 72 20 69 73 20 30 20 61 6e 64 20 74 68 65  ter is 0 and the
1d550 20 72 65 71 75 65 73 74 65 64 20 73 68 61 72 65   requested share
1d560 64 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 72 65 67 69  d-memory.** regi
1d570 6f 6e 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  on has not been 
1d580 61 6c 6c 6f 63 61 74 65 64 20 28 62 79 20 61 6e  allocated (by an
1d590 79 20 63 6c 69 65 6e 74 2c 20 69 6e 63 6c 75 64  y client, includ
1d5a0 69 6e 67 20 6f 6e 65 20 72 75 6e 6e 69 6e 67 20  ing one running 
1d5b0 69 6e 20 61 0a 2a 2a 20 73 65 70 61 72 61 74 65  in a.** separate
1d5c0 20 70 72 6f 63 65 73 73 29 2c 20 74 68 65 6e 20   process), then 
1d5d0 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20 4e 55  *pp is set to NU
1d5e0 4c 4c 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b  LL and SQLITE_OK
1d5f0 20 72 65 74 75 72 6e 65 64 2e 20 49 66 0a 2a 2a   returned. If.**
1d600 20 69 73 57 72 69 74 65 20 69 73 20 6e 6f 6e 2d   isWrite is non-
1d610 7a 65 72 6f 20 61 6e 64 20 74 68 65 20 72 65 71  zero and the req
1d620 75 65 73 74 65 64 20 73 68 61 72 65 64 2d 6d 65  uested shared-me
1d630 6d 6f 72 79 20 72 65 67 69 6f 6e 20 68 61 73 20  mory region has 
1d640 6e 6f 74 20 79 65 74 0a 2a 2a 20 62 65 65 6e 20  not yet.** been 
1d650 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20 69 73  allocated, it is
1d660 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68   allocated by th
1d670 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  is function..**.
1d680 2a 2a 20 49 66 20 74 68 65 20 73 68 61 72 65 64  ** If the shared
1d690 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 68  -memory region h
1d6a0 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
1d6b0 61 6c 6c 6f 63 61 74 65 64 20 6f 72 20 69 73 20  allocated or is 
1d6c0 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20  allocated by.** 
1d6d0 74 68 69 73 20 63 61 6c 6c 20 61 73 20 64 65 73  this call as des
1d6e0 63 72 69 62 65 64 20 61 62 6f 76 65 2c 20 74 68  cribed above, th
1d6f0 65 6e 20 69 74 20 69 73 20 6d 61 70 70 65 64 20  en it is mapped 
1d700 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73  into this proces
1d710 73 65 73 0a 2a 2a 20 61 64 64 72 65 73 73 20 73  ses.** address s
1d720 70 61 63 65 20 28 69 66 20 69 74 20 69 73 20 6e  pace (if it is n
1d730 6f 74 20 61 6c 72 65 61 64 79 29 2c 20 2a 70 70  ot already), *pp
1d740 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74   is set to point
1d750 20 74 6f 20 74 68 65 20 6d 61 70 70 65 64 0a 2a   to the mapped.*
1d760 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20 53 51 4c  * memory and SQL
1d770 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
1d780 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
1d790 69 6e 53 68 6d 4d 61 70 28 0a 20 20 73 71 6c 69  inShmMap(.  sqli
1d7a0 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20  te3_file *fd,   
1d7b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
1d7c0 61 6e 64 6c 65 20 6f 70 65 6e 20 6f 6e 20 64 61  andle open on da
1d7d0 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
1d7e0 20 69 6e 74 20 69 52 65 67 69 6f 6e 2c 20 20 20   int iRegion,   
1d7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d800 20 2f 2a 20 52 65 67 69 6f 6e 20 74 6f 20 72 65   /* Region to re
1d810 74 72 69 65 76 65 20 2a 2f 0a 20 20 69 6e 74 20  trieve */.  int 
1d820 73 7a 52 65 67 69 6f 6e 2c 20 20 20 20 20 20 20  szRegion,       
1d830 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1d840 69 7a 65 20 6f 66 20 72 65 67 69 6f 6e 73 20 2a  ize of regions *
1d850 2f 0a 20 20 69 6e 74 20 69 73 57 72 69 74 65 2c  /.  int isWrite,
1d860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d870 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65      /* True to e
1d880 78 74 65 6e 64 20 66 69 6c 65 20 69 66 20 6e 65  xtend file if ne
1d890 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 76 6f 69  cessary */.  voi
1d8a0 64 20 76 6f 6c 61 74 69 6c 65 20 2a 2a 70 70 20  d volatile **pp 
1d8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d8c0 4f 55 54 3a 20 4d 61 70 70 65 64 20 6d 65 6d 6f  OUT: Mapped memo
1d8d0 72 79 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46 69  ry */.){.  winFi
1d8e0 6c 65 20 2a 70 44 62 46 64 20 3d 20 28 77 69 6e  le *pDbFd = (win
1d8f0 46 69 6c 65 2a 29 66 64 3b 0a 20 20 77 69 6e 53  File*)fd;.  winS
1d900 68 6d 20 2a 70 20 3d 20 70 44 62 46 64 2d 3e 70  hm *p = pDbFd->p
1d910 53 68 6d 3b 0a 20 20 77 69 6e 53 68 6d 4e 6f 64  Shm;.  winShmNod
1d920 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69  e *pShmNode;.  i
1d930 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1d940 4b 3b 0a 0a 20 20 69 66 28 20 21 70 20 29 7b 0a  K;..  if( !p ){.
1d950 20 20 20 20 72 63 20 3d 20 77 69 6e 4f 70 65 6e      rc = winOpen
1d960 53 68 61 72 65 64 4d 65 6d 6f 72 79 28 70 44 62  SharedMemory(pDb
1d970 46 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  Fd);.    if( rc!
1d980 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
1d990 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 20 3d 20  urn rc;.    p = 
1d9a0 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 7d  pDbFd->pShm;.  }
1d9b0 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d  .  pShmNode = p-
1d9c0 3e 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20 73 71  >pShmNode;..  sq
1d9d0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
1d9e0 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  r(pShmNode->mute
1d9f0 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a  x);.  assert( sz
1da00 52 65 67 69 6f 6e 3d 3d 70 53 68 6d 4e 6f 64 65  Region==pShmNode
1da10 2d 3e 73 7a 52 65 67 69 6f 6e 20 7c 7c 20 70 53  ->szRegion || pS
1da20 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3d  hmNode->nRegion=
1da30 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 53 68  =0 );..  if( pSh
1da40 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d  mNode->nRegion<=
1da50 69 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 73  iRegion ){.    s
1da60 74 72 75 63 74 20 53 68 6d 52 65 67 69 6f 6e 20  truct ShmRegion 
1da70 2a 61 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20  *apNew;         
1da80 20 20 2f 2a 20 4e 65 77 20 61 52 65 67 69 6f 6e    /* New aRegion
1da90 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20  [] array */.    
1daa0 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 69 52 65  int nByte = (iRe
1dab0 67 69 6f 6e 2b 31 29 2a 73 7a 52 65 67 69 6f 6e  gion+1)*szRegion
1dac0 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 72 65  ;  /* Minimum re
1dad0 71 75 69 72 65 64 20 66 69 6c 65 20 73 69 7a 65  quired file size
1dae0 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   */.    sqlite3_
1daf0 69 6e 74 36 34 20 73 7a 3b 20 20 20 20 20 20 20  int64 sz;       
1db00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
1db10 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 77 61  rrent size of wa
1db20 6c 2d 69 6e 64 65 78 20 66 69 6c 65 20 2a 2f 0a  l-index file */.
1db30 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73  .    pShmNode->s
1db40 7a 52 65 67 69 6f 6e 20 3d 20 73 7a 52 65 67 69  zRegion = szRegi
1db50 6f 6e 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20  on;..    /* The 
1db60 72 65 71 75 65 73 74 65 64 20 72 65 67 69 6f 6e  requested region
1db70 20 69 73 20 6e 6f 74 20 6d 61 70 70 65 64 20 69   is not mapped i
1db80 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73  nto this process
1db90 65 73 20 61 64 64 72 65 73 73 20 73 70 61 63 65  es address space
1dba0 2e 0a 20 20 20 20 2a 2a 20 43 68 65 63 6b 20 74  ..    ** Check t
1dbb0 6f 20 73 65 65 20 69 66 20 69 74 20 68 61 73 20  o see if it has 
1dbc0 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 28  been allocated (
1dbd0 69 2e 65 2e 20 69 66 20 74 68 65 20 77 61 6c 2d  i.e. if the wal-
1dbe0 69 6e 64 65 78 20 66 69 6c 65 20 69 73 0a 20 20  index file is.  
1dbf0 20 20 2a 2a 20 6c 61 72 67 65 20 65 6e 6f 75 67    ** large enoug
1dc00 68 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65  h to contain the
1dc10 20 72 65 71 75 65 73 74 65 64 20 72 65 67 69 6f   requested regio
1dc20 6e 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  n)..    */.    r
1dc30 63 20 3d 20 77 69 6e 46 69 6c 65 53 69 7a 65 28  c = winFileSize(
1dc40 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29  (sqlite3_file *)
1dc50 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65  &pShmNode->hFile
1dc60 2c 20 26 73 7a 29 3b 0a 20 20 20 20 69 66 28 20  , &sz);.    if( 
1dc70 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1dc80 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c  .      rc = winL
1dc90 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
1dca0 4f 45 52 52 5f 53 48 4d 53 49 5a 45 2c 20 6f 73  OERR_SHMSIZE, os
1dcb0 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a  GetLastError(),.
1dcc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dcd0 20 20 20 20 20 20 20 22 77 69 6e 53 68 6d 4d 61         "winShmMa
1dce0 70 31 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74  p1", pDbFd->zPat
1dcf0 68 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73  h);.      goto s
1dd00 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  hmpage_out;.    
1dd10 7d 0a 0a 20 20 20 20 69 66 28 20 73 7a 3c 6e 42  }..    if( sz<nB
1dd20 79 74 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  yte ){.      /* 
1dd30 54 68 65 20 72 65 71 75 65 73 74 65 64 20 6d 65  The requested me
1dd40 6d 6f 72 79 20 72 65 67 69 6f 6e 20 64 6f 65 73  mory region does
1dd50 20 6e 6f 74 20 65 78 69 73 74 2e 20 49 66 20 69   not exist. If i
1dd60 73 57 72 69 74 65 20 69 73 20 73 65 74 20 74 6f  sWrite is set to
1dd70 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 2c 20  .      ** zero, 
1dd80 65 78 69 74 20 65 61 72 6c 79 2e 20 2a 70 70 20  exit early. *pp 
1dd90 77 69 6c 6c 20 62 65 20 73 65 74 20 74 6f 20 4e  will be set to N
1dda0 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  ULL and SQLITE_O
1ddb0 4b 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 20 20  K returned..    
1ddc0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 41 6c    **.      ** Al
1ddd0 74 65 72 6e 61 74 69 76 65 6c 79 2c 20 69 66 20  ternatively, if 
1dde0 69 73 57 72 69 74 65 20 69 73 20 6e 6f 6e 2d 7a  isWrite is non-z
1ddf0 65 72 6f 2c 20 75 73 65 20 66 74 72 75 6e 63 61  ero, use ftrunca
1de00 74 65 28 29 20 74 6f 20 61 6c 6c 6f 63 61 74 65  te() to allocate
1de10 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 72 65  .      ** the re
1de20 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72  quested memory r
1de30 65 67 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a  egion..      */.
1de40 20 20 20 20 20 20 69 66 28 20 21 69 73 57 72 69        if( !isWri
1de50 74 65 20 29 20 67 6f 74 6f 20 73 68 6d 70 61 67  te ) goto shmpag
1de60 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 72 63 20  e_out;.      rc 
1de70 3d 20 77 69 6e 54 72 75 6e 63 61 74 65 28 28 73  = winTruncate((s
1de80 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 26 70  qlite3_file *)&p
1de90 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c 20  ShmNode->hFile, 
1dea0 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 69 66  nByte);.      if
1deb0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1dec0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1ded0 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
1dee0 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45  TE_IOERR_SHMSIZE
1def0 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  , osGetLastError
1df00 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  (),.            
1df10 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
1df20 6e 53 68 6d 4d 61 70 32 22 2c 20 70 44 62 46 64  nShmMap2", pDbFd
1df30 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20  ->zPath);.      
1df40 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f    goto shmpage_o
1df50 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ut;.      }.    
1df60 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 70 20 74 68  }..    /* Map th
1df70 65 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f  e requested memo
1df80 72 79 20 72 65 67 69 6f 6e 20 69 6e 74 6f 20 74  ry region into t
1df90 68 69 73 20 70 72 6f 63 65 73 73 65 73 20 61 64  his processes ad
1dfa0 64 72 65 73 73 20 73 70 61 63 65 2e 20 2a 2f 0a  dress space. */.
1dfb0 20 20 20 20 61 70 4e 65 77 20 3d 20 28 73 74 72      apNew = (str
1dfc0 75 63 74 20 53 68 6d 52 65 67 69 6f 6e 20 2a 29  uct ShmRegion *)
1dfd0 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28  sqlite3_realloc(
1dfe0 0a 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64  .        pShmNod
1dff0 65 2d 3e 61 52 65 67 69 6f 6e 2c 20 28 69 52 65  e->aRegion, (iRe
1e000 67 69 6f 6e 2b 31 29 2a 73 69 7a 65 6f 66 28 61  gion+1)*sizeof(a
1e010 70 4e 65 77 5b 30 5d 29 0a 20 20 20 20 29 3b 0a  pNew[0]).    );.
1e020 20 20 20 20 69 66 28 20 21 61 70 4e 65 77 20 29      if( !apNew )
1e030 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
1e040 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b  ITE_IOERR_NOMEM;
1e050 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70  .      goto shmp
1e060 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  age_out;.    }. 
1e070 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65     pShmNode->aRe
1e080 67 69 6f 6e 20 3d 20 61 70 4e 65 77 3b 0a 0a 20  gion = apNew;.. 
1e090 20 20 20 77 68 69 6c 65 28 20 70 53 68 6d 4e 6f     while( pShmNo
1e0a0 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d 69 52 65  de->nRegion<=iRe
1e0b0 67 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 48 41  gion ){.      HA
1e0c0 4e 44 4c 45 20 68 4d 61 70 20 3d 20 4e 55 4c 4c  NDLE hMap = NULL
1e0d0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 66 69 6c  ;         /* fil
1e0e0 65 2d 6d 61 70 70 69 6e 67 20 68 61 6e 64 6c 65  e-mapping handle
1e0f0 20 2a 2f 0a 20 20 20 20 20 20 76 6f 69 64 20 2a   */.      void *
1e100 70 4d 61 70 20 3d 20 30 3b 20 20 20 20 20 20 20  pMap = 0;       
1e110 20 20 20 20 20 20 2f 2a 20 4d 61 70 70 65 64 20        /* Mapped 
1e120 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 2a 2f  memory region */
1e130 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
1e140 57 49 4e 52 54 0a 20 20 20 20 20 20 68 4d 61 70  WINRT.      hMap
1e150 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d   = osCreateFileM
1e160 61 70 70 69 6e 67 46 72 6f 6d 41 70 70 28 70 53  appingFromApp(pS
1e170 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2e 68 2c  hmNode->hFile.h,
1e180 0a 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c  .          NULL,
1e190 20 50 41 47 45 5f 52 45 41 44 57 52 49 54 45 2c   PAGE_READWRITE,
1e1a0 20 6e 42 79 74 65 2c 20 4e 55 4c 4c 0a 20 20 20   nByte, NULL.   
1e1b0 20 20 20 29 3b 0a 23 65 6c 69 66 20 64 65 66 69     );.#elif defi
1e1c0 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
1e1d0 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 20 20 20  _HAS_WIDE).     
1e1e0 20 68 4d 61 70 20 3d 20 6f 73 43 72 65 61 74 65   hMap = osCreate
1e1f0 46 69 6c 65 4d 61 70 70 69 6e 67 57 28 70 53 68  FileMappingW(pSh
1e200 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2e 68 2c 0a  mNode->hFile.h,.
1e210 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 20            NULL, 
1e220 50 41 47 45 5f 52 45 41 44 57 52 49 54 45 2c 20  PAGE_READWRITE, 
1e230 30 2c 20 6e 42 79 74 65 2c 20 4e 55 4c 4c 0a 20  0, nByte, NULL. 
1e240 20 20 20 20 20 29 3b 0a 23 65 6c 69 66 20 64 65       );.#elif de
1e250 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
1e260 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 20  32_HAS_ANSI).   
1e270 20 20 20 68 4d 61 70 20 3d 20 6f 73 43 72 65 61     hMap = osCrea
1e280 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 41 28 70  teFileMappingA(p
1e290 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2e 68  ShmNode->hFile.h
1e2a0 2c 0a 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c  ,.          NULL
1e2b0 2c 20 50 41 47 45 5f 52 45 41 44 57 52 49 54 45  , PAGE_READWRITE
1e2c0 2c 20 30 2c 20 6e 42 79 74 65 2c 20 4e 55 4c 4c  , 0, nByte, NULL
1e2d0 0a 20 20 20 20 20 20 29 3b 0a 23 65 6e 64 69 66  .      );.#endif
1e2e0 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
1e2f0 22 53 48 4d 2d 4d 41 50 2d 43 52 45 41 54 45 20  "SHM-MAP-CREATE 
1e300 70 69 64 3d 25 6c 75 2c 20 72 65 67 69 6f 6e 3d  pid=%lu, region=
1e310 25 64 2c 20 73 69 7a 65 3d 25 64 2c 20 72 63 3d  %d, size=%d, rc=
1e320 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
1e330 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65        osGetCurre
1e340 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70  ntProcessId(), p
1e350 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
1e360 2c 20 6e 42 79 74 65 2c 0a 20 20 20 20 20 20 20  , nByte,.       
1e370 20 20 20 20 20 20 20 20 68 4d 61 70 20 3f 20 22          hMap ? "
1e380 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29  ok" : "failed"))
1e390 3b 0a 20 20 20 20 20 20 69 66 28 20 68 4d 61 70  ;.      if( hMap
1e3a0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
1e3b0 69 4f 66 66 73 65 74 20 3d 20 70 53 68 6d 4e 6f  iOffset = pShmNo
1e3c0 64 65 2d 3e 6e 52 65 67 69 6f 6e 2a 73 7a 52 65  de->nRegion*szRe
1e3d0 67 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20 69 6e  gion;.        in
1e3e0 74 20 69 4f 66 66 73 65 74 53 68 69 66 74 20 3d  t iOffsetShift =
1e3f0 20 69 4f 66 66 73 65 74 20 25 20 77 69 6e 53 79   iOffset % winSy
1e400 73 49 6e 66 6f 2e 64 77 41 6c 6c 6f 63 61 74 69  sInfo.dwAllocati
1e410 6f 6e 47 72 61 6e 75 6c 61 72 69 74 79 3b 0a 23  onGranularity;.#
1e420 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
1e430 52 54 0a 20 20 20 20 20 20 20 20 70 4d 61 70 20  RT.        pMap 
1e440 3d 20 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 6c  = osMapViewOfFil
1e450 65 46 72 6f 6d 41 70 70 28 68 4d 61 70 2c 20 46  eFromApp(hMap, F
1e460 49 4c 45 5f 4d 41 50 5f 57 52 49 54 45 20 7c 20  ILE_MAP_WRITE | 
1e470 46 49 4c 45 5f 4d 41 50 5f 52 45 41 44 2c 0a 20  FILE_MAP_READ,. 
1e480 20 20 20 20 20 20 20 20 20 20 20 69 4f 66 66 73             iOffs
1e490 65 74 20 2d 20 69 4f 66 66 73 65 74 53 68 69 66  et - iOffsetShif
1e4a0 74 2c 20 73 7a 52 65 67 69 6f 6e 20 2b 20 69 4f  t, szRegion + iO
1e4b0 66 66 73 65 74 53 68 69 66 74 0a 20 20 20 20 20  ffsetShift.     
1e4c0 20 20 20 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20     );.#else.    
1e4d0 20 20 20 20 70 4d 61 70 20 3d 20 6f 73 4d 61 70      pMap = osMap
1e4e0 56 69 65 77 4f 66 46 69 6c 65 28 68 4d 61 70 2c  ViewOfFile(hMap,
1e4f0 20 46 49 4c 45 5f 4d 41 50 5f 57 52 49 54 45 20   FILE_MAP_WRITE 
1e500 7c 20 46 49 4c 45 5f 4d 41 50 5f 52 45 41 44 2c  | FILE_MAP_READ,
1e510 0a 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20  .            0, 
1e520 69 4f 66 66 73 65 74 20 2d 20 69 4f 66 66 73 65  iOffset - iOffse
1e530 74 53 68 69 66 74 2c 20 73 7a 52 65 67 69 6f 6e  tShift, szRegion
1e540 20 2b 20 69 4f 66 66 73 65 74 53 68 69 66 74 0a   + iOffsetShift.
1e550 20 20 20 20 20 20 20 20 29 3b 0a 23 65 6e 64 69          );.#endi
1e560 66 0a 20 20 20 20 20 20 20 20 4f 53 54 52 41 43  f.        OSTRAC
1e570 45 28 28 22 53 48 4d 2d 4d 41 50 2d 4d 41 50 20  E(("SHM-MAP-MAP 
1e580 70 69 64 3d 25 6c 75 2c 20 72 65 67 69 6f 6e 3d  pid=%lu, region=
1e590 25 64 2c 20 6f 66 66 73 65 74 3d 25 64 2c 20 73  %d, offset=%d, s
1e5a0 69 7a 65 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22  ize=%d, rc=%s\n"
1e5b0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1e5c0 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50     osGetCurrentP
1e5d0 72 6f 63 65 73 73 49 64 28 29 2c 20 70 53 68 6d  rocessId(), pShm
1e5e0 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2c 20 69  Node->nRegion, i
1e5f0 4f 66 66 73 65 74 2c 0a 20 20 20 20 20 20 20 20  Offset,.        
1e600 20 20 20 20 20 20 20 20 20 73 7a 52 65 67 69 6f           szRegio
1e610 6e 2c 20 70 4d 61 70 20 3f 20 22 6f 6b 22 20 3a  n, pMap ? "ok" :
1e620 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20   "failed"));.   
1e630 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21     }.      if( !
1e640 70 4d 61 70 20 29 7b 0a 20 20 20 20 20 20 20 20  pMap ){.        
1e650 70 53 68 6d 4e 6f 64 65 2d 3e 6c 61 73 74 45 72  pShmNode->lastEr
1e660 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
1e670 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 20 20  rror();.        
1e680 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72  rc = winLogError
1e690 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  (SQLITE_IOERR_SH
1e6a0 4d 4d 41 50 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e  MMAP, pShmNode->
1e6b0 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  lastErrno,.     
1e6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e6d0 20 20 20 20 22 77 69 6e 53 68 6d 4d 61 70 33 22      "winShmMap3"
1e6e0 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b  , pDbFd->zPath);
1e6f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 68 4d 61  .        if( hMa
1e700 70 20 29 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c  p ) osCloseHandl
1e710 65 28 68 4d 61 70 29 3b 0a 20 20 20 20 20 20 20  e(hMap);.       
1e720 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75   goto shmpage_ou
1e730 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  t;.      }..    
1e740 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67    pShmNode->aReg
1e750 69 6f 6e 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  ion[pShmNode->nR
1e760 65 67 69 6f 6e 5d 2e 70 4d 61 70 20 3d 20 70 4d  egion].pMap = pM
1e770 61 70 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f  ap;.      pShmNo
1e780 64 65 2d 3e 61 52 65 67 69 6f 6e 5b 70 53 68 6d  de->aRegion[pShm
1e790 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 5d 2e 68  Node->nRegion].h
1e7a0 4d 61 70 20 3d 20 68 4d 61 70 3b 0a 20 20 20 20  Map = hMap;.    
1e7b0 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67    pShmNode->nReg
1e7c0 69 6f 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d  ion++;.    }.  }
1e7d0 0a 0a 73 68 6d 70 61 67 65 5f 6f 75 74 3a 0a 20  ..shmpage_out:. 
1e7e0 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e   if( pShmNode->n
1e7f0 52 65 67 69 6f 6e 3e 69 52 65 67 69 6f 6e 20 29  Region>iRegion )
1e800 7b 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 73 65  {.    int iOffse
1e810 74 20 3d 20 69 52 65 67 69 6f 6e 2a 73 7a 52 65  t = iRegion*szRe
1e820 67 69 6f 6e 3b 0a 20 20 20 20 69 6e 74 20 69 4f  gion;.    int iO
1e830 66 66 73 65 74 53 68 69 66 74 20 3d 20 69 4f 66  ffsetShift = iOf
1e840 66 73 65 74 20 25 20 77 69 6e 53 79 73 49 6e 66  fset % winSysInf
1e850 6f 2e 64 77 41 6c 6c 6f 63 61 74 69 6f 6e 47 72  o.dwAllocationGr
1e860 61 6e 75 6c 61 72 69 74 79 3b 0a 20 20 20 20 63  anularity;.    c
1e870 68 61 72 20 2a 70 20 3d 20 28 63 68 61 72 20 2a  har *p = (char *
1e880 29 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69  )pShmNode->aRegi
1e890 6f 6e 5b 69 52 65 67 69 6f 6e 5d 2e 70 4d 61 70  on[iRegion].pMap
1e8a0 3b 0a 20 20 20 20 2a 70 70 20 3d 20 28 76 6f 69  ;.    *pp = (voi
1e8b0 64 20 2a 29 26 70 5b 69 4f 66 66 73 65 74 53 68  d *)&p[iOffsetSh
1e8c0 69 66 74 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ift];.  }else{. 
1e8d0 20 20 20 2a 70 70 20 3d 20 30 3b 0a 20 20 7d 0a     *pp = 0;.  }.
1e8e0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1e8f0 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e  leave(pShmNode->
1e900 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
1e910 20 72 63 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 20   rc;.}..#else.# 
1e920 64 65 66 69 6e 65 20 77 69 6e 53 68 6d 4d 61 70  define winShmMap
1e930 20 20 20 20 20 30 0a 23 20 64 65 66 69 6e 65 20       0.# define 
1e940 77 69 6e 53 68 6d 4c 6f 63 6b 20 20 20 20 30 0a  winShmLock    0.
1e950 23 20 64 65 66 69 6e 65 20 77 69 6e 53 68 6d 42  # define winShmB
1e960 61 72 72 69 65 72 20 30 0a 23 20 64 65 66 69 6e  arrier 0.# defin
1e970 65 20 77 69 6e 53 68 6d 55 6e 6d 61 70 20 20 20  e winShmUnmap   
1e980 30 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e  0.#endif /* #ifn
1e990 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1e9a0 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6c  WAL */../*.** Cl
1e9b0 65 61 6e 73 20 75 70 20 74 68 65 20 6d 61 70 70  eans up the mapp
1e9c0 65 64 20 72 65 67 69 6f 6e 20 6f 66 20 74 68 65  ed region of the
1e9d0 20 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 2c   specified file,
1e9e0 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a 23 69 66 20   if any..*/.#if 
1e9f0 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
1ea00 53 49 5a 45 3e 30 0a 73 74 61 74 69 63 20 69 6e  SIZE>0.static in
1ea10 74 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28 77  t winUnmapfile(w
1ea20 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a  inFile *pFile){.
1ea30 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 21    assert( pFile!
1ea40 3d 30 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  =0 );.  OSTRACE(
1ea50 28 22 55 4e 4d 41 50 2d 46 49 4c 45 20 70 69 64  ("UNMAP-FILE pid
1ea60 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20  =%lu, pFile=%p, 
1ea70 68 4d 61 70 3d 25 70 2c 20 70 4d 61 70 52 65 67  hMap=%p, pMapReg
1ea80 69 6f 6e 3d 25 70 2c 20 22 0a 20 20 20 20 20 20  ion=%p, ".      
1ea90 20 20 20 20 20 22 6d 6d 61 70 53 69 7a 65 3d 25       "mmapSize=%
1eaa0 6c 6c 64 2c 20 6d 6d 61 70 53 69 7a 65 41 63 74  lld, mmapSizeAct
1eab0 75 61 6c 3d 25 6c 6c 64 2c 20 6d 6d 61 70 53 69  ual=%lld, mmapSi
1eac0 7a 65 4d 61 78 3d 25 6c 6c 64 5c 6e 22 2c 0a 20  zeMax=%lld\n",. 
1ead0 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43            osGetC
1eae0 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28  urrentProcessId(
1eaf0 29 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d  ), pFile, pFile-
1eb00 3e 68 4d 61 70 2c 20 70 46 69 6c 65 2d 3e 70 4d  >hMap, pFile->pM
1eb10 61 70 52 65 67 69 6f 6e 2c 0a 20 20 20 20 20 20  apRegion,.      
1eb20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70       pFile->mmap
1eb30 53 69 7a 65 2c 20 70 46 69 6c 65 2d 3e 6d 6d 61  Size, pFile->mma
1eb40 70 53 69 7a 65 41 63 74 75 61 6c 2c 20 70 46 69  pSizeActual, pFi
1eb50 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 29  le->mmapSizeMax)
1eb60 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  );.  if( pFile->
1eb70 70 4d 61 70 52 65 67 69 6f 6e 20 29 7b 0a 20 20  pMapRegion ){.  
1eb80 20 20 69 66 28 20 21 6f 73 55 6e 6d 61 70 56 69    if( !osUnmapVi
1eb90 65 77 4f 66 46 69 6c 65 28 70 46 69 6c 65 2d 3e  ewOfFile(pFile->
1eba0 70 4d 61 70 52 65 67 69 6f 6e 29 20 29 7b 0a 20  pMapRegion) ){. 
1ebb0 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
1ebc0 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
1ebd0 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20  tError();.      
1ebe0 4f 53 54 52 41 43 45 28 28 22 55 4e 4d 41 50 2d  OSTRACE(("UNMAP-
1ebf0 46 49 4c 45 20 70 69 64 3d 25 6c 75 2c 20 70 46  FILE pid=%lu, pF
1ec00 69 6c 65 3d 25 70 2c 20 70 4d 61 70 52 65 67 69  ile=%p, pMapRegi
1ec10 6f 6e 3d 25 70 2c 20 22 0a 20 20 20 20 20 20 20  on=%p, ".       
1ec20 20 20 20 20 20 20 20 20 22 72 63 3d 53 51 4c 49          "rc=SQLI
1ec30 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 5c 6e 22  TE_IOERR_MMAP\n"
1ec40 2c 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72  , osGetCurrentPr
1ec50 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65  ocessId(), pFile
1ec60 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1ec70 20 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69   pFile->pMapRegi
1ec80 6f 6e 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75  on));.      retu
1ec90 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53  rn winLogError(S
1eca0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50  QLITE_IOERR_MMAP
1ecb0 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  , pFile->lastErr
1ecc0 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
1ecd0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
1ece0 6e 55 6e 6d 61 70 66 69 6c 65 31 22 2c 20 70 46  nUnmapfile1", pF
1ecf0 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  ile->zPath);.   
1ed00 20 7d 0a 20 20 20 20 70 46 69 6c 65 2d 3e 70 4d   }.    pFile->pM
1ed10 61 70 52 65 67 69 6f 6e 20 3d 20 30 3b 0a 20 20  apRegion = 0;.  
1ed20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a    pFile->mmapSiz
1ed30 65 20 3d 20 30 3b 0a 20 20 20 20 70 46 69 6c 65  e = 0;.    pFile
1ed40 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c  ->mmapSizeActual
1ed50 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 0;.  }.  if( 
1ed60 70 46 69 6c 65 2d 3e 68 4d 61 70 21 3d 4e 55 4c  pFile->hMap!=NUL
1ed70 4c 20 29 7b 0a 20 20 20 20 69 66 28 20 21 6f 73  L ){.    if( !os
1ed80 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c  CloseHandle(pFil
1ed90 65 2d 3e 68 4d 61 70 29 20 29 7b 0a 20 20 20 20  e->hMap) ){.    
1eda0 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
1edb0 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
1edc0 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 4f 53 54  ror();.      OST
1edd0 52 41 43 45 28 28 22 55 4e 4d 41 50 2d 46 49 4c  RACE(("UNMAP-FIL
1ede0 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65  E pid=%lu, pFile
1edf0 3d 25 70 2c 20 68 4d 61 70 3d 25 70 2c 20 72 63  =%p, hMap=%p, rc
1ee00 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d  =SQLITE_IOERR_MM
1ee10 41 50 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  AP\n",.         
1ee20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65        osGetCurre
1ee30 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70  ntProcessId(), p
1ee40 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 4d 61  File, pFile->hMa
1ee50 70 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  p));.      retur
1ee60 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  n winLogError(SQ
1ee70 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 2c  LITE_IOERR_MMAP,
1ee80 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
1ee90 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
1eea0 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
1eeb0 55 6e 6d 61 70 66 69 6c 65 32 22 2c 20 70 46 69  Unmapfile2", pFi
1eec0 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20  le->zPath);.    
1eed0 7d 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68 4d 61  }.    pFile->hMa
1eee0 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 20 20  p = NULL;.  }.  
1eef0 4f 53 54 52 41 43 45 28 28 22 55 4e 4d 41 50 2d  OSTRACE(("UNMAP-
1ef00 46 49 4c 45 20 70 69 64 3d 25 6c 75 2c 20 70 46  FILE pid=%lu, pF
1ef10 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  ile=%p, rc=SQLIT
1ef20 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20  E_OK\n",.       
1ef30 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74      osGetCurrent
1ef40 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69  ProcessId(), pFi
1ef50 6c 65 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  le));.  return S
1ef60 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
1ef70 2a 2a 20 4d 65 6d 6f 72 79 20 6d 61 70 20 6f 72  ** Memory map or
1ef80 20 72 65 6d 61 70 20 74 68 65 20 66 69 6c 65 20   remap the file 
1ef90 6f 70 65 6e 65 64 20 62 79 20 66 69 6c 65 2d 64  opened by file-d
1efa0 65 73 63 72 69 70 74 6f 72 20 70 46 64 20 28 69  escriptor pFd (i
1efb0 66 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 69 73  f the file.** is
1efc0 20 61 6c 72 65 61 64 79 20 6d 61 70 70 65 64 2c   already mapped,
1efd0 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 6d 61   the existing ma
1efe0 70 70 69 6e 67 20 69 73 20 72 65 70 6c 61 63 65  pping is replace
1eff0 64 20 62 79 20 74 68 65 20 6e 65 77 29 2e 20 4f  d by the new). O
1f000 72 2c 20 69 66 0a 2a 2a 20 74 68 65 72 65 20 61  r, if.** there a
1f010 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 61 20  lready exists a 
1f020 6d 61 70 70 69 6e 67 20 66 6f 72 20 74 68 69 73  mapping for this
1f030 20 66 69 6c 65 2c 20 61 6e 64 20 74 68 65 72 65   file, and there
1f040 20 61 72 65 20 73 74 69 6c 6c 0a 2a 2a 20 6f 75   are still.** ou
1f050 74 73 74 61 6e 64 69 6e 67 20 78 46 65 74 63 68  tstanding xFetch
1f060 28 29 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  () references to
1f070 20 69 74 2c 20 74 68 69 73 20 66 75 6e 63 74 69   it, this functi
1f080 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  on is a no-op..*
1f090 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65  *.** If paramete
1f0a0 72 20 6e 42 79 74 65 20 69 73 20 6e 6f 6e 2d 6e  r nByte is non-n
1f0b0 65 67 61 74 69 76 65 2c 20 74 68 65 6e 20 69 74  egative, then it
1f0c0 20 69 73 20 74 68 65 20 72 65 71 75 65 73 74 65   is the requeste
1f0d0 64 20 73 69 7a 65 20 6f 66 0a 2a 2a 20 74 68 65  d size of.** the
1f0e0 20 6d 61 70 70 69 6e 67 20 74 6f 20 63 72 65 61   mapping to crea
1f0f0 74 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  te. Otherwise, i
1f100 66 20 6e 42 79 74 65 20 69 73 20 6c 65 73 73 20  f nByte is less 
1f110 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20  than zero, then 
1f120 74 68 65 0a 2a 2a 20 72 65 71 75 65 73 74 65 64  the.** requested
1f130 20 73 69 7a 65 20 69 73 20 74 68 65 20 73 69 7a   size is the siz
1f140 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 6f 6e  e of the file on
1f150 20 64 69 73 6b 2e 20 54 68 65 20 61 63 74 75 61   disk. The actua
1f160 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a  l size of the.**
1f170 20 63 72 65 61 74 65 64 20 6d 61 70 70 69 6e 67   created mapping
1f180 20 69 73 20 65 69 74 68 65 72 20 74 68 65 20 72   is either the r
1f190 65 71 75 65 73 74 65 64 20 73 69 7a 65 20 6f 72  equested size or
1f1a0 20 74 68 65 20 76 61 6c 75 65 20 63 6f 6e 66 69   the value confi
1f1b0 67 75 72 65 64 0a 2a 2a 20 75 73 69 6e 67 20 53  gured.** using S
1f1c0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50  QLITE_FCNTL_MMAP
1f1d0 5f 53 49 5a 45 2c 20 77 68 69 63 68 65 76 65 72  _SIZE, whichever
1f1e0 20 69 73 20 73 6d 61 6c 6c 65 72 2e 0a 2a 2a 0a   is smaller..**.
1f1f0 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
1f200 72 65 74 75 72 6e 65 64 20 69 66 20 6e 6f 20 65  returned if no e
1f210 72 72 6f 72 20 6f 63 63 75 72 73 20 28 65 76 65  rror occurs (eve
1f220 6e 20 69 66 20 74 68 65 20 6d 61 70 70 69 6e 67  n if the mapping
1f230 20 69 73 20 6e 6f 74 0a 2a 2a 20 72 65 63 72 65   is not.** recre
1f240 61 74 65 64 20 61 73 20 61 20 72 65 73 75 6c 74  ated as a result
1f250 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   of outstanding 
1f260 72 65 66 65 72 65 6e 63 65 73 29 20 6f 72 20 61  references) or a
1f270 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 0a 2a  n SQLite error.*
1f280 2a 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65  * code otherwise
1f290 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1f2a0 77 69 6e 4d 61 70 66 69 6c 65 28 77 69 6e 46 69  winMapfile(winFi
1f2b0 6c 65 20 2a 70 46 64 2c 20 73 71 6c 69 74 65 33  le *pFd, sqlite3
1f2c0 5f 69 6e 74 36 34 20 6e 42 79 74 65 29 7b 0a 20  _int64 nByte){. 
1f2d0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e   sqlite3_int64 n
1f2e0 4d 61 70 20 3d 20 6e 42 79 74 65 3b 0a 20 20 69  Map = nByte;.  i
1f2f0 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
1f300 28 20 6e 4d 61 70 3e 3d 30 20 7c 7c 20 70 46 64  ( nMap>=0 || pFd
1f310 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30 20 29  ->nFetchOut==0 )
1f320 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4d 41  ;.  OSTRACE(("MA
1f330 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c 75 2c 20  P-FILE pid=%lu, 
1f340 70 46 69 6c 65 3d 25 70 2c 20 73 69 7a 65 3d 25  pFile=%p, size=%
1f350 6c 6c 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  lld\n",.        
1f360 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50     osGetCurrentP
1f370 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 64 2c  rocessId(), pFd,
1f380 20 6e 42 79 74 65 29 29 3b 0a 0a 20 20 69 66 28   nByte));..  if(
1f390 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3e   pFd->nFetchOut>
1f3a0 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
1f3b0 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 6e 4d 61  E_OK;..  if( nMa
1f3c0 70 3c 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  p<0 ){.    rc = 
1f3d0 77 69 6e 46 69 6c 65 53 69 7a 65 28 28 73 71 6c  winFileSize((sql
1f3e0 69 74 65 33 5f 66 69 6c 65 2a 29 70 46 64 2c 20  ite3_file*)pFd, 
1f3f0 26 6e 4d 61 70 29 3b 0a 20 20 20 20 69 66 28 20  &nMap);.    if( 
1f400 72 63 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52  rc ){.      OSTR
1f410 41 43 45 28 28 22 4d 41 50 2d 46 49 4c 45 20 70  ACE(("MAP-FILE p
1f420 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70  id=%lu, pFile=%p
1f430 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52  , rc=SQLITE_IOER
1f440 52 5f 46 53 54 41 54 5c 6e 22 2c 0a 20 20 20 20  R_FSTAT\n",.    
1f450 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74             osGet
1f460 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
1f470 28 29 2c 20 70 46 64 29 29 3b 0a 20 20 20 20 20  (), pFd));.     
1f480 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
1f490 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20 20 20 20  OERR_FSTAT;.    
1f4a0 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4d 61 70  }.  }.  if( nMap
1f4b0 3e 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61  >pFd->mmapSizeMa
1f4c0 78 20 29 7b 0a 20 20 20 20 6e 4d 61 70 20 3d 20  x ){.    nMap = 
1f4d0 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78  pFd->mmapSizeMax
1f4e0 3b 0a 20 20 7d 0a 20 20 6e 4d 61 70 20 26 3d 20  ;.  }.  nMap &= 
1f4f0 7e 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  ~(sqlite3_int64)
1f500 28 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77 50 61  (winSysInfo.dwPa
1f510 67 65 53 69 7a 65 20 2d 20 31 29 3b 0a 0a 20 20  geSize - 1);..  
1f520 69 66 28 20 6e 4d 61 70 3d 3d 30 20 26 26 20 70  if( nMap==0 && p
1f530 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 3e 30 20 29  Fd->mmapSize>0 )
1f540 7b 0a 20 20 20 20 77 69 6e 55 6e 6d 61 70 66 69  {.    winUnmapfi
1f550 6c 65 28 70 46 64 29 3b 0a 20 20 7d 0a 20 20 69  le(pFd);.  }.  i
1f560 66 28 20 6e 4d 61 70 21 3d 70 46 64 2d 3e 6d 6d  f( nMap!=pFd->mm
1f570 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 76 6f  apSize ){.    vo
1f580 69 64 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20  id *pNew = 0;.  
1f590 20 20 44 57 4f 52 44 20 70 72 6f 74 65 63 74 20    DWORD protect 
1f5a0 3d 20 50 41 47 45 5f 52 45 41 44 4f 4e 4c 59 3b  = PAGE_READONLY;
1f5b0 0a 20 20 20 20 44 57 4f 52 44 20 66 6c 61 67 73  .    DWORD flags
1f5c0 20 3d 20 46 49 4c 45 5f 4d 41 50 5f 52 45 41 44   = FILE_MAP_READ
1f5d0 3b 0a 0a 20 20 20 20 77 69 6e 55 6e 6d 61 70 66  ;..    winUnmapf
1f5e0 69 6c 65 28 70 46 64 29 3b 0a 20 20 20 20 69 66  ile(pFd);.    if
1f5f0 28 20 28 70 46 64 2d 3e 63 74 72 6c 46 6c 61 67  ( (pFd->ctrlFlag
1f600 73 20 26 20 57 49 4e 46 49 4c 45 5f 52 44 4f 4e  s & WINFILE_RDON
1f610 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  LY)==0 ){.      
1f620 70 72 6f 74 65 63 74 20 3d 20 50 41 47 45 5f 52  protect = PAGE_R
1f630 45 41 44 57 52 49 54 45 3b 0a 20 20 20 20 20 20  EADWRITE;.      
1f640 66 6c 61 67 73 20 7c 3d 20 46 49 4c 45 5f 4d 41  flags |= FILE_MA
1f650 50 5f 57 52 49 54 45 3b 0a 20 20 20 20 7d 0a 23  P_WRITE;.    }.#
1f660 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
1f670 52 54 0a 20 20 20 20 70 46 64 2d 3e 68 4d 61 70  RT.    pFd->hMap
1f680 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d   = osCreateFileM
1f690 61 70 70 69 6e 67 46 72 6f 6d 41 70 70 28 70 46  appingFromApp(pF
1f6a0 64 2d 3e 68 2c 20 4e 55 4c 4c 2c 20 70 72 6f 74  d->h, NULL, prot
1f6b0 65 63 74 2c 20 6e 4d 61 70 2c 20 4e 55 4c 4c 29  ect, nMap, NULL)
1f6c0 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28  ;.#elif defined(
1f6d0 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
1f6e0 5f 57 49 44 45 29 0a 20 20 20 20 70 46 64 2d 3e  _WIDE).    pFd->
1f6f0 68 4d 61 70 20 3d 20 6f 73 43 72 65 61 74 65 46  hMap = osCreateF
1f700 69 6c 65 4d 61 70 70 69 6e 67 57 28 70 46 64 2d  ileMappingW(pFd-
1f710 3e 68 2c 20 4e 55 4c 4c 2c 20 70 72 6f 74 65 63  >h, NULL, protec
1f720 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
1f730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f740 20 20 20 28 44 57 4f 52 44 29 28 28 6e 4d 61 70     (DWORD)((nMap
1f750 3e 3e 33 32 29 20 26 20 30 78 66 66 66 66 66 66  >>32) & 0xffffff
1f760 66 66 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ff),.           
1f770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f780 20 20 20 20 20 28 44 57 4f 52 44 29 28 6e 4d 61       (DWORD)(nMa
1f790 70 20 26 20 30 78 66 66 66 66 66 66 66 66 29 2c  p & 0xffffffff),
1f7a0 20 4e 55 4c 4c 29 3b 0a 23 65 6c 69 66 20 64 65   NULL);.#elif de
1f7b0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
1f7c0 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 20  32_HAS_ANSI).   
1f7d0 20 70 46 64 2d 3e 68 4d 61 70 20 3d 20 6f 73 43   pFd->hMap = osC
1f7e0 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67  reateFileMapping
1f7f0 41 28 70 46 64 2d 3e 68 2c 20 4e 55 4c 4c 2c 20  A(pFd->h, NULL, 
1f800 70 72 6f 74 65 63 74 2c 0a 20 20 20 20 20 20 20  protect,.       
1f810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f820 20 20 20 20 20 20 20 20 20 28 44 57 4f 52 44 29           (DWORD)
1f830 28 28 6e 4d 61 70 3e 3e 33 32 29 20 26 20 30 78  ((nMap>>32) & 0x
1f840 66 66 66 66 66 66 66 66 29 2c 0a 20 20 20 20 20  ffffffff),.     
1f850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f860 20 20 20 20 20 20 20 20 20 20 20 28 44 57 4f 52             (DWOR
1f870 44 29 28 6e 4d 61 70 20 26 20 30 78 66 66 66 66  D)(nMap & 0xffff
1f880 66 66 66 66 29 2c 20 4e 55 4c 4c 29 3b 0a 23 65  ffff), NULL);.#e
1f890 6e 64 69 66 0a 20 20 20 20 69 66 28 20 70 46 64  ndif.    if( pFd
1f8a0 2d 3e 68 4d 61 70 3d 3d 4e 55 4c 4c 20 29 7b 0a  ->hMap==NULL ){.
1f8b0 20 20 20 20 20 20 70 46 64 2d 3e 6c 61 73 74 45        pFd->lastE
1f8c0 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
1f8d0 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 72  Error();.      r
1f8e0 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  c = winLogError(
1f8f0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41  SQLITE_IOERR_MMA
1f900 50 2c 20 70 46 64 2d 3e 6c 61 73 74 45 72 72 6e  P, pFd->lastErrn
1f910 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
1f920 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 4d 61            "winMa
1f930 70 66 69 6c 65 31 22 2c 20 70 46 64 2d 3e 7a 50  pfile1", pFd->zP
1f940 61 74 68 29 3b 0a 20 20 20 20 20 20 2f 2a 20 4c  ath);.      /* L
1f950 6f 67 20 74 68 65 20 65 72 72 6f 72 2c 20 62 75  og the error, bu
1f960 74 20 63 6f 6e 74 69 6e 75 65 20 6e 6f 72 6d 61  t continue norma
1f970 6c 20 6f 70 65 72 61 74 69 6f 6e 20 75 73 69 6e  l operation usin
1f980 67 20 78 52 65 61 64 2f 78 57 72 69 74 65 20 2a  g xRead/xWrite *
1f990 2f 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  /.      OSTRACE(
1f9a0 28 22 4d 41 50 2d 46 49 4c 45 2d 43 52 45 41 54  ("MAP-FILE-CREAT
1f9b0 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65  E pid=%lu, pFile
1f9c0 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20  =%p, rc=%s\n",. 
1f9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73                os
1f9e0 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
1f9f0 73 49 64 28 29 2c 20 70 46 64 2c 20 73 71 6c 69  sId(), pFd, sqli
1fa00 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29  te3ErrName(rc)))
1fa10 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
1fa20 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
1fa30 20 20 20 20 61 73 73 65 72 74 28 20 28 6e 4d 61      assert( (nMa
1fa40 70 20 25 20 77 69 6e 53 79 73 49 6e 66 6f 2e 64  p % winSysInfo.d
1fa50 77 50 61 67 65 53 69 7a 65 29 3d 3d 30 20 29 3b  wPageSize)==0 );
1fa60 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
1fa70 65 6f 66 28 53 49 5a 45 5f 54 29 3d 3d 73 69 7a  eof(SIZE_T)==siz
1fa80 65 6f 66 28 73 71 6c 69 74 65 33 5f 69 6e 74 36  eof(sqlite3_int6
1fa90 34 29 20 7c 7c 20 6e 4d 61 70 3c 3d 30 78 66 66  4) || nMap<=0xff
1faa0 66 66 66 66 66 66 20 29 3b 0a 23 69 66 20 53 51  ffffff );.#if SQ
1fab0 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
1fac0 20 20 70 4e 65 77 20 3d 20 6f 73 4d 61 70 56 69    pNew = osMapVi
1fad0 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 28  ewOfFileFromApp(
1fae0 70 46 64 2d 3e 68 4d 61 70 2c 20 66 6c 61 67 73  pFd->hMap, flags
1faf0 2c 20 30 2c 20 28 53 49 5a 45 5f 54 29 6e 4d 61  , 0, (SIZE_T)nMa
1fb00 70 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 70 4e  p);.#else.    pN
1fb10 65 77 20 3d 20 6f 73 4d 61 70 56 69 65 77 4f 66  ew = osMapViewOf
1fb20 46 69 6c 65 28 70 46 64 2d 3e 68 4d 61 70 2c 20  File(pFd->hMap, 
1fb30 66 6c 61 67 73 2c 20 30 2c 20 30 2c 20 28 53 49  flags, 0, 0, (SI
1fb40 5a 45 5f 54 29 6e 4d 61 70 29 3b 0a 23 65 6e 64  ZE_T)nMap);.#end
1fb50 69 66 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d  if.    if( pNew=
1fb60 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 6f  =NULL ){.      o
1fb70 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 64  sCloseHandle(pFd
1fb80 2d 3e 68 4d 61 70 29 3b 0a 20 20 20 20 20 20 70  ->hMap);.      p
1fb90 46 64 2d 3e 68 4d 61 70 20 3d 20 4e 55 4c 4c 3b  Fd->hMap = NULL;
1fba0 0a 20 20 20 20 20 20 70 46 64 2d 3e 6c 61 73 74  .      pFd->last
1fbb0 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
1fbc0 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20  tError();.      
1fbd0 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72  rc = winLogError
1fbe0 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d  (SQLITE_IOERR_MM
1fbf0 41 50 2c 20 70 46 64 2d 3e 6c 61 73 74 45 72 72  AP, pFd->lastErr
1fc00 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
1fc10 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 4d             "winM
1fc20 61 70 66 69 6c 65 32 22 2c 20 70 46 64 2d 3e 7a  apfile2", pFd->z
1fc30 50 61 74 68 29 3b 0a 20 20 20 20 20 20 2f 2a 20  Path);.      /* 
1fc40 4c 6f 67 20 74 68 65 20 65 72 72 6f 72 2c 20 62  Log the error, b
1fc50 75 74 20 63 6f 6e 74 69 6e 75 65 20 6e 6f 72 6d  ut continue norm
1fc60 61 6c 20 6f 70 65 72 61 74 69 6f 6e 20 75 73 69  al operation usi
1fc70 6e 67 20 78 52 65 61 64 2f 78 57 72 69 74 65 20  ng xRead/xWrite 
1fc80 2a 2f 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  */.      OSTRACE
1fc90 28 28 22 4d 41 50 2d 46 49 4c 45 2d 4d 41 50 20  (("MAP-FILE-MAP 
1fca0 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25  pid=%lu, pFile=%
1fcb0 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20  p, rc=%s\n",.   
1fcc0 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65              osGe
1fcd0 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
1fce0 64 28 29 2c 20 70 46 64 2c 20 73 71 6c 69 74 65  d(), pFd, sqlite
1fcf0 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a  3ErrName(rc)));.
1fd00 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1fd10 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
1fd20 20 20 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f    pFd->pMapRegio
1fd30 6e 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 70 46  n = pNew;.    pF
1fd40 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d 20 6e 4d  d->mmapSize = nM
1fd50 61 70 3b 0a 20 20 20 20 70 46 64 2d 3e 6d 6d 61  ap;.    pFd->mma
1fd60 70 53 69 7a 65 41 63 74 75 61 6c 20 3d 20 6e 4d  pSizeActual = nM
1fd70 61 70 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41  ap;.  }..  OSTRA
1fd80 43 45 28 28 22 4d 41 50 2d 46 49 4c 45 20 70 69  CE(("MAP-FILE pi
1fd90 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c  d=%lu, pFile=%p,
1fda0 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22   rc=SQLITE_OK\n"
1fdb0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 47  ,.           osG
1fdc0 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
1fdd0 49 64 28 29 2c 20 70 46 64 29 29 3b 0a 20 20 72  Id(), pFd));.  r
1fde0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1fdf0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
1fe00 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
1fe10 45 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66  E>0 */../*.** If
1fe20 20 70 6f 73 73 69 62 6c 65 2c 20 72 65 74 75 72   possible, retur
1fe30 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
1fe40 20 6d 61 70 70 69 6e 67 20 6f 66 20 66 69 6c 65   mapping of file
1fe50 20 66 64 20 73 74 61 72 74 69 6e 67 20 61 74 20   fd starting at 
1fe60 6f 66 66 73 65 74 0a 2a 2a 20 69 4f 66 66 2e 20  offset.** iOff. 
1fe70 54 68 65 20 6d 61 70 70 69 6e 67 20 6d 75 73 74  The mapping must
1fe80 20 62 65 20 76 61 6c 69 64 20 66 6f 72 20 61 74   be valid for at
1fe90 20 6c 65 61 73 74 20 6e 41 6d 74 20 62 79 74 65   least nAmt byte
1fea0 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 68  s..**.** If such
1feb0 20 61 20 70 6f 69 6e 74 65 72 20 63 61 6e 20 62   a pointer can b
1fec0 65 20 6f 62 74 61 69 6e 65 64 2c 20 73 74 6f 72  e obtained, stor
1fed0 65 20 69 74 20 69 6e 20 2a 70 70 20 61 6e 64 20  e it in *pp and 
1fee0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1fef0 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20 6f 6e 65 20  ..** Or, if one 
1ff00 63 61 6e 6e 6f 74 20 62 75 74 20 6e 6f 20 65 72  cannot but no er
1ff10 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20  ror occurs, set 
1ff20 2a 70 70 20 74 6f 20 30 20 61 6e 64 20 72 65 74  *pp to 0 and ret
1ff30 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  urn SQLITE_OK..*
1ff40 2a 20 46 69 6e 61 6c 6c 79 2c 20 69 66 20 61 6e  * Finally, if an
1ff50 20 65 72 72 6f 72 20 64 6f 65 73 20 6f 63 63 75   error does occu
1ff60 72 2c 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c  r, return an SQL
1ff70 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20  ite error code. 
1ff80 54 68 65 20 66 69 6e 61 6c 0a 2a 2a 20 76 61 6c  The final.** val
1ff90 75 65 20 6f 66 20 2a 70 70 20 69 73 20 75 6e 64  ue of *pp is und
1ffa0 65 66 69 6e 65 64 20 69 6e 20 74 68 69 73 20 63  efined in this c
1ffb0 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ase..**.** If th
1ffc0 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73  is function does
1ffd0 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
1ffe0 72 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 6d 75  r, the caller mu
1fff0 73 74 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a  st eventually.**
20000 20 72 65 6c 65 61 73 65 20 74 68 65 20 72 65 66   release the ref
20010 65 72 65 6e 63 65 20 62 79 20 63 61 6c 6c 69 6e  erence by callin
20020 67 20 77 69 6e 55 6e 66 65 74 63 68 28 29 2e 0a  g winUnfetch()..
20030 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
20040 6e 46 65 74 63 68 28 73 71 6c 69 74 65 33 5f 66  nFetch(sqlite3_f
20050 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 69 4f 66  ile *fd, i64 iOf
20060 66 2c 20 69 6e 74 20 6e 41 6d 74 2c 20 76 6f 69  f, int nAmt, voi
20070 64 20 2a 2a 70 70 29 7b 0a 23 69 66 20 53 51 4c  d **pp){.#if SQL
20080 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
20090 45 3e 30 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70  E>0.  winFile *p
200a0 46 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66  Fd = (winFile*)f
200b0 64 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65  d;   /* The unde
200c0 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65 20  rlying database 
200d0 66 69 6c 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  file */.#endif. 
200e0 20 2a 70 70 20 3d 20 30 3b 0a 0a 20 20 4f 53 54   *pp = 0;..  OST
200f0 52 41 43 45 28 28 22 46 45 54 43 48 20 70 69 64  RACE(("FETCH pid
20100 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20  =%lu, pFile=%p, 
20110 6f 66 66 73 65 74 3d 25 6c 6c 64 2c 20 61 6d 6f  offset=%lld, amo
20120 75 6e 74 3d 25 64 2c 20 70 70 3d 25 70 5c 6e 22  unt=%d, pp=%p\n"
20130 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 47  ,.           osG
20140 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
20150 49 64 28 29 2c 20 66 64 2c 20 69 4f 66 66 2c 20  Id(), fd, iOff, 
20160 6e 41 6d 74 2c 20 70 70 29 29 3b 0a 0a 23 69 66  nAmt, pp));..#if
20170 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
20180 5f 53 49 5a 45 3e 30 0a 20 20 69 66 28 20 70 46  _SIZE>0.  if( pF
20190 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 3e 30  d->mmapSizeMax>0
201a0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 46 64 2d   ){.    if( pFd-
201b0 3e 70 4d 61 70 52 65 67 69 6f 6e 3d 3d 30 20 29  >pMapRegion==0 )
201c0 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d  {.      int rc =
201d0 20 77 69 6e 4d 61 70 66 69 6c 65 28 70 46 64 2c   winMapfile(pFd,
201e0 20 2d 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20   -1);.      if( 
201f0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
20200 0a 20 20 20 20 20 20 20 20 4f 53 54 52 41 43 45  .        OSTRACE
20210 28 28 22 46 45 54 43 48 20 70 69 64 3d 25 6c 75  (("FETCH pid=%lu
20220 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d 25  , pFile=%p, rc=%
20230 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
20240 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72         osGetCurr
20250 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
20260 70 46 64 2c 20 73 71 6c 69 74 65 33 45 72 72 4e  pFd, sqlite3ErrN
20270 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 20 20 20  ame(rc)));.     
20280 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
20290 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
202a0 69 66 28 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a  if( pFd->mmapSiz
202b0 65 20 3e 3d 20 69 4f 66 66 2b 6e 41 6d 74 20 29  e >= iOff+nAmt )
202c0 7b 0a 20 20 20 20 20 20 2a 70 70 20 3d 20 26 28  {.      *pp = &(
202d0 28 75 38 20 2a 29 70 46 64 2d 3e 70 4d 61 70 52  (u8 *)pFd->pMapR
202e0 65 67 69 6f 6e 29 5b 69 4f 66 66 5d 3b 0a 20 20  egion)[iOff];.  
202f0 20 20 20 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f      pFd->nFetchO
20300 75 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ut++;.    }.  }.
20310 23 65 6e 64 69 66 0a 0a 20 20 4f 53 54 52 41 43  #endif..  OSTRAC
20320 45 28 28 22 46 45 54 43 48 20 70 69 64 3d 25 6c  E(("FETCH pid=%l
20330 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 70 70 3d  u, pFile=%p, pp=
20340 25 70 2c 20 2a 70 70 3d 25 70 2c 20 72 63 3d 53  %p, *pp=%p, rc=S
20350 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20  QLITE_OK\n",.   
20360 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
20370 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
20380 20 66 64 2c 20 70 70 2c 20 2a 70 70 29 29 3b 0a   fd, pp, *pp));.
20390 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
203a0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  OK;.}../*.** If 
203b0 74 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65  the third argume
203c0 6e 74 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20  nt is non-NULL, 
203d0 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  then this functi
203e0 6f 6e 20 72 65 6c 65 61 73 65 73 20 61 0a 2a 2a  on releases a.**
203f0 20 72 65 66 65 72 65 6e 63 65 20 6f 62 74 61 69   reference obtai
20400 6e 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65  ned by an earlie
20410 72 20 63 61 6c 6c 20 74 6f 20 77 69 6e 46 65 74  r call to winFet
20420 63 68 28 29 2e 20 54 68 65 20 73 65 63 6f 6e 64  ch(). The second
20430 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 70 61 73  .** argument pas
20440 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63  sed to this func
20450 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 74 68 65  tion must be the
20460 20 73 61 6d 65 20 61 73 20 74 68 65 20 63 6f 72   same as the cor
20470 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 61 72  responding.** ar
20480 67 75 6d 65 6e 74 20 74 68 61 74 20 77 61 73 20  gument that was 
20490 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 77 69  passed to the wi
204a0 6e 46 65 74 63 68 28 29 20 69 6e 76 6f 63 61 74  nFetch() invocat
204b0 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69  ion..**.** Or, i
204c0 66 20 74 68 65 20 74 68 69 72 64 20 61 72 67 75  f the third argu
204d0 6d 65 6e 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68  ment is NULL, th
204e0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
204f0 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64   is being called
20500 0a 2a 2a 20 74 6f 20 69 6e 66 6f 72 6d 20 74 68  .** to inform th
20510 65 20 56 46 53 20 6c 61 79 65 72 20 74 68 61 74  e VFS layer that
20520 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 50  , according to P
20530 4f 53 49 58 2c 20 61 6e 79 20 65 78 69 73 74 69  OSIX, any existi
20540 6e 67 20 6d 61 70 70 69 6e 67 0a 2a 2a 20 6d 61  ng mapping.** ma
20550 79 20 6e 6f 77 20 62 65 20 69 6e 76 61 6c 69 64  y now be invalid
20560 20 61 6e 64 20 73 68 6f 75 6c 64 20 62 65 20 75   and should be u
20570 6e 6d 61 70 70 65 64 2e 0a 2a 2f 0a 73 74 61 74  nmapped..*/.stat
20580 69 63 20 69 6e 74 20 77 69 6e 55 6e 66 65 74 63  ic int winUnfetc
20590 68 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  h(sqlite3_file *
205a0 66 64 2c 20 69 36 34 20 69 4f 66 66 2c 20 76 6f  fd, i64 iOff, vo
205b0 69 64 20 2a 70 29 7b 0a 23 69 66 20 53 51 4c 49  id *p){.#if SQLI
205c0 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
205d0 3e 30 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46  >0.  winFile *pF
205e0 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66 64  d = (winFile*)fd
205f0 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72  ;   /* The under
20600 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65 20 66  lying database f
20610 69 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20  ile */..  /* If 
20620 70 3d 3d 30 20 28 75 6e 6d 61 70 20 74 68 65 20  p==0 (unmap the 
20630 65 6e 74 69 72 65 20 66 69 6c 65 29 20 74 68 65  entire file) the
20640 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20  n there must be 
20650 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 0a 20  no outstanding. 
20660 20 2a 2a 20 78 46 65 74 63 68 20 72 65 66 65 72   ** xFetch refer
20670 65 6e 63 65 73 2e 20 4f 72 2c 20 69 66 20 70 21  ences. Or, if p!
20680 3d 30 20 28 6d 65 61 6e 69 6e 67 20 69 74 20 69  =0 (meaning it i
20690 73 20 61 6e 20 78 46 65 74 63 68 20 72 65 66 65  s an xFetch refe
206a0 72 65 6e 63 65 29 2c 0a 20 20 2a 2a 20 74 68 65  rence),.  ** the
206b0 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20  n there must be 
206c0 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 75 74  at least one out
206d0 73 74 61 6e 64 69 6e 67 2e 20 20 2a 2f 0a 20 20  standing.  */.  
206e0 61 73 73 65 72 74 28 20 28 70 3d 3d 30 29 3d 3d  assert( (p==0)==
206f0 28 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3d  (pFd->nFetchOut=
20700 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  =0) );..  /* If 
20710 70 21 3d 30 2c 20 69 74 20 6d 75 73 74 20 6d 61  p!=0, it must ma
20720 74 63 68 20 74 68 65 20 69 4f 66 66 20 76 61 6c  tch the iOff val
20730 75 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ue. */.  assert(
20740 20 70 3d 3d 30 20 7c 7c 20 70 3d 3d 26 28 28 75   p==0 || p==&((u
20750 38 20 2a 29 70 46 64 2d 3e 70 4d 61 70 52 65 67  8 *)pFd->pMapReg
20760 69 6f 6e 29 5b 69 4f 66 66 5d 20 29 3b 0a 0a 20  ion)[iOff] );.. 
20770 20 4f 53 54 52 41 43 45 28 28 22 55 4e 46 45 54   OSTRACE(("UNFET
20780 43 48 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c  CH pid=%lu, pFil
20790 65 3d 25 70 2c 20 6f 66 66 73 65 74 3d 25 6c 6c  e=%p, offset=%ll
207a0 64 2c 20 70 3d 25 70 5c 6e 22 2c 0a 20 20 20 20  d, p=%p\n",.    
207b0 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72         osGetCurr
207c0 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
207d0 70 46 64 2c 20 69 4f 66 66 2c 20 70 29 29 3b 0a  pFd, iOff, p));.
207e0 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
207f0 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 2d 2d  pFd->nFetchOut--
20800 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
20810 2a 20 46 49 58 4d 45 3a 20 20 49 66 20 57 69 6e  * FIXME:  If Win
20820 64 6f 77 73 20 74 72 75 6c 79 20 61 6c 77 61 79  dows truly alway
20830 73 20 70 72 65 76 65 6e 74 73 20 74 72 75 6e 63  s prevents trunc
20840 61 74 69 6e 67 20 6f 72 20 64 65 6c 65 74 69 6e  ating or deletin
20850 67 20 61 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  g a.    ** file 
20860 77 68 69 6c 65 20 61 20 6d 61 70 70 69 6e 67 20  while a mapping 
20870 69 73 20 68 65 6c 64 2c 20 74 68 65 6e 20 74 68  is held, then th
20880 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 69 6e 55  e following winU
20890 6e 6d 61 70 66 69 6c 65 28 29 20 63 61 6c 6c 0a  nmapfile() call.
208a0 20 20 20 20 2a 2a 20 69 73 20 75 6e 6e 65 63 65      ** is unnece
208b0 73 73 61 72 79 20 63 61 6e 20 63 61 6e 20 62 65  ssary can can be
208c0 20 6f 6d 69 74 74 65 64 20 2d 20 70 6f 74 65 6e   omitted - poten
208d0 74 69 61 6c 6c 79 20 69 6d 70 72 6f 76 69 6e 67  tially improving
208e0 0a 20 20 20 20 2a 2a 20 70 65 72 66 6f 72 6d 61  .    ** performa
208f0 6e 63 65 2e 20 20 2a 2f 0a 20 20 20 20 77 69 6e  nce.  */.    win
20900 55 6e 6d 61 70 66 69 6c 65 28 70 46 64 29 3b 0a  Unmapfile(pFd);.
20910 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70    }..  assert( p
20920 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3e 3d 30  Fd->nFetchOut>=0
20930 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 4f 53   );.#endif..  OS
20940 54 52 41 43 45 28 28 22 55 4e 46 45 54 43 48 20  TRACE(("UNFETCH 
20950 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25  pid=%lu, pFile=%
20960 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c  p, rc=SQLITE_OK\
20970 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f  n",.           o
20980 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
20990 73 73 49 64 28 29 2c 20 66 64 29 29 3b 0a 20 20  ssId(), fd));.  
209a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
209b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20  ;.}../*.** Here 
209c0 65 6e 64 73 20 74 68 65 20 69 6d 70 6c 65 6d 65  ends the impleme
209d0 6e 74 61 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 73  ntation of all s
209e0 71 6c 69 74 65 33 5f 66 69 6c 65 20 6d 65 74 68  qlite3_file meth
209f0 6f 64 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ods..**.********
20a00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45  ************** E
20a10 6e 64 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  nd sqlite3_file 
20a20 4d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a  Methods ********
20a30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20a40 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
20a50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20a60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20a70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20a80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20a90 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  ******/../*.** T
20aa0 68 69 73 20 76 65 63 74 6f 72 20 64 65 66 69 6e  his vector defin
20ab0 65 73 20 61 6c 6c 20 74 68 65 20 6d 65 74 68 6f  es all the metho
20ac0 64 73 20 74 68 61 74 20 63 61 6e 20 6f 70 65 72  ds that can oper
20ad0 61 74 65 20 6f 6e 20 61 6e 0a 2a 2a 20 73 71 6c  ate on an.** sql
20ae0 69 74 65 33 5f 66 69 6c 65 20 66 6f 72 20 77 69  ite3_file for wi
20af0 6e 33 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  n32..*/.static c
20b00 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  onst sqlite3_io_
20b10 6d 65 74 68 6f 64 73 20 77 69 6e 49 6f 4d 65 74  methods winIoMet
20b20 68 6f 64 20 3d 20 7b 0a 20 20 33 2c 20 20 20 20  hod = {.  3,    
20b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20b40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65            /* iVe
20b50 72 73 69 6f 6e 20 2a 2f 0a 20 20 77 69 6e 43 6c  rsion */.  winCl
20b60 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ose,            
20b70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
20b80 6c 6f 73 65 20 2a 2f 0a 20 20 77 69 6e 52 65 61  lose */.  winRea
20b90 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
20ba0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65            /* xRe
20bb0 61 64 20 2a 2f 0a 20 20 77 69 6e 57 72 69 74 65  ad */.  winWrite
20bc0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
20bd0 20 20 20 20 20 20 20 20 2f 2a 20 78 57 72 69 74          /* xWrit
20be0 65 20 2a 2f 0a 20 20 77 69 6e 54 72 75 6e 63 61  e */.  winTrunca
20bf0 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  te,             
20c00 20 20 20 20 20 20 20 2f 2a 20 78 54 72 75 6e 63         /* xTrunc
20c10 61 74 65 20 2a 2f 0a 20 20 77 69 6e 53 79 6e 63  ate */.  winSync
20c20 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
20c30 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 79 6e           /* xSyn
20c40 63 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 53 69  c */.  winFileSi
20c50 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ze,             
20c60 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 53         /* xFileS
20c70 69 7a 65 20 2a 2f 0a 20 20 77 69 6e 4c 6f 63 6b  ize */.  winLock
20c80 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
20c90 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63           /* xLoc
20ca0 6b 20 2a 2f 0a 20 20 77 69 6e 55 6e 6c 6f 63 6b  k */.  winUnlock
20cb0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
20cc0 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63         /* xUnloc
20cd0 6b 20 2a 2f 0a 20 20 77 69 6e 43 68 65 63 6b 52  k */.  winCheckR
20ce0 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20 20  eservedLock,    
20cf0 20 20 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b         /* xCheck
20d00 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 2a 2f 0a  ReservedLock */.
20d10 20 20 77 69 6e 46 69 6c 65 43 6f 6e 74 72 6f 6c    winFileControl
20d20 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
20d30 20 20 2f 2a 20 78 46 69 6c 65 43 6f 6e 74 72 6f    /* xFileContro
20d40 6c 20 2a 2f 0a 20 20 77 69 6e 53 65 63 74 6f 72  l */.  winSector
20d50 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20  Size,           
20d60 20 20 20 20 20 20 20 2f 2a 20 78 53 65 63 74 6f         /* xSecto
20d70 72 53 69 7a 65 20 2a 2f 0a 20 20 77 69 6e 44 65  rSize */.  winDe
20d80 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
20d90 69 63 73 2c 20 20 20 20 20 20 20 2f 2a 20 78 44  ics,       /* xD
20da0 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
20db0 74 69 63 73 20 2a 2f 0a 20 20 77 69 6e 53 68 6d  tics */.  winShm
20dc0 4d 61 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  Map,            
20dd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68            /* xSh
20de0 6d 4d 61 70 20 2a 2f 0a 20 20 77 69 6e 53 68 6d  mMap */.  winShm
20df0 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
20e00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68            /* xSh
20e10 6d 4c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e 53 68  mLock */.  winSh
20e20 6d 42 61 72 72 69 65 72 2c 20 20 20 20 20 20 20  mBarrier,       
20e30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
20e40 68 6d 42 61 72 72 69 65 72 20 2a 2f 0a 20 20 77  hmBarrier */.  w
20e50 69 6e 53 68 6d 55 6e 6d 61 70 2c 20 20 20 20 20  inShmUnmap,     
20e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20e70 2a 20 78 53 68 6d 55 6e 6d 61 70 20 2a 2f 0a 20  * xShmUnmap */. 
20e80 20 77 69 6e 46 65 74 63 68 2c 20 20 20 20 20 20   winFetch,      
20e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ea0 20 2f 2a 20 78 46 65 74 63 68 20 2a 2f 0a 20 20   /* xFetch */.  
20eb0 77 69 6e 55 6e 66 65 74 63 68 20 20 20 20 20 20  winUnfetch      
20ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ed0 2f 2a 20 78 55 6e 66 65 74 63 68 20 2a 2f 0a 7d  /* xUnfetch */.}
20ee0 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ;../************
20ef0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20f00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20f10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20f20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20f30 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
20f40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 73 71  ************* sq
20f50 6c 69 74 65 33 5f 76 66 73 20 6d 65 74 68 6f 64  lite3_vfs method
20f60 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  s **************
20f70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
20f80 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76 69 73 69  *.** This divisi
20f90 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  on contains the 
20fa0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
20fb0 66 20 6d 65 74 68 6f 64 73 20 6f 6e 20 74 68 65  f methods on the
20fc0 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66 73 20  .** sqlite3_vfs 
20fd0 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 0a 23 69 66 20  object..*/..#if 
20fe0 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e  defined(__CYGWIN
20ff0 5f 5f 29 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  __)./*.** Conver
21000 74 20 61 20 66 69 6c 65 6e 61 6d 65 20 66 72 6f  t a filename fro
21010 6d 20 77 68 61 74 65 76 65 72 20 74 68 65 20 75  m whatever the u
21020 6e 64 65 72 6c 79 69 6e 67 20 6f 70 65 72 61 74  nderlying operat
21030 69 6e 67 20 73 79 73 74 65 6d 0a 2a 2a 20 73 75  ing system.** su
21040 70 70 6f 72 74 73 20 66 6f 72 20 66 69 6c 65 6e  pports for filen
21050 61 6d 65 73 20 69 6e 74 6f 20 55 54 46 2d 38 2e  ames into UTF-8.
21060 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20    Space to hold 
21070 74 68 65 20 72 65 73 75 6c 74 20 69 73 0a 2a 2a  the result is.**
21080 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d   obtained from m
21090 61 6c 6c 6f 63 20 61 6e 64 20 6d 75 73 74 20 62  alloc and must b
210a0 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63  e freed by the c
210b0 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e  alling function.
210c0 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
210d0 2a 77 69 6e 43 6f 6e 76 65 72 74 54 6f 55 74 66  *winConvertToUtf
210e0 38 46 69 6c 65 6e 61 6d 65 28 63 6f 6e 73 74 20  8Filename(const 
210f0 76 6f 69 64 20 2a 7a 46 69 6c 65 6e 61 6d 65 29  void *zFilename)
21100 7b 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6e 76 65  {.  char *zConve
21110 72 74 65 64 20 3d 20 30 3b 0a 20 20 69 66 28 20  rted = 0;.  if( 
21120 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 20 20 20  osIsNT() ){.    
21130 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77 69 6e  zConverted = win
21140 55 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 46  UnicodeToUtf8(zF
21150 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 23 69  ilename);.  }.#i
21160 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  fdef SQLITE_WIN3
21170 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73  2_HAS_ANSI.  els
21180 65 7b 0a 20 20 20 20 7a 43 6f 6e 76 65 72 74 65  e{.    zConverte
21190 64 20 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e 33  d = sqlite3_win3
211a0 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28 7a  2_mbcs_to_utf8(z
211b0 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 23  Filename);.  }.#
211c0 65 6e 64 69 66 0a 20 20 2f 2a 20 63 61 6c 6c 65  endif.  /* calle
211d0 72 20 77 69 6c 6c 20 68 61 6e 64 6c 65 20 6f 75  r will handle ou
211e0 74 20 6f 66 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20  t of memory */. 
211f0 20 72 65 74 75 72 6e 20 7a 43 6f 6e 76 65 72 74   return zConvert
21200 65 64 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ed;.}.#endif../*
21210 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 55 54  .** Convert a UT
21220 46 2d 38 20 66 69 6c 65 6e 61 6d 65 20 69 6e 74  F-8 filename int
21230 6f 20 77 68 61 74 65 76 65 72 20 66 6f 72 6d 20  o whatever form 
21240 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a 2a  the underlying.*
21250 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  * operating syst
21260 65 6d 20 77 61 6e 74 73 20 66 69 6c 65 6e 61 6d  em wants filenam
21270 65 73 20 69 6e 2e 20 20 53 70 61 63 65 20 74 6f  es in.  Space to
21280 20 68 6f 6c 64 20 74 68 65 20 72 65 73 75 6c 74   hold the result
21290 0a 2a 2a 20 69 73 20 6f 62 74 61 69 6e 65 64 20  .** is obtained 
212a0 66 72 6f 6d 20 6d 61 6c 6c 6f 63 20 61 6e 64 20  from malloc and 
212b0 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79  must be freed by
212c0 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20   the calling.** 
212d0 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  function..*/.sta
212e0 74 69 63 20 76 6f 69 64 20 2a 77 69 6e 43 6f 6e  tic void *winCon
212f0 76 65 72 74 46 72 6f 6d 55 74 66 38 46 69 6c 65  vertFromUtf8File
21300 6e 61 6d 65 28 63 6f 6e 73 74 20 63 68 61 72 20  name(const char 
21310 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 76  *zFilename){.  v
21320 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 20  oid *zConverted 
21330 3d 20 30 3b 0a 20 20 69 66 28 20 6f 73 49 73 4e  = 0;.  if( osIsN
21340 54 28 29 20 29 7b 0a 20 20 20 20 7a 43 6f 6e 76  T() ){.    zConv
21350 65 72 74 65 64 20 3d 20 77 69 6e 55 74 66 38 54  erted = winUtf8T
21360 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61  oUnicode(zFilena
21370 6d 65 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20  me);.  }.#ifdef 
21380 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
21390 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20  _ANSI.  else{.  
213a0 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 73    zConverted = s
213b0 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75 74 66  qlite3_win32_utf
213c0 38 5f 74 6f 5f 6d 62 63 73 28 7a 46 69 6c 65 6e  8_to_mbcs(zFilen
213d0 61 6d 65 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ame);.  }.#endif
213e0 0a 20 20 2f 2a 20 63 61 6c 6c 65 72 20 77 69 6c  .  /* caller wil
213f0 6c 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20  l handle out of 
21400 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 72 65 74 75  memory */.  retu
21410 72 6e 20 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 7d  rn zConverted;.}
21420 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
21430 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 6e 6f  ction returns no
21440 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 73 70  n-zero if the sp
21450 65 63 69 66 69 65 64 20 55 54 46 2d 38 20 73 74  ecified UTF-8 st
21460 72 69 6e 67 20 62 75 66 66 65 72 0a 2a 2a 20 65  ring buffer.** e
21470 6e 64 73 20 77 69 74 68 20 61 20 64 69 72 65 63  nds with a direc
21480 74 6f 72 79 20 73 65 70 61 72 61 74 6f 72 20 63  tory separator c
21490 68 61 72 61 63 74 65 72 20 6f 72 20 6f 6e 65 20  haracter or one 
214a0 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79  was successfully
214b0 0a 2a 2a 20 61 64 64 65 64 20 74 6f 20 69 74 2e  .** added to it.
214c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
214d0 69 6e 4d 61 6b 65 45 6e 64 49 6e 44 69 72 53 65  inMakeEndInDirSe
214e0 70 28 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72  p(int nBuf, char
214f0 20 2a 7a 42 75 66 29 7b 0a 20 20 69 66 28 20 7a   *zBuf){.  if( z
21500 42 75 66 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  Buf ){.    int n
21510 4c 65 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72  Len = sqlite3Str
21520 6c 65 6e 33 30 28 7a 42 75 66 29 3b 0a 20 20 20  len30(zBuf);.   
21530 20 69 66 28 20 6e 4c 65 6e 3e 30 20 29 7b 0a 20   if( nLen>0 ){. 
21540 20 20 20 20 20 69 66 28 20 77 69 6e 49 73 44 69       if( winIsDi
21550 72 53 65 70 28 7a 42 75 66 5b 6e 4c 65 6e 2d 31  rSep(zBuf[nLen-1
21560 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  ]) ){.        re
21570 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 65  turn 1;.      }e
21580 6c 73 65 20 69 66 28 20 6e 4c 65 6e 2b 31 3c 6e  lse if( nLen+1<n
21590 42 75 66 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  Buf ){.        z
215a0 42 75 66 5b 6e 4c 65 6e 5d 20 3d 20 77 69 6e 47  Buf[nLen] = winG
215b0 65 74 44 69 72 53 65 70 28 29 3b 0a 20 20 20 20  etDirSep();.    
215c0 20 20 20 20 7a 42 75 66 5b 6e 4c 65 6e 2b 31 5d      zBuf[nLen+1]
215d0 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 20   = '\0';.       
215e0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
215f0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
21600 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
21610 2a 20 43 72 65 61 74 65 20 61 20 74 65 6d 70 6f  * Create a tempo
21620 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65 20 61  rary file name a
21630 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73  nd store the res
21640 75 6c 74 69 6e 67 20 70 6f 69 6e 74 65 72 20 69  ulting pointer i
21650 6e 74 6f 20 70 7a 42 75 66 2e 0a 2a 2a 20 54 68  nto pzBuf..** Th
21660 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e  e pointer return
21670 65 64 20 69 6e 20 70 7a 42 75 66 20 6d 75 73 74  ed in pzBuf must
21680 20 62 65 20 66 72 65 65 64 20 76 69 61 20 73 71   be freed via sq
21690 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f  lite3_free()..*/
216a0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 47  .static int winG
216b0 65 74 54 65 6d 70 6e 61 6d 65 28 73 71 6c 69 74  etTempname(sqlit
216c0 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 63 68  e3_vfs *pVfs, ch
216d0 61 72 20 2a 2a 70 7a 42 75 66 29 7b 0a 20 20 73  ar **pzBuf){.  s
216e0 74 61 74 69 63 20 63 68 61 72 20 7a 43 68 61 72  tatic char zChar
216f0 73 5b 5d 20 3d 0a 20 20 20 20 22 61 62 63 64 65  s[] =.    "abcde
21700 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75  fghijklmnopqrstu
21710 76 77 78 79 7a 22 0a 20 20 20 20 22 41 42 43 44  vwxyz".    "ABCD
21720 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54  EFGHIJKLMNOPQRST
21730 55 56 57 58 59 5a 22 0a 20 20 20 20 22 30 31 32  UVWXYZ".    "012
21740 33 34 35 36 37 38 39 22 3b 0a 20 20 73 69 7a 65  3456789";.  size
21750 5f 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e  _t i, j;.  int n
21760 50 72 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72  Pre = sqlite3Str
21770 6c 65 6e 33 30 28 53 51 4c 49 54 45 5f 54 45 4d  len30(SQLITE_TEM
21780 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 29 3b 0a  P_FILE_PREFIX);.
21790 20 20 69 6e 74 20 6e 4d 61 78 2c 20 6e 42 75 66    int nMax, nBuf
217a0 2c 20 6e 44 69 72 2c 20 6e 4c 65 6e 3b 0a 20 20  , nDir, nLen;.  
217b0 63 68 61 72 20 2a 7a 42 75 66 3b 0a 0a 20 20 2f  char *zBuf;..  /
217c0 2a 20 49 74 27 73 20 6f 64 64 20 74 6f 20 73 69  * It's odd to si
217d0 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72 72  mulate an io-err
217e0 6f 72 20 68 65 72 65 2c 20 62 75 74 20 72 65 61  or here, but rea
217f0 6c 6c 79 20 74 68 69 73 20 69 73 20 6a 75 73 74  lly this is just
21800 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20  .  ** using the 
21810 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61 73 74  io-error infrast
21820 72 75 63 74 75 72 65 20 74 6f 20 74 65 73 74 20  ructure to test 
21830 74 68 61 74 20 53 51 4c 69 74 65 20 68 61 6e 64  that SQLite hand
21840 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75  les this.  ** fu
21850 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 0a  nction failing..
21860 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49    */.  SimulateI
21870 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
21880 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 3b 0a 0a  QLITE_IOERR );..
21890 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20    /* Allocate a 
218a0 74 65 6d 70 6f 72 61 72 79 20 62 75 66 66 65 72  temporary buffer
218b0 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 66 75   to store the fu
218c0 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 20 66 69  lly qualified fi
218d0 6c 65 0a 20 20 2a 2a 20 6e 61 6d 65 20 66 6f 72  le.  ** name for
218e0 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66   the temporary f
218f0 69 6c 65 2e 20 20 49 66 20 74 68 69 73 20 66 61  ile.  If this fa
21900 69 6c 73 2c 20 77 65 20 63 61 6e 6e 6f 74 20 63  ils, we cannot c
21910 6f 6e 74 69 6e 75 65 2e 0a 20 20 2a 2f 0a 20 20  ontinue..  */.  
21920 6e 4d 61 78 20 3d 20 70 56 66 73 2d 3e 6d 78 50  nMax = pVfs->mxP
21930 61 74 68 6e 61 6d 65 3b 20 6e 42 75 66 20 3d 20  athname; nBuf = 
21940 6e 4d 61 78 20 2b 20 32 3b 0a 20 20 7a 42 75 66  nMax + 2;.  zBuf
21950 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
21960 5a 65 72 6f 28 20 6e 42 75 66 20 29 3b 0a 20 20  Zero( nBuf );.  
21970 69 66 28 20 21 7a 42 75 66 20 29 7b 0a 20 20 20  if( !zBuf ){.   
21980 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d   OSTRACE(("TEMP-
21990 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49  FILENAME rc=SQLI
219a0 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e  TE_IOERR_NOMEM\n
219b0 22 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  "));.    return 
219c0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
219d0 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69  EM;.  }..  /* Fi
219e0 67 75 72 65 20 6f 75 74 20 74 68 65 20 65 66 66  gure out the eff
219f0 65 63 74 69 76 65 20 74 65 6d 70 6f 72 61 72 79  ective temporary
21a00 20 64 69 72 65 63 74 6f 72 79 2e 20 20 46 69 72   directory.  Fir
21a10 73 74 2c 20 63 68 65 63 6b 20 69 66 20 6f 6e 65  st, check if one
21a20 0a 20 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 65  .  ** has been e
21a30 78 70 6c 69 63 69 74 6c 79 20 73 65 74 20 62 79  xplicitly set by
21a40 20 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e   the application
21a50 3b 20 6f 74 68 65 72 77 69 73 65 2c 20 75 73 65  ; otherwise, use
21a60 20 74 68 65 20 6f 6e 65 0a 20 20 2a 2a 20 63 6f   the one.  ** co
21a70 6e 66 69 67 75 72 65 64 20 62 79 20 74 68 65 20  nfigured by the 
21a80 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
21a90 2e 0a 20 20 2a 2f 0a 20 20 6e 44 69 72 20 3d 20  ..  */.  nDir = 
21aa0 6e 4d 61 78 20 2d 20 28 6e 50 72 65 20 2b 20 31  nMax - (nPre + 1
21ab0 35 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 44  5);.  assert( nD
21ac0 69 72 3e 30 20 29 3b 0a 20 20 69 66 28 20 73 71  ir>0 );.  if( sq
21ad0 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63  lite3_temp_direc
21ae0 74 6f 72 79 20 29 7b 0a 20 20 20 20 69 6e 74 20  tory ){.    int 
21af0 6e 44 69 72 4c 65 6e 20 3d 20 73 71 6c 69 74 65  nDirLen = sqlite
21b00 33 53 74 72 6c 65 6e 33 30 28 73 71 6c 69 74 65  3Strlen30(sqlite
21b10 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79  3_temp_directory
21b20 29 3b 0a 20 20 20 20 69 66 28 20 6e 44 69 72 4c  );.    if( nDirL
21b30 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 66  en>0 ){.      if
21b40 28 20 21 77 69 6e 49 73 44 69 72 53 65 70 28 73  ( !winIsDirSep(s
21b50 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65  qlite3_temp_dire
21b60 63 74 6f 72 79 5b 6e 44 69 72 4c 65 6e 2d 31 5d  ctory[nDirLen-1]
21b70 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 44 69  ) ){.        nDi
21b80 72 4c 65 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  rLen++;.      }.
21b90 20 20 20 20 20 20 69 66 28 20 6e 44 69 72 4c 65        if( nDirLe
21ba0 6e 3e 6e 44 69 72 20 29 7b 0a 20 20 20 20 20 20  n>nDir ){.      
21bb0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
21bc0 42 75 66 29 3b 0a 20 20 20 20 20 20 20 20 4f 53  Buf);.        OS
21bd0 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c  TRACE(("TEMP-FIL
21be0 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f  ENAME rc=SQLITE_
21bf0 45 52 52 4f 52 5c 6e 22 29 29 3b 0a 20 20 20 20  ERROR\n"));.    
21c00 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f      return winLo
21c10 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 45 52  gError(SQLITE_ER
21c20 52 4f 52 2c 20 30 2c 20 22 77 69 6e 47 65 74 54  ROR, 0, "winGetT
21c30 65 6d 70 6e 61 6d 65 31 22 2c 20 30 29 3b 0a 20  empname1", 0);. 
21c40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
21c50 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4d  ite3_snprintf(nM
21c60 61 78 2c 20 7a 42 75 66 2c 20 22 25 73 22 2c 20  ax, zBuf, "%s", 
21c70 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72  sqlite3_temp_dir
21c80 65 63 74 6f 72 79 29 3b 0a 20 20 20 20 7d 0a 20  ectory);.    }. 
21c90 20 7d 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f   }.#if defined(_
21ca0 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20 65 6c 73  _CYGWIN__).  els
21cb0 65 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  e{.    static co
21cc0 6e 73 74 20 63 68 61 72 20 2a 61 7a 44 69 72 73  nst char *azDirs
21cd0 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 30 2c  [] = {.       0,
21ce0 20 2f 2a 20 67 65 74 65 6e 76 28 22 53 51 4c 49   /* getenv("SQLI
21cf0 54 45 5f 54 4d 50 44 49 52 22 29 20 2a 2f 0a 20  TE_TMPDIR") */. 
21d00 20 20 20 20 20 20 30 2c 20 2f 2a 20 67 65 74 65        0, /* gete
21d10 6e 76 28 22 54 4d 50 44 49 52 22 29 20 2a 2f 0a  nv("TMPDIR") */.
21d20 20 20 20 20 20 20 20 30 2c 20 2f 2a 20 67 65 74         0, /* get
21d30 65 6e 76 28 22 54 4d 50 22 29 20 2a 2f 0a 20 20  env("TMP") */.  
21d40 20 20 20 20 20 30 2c 20 2f 2a 20 67 65 74 65 6e       0, /* geten
21d50 76 28 22 54 45 4d 50 22 29 20 2a 2f 0a 20 20 20  v("TEMP") */.   
21d60 20 20 20 20 30 2c 20 2f 2a 20 67 65 74 65 6e 76      0, /* getenv
21d70 28 22 55 53 45 52 50 52 4f 46 49 4c 45 22 29 20  ("USERPROFILE") 
21d80 2a 2f 0a 20 20 20 20 20 20 20 22 2f 76 61 72 2f  */.       "/var/
21d90 74 6d 70 22 2c 0a 20 20 20 20 20 20 20 22 2f 75  tmp",.       "/u
21da0 73 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20 20 20  sr/tmp",.       
21db0 22 2f 74 6d 70 22 2c 0a 20 20 20 20 20 20 20 22  "/tmp",.       "
21dc0 2e 22 2c 0a 20 20 20 20 20 20 20 30 20 20 20 20  .",.       0    
21dd0 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 65 72 6d      /* List term
21de0 69 6e 61 74 6f 72 20 2a 2f 0a 20 20 20 20 7d 3b  inator */.    };
21df0 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e  .    unsigned in
21e00 74 20 69 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  t i;.    const c
21e10 68 61 72 20 2a 7a 44 69 72 20 3d 20 30 3b 0a 0a  har *zDir = 0;..
21e20 20 20 20 20 69 66 28 20 21 61 7a 44 69 72 73 5b      if( !azDirs[
21e30 30 5d 20 29 20 61 7a 44 69 72 73 5b 30 5d 20 3d  0] ) azDirs[0] =
21e40 20 67 65 74 65 6e 76 28 22 53 51 4c 49 54 45 5f   getenv("SQLITE_
21e50 54 4d 50 44 49 52 22 29 3b 0a 20 20 20 20 69 66  TMPDIR");.    if
21e60 28 20 21 61 7a 44 69 72 73 5b 31 5d 20 29 20 61  ( !azDirs[1] ) a
21e70 7a 44 69 72 73 5b 31 5d 20 3d 20 67 65 74 65 6e  zDirs[1] = geten
21e80 76 28 22 54 4d 50 44 49 52 22 29 3b 0a 20 20 20  v("TMPDIR");.   
21e90 20 69 66 28 20 21 61 7a 44 69 72 73 5b 32 5d 20   if( !azDirs[2] 
21ea0 29 20 61 7a 44 69 72 73 5b 32 5d 20 3d 20 67 65  ) azDirs[2] = ge
21eb0 74 65 6e 76 28 22 54 4d 50 22 29 3b 0a 20 20 20  tenv("TMP");.   
21ec0 20 69 66 28 20 21 61 7a 44 69 72 73 5b 33 5d 20   if( !azDirs[3] 
21ed0 29 20 61 7a 44 69 72 73 5b 33 5d 20 3d 20 67 65  ) azDirs[3] = ge
21ee0 74 65 6e 76 28 22 54 45 4d 50 22 29 3b 0a 20 20  tenv("TEMP");.  
21ef0 20 20 69 66 28 20 21 61 7a 44 69 72 73 5b 34 5d    if( !azDirs[4]
21f00 20 29 20 61 7a 44 69 72 73 5b 34 5d 20 3d 20 67   ) azDirs[4] = g
21f10 65 74 65 6e 76 28 22 55 53 45 52 50 52 4f 46 49  etenv("USERPROFI
21f20 4c 45 22 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  LE");.    for(i=
21f30 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 7a 44 69  0; i<sizeof(azDi
21f40 72 73 29 2f 73 69 7a 65 6f 66 28 61 7a 44 69 72  rs)/sizeof(azDir
21f50 73 5b 30 5d 29 3b 20 7a 44 69 72 3d 61 7a 44 69  s[0]); zDir=azDi
21f60 72 73 5b 69 2b 2b 5d 29 7b 0a 20 20 20 20 20 20  rs[i++]){.      
21f70 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64  void *zConverted
21f80 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 44 69 72  ;.      if( zDir
21f90 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
21fa0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
21fb0 70 61 74 68 20 73 74 61 72 74 73 20 77 69 74 68  path starts with
21fc0 20 61 20 64 72 69 76 65 20 6c 65 74 74 65 72 20   a drive letter 
21fd0 66 6f 6c 6c 6f 77 65 64 20 62 79 20 74 68 65 20  followed by the 
21fe0 63 6f 6c 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 63  colon.      ** c
21ff0 68 61 72 61 63 74 65 72 2c 20 61 73 73 75 6d 65  haracter, assume
22000 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 61   it is already a
22010 20 6e 61 74 69 76 65 20 57 69 6e 33 32 20 70 61   native Win32 pa
22020 74 68 3b 20 6f 74 68 65 72 77 69 73 65 2c 0a 20  th; otherwise,. 
22030 20 20 20 20 20 2a 2a 20 69 74 20 6d 75 73 74 20       ** it must 
22040 62 65 20 63 6f 6e 76 65 72 74 65 64 20 74 6f 20  be converted to 
22050 61 20 6e 61 74 69 76 65 20 57 69 6e 33 32 20 70  a native Win32 p
22060 61 74 68 20 76 69 61 20 74 68 65 20 43 79 67 77  ath via the Cygw
22070 69 6e 20 41 50 49 0a 20 20 20 20 20 20 2a 2a 20  in API.      ** 
22080 70 72 69 6f 72 20 74 6f 20 75 73 69 6e 67 20 69  prior to using i
22090 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
220a0 20 20 69 66 28 20 77 69 6e 49 73 44 72 69 76 65    if( winIsDrive
220b0 4c 65 74 74 65 72 41 6e 64 43 6f 6c 6f 6e 28 7a  LetterAndColon(z
220c0 44 69 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Dir) ){.        
220d0 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77 69 6e  zConverted = win
220e0 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66 38 46  ConvertFromUtf8F
220f0 69 6c 65 6e 61 6d 65 28 7a 44 69 72 29 3b 0a 20  ilename(zDir);. 
22100 20 20 20 20 20 20 20 69 66 28 20 21 7a 43 6f 6e         if( !zCon
22110 76 65 72 74 65 64 20 29 7b 0a 20 20 20 20 20 20  verted ){.      
22120 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
22130 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 20 20  (zBuf);.        
22140 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50    OSTRACE(("TEMP
22150 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c  -FILENAME rc=SQL
22160 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c  ITE_IOERR_NOMEM\
22170 6e 22 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  n"));.          
22180 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
22190 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ERR_NOMEM;.     
221a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
221b0 20 77 69 6e 49 73 44 69 72 28 7a 43 6f 6e 76 65   winIsDir(zConve
221c0 72 74 65 64 29 20 29 7b 0a 20 20 20 20 20 20 20  rted) ){.       
221d0 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
221e0 6e 74 66 28 6e 4d 61 78 2c 20 7a 42 75 66 2c 20  ntf(nMax, zBuf, 
221f0 22 25 73 22 2c 20 7a 44 69 72 29 3b 0a 20 20 20  "%s", zDir);.   
22200 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
22210 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
22220 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
22230 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
22240 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
22250 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
22260 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
22270 20 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20     zConverted = 
22280 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
22290 6f 28 20 6e 4d 61 78 2b 31 20 29 3b 0a 20 20 20  o( nMax+1 );.   
222a0 20 20 20 20 20 69 66 28 20 21 7a 43 6f 6e 76 65       if( !zConve
222b0 72 74 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20  rted ){.        
222c0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
222d0 42 75 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Buf);.          
222e0 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46  OSTRACE(("TEMP-F
222f0 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54  ILENAME rc=SQLIT
22300 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22  E_IOERR_NOMEM\n"
22310 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  ));.          re
22320 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
22330 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  R_NOMEM;.       
22340 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 63   }.        if( c
22350 79 67 77 69 6e 5f 63 6f 6e 76 5f 70 61 74 68 28  ygwin_conv_path(
22360 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22370 20 6f 73 49 73 4e 54 28 29 20 3f 20 43 43 50 5f   osIsNT() ? CCP_
22380 50 4f 53 49 58 5f 54 4f 5f 57 49 4e 5f 57 20 3a  POSIX_TO_WIN_W :
22390 20 43 43 50 5f 50 4f 53 49 58 5f 54 4f 5f 57 49   CCP_POSIX_TO_WI
223a0 4e 5f 41 2c 20 7a 44 69 72 2c 0a 20 20 20 20 20  N_A, zDir,.     
223b0 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6e 76             zConv
223c0 65 72 74 65 64 2c 20 6e 4d 61 78 2b 31 29 3c 30  erted, nMax+1)<0
223d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
223e0 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76  lite3_free(zConv
223f0 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 20 20  erted);.        
22400 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
22410 42 75 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Buf);.          
22420 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46  OSTRACE(("TEMP-F
22430 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54  ILENAME rc=SQLIT
22440 45 5f 49 4f 45 52 52 5f 43 4f 4e 56 50 41 54 48  E_IOERR_CONVPATH
22450 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 20 20 20  \n"));.         
22460 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72   return winLogEr
22470 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
22480 5f 43 4f 4e 56 50 41 54 48 2c 20 28 44 57 4f 52  _CONVPATH, (DWOR
22490 44 29 65 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  D)errno,.       
224a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
224b0 20 20 20 20 20 20 22 77 69 6e 47 65 74 54 65 6d        "winGetTem
224c0 70 6e 61 6d 65 32 22 2c 20 7a 44 69 72 29 3b 0a  pname2", zDir);.
224d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
224e0 20 20 69 66 28 20 77 69 6e 49 73 44 69 72 28 7a    if( winIsDir(z
224f0 43 6f 6e 76 65 72 74 65 64 29 20 29 7b 0a 20 20  Converted) ){.  
22500 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20 74 68          /* At th
22510 69 73 20 70 6f 69 6e 74 2c 20 77 65 20 6b 6e 6f  is point, we kno
22520 77 20 74 68 65 20 63 61 6e 64 69 64 61 74 65 20  w the candidate 
22530 64 69 72 65 63 74 6f 72 79 20 65 78 69 73 74 73  directory exists
22540 20 61 6e 64 20 73 68 6f 75 6c 64 0a 20 20 20 20   and should.    
22550 20 20 20 20 20 20 2a 2a 20 62 65 20 75 73 65 64        ** be used
22560 2e 20 20 48 6f 77 65 76 65 72 2c 20 77 65 20 6d  .  However, we m
22570 61 79 20 6e 65 65 64 20 74 6f 20 63 6f 6e 76 65  ay need to conve
22580 72 74 20 74 68 65 20 73 74 72 69 6e 67 20 63 6f  rt the string co
22590 6e 74 61 69 6e 69 6e 67 0a 20 20 20 20 20 20 20  ntaining.       
225a0 20 20 20 2a 2a 20 69 74 73 20 6e 61 6d 65 20 69     ** its name i
225b0 6e 74 6f 20 55 54 46 2d 38 20 28 69 2e 65 2e 20  nto UTF-8 (i.e. 
225c0 69 66 20 69 74 20 69 73 20 55 54 46 2d 31 36 20  if it is UTF-16 
225d0 72 69 67 68 74 20 6e 6f 77 29 2e 0a 20 20 20 20  right now)..    
225e0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
225f0 20 20 20 63 68 61 72 20 2a 7a 55 74 66 38 20 3d     char *zUtf8 =
22600 20 77 69 6e 43 6f 6e 76 65 72 74 54 6f 55 74 66   winConvertToUtf
22610 38 46 69 6c 65 6e 61 6d 65 28 7a 43 6f 6e 76 65  8Filename(zConve
22620 72 74 65 64 29 3b 0a 20 20 20 20 20 20 20 20 20  rted);.         
22630 20 69 66 28 20 21 7a 55 74 66 38 20 29 7b 0a 20   if( !zUtf8 ){. 
22640 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
22650 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74  e3_free(zConvert
22660 65 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ed);.           
22670 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42   sqlite3_free(zB
22680 75 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  uf);.           
22690 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d   OSTRACE(("TEMP-
226a0 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49  FILENAME rc=SQLI
226b0 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e  TE_IOERR_NOMEM\n
226c0 22 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  "));.           
226d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
226e0 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  OERR_NOMEM;.    
226f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
22700 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
22710 74 66 28 6e 4d 61 78 2c 20 7a 42 75 66 2c 20 22  tf(nMax, zBuf, "
22720 25 73 22 2c 20 7a 55 74 66 38 29 3b 0a 20 20 20  %s", zUtf8);.   
22730 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
22740 72 65 65 28 7a 55 74 66 38 29 3b 0a 20 20 20 20  ree(zUtf8);.    
22750 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
22760 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
22770 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
22780 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
22790 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
227a0 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20  zConverted);.   
227b0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23     }.    }.  }.#
227c0 65 6c 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  elif !SQLITE_OS_
227d0 57 49 4e 52 54 20 26 26 20 21 64 65 66 69 6e 65  WINRT && !define
227e0 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20  d(__CYGWIN__).  
227f0 65 6c 73 65 20 69 66 28 20 6f 73 49 73 4e 54 28  else if( osIsNT(
22800 29 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  ) ){.    char *z
22810 4d 75 6c 74 69 3b 0a 20 20 20 20 4c 50 57 53 54  Multi;.    LPWST
22820 52 20 7a 57 69 64 65 50 61 74 68 20 3d 20 73 71  R zWidePath = sq
22830 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
22840 20 6e 4d 61 78 2a 73 69 7a 65 6f 66 28 57 43 48   nMax*sizeof(WCH
22850 41 52 29 20 29 3b 0a 20 20 20 20 69 66 28 20 21  AR) );.    if( !
22860 7a 57 69 64 65 50 61 74 68 20 29 7b 0a 20 20 20  zWidePath ){.   
22870 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
22880 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 4f 53 54  zBuf);.      OST
22890 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45  RACE(("TEMP-FILE
228a0 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 49  NAME rc=SQLITE_I
228b0 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b  OERR_NOMEM\n"));
228c0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
228d0 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
228e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
228f0 6f 73 47 65 74 54 65 6d 70 50 61 74 68 57 28 6e  osGetTempPathW(n
22900 4d 61 78 2c 20 7a 57 69 64 65 50 61 74 68 29 3d  Max, zWidePath)=
22910 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
22920 74 65 33 5f 66 72 65 65 28 7a 57 69 64 65 50 61  te3_free(zWidePa
22930 74 68 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  th);.      sqlit
22940 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20  e3_free(zBuf);. 
22950 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54       OSTRACE(("T
22960 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d  EMP-FILENAME rc=
22970 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 47 45 54  SQLITE_IOERR_GET
22980 54 45 4d 50 50 41 54 48 5c 6e 22 29 29 3b 0a 20  TEMPPATH\n"));. 
22990 20 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c       return winL
229a0 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
229b0 4f 45 52 52 5f 47 45 54 54 45 4d 50 50 41 54 48  OERR_GETTEMPPATH
229c0 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  , osGetLastError
229d0 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  (),.            
229e0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
229f0 6e 47 65 74 54 65 6d 70 6e 61 6d 65 32 22 2c 20  nGetTempname2", 
22a00 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4d  0);.    }.    zM
22a10 75 6c 74 69 20 3d 20 77 69 6e 55 6e 69 63 6f 64  ulti = winUnicod
22a20 65 54 6f 55 74 66 38 28 7a 57 69 64 65 50 61 74  eToUtf8(zWidePat
22a30 68 29 3b 0a 20 20 20 20 69 66 28 20 7a 4d 75 6c  h);.    if( zMul
22a40 74 69 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ti ){.      sqli
22a50 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4d 61  te3_snprintf(nMa
22a60 78 2c 20 7a 42 75 66 2c 20 22 25 73 22 2c 20 7a  x, zBuf, "%s", z
22a70 4d 75 6c 74 69 29 3b 0a 20 20 20 20 20 20 73 71  Multi);.      sq
22a80 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 75 6c 74  lite3_free(zMult
22a90 69 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  i);.      sqlite
22aa0 33 5f 66 72 65 65 28 7a 57 69 64 65 50 61 74 68  3_free(zWidePath
22ab0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
22ac0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
22ad0 28 7a 57 69 64 65 50 61 74 68 29 3b 0a 20 20 20  (zWidePath);.   
22ae0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
22af0 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 4f 53 54  zBuf);.      OST
22b00 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45  RACE(("TEMP-FILE
22b10 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 49  NAME rc=SQLITE_I
22b20 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b  OERR_NOMEM\n"));
22b30 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
22b40 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
22b50 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66 64  ;.    }.  }.#ifd
22b60 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ef SQLITE_WIN32_
22b70 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b  HAS_ANSI.  else{
22b80 0a 20 20 20 20 63 68 61 72 20 2a 7a 55 74 66 38  .    char *zUtf8
22b90 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 62 63  ;.    char *zMbc
22ba0 73 50 61 74 68 20 3d 20 73 71 6c 69 74 65 33 4d  sPath = sqlite3M
22bb0 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 4d 61 78 20  allocZero( nMax 
22bc0 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 4d 62 63  );.    if( !zMbc
22bd0 73 50 61 74 68 20 29 7b 0a 20 20 20 20 20 20 73  sPath ){.      s
22be0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66  qlite3_free(zBuf
22bf0 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  );.      OSTRACE
22c00 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45  (("TEMP-FILENAME
22c10 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52   rc=SQLITE_IOERR
22c20 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20 20  _NOMEM\n"));.   
22c30 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
22c40 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20  _IOERR_NOMEM;.  
22c50 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 73 47 65    }.    if( osGe
22c60 74 54 65 6d 70 50 61 74 68 41 28 6e 4d 61 78 2c  tTempPathA(nMax,
22c70 20 7a 4d 62 63 73 50 61 74 68 29 3d 3d 30 20 29   zMbcsPath)==0 )
22c80 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
22c90 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20  free(zBuf);.    
22ca0 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50    OSTRACE(("TEMP
22cb0 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c  -FILENAME rc=SQL
22cc0 49 54 45 5f 49 4f 45 52 52 5f 47 45 54 54 45 4d  ITE_IOERR_GETTEM
22cd0 50 50 41 54 48 5c 6e 22 29 29 3b 0a 20 20 20 20  PPATH\n"));.    
22ce0 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45    return winLogE
22cf0 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
22d00 52 5f 47 45 54 54 45 4d 50 50 41 54 48 2c 20 6f  R_GETTEMPPATH, o
22d10 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c  sGetLastError(),
22d20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22d30 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 47 65            "winGe
22d40 74 54 65 6d 70 6e 61 6d 65 33 22 2c 20 30 29 3b  tTempname3", 0);
22d50 0a 20 20 20 20 7d 0a 20 20 20 20 7a 55 74 66 38  .    }.    zUtf8
22d60 20 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32   = sqlite3_win32
22d70 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28 7a 4d  _mbcs_to_utf8(zM
22d80 62 63 73 50 61 74 68 29 3b 0a 20 20 20 20 69 66  bcsPath);.    if
22d90 28 20 7a 55 74 66 38 20 29 7b 0a 20 20 20 20 20  ( zUtf8 ){.     
22da0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
22db0 66 28 6e 4d 61 78 2c 20 7a 42 75 66 2c 20 22 25  f(nMax, zBuf, "%
22dc0 73 22 2c 20 7a 55 74 66 38 29 3b 0a 20 20 20 20  s", zUtf8);.    
22dd0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
22de0 55 74 66 38 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Utf8);.    }else
22df0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
22e00 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20  free(zBuf);.    
22e10 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50    OSTRACE(("TEMP
22e20 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c  -FILENAME rc=SQL
22e30 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c  ITE_IOERR_NOMEM\
22e40 6e 22 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75  n"));.      retu
22e50 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
22e60 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d  NOMEM;.    }.  }
22e70 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
22e80 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
22e90 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53   */.#endif /* !S
22ea0 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 2a  QLITE_OS_WINRT *
22eb0 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43 68 65  /..  /*.  ** Che
22ec0 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ck to make sure 
22ed0 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 64 69  the temporary di
22ee0 72 65 63 74 6f 72 79 20 65 6e 64 73 20 77 69 74  rectory ends wit
22ef0 68 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  h an appropriate
22f00 0a 20 20 2a 2a 20 73 65 70 61 72 61 74 6f 72 2e  .  ** separator.
22f10 20 20 49 66 20 69 74 20 64 6f 65 73 20 6e 6f 74    If it does not
22f20 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f   and there is no
22f30 74 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20 6c  t enough space l
22f40 65 66 74 20 74 6f 20 61 64 64 0a 20 20 2a 2a 20  eft to add.  ** 
22f50 6f 6e 65 2c 20 66 61 69 6c 2e 0a 20 20 2a 2f 0a  one, fail..  */.
22f60 20 20 69 66 28 20 21 77 69 6e 4d 61 6b 65 45 6e    if( !winMakeEn
22f70 64 49 6e 44 69 72 53 65 70 28 6e 44 69 72 2b 31  dInDirSep(nDir+1
22f80 2c 20 7a 42 75 66 29 20 29 7b 0a 20 20 20 20 73  , zBuf) ){.    s
22f90 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66  qlite3_free(zBuf
22fa0 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  );.    OSTRACE((
22fb0 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72  "TEMP-FILENAME r
22fc0 63 3d 53 51 4c 49 54 45 5f 45 52 52 4f 52 5c 6e  c=SQLITE_ERROR\n
22fd0 22 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  "));.    return 
22fe0 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
22ff0 54 45 5f 45 52 52 4f 52 2c 20 30 2c 20 22 77 69  TE_ERROR, 0, "wi
23000 6e 47 65 74 54 65 6d 70 6e 61 6d 65 34 22 2c 20  nGetTempname4", 
23010 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  0);.  }..  /*.  
23020 2a 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  ** Check that th
23030 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20  e output buffer 
23040 69 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20  is large enough 
23050 66 6f 72 20 74 68 65 20 74 65 6d 70 6f 72 61 72  for the temporar
23060 79 20 66 69 6c 65 0a 20 20 2a 2a 20 6e 61 6d 65  y file.  ** name
23070 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   in the followin
23080 67 20 66 6f 72 6d 61 74 3a 0a 20 20 2a 2a 0a 20  g format:.  **. 
23090 20 2a 2a 20 20 20 22 3c 74 65 6d 70 6f 72 61 72   **   "<temporar
230a0 79 5f 64 69 72 65 63 74 6f 72 79 3e 2f 65 74 69  y_directory>/eti
230b0 6c 71 73 5f 58 58 58 58 58 58 58 58 58 58 58 58  lqs_XXXXXXXXXXXX
230c0 58 58 58 5c 30 5c 30 22 0a 20 20 2a 2a 0a 20 20  XXX\0\0".  **.  
230d0 2a 2a 20 49 66 20 6e 6f 74 2c 20 72 65 74 75 72  ** If not, retur
230e0 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 20  n SQLITE_ERROR. 
230f0 20 54 68 65 20 6e 75 6d 62 65 72 20 31 37 20 69   The number 17 i
23100 73 20 75 73 65 64 20 68 65 72 65 20 69 6e 20 6f  s used here in o
23110 72 64 65 72 20 74 6f 0a 20 20 2a 2a 20 61 63 63  rder to.  ** acc
23120 6f 75 6e 74 20 66 6f 72 20 74 68 65 20 73 70 61  ount for the spa
23130 63 65 20 75 73 65 64 20 62 79 20 74 68 65 20 31  ce used by the 1
23140 35 20 63 68 61 72 61 63 74 65 72 20 72 61 6e 64  5 character rand
23150 6f 6d 20 73 75 66 66 69 78 20 61 6e 64 20 74 68  om suffix and th
23160 65 0a 20 20 2a 2a 20 74 77 6f 20 74 72 61 69 6c  e.  ** two trail
23170 69 6e 67 20 4e 55 4c 20 63 68 61 72 61 63 74 65  ing NUL characte
23180 72 73 2e 20 20 54 68 65 20 66 69 6e 61 6c 20 64  rs.  The final d
23190 69 72 65 63 74 6f 72 79 20 73 65 70 61 72 61 74  irectory separat
231a0 6f 72 20 63 68 61 72 61 63 74 65 72 0a 20 20 2a  or character.  *
231b0 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20 61 64  * has already ad
231c0 64 65 64 20 69 66 20 69 74 20 77 61 73 20 6e 6f  ded if it was no
231d0 74 20 61 6c 72 65 61 64 79 20 70 72 65 73 65 6e  t already presen
231e0 74 2e 0a 20 20 2a 2f 0a 20 20 6e 4c 65 6e 20 3d  t..  */.  nLen =
231f0 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
23200 28 7a 42 75 66 29 3b 0a 20 20 69 66 28 20 28 6e  (zBuf);.  if( (n
23210 4c 65 6e 20 2b 20 6e 50 72 65 20 2b 20 31 37 29  Len + nPre + 17)
23220 20 3e 20 6e 42 75 66 20 29 7b 0a 20 20 20 20 73   > nBuf ){.    s
23230 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66  qlite3_free(zBuf
23240 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  );.    OSTRACE((
23250 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72  "TEMP-FILENAME r
23260 63 3d 53 51 4c 49 54 45 5f 45 52 52 4f 52 5c 6e  c=SQLITE_ERROR\n
23270 22 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  "));.    return 
23280 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
23290 54 45 5f 45 52 52 4f 52 2c 20 30 2c 20 22 77 69  TE_ERROR, 0, "wi
232a0 6e 47 65 74 54 65 6d 70 6e 61 6d 65 35 22 2c 20  nGetTempname5", 
232b0 30 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74  0);.  }..  sqlit
232c0 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66  e3_snprintf(nBuf
232d0 2d 31 36 2d 6e 4c 65 6e 2c 20 7a 42 75 66 2b 6e  -16-nLen, zBuf+n
232e0 4c 65 6e 2c 20 53 51 4c 49 54 45 5f 54 45 4d 50  Len, SQLITE_TEMP
232f0 5f 46 49 4c 45 5f 50 52 45 46 49 58 29 3b 0a 0a  _FILE_PREFIX);..
23300 20 20 6a 20 3d 20 73 71 6c 69 74 65 33 53 74 72    j = sqlite3Str
23310 6c 65 6e 33 30 28 7a 42 75 66 29 3b 0a 20 20 73  len30(zBuf);.  s
23320 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73  qlite3_randomnes
23330 73 28 31 35 2c 20 26 7a 42 75 66 5b 6a 5d 29 3b  s(15, &zBuf[j]);
23340 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31 35  .  for(i=0; i<15
23350 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20  ; i++, j++){.   
23360 20 7a 42 75 66 5b 6a 5d 20 3d 20 28 63 68 61 72   zBuf[j] = (char
23370 29 7a 43 68 61 72 73 5b 20 28 28 75 6e 73 69 67  )zChars[ ((unsig
23380 6e 65 64 20 63 68 61 72 29 7a 42 75 66 5b 6a 5d  ned char)zBuf[j]
23390 29 25 28 73 69 7a 65 6f 66 28 7a 43 68 61 72 73  )%(sizeof(zChars
233a0 29 2d 31 29 20 5d 3b 0a 20 20 7d 0a 20 20 7a 42  )-1) ];.  }.  zB
233b0 75 66 5b 6a 5d 20 3d 20 30 3b 0a 20 20 7a 42 75  uf[j] = 0;.  zBu
233c0 66 5b 6a 2b 31 5d 20 3d 20 30 3b 0a 20 20 2a 70  f[j+1] = 0;.  *p
233d0 7a 42 75 66 20 3d 20 7a 42 75 66 3b 0a 0a 20 20  zBuf = zBuf;..  
233e0 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46  OSTRACE(("TEMP-F
233f0 49 4c 45 4e 41 4d 45 20 6e 61 6d 65 3d 25 73 2c  ILENAME name=%s,
23400 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22   rc=SQLITE_OK\n"
23410 2c 20 7a 42 75 66 29 29 3b 0a 20 20 72 65 74 75  , zBuf));.  retu
23420 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
23430 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
23440 55 45 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20  UE if the named 
23450 66 69 6c 65 20 69 73 20 72 65 61 6c 6c 79 20 61  file is really a
23460 20 64 69 72 65 63 74 6f 72 79 2e 20 20 52 65 74   directory.  Ret
23470 75 72 6e 20 66 61 6c 73 65 20 69 66 0a 2a 2a 20  urn false if.** 
23480 69 74 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20  it is something 
23490 6f 74 68 65 72 20 74 68 61 6e 20 61 20 64 69 72  other than a dir
234a0 65 63 74 6f 72 79 2c 20 6f 72 20 69 66 20 74 68  ectory, or if th
234b0 65 72 65 20 69 73 20 61 6e 79 20 6b 69 6e 64 20  ere is any kind 
234c0 6f 66 20 6d 65 6d 6f 72 79 0a 2a 2a 20 61 6c 6c  of memory.** all
234d0 6f 63 61 74 69 6f 6e 20 66 61 69 6c 75 72 65 2e  ocation failure.
234e0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
234f0 69 6e 49 73 44 69 72 28 63 6f 6e 73 74 20 76 6f  inIsDir(const vo
23500 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 29 7b  id *zConverted){
23510 0a 20 20 44 57 4f 52 44 20 61 74 74 72 3b 0a 20  .  DWORD attr;. 
23520 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 44   int rc = 0;.  D
23530 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a  WORD lastErrno;.
23540 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20  .  if( osIsNT() 
23550 29 7b 0a 20 20 20 20 69 6e 74 20 63 6e 74 20 3d  ){.    int cnt =
23560 20 30 3b 0a 20 20 20 20 57 49 4e 33 32 5f 46 49   0;.    WIN32_FI
23570 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 44 41 54  LE_ATTRIBUTE_DAT
23580 41 20 73 41 74 74 72 44 61 74 61 3b 0a 20 20 20  A sAttrData;.   
23590 20 6d 65 6d 73 65 74 28 26 73 41 74 74 72 44 61   memset(&sAttrDa
235a0 74 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 41  ta, 0, sizeof(sA
235b0 74 74 72 44 61 74 61 29 29 3b 0a 20 20 20 20 77  ttrData));.    w
235c0 68 69 6c 65 28 20 21 28 72 63 20 3d 20 6f 73 47  hile( !(rc = osG
235d0 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
235e0 45 78 57 28 28 4c 50 43 57 53 54 52 29 7a 43 6f  ExW((LPCWSTR)zCo
235f0 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20  nverted,.       
23600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23610 20 20 20 20 20 20 47 65 74 46 69 6c 65 45 78 49        GetFileExI
23620 6e 66 6f 53 74 61 6e 64 61 72 64 2c 0a 20 20 20  nfoStandard,.   
23630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23640 20 20 20 20 20 20 20 20 20 20 26 73 41 74 74 72            &sAttr
23650 44 61 74 61 29 29 20 26 26 20 77 69 6e 52 65 74  Data)) && winRet
23660 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c  ryIoerr(&cnt, &l
23670 61 73 74 45 72 72 6e 6f 29 20 29 7b 7d 0a 20 20  astErrno) ){}.  
23680 20 20 69 66 28 20 21 72 63 20 29 7b 0a 20 20 20    if( !rc ){.   
23690 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20     return 0; /* 
236a0 49 6e 76 61 6c 69 64 20 6e 61 6d 65 3f 20 2a 2f  Invalid name? */
236b0 0a 20 20 20 20 7d 0a 20 20 20 20 61 74 74 72 20  .    }.    attr 
236c0 3d 20 73 41 74 74 72 44 61 74 61 2e 64 77 46 69  = sAttrData.dwFi
236d0 6c 65 41 74 74 72 69 62 75 74 65 73 3b 0a 23 69  leAttributes;.#i
236e0 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
236f0 45 3d 3d 30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  E==0.  }else{.  
23700 20 20 61 74 74 72 20 3d 20 6f 73 47 65 74 46 69    attr = osGetFi
23710 6c 65 41 74 74 72 69 62 75 74 65 73 41 28 28 63  leAttributesA((c
23720 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 29  har*)zConverted)
23730 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 72  ;.#endif.  }.  r
23740 65 74 75 72 6e 20 28 61 74 74 72 21 3d 49 4e 56  eturn (attr!=INV
23750 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42  ALID_FILE_ATTRIB
23760 55 54 45 53 29 20 26 26 20 28 61 74 74 72 26 46  UTES) && (attr&F
23770 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 44 49  ILE_ATTRIBUTE_DI
23780 52 45 43 54 4f 52 59 29 3b 0a 7d 0a 0a 2f 2a 0a  RECTORY);.}../*.
23790 2a 2a 20 4f 70 65 6e 20 61 20 66 69 6c 65 2e 0a  ** Open a file..
237a0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
237b0 6e 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33  nOpen(.  sqlite3
237c0 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20  _vfs *pVfs,     
237d0 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 67 65     /* Used to ge
237e0 74 20 6d 61 78 69 6d 75 6d 20 70 61 74 68 20 6e  t maximum path n
237f0 61 6d 65 20 6c 65 6e 67 74 68 20 2a 2f 0a 20 20  ame length */.  
23800 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
23810 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  e,        /* Nam
23820 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 28 55  e of the file (U
23830 54 46 2d 38 29 20 2a 2f 0a 20 20 73 71 6c 69 74  TF-8) */.  sqlit
23840 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 20 20 20  e3_file *id,    
23850 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
23860 65 20 53 51 4c 69 74 65 20 66 69 6c 65 20 68 61  e SQLite file ha
23870 6e 64 6c 65 20 68 65 72 65 20 2a 2f 0a 20 20 69  ndle here */.  i
23880 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20  nt flags,       
23890 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e           /* Open
238a0 20 6d 6f 64 65 20 66 6c 61 67 73 20 2a 2f 0a 20   mode flags */. 
238b0 20 69 6e 74 20 2a 70 4f 75 74 46 6c 61 67 73 20   int *pOutFlags 
238c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
238d0 61 74 75 73 20 72 65 74 75 72 6e 20 66 6c 61 67  atus return flag
238e0 73 20 2a 2f 0a 29 7b 0a 20 20 48 41 4e 44 4c 45  s */.){.  HANDLE
238f0 20 68 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74   h;.  DWORD last
23900 45 72 72 6e 6f 20 3d 20 30 3b 0a 20 20 44 57 4f  Errno = 0;.  DWO
23910 52 44 20 64 77 44 65 73 69 72 65 64 41 63 63 65  RD dwDesiredAcce
23920 73 73 3b 0a 20 20 44 57 4f 52 44 20 64 77 53 68  ss;.  DWORD dwSh
23930 61 72 65 4d 6f 64 65 3b 0a 20 20 44 57 4f 52 44  areMode;.  DWORD
23940 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f   dwCreationDispo
23950 73 69 74 69 6f 6e 3b 0a 20 20 44 57 4f 52 44 20  sition;.  DWORD 
23960 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62  dwFlagsAndAttrib
23970 75 74 65 73 20 3d 20 30 3b 0a 23 69 66 20 53 51  utes = 0;.#if SQ
23980 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
23990 69 6e 74 20 69 73 54 65 6d 70 20 3d 20 30 3b 0a  int isTemp = 0;.
239a0 23 65 6e 64 69 66 0a 20 20 77 69 6e 46 69 6c 65  #endif.  winFile
239b0 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69   *pFile = (winFi
239c0 6c 65 2a 29 69 64 3b 0a 20 20 76 6f 69 64 20 2a  le*)id;.  void *
239d0 7a 43 6f 6e 76 65 72 74 65 64 3b 20 20 20 20 20  zConverted;     
239e0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
239f0 6e 61 6d 65 20 69 6e 20 4f 53 20 65 6e 63 6f 64  name in OS encod
23a00 69 6e 67 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ing */.  const c
23a10 68 61 72 20 2a 7a 55 74 66 38 4e 61 6d 65 20 3d  har *zUtf8Name =
23a20 20 7a 4e 61 6d 65 3b 20 2f 2a 20 46 69 6c 65 6e   zName; /* Filen
23a30 61 6d 65 20 69 6e 20 55 54 46 2d 38 20 65 6e 63  ame in UTF-8 enc
23a40 6f 64 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 63  oding */.  int c
23a50 6e 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 66  nt = 0;..  /* If
23a60 20 61 72 67 75 6d 65 6e 74 20 7a 50 61 74 68 20   argument zPath 
23a70 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65  is a NULL pointe
23a80 72 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  r, this function
23a90 20 69 73 20 72 65 71 75 69 72 65 64 20 74 6f 20   is required to 
23aa0 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 74 65 6d 70  open.  ** a temp
23ab0 6f 72 61 72 79 20 66 69 6c 65 2e 20 55 73 65 20  orary file. Use 
23ac0 74 68 69 73 20 62 75 66 66 65 72 20 74 6f 20 73  this buffer to s
23ad0 74 6f 72 65 20 74 68 65 20 66 69 6c 65 20 6e 61  tore the file na
23ae0 6d 65 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 63 68  me in..  */.  ch
23af0 61 72 20 2a 7a 54 6d 70 6e 61 6d 65 20 3d 20 30  ar *zTmpname = 0
23b00 3b 20 2f 2a 20 46 6f 72 20 74 65 6d 70 6f 72 61  ; /* For tempora
23b10 72 79 20 66 69 6c 65 6e 61 6d 65 2c 20 69 66 20  ry filename, if 
23b20 6e 65 63 65 73 73 61 72 79 2e 20 2a 2f 0a 0a 20  necessary. */.. 
23b30 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
23b40 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
23b50 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 52 65 74 75  /* Function Retu
23b60 72 6e 20 43 6f 64 65 20 2a 2f 0a 23 69 66 20 21  rn Code */.#if !
23b70 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20  defined(NDEBUG) 
23b80 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  || SQLITE_OS_WIN
23b90 43 45 0a 20 20 69 6e 74 20 65 54 79 70 65 20 3d  CE.  int eType =
23ba0 20 66 6c 61 67 73 26 30 78 46 46 46 46 46 46 30   flags&0xFFFFFF0
23bb0 30 3b 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 66  0;  /* Type of f
23bc0 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 23  ile to open */.#
23bd0 65 6e 64 69 66 0a 0a 20 20 69 6e 74 20 69 73 45  endif..  int isE
23be0 78 63 6c 75 73 69 76 65 20 20 3d 20 28 66 6c 61  xclusive  = (fla
23bf0 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
23c00 5f 45 58 43 4c 55 53 49 56 45 29 3b 0a 20 20 69  _EXCLUSIVE);.  i
23c10 6e 74 20 69 73 44 65 6c 65 74 65 20 20 20 20 20  nt isDelete     
23c20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
23c30 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43  E_OPEN_DELETEONC
23c40 4c 4f 53 45 29 3b 0a 20 20 69 6e 74 20 69 73 43  LOSE);.  int isC
23c50 72 65 61 74 65 20 20 20 20 20 3d 20 28 66 6c 61  reate     = (fla
23c60 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
23c70 5f 43 52 45 41 54 45 29 3b 0a 20 20 69 6e 74 20  _CREATE);.  int 
23c80 69 73 52 65 61 64 6f 6e 6c 79 20 20 20 3d 20 28  isReadonly   = (
23c90 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
23ca0 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20  PEN_READONLY);. 
23cb0 20 69 6e 74 20 69 73 52 65 61 64 57 72 69 74 65   int isReadWrite
23cc0 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c    = (flags & SQL
23cd0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
23ce0 54 45 29 3b 0a 0a 23 69 66 6e 64 65 66 20 4e 44  TE);..#ifndef ND
23cf0 45 42 55 47 0a 20 20 69 6e 74 20 69 73 4f 70 65  EBUG.  int isOpe
23d00 6e 4a 6f 75 72 6e 61 6c 20 3d 20 28 69 73 43 72  nJournal = (isCr
23d10 65 61 74 65 20 26 26 20 28 0a 20 20 20 20 20 20  eate && (.      
23d20 20 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f    eType==SQLITE_
23d30 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52  OPEN_MASTER_JOUR
23d40 4e 41 4c 0a 20 20 20 20 20 7c 7c 20 65 54 79 70  NAL.     || eTyp
23d50 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e==SQLITE_OPEN_M
23d60 41 49 4e 5f 4a 4f 55 52 4e 41 4c 0a 20 20 20 20  AIN_JOURNAL.    
23d70 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
23d80 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 29 3b  E_OPEN_WAL.  ));
23d90 0a 23 65 6e 64 69 66 0a 0a 20 20 4f 53 54 52 41  .#endif..  OSTRA
23da0 43 45 28 28 22 4f 50 45 4e 20 6e 61 6d 65 3d 25  CE(("OPEN name=%
23db0 73 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66 6c 61  s, pFile=%p, fla
23dc0 67 73 3d 25 78 2c 20 70 4f 75 74 46 6c 61 67 73  gs=%x, pOutFlags
23dd0 3d 25 70 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%p\n",.        
23de0 20 20 20 7a 55 74 66 38 4e 61 6d 65 2c 20 69 64     zUtf8Name, id
23df0 2c 20 66 6c 61 67 73 2c 20 70 4f 75 74 46 6c 61  , flags, pOutFla
23e00 67 73 29 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  gs));..  /* Chec
23e10 6b 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  k the following 
23e20 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20 74  statements are t
23e30 72 75 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  rue:.  **.  **  
23e40 20 28 61 29 20 45 78 61 63 74 6c 79 20 6f 6e 65   (a) Exactly one
23e50 20 6f 66 20 74 68 65 20 52 45 41 44 57 52 49 54   of the READWRIT
23e60 45 20 61 6e 64 20 52 45 41 44 4f 4e 4c 59 20 66  E and READONLY f
23e70 6c 61 67 73 20 6d 75 73 74 20 62 65 20 73 65 74  lags must be set
23e80 2c 20 61 6e 64 0a 20 20 2a 2a 20 20 20 28 62 29  , and.  **   (b)
23e90 20 69 66 20 43 52 45 41 54 45 20 69 73 20 73 65   if CREATE is se
23ea0 74 2c 20 74 68 65 6e 20 52 45 41 44 57 52 49 54  t, then READWRIT
23eb0 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73  E must also be s
23ec0 65 74 2c 20 61 6e 64 0a 20 20 2a 2a 20 20 20 28  et, and.  **   (
23ed0 63 29 20 69 66 20 45 58 43 4c 55 53 49 56 45 20  c) if EXCLUSIVE 
23ee0 69 73 20 73 65 74 2c 20 74 68 65 6e 20 43 52 45  is set, then CRE
23ef0 41 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65  ATE must also be
23f00 20 73 65 74 2e 0a 20 20 2a 2a 20 20 20 28 64 29   set..  **   (d)
23f10 20 69 66 20 44 45 4c 45 54 45 4f 4e 43 4c 4f 53   if DELETEONCLOS
23f20 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 43  E is set, then C
23f30 52 45 41 54 45 20 6d 75 73 74 20 61 6c 73 6f 20  REATE must also 
23f40 62 65 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 61  be set..  */.  a
23f50 73 73 65 72 74 28 28 69 73 52 65 61 64 6f 6e 6c  ssert((isReadonl
23f60 79 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57 72  y==0 || isReadWr
23f70 69 74 65 3d 3d 30 29 20 26 26 20 28 69 73 52 65  ite==0) && (isRe
23f80 61 64 57 72 69 74 65 20 7c 7c 20 69 73 52 65 61  adWrite || isRea
23f90 64 6f 6e 6c 79 29 29 3b 0a 20 20 61 73 73 65 72  donly));.  asser
23fa0 74 28 69 73 43 72 65 61 74 65 3d 3d 30 20 7c 7c  t(isCreate==0 ||
23fb0 20 69 73 52 65 61 64 57 72 69 74 65 29 3b 0a 20   isReadWrite);. 
23fc0 20 61 73 73 65 72 74 28 69 73 45 78 63 6c 75 73   assert(isExclus
23fd0 69 76 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61  ive==0 || isCrea
23fe0 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73  te);.  assert(is
23ff0 44 65 6c 65 74 65 3d 3d 30 20 7c 7c 20 69 73 43  Delete==0 || isC
24000 72 65 61 74 65 29 3b 0a 0a 20 20 2f 2a 20 54 68  reate);..  /* Th
24010 65 20 6d 61 69 6e 20 44 42 2c 20 6d 61 69 6e 20  e main DB, main 
24020 6a 6f 75 72 6e 61 6c 2c 20 57 41 4c 20 66 69 6c  journal, WAL fil
24030 65 20 61 6e 64 20 6d 61 73 74 65 72 20 6a 6f 75  e and master jou
24040 72 6e 61 6c 20 61 72 65 20 6e 65 76 65 72 0a 20  rnal are never. 
24050 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   ** automaticall
24060 79 20 64 65 6c 65 74 65 64 2e 20 4e 6f 72 20 61  y deleted. Nor a
24070 72 65 20 74 68 65 79 20 65 76 65 72 20 74 65 6d  re they ever tem
24080 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 20 2a  porary files.  *
24090 2f 0a 20 20 61 73 73 65 72 74 28 20 28 21 69 73  /.  assert( (!is
240a0 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29  Delete && zName)
240b0 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54   || eType!=SQLIT
240c0 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29  E_OPEN_MAIN_DB )
240d0 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21 69 73  ;.  assert( (!is
240e0 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29  Delete && zName)
240f0 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54   || eType!=SQLIT
24100 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
24110 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  NAL );.  assert(
24120 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a   (!isDelete && z
24130 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d  Name) || eType!=
24140 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54  SQLITE_OPEN_MAST
24150 45 52 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20  ER_JOURNAL );.  
24160 61 73 73 65 72 74 28 20 28 21 69 73 44 65 6c 65  assert( (!isDele
24170 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20  te && zName) || 
24180 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50  eType!=SQLITE_OP
24190 45 4e 5f 57 41 4c 20 29 3b 0a 0a 20 20 2f 2a 20  EN_WAL );..  /* 
241a0 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20  Assert that the 
241b0 75 70 70 65 72 20 6c 61 79 65 72 20 68 61 73 20  upper layer has 
241c0 73 65 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 22  set one of the "
241d0 66 69 6c 65 2d 74 79 70 65 22 20 66 6c 61 67 73  file-type" flags
241e0 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 65  . */.  assert( e
241f0 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
24200 4e 5f 4d 41 49 4e 5f 44 42 20 20 20 20 20 20 7c  N_MAIN_DB      |
24210 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
24220 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 0a 20 20 20  OPEN_TEMP_DB.   
24230 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51      || eType==SQ
24240 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
24250 4f 55 52 4e 41 4c 20 7c 7c 20 65 54 79 70 65 3d  OURNAL || eType=
24260 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d  =SQLITE_OPEN_TEM
24270 50 5f 4a 4f 55 52 4e 41 4c 0a 20 20 20 20 20 20  P_JOURNAL.      
24280 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
24290 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41  E_OPEN_SUBJOURNA
242a0 4c 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51  L   || eType==SQ
242b0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52  LITE_OPEN_MASTER
242c0 5f 4a 4f 55 52 4e 41 4c 0a 20 20 20 20 20 20 20  _JOURNAL.       
242d0 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
242e0 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f  _OPEN_TRANSIENT_
242f0 44 42 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c  DB || eType==SQL
24300 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 29  ITE_OPEN_WAL.  )
24310 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  ;..  assert( pFi
24320 6c 65 21 3d 30 20 29 3b 0a 20 20 6d 65 6d 73 65  le!=0 );.  memse
24330 74 28 70 46 69 6c 65 2c 20 30 2c 20 73 69 7a 65  t(pFile, 0, size
24340 6f 66 28 77 69 6e 46 69 6c 65 29 29 3b 0a 20 20  of(winFile));.  
24350 70 46 69 6c 65 2d 3e 68 20 3d 20 49 4e 56 41 4c  pFile->h = INVAL
24360 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 3b  ID_HANDLE_VALUE;
24370 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
24380 57 49 4e 52 54 0a 20 20 69 66 28 20 21 7a 55 74  WINRT.  if( !zUt
24390 66 38 4e 61 6d 65 20 26 26 20 21 73 71 6c 69 74  f8Name && !sqlit
243a0 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72  e3_temp_director
243b0 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
243c0 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 45 52 52 4f  _log(SQLITE_ERRO
243d0 52 2c 0a 20 20 20 20 20 20 20 20 22 73 71 6c 69  R,.        "sqli
243e0 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f  te3_temp_directo
243f0 72 79 20 76 61 72 69 61 62 6c 65 20 73 68 6f 75  ry variable shou
24400 6c 64 20 62 65 20 73 65 74 20 66 6f 72 20 57 69  ld be set for Wi
24410 6e 52 54 22 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  nRT");.  }.#endi
24420 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73  f..  /* If the s
24430 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74  econd argument t
24440 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  o this function 
24450 69 73 20 4e 55 4c 4c 2c 20 67 65 6e 65 72 61 74  is NULL, generat
24460 65 20 61 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61  e a.  ** tempora
24470 72 79 20 66 69 6c 65 20 6e 61 6d 65 20 74 6f 20  ry file name to 
24480 75 73 65 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  use.  */.  if( !
24490 7a 55 74 66 38 4e 61 6d 65 20 29 7b 0a 20 20 20  zUtf8Name ){.   
244a0 20 61 73 73 65 72 74 28 20 69 73 44 65 6c 65 74   assert( isDelet
244b0 65 20 26 26 20 21 69 73 4f 70 65 6e 4a 6f 75 72  e && !isOpenJour
244c0 6e 61 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  nal );.    rc = 
244d0 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65 28 70  winGetTempname(p
244e0 56 66 73 2c 20 26 7a 54 6d 70 6e 61 6d 65 29 3b  Vfs, &zTmpname);
244f0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
24500 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
24510 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 20 6e  OSTRACE(("OPEN n
24520 61 6d 65 3d 25 73 2c 20 72 63 3d 25 73 22 2c 20  ame=%s, rc=%s", 
24530 7a 55 74 66 38 4e 61 6d 65 2c 20 73 71 6c 69 74  zUtf8Name, sqlit
24540 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b  e3ErrName(rc)));
24550 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
24560 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 55 74 66  ;.    }.    zUtf
24570 38 4e 61 6d 65 20 3d 20 7a 54 6d 70 6e 61 6d 65  8Name = zTmpname
24580 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 61 74 61  ;.  }..  /* Data
24590 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 73 20 61  base filenames a
245a0 72 65 20 64 6f 75 62 6c 65 2d 7a 65 72 6f 20 74  re double-zero t
245b0 65 72 6d 69 6e 61 74 65 64 20 69 66 20 74 68 65  erminated if the
245c0 79 20 61 72 65 20 6e 6f 74 0a 20 20 2a 2a 20 55  y are not.  ** U
245d0 52 49 73 20 77 69 74 68 20 70 61 72 61 6d 65 74  RIs with paramet
245e0 65 72 73 2e 20 20 48 65 6e 63 65 2c 20 74 68 65  ers.  Hence, the
245f0 79 20 63 61 6e 20 61 6c 77 61 79 73 20 62 65 20  y can always be 
24600 70 61 73 73 65 64 20 69 6e 74 6f 0a 20 20 2a 2a  passed into.  **
24610 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72   sqlite3_uri_par
24620 61 6d 65 74 65 72 28 29 2e 0a 20 20 2a 2f 0a 20  ameter()..  */. 
24630 20 61 73 73 65 72 74 28 20 28 65 54 79 70 65 21   assert( (eType!
24640 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
24650 4e 5f 44 42 29 20 7c 7c 20 28 66 6c 61 67 73 20  N_DB) || (flags 
24660 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52  & SQLITE_OPEN_UR
24670 49 29 20 7c 7c 0a 20 20 20 20 20 20 20 7a 55 74  I) ||.       zUt
24680 66 38 4e 61 6d 65 5b 73 71 6c 69 74 65 33 53 74  f8Name[sqlite3St
24690 72 6c 65 6e 33 30 28 7a 55 74 66 38 4e 61 6d 65  rlen30(zUtf8Name
246a0 29 2b 31 5d 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a  )+1]==0 );..  /*
246b0 20 43 6f 6e 76 65 72 74 20 74 68 65 20 66 69 6c   Convert the fil
246c0 65 6e 61 6d 65 20 74 6f 20 74 68 65 20 73 79 73  ename to the sys
246d0 74 65 6d 20 65 6e 63 6f 64 69 6e 67 2e 20 2a 2f  tem encoding. */
246e0 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20  .  zConverted = 
246f0 77 69 6e 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74  winConvertFromUt
24700 66 38 46 69 6c 65 6e 61 6d 65 28 7a 55 74 66 38  f8Filename(zUtf8
24710 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f  Name);.  if( zCo
24720 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20  nverted==0 ){.  
24730 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
24740 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20 4f 53  Tmpname);.    OS
24750 54 52 41 43 45 28 28 22 4f 50 45 4e 20 6e 61 6d  TRACE(("OPEN nam
24760 65 3d 25 73 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%s, rc=SQLITE_
24770 49 4f 45 52 52 5f 4e 4f 4d 45 4d 22 2c 20 7a 55  IOERR_NOMEM", zU
24780 74 66 38 4e 61 6d 65 29 29 3b 0a 20 20 20 20 72  tf8Name));.    r
24790 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
247a0 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20  RR_NOMEM;.  }.. 
247b0 20 69 66 28 20 77 69 6e 49 73 44 69 72 28 7a 43   if( winIsDir(zC
247c0 6f 6e 76 65 72 74 65 64 29 20 29 7b 0a 20 20 20  onverted) ){.   
247d0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
247e0 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 73  onverted);.    s
247f0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 6d 70  qlite3_free(zTmp
24800 6e 61 6d 65 29 3b 0a 20 20 20 20 4f 53 54 52 41  name);.    OSTRA
24810 43 45 28 28 22 4f 50 45 4e 20 6e 61 6d 65 3d 25  CE(("OPEN name=%
24820 73 2c 20 72 63 3d 53 51 4c 49 54 45 5f 43 41 4e  s, rc=SQLITE_CAN
24830 54 4f 50 45 4e 5f 49 53 44 49 52 22 2c 20 7a 55  TOPEN_ISDIR", zU
24840 74 66 38 4e 61 6d 65 29 29 3b 0a 20 20 20 20 72  tf8Name));.    r
24850 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e  eturn SQLITE_CAN
24860 54 4f 50 45 4e 5f 49 53 44 49 52 3b 0a 20 20 7d  TOPEN_ISDIR;.  }
24870 0a 0a 20 20 69 66 28 20 69 73 52 65 61 64 57 72  ..  if( isReadWr
24880 69 74 65 20 29 7b 0a 20 20 20 20 64 77 44 65 73  ite ){.    dwDes
24890 69 72 65 64 41 63 63 65 73 73 20 3d 20 47 45 4e  iredAccess = GEN
248a0 45 52 49 43 5f 52 45 41 44 20 7c 20 47 45 4e 45  ERIC_READ | GENE
248b0 52 49 43 5f 57 52 49 54 45 3b 0a 20 20 7d 65 6c  RIC_WRITE;.  }el
248c0 73 65 7b 0a 20 20 20 20 64 77 44 65 73 69 72 65  se{.    dwDesire
248d0 64 41 63 63 65 73 73 20 3d 20 47 45 4e 45 52 49  dAccess = GENERI
248e0 43 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a 20 20 2f  C_READ;.  }..  /
248f0 2a 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58  * SQLITE_OPEN_EX
24900 43 4c 55 53 49 56 45 20 69 73 20 75 73 65 64 20  CLUSIVE is used 
24910 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  to make sure tha
24920 74 20 61 20 6e 65 77 20 66 69 6c 65 20 69 73 0a  t a new file is.
24930 20 20 2a 2a 20 63 72 65 61 74 65 64 2e 20 53 51    ** created. SQ
24940 4c 69 74 65 20 64 6f 65 73 6e 27 74 20 75 73 65  Lite doesn't use
24950 20 69 74 20 74 6f 20 69 6e 64 69 63 61 74 65 20   it to indicate 
24960 22 65 78 63 6c 75 73 69 76 65 20 61 63 63 65 73  "exclusive acces
24970 73 22 0a 20 20 2a 2a 20 61 73 20 69 74 20 69 73  s".  ** as it is
24980 20 75 73 75 61 6c 6c 79 20 75 6e 64 65 72 73 74   usually underst
24990 6f 6f 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ood..  */.  if( 
249a0 69 73 45 78 63 6c 75 73 69 76 65 20 29 7b 0a 20  isExclusive ){. 
249b0 20 20 20 2f 2a 20 43 72 65 61 74 65 73 20 61 20     /* Creates a 
249c0 6e 65 77 20 66 69 6c 65 2c 20 6f 6e 6c 79 20 69  new file, only i
249d0 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 61 6c  f it does not al
249e0 72 65 61 64 79 20 65 78 69 73 74 2e 20 2a 2f 0a  ready exist. */.
249f0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69      /* If the fi
24a00 6c 65 20 65 78 69 73 74 73 2c 20 69 74 20 66 61  le exists, it fa
24a10 69 6c 73 2e 20 2a 2f 0a 20 20 20 20 64 77 43 72  ils. */.    dwCr
24a20 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f  eationDispositio
24a30 6e 20 3d 20 43 52 45 41 54 45 5f 4e 45 57 3b 0a  n = CREATE_NEW;.
24a40 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73 43 72    }else if( isCr
24a50 65 61 74 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4f  eate ){.    /* O
24a60 70 65 6e 20 65 78 69 73 74 69 6e 67 20 66 69 6c  pen existing fil
24a70 65 2c 20 6f 72 20 63 72 65 61 74 65 20 69 66 20  e, or create if 
24a80 69 74 20 64 6f 65 73 6e 27 74 20 65 78 69 73 74  it doesn't exist
24a90 20 2a 2f 0a 20 20 20 20 64 77 43 72 65 61 74 69   */.    dwCreati
24aa0 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 20 3d 20  onDisposition = 
24ab0 4f 50 45 4e 5f 41 4c 57 41 59 53 3b 0a 20 20 7d  OPEN_ALWAYS;.  }
24ac0 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4f 70 65  else{.    /* Ope
24ad0 6e 73 20 61 20 66 69 6c 65 2c 20 6f 6e 6c 79 20  ns a file, only 
24ae0 69 66 20 69 74 20 65 78 69 73 74 73 2e 20 2a 2f  if it exists. */
24af0 0a 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44  .    dwCreationD
24b00 69 73 70 6f 73 69 74 69 6f 6e 20 3d 20 4f 50 45  isposition = OPE
24b10 4e 5f 45 58 49 53 54 49 4e 47 3b 0a 20 20 7d 0a  N_EXISTING;.  }.
24b20 0a 20 20 64 77 53 68 61 72 65 4d 6f 64 65 20 3d  .  dwShareMode =
24b30 20 46 49 4c 45 5f 53 48 41 52 45 5f 52 45 41 44   FILE_SHARE_READ
24b40 20 7c 20 46 49 4c 45 5f 53 48 41 52 45 5f 57 52   | FILE_SHARE_WR
24b50 49 54 45 3b 0a 0a 20 20 69 66 28 20 69 73 44 65  ITE;..  if( isDe
24b60 6c 65 74 65 20 29 7b 0a 23 69 66 20 53 51 4c 49  lete ){.#if SQLI
24b70 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20  TE_OS_WINCE.    
24b80 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62  dwFlagsAndAttrib
24b90 75 74 65 73 20 3d 20 46 49 4c 45 5f 41 54 54 52  utes = FILE_ATTR
24ba0 49 42 55 54 45 5f 48 49 44 44 45 4e 3b 0a 20 20  IBUTE_HIDDEN;.  
24bb0 20 20 69 73 54 65 6d 70 20 3d 20 31 3b 0a 23 65    isTemp = 1;.#e
24bc0 6c 73 65 0a 20 20 20 20 64 77 46 6c 61 67 73 41  lse.    dwFlagsA
24bd0 6e 64 41 74 74 72 69 62 75 74 65 73 20 3d 20 46  ndAttributes = F
24be0 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 54 45  ILE_ATTRIBUTE_TE
24bf0 4d 50 4f 52 41 52 59 0a 20 20 20 20 20 20 20 20  MPORARY.        
24c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24c10 20 20 20 20 20 20 20 7c 20 46 49 4c 45 5f 41 54         | FILE_AT
24c20 54 52 49 42 55 54 45 5f 48 49 44 44 45 4e 0a 20  TRIBUTE_HIDDEN. 
24c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
24c50 46 49 4c 45 5f 46 4c 41 47 5f 44 45 4c 45 54 45  FILE_FLAG_DELETE
24c60 5f 4f 4e 5f 43 4c 4f 53 45 3b 0a 23 65 6e 64 69  _ON_CLOSE;.#endi
24c70 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64  f.  }else{.    d
24c80 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75  wFlagsAndAttribu
24c90 74 65 73 20 3d 20 46 49 4c 45 5f 41 54 54 52 49  tes = FILE_ATTRI
24ca0 42 55 54 45 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d  BUTE_NORMAL;.  }
24cb0 0a 20 20 2f 2a 20 52 65 70 6f 72 74 73 20 66 72  .  /* Reports fr
24cc0 6f 6d 20 74 68 65 20 69 6e 74 65 72 6e 65 74 20  om the internet 
24cd0 61 72 65 20 74 68 61 74 20 70 65 72 66 6f 72 6d  are that perform
24ce0 61 6e 63 65 20 69 73 20 61 6c 77 61 79 73 0a 20  ance is always. 
24cf0 20 2a 2a 20 62 65 74 74 65 72 20 69 66 20 46 49   ** better if FI
24d00 4c 45 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d 5f 41  LE_FLAG_RANDOM_A
24d10 43 43 45 53 53 20 69 73 20 75 73 65 64 2e 20 20  CCESS is used.  
24d20 54 69 63 6b 65 74 20 23 32 36 39 39 2e 20 2a 2f  Ticket #2699. */
24d30 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
24d40 49 4e 43 45 0a 20 20 64 77 46 6c 61 67 73 41 6e  INCE.  dwFlagsAn
24d50 64 41 74 74 72 69 62 75 74 65 73 20 7c 3d 20 46  dAttributes |= F
24d60 49 4c 45 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d 5f  ILE_FLAG_RANDOM_
24d70 41 43 43 45 53 53 3b 0a 23 65 6e 64 69 66 0a 0a  ACCESS;.#endif..
24d80 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29    if( osIsNT() )
24d90 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  {.#if SQLITE_OS_
24da0 57 49 4e 52 54 0a 20 20 20 20 43 52 45 41 54 45  WINRT.    CREATE
24db0 46 49 4c 45 32 5f 45 58 54 45 4e 44 45 44 5f 50  FILE2_EXTENDED_P
24dc0 41 52 41 4d 45 54 45 52 53 20 65 78 74 65 6e 64  ARAMETERS extend
24dd0 65 64 50 61 72 61 6d 65 74 65 72 73 3b 0a 20 20  edParameters;.  
24de0 20 20 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65    extendedParame
24df0 74 65 72 73 2e 64 77 53 69 7a 65 20 3d 20 73 69  ters.dwSize = si
24e00 7a 65 6f 66 28 43 52 45 41 54 45 46 49 4c 45 32  zeof(CREATEFILE2
24e10 5f 45 58 54 45 4e 44 45 44 5f 50 41 52 41 4d 45  _EXTENDED_PARAME
24e20 54 45 52 53 29 3b 0a 20 20 20 20 65 78 74 65 6e  TERS);.    exten
24e30 64 65 64 50 61 72 61 6d 65 74 65 72 73 2e 64 77  dedParameters.dw
24e40 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 20 3d  FileAttributes =
24e50 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 77 46  .            dwF
24e60 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65  lagsAndAttribute
24e70 73 20 26 20 46 49 4c 45 5f 41 54 54 52 49 42 55  s & FILE_ATTRIBU
24e80 54 45 5f 4d 41 53 4b 3b 0a 20 20 20 20 65 78 74  TE_MASK;.    ext
24e90 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73 2e  endedParameters.
24ea0 64 77 46 69 6c 65 46 6c 61 67 73 20 3d 20 64 77  dwFileFlags = dw
24eb0 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74  FlagsAndAttribut
24ec0 65 73 20 26 20 46 49 4c 45 5f 46 4c 41 47 5f 4d  es & FILE_FLAG_M
24ed0 41 53 4b 3b 0a 20 20 20 20 65 78 74 65 6e 64 65  ASK;.    extende
24ee0 64 50 61 72 61 6d 65 74 65 72 73 2e 64 77 53 65  dParameters.dwSe
24ef0 63 75 72 69 74 79 51 6f 73 46 6c 61 67 73 20 3d  curityQosFlags =
24f00 20 53 45 43 55 52 49 54 59 5f 41 4e 4f 4e 59 4d   SECURITY_ANONYM
24f10 4f 55 53 3b 0a 20 20 20 20 65 78 74 65 6e 64 65  OUS;.    extende
24f20 64 50 61 72 61 6d 65 74 65 72 73 2e 6c 70 53 65  dParameters.lpSe
24f30 63 75 72 69 74 79 41 74 74 72 69 62 75 74 65 73  curityAttributes
24f40 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 65 78 74   = NULL;.    ext
24f50 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73 2e  endedParameters.
24f60 68 54 65 6d 70 6c 61 74 65 46 69 6c 65 20 3d 20  hTemplateFile = 
24f70 4e 55 4c 4c 3b 0a 20 20 20 20 77 68 69 6c 65 28  NULL;.    while(
24f80 20 28 68 20 3d 20 6f 73 43 72 65 61 74 65 46 69   (h = osCreateFi
24f90 6c 65 32 28 28 4c 50 43 57 53 54 52 29 7a 43 6f  le2((LPCWSTR)zCo
24fa0 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20  nverted,.       
24fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24fc0 20 20 20 20 20 20 20 64 77 44 65 73 69 72 65 64         dwDesired
24fd0 41 63 63 65 73 73 2c 0a 20 20 20 20 20 20 20 20  Access,.        
24fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ff0 20 20 20 20 20 20 64 77 53 68 61 72 65 4d 6f 64        dwShareMod
25000 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
25010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25020 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f   dwCreationDispo
25030 73 69 74 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20  sition,.        
25040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25050 20 20 20 20 20 20 26 65 78 74 65 6e 64 65 64 50        &extendedP
25060 61 72 61 6d 65 74 65 72 73 29 29 3d 3d 49 4e 56  arameters))==INV
25070 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
25080 45 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20  E &&.           
25090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
250a0 20 20 20 77 69 6e 52 65 74 72 79 49 6f 65 72 72     winRetryIoerr
250b0 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e  (&cnt, &lastErrn
250c0 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  o) ){.          
250d0 20 20 20 20 20 2f 2a 20 4e 6f 6f 70 20 2a 2f 0a       /* Noop */.
250e0 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20      }.#else.    
250f0 77 68 69 6c 65 28 20 28 68 20 3d 20 6f 73 43 72  while( (h = osCr
25100 65 61 74 65 46 69 6c 65 57 28 28 4c 50 43 57 53  eateFileW((LPCWS
25110 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20  TR)zConverted,. 
25120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25130 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77 44               dwD
25140 65 73 69 72 65 64 41 63 63 65 73 73 2c 0a 20 20  esiredAccess,.  
25150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25160 20 20 20 20 20 20 20 20 20 20 20 20 64 77 53 68              dwSh
25170 61 72 65 4d 6f 64 65 2c 20 4e 55 4c 4c 2c 0a 20  areMode, NULL,. 
25180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25190 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77 43               dwC
251a0 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69  reationDispositi
251b0 6f 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  on,.            
251c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
251d0 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72    dwFlagsAndAttr
251e0 69 62 75 74 65 73 2c 0a 20 20 20 20 20 20 20 20  ibutes,.        
251f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25200 20 20 20 20 20 20 4e 55 4c 4c 29 29 3d 3d 49 4e        NULL))==IN
25210 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c  VALID_HANDLE_VAL
25220 55 45 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  UE &&.          
25230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25240 20 20 20 20 77 69 6e 52 65 74 72 79 49 6f 65 72      winRetryIoer
25250 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72  r(&cnt, &lastErr
25260 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  no) ){.         
25270 20 20 20 20 20 20 2f 2a 20 4e 6f 6f 70 20 2a 2f        /* Noop */
25280 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
25290 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
252a0 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20  WIN32_HAS_ANSI. 
252b0 20 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65   else{.    while
252c0 28 20 28 68 20 3d 20 6f 73 43 72 65 61 74 65 46  ( (h = osCreateF
252d0 69 6c 65 41 28 28 4c 50 43 53 54 52 29 7a 43 6f  ileA((LPCSTR)zCo
252e0 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20  nverted,.       
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 64 77 44 65 73 69 72 65 64         dwDesired
25310 41 63 63 65 73 73 2c 0a 20 20 20 20 20 20 20 20  Access,.        
25320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25330 20 20 20 20 20 20 64 77 53 68 61 72 65 4d 6f 64        dwShareMod
25340 65 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20  e, NULL,.       
25350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25360 20 20 20 20 20 20 20 64 77 43 72 65 61 74 69 6f         dwCreatio
25370 6e 44 69 73 70 6f 73 69 74 69 6f 6e 2c 0a 20 20  nDisposition,.  
25380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25390 20 20 20 20 20 20 20 20 20 20 20 20 64 77 46 6c              dwFl
253a0 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73  agsAndAttributes
253b0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
253c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
253d0 4e 55 4c 4c 29 29 3d 3d 49 4e 56 41 4c 49 44 5f  NULL))==INVALID_
253e0 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 26 26 0a  HANDLE_VALUE &&.
253f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 69                wi
25410 6e 52 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74  nRetryIoerr(&cnt
25420 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b  , &lastErrno) ){
25430 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
25440 2f 2a 20 4e 6f 6f 70 20 2a 2f 0a 20 20 20 20 7d  /* Noop */.    }
25450 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 77 69  .  }.#endif.  wi
25460 6e 4c 6f 67 49 6f 65 72 72 28 63 6e 74 29 3b 0a  nLogIoerr(cnt);.
25470 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45  .  OSTRACE(("OPE
25480 4e 20 66 69 6c 65 3d 25 70 2c 20 6e 61 6d 65 3d  N file=%p, name=
25490 25 73 2c 20 61 63 63 65 73 73 3d 25 6c 78 2c 20  %s, access=%lx, 
254a0 72 63 3d 25 73 5c 6e 22 2c 20 68 2c 20 7a 55 74  rc=%s\n", h, zUt
254b0 66 38 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  f8Name,.        
254c0 20 20 20 64 77 44 65 73 69 72 65 64 41 63 63 65     dwDesiredAcce
254d0 73 73 2c 20 28 68 3d 3d 49 4e 56 41 4c 49 44 5f  ss, (h==INVALID_
254e0 48 41 4e 44 4c 45 5f 56 41 4c 55 45 29 20 3f 20  HANDLE_VALUE) ? 
254f0 22 66 61 69 6c 65 64 22 20 3a 20 22 6f 6b 22 29  "failed" : "ok")
25500 29 3b 0a 0a 20 20 69 66 28 20 68 3d 3d 49 4e 56  );..  if( h==INV
25510 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
25520 45 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  E ){.    pFile->
25530 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74  lastErrno = last
25540 45 72 72 6e 6f 3b 0a 20 20 20 20 77 69 6e 4c 6f  Errno;.    winLo
25550 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41  gError(SQLITE_CA
25560 4e 54 4f 50 45 4e 2c 20 70 46 69 6c 65 2d 3e 6c  NTOPEN, pFile->l
25570 61 73 74 45 72 72 6e 6f 2c 20 22 77 69 6e 4f 70  astErrno, "winOp
25580 65 6e 22 2c 20 7a 55 74 66 38 4e 61 6d 65 29 3b  en", zUtf8Name);
25590 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
255a0 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
255b0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
255c0 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20 69  zTmpname);.    i
255d0 66 28 20 69 73 52 65 61 64 57 72 69 74 65 20 26  f( isReadWrite &
255e0 26 20 21 69 73 45 78 63 6c 75 73 69 76 65 20 29  & !isExclusive )
255f0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 77  {.      return w
25600 69 6e 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4e 61  inOpen(pVfs, zNa
25610 6d 65 2c 20 69 64 2c 0a 20 20 20 20 20 20 20 20  me, id,.        
25620 20 28 28 66 6c 61 67 73 7c 53 51 4c 49 54 45 5f   ((flags|SQLITE_
25630 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 20 26  OPEN_READONLY) &
25640 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
25650 20 20 20 20 20 20 7e 28 53 51 4c 49 54 45 5f 4f        ~(SQLITE_O
25660 50 45 4e 5f 43 52 45 41 54 45 7c 53 51 4c 49 54  PEN_CREATE|SQLIT
25670 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
25680 29 29 2c 0a 20 20 20 20 20 20 20 20 20 70 4f 75  )),.         pOu
25690 74 46 6c 61 67 73 29 3b 0a 20 20 20 20 7d 65 6c  tFlags);.    }el
256a0 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  se{.      return
256b0 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
256c0 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d  _BKPT;.    }.  }
256d0 0a 0a 20 20 69 66 28 20 70 4f 75 74 46 6c 61 67  ..  if( pOutFlag
256e0 73 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73 52  s ){.    if( isR
256f0 65 61 64 57 72 69 74 65 20 29 7b 0a 20 20 20 20  eadWrite ){.    
25700 20 20 2a 70 4f 75 74 46 6c 61 67 73 20 3d 20 53    *pOutFlags = S
25710 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
25720 52 49 54 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  RITE;.    }else{
25730 0a 20 20 20 20 20 20 2a 70 4f 75 74 46 6c 61 67  .      *pOutFlag
25740 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s = SQLITE_OPEN_
25750 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a  READONLY;.    }.
25760 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28 28    }..  OSTRACE((
25770 22 4f 50 45 4e 20 66 69 6c 65 3d 25 70 2c 20 6e  "OPEN file=%p, n
25780 61 6d 65 3d 25 73 2c 20 61 63 63 65 73 73 3d 25  ame=%s, access=%
25790 6c 78 2c 20 70 4f 75 74 46 6c 61 67 73 3d 25 70  lx, pOutFlags=%p
257a0 2c 20 2a 70 4f 75 74 46 6c 61 67 73 3d 25 64 2c  , *pOutFlags=%d,
257b0 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 22 72   ".           "r
257c0 63 3d 25 73 5c 6e 22 2c 20 68 2c 20 7a 55 74 66  c=%s\n", h, zUtf
257d0 38 4e 61 6d 65 2c 20 64 77 44 65 73 69 72 65 64  8Name, dwDesired
257e0 41 63 63 65 73 73 2c 20 70 4f 75 74 46 6c 61 67  Access, pOutFlag
257f0 73 2c 20 70 4f 75 74 46 6c 61 67 73 20 3f 0a 20  s, pOutFlags ?. 
25800 20 20 20 20 20 20 20 20 20 20 2a 70 4f 75 74 46            *pOutF
25810 6c 61 67 73 20 3a 20 30 2c 20 28 68 3d 3d 49 4e  lags : 0, (h==IN
25820 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c  VALID_HANDLE_VAL
25830 55 45 29 20 3f 20 22 66 61 69 6c 65 64 22 20 3a  UE) ? "failed" :
25840 20 22 6f 6b 22 29 29 3b 0a 0a 23 69 66 20 53 51   "ok"));..#if SQ
25850 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
25860 69 66 28 20 69 73 52 65 61 64 57 72 69 74 65 20  if( isReadWrite 
25870 26 26 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  && eType==SQLITE
25880 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 0a 20 20  _OPEN_MAIN_DB.  
25890 20 20 20 20 20 26 26 20 28 72 63 20 3d 20 77 69       && (rc = wi
258a0 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b 28 7a 4e  nceCreateLock(zN
258b0 61 6d 65 2c 20 70 46 69 6c 65 29 29 21 3d 53 51  ame, pFile))!=SQ
258c0 4c 49 54 45 5f 4f 4b 0a 20 20 29 7b 0a 20 20 20  LITE_OK.  ){.   
258d0 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 68   osCloseHandle(h
258e0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
258f0 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
25900 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
25910 65 28 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20  e(zTmpname);.   
25920 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 2d   OSTRACE(("OPEN-
25930 43 45 2d 4c 4f 43 4b 20 6e 61 6d 65 3d 25 73 2c  CE-LOCK name=%s,
25940 20 72 63 3d 25 73 5c 6e 22 2c 20 7a 4e 61 6d 65   rc=%s\n", zName
25950 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65  , sqlite3ErrName
25960 28 72 63 29 29 29 3b 0a 20 20 20 20 72 65 74 75  (rc)));.    retu
25970 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28  rn rc;.  }.  if(
25980 20 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 70   isTemp ){.    p
25990 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43  File->zDeleteOnC
259a0 6c 6f 73 65 20 3d 20 7a 43 6f 6e 76 65 72 74 65  lose = zConverte
259b0 64 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  d;.  }else.#endi
259c0 66 0a 20 20 7b 0a 20 20 20 20 73 71 6c 69 74 65  f.  {.    sqlite
259d0 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
259e0 64 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74  d);.  }..  sqlit
259f0 65 33 5f 66 72 65 65 28 7a 54 6d 70 6e 61 6d 65  e3_free(zTmpname
25a00 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 4d 65 74  );.  pFile->pMet
25a10 68 6f 64 20 3d 20 26 77 69 6e 49 6f 4d 65 74 68  hod = &winIoMeth
25a20 6f 64 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 56 66  od;.  pFile->pVf
25a30 73 20 3d 20 70 56 66 73 3b 0a 20 20 70 46 69 6c  s = pVfs;.  pFil
25a40 65 2d 3e 68 20 3d 20 68 3b 0a 20 20 69 66 28 20  e->h = h;.  if( 
25a50 69 73 52 65 61 64 6f 6e 6c 79 20 29 7b 0a 20 20  isReadonly ){.  
25a60 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61    pFile->ctrlFla
25a70 67 73 20 7c 3d 20 57 49 4e 46 49 4c 45 5f 52 44  gs |= WINFILE_RD
25a80 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ONLY;.  }.  if( 
25a90 73 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c  sqlite3_uri_bool
25aa0 65 61 6e 28 7a 4e 61 6d 65 2c 20 22 70 73 6f 77  ean(zName, "psow
25ab0 22 2c 20 53 51 4c 49 54 45 5f 50 4f 57 45 52 53  ", SQLITE_POWERS
25ac0 41 46 45 5f 4f 56 45 52 57 52 49 54 45 29 20 29  AFE_OVERWRITE) )
25ad0 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72  {.    pFile->ctr
25ae0 6c 46 6c 61 67 73 20 7c 3d 20 57 49 4e 46 49 4c  lFlags |= WINFIL
25af0 45 5f 50 53 4f 57 3b 0a 20 20 7d 0a 20 20 70 46  E_PSOW;.  }.  pF
25b00 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
25b10 20 4e 4f 5f 45 52 52 4f 52 3b 0a 20 20 70 46 69   NO_ERROR;.  pFi
25b20 6c 65 2d 3e 7a 50 61 74 68 20 3d 20 7a 4e 61 6d  le->zPath = zNam
25b30 65 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  e;.#if SQLITE_MA
25b40 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
25b50 70 46 69 6c 65 2d 3e 68 4d 61 70 20 3d 20 4e 55  pFile->hMap = NU
25b60 4c 4c 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 4d 61  LL;.  pFile->pMa
25b70 70 52 65 67 69 6f 6e 20 3d 20 30 3b 0a 20 20 70  pRegion = 0;.  p
25b80 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d  File->mmapSize =
25b90 20 30 3b 0a 20 20 70 46 69 6c 65 2d 3e 6d 6d 61   0;.  pFile->mma
25ba0 70 53 69 7a 65 41 63 74 75 61 6c 20 3d 20 30 3b  pSizeActual = 0;
25bb0 0a 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69  .  pFile->mmapSi
25bc0 7a 65 4d 61 78 20 3d 20 73 71 6c 69 74 65 33 47  zeMax = sqlite3G
25bd0 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4d 6d  lobalConfig.szMm
25be0 61 70 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 4f 70  ap;.#endif..  Op
25bf0 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29 3b 0a 20  enCounter(+1);. 
25c00 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
25c10 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20  *.** Delete the 
25c20 6e 61 6d 65 64 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  named file..**.*
25c30 2a 20 4e 6f 74 65 20 74 68 61 74 20 57 69 6e 64  * Note that Wind
25c40 6f 77 73 20 64 6f 65 73 20 6e 6f 74 20 61 6c 6c  ows does not all
25c50 6f 77 20 61 20 66 69 6c 65 20 74 6f 20 62 65 20  ow a file to be 
25c60 64 65 6c 65 74 65 64 20 69 66 20 73 6f 6d 65 20  deleted if some 
25c70 6f 74 68 65 72 0a 2a 2a 20 70 72 6f 63 65 73 73  other.** process
25c80 20 68 61 73 20 69 74 20 6f 70 65 6e 2e 20 20 53   has it open.  S
25c90 6f 6d 65 74 69 6d 65 73 20 61 20 76 69 72 75 73  ometimes a virus
25ca0 20 73 63 61 6e 6e 65 72 20 6f 72 20 69 6e 64 65   scanner or inde
25cb0 78 69 6e 67 20 70 72 6f 67 72 61 6d 0a 2a 2a 20  xing program.** 
25cc0 77 69 6c 6c 20 6f 70 65 6e 20 61 20 6a 6f 75 72  will open a jour
25cd0 6e 61 6c 20 66 69 6c 65 20 73 68 6f 72 74 6c 79  nal file shortly
25ce0 20 61 66 74 65 72 20 69 74 20 69 73 20 63 72 65   after it is cre
25cf0 61 74 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f  ated in order to
25d00 20 64 6f 0a 2a 2a 20 77 68 61 74 65 76 65 72 20   do.** whatever 
25d10 69 74 20 64 6f 65 73 2e 20 20 57 68 69 6c 65 20  it does.  While 
25d20 74 68 69 73 20 6f 74 68 65 72 20 70 72 6f 63 65  this other proce
25d30 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68  ss is holding th
25d40 65 0a 2a 2a 20 66 69 6c 65 20 6f 70 65 6e 2c 20  e.** file open, 
25d50 77 65 20 77 69 6c 6c 20 62 65 20 75 6e 61 62 6c  we will be unabl
25d60 65 20 74 6f 20 64 65 6c 65 74 65 20 69 74 2e 20  e to delete it. 
25d70 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20   To work around 
25d80 74 68 69 73 0a 2a 2a 20 70 72 6f 62 6c 65 6d 2c  this.** problem,
25d90 20 77 65 20 64 65 6c 61 79 20 31 30 30 20 6d 69   we delay 100 mi
25da0 6c 6c 69 73 65 63 6f 6e 64 73 20 61 6e 64 20 74  lliseconds and t
25db0 72 79 20 74 6f 20 64 65 6c 65 74 65 20 61 67 61  ry to delete aga
25dc0 69 6e 2e 20 20 55 70 0a 2a 2a 20 74 6f 20 4d 58  in.  Up.** to MX
25dd0 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d 50  _DELETION_ATTEMP
25de0 54 73 20 64 65 6c 65 74 69 6f 6e 20 61 74 74 65  Ts deletion atte
25df0 6d 70 74 73 20 61 72 65 20 72 75 6e 20 62 65 66  mpts are run bef
25e00 6f 72 65 20 67 69 76 69 6e 67 0a 2a 2a 20 75 70  ore giving.** up
25e10 20 61 6e 64 20 72 65 74 75 72 6e 69 6e 67 20 61   and returning a
25e20 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74  n error..*/.stat
25e30 69 63 20 69 6e 74 20 77 69 6e 44 65 6c 65 74 65  ic int winDelete
25e40 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
25e50 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20 20 20  *pVfs,          
25e60 2f 2a 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20 77  /* Not used on w
25e70 69 6e 33 32 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  in32 */.  const 
25e80 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
25e90 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
25ea0 20 66 69 6c 65 20 74 6f 20 64 65 6c 65 74 65 20   file to delete 
25eb0 2a 2f 0a 20 20 69 6e 74 20 73 79 6e 63 44 69 72  */.  int syncDir
25ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25ed0 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20   /* Not used on 
25ee0 77 69 6e 33 32 20 2a 2f 0a 29 7b 0a 20 20 69 6e  win32 */.){.  in
25ef0 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74  t cnt = 0;.  int
25f00 20 72 63 3b 0a 20 20 44 57 4f 52 44 20 61 74 74   rc;.  DWORD att
25f10 72 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45  r;.  DWORD lastE
25f20 72 72 6e 6f 20 3d 20 30 3b 0a 20 20 76 6f 69 64  rrno = 0;.  void
25f30 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20   *zConverted;.  
25f40 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
25f50 28 70 56 66 73 29 3b 0a 20 20 55 4e 55 53 45 44  (pVfs);.  UNUSED
25f60 5f 50 41 52 41 4d 45 54 45 52 28 73 79 6e 63 44  _PARAMETER(syncD
25f70 69 72 29 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65  ir);..  Simulate
25f80 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53  IOError(return S
25f90 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45  QLITE_IOERR_DELE
25fa0 54 45 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  TE);.  OSTRACE((
25fb0 22 44 45 4c 45 54 45 20 6e 61 6d 65 3d 25 73 2c  "DELETE name=%s,
25fc0 20 73 79 6e 63 44 69 72 3d 25 64 5c 6e 22 2c 20   syncDir=%d\n", 
25fd0 7a 46 69 6c 65 6e 61 6d 65 2c 20 73 79 6e 63 44  zFilename, syncD
25fe0 69 72 29 29 3b 0a 0a 20 20 7a 43 6f 6e 76 65 72  ir));..  zConver
25ff0 74 65 64 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74  ted = winConvert
26000 46 72 6f 6d 55 74 66 38 46 69 6c 65 6e 61 6d 65  FromUtf8Filename
26010 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69  (zFilename);.  i
26020 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30  f( zConverted==0
26030 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28   ){.    OSTRACE(
26040 28 22 44 45 4c 45 54 45 20 6e 61 6d 65 3d 25 73  ("DELETE name=%s
26050 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52  , rc=SQLITE_IOER
26060 52 5f 4e 4f 4d 45 4d 5c 6e 22 2c 20 7a 46 69 6c  R_NOMEM\n", zFil
26070 65 6e 61 6d 65 29 29 3b 0a 20 20 20 20 72 65 74  ename));.    ret
26080 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
26090 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66  _NOMEM;.  }.  if
260a0 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 20  ( osIsNT() ){.  
260b0 20 20 64 6f 20 7b 0a 23 69 66 20 53 51 4c 49 54    do {.#if SQLIT
260c0 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 20  E_OS_WINRT.     
260d0 20 57 49 4e 33 32 5f 46 49 4c 45 5f 41 54 54 52   WIN32_FILE_ATTR
260e0 49 42 55 54 45 5f 44 41 54 41 20 73 41 74 74 72  IBUTE_DATA sAttr
260f0 44 61 74 61 3b 0a 20 20 20 20 20 20 6d 65 6d 73  Data;.      mems
26100 65 74 28 26 73 41 74 74 72 44 61 74 61 2c 20 30  et(&sAttrData, 0
26110 2c 20 73 69 7a 65 6f 66 28 73 41 74 74 72 44 61  , sizeof(sAttrDa
26120 74 61 29 29 3b 0a 20 20 20 20 20 20 69 66 20 28  ta));.      if (
26130 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62   osGetFileAttrib
26140 75 74 65 73 45 78 57 28 7a 43 6f 6e 76 65 72 74  utesExW(zConvert
26150 65 64 2c 20 47 65 74 46 69 6c 65 45 78 49 6e 66  ed, GetFileExInf
26160 6f 53 74 61 6e 64 61 72 64 2c 0a 20 20 20 20 20  oStandard,.     
26170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26180 20 20 20 20 20 20 20 20 20 20 20 20 20 26 73 41               &sA
26190 74 74 72 44 61 74 61 29 20 29 7b 0a 20 20 20 20  ttrData) ){.    
261a0 20 20 20 20 61 74 74 72 20 3d 20 73 41 74 74 72      attr = sAttr
261b0 44 61 74 61 2e 64 77 46 69 6c 65 41 74 74 72 69  Data.dwFileAttri
261c0 62 75 74 65 73 3b 0a 20 20 20 20 20 20 7d 65 6c  butes;.      }el
261d0 73 65 7b 0a 20 20 20 20 20 20 20 20 6c 61 73 74  se{.        last
261e0 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
261f0 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20  tError();.      
26200 20 20 69 66 28 20 6c 61 73 74 45 72 72 6e 6f 3d    if( lastErrno=
26210 3d 45 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54 5f  =ERROR_FILE_NOT_
26220 46 4f 55 4e 44 0a 20 20 20 20 20 20 20 20 20 7c  FOUND.         |
26230 7c 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52  | lastErrno==ERR
26240 4f 52 5f 50 41 54 48 5f 4e 4f 54 5f 46 4f 55 4e  OR_PATH_NOT_FOUN
26250 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  D ){.          r
26260 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
26270 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 3b 20 2f  _DELETE_NOENT; /
26280 2a 20 41 6c 72 65 61 64 79 20 67 6f 6e 65 3f 20  * Already gone? 
26290 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  */.        }else
262a0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
262b0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
262c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
262d0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
262e0 23 65 6c 73 65 0a 20 20 20 20 20 20 61 74 74 72  #else.      attr
262f0 20 3d 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72   = osGetFileAttr
26300 69 62 75 74 65 73 57 28 7a 43 6f 6e 76 65 72 74  ibutesW(zConvert
26310 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  ed);.#endif.    
26320 20 20 69 66 20 28 20 61 74 74 72 3d 3d 49 4e 56    if ( attr==INV
26330 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42  ALID_FILE_ATTRIB
26340 55 54 45 53 20 29 7b 0a 20 20 20 20 20 20 20 20  UTES ){.        
26350 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
26360 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
26370 20 20 20 20 20 20 69 66 28 20 6c 61 73 74 45 72        if( lastEr
26380 72 6e 6f 3d 3d 45 52 52 4f 52 5f 46 49 4c 45 5f  rno==ERROR_FILE_
26390 4e 4f 54 5f 46 4f 55 4e 44 0a 20 20 20 20 20 20  NOT_FOUND.      
263a0 20 20 20 7c 7c 20 6c 61 73 74 45 72 72 6e 6f 3d     || lastErrno=
263b0 3d 45 52 52 4f 52 5f 50 41 54 48 5f 4e 4f 54 5f  =ERROR_PATH_NOT_
263c0 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20 20 20 20  FOUND ){.       
263d0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
263e0 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e  OERR_DELETE_NOEN
263f0 54 3b 20 2f 2a 20 41 6c 72 65 61 64 79 20 67 6f  T; /* Already go
26400 6e 65 3f 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d  ne? */.        }
26410 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
26420 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
26430 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  R;.        }.   
26440 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
26450 20 20 7d 0a 20 20 20 20 20 20 69 66 20 28 20 61    }.      if ( a
26460 74 74 72 26 46 49 4c 45 5f 41 54 54 52 49 42 55  ttr&FILE_ATTRIBU
26470 54 45 5f 44 49 52 45 43 54 4f 52 59 20 29 7b 0a  TE_DIRECTORY ){.
26480 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
26490 49 54 45 5f 45 52 52 4f 52 3b 20 2f 2a 20 46 69  ITE_ERROR; /* Fi
264a0 6c 65 73 20 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20  les only. */.   
264b0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
264c0 20 20 7d 0a 20 20 20 20 20 20 69 66 20 28 20 6f    }.      if ( o
264d0 73 44 65 6c 65 74 65 46 69 6c 65 57 28 7a 43 6f  sDeleteFileW(zCo
264e0 6e 76 65 72 74 65 64 29 20 29 7b 0a 20 20 20 20  nverted) ){.    
264f0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
26500 4f 4b 3b 20 2f 2a 20 44 65 6c 65 74 65 64 20 4f  OK; /* Deleted O
26510 4b 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72  K. */.        br
26520 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
26530 20 20 20 69 66 20 28 20 21 77 69 6e 52 65 74 72     if ( !winRetr
26540 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c 61  yIoerr(&cnt, &la
26550 73 74 45 72 72 6e 6f 29 20 29 7b 0a 20 20 20 20  stErrno) ){.    
26560 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
26570 45 52 52 4f 52 3b 20 2f 2a 20 4e 6f 20 6d 6f 72  ERROR; /* No mor
26580 65 20 72 65 74 72 69 65 73 2e 20 2a 2f 0a 20 20  e retries. */.  
26590 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
265a0 20 20 20 7d 0a 20 20 20 20 7d 20 77 68 69 6c 65     }.    } while
265b0 28 31 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20  (1);.  }.#ifdef 
265c0 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
265d0 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20  _ANSI.  else{.  
265e0 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 61 74 74    do {.      att
265f0 72 20 3d 20 6f 73 47 65 74 46 69 6c 65 41 74 74  r = osGetFileAtt
26600 72 69 62 75 74 65 73 41 28 7a 43 6f 6e 76 65 72  ributesA(zConver
26610 74 65 64 29 3b 0a 20 20 20 20 20 20 69 66 20 28  ted);.      if (
26620 20 61 74 74 72 3d 3d 49 4e 56 41 4c 49 44 5f 46   attr==INVALID_F
26630 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 20 29  ILE_ATTRIBUTES )
26640 7b 0a 20 20 20 20 20 20 20 20 6c 61 73 74 45 72  {.        lastEr
26650 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
26660 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 20 20  rror();.        
26670 69 66 28 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45  if( lastErrno==E
26680 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54 5f 46 4f  RROR_FILE_NOT_FO
26690 55 4e 44 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  UND.         || 
266a0 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52  lastErrno==ERROR
266b0 5f 50 41 54 48 5f 4e 4f 54 5f 46 4f 55 4e 44 20  _PATH_NOT_FOUND 
266c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
266d0 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44  = SQLITE_IOERR_D
266e0 45 4c 45 54 45 5f 4e 4f 45 4e 54 3b 20 2f 2a 20  ELETE_NOENT; /* 
266f0 41 6c 72 65 61 64 79 20 67 6f 6e 65 3f 20 2a 2f  Already gone? */
26700 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
26710 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
26720 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
26730 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62       }.        b
26740 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
26750 20 20 20 20 69 66 20 28 20 61 74 74 72 26 46 49      if ( attr&FI
26760 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 44 49 52  LE_ATTRIBUTE_DIR
26770 45 43 54 4f 52 59 20 29 7b 0a 20 20 20 20 20 20  ECTORY ){.      
26780 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
26790 52 4f 52 3b 20 2f 2a 20 46 69 6c 65 73 20 6f 6e  ROR; /* Files on
267a0 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 62  ly. */.        b
267b0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
267c0 20 20 20 20 69 66 20 28 20 6f 73 44 65 6c 65 74      if ( osDelet
267d0 65 46 69 6c 65 41 28 7a 43 6f 6e 76 65 72 74 65  eFileA(zConverte
267e0 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  d) ){.        rc
267f0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 2f 2a   = SQLITE_OK; /*
26800 20 44 65 6c 65 74 65 64 20 4f 4b 2e 20 2a 2f 0a   Deleted OK. */.
26810 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
26820 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 20       }.      if 
26830 28 20 21 77 69 6e 52 65 74 72 79 49 6f 65 72 72  ( !winRetryIoerr
26840 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e  (&cnt, &lastErrn
26850 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  o) ){.        rc
26860 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
26870 20 2f 2a 20 4e 6f 20 6d 6f 72 65 20 72 65 74 72   /* No more retr
26880 69 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ies. */.        
26890 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
268a0 20 20 20 7d 20 77 68 69 6c 65 28 31 29 3b 0a 20     } while(1);. 
268b0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
268c0 72 63 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45  rc && rc!=SQLITE
268d0 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f  _IOERR_DELETE_NO
268e0 45 4e 54 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ENT ){.    rc = 
268f0 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
26900 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 2c  TE_IOERR_DELETE,
26910 20 6c 61 73 74 45 72 72 6e 6f 2c 20 22 77 69 6e   lastErrno, "win
26920 44 65 6c 65 74 65 22 2c 20 7a 46 69 6c 65 6e 61  Delete", zFilena
26930 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  me);.  }else{.  
26940 20 20 77 69 6e 4c 6f 67 49 6f 65 72 72 28 63 6e    winLogIoerr(cn
26950 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  t);.  }.  sqlite
26960 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
26970 64 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  d);.  OSTRACE(("
26980 44 45 4c 45 54 45 20 6e 61 6d 65 3d 25 73 2c 20  DELETE name=%s, 
26990 72 63 3d 25 73 5c 6e 22 2c 20 7a 46 69 6c 65 6e  rc=%s\n", zFilen
269a0 61 6d 65 2c 20 73 71 6c 69 74 65 33 45 72 72 4e  ame, sqlite3ErrN
269b0 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 72 65 74  ame(rc)));.  ret
269c0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
269d0 20 43 68 65 63 6b 20 74 68 65 20 65 78 69 73 74   Check the exist
269e0 65 6e 63 65 20 61 6e 64 20 73 74 61 74 75 73 20  ence and status 
269f0 6f 66 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  of a file..*/.st
26a00 61 74 69 63 20 69 6e 74 20 77 69 6e 41 63 63 65  atic int winAcce
26a10 73 73 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  ss(.  sqlite3_vf
26a20 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20  s *pVfs,        
26a30 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20   /* Not used on 
26a40 77 69 6e 33 32 20 2a 2f 0a 20 20 63 6f 6e 73 74  win32 */.  const
26a50 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
26a60 2c 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  ,     /* Name of
26a70 20 66 69 6c 65 20 74 6f 20 63 68 65 63 6b 20 2a   file to check *
26a80 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  /.  int flags,  
26a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26aa0 2a 20 54 79 70 65 20 6f 66 20 74 65 73 74 20 74  * Type of test t
26ab0 6f 20 6d 61 6b 65 20 6f 6e 20 74 68 69 73 20 66  o make on this f
26ac0 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52  ile */.  int *pR
26ad0 65 73 4f 75 74 20 20 20 20 20 20 20 20 20 20 20  esOut           
26ae0 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 73 75      /* OUT: Resu
26af0 6c 74 20 2a 2f 0a 29 7b 0a 20 20 44 57 4f 52 44  lt */.){.  DWORD
26b00 20 61 74 74 72 3b 0a 20 20 69 6e 74 20 72 63 20   attr;.  int rc 
26b10 3d 20 30 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73  = 0;.  DWORD las
26b20 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 20 20 76 6f  tErrno = 0;.  vo
26b30 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 0a  id *zConverted;.
26b40 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
26b50 45 52 28 70 56 66 73 29 3b 0a 0a 20 20 53 69 6d  ER(pVfs);..  Sim
26b60 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
26b70 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
26b80 52 5f 41 43 43 45 53 53 3b 20 29 3b 0a 20 20 4f  R_ACCESS; );.  O
26b90 53 54 52 41 43 45 28 28 22 41 43 43 45 53 53 20  STRACE(("ACCESS 
26ba0 6e 61 6d 65 3d 25 73 2c 20 66 6c 61 67 73 3d 25  name=%s, flags=%
26bb0 78 2c 20 70 52 65 73 4f 75 74 3d 25 70 5c 6e 22  x, pResOut=%p\n"
26bc0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 7a 46 69  ,.           zFi
26bd0 6c 65 6e 61 6d 65 2c 20 66 6c 61 67 73 2c 20 70  lename, flags, p
26be0 52 65 73 4f 75 74 29 29 3b 0a 0a 20 20 7a 43 6f  ResOut));..  zCo
26bf0 6e 76 65 72 74 65 64 20 3d 20 77 69 6e 43 6f 6e  nverted = winCon
26c00 76 65 72 74 46 72 6f 6d 55 74 66 38 46 69 6c 65  vertFromUtf8File
26c10 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  name(zFilename);
26c20 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65  .  if( zConverte
26c30 64 3d 3d 30 20 29 7b 0a 20 20 20 20 4f 53 54 52  d==0 ){.    OSTR
26c40 41 43 45 28 28 22 41 43 43 45 53 53 20 6e 61 6d  ACE(("ACCESS nam
26c50 65 3d 25 73 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%s, rc=SQLITE_
26c60 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 2c 20  IOERR_NOMEM\n", 
26c70 7a 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 20  zFilename));.   
26c80 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
26c90 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  OERR_NOMEM;.  }.
26ca0 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29    if( osIsNT() )
26cb0 7b 0a 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20  {.    int cnt = 
26cc0 30 3b 0a 20 20 20 20 57 49 4e 33 32 5f 46 49 4c  0;.    WIN32_FIL
26cd0 45 5f 41 54 54 52 49 42 55 54 45 5f 44 41 54 41  E_ATTRIBUTE_DATA
26ce0 20 73 41 74 74 72 44 61 74 61 3b 0a 20 20 20 20   sAttrData;.    
26cf0 6d 65 6d 73 65 74 28 26 73 41 74 74 72 44 61 74  memset(&sAttrDat
26d00 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 41 74  a, 0, sizeof(sAt
26d10 74 72 44 61 74 61 29 29 3b 0a 20 20 20 20 77 68  trData));.    wh
26d20 69 6c 65 28 20 21 28 72 63 20 3d 20 6f 73 47 65  ile( !(rc = osGe
26d30 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 45  tFileAttributesE
26d40 78 57 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e  xW((LPCWSTR)zCon
26d50 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20  verted,.        
26d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d70 20 20 20 20 20 47 65 74 46 69 6c 65 45 78 49 6e       GetFileExIn
26d80 66 6f 53 74 61 6e 64 61 72 64 2c 0a 20 20 20 20  foStandard,.    
26d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26da0 20 20 20 20 20 20 20 20 20 26 73 41 74 74 72 44           &sAttrD
26db0 61 74 61 29 29 20 26 26 20 77 69 6e 52 65 74 72  ata)) && winRetr
26dc0 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c 61  yIoerr(&cnt, &la
26dd0 73 74 45 72 72 6e 6f 29 20 29 7b 7d 0a 20 20 20  stErrno) ){}.   
26de0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
26df0 20 2f 2a 20 46 6f 72 20 61 6e 20 53 51 4c 49 54   /* For an SQLIT
26e00 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 20  E_ACCESS_EXISTS 
26e10 71 75 65 72 79 2c 20 74 72 65 61 74 20 61 20 7a  query, treat a z
26e20 65 72 6f 2d 6c 65 6e 67 74 68 20 66 69 6c 65 0a  ero-length file.
26e30 20 20 20 20 20 20 2a 2a 20 61 73 20 69 66 20 69        ** as if i
26e40 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  t does not exist
26e50 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
26e60 20 69 66 28 20 20 20 20 66 6c 61 67 73 3d 3d 53   if(    flags==S
26e70 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
26e80 53 54 53 0a 20 20 20 20 20 20 20 20 20 20 26 26  STS.          &&
26e90 20 73 41 74 74 72 44 61 74 61 2e 6e 46 69 6c 65   sAttrData.nFile
26ea0 53 69 7a 65 48 69 67 68 3d 3d 30 0a 20 20 20 20  SizeHigh==0.    
26eb0 20 20 20 20 20 20 26 26 20 73 41 74 74 72 44 61        && sAttrDa
26ec0 74 61 2e 6e 46 69 6c 65 53 69 7a 65 4c 6f 77 3d  ta.nFileSizeLow=
26ed0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 74  =0 ){.        at
26ee0 74 72 20 3d 20 49 4e 56 41 4c 49 44 5f 46 49 4c  tr = INVALID_FIL
26ef0 45 5f 41 54 54 52 49 42 55 54 45 53 3b 0a 20 20  E_ATTRIBUTES;.  
26f00 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
26f10 20 20 20 61 74 74 72 20 3d 20 73 41 74 74 72 44     attr = sAttrD
26f20 61 74 61 2e 64 77 46 69 6c 65 41 74 74 72 69 62  ata.dwFileAttrib
26f30 75 74 65 73 3b 0a 20 20 20 20 20 20 7d 0a 20 20  utes;.      }.  
26f40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 77    }else{.      w
26f50 69 6e 4c 6f 67 49 6f 65 72 72 28 63 6e 74 29 3b  inLogIoerr(cnt);
26f60 0a 20 20 20 20 20 20 69 66 28 20 6c 61 73 74 45  .      if( lastE
26f70 72 72 6e 6f 21 3d 45 52 52 4f 52 5f 46 49 4c 45  rrno!=ERROR_FILE
26f80 5f 4e 4f 54 5f 46 4f 55 4e 44 20 26 26 20 6c 61  _NOT_FOUND && la
26f90 73 74 45 72 72 6e 6f 21 3d 45 52 52 4f 52 5f 50  stErrno!=ERROR_P
26fa0 41 54 48 5f 4e 4f 54 5f 46 4f 55 4e 44 20 29 7b  ATH_NOT_FOUND ){
26fb0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
26fc0 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
26fd0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
26fe0 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  n winLogError(SQ
26ff0 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53  LITE_IOERR_ACCES
27000 53 2c 20 6c 61 73 74 45 72 72 6e 6f 2c 20 22 77  S, lastErrno, "w
27010 69 6e 41 63 63 65 73 73 22 2c 0a 20 20 20 20 20  inAccess",.     
27020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27030 20 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 29        zFilename)
27040 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
27050 20 20 20 20 20 20 20 61 74 74 72 20 3d 20 49 4e         attr = IN
27060 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49  VALID_FILE_ATTRI
27070 42 55 54 45 53 3b 0a 20 20 20 20 20 20 7d 0a 20  BUTES;.      }. 
27080 20 20 20 7d 0a 20 20 7d 0a 23 69 66 64 65 66 20     }.  }.#ifdef 
27090 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
270a0 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20  _ANSI.  else{.  
270b0 20 20 61 74 74 72 20 3d 20 6f 73 47 65 74 46 69    attr = osGetFi
270c0 6c 65 41 74 74 72 69 62 75 74 65 73 41 28 28 63  leAttributesA((c
270d0 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 29  har*)zConverted)
270e0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73  ;.  }.#endif.  s
270f0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e  qlite3_free(zCon
27100 76 65 72 74 65 64 29 3b 0a 20 20 73 77 69 74 63  verted);.  switc
27110 68 28 20 66 6c 61 67 73 20 29 7b 0a 20 20 20 20  h( flags ){.    
27120 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45  case SQLITE_ACCE
27130 53 53 5f 52 45 41 44 3a 0a 20 20 20 20 63 61 73  SS_READ:.    cas
27140 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  e SQLITE_ACCESS_
27150 45 58 49 53 54 53 3a 0a 20 20 20 20 20 20 72 63  EXISTS:.      rc
27160 20 3d 20 61 74 74 72 21 3d 49 4e 56 41 4c 49 44   = attr!=INVALID
27170 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53  _FILE_ATTRIBUTES
27180 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
27190 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
271a0 43 43 45 53 53 5f 52 45 41 44 57 52 49 54 45 3a  CCESS_READWRITE:
271b0 0a 20 20 20 20 20 20 72 63 20 3d 20 61 74 74 72  .      rc = attr
271c0 21 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41  !=INVALID_FILE_A
271d0 54 54 52 49 42 55 54 45 53 20 26 26 0a 20 20 20  TTRIBUTES &&.   
271e0 20 20 20 20 20 20 20 20 20 20 28 61 74 74 72 20            (attr 
271f0 26 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  & FILE_ATTRIBUTE
27200 5f 52 45 41 44 4f 4e 4c 59 29 3d 3d 30 3b 0a 20  _READONLY)==0;. 
27210 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
27220 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 61  default:.      a
27230 73 73 65 72 74 28 21 22 49 6e 76 61 6c 69 64 20  ssert(!"Invalid 
27240 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 22 29  flags argument")
27250 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 4f 75 74  ;.  }.  *pResOut
27260 20 3d 20 72 63 3b 0a 20 20 4f 53 54 52 41 43 45   = rc;.  OSTRACE
27270 28 28 22 41 43 43 45 53 53 20 6e 61 6d 65 3d 25  (("ACCESS name=%
27280 73 2c 20 70 52 65 73 4f 75 74 3d 25 70 2c 20 2a  s, pResOut=%p, *
27290 70 52 65 73 4f 75 74 3d 25 64 2c 20 72 63 3d 53  pResOut=%d, rc=S
272a0 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20  QLITE_OK\n",.   
272b0 20 20 20 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d          zFilenam
272c0 65 2c 20 70 52 65 73 4f 75 74 2c 20 2a 70 52 65  e, pResOut, *pRe
272d0 73 4f 75 74 29 29 3b 0a 20 20 72 65 74 75 72 6e  sOut));.  return
272e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
272f0 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20 6e 6f 6e  *.** Returns non
27300 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 73 70 65  -zero if the spe
27310 63 69 66 69 65 64 20 70 61 74 68 20 6e 61 6d 65  cified path name
27320 20 73 74 61 72 74 73 20 77 69 74 68 20 61 20 64   starts with a d
27330 72 69 76 65 20 6c 65 74 74 65 72 0a 2a 2a 20 66  rive letter.** f
27340 6f 6c 6c 6f 77 65 64 20 62 79 20 61 20 63 6f 6c  ollowed by a col
27350 6f 6e 20 63 68 61 72 61 63 74 65 72 2e 0a 2a 2f  on character..*/
27360 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e  .static BOOL win
27370 49 73 44 72 69 76 65 4c 65 74 74 65 72 41 6e 64  IsDriveLetterAnd
27380 43 6f 6c 6f 6e 28 0a 20 20 63 6f 6e 73 74 20 63  Colon(.  const c
27390 68 61 72 20 2a 7a 50 61 74 68 6e 61 6d 65 0a 29  har *zPathname.)
273a0 7b 0a 20 20 72 65 74 75 72 6e 20 28 20 73 71 6c  {.  return ( sql
273b0 69 74 65 33 49 73 61 6c 70 68 61 28 7a 50 61 74  ite3Isalpha(zPat
273c0 68 6e 61 6d 65 5b 30 5d 29 20 26 26 20 7a 50 61  hname[0]) && zPa
273d0 74 68 6e 61 6d 65 5b 31 5d 3d 3d 27 3a 27 20 29  thname[1]==':' )
273e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
273f0 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74  ns non-zero if t
27400 68 65 20 73 70 65 63 69 66 69 65 64 20 70 61 74  he specified pat
27410 68 20 6e 61 6d 65 20 73 68 6f 75 6c 64 20 62 65  h name should be
27420 20 75 73 65 64 20 76 65 72 62 61 74 69 6d 2e 20   used verbatim. 
27430 20 49 66 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20   If.** non-zero 
27440 69 73 20 72 65 74 75 72 6e 65 64 20 66 72 6f 6d  is returned from
27450 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20   this function, 
27460 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  the calling func
27470 74 69 6f 6e 20 6d 75 73 74 20 73 69 6d 70 6c 79  tion must simply
27480 0a 2a 2a 20 75 73 65 20 74 68 65 20 70 72 6f 76  .** use the prov
27490 69 64 65 64 20 70 61 74 68 20 6e 61 6d 65 20 76  ided path name v
274a0 65 72 62 61 74 69 6d 20 2d 4f 52 2d 20 72 65 73  erbatim -OR- res
274b0 6f 6c 76 65 20 69 74 20 69 6e 74 6f 20 61 20 66  olve it into a f
274c0 75 6c 6c 20 70 61 74 68 20 6e 61 6d 65 0a 2a 2a  ull path name.**
274d0 20 75 73 69 6e 67 20 74 68 65 20 47 65 74 46 75   using the GetFu
274e0 6c 6c 50 61 74 68 4e 61 6d 65 20 57 69 6e 33 32  llPathName Win32
274f0 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 20 28 69   API function (i
27500 66 20 61 76 61 69 6c 61 62 6c 65 29 2e 0a 2a 2f  f available)..*/
27510 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e  .static BOOL win
27520 49 73 56 65 72 62 61 74 69 6d 50 61 74 68 6e 61  IsVerbatimPathna
27530 6d 65 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  me(.  const char
27540 20 2a 7a 50 61 74 68 6e 61 6d 65 0a 29 7b 0a 20   *zPathname.){. 
27550 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20   /*.  ** If the 
27560 70 61 74 68 20 6e 61 6d 65 20 73 74 61 72 74 73  path name starts
27570 20 77 69 74 68 20 61 20 66 6f 72 77 61 72 64 20   with a forward 
27580 73 6c 61 73 68 20 6f 72 20 61 20 62 61 63 6b 73  slash or a backs
27590 6c 61 73 68 2c 20 69 74 20 69 73 20 65 69 74 68  lash, it is eith
275a0 65 72 0a 20 20 2a 2a 20 61 20 6c 65 67 61 6c 20  er.  ** a legal 
275b0 55 4e 43 20 6e 61 6d 65 2c 20 61 20 76 6f 6c 75  UNC name, a volu
275c0 6d 65 20 72 65 6c 61 74 69 76 65 20 70 61 74 68  me relative path
275d0 2c 20 6f 72 20 61 6e 20 61 62 73 6f 6c 75 74 65  , or an absolute
275e0 20 70 61 74 68 20 6e 61 6d 65 20 69 6e 20 74 68   path name in th
275f0 65 0a 20 20 2a 2a 20 22 55 6e 69 78 22 20 66 6f  e.  ** "Unix" fo
27600 72 6d 61 74 20 6f 6e 20 57 69 6e 64 6f 77 73 2e  rmat on Windows.
27610 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 65 61    There is no ea
27620 73 79 20 77 61 79 20 74 6f 20 64 69 66 66 65 72  sy way to differ
27630 65 6e 74 69 61 74 65 20 62 65 74 77 65 65 6e 0a  entiate between.
27640 20 20 2a 2a 20 74 68 65 20 66 69 6e 61 6c 20 74    ** the final t
27650 77 6f 20 63 61 73 65 73 3b 20 74 68 65 72 65 66  wo cases; theref
27660 6f 72 65 2c 20 77 65 20 72 65 74 75 72 6e 20 74  ore, we return t
27670 68 65 20 73 61 66 65 72 20 72 65 74 75 72 6e 20  he safer return 
27680 76 61 6c 75 65 20 6f 66 20 54 52 55 45 0a 20 20  value of TRUE.  
27690 2a 2a 20 73 6f 20 74 68 61 74 20 63 61 6c 6c 65  ** so that calle
276a0 72 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  rs of this funct
276b0 69 6f 6e 20 77 69 6c 6c 20 73 69 6d 70 6c 79 20  ion will simply 
276c0 75 73 65 20 69 74 20 76 65 72 62 61 74 69 6d 2e  use it verbatim.
276d0 0a 20 20 2a 2f 0a 20 20 69 66 20 28 20 77 69 6e  .  */.  if ( win
276e0 49 73 44 69 72 53 65 70 28 7a 50 61 74 68 6e 61  IsDirSep(zPathna
276f0 6d 65 5b 30 5d 29 20 29 7b 0a 20 20 20 20 72 65  me[0]) ){.    re
27700 74 75 72 6e 20 54 52 55 45 3b 0a 20 20 7d 0a 0a  turn TRUE;.  }..
27710 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65    /*.  ** If the
27720 20 70 61 74 68 20 6e 61 6d 65 20 73 74 61 72 74   path name start
27730 73 20 77 69 74 68 20 61 20 6c 65 74 74 65 72 20  s with a letter 
27740 61 6e 64 20 61 20 63 6f 6c 6f 6e 20 69 74 20 69  and a colon it i
27750 73 20 65 69 74 68 65 72 20 61 20 76 6f 6c 75 6d  s either a volum
27760 65 0a 20 20 2a 2a 20 72 65 6c 61 74 69 76 65 20  e.  ** relative 
27770 70 61 74 68 20 6f 72 20 61 6e 20 61 62 73 6f 6c  path or an absol
27780 75 74 65 20 70 61 74 68 2e 20 20 43 61 6c 6c 65  ute path.  Calle
27790 72 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  rs of this funct
277a0 69 6f 6e 20 6d 75 73 74 20 6e 6f 74 0a 20 20 2a  ion must not.  *
277b0 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 74 72 65  * attempt to tre
277c0 61 74 20 69 74 20 61 73 20 61 20 72 65 6c 61 74  at it as a relat
277d0 69 76 65 20 70 61 74 68 20 6e 61 6d 65 20 28 69  ive path name (i
277e0 2e 65 2e 20 74 68 65 79 20 73 68 6f 75 6c 64 20  .e. they should 
277f0 73 69 6d 70 6c 79 20 75 73 65 0a 20 20 2a 2a 20  simply use.  ** 
27800 69 74 20 76 65 72 62 61 74 69 6d 29 2e 0a 20 20  it verbatim)..  
27810 2a 2f 0a 20 20 69 66 20 28 20 77 69 6e 49 73 44  */.  if ( winIsD
27820 72 69 76 65 4c 65 74 74 65 72 41 6e 64 43 6f 6c  riveLetterAndCol
27830 6f 6e 28 7a 50 61 74 68 6e 61 6d 65 29 20 29 7b  on(zPathname) ){
27840 0a 20 20 20 20 72 65 74 75 72 6e 20 54 52 55 45  .    return TRUE
27850 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
27860 20 49 66 20 77 65 20 67 65 74 20 74 6f 20 74 68   If we get to th
27870 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 20 70 61  is point, the pa
27880 74 68 20 6e 61 6d 65 20 73 68 6f 75 6c 64 20 61  th name should a
27890 6c 6d 6f 73 74 20 63 65 72 74 61 69 6e 6c 79 20  lmost certainly 
278a0 62 65 20 61 20 70 75 72 65 6c 79 0a 20 20 2a 2a  be a purely.  **
278b0 20 72 65 6c 61 74 69 76 65 20 6f 6e 65 20 28 69   relative one (i
278c0 2e 65 2e 20 6e 6f 74 20 61 20 55 4e 43 20 6e 61  .e. not a UNC na
278d0 6d 65 2c 20 6e 6f 74 20 61 62 73 6f 6c 75 74 65  me, not absolute
278e0 2c 20 61 6e 64 20 6e 6f 74 20 76 6f 6c 75 6d 65  , and not volume
278f0 20 72 65 6c 61 74 69 76 65 29 2e 0a 20 20 2a 2f   relative)..  */
27900 0a 20 20 72 65 74 75 72 6e 20 46 41 4c 53 45 3b  .  return FALSE;
27910 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 61  .}../*.** Turn a
27920 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61   relative pathna
27930 6d 65 20 69 6e 74 6f 20 61 20 66 75 6c 6c 20 70  me into a full p
27940 61 74 68 6e 61 6d 65 2e 20 20 57 72 69 74 65 20  athname.  Write 
27950 74 68 65 20 66 75 6c 6c 0a 2a 2a 20 70 61 74 68  the full.** path
27960 6e 61 6d 65 20 69 6e 74 6f 20 7a 4f 75 74 5b 5d  name into zOut[]
27970 2e 20 20 7a 4f 75 74 5b 5d 20 77 69 6c 6c 20 62  .  zOut[] will b
27980 65 20 61 74 20 6c 65 61 73 74 20 70 56 66 73 2d  e at least pVfs-
27990 3e 6d 78 50 61 74 68 6e 61 6d 65 0a 2a 2a 20 62  >mxPathname.** b
279a0 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2f  ytes in size..*/
279b0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 46  .static int winF
279c0 75 6c 6c 50 61 74 68 6e 61 6d 65 28 0a 20 20 73  ullPathname(.  s
279d0 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
279e0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
279f0 50 6f 69 6e 74 65 72 20 74 6f 20 76 66 73 20 6f  Pointer to vfs o
27a00 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74  bject */.  const
27a10 20 63 68 61 72 20 2a 7a 52 65 6c 61 74 69 76 65   char *zRelative
27a20 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 73  ,        /* Poss
27a30 69 62 6c 79 20 72 65 6c 61 74 69 76 65 20 69 6e  ibly relative in
27a40 70 75 74 20 70 61 74 68 20 2a 2f 0a 20 20 69 6e  put path */.  in
27a50 74 20 6e 46 75 6c 6c 2c 20 20 20 20 20 20 20 20  t nFull,        
27a60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
27a70 69 7a 65 20 6f 66 20 6f 75 74 70 75 74 20 62 75  ize of output bu
27a80 66 66 65 72 20 69 6e 20 62 79 74 65 73 20 2a 2f  ffer in bytes */
27a90 0a 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 20 20  .  char *zFull  
27aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27ab0 20 2f 2a 20 4f 75 74 70 75 74 20 62 75 66 66 65   /* Output buffe
27ac0 72 20 2a 2f 0a 29 7b 0a 0a 23 69 66 20 64 65 66  r */.){..#if def
27ad0 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29  ined(__CYGWIN__)
27ae0 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
27af0 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
27b00 45 5f 45 52 52 4f 52 20 29 3b 0a 20 20 55 4e 55  E_ERROR );.  UNU
27b10 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 46  SED_PARAMETER(nF
27b20 75 6c 6c 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ull);.  assert( 
27b30 6e 46 75 6c 6c 3e 3d 70 56 66 73 2d 3e 6d 78 50  nFull>=pVfs->mxP
27b40 61 74 68 6e 61 6d 65 20 29 3b 0a 20 20 69 66 20  athname );.  if 
27b50 28 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64  ( sqlite3_data_d
27b60 69 72 65 63 74 6f 72 79 20 26 26 20 21 77 69 6e  irectory && !win
27b70 49 73 56 65 72 62 61 74 69 6d 50 61 74 68 6e 61  IsVerbatimPathna
27b80 6d 65 28 7a 52 65 6c 61 74 69 76 65 29 20 29 7b  me(zRelative) ){
27b90 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 4e  .    /*.    ** N
27ba0 4f 54 45 3a 20 57 65 20 61 72 65 20 64 65 61 6c  OTE: We are deal
27bb0 69 6e 67 20 77 69 74 68 20 61 20 72 65 6c 61 74  ing with a relat
27bc0 69 76 65 20 70 61 74 68 20 6e 61 6d 65 20 61 6e  ive path name an
27bd0 64 20 74 68 65 20 64 61 74 61 0a 20 20 20 20 2a  d the data.    *
27be0 2a 20 20 20 20 20 20 20 64 69 72 65 63 74 6f 72  *       director
27bf0 79 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20  y has been set. 
27c00 20 54 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20   Therefore, use 
27c10 69 74 20 61 73 20 74 68 65 20 62 61 73 69 73 0a  it as the basis.
27c20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 66 6f 72      **       for
27c30 20 63 6f 6e 76 65 72 74 69 6e 67 20 74 68 65 20   converting the 
27c40 72 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61  relative path na
27c50 6d 65 20 74 6f 20 61 6e 20 61 62 73 6f 6c 75 74  me to an absolut
27c60 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 6f  e.    **       o
27c70 6e 65 20 62 79 20 70 72 65 70 65 6e 64 69 6e 67  ne by prepending
27c80 20 74 68 65 20 64 61 74 61 20 64 69 72 65 63 74   the data direct
27c90 6f 72 79 20 61 6e 64 20 61 20 73 6c 61 73 68 2e  ory and a slash.
27ca0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 68 61 72  .    */.    char
27cb0 20 2a 7a 4f 75 74 20 3d 20 73 71 6c 69 74 65 33   *zOut = sqlite3
27cc0 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 70 56 66 73  MallocZero( pVfs
27cd0 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 20 29  ->mxPathname+1 )
27ce0 3b 0a 20 20 20 20 69 66 28 20 21 7a 4f 75 74 20  ;.    if( !zOut 
27cf0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
27d00 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
27d10 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  EM;.    }.    if
27d20 28 20 63 79 67 77 69 6e 5f 63 6f 6e 76 5f 70 61  ( cygwin_conv_pa
27d30 74 68 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  th(.            
27d40 28 6f 73 49 73 4e 54 28 29 20 3f 20 43 43 50 5f  (osIsNT() ? CCP_
27d50 50 4f 53 49 58 5f 54 4f 5f 57 49 4e 5f 57 20 3a  POSIX_TO_WIN_W :
27d60 20 43 43 50 5f 50 4f 53 49 58 5f 54 4f 5f 57 49   CCP_POSIX_TO_WI
27d70 4e 5f 41 29 20 7c 0a 20 20 20 20 20 20 20 20 20  N_A) |.         
27d80 20 20 20 43 43 50 5f 52 45 4c 41 54 49 56 45 2c     CCP_RELATIVE,
27d90 20 7a 52 65 6c 61 74 69 76 65 2c 20 7a 4f 75 74   zRelative, zOut
27da0 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  , pVfs->mxPathna
27db0 6d 65 2b 31 29 3c 30 20 29 7b 0a 20 20 20 20 20  me+1)<0 ){.     
27dc0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f   sqlite3_free(zO
27dd0 75 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ut);.      retur
27de0 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  n winLogError(SQ
27df0 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 43 4f  LITE_CANTOPEN_CO
27e00 4e 56 50 41 54 48 2c 20 28 44 57 4f 52 44 29 65  NVPATH, (DWORD)e
27e10 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
27e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
27e30 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 31  winFullPathname1
27e40 22 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20  ", zRelative);. 
27e50 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
27e60 63 68 61 72 20 2a 7a 55 74 66 38 20 3d 20 77 69  char *zUtf8 = wi
27e70 6e 43 6f 6e 76 65 72 74 54 6f 55 74 66 38 46 69  nConvertToUtf8Fi
27e80 6c 65 6e 61 6d 65 28 7a 4f 75 74 29 3b 0a 20 20  lename(zOut);.  
27e90 20 20 20 20 69 66 28 20 21 7a 55 74 66 38 20 29      if( !zUtf8 )
27ea0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
27eb0 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20  3_free(zOut);.  
27ec0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
27ed0 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b  ITE_IOERR_NOMEM;
27ee0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
27ef0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
27f00 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d  MIN(nFull, pVfs-
27f10 3e 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46  >mxPathname), zF
27f20 75 6c 6c 2c 20 22 25 73 25 63 25 73 22 2c 0a 20  ull, "%s%c%s",. 
27f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27f40 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64 61        sqlite3_da
27f50 74 61 5f 64 69 72 65 63 74 6f 72 79 2c 20 77 69  ta_directory, wi
27f60 6e 47 65 74 44 69 72 53 65 70 28 29 2c 20 7a 55  nGetDirSep(), zU
27f70 74 66 38 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  tf8);.      sqli
27f80 74 65 33 5f 66 72 65 65 28 7a 55 74 66 38 29 3b  te3_free(zUtf8);
27f90 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
27fa0 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20 7d  ree(zOut);.    }
27fb0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68  .  }else{.    ch
27fc0 61 72 20 2a 7a 4f 75 74 20 3d 20 73 71 6c 69 74  ar *zOut = sqlit
27fd0 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 70 56  e3MallocZero( pV
27fe0 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
27ff0 20 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 4f 75   );.    if( !zOu
28000 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  t ){.      retur
28010 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  n SQLITE_IOERR_N
28020 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  OMEM;.    }.    
28030 69 66 28 20 63 79 67 77 69 6e 5f 63 6f 6e 76 5f  if( cygwin_conv_
28040 70 61 74 68 28 0a 20 20 20 20 20 20 20 20 20 20  path(.          
28050 20 20 28 6f 73 49 73 4e 54 28 29 20 3f 20 43 43    (osIsNT() ? CC
28060 50 5f 50 4f 53 49 58 5f 54 4f 5f 57 49 4e 5f 57  P_POSIX_TO_WIN_W
28070 20 3a 20 43 43 50 5f 50 4f 53 49 58 5f 54 4f 5f   : CCP_POSIX_TO_
28080 57 49 4e 5f 41 29 2c 0a 20 20 20 20 20 20 20 20  WIN_A),.        
28090 20 20 20 20 7a 52 65 6c 61 74 69 76 65 2c 20 7a      zRelative, z
280a0 4f 75 74 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74  Out, pVfs->mxPat
280b0 68 6e 61 6d 65 2b 31 29 3c 30 20 29 7b 0a 20 20  hname+1)<0 ){.  
280c0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
280d0 28 7a 4f 75 74 29 3b 0a 20 20 20 20 20 20 72 65  (zOut);.      re
280e0 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72  turn winLogError
280f0 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  (SQLITE_CANTOPEN
28100 5f 43 4f 4e 56 50 41 54 48 2c 20 28 44 57 4f 52  _CONVPATH, (DWOR
28110 44 29 65 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  D)errno,.       
28120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28130 20 20 22 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61    "winFullPathna
28140 6d 65 32 22 2c 20 7a 52 65 6c 61 74 69 76 65 29  me2", zRelative)
28150 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
28160 20 20 20 63 68 61 72 20 2a 7a 55 74 66 38 20 3d     char *zUtf8 =
28170 20 77 69 6e 43 6f 6e 76 65 72 74 54 6f 55 74 66   winConvertToUtf
28180 38 46 69 6c 65 6e 61 6d 65 28 7a 4f 75 74 29 3b  8Filename(zOut);
28190 0a 20 20 20 20 20 20 69 66 28 20 21 7a 55 74 66  .      if( !zUtf
281a0 38 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  8 ){.        sql
281b0 69 74 65 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b  ite3_free(zOut);
281c0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
281d0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
281e0 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  EM;.      }.    
281f0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
28200 74 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70 56  tf(MIN(nFull, pV
28210 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 29 2c  fs->mxPathname),
28220 20 7a 46 75 6c 6c 2c 20 22 25 73 22 2c 20 7a 55   zFull, "%s", zU
28230 74 66 38 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  tf8);.      sqli
28240 74 65 33 5f 66 72 65 65 28 7a 55 74 66 38 29 3b  te3_free(zUtf8);
28250 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
28260 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20 7d  ree(zOut);.    }
28270 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
28280 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a  LITE_OK;.#endif.
28290 0a 23 69 66 20 28 53 51 4c 49 54 45 5f 4f 53 5f  .#if (SQLITE_OS_
282a0 57 49 4e 43 45 20 7c 7c 20 53 51 4c 49 54 45 5f  WINCE || SQLITE_
282b0 4f 53 5f 57 49 4e 52 54 29 20 26 26 20 21 64 65  OS_WINRT) && !de
282c0 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f  fined(__CYGWIN__
282d0 29 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ).  SimulateIOEr
282e0 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
282f0 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20 20 2f 2a  TE_ERROR );.  /*
28300 20 57 69 6e 43 45 20 68 61 73 20 6e 6f 20 63 6f   WinCE has no co
28310 6e 63 65 70 74 20 6f 66 20 61 20 72 65 6c 61 74  ncept of a relat
28320 69 76 65 20 70 61 74 68 6e 61 6d 65 2c 20 6f 72  ive pathname, or
28330 20 73 6f 20 49 20 61 6d 20 74 6f 6c 64 2e 20 2a   so I am told. *
28340 2f 0a 20 20 2f 2a 20 57 69 6e 52 54 20 68 61 73  /.  /* WinRT has
28350 20 6e 6f 20 77 61 79 20 74 6f 20 63 6f 6e 76 65   no way to conve
28360 72 74 20 61 20 72 65 6c 61 74 69 76 65 20 70 61  rt a relative pa
28370 74 68 20 74 6f 20 61 6e 20 61 62 73 6f 6c 75 74  th to an absolut
28380 65 20 6f 6e 65 2e 20 2a 2f 0a 20 20 69 66 20 28  e one. */.  if (
28390 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69   sqlite3_data_di
283a0 72 65 63 74 6f 72 79 20 26 26 20 21 77 69 6e 49  rectory && !winI
283b0 73 56 65 72 62 61 74 69 6d 50 61 74 68 6e 61 6d  sVerbatimPathnam
283c0 65 28 7a 52 65 6c 61 74 69 76 65 29 20 29 7b 0a  e(zRelative) ){.
283d0 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 4e 4f      /*.    ** NO
283e0 54 45 3a 20 57 65 20 61 72 65 20 64 65 61 6c 69  TE: We are deali
283f0 6e 67 20 77 69 74 68 20 61 20 72 65 6c 61 74 69  ng with a relati
28400 76 65 20 70 61 74 68 20 6e 61 6d 65 20 61 6e 64  ve path name and
28410 20 74 68 65 20 64 61 74 61 0a 20 20 20 20 2a 2a   the data.    **
28420 20 20 20 20 20 20 20 64 69 72 65 63 74 6f 72 79         directory
28430 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20 20   has been set.  
28440 54 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69  Therefore, use i
28450 74 20 61 73 20 74 68 65 20 62 61 73 69 73 0a 20  t as the basis. 
28460 20 20 20 2a 2a 20 20 20 20 20 20 20 66 6f 72 20     **       for 
28470 63 6f 6e 76 65 72 74 69 6e 67 20 74 68 65 20 72  converting the r
28480 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61 6d  elative path nam
28490 65 20 74 6f 20 61 6e 20 61 62 73 6f 6c 75 74 65  e to an absolute
284a0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 6f 6e  .    **       on
284b0 65 20 62 79 20 70 72 65 70 65 6e 64 69 6e 67 20  e by prepending 
284c0 74 68 65 20 64 61 74 61 20 64 69 72 65 63 74 6f  the data directo
284d0 72 79 20 61 6e 64 20 61 20 62 61 63 6b 73 6c 61  ry and a backsla
284e0 73 68 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  sh..    */.    s
284f0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
28500 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d  MIN(nFull, pVfs-
28510 3e 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46  >mxPathname), zF
28520 75 6c 6c 2c 20 22 25 73 25 63 25 73 22 2c 0a 20  ull, "%s%c%s",. 
28530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28540 20 20 20 20 73 71 6c 69 74 65 33 5f 64 61 74 61      sqlite3_data
28550 5f 64 69 72 65 63 74 6f 72 79 2c 20 77 69 6e 47  _directory, winG
28560 65 74 44 69 72 53 65 70 28 29 2c 20 7a 52 65 6c  etDirSep(), zRel
28570 61 74 69 76 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  ative);.  }else{
28580 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
28590 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c  rintf(MIN(nFull,
285a0 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
285b0 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 22 2c  e), zFull, "%s",
285c0 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 7d   zRelative);.  }
285d0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
285e0 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66  _OK;.#endif..#if
285f0 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43   !SQLITE_OS_WINC
28600 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f  E && !SQLITE_OS_
28610 57 49 4e 52 54 20 26 26 20 21 64 65 66 69 6e 65  WINRT && !define
28620 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20  d(__CYGWIN__).  
28630 44 57 4f 52 44 20 6e 42 79 74 65 3b 0a 20 20 76  DWORD nByte;.  v
28640 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b  oid *zConverted;
28650 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74 3b 0a 0a  .  char *zOut;..
28660 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70 61 74    /* If this pat
28670 68 20 6e 61 6d 65 20 62 65 67 69 6e 73 20 77 69  h name begins wi
28680 74 68 20 22 2f 58 3a 22 2c 20 77 68 65 72 65 20  th "/X:", where 
28690 22 58 22 20 69 73 20 61 6e 79 20 61 6c 70 68 61  "X" is any alpha
286a0 62 65 74 69 63 0a 20 20 2a 2a 20 63 68 61 72 61  betic.  ** chara
286b0 63 74 65 72 2c 20 64 69 73 63 61 72 64 20 74 68  cter, discard th
286c0 65 20 69 6e 69 74 69 61 6c 20 22 2f 22 20 66 72  e initial "/" fr
286d0 6f 6d 20 74 68 65 20 70 61 74 68 6e 61 6d 65 2e  om the pathname.
286e0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 52 65 6c  .  */.  if( zRel
286f0 61 74 69 76 65 5b 30 5d 3d 3d 27 2f 27 20 26 26  ative[0]=='/' &&
28700 20 77 69 6e 49 73 44 72 69 76 65 4c 65 74 74 65   winIsDriveLette
28710 72 41 6e 64 43 6f 6c 6f 6e 28 7a 52 65 6c 61 74  rAndColon(zRelat
28720 69 76 65 2b 31 29 20 29 7b 0a 20 20 20 20 7a 52  ive+1) ){.    zR
28730 65 6c 61 74 69 76 65 2b 2b 3b 0a 20 20 7d 0a 0a  elative++;.  }..
28740 20 20 2f 2a 20 49 74 27 73 20 6f 64 64 20 74 6f    /* It's odd to
28750 20 73 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d   simulate an io-
28760 65 72 72 6f 72 20 68 65 72 65 2c 20 62 75 74 20  error here, but 
28770 72 65 61 6c 6c 79 20 74 68 69 73 20 69 73 20 6a  really this is j
28780 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74  ust.  ** using t
28790 68 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72  he io-error infr
287a0 61 73 74 72 75 63 74 75 72 65 20 74 6f 20 74 65  astructure to te
287b0 73 74 20 74 68 61 74 20 53 51 4c 69 74 65 20 68  st that SQLite h
287c0 61 6e 64 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a  andles this.  **
287d0 20 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e   function failin
287e0 67 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  g. This function
287f0 20 63 6f 75 6c 64 20 66 61 69 6c 20 69 66 2c 20   could fail if, 
28800 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65  for example, the
28810 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 77 6f  .  ** current wo
28820 72 6b 69 6e 67 20 64 69 72 65 63 74 6f 72 79 20  rking directory 
28830 68 61 73 20 62 65 65 6e 20 75 6e 6c 69 6e 6b 65  has been unlinke
28840 64 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61  d..  */.  Simula
28850 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
28860 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29  n SQLITE_ERROR )
28870 3b 0a 20 20 69 66 20 28 20 73 71 6c 69 74 65 33  ;.  if ( sqlite3
28880 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79 20  _data_directory 
28890 26 26 20 21 77 69 6e 49 73 56 65 72 62 61 74 69  && !winIsVerbati
288a0 6d 50 61 74 68 6e 61 6d 65 28 7a 52 65 6c 61 74  mPathname(zRelat
288b0 69 76 65 29 20 29 7b 0a 20 20 20 20 2f 2a 0a 20  ive) ){.    /*. 
288c0 20 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 65 20 61     ** NOTE: We a
288d0 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20  re dealing with 
288e0 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 20  a relative path 
288f0 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 64 61 74  name and the dat
28900 61 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 64  a.    **       d
28910 69 72 65 63 74 6f 72 79 20 68 61 73 20 62 65 65  irectory has bee
28920 6e 20 73 65 74 2e 20 20 54 68 65 72 65 66 6f 72  n set.  Therefor
28930 65 2c 20 75 73 65 20 69 74 20 61 73 20 74 68 65  e, use it as the
28940 20 62 61 73 69 73 0a 20 20 20 20 2a 2a 20 20 20   basis.    **   
28950 20 20 20 20 66 6f 72 20 63 6f 6e 76 65 72 74 69      for converti
28960 6e 67 20 74 68 65 20 72 65 6c 61 74 69 76 65 20  ng the relative 
28970 70 61 74 68 20 6e 61 6d 65 20 74 6f 20 61 6e 20  path name to an 
28980 61 62 73 6f 6c 75 74 65 0a 20 20 20 20 2a 2a 20  absolute.    ** 
28990 20 20 20 20 20 20 6f 6e 65 20 62 79 20 70 72 65        one by pre
289a0 70 65 6e 64 69 6e 67 20 74 68 65 20 64 61 74 61  pending the data
289b0 20 64 69 72 65 63 74 6f 72 79 20 61 6e 64 20 61   directory and a
289c0 20 62 61 63 6b 73 6c 61 73 68 2e 0a 20 20 20 20   backslash..    
289d0 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  */.    sqlite3_s
289e0 6e 70 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c  nprintf(MIN(nFul
289f0 6c 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  l, pVfs->mxPathn
28a00 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73  ame), zFull, "%s
28a10 25 63 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20  %c%s",.         
28a20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
28a30 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f  te3_data_directo
28a40 72 79 2c 20 77 69 6e 47 65 74 44 69 72 53 65 70  ry, winGetDirSep
28a50 28 29 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a  (), zRelative);.
28a60 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
28a70 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 7a 43 6f 6e  E_OK;.  }.  zCon
28a80 76 65 72 74 65 64 20 3d 20 77 69 6e 43 6f 6e 76  verted = winConv
28a90 65 72 74 46 72 6f 6d 55 74 66 38 46 69 6c 65 6e  ertFromUtf8Filen
28aa0 61 6d 65 28 7a 52 65 6c 61 74 69 76 65 29 3b 0a  ame(zRelative);.
28ab0 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64    if( zConverted
28ac0 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
28ad0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  n SQLITE_IOERR_N
28ae0 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20  OMEM;.  }.  if( 
28af0 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 20 20 20  osIsNT() ){.    
28b00 4c 50 57 53 54 52 20 7a 54 65 6d 70 3b 0a 20 20  LPWSTR zTemp;.  
28b10 20 20 6e 42 79 74 65 20 3d 20 6f 73 47 65 74 46    nByte = osGetF
28b20 75 6c 6c 50 61 74 68 4e 61 6d 65 57 28 28 4c 50  ullPathNameW((LP
28b30 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64  CWSTR)zConverted
28b40 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
28b50 69 66 28 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a  if( nByte==0 ){.
28b60 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
28b70 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
28b80 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e        return win
28b90 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
28ba0 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54  CANTOPEN_FULLPAT
28bb0 48 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f  H, osGetLastErro
28bc0 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  r(),.           
28bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
28be0 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 31 22  inFullPathname1"
28bf0 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20  , zRelative);.  
28c00 20 20 7d 0a 20 20 20 20 6e 42 79 74 65 20 2b 3d    }.    nByte +=
28c10 20 33 3b 0a 20 20 20 20 7a 54 65 6d 70 20 3d 20   3;.    zTemp = 
28c20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
28c30 6f 28 20 6e 42 79 74 65 2a 73 69 7a 65 6f 66 28  o( nByte*sizeof(
28c40 7a 54 65 6d 70 5b 30 5d 29 20 29 3b 0a 20 20 20  zTemp[0]) );.   
28c50 20 69 66 28 20 7a 54 65 6d 70 3d 3d 30 20 29 7b   if( zTemp==0 ){
28c60 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
28c70 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
28c80 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
28c90 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
28ca0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 42 79 74  ;.    }.    nByt
28cb0 65 20 3d 20 6f 73 47 65 74 46 75 6c 6c 50 61 74  e = osGetFullPat
28cc0 68 4e 61 6d 65 57 28 28 4c 50 43 57 53 54 52 29  hNameW((LPCWSTR)
28cd0 7a 43 6f 6e 76 65 72 74 65 64 2c 20 6e 42 79 74  zConverted, nByt
28ce0 65 2c 20 7a 54 65 6d 70 2c 20 30 29 3b 0a 20 20  e, zTemp, 0);.  
28cf0 20 20 69 66 28 20 6e 42 79 74 65 3d 3d 30 20 29    if( nByte==0 )
28d00 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
28d10 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
28d20 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
28d30 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20 20  free(zTemp);.   
28d40 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67     return winLog
28d50 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e  Error(SQLITE_CAN
28d60 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48 2c 20  TOPEN_FULLPATH, 
28d70 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
28d80 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
28d90 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 46             "winF
28da0 75 6c 6c 50 61 74 68 6e 61 6d 65 32 22 2c 20 7a  ullPathname2", z
28db0 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 20 20 7d  Relative);.    }
28dc0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
28dd0 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
28de0 20 20 20 7a 4f 75 74 20 3d 20 77 69 6e 55 6e 69     zOut = winUni
28df0 63 6f 64 65 54 6f 55 74 66 38 28 7a 54 65 6d 70  codeToUtf8(zTemp
28e00 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
28e10 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20 7d 0a  ree(zTemp);.  }.
28e20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49  #ifdef SQLITE_WI
28e30 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65  N32_HAS_ANSI.  e
28e40 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  lse{.    char *z
28e50 54 65 6d 70 3b 0a 20 20 20 20 6e 42 79 74 65 20  Temp;.    nByte 
28e60 3d 20 6f 73 47 65 74 46 75 6c 6c 50 61 74 68 4e  = osGetFullPathN
28e70 61 6d 65 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e  ameA((char*)zCon
28e80 76 65 72 74 65 64 2c 20 30 2c 20 30 2c 20 30 29  verted, 0, 0, 0)
28e90 3b 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65 3d  ;.    if( nByte=
28ea0 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
28eb0 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
28ec0 74 65 64 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ted);.      retu
28ed0 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53  rn winLogError(S
28ee0 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46  QLITE_CANTOPEN_F
28ef0 55 4c 4c 50 41 54 48 2c 20 6f 73 47 65 74 4c 61  ULLPATH, osGetLa
28f00 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20  stError(),.     
28f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28f20 20 20 20 20 22 77 69 6e 46 75 6c 6c 50 61 74 68      "winFullPath
28f30 6e 61 6d 65 33 22 2c 20 7a 52 65 6c 61 74 69 76  name3", zRelativ
28f40 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 42  e);.    }.    nB
28f50 79 74 65 20 2b 3d 20 33 3b 0a 20 20 20 20 7a 54  yte += 3;.    zT
28f60 65 6d 70 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  emp = sqlite3Mal
28f70 6c 6f 63 5a 65 72 6f 28 20 6e 42 79 74 65 2a 73  locZero( nByte*s
28f80 69 7a 65 6f 66 28 7a 54 65 6d 70 5b 30 5d 29 20  izeof(zTemp[0]) 
28f90 29 3b 0a 20 20 20 20 69 66 28 20 7a 54 65 6d 70  );.    if( zTemp
28fa0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
28fb0 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65  ite3_free(zConve
28fc0 72 74 65 64 29 3b 0a 20 20 20 20 20 20 72 65 74  rted);.      ret
28fd0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
28fe0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
28ff0 20 20 6e 42 79 74 65 20 3d 20 6f 73 47 65 74 46    nByte = osGetF
29000 75 6c 6c 50 61 74 68 4e 61 6d 65 41 28 28 63 68  ullPathNameA((ch
29010 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20  ar*)zConverted, 
29020 6e 42 79 74 65 2c 20 7a 54 65 6d 70 2c 20 30 29  nByte, zTemp, 0)
29030 3b 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65 3d  ;.    if( nByte=
29040 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
29050 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
29060 74 65 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ted);.      sqli
29070 74 65 33 5f 66 72 65 65 28 7a 54 65 6d 70 29 3b  te3_free(zTemp);
29080 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69  .      return wi
29090 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
290a0 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 41  _CANTOPEN_FULLPA
290b0 54 48 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72  TH, osGetLastErr
290c0 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20  or(),.          
290d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
290e0 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 34  winFullPathname4
290f0 22 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20  ", zRelative);. 
29100 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
29110 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
29120 29 3b 0a 20 20 20 20 7a 4f 75 74 20 3d 20 73 71  );.    zOut = sq
29130 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73  lite3_win32_mbcs
29140 5f 74 6f 5f 75 74 66 38 28 7a 54 65 6d 70 29 3b  _to_utf8(zTemp);
29150 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
29160 65 28 7a 54 65 6d 70 29 3b 0a 20 20 7d 0a 23 65  e(zTemp);.  }.#e
29170 6e 64 69 66 0a 20 20 69 66 28 20 7a 4f 75 74 20  ndif.  if( zOut 
29180 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ){.    sqlite3_s
29190 6e 70 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c  nprintf(MIN(nFul
291a0 6c 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  l, pVfs->mxPathn
291b0 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73  ame), zFull, "%s
291c0 22 2c 20 7a 4f 75 74 29 3b 0a 20 20 20 20 73 71  ", zOut);.    sq
291d0 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 75 74 29  lite3_free(zOut)
291e0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
291f0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b  ITE_OK;.  }else{
29200 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
29210 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a  TE_IOERR_NOMEM;.
29220 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 69    }.#endif.}..#i
29230 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
29240 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  T_LOAD_EXTENSION
29250 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65  ./*.** Interface
29260 73 20 66 6f 72 20 6f 70 65 6e 69 6e 67 20 61 20  s for opening a 
29270 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20  shared library, 
29280 66 69 6e 64 69 6e 67 20 65 6e 74 72 79 20 70 6f  finding entry po
29290 69 6e 74 73 0a 2a 2a 20 77 69 74 68 69 6e 20 74  ints.** within t
292a0 68 65 20 73 68 61 72 65 64 20 6c 69 62 72 61 72  he shared librar
292b0 79 2c 20 61 6e 64 20 63 6c 6f 73 69 6e 67 20 74  y, and closing t
292c0 68 65 20 73 68 61 72 65 64 20 6c 69 62 72 61 72  he shared librar
292d0 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  y..*/.static voi
292e0 64 20 2a 77 69 6e 44 6c 4f 70 65 6e 28 73 71 6c  d *winDlOpen(sql
292f0 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
29300 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
29310 65 6e 61 6d 65 29 7b 0a 20 20 48 41 4e 44 4c 45  ename){.  HANDLE
29320 20 68 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28   h;.#if defined(
29330 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20 69 6e  __CYGWIN__).  in
29340 74 20 6e 46 75 6c 6c 20 3d 20 70 56 66 73 2d 3e  t nFull = pVfs->
29350 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20  mxPathname+1;.  
29360 63 68 61 72 20 2a 7a 46 75 6c 6c 20 3d 20 73 71  char *zFull = sq
29370 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
29380 20 6e 46 75 6c 6c 20 29 3b 0a 20 20 76 6f 69 64   nFull );.  void
29390 20 2a 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 30   *zConverted = 0
293a0 3b 0a 20 20 69 66 28 20 7a 46 75 6c 6c 3d 3d 30  ;.  if( zFull==0
293b0 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28   ){.    OSTRACE(
293c0 28 22 44 4c 4f 50 45 4e 20 6e 61 6d 65 3d 25 73  ("DLOPEN name=%s
293d0 2c 20 68 61 6e 64 6c 65 3d 25 70 5c 6e 22 2c 20  , handle=%p\n", 
293e0 7a 46 69 6c 65 6e 61 6d 65 2c 20 28 76 6f 69 64  zFilename, (void
293f0 2a 29 30 29 29 3b 0a 20 20 20 20 72 65 74 75 72  *)0));.    retur
29400 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 77  n 0;.  }.  if( w
29410 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70  inFullPathname(p
29420 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20  Vfs, zFilename, 
29430 6e 46 75 6c 6c 2c 20 7a 46 75 6c 6c 29 21 3d 53  nFull, zFull)!=S
29440 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
29450 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75  sqlite3_free(zFu
29460 6c 6c 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45  ll);.    OSTRACE
29470 28 28 22 44 4c 4f 50 45 4e 20 6e 61 6d 65 3d 25  (("DLOPEN name=%
29480 73 2c 20 68 61 6e 64 6c 65 3d 25 70 5c 6e 22 2c  s, handle=%p\n",
29490 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 28 76 6f 69   zFilename, (voi
294a0 64 2a 29 30 29 29 3b 0a 20 20 20 20 72 65 74 75  d*)0));.    retu
294b0 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 43 6f 6e  rn 0;.  }.  zCon
294c0 76 65 72 74 65 64 20 3d 20 77 69 6e 43 6f 6e 76  verted = winConv
294d0 65 72 74 46 72 6f 6d 55 74 66 38 46 69 6c 65 6e  ertFromUtf8Filen
294e0 61 6d 65 28 7a 46 75 6c 6c 29 3b 0a 20 20 73 71  ame(zFull);.  sq
294f0 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c  lite3_free(zFull
29500 29 3b 0a 23 65 6c 73 65 0a 20 20 76 6f 69 64 20  );.#else.  void 
29510 2a 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77 69  *zConverted = wi
29520 6e 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66 38  nConvertFromUtf8
29530 46 69 6c 65 6e 61 6d 65 28 7a 46 69 6c 65 6e 61  Filename(zFilena
29540 6d 65 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  me);.  UNUSED_PA
29550 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 23  RAMETER(pVfs);.#
29560 65 6e 64 69 66 0a 20 20 69 66 28 20 7a 43 6f 6e  endif.  if( zCon
29570 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20  verted==0 ){.   
29580 20 4f 53 54 52 41 43 45 28 28 22 44 4c 4f 50 45   OSTRACE(("DLOPE
29590 4e 20 6e 61 6d 65 3d 25 73 2c 20 68 61 6e 64 6c  N name=%s, handl
295a0 65 3d 25 70 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61  e=%p\n", zFilena
295b0 6d 65 2c 20 28 76 6f 69 64 2a 29 30 29 29 3b 0a  me, (void*)0));.
295c0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
295d0 7d 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29  }.  if( osIsNT()
295e0 20 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f   ){.#if SQLITE_O
295f0 53 5f 57 49 4e 52 54 0a 20 20 20 20 68 20 3d 20  S_WINRT.    h = 
29600 6f 73 4c 6f 61 64 50 61 63 6b 61 67 65 64 4c 69  osLoadPackagedLi
29610 62 72 61 72 79 28 28 4c 50 43 57 53 54 52 29 7a  brary((LPCWSTR)z
29620 43 6f 6e 76 65 72 74 65 64 2c 20 30 29 3b 0a 23  Converted, 0);.#
29630 65 6c 73 65 0a 20 20 20 20 68 20 3d 20 6f 73 4c  else.    h = osL
29640 6f 61 64 4c 69 62 72 61 72 79 57 28 28 4c 50 43  oadLibraryW((LPC
29650 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 29  WSTR)zConverted)
29660 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 69 66  ;.#endif.  }.#if
29670 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  def SQLITE_WIN32
29680 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65  _HAS_ANSI.  else
29690 7b 0a 20 20 20 20 68 20 3d 20 6f 73 4c 6f 61 64  {.    h = osLoad
296a0 4c 69 62 72 61 72 79 41 28 28 63 68 61 72 2a 29  LibraryA((char*)
296b0 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 7d  zConverted);.  }
296c0 0a 23 65 6e 64 69 66 0a 20 20 4f 53 54 52 41 43  .#endif.  OSTRAC
296d0 45 28 28 22 44 4c 4f 50 45 4e 20 6e 61 6d 65 3d  E(("DLOPEN name=
296e0 25 73 2c 20 68 61 6e 64 6c 65 3d 25 70 5c 6e 22  %s, handle=%p\n"
296f0 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 28 76 6f  , zFilename, (vo
29700 69 64 2a 29 68 29 29 3b 0a 20 20 73 71 6c 69 74  id*)h));.  sqlit
29710 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74  e3_free(zConvert
29720 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 76  ed);.  return (v
29730 6f 69 64 2a 29 68 3b 0a 7d 0a 73 74 61 74 69 63  oid*)h;.}.static
29740 20 76 6f 69 64 20 77 69 6e 44 6c 45 72 72 6f 72   void winDlError
29750 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56  (sqlite3_vfs *pV
29760 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68  fs, int nBuf, ch
29770 61 72 20 2a 7a 42 75 66 4f 75 74 29 7b 0a 20 20  ar *zBufOut){.  
29780 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
29790 28 70 56 66 73 29 3b 0a 20 20 77 69 6e 47 65 74  (pVfs);.  winGet
297a0 4c 61 73 74 45 72 72 6f 72 4d 73 67 28 6f 73 47  LastErrorMsg(osG
297b0 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 6e  etLastError(), n
297c0 42 75 66 2c 20 7a 42 75 66 4f 75 74 29 3b 0a 7d  Buf, zBufOut);.}
297d0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 28 2a 77  .static void (*w
297e0 69 6e 44 6c 53 79 6d 28 73 71 6c 69 74 65 33 5f  inDlSym(sqlite3_
297f0 76 66 73 20 2a 70 56 66 73 2c 76 6f 69 64 20 2a  vfs *pVfs,void *
29800 70 48 2c 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  pH,const char *z
29810 53 79 6d 29 29 28 76 6f 69 64 29 7b 0a 20 20 46  Sym))(void){.  F
29820 41 52 50 52 4f 43 20 70 72 6f 63 3b 0a 20 20 55  ARPROC proc;.  U
29830 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
29840 70 56 66 73 29 3b 0a 20 20 70 72 6f 63 20 3d 20  pVfs);.  proc = 
29850 6f 73 47 65 74 50 72 6f 63 41 64 64 72 65 73 73  osGetProcAddress
29860 41 28 28 48 41 4e 44 4c 45 29 70 48 2c 20 7a 53  A((HANDLE)pH, zS
29870 79 6d 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  ym);.  OSTRACE((
29880 22 44 4c 53 59 4d 20 68 61 6e 64 6c 65 3d 25 70  "DLSYM handle=%p
29890 2c 20 73 79 6d 62 6f 6c 3d 25 73 2c 20 61 64 64  , symbol=%s, add
298a0 72 65 73 73 3d 25 70 5c 6e 22 2c 0a 20 20 20 20  ress=%p\n",.    
298b0 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70 48         (void*)pH
298c0 2c 20 7a 53 79 6d 2c 20 28 76 6f 69 64 2a 29 70  , zSym, (void*)p
298d0 72 6f 63 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  roc));.  return 
298e0 28 76 6f 69 64 28 2a 29 28 76 6f 69 64 29 29 70  (void(*)(void))p
298f0 72 6f 63 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  roc;.}.static vo
29900 69 64 20 77 69 6e 44 6c 43 6c 6f 73 65 28 73 71  id winDlClose(sq
29910 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
29920 20 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65 29 7b   void *pHandle){
29930 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
29940 54 45 52 28 70 56 66 73 29 3b 0a 20 20 6f 73 46  TER(pVfs);.  osF
29950 72 65 65 4c 69 62 72 61 72 79 28 28 48 41 4e 44  reeLibrary((HAND
29960 4c 45 29 70 48 61 6e 64 6c 65 29 3b 0a 20 20 4f  LE)pHandle);.  O
29970 53 54 52 41 43 45 28 28 22 44 4c 43 4c 4f 53 45  STRACE(("DLCLOSE
29980 20 68 61 6e 64 6c 65 3d 25 70 5c 6e 22 2c 20 28   handle=%p\n", (
29990 76 6f 69 64 2a 29 70 48 61 6e 64 6c 65 29 29 3b  void*)pHandle));
299a0 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 53  .}.#else /* if S
299b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f  QLITE_OMIT_LOAD_
299c0 45 58 54 45 4e 53 49 4f 4e 20 69 73 20 64 65 66  EXTENSION is def
299d0 69 6e 65 64 3a 20 2a 2f 0a 20 20 23 64 65 66 69  ined: */.  #defi
299e0 6e 65 20 77 69 6e 44 6c 4f 70 65 6e 20 20 30 0a  ne winDlOpen  0.
299f0 20 20 23 64 65 66 69 6e 65 20 77 69 6e 44 6c 45    #define winDlE
29a00 72 72 6f 72 20 30 0a 20 20 23 64 65 66 69 6e 65  rror 0.  #define
29a10 20 77 69 6e 44 6c 53 79 6d 20 20 20 30 0a 20 20   winDlSym   0.  
29a20 23 64 65 66 69 6e 65 20 77 69 6e 44 6c 43 6c 6f  #define winDlClo
29a30 73 65 20 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a  se 0.#endif.../*
29a40 0a 2a 2a 20 57 72 69 74 65 20 75 70 20 74 6f 20  .** Write up to 
29a50 6e 42 75 66 20 62 79 74 65 73 20 6f 66 20 72 61  nBuf bytes of ra
29a60 6e 64 6f 6d 6e 65 73 73 20 69 6e 74 6f 20 7a 42  ndomness into zB
29a70 75 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  uf..*/.static in
29a80 74 20 77 69 6e 52 61 6e 64 6f 6d 6e 65 73 73 28  t winRandomness(
29a90 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
29aa0 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61  s, int nBuf, cha
29ab0 72 20 2a 7a 42 75 66 29 7b 0a 20 20 69 6e 74 20  r *zBuf){.  int 
29ac0 6e 20 3d 20 30 3b 0a 20 20 55 4e 55 53 45 44 5f  n = 0;.  UNUSED_
29ad0 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b  PARAMETER(pVfs);
29ae0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
29af0 49 54 45 5f 54 45 53 54 29 0a 20 20 6e 20 3d 20  ITE_TEST).  n = 
29b00 6e 42 75 66 3b 0a 20 20 6d 65 6d 73 65 74 28 7a  nBuf;.  memset(z
29b10 42 75 66 2c 20 30 2c 20 6e 42 75 66 29 3b 0a 23  Buf, 0, nBuf);.#
29b20 65 6c 73 65 0a 20 20 69 66 28 20 73 69 7a 65 6f  else.  if( sizeo
29b30 66 28 53 59 53 54 45 4d 54 49 4d 45 29 3c 3d 6e  f(SYSTEMTIME)<=n
29b40 42 75 66 2d 6e 20 29 7b 0a 20 20 20 20 53 59 53  Buf-n ){.    SYS
29b50 54 45 4d 54 49 4d 45 20 78 3b 0a 20 20 20 20 6f  TEMTIME x;.    o
29b60 73 47 65 74 53 79 73 74 65 6d 54 69 6d 65 28 26  sGetSystemTime(&
29b70 78 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  x);.    memcpy(&
29b80 7a 42 75 66 5b 6e 5d 2c 20 26 78 2c 20 73 69 7a  zBuf[n], &x, siz
29b90 65 6f 66 28 78 29 29 3b 0a 20 20 20 20 6e 20 2b  eof(x));.    n +
29ba0 3d 20 73 69 7a 65 6f 66 28 78 29 3b 0a 20 20 7d  = sizeof(x);.  }
29bb0 0a 20 20 69 66 28 20 73 69 7a 65 6f 66 28 44 57  .  if( sizeof(DW
29bc0 4f 52 44 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a  ORD)<=nBuf-n ){.
29bd0 20 20 20 20 44 57 4f 52 44 20 70 69 64 20 3d 20      DWORD pid = 
29be0 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
29bf0 65 73 73 49 64 28 29 3b 0a 20 20 20 20 6d 65 6d  essId();.    mem
29c00 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 70  cpy(&zBuf[n], &p
29c10 69 64 2c 20 73 69 7a 65 6f 66 28 70 69 64 29 29  id, sizeof(pid))
29c20 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f  ;.    n += sizeo
29c30 66 28 70 69 64 29 3b 0a 20 20 7d 0a 23 69 66 20  f(pid);.  }.#if 
29c40 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
29c50 20 20 69 66 28 20 73 69 7a 65 6f 66 28 55 4c 4f    if( sizeof(ULO
29c60 4e 47 4c 4f 4e 47 29 3c 3d 6e 42 75 66 2d 6e 20  NGLONG)<=nBuf-n 
29c70 29 7b 0a 20 20 20 20 55 4c 4f 4e 47 4c 4f 4e 47  ){.    ULONGLONG
29c80 20 63 6e 74 20 3d 20 6f 73 47 65 74 54 69 63 6b   cnt = osGetTick
29c90 43 6f 75 6e 74 36 34 28 29 3b 0a 20 20 20 20 6d  Count64();.    m
29ca0 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20  emcpy(&zBuf[n], 
29cb0 26 63 6e 74 2c 20 73 69 7a 65 6f 66 28 63 6e 74  &cnt, sizeof(cnt
29cc0 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a  ));.    n += siz
29cd0 65 6f 66 28 63 6e 74 29 3b 0a 20 20 7d 0a 23 65  eof(cnt);.  }.#e
29ce0 6c 73 65 0a 20 20 69 66 28 20 73 69 7a 65 6f 66  lse.  if( sizeof
29cf0 28 44 57 4f 52 44 29 3c 3d 6e 42 75 66 2d 6e 20  (DWORD)<=nBuf-n 
29d00 29 7b 0a 20 20 20 20 44 57 4f 52 44 20 63 6e 74  ){.    DWORD cnt
29d10 20 3d 20 6f 73 47 65 74 54 69 63 6b 43 6f 75 6e   = osGetTickCoun
29d20 74 28 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  t();.    memcpy(
29d30 26 7a 42 75 66 5b 6e 5d 2c 20 26 63 6e 74 2c 20  &zBuf[n], &cnt, 
29d40 73 69 7a 65 6f 66 28 63 6e 74 29 29 3b 0a 20 20  sizeof(cnt));.  
29d50 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 63 6e    n += sizeof(cn
29d60 74 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  t);.  }.#endif. 
29d70 20 69 66 28 20 73 69 7a 65 6f 66 28 4c 41 52 47   if( sizeof(LARG
29d80 45 5f 49 4e 54 45 47 45 52 29 3c 3d 6e 42 75 66  E_INTEGER)<=nBuf
29d90 2d 6e 20 29 7b 0a 20 20 20 20 4c 41 52 47 45 5f  -n ){.    LARGE_
29da0 49 4e 54 45 47 45 52 20 69 3b 0a 20 20 20 20 6f  INTEGER i;.    o
29db0 73 51 75 65 72 79 50 65 72 66 6f 72 6d 61 6e 63  sQueryPerformanc
29dc0 65 43 6f 75 6e 74 65 72 28 26 69 29 3b 0a 20 20  eCounter(&i);.  
29dd0 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e    memcpy(&zBuf[n
29de0 5d 2c 20 26 69 2c 20 73 69 7a 65 6f 66 28 69 29  ], &i, sizeof(i)
29df0 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65  );.    n += size
29e00 6f 66 28 69 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  of(i);.  }.#endi
29e10 66 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  f.  return n;.}.
29e20 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f  ../*.** Sleep fo
29e30 72 20 61 20 6c 69 74 74 6c 65 20 77 68 69 6c 65  r a little while
29e40 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 61 6d  .  Return the am
29e50 6f 75 6e 74 20 6f 66 20 74 69 6d 65 20 73 6c 65  ount of time sle
29e60 70 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  pt..*/.static in
29e70 74 20 77 69 6e 53 6c 65 65 70 28 73 71 6c 69 74  t winSleep(sqlit
29e80 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e  e3_vfs *pVfs, in
29e90 74 20 6d 69 63 72 6f 73 65 63 29 7b 0a 20 20 73  t microsec){.  s
29ea0 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65  qlite3_win32_sle
29eb0 65 70 28 28 6d 69 63 72 6f 73 65 63 2b 39 39 39  ep((microsec+999
29ec0 29 2f 31 30 30 30 29 3b 0a 20 20 55 4e 55 53 45  )/1000);.  UNUSE
29ed0 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73  D_PARAMETER(pVfs
29ee0 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 28 6d 69  );.  return ((mi
29ef0 63 72 6f 73 65 63 2b 39 39 39 29 2f 31 30 30 30  crosec+999)/1000
29f00 29 2a 31 30 30 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  )*1000;.}../*.**
29f10 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76   The following v
29f20 61 72 69 61 62 6c 65 2c 20 69 66 20 73 65 74 20  ariable, if set 
29f30 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61  to a non-zero va
29f40 6c 75 65 2c 20 69 73 20 69 6e 74 65 72 70 72 65  lue, is interpre
29f50 74 65 64 20 61 73 0a 2a 2a 20 74 68 65 20 6e 75  ted as.** the nu
29f60 6d 62 65 72 20 6f 66 20 73 65 63 6f 6e 64 73 20  mber of seconds 
29f70 73 69 6e 63 65 20 31 39 37 30 20 61 6e 64 20 69  since 1970 and i
29f80 73 20 75 73 65 64 20 74 6f 20 73 65 74 20 74 68  s used to set th
29f90 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 73  e result of.** s
29fa0 71 6c 69 74 65 33 4f 73 43 75 72 72 65 6e 74 54  qlite3OsCurrentT
29fb0 69 6d 65 28 29 20 64 75 72 69 6e 67 20 74 65 73  ime() during tes
29fc0 74 69 6e 67 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  ting..*/.#ifdef 
29fd0 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20  SQLITE_TEST.int 
29fe0 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f  sqlite3_current_
29ff0 74 69 6d 65 20 3d 20 30 3b 20 20 2f 2a 20 46 61  time = 0;  /* Fa
2a000 6b 65 20 73 79 73 74 65 6d 20 74 69 6d 65 20 69  ke system time i
2a010 6e 20 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20  n seconds since 
2a020 31 39 37 30 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a  1970. */.#endif.
2a030 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20  ./*.** Find the 
2a040 63 75 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e  current time (in
2a050 20 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64   Universal Coord
2a060 69 6e 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57  inated Time).  W
2a070 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77  rite into *piNow
2a080 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20  .** the current 
2a090 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73  time and date as
2a0a0 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75   a Julian Day nu
2a0b0 6d 62 65 72 20 74 69 6d 65 73 20 38 36 5f 34 30  mber times 86_40
2a0c0 30 5f 30 30 30 2e 20 20 49 6e 0a 2a 2a 20 6f 74  0_000.  In.** ot
2a0d0 68 65 72 20 77 6f 72 64 73 2c 20 77 72 69 74 65  her words, write
2a0e0 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 20 74 68 65   into *piNow the
2a0f0 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69   number of milli
2a100 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 74 68  seconds since th
2a110 65 20 4a 75 6c 69 61 6e 0a 2a 2a 20 65 70 6f 63  e Julian.** epoc
2a120 68 20 6f 66 20 6e 6f 6f 6e 20 69 6e 20 47 72 65  h of noon in Gre
2a130 65 6e 77 69 63 68 20 6f 6e 20 4e 6f 76 65 6d 62  enwich on Novemb
2a140 65 72 20 32 34 2c 20 34 37 31 34 20 42 2e 43 20  er 24, 4714 B.C 
2a150 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65  according to the
2a160 0a 2a 2a 20 70 72 6f 6c 65 70 74 69 63 20 47 72  .** proleptic Gr
2a170 65 67 6f 72 69 61 6e 20 63 61 6c 65 6e 64 61 72  egorian calendar
2a180 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65  ..**.** On succe
2a190 73 73 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ss, return SQLIT
2a1a0 45 5f 4f 4b 2e 20 20 52 65 74 75 72 6e 20 53 51  E_OK.  Return SQ
2a1b0 4c 49 54 45 5f 45 52 52 4f 52 20 69 66 20 74 68  LITE_ERROR if th
2a1c0 65 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 0a  e time and date.
2a1d0 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75  ** cannot be fou
2a1e0 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nd..*/.static in
2a1f0 74 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65  t winCurrentTime
2a200 49 6e 74 36 34 28 73 71 6c 69 74 65 33 5f 76 66  Int64(sqlite3_vf
2a210 73 20 2a 70 56 66 73 2c 20 73 71 6c 69 74 65 33  s *pVfs, sqlite3
2a220 5f 69 6e 74 36 34 20 2a 70 69 4e 6f 77 29 7b 0a  _int64 *piNow){.
2a230 20 20 2f 2a 20 46 49 4c 45 54 49 4d 45 20 73 74    /* FILETIME st
2a240 72 75 63 74 75 72 65 20 69 73 20 61 20 36 34 2d  ructure is a 64-
2a250 62 69 74 20 76 61 6c 75 65 20 72 65 70 72 65 73  bit value repres
2a260 65 6e 74 69 6e 67 20 74 68 65 20 6e 75 6d 62 65  enting the numbe
2a270 72 20 6f 66 0a 20 20 20 20 20 31 30 30 2d 6e 61  r of.     100-na
2a280 6e 6f 73 65 63 6f 6e 64 20 69 6e 74 65 72 76 61  nosecond interva
2a290 6c 73 20 73 69 6e 63 65 20 4a 61 6e 75 61 72 79  ls since January
2a2a0 20 31 2c 20 31 36 30 31 20 28 3d 20 4a 44 20 32   1, 1601 (= JD 2
2a2b0 33 30 35 38 31 33 2e 35 29 2e 0a 20 20 2a 2f 0a  305813.5)..  */.
2a2c0 20 20 46 49 4c 45 54 49 4d 45 20 66 74 3b 0a 20    FILETIME ft;. 
2a2d0 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71   static const sq
2a2e0 6c 69 74 65 33 5f 69 6e 74 36 34 20 77 69 6e 46  lite3_int64 winF
2a2f0 69 6c 65 74 69 6d 65 45 70 6f 63 68 20 3d 20 32  iletimeEpoch = 2
2a300 33 30 35 38 31 33 35 2a 28 73 71 6c 69 74 65 33  3058135*(sqlite3
2a310 5f 69 6e 74 36 34 29 38 36 34 30 30 30 30 3b 0a  _int64)8640000;.
2a320 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
2a330 53 54 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  ST.  static cons
2a340 74 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  t sqlite3_int64 
2a350 75 6e 69 78 45 70 6f 63 68 20 3d 20 32 34 34 30  unixEpoch = 2440
2a360 35 38 37 35 2a 28 73 71 6c 69 74 65 33 5f 69 6e  5875*(sqlite3_in
2a370 74 36 34 29 38 36 34 30 30 30 30 3b 0a 23 65 6e  t64)8640000;.#en
2a380 64 69 66 0a 20 20 2f 2a 20 32 5e 33 32 20 2d 20  dif.  /* 2^32 - 
2a390 74 6f 20 61 76 6f 69 64 20 75 73 65 20 6f 66 20  to avoid use of 
2a3a0 4c 4c 20 61 6e 64 20 77 61 72 6e 69 6e 67 73 20  LL and warnings 
2a3b0 69 6e 20 67 63 63 20 2a 2f 0a 20 20 73 74 61 74  in gcc */.  stat
2a3c0 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
2a3d0 5f 69 6e 74 36 34 20 6d 61 78 33 32 42 69 74 56  _int64 max32BitV
2a3e0 61 6c 75 65 20 3d 0a 20 20 20 20 20 20 28 73 71  alue =.      (sq
2a3f0 6c 69 74 65 33 5f 69 6e 74 36 34 29 32 30 30 30  lite3_int64)2000
2a400 30 30 30 30 30 30 20 2b 20 28 73 71 6c 69 74 65  000000 + (sqlite
2a410 33 5f 69 6e 74 36 34 29 32 30 30 30 30 30 30 30  3_int64)20000000
2a420 30 30 20 2b 0a 20 20 20 20 20 20 28 73 71 6c 69  00 +.      (sqli
2a430 74 65 33 5f 69 6e 74 36 34 29 32 39 34 39 36 37  te3_int64)294967
2a440 32 39 36 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45  296;..#if SQLITE
2a450 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 53 59 53 54  _OS_WINCE.  SYST
2a460 45 4d 54 49 4d 45 20 74 69 6d 65 3b 0a 20 20 6f  EMTIME time;.  o
2a470 73 47 65 74 53 79 73 74 65 6d 54 69 6d 65 28 26  sGetSystemTime(&
2a480 74 69 6d 65 29 3b 0a 20 20 2f 2a 20 69 66 20 53  time);.  /* if S
2a490 79 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54  ystemTimeToFileT
2a4a0 69 6d 65 28 29 20 66 61 69 6c 73 2c 20 69 74 20  ime() fails, it 
2a4b0 72 65 74 75 72 6e 73 20 7a 65 72 6f 2e 20 2a 2f  returns zero. */
2a4c0 0a 20 20 69 66 20 28 21 6f 73 53 79 73 74 65 6d  .  if (!osSystem
2a4d0 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65 28 26  TimeToFileTime(&
2a4e0 74 69 6d 65 2c 26 66 74 29 29 7b 0a 20 20 20 20  time,&ft)){.    
2a4f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
2a500 52 4f 52 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20  ROR;.  }.#else. 
2a510 20 6f 73 47 65 74 53 79 73 74 65 6d 54 69 6d 65   osGetSystemTime
2a520 41 73 46 69 6c 65 54 69 6d 65 28 20 26 66 74 20  AsFileTime( &ft 
2a530 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2a 70 69  );.#endif..  *pi
2a540 4e 6f 77 20 3d 20 77 69 6e 46 69 6c 65 74 69 6d  Now = winFiletim
2a550 65 45 70 6f 63 68 20 2b 0a 20 20 20 20 20 20 20  eEpoch +.       
2a560 20 20 20 20 20 28 28 28 28 73 71 6c 69 74 65 33       ((((sqlite3
2a570 5f 69 6e 74 36 34 29 66 74 2e 64 77 48 69 67 68  _int64)ft.dwHigh
2a580 44 61 74 65 54 69 6d 65 29 2a 6d 61 78 33 32 42  DateTime)*max32B
2a590 69 74 56 61 6c 75 65 29 20 2b 0a 20 20 20 20 20  itValue) +.     
2a5a0 20 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74            (sqlit
2a5b0 65 33 5f 69 6e 74 36 34 29 66 74 2e 64 77 4c 6f  e3_int64)ft.dwLo
2a5c0 77 44 61 74 65 54 69 6d 65 29 2f 28 73 71 6c 69  wDateTime)/(sqli
2a5d0 74 65 33 5f 69 6e 74 36 34 29 31 30 30 30 30 3b  te3_int64)10000;
2a5e0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
2a5f0 54 45 53 54 0a 20 20 69 66 28 20 73 71 6c 69 74  TEST.  if( sqlit
2a600 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20  e3_current_time 
2a610 29 7b 0a 20 20 20 20 2a 70 69 4e 6f 77 20 3d 20  ){.    *piNow = 
2a620 31 30 30 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e  1000*(sqlite3_in
2a630 74 36 34 29 73 71 6c 69 74 65 33 5f 63 75 72 72  t64)sqlite3_curr
2a640 65 6e 74 5f 74 69 6d 65 20 2b 20 75 6e 69 78 45  ent_time + unixE
2a650 70 6f 63 68 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  poch;.  }.#endif
2a660 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
2a670 54 45 52 28 70 56 66 73 29 3b 0a 20 20 72 65 74  TER(pVfs);.  ret
2a680 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
2a690 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65  ../*.** Find the
2a6a0 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 28 69   current time (i
2a6b0 6e 20 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72  n Universal Coor
2a6c0 64 69 6e 61 74 65 64 20 54 69 6d 65 29 2e 20 20  dinated Time).  
2a6d0 57 72 69 74 65 20 74 68 65 0a 2a 2a 20 63 75 72  Write the.** cur
2a6e0 72 65 6e 74 20 74 69 6d 65 20 61 6e 64 20 64 61  rent time and da
2a6f0 74 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44  te as a Julian D
2a700 61 79 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a  ay number into *
2a710 70 72 4e 6f 77 20 61 6e 64 0a 2a 2a 20 72 65 74  prNow and.** ret
2a720 75 72 6e 20 30 2e 20 20 52 65 74 75 72 6e 20 31  urn 0.  Return 1
2a730 20 69 66 20 74 68 65 20 74 69 6d 65 20 61 6e 64   if the time and
2a740 20 64 61 74 65 20 63 61 6e 6e 6f 74 20 62 65 20   date cannot be 
2a750 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  found..*/.static
2a760 20 69 6e 74 20 77 69 6e 43 75 72 72 65 6e 74 54   int winCurrentT
2a770 69 6d 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ime(sqlite3_vfs 
2a780 2a 70 56 66 73 2c 20 64 6f 75 62 6c 65 20 2a 70  *pVfs, double *p
2a790 72 4e 6f 77 29 7b 0a 20 20 69 6e 74 20 72 63 3b  rNow){.  int rc;
2a7a0 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
2a7b0 20 69 3b 0a 20 20 72 63 20 3d 20 77 69 6e 43 75   i;.  rc = winCu
2a7c0 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 70  rrentTimeInt64(p
2a7d0 56 66 73 2c 20 26 69 29 3b 0a 20 20 69 66 28 20  Vfs, &i);.  if( 
2a7e0 21 72 63 20 29 7b 0a 20 20 20 20 2a 70 72 4e 6f  !rc ){.    *prNo
2a7f0 77 20 3d 20 69 2f 38 36 34 30 30 30 30 30 2e 30  w = i/86400000.0
2a800 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
2a810 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  c;.}../*.** The 
2a820 69 64 65 61 20 69 73 20 74 68 61 74 20 74 68 69  idea is that thi
2a830 73 20 66 75 6e 63 74 69 6f 6e 20 77 6f 72 6b 73  s function works
2a840 20 6c 69 6b 65 20 61 20 63 6f 6d 62 69 6e 61 74   like a combinat
2a850 69 6f 6e 20 6f 66 0a 2a 2a 20 47 65 74 4c 61 73  ion of.** GetLas
2a860 74 45 72 72 6f 72 28 29 20 61 6e 64 20 46 6f 72  tError() and For
2a870 6d 61 74 4d 65 73 73 61 67 65 28 29 20 6f 6e 20  matMessage() on 
2a880 57 69 6e 64 6f 77 73 20 28 6f 72 20 65 72 72 6e  Windows (or errn
2a890 6f 20 61 6e 64 0a 2a 2a 20 73 74 72 65 72 72 6f  o and.** strerro
2a8a0 72 5f 72 28 29 20 6f 6e 20 55 6e 69 78 29 2e 20  r_r() on Unix). 
2a8b0 41 66 74 65 72 20 61 6e 20 65 72 72 6f 72 20 69  After an error i
2a8c0 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 61 6e  s returned by an
2a8d0 20 4f 53 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2c   OS.** function,
2a8e0 20 53 51 4c 69 74 65 20 63 61 6c 6c 73 20 74 68   SQLite calls th
2a8f0 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68  is function with
2a900 20 7a 42 75 66 20 70 6f 69 6e 74 69 6e 67 20 74   zBuf pointing t
2a910 6f 0a 2a 2a 20 61 20 62 75 66 66 65 72 20 6f 66  o.** a buffer of
2a920 20 6e 42 75 66 20 62 79 74 65 73 2e 20 54 68 65   nBuf bytes. The
2a930 20 4f 53 20 6c 61 79 65 72 20 73 68 6f 75 6c 64   OS layer should
2a940 20 70 6f 70 75 6c 61 74 65 20 74 68 65 0a 2a 2a   populate the.**
2a950 20 62 75 66 66 65 72 20 77 69 74 68 20 61 20 6e   buffer with a n
2a960 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 55 54  ul-terminated UT
2a970 46 2d 38 20 65 6e 63 6f 64 65 64 20 65 72 72 6f  F-8 encoded erro
2a980 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 64 65 73  r message.** des
2a990 63 72 69 62 69 6e 67 20 74 68 65 20 6c 61 73 74  cribing the last
2a9a0 20 49 4f 20 65 72 72 6f 72 20 74 6f 20 68 61 76   IO error to hav
2a9b0 65 20 6f 63 63 75 72 72 65 64 20 77 69 74 68 69  e occurred withi
2a9c0 6e 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a  n the calling.**
2a9d0 20 74 68 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49   thread..**.** I
2a9e0 66 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73  f the error mess
2a9f0 61 67 65 20 69 73 20 74 6f 6f 20 6c 61 72 67 65  age is too large
2aa00 20 66 6f 72 20 74 68 65 20 73 75 70 70 6c 69 65   for the supplie
2aa10 64 20 62 75 66 66 65 72 2c 0a 2a 2a 20 69 74 20  d buffer,.** it 
2aa20 73 68 6f 75 6c 64 20 62 65 20 74 72 75 6e 63 61  should be trunca
2aa30 74 65 64 2e 20 54 68 65 20 72 65 74 75 72 6e 20  ted. The return 
2aa40 76 61 6c 75 65 20 6f 66 20 78 47 65 74 4c 61 73  value of xGetLas
2aa50 74 45 72 72 6f 72 0a 2a 2a 20 69 73 20 7a 65 72  tError.** is zer
2aa60 6f 20 69 66 20 74 68 65 20 65 72 72 6f 72 20 6d  o if the error m
2aa70 65 73 73 61 67 65 20 66 69 74 73 20 69 6e 20 74  essage fits in t
2aa80 68 65 20 62 75 66 66 65 72 2c 20 6f 72 20 6e 6f  he buffer, or no
2aa90 6e 2d 7a 65 72 6f 0a 2a 2a 20 6f 74 68 65 72 77  n-zero.** otherw
2aaa0 69 73 65 20 28 69 66 20 74 68 65 20 6d 65 73 73  ise (if the mess
2aab0 61 67 65 20 77 61 73 20 74 72 75 6e 63 61 74 65  age was truncate
2aac0 64 29 2e 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20  d). If non-zero 
2aad0 69 73 20 72 65 74 75 72 6e 65 64 2c 0a 2a 2a 20  is returned,.** 
2aae0 74 68 65 6e 20 69 74 20 69 73 20 6e 6f 74 20 6e  then it is not n
2aaf0 65 63 65 73 73 61 72 79 20 74 6f 20 69 6e 63 6c  ecessary to incl
2ab00 75 64 65 20 74 68 65 20 6e 75 6c 2d 74 65 72 6d  ude the nul-term
2ab10 69 6e 61 74 6f 72 20 63 68 61 72 61 63 74 65 72  inator character
2ab20 0a 2a 2a 20 69 6e 20 74 68 65 20 6f 75 74 70 75  .** in the outpu
2ab30 74 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20  t buffer..**.** 
2ab40 4e 6f 74 20 73 75 70 70 6c 79 69 6e 67 20 61 6e  Not supplying an
2ab50 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77   error message w
2ab60 69 6c 6c 20 68 61 76 65 20 6e 6f 20 61 64 76 65  ill have no adve
2ab70 72 73 65 20 65 66 66 65 63 74 0a 2a 2a 20 6f 6e  rse effect.** on
2ab80 20 53 51 4c 69 74 65 2e 20 49 74 20 69 73 20 66   SQLite. It is f
2ab90 69 6e 65 20 74 6f 20 68 61 76 65 20 61 6e 20 69  ine to have an i
2aba0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 74 68  mplementation th
2abb0 61 74 20 6e 65 76 65 72 0a 2a 2a 20 72 65 74 75  at never.** retu
2abc0 72 6e 73 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  rns an error mes
2abd0 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 6e  sage:.**.**   in
2abe0 74 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72 28  t xGetLastError(
2abf0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
2ac00 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61  s, int nBuf, cha
2ac10 72 20 2a 7a 42 75 66 29 7b 0a 2a 2a 20 20 20 20  r *zBuf){.**    
2ac20 20 61 73 73 65 72 74 28 7a 42 75 66 5b 30 5d 3d   assert(zBuf[0]=
2ac30 3d 27 5c 30 27 29 3b 0a 2a 2a 20 20 20 20 20 72  ='\0');.**     r
2ac40 65 74 75 72 6e 20 30 3b 0a 2a 2a 20 20 20 7d 0a  eturn 0;.**   }.
2ac50 2a 2a 0a 2a 2a 20 48 6f 77 65 76 65 72 20 69 66  **.** However if
2ac60 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
2ac70 65 20 69 73 20 73 75 70 70 6c 69 65 64 2c 20 69  e is supplied, i
2ac80 74 20 77 69 6c 6c 20 62 65 20 69 6e 63 6f 72 70  t will be incorp
2ac90 6f 72 61 74 65 64 0a 2a 2a 20 62 79 20 73 71 6c  orated.** by sql
2aca0 69 74 65 20 69 6e 74 6f 20 74 68 65 20 65 72 72  ite into the err
2acb0 6f 72 20 6d 65 73 73 61 67 65 20 61 76 61 69 6c  or message avail
2acc0 61 62 6c 65 20 74 6f 20 74 68 65 20 75 73 65 72  able to the user
2acd0 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65   using.** sqlite
2ace0 33 5f 65 72 72 6d 73 67 28 29 2c 20 70 6f 73 73  3_errmsg(), poss
2acf0 69 62 6c 79 20 6d 61 6b 69 6e 67 20 49 4f 20 65  ibly making IO e
2ad00 72 72 6f 72 73 20 65 61 73 69 65 72 20 74 6f 20  rrors easier to 
2ad10 64 65 62 75 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  debug..*/.static
2ad20 20 69 6e 74 20 77 69 6e 47 65 74 4c 61 73 74 45   int winGetLastE
2ad30 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73  rror(sqlite3_vfs
2ad40 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 75 66   *pVfs, int nBuf
2ad50 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20  , char *zBuf){. 
2ad60 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
2ad70 52 28 70 56 66 73 29 3b 0a 20 20 72 65 74 75 72  R(pVfs);.  retur
2ad80 6e 20 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f  n winGetLastErro
2ad90 72 4d 73 67 28 6f 73 47 65 74 4c 61 73 74 45 72  rMsg(osGetLastEr
2ada0 72 6f 72 28 29 2c 20 6e 42 75 66 2c 20 7a 42 75  ror(), nBuf, zBu
2adb0 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69  f);.}../*.** Ini
2adc0 74 69 61 6c 69 7a 65 20 61 6e 64 20 64 65 69 6e  tialize and dein
2add0 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6f 70 65  itialize the ope
2ade0 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69 6e  rating system in
2adf0 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 69 6e 74 20  terface..*/.int 
2ae00 73 71 6c 69 74 65 33 5f 6f 73 5f 69 6e 69 74 28  sqlite3_os_init(
2ae10 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20  void){.  static 
2ae20 73 71 6c 69 74 65 33 5f 76 66 73 20 77 69 6e 56  sqlite3_vfs winV
2ae30 66 73 20 3d 20 7b 0a 20 20 20 20 33 2c 20 20 20  fs = {.    3,   
2ae40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ae50 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20  /* iVersion */. 
2ae60 20 20 20 73 69 7a 65 6f 66 28 77 69 6e 46 69 6c     sizeof(winFil
2ae70 65 29 2c 20 20 20 20 20 2f 2a 20 73 7a 4f 73 46  e),     /* szOsF
2ae80 69 6c 65 20 2a 2f 0a 20 20 20 20 53 51 4c 49 54  ile */.    SQLIT
2ae90 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 50 41 54 48  E_WIN32_MAX_PATH
2aea0 5f 42 59 54 45 53 2c 20 2f 2a 20 6d 78 50 61 74  _BYTES, /* mxPat
2aeb0 68 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 30 2c 20  hname */.    0, 
2aec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aed0 20 20 2f 2a 20 70 4e 65 78 74 20 2a 2f 0a 20 20    /* pNext */.  
2aee0 20 20 22 77 69 6e 33 32 22 2c 20 20 20 20 20 20    "win32",      
2aef0 20 20 20 20 20 20 20 2f 2a 20 7a 4e 61 6d 65 20         /* zName 
2af00 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20  */.    0,       
2af10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70              /* p
2af20 41 70 70 44 61 74 61 20 2a 2f 0a 20 20 20 20 77  AppData */.    w
2af30 69 6e 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20  inOpen,         
2af40 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2a 2f 0a      /* xOpen */.
2af50 20 20 20 20 77 69 6e 44 65 6c 65 74 65 2c 20 20      winDelete,  
2af60 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 65 6c           /* xDel
2af70 65 74 65 20 2a 2f 0a 20 20 20 20 77 69 6e 41 63  ete */.    winAc
2af80 63 65 73 73 2c 20 20 20 20 20 20 20 20 20 20 20  cess,           
2af90 2f 2a 20 78 41 63 63 65 73 73 20 2a 2f 0a 20 20  /* xAccess */.  
2afa0 20 20 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d    winFullPathnam
2afb0 65 2c 20 20 20 20 20 2f 2a 20 78 46 75 6c 6c 50  e,     /* xFullP
2afc0 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 77  athname */.    w
2afd0 69 6e 44 6c 4f 70 65 6e 2c 20 20 20 20 20 20 20  inDlOpen,       
2afe0 20 20 20 20 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a      /* xDlOpen *
2aff0 2f 0a 20 20 20 20 77 69 6e 44 6c 45 72 72 6f 72  /.    winDlError
2b000 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44  ,          /* xD
2b010 6c 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20 77 69  lError */.    wi
2b020 6e 44 6c 53 79 6d 2c 20 20 20 20 20 20 20 20 20  nDlSym,         
2b030 20 20 20 2f 2a 20 78 44 6c 53 79 6d 20 2a 2f 0a     /* xDlSym */.
2b040 20 20 20 20 77 69 6e 44 6c 43 6c 6f 73 65 2c 20      winDlClose, 
2b050 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 43           /* xDlC
2b060 6c 6f 73 65 20 2a 2f 0a 20 20 20 20 77 69 6e 52  lose */.    winR
2b070 61 6e 64 6f 6d 6e 65 73 73 2c 20 20 20 20 20 20  andomness,      
2b080 20 2f 2a 20 78 52 61 6e 64 6f 6d 6e 65 73 73 20   /* xRandomness 
2b090 2a 2f 0a 20 20 20 20 77 69 6e 53 6c 65 65 70 2c  */.    winSleep,
2b0a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2b0b0 53 6c 65 65 70 20 2a 2f 0a 20 20 20 20 77 69 6e  Sleep */.    win
2b0c0 43 75 72 72 65 6e 74 54 69 6d 65 2c 20 20 20 20  CurrentTime,    
2b0d0 20 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d    /* xCurrentTim
2b0e0 65 20 2a 2f 0a 20 20 20 20 77 69 6e 47 65 74 4c  e */.    winGetL
2b0f0 61 73 74 45 72 72 6f 72 2c 20 20 20 20 20 2f 2a  astError,     /*
2b100 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72 20 2a   xGetLastError *
2b110 2f 0a 20 20 20 20 77 69 6e 43 75 72 72 65 6e 74  /.    winCurrent
2b120 54 69 6d 65 49 6e 74 36 34 2c 20 2f 2a 20 78 43  TimeInt64, /* xC
2b130 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 20  urrentTimeInt64 
2b140 2a 2f 0a 20 20 20 20 77 69 6e 53 65 74 53 79 73  */.    winSetSys
2b150 74 65 6d 43 61 6c 6c 2c 20 20 20 20 2f 2a 20 78  temCall,    /* x
2b160 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f  SetSystemCall */
2b170 0a 20 20 20 20 77 69 6e 47 65 74 53 79 73 74 65  .    winGetSyste
2b180 6d 43 61 6c 6c 2c 20 20 20 20 2f 2a 20 78 47 65  mCall,    /* xGe
2b190 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20  tSystemCall */. 
2b1a0 20 20 20 77 69 6e 4e 65 78 74 53 79 73 74 65 6d     winNextSystem
2b1b0 43 61 6c 6c 2c 20 20 20 2f 2a 20 78 4e 65 78 74  Call,   /* xNext
2b1c0 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20  SystemCall */.  
2b1d0 7d 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  };.#if defined(S
2b1e0 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
2b1f0 57 49 44 45 29 0a 20 20 73 74 61 74 69 63 20 73  WIDE).  static s
2b200 71 6c 69 74 65 33 5f 76 66 73 20 77 69 6e 4c 6f  qlite3_vfs winLo
2b210 6e 67 50 61 74 68 56 66 73 20 3d 20 7b 0a 20 20  ngPathVfs = {.  
2b220 20 20 33 2c 20 20 20 20 20 20 20 20 20 20 20 20    3,            
2b230 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69         /* iVersi
2b240 6f 6e 20 2a 2f 0a 20 20 20 20 73 69 7a 65 6f 66  on */.    sizeof
2b250 28 77 69 6e 46 69 6c 65 29 2c 20 20 20 20 20 2f  (winFile),     /
2b260 2a 20 73 7a 4f 73 46 69 6c 65 20 2a 2f 0a 20 20  * szOsFile */.  
2b270 20 20 53 51 4c 49 54 45 5f 57 49 4e 4e 54 5f 4d    SQLITE_WINNT_M
2b280 41 58 5f 50 41 54 48 5f 42 59 54 45 53 2c 20 2f  AX_PATH_BYTES, /
2b290 2a 20 6d 78 50 61 74 68 6e 61 6d 65 20 2a 2f 0a  * mxPathname */.
2b2a0 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20      0,          
2b2b0 20 20 20 20 20 20 20 20 20 2f 2a 20 70 4e 65 78           /* pNex
2b2c0 74 20 2a 2f 0a 20 20 20 20 22 77 69 6e 33 32 2d  t */.    "win32-
2b2d0 6c 6f 6e 67 70 61 74 68 22 2c 20 20 20 20 2f 2a  longpath",    /*
2b2e0 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 20 20 30 2c   zName */.    0,
2b2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b300 20 20 20 2f 2a 20 70 41 70 70 44 61 74 61 20 2a     /* pAppData *
2b310 2f 0a 20 20 20 20 77 69 6e 4f 70 65 6e 2c 20 20  /.    winOpen,  
2b320 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4f             /* xO
2b330 70 65 6e 20 2a 2f 0a 20 20 20 20 77 69 6e 44 65  pen */.    winDe
2b340 6c 65 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  lete,           
2b350 2f 2a 20 78 44 65 6c 65 74 65 20 2a 2f 0a 20 20  /* xDelete */.  
2b360 20 20 77 69 6e 41 63 63 65 73 73 2c 20 20 20 20    winAccess,    
2b370 20 20 20 20 20 20 20 2f 2a 20 78 41 63 63 65 73         /* xAcces
2b380 73 20 2a 2f 0a 20 20 20 20 77 69 6e 46 75 6c 6c  s */.    winFull
2b390 50 61 74 68 6e 61 6d 65 2c 20 20 20 20 20 2f 2a  Pathname,     /*
2b3a0 20 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 2a   xFullPathname *
2b3b0 2f 0a 20 20 20 20 77 69 6e 44 6c 4f 70 65 6e 2c  /.    winDlOpen,
2b3c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44             /* xD
2b3d0 6c 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 77 69 6e  lOpen */.    win
2b3e0 44 6c 45 72 72 6f 72 2c 20 20 20 20 20 20 20 20  DlError,        
2b3f0 20 20 2f 2a 20 78 44 6c 45 72 72 6f 72 20 2a 2f    /* xDlError */
2b400 0a 20 20 20 20 77 69 6e 44 6c 53 79 6d 2c 20 20  .    winDlSym,  
2b410 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c            /* xDl
2b420 53 79 6d 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c  Sym */.    winDl
2b430 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20  Close,          
2b440 2f 2a 20 78 44 6c 43 6c 6f 73 65 20 2a 2f 0a 20  /* xDlClose */. 
2b450 20 20 20 77 69 6e 52 61 6e 64 6f 6d 6e 65 73 73     winRandomness
2b460 2c 20 20 20 20 20 20 20 2f 2a 20 78 52 61 6e 64  ,       /* xRand
2b470 6f 6d 6e 65 73 73 20 2a 2f 0a 20 20 20 20 77 69  omness */.    wi
2b480 6e 53 6c 65 65 70 2c 20 20 20 20 20 20 20 20 20  nSleep,         
2b490 20 20 20 2f 2a 20 78 53 6c 65 65 70 20 2a 2f 0a     /* xSleep */.
2b4a0 20 20 20 20 77 69 6e 43 75 72 72 65 6e 74 54 69      winCurrentTi
2b4b0 6d 65 2c 20 20 20 20 20 20 2f 2a 20 78 43 75 72  me,      /* xCur
2b4c0 72 65 6e 74 54 69 6d 65 20 2a 2f 0a 20 20 20 20  rentTime */.    
2b4d0 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 2c  winGetLastError,
2b4e0 20 20 20 20 20 2f 2a 20 78 47 65 74 4c 61 73 74       /* xGetLast
2b4f0 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20 77 69 6e  Error */.    win
2b500 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34  CurrentTimeInt64
2b510 2c 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d  , /* xCurrentTim
2b520 65 49 6e 74 36 34 20 2a 2f 0a 20 20 20 20 77 69  eInt64 */.    wi
2b530 6e 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20  nSetSystemCall, 
2b540 20 20 20 2f 2a 20 78 53 65 74 53 79 73 74 65 6d     /* xSetSystem
2b550 43 61 6c 6c 20 2a 2f 0a 20 20 20 20 77 69 6e 47  Call */.    winG
2b560 65 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20  etSystemCall,   
2b570 20 2f 2a 20 78 47 65 74 53 79 73 74 65 6d 43 61   /* xGetSystemCa
2b580 6c 6c 20 2a 2f 0a 20 20 20 20 77 69 6e 4e 65 78  ll */.    winNex
2b590 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20 2f  tSystemCall,   /
2b5a0 2a 20 78 4e 65 78 74 53 79 73 74 65 6d 43 61 6c  * xNextSystemCal
2b5b0 6c 20 2a 2f 0a 20 20 7d 3b 0a 23 65 6e 64 69 66  l */.  };.#endif
2b5c0 0a 0a 20 20 2f 2a 20 44 6f 75 62 6c 65 2d 63 68  ..  /* Double-ch
2b5d0 65 63 6b 20 74 68 61 74 20 74 68 65 20 61 53 79  eck that the aSy
2b5e0 73 63 61 6c 6c 5b 5d 20 61 72 72 61 79 20 68 61  scall[] array ha
2b5f0 73 20 62 65 65 6e 20 63 6f 6e 73 74 72 75 63 74  s been construct
2b600 65 64 0a 20 20 2a 2a 20 63 6f 72 72 65 63 74 6c  ed.  ** correctl
2b610 79 2e 20 20 53 65 65 20 74 69 63 6b 65 74 20 5b  y.  See ticket [
2b620 62 62 33 61 38 36 65 38 39 30 63 38 65 39 36 61  bb3a86e890c8e96a
2b630 62 5d 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  b] */.  assert( 
2b640 41 72 72 61 79 53 69 7a 65 28 61 53 79 73 63 61  ArraySize(aSysca
2b650 6c 6c 29 3d 3d 37 37 20 29 3b 0a 0a 20 20 2f 2a  ll)==77 );..  /*
2b660 20 67 65 74 20 6d 65 6d 6f 72 79 20 6d 61 70 20   get memory map 
2b670 61 6c 6c 6f 63 61 74 69 6f 6e 20 67 72 61 6e 75  allocation granu
2b680 6c 61 72 69 74 79 20 2a 2f 0a 20 20 6d 65 6d 73  larity */.  mems
2b690 65 74 28 26 77 69 6e 53 79 73 49 6e 66 6f 2c 20  et(&winSysInfo, 
2b6a0 30 2c 20 73 69 7a 65 6f 66 28 53 59 53 54 45 4d  0, sizeof(SYSTEM
2b6b0 5f 49 4e 46 4f 29 29 3b 0a 23 69 66 20 53 51 4c  _INFO));.#if SQL
2b6c0 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 6f  ITE_OS_WINRT.  o
2b6d0 73 47 65 74 4e 61 74 69 76 65 53 79 73 74 65 6d  sGetNativeSystem
2b6e0 49 6e 66 6f 28 26 77 69 6e 53 79 73 49 6e 66 6f  Info(&winSysInfo
2b6f0 29 3b 0a 23 65 6c 73 65 0a 20 20 6f 73 47 65 74  );.#else.  osGet
2b700 53 79 73 74 65 6d 49 6e 66 6f 28 26 77 69 6e 53  SystemInfo(&winS
2b710 79 73 49 6e 66 6f 29 3b 0a 23 65 6e 64 69 66 0a  ysInfo);.#endif.
2b720 20 20 61 73 73 65 72 74 28 20 77 69 6e 53 79 73    assert( winSys
2b730 49 6e 66 6f 2e 64 77 41 6c 6c 6f 63 61 74 69 6f  Info.dwAllocatio
2b740 6e 47 72 61 6e 75 6c 61 72 69 74 79 3e 30 20 29  nGranularity>0 )
2b750 3b 0a 20 20 61 73 73 65 72 74 28 20 77 69 6e 53  ;.  assert( winS
2b760 79 73 49 6e 66 6f 2e 64 77 50 61 67 65 53 69 7a  ysInfo.dwPageSiz
2b770 65 3e 30 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65  e>0 );..  sqlite
2b780 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28 26  3_vfs_register(&
2b790 77 69 6e 56 66 73 2c 20 31 29 3b 0a 0a 23 69 66  winVfs, 1);..#if
2b7a0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
2b7b0 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a  WIN32_HAS_WIDE).
2b7c0 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65    sqlite3_vfs_re
2b7d0 67 69 73 74 65 72 28 26 77 69 6e 4c 6f 6e 67 50  gister(&winLongP
2b7e0 61 74 68 56 66 73 2c 20 30 29 3b 0a 23 65 6e 64  athVfs, 0);.#end
2b7f0 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  if..  return SQL
2b800 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 69 6e 74 20 73  ITE_OK;.}..int s
2b810 71 6c 69 74 65 33 5f 6f 73 5f 65 6e 64 28 76 6f  qlite3_os_end(vo
2b820 69 64 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f  id){.#if SQLITE_
2b830 4f 53 5f 57 49 4e 52 54 0a 20 20 69 66 28 20 73  OS_WINRT.  if( s
2b840 6c 65 65 70 4f 62 6a 21 3d 4e 55 4c 4c 20 29 7b  leepObj!=NULL ){
2b850 0a 20 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64  .    osCloseHand
2b860 6c 65 28 73 6c 65 65 70 4f 62 6a 29 3b 0a 20 20  le(sleepObj);.  
2b870 20 20 73 6c 65 65 70 4f 62 6a 20 3d 20 4e 55 4c    sleepObj = NUL
2b880 4c 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  L;.  }.#endif.  
2b890 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2b8a0 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53  ;.}..#endif /* S
2b8b0 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 2a 2f 0a  QLITE_OS_WIN */.